diff options
Diffstat (limited to 'kpresenter/kprconverter.pl')
-rw-r--r-- | kpresenter/kprconverter.pl | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/kpresenter/kprconverter.pl b/kpresenter/kprconverter.pl new file mode 100644 index 00000000..524b3d8d --- /dev/null +++ b/kpresenter/kprconverter.pl @@ -0,0 +1,174 @@ +#!/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 <PIXMAPS> tags? +$currentText=""; +$currentTextType=0; +while (<INPUT>) +{ + study; # This speeds up the whole RE stuff because Perl creates some hash for the string + if (/<DOC/) + { + # store the url because this is a prart of the "path" for the images + $url=$1 if(m/url=\"(.*?)\"/); + s/>$/ syntaxVersion=\"2\">/; + } + elsif (/<PIXMAPS>/) + { + $insidePixmaps=1; + } + elsif (/<\/PIXMAPS>/) + { + $insidePixmaps=0; + } + elsif (/<TEXTOBJ/) + { + # Save object type of the TEXTOBJ tag + $objType=$1 if (m/objType=(\"[0-9]+\")/); + s/gap=/margin=/; + } + elsif (/<PARAGRAPH/) + { + $insideParag=1; + s/<PARAGRAPH /<P /; + # In the old format we had horzAlign="[0|1|2]" 0=left, 1=center, 2=right + # In the new one it's align="..." and uses the Qt::AlignmentFlags enums. + # Qt::AlignLeft=1, AlignRight=2, AlignHCenter=4 + $alignment=$1 if(/horzAlign=(\"[0-2]+\")/); + $alignment =~ tr/01/14/; + s/horzAlign=\"[0-2]+\"/align=$alignment/; + s/>$/ type=$objType>/; + } + elsif (/<\/PARAGRAPH>/) + { + $insideParag=0; + s/<\/PARAGRAPH/<\/P/; + # Flush last text tag + $_ = $currentText . "</TEXT>\n" . $_ if ($currentText); + $currentText=""; + } + elsif (/<LINE/ || /<\/LINE/) + { + $_ = "" if ($insideParag); # ignore + } + elsif (/<OBJ>/) + { + $insideObj=1; + $_ = ""; # ignore + } + elsif (/<\/OBJ>/) + { + $insideObj=0; + $_ = ""; # ignore + } + elsif ($insideObj) + { + $toprint=""; + if (m/<TYPE value="([0-9]+)"/) + { + $currentTextType=$1; + if ($currentTextType) # 1 -> 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 . "</TEXT>\n" if ($currentText); + # Start a new text element + $currentText = " <TEXT "; + } + } + elsif (/<FONT/ && !$currentTextType) # normal text + { + s/\s*<FONT //; + s/\/>//; + chomp; + # Append all attributes + $currentText .= $_; # the same as $currentText = $currentText . $_, but faster + } + elsif (/<COLOR/ && !$currentTextType) # normal text + { + $red=$1 if (m/red=\"([0-9]+)\"/); + $green=$1 if (m/green=\"([0-9]+)\"/); + $blue=$1 if (m/blue=\"([0-9]+)\"/); + # Convert color to HTML representation + $currentText .= sprintf(" color=\"#%02x%02x%02x\"", $red, $green, $blue ); + } + elsif (m/<TEXT>(.*)<\/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 . "</TEXT>\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 (/<KEY(.*)\/>/) + { + # 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); |