#!/usr/bin/perl -w # converts a KPresenter document from the old format to the new one (v2) # due to the new text object use Time::Local; open(INPUT, "<$ARGV[0]") || die "Cannot open $ARGV[0]"; open(OUTPUT, ">$ARGV[1]") || die "Cannot create $ARGV[1]"; $objType=""; $insideParag=0; $insideObj=0; $insidePixmaps=0; # are we inside the tags? $currentText=""; $currentTextType=0; while () { study; # This speeds up the whole RE stuff because Perl creates some hash for the string if (/$/ syntaxVersion=\"2\">/; } elsif (//) { $insidePixmaps=1; } elsif (/<\/PIXMAPS>/) { $insidePixmaps=0; } elsif (/$/ type=$objType>/; } elsif (/<\/PARAGRAPH>/) { $insideParag=0; s/<\/PARAGRAPH/<\/P/; # Flush last text tag $_ = $currentText . "\n" . $_ if ($currentText); $currentText=""; } elsif (//) { $insideObj=1; $_ = ""; # ignore } elsif (/<\/OBJ>/) { $insideObj=0; $_ = ""; # ignore } elsif ($insideObj) { $toprint=""; if (m/ this is a white space { # If we have a previous text element, we keep it (merging) # Otherwise this white space is the first one in the object -> cheat $currentTextType=0 if (!$currentText); } if (!$currentTextType) # 0 -> normal text { # If we have a previous text element, write it out $toprint = $currentText . "\n" if ($currentText); # Start a new text element $currentText = " //; chomp; # Append all attributes $currentText .= $_; # the same as $currentText = $currentText . $_, but faster } elsif (/(.*)<\/TEXT>/) { if (!$currentTextType) # normal text { # Close opening tag and append the text - but don t do more yet @entities=split( "(&[a-z]+;)", $1); $text=""; foreach ( @entities ) { if (!/</ && !/>/ ) { # Replace & by & but only if not in an entity s/\&/\&/g; } $text .= $_; } $currentText .= ">" . $text; } else { # White space. Simply appending, closing the text tag. $toprint = $currentText . $1 . "\n"; $currentText = ""; # reset } } $_=$toprint; } elsif ($insidePixmaps) { if(/\s+name=\"/) { # Aha - this file is not version 2 but was created as "proper" tgz storage... medieval times :) print "Found a name attribute, no need to create one.\n"; } elsif (//) { # Okay - plain old kpresenter magic... $key=$1; study($key); # should be faster ;) # Note: The .*? is needed because it would be too greedy otherwise $filename=$1 if($key =~ /filename=\"(.*?)\"/); # Get the values - really straightforward $year=$1 if($key =~ /year=\"(\d+)\"/); $month=$1 if($key =~ /month=\"(\d+)\"/); $day=$1 if($key =~ /day=\"(\d+)\"/); $hour=$1 if($key =~ /hour=\"(\d+)\"/); $minute=$1 if($key =~ /minute=\"(\d+)\"/); $second=$1 if($key =~ /second=\"(\d+)\"/); # In Perl the month is <0...11>!!! $timestamp=timegm($second, $minute, $hour, $day, $month-1, $year); # Unfortunately we even have to mess with that string... $timestring=scalar gmtime($timestamp); # There are still some spaces too much when day<10 $timestring =~ s/ / /; # Okay. Now let's cat the whole caboodle... $nameattrib=$url . $filename . "_" . $timestring; # ...and put it in place. s/\/>/ name=\"$nameattrib\" \/>/; } } print OUTPUT $_; } close(INPUT); close(OUTPUT);