Merge branch 'master' of ssh://git-sdonath@lx-office.linet-services.de/~/lx-office-erp
authorSven Donath <lxo@dexo.de>
Wed, 8 Sep 2010 10:44:57 +0000 (12:44 +0200)
committerSven Donath <lxo@dexo.de>
Wed, 8 Sep 2010 10:44:57 +0000 (12:44 +0200)
SL/Template/OpenDocument.pm

index 626d3c0..2ed3c60 100644 (file)
@@ -3,6 +3,7 @@ package SL::Template::OpenDocument;
 use parent qw(SL::Template::Simple);
 
 use Archive::Zip;
+use Encode;
 use POSIX 'setsid';
 
 use SL::Iconv;
@@ -109,21 +110,27 @@ sub parse_block {
         $contents =~ m|^(.*?)(</table:table-row[^>]*>)|;
         my $table_row = $1;
         my $end_tag = $2;
-        substr($contents, 0, length($1) + length($end_tag)) = "";
 
         if ($table_row =~ m|\&lt;\%foreachrow\s+(.*?)\%\&gt;|) {
           my $var = $1;
 
-          substr($table_row, length($`), length($&)) = "";
+          $contents =~ m|\&lt;\%foreachrow\s+.*?\%\&gt;|;
+          substr($contents, length($`), length($&)) = "";
 
-          my ($t1, $t2) = $self->find_end($table_row, length($`));
-          if (!$t1) {
+          ($table_row, $contents) = $self->find_end($contents, length($`));
+          if (!$table_row) {
             $self->{"error"} = "Unclosed <\%foreachrow\%>." unless ($self->{"error"});
             $main::lxdebug->leave_sub();
             return undef;
           }
 
-          my $new_text = $self->parse_foreach($var, $t1 . $t2, $tag, $end_tag, @indices);
+          $contents   =~ m|^(.*?)(</table:table-row[^>]*>)|;
+          $table_row .=  $1;
+          $end_tag    =  $2;
+
+          substr $contents, 0, length($&), '';
+
+          my $new_text = $self->parse_foreach($var, $table_row, $tag, $end_tag, @indices);
           if (!defined($new_text)) {
             $main::lxdebug->leave_sub();
             return undef;
@@ -131,6 +138,7 @@ sub parse_block {
           $new_contents .= $new_text;
 
         } else {
+          substr($contents, 0, length($table_row) + length($end_tag)) = "";
           my $new_text = $self->parse_block($table_row, @indices);
           if (!defined($new_text)) {
             $main::lxdebug->leave_sub();
@@ -221,7 +229,7 @@ sub parse {
     return 0;
   }
 
-  my $contents = $zip->contents("content.xml");
+  my $contents = Encode::decode('utf-8-strict', $zip->contents("content.xml"));
   if (!$contents) {
     $self->{"error"} = "File is not a OpenDocument file.";
     $main::lxdebug->leave_sub();
@@ -260,7 +268,7 @@ sub parse {
 
 #   $new_contents =~ s|>|>\n|g;
 
-  $zip->contents("content.xml", $new_contents);
+  $zip->contents("content.xml", Encode::encode('utf-8-strict', $new_contents));
 
   my $styles = $zip->contents("styles.xml");
   if ($contents) {