[Koha-patches] [PATCH] Bug 6085 : Fixing missing last tag in translation and comments, utf-8 issues to fix now

Chris Cormack chrisc at catalyst.net.nz
Mon Apr 11 01:30:05 CEST 2011


---
 misc/translator/TTParser.pm      |   62 +++++++++++++++++++++++++++++++++----
 misc/translator/TmplTokenizer.pm |   20 ++++++++++--
 2 files changed, 71 insertions(+), 11 deletions(-)

diff --git a/misc/translator/TTParser.pm b/misc/translator/TTParser.pm
index 507474e..9001cb2 100755
--- a/misc/translator/TTParser.pm
+++ b/misc/translator/TTParser.pm
@@ -39,7 +39,10 @@ sub build_tokens{
     $self->{filename} = $filename;
     $self->handler(start => "start", "self, line, tagname, attr, text"); #signature is start( self, linenumber, tagname, hash of attributes, origional text )
     $self->handler(text => "text", "self, line, text, is_cdata"); #signature is text( self, linenumber, origional text, is_cdata )
-    $self->handler(end => "end", "self, line, tag, text"); #signature is end( self, linenumber, tagename, origional text )
+    $self->handler(end => "end", "self, line, tag, attr, text"); #signature is end( self, linenumber, tagename, origional text )
+    $self->handler(declaration => "declaration", "self, line, text, is_cdata"); # declaration
+    $self->handler(comment => "comment", "self, line, text, is_cdata"); # comments
+    $self->handler(default => "default", "self, line, text, is_cdata"); # anything else
     $self->marked_sections(1); #treat anything inside CDATA tags as text, should really make it a TmplTokenType::CDATA
     $self->unbroken_text(1); #make contiguous whitespace into a single token (can span multiple lines)
     $self->parse_file($filename);
@@ -52,7 +55,9 @@ sub text{
     my $line = shift;
     my $work = shift; # original text
     my $is_cdata = shift;
+
     while($work){
+#            warn "in text line is $line work is $work";
 #        return if $work =~ m/^\s*$/;
         # if there is a template_toolkit tag
         if( $work =~ m/\[%.*?\]/ ){
@@ -69,6 +74,7 @@ sub text{
             #put work still to do back into work
             $work = $' ? $' : 0;
         } else {
+#            warn "in the text else work is now $work";
             #If there is some left over work, treat it as text token
             my $t = TmplToken->new( $work, ($is_cdata? TmplTokenType::CDATA : TmplTokenType::TEXT), $line, $self->{filename} );
             push @tokens, $t;
@@ -77,6 +83,37 @@ sub text{
     }
 }
 
+sub declaration {
+    my $self = shift;
+    my $line = shift;
+    my $work = shift; #original text
+    my $is_cdata = shift;
+#      warn "declaration work is $work";
+    my $t = TmplToken->new( $work, ($is_cdata? TmplTokenType::CDATA : TmplTokenType::TEXT), $line, $self->{filename} );
+    push @tokens, $t;  
+}      
+
+sub comment {
+    my $self = shift;
+    my $line = shift;
+    my $work = shift; #original text
+    my $is_cdata = shift;
+#      warn "comment work is $work";
+    my $t = TmplToken->new( $work, ($is_cdata? TmplTokenType::CDATA : TmplTokenType::TEXT), $line, $self->{filename} );
+    push @tokens, $t;  
+}      
+
+sub default {
+    my $self = shift;
+    my $line = shift;
+    my $work = shift; #original text
+    my $is_cdata = shift;
+#      warn "comment work is $work";
+    my $t = TmplToken->new( $work, ($is_cdata? TmplTokenType::CDATA : TmplTokenType::TEXT), $line, $self->{filename} );
+    push @tokens, $t;  
+}      
+
+
 #handle opening html tags
 sub start{
     my $self = shift;
@@ -84,7 +121,8 @@ sub start{
     my $tag = shift;
     my $hash = shift; #hash of attr/value pairs
     my $text = shift; #origional text
-    #return if ! $interesting_tags{$tag};
+#      warn "in start text is $text";
+    # return if ! $interesting_tags{$tag};
     # was $hash->{$key}
     # print "#### " . $self->{filename}  . " " . $tag . "####\n";
     my $t = TmplToken->new( $text, TmplTokenType::TAG, $line, $self->{filename});
@@ -100,12 +138,22 @@ sub start{
 
 #handle closing html tags
 sub end{
-  my $self = shift;
-  my $line = shift;
-  my $tag = shift;
-  my $text = shift;
+    my $self = shift;
+    my $line = shift;
+    my $tag = shift;
+    my $hash = shift;
+    my $text = shift;
+#  warn "in end text is $text";  
   # what format should this be in?
-  my $t = TmplToken->new( $text, TmplTokenType::TAG, $line, $self->{filename} );
+    my $t = TmplToken->new( $text, TmplTokenType::TAG, $line, $self->{filename} );
+    my %attr;
+    # tags seem to be uses in an 'interesting' way elsewhere..
+    for my $key( %$hash ) {
+        next unless defined $hash->{$key};
+        $attr{+lc($key)} = [ $key, $hash->{$key}, $key."=".$hash->{$key}, 0 ];
+    }
+    $t->set_attributes( \%attr );
+    push @tokens, $t;
 }
 
 1;
diff --git a/misc/translator/TmplTokenizer.pm b/misc/translator/TmplTokenizer.pm
index 22c0a13..d54b7ca 100644
--- a/misc/translator/TmplTokenizer.pm
+++ b/misc/translator/TmplTokenizer.pm
@@ -305,21 +305,33 @@ sub next_token {
     # parts that make up a text_parametrized (future children of the token)
     my @parts = ();
     while(1){
+        # warn Dumper @parts;
         $next = $self->{_parser}->next_token;
-        return undef unless defined $next;
+        if (! $next){
+            if (@parts){
+                return $self->_parametrize_internal(@parts);
+            }
+            else {
+                return undef;
+            }
+        }
         # if cformat mode is off, dont bother parametrizing, just return them as they come
         return $next unless $self->allow_cformat_p;
         if( $next->type == TmplTokenType::TEXT ){
             push @parts, $next;
-        } elsif( $next->type == TmplTokenType::DIRECTIVE && $next->string =~ m/\[%\s*\w+\s*%\]/ ){
+        } 
+        elsif( $next->type == TmplTokenType::DIRECTIVE && $next->string =~ m/\[%\s*\w+\s*%\]/ ){
             push @parts, $next;
-        } else{
+        } 
+        else {
             # if there is nothing in parts, return this token
-            return $next unless @parts;
+ 
+           return $next unless @parts;
             # OTHERWISE, put this token back and return the parametrized string of @parts
             $self->{_parser}->unshift_token($next);
             return $self->_parametrize_internal(@parts);
         }
+
     }
 }
 
-- 
1.5.6.5



More information about the Koha-patches mailing list