texinfo-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

texinfo/tp Texinfo/Common.pm Texinfo/Convert/Co...


From: Patrice Dumas
Subject: texinfo/tp Texinfo/Common.pm Texinfo/Convert/Co...
Date: Thu, 29 Sep 2011 20:01:39 +0000

CVSROOT:        /sources/texinfo
Module name:    texinfo
Changes by:     Patrice Dumas <pertusus>        11/09/29 20:01:39

Modified files:
        tp/Texinfo     : Common.pm 
        tp/Texinfo/Convert: Converter.pm DocBook.pm HTML.pm Text.pm 
                            XML.pm 
        tp/t           : accents.t 

Log message:
        Add convert_tree for DocBook and XML.
        
        Redesign the interface for accents formatting.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/Texinfo/Common.pm?cvsroot=texinfo&r1=1.68&r2=1.69
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/Texinfo/Convert/Converter.pm?cvsroot=texinfo&r1=1.46&r2=1.47
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/Texinfo/Convert/DocBook.pm?cvsroot=texinfo&r1=1.16&r2=1.17
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/Texinfo/Convert/HTML.pm?cvsroot=texinfo&r1=1.157&r2=1.158
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/Texinfo/Convert/Text.pm?cvsroot=texinfo&r1=1.67&r2=1.68
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/Texinfo/Convert/XML.pm?cvsroot=texinfo&r1=1.43&r2=1.44
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/t/accents.t?cvsroot=texinfo&r1=1.13&r2=1.14

Patches:
Index: Texinfo/Common.pm
===================================================================
RCS file: /sources/texinfo/texinfo/tp/Texinfo/Common.pm,v
retrieving revision 1.68
retrieving revision 1.69
diff -u -b -r1.68 -r1.69
--- Texinfo/Common.pm   29 Sep 2011 15:17:06 -0000      1.68
+++ Texinfo/Common.pm   29 Sep 2011 20:01:38 -0000      1.69
@@ -901,7 +901,7 @@
       last;
     }
     push @accent_commands, $current;
-    # A bogus accent
+    # A bogus accent, that may happen
     if (!$current->{'args'}) {
       return ([], address@hidden);
     }
@@ -914,7 +914,7 @@
       print STDERR "BUG: No content in accent command\n";
       #print STDERR Data::Dumper->Dump([$current]);
       #print STDERR Texinfo::Convert::Texinfo::convert($current)."\n";
-      last;
+      return ([], address@hidden);
     }
     # inside the braces of an accent
     my $text_contents = [];

Index: Texinfo/Convert/Converter.pm
===================================================================
RCS file: /sources/texinfo/texinfo/tp/Texinfo/Convert/Converter.pm,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -b -r1.46 -r1.47
--- Texinfo/Convert/Converter.pm        29 Sep 2011 15:17:07 -0000      1.46
+++ Texinfo/Convert/Converter.pm        29 Sep 2011 20:01:38 -0000      1.47
@@ -811,8 +811,9 @@
 {
   my $self = shift;
   my $accent = shift;
-  my $in_upper_case = shift;
   my $format_accents = shift;
+  my $in_upper_case = shift;
+
   if (!defined($format_accents)) {
     if ($self->get_conf('USE_NUMERIC_ENTITY')) {
       $format_accents = \&xml_accent_numeric_entities;
@@ -821,22 +822,32 @@
     }
   }
   
+  return $self->convert_accents($accent, $format_accents, $in_upper_case);
+}
+
+sub convert_accents($$$;$)
+{
+  my $self = shift;
+  my $accent = shift;
+  my $format_accents = shift;
+  my $in_upper_case = shift;
+
+  my ($contents, $stack)
+      = Texinfo::Common::find_innermost_accent_contents($accent);
+  my $result = $self->convert_tree({'contents' => $contents});  
+
   if ($self->get_conf('ENABLE_ENCODING')) {
     if ($self->{'encoding_name'} and $self->{'encoding_name'} eq 'utf-8') {
-      return Texinfo::Convert::Text::unicode_accents($accent, $format_accents,
-                                                     $in_upper_case);
+      return Texinfo::Convert::Text::unicode_accents($result, $stack,
+                                             $format_accents, $in_upper_case);
     } elsif ($self->{'encoding_name'} 
            and 
$Texinfo::Encoding::eight_bit_encoding_aliases{$self->{'encoding_name'}}) {
-      return Texinfo::Convert::Text::eight_bit_accents($accent, 
+      return Texinfo::Convert::Text::eight_bit_accents($result, $stack, 
                                       $self->{'encoding_name'}, 
                                       $format_accents,
                                       $in_upper_case);
     }
   }
-  my ($contents, $stack)
-      = Texinfo::Common::find_innermost_accent_contents($accent);
-
-  my $result = $self->_convert({'contents' => $contents});  
   foreach my $accent_command (reverse(@$stack)) {
     $result = &$format_accents ($result, $accent_command, 
                                 $in_upper_case);

Index: Texinfo/Convert/DocBook.pm
===================================================================
RCS file: /sources/texinfo/texinfo/tp/Texinfo/Convert/DocBook.pm,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- Texinfo/Convert/DocBook.pm  29 Sep 2011 14:04:40 -0000      1.16
+++ Texinfo/Convert/DocBook.pm  29 Sep 2011 20:01:38 -0000      1.17
@@ -44,6 +44,8 @@
 # will save memory.
 %EXPORT_TAGS = ( 'all' => [ qw(
   convert
+  convert_tree
+  output
 ) ] );
 
 @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
@@ -300,6 +302,14 @@
   return $self->_convert_document_sections($root, $fh);
 }
 
+sub convert_tree($$)
+{
+  my $self = shift;
+  my $root = shift;
+
+  return $self->_convert($root);
+}
+
 sub output($$)
 {
   my $self = shift;
@@ -390,7 +400,7 @@
   return '';
 }
 
-sub docbook_accent($$;$$)
+sub docbook_accent($$;$)
 {
   my $text = shift;
   my $command = shift;
@@ -405,10 +415,10 @@
     return '&#' .
       
hex($Texinfo::Convert::Unicode::unicode_accented_letters{$accent}->{$text}). 
';';
   }
-  return $text . '&lt;' if ($accent eq 'v');
   # FIXME it is not possible to call xml_protect_text since what is in $text
   # may already be xml.  But this means that each time ascii_accent changes
   # it should be changed here too.
+  return $text . '&lt;' if ($accent eq 'v');
   return Texinfo::Convert::Text::ascii_accent($text, $command);
 }
 
@@ -479,7 +489,8 @@
     } elsif ($root->{'cmdname'} eq 'today') {
       return $self->_convert(Texinfo::Common::expand_today($self));
     } elsif ($Texinfo::Common::accent_commands{$root->{'cmdname'}}) {
-      return $self->xml_accents($root, undef, \&docbook_accent);#, 
$self->in_upper_case());
+      # FIXME handle in_upper_case
+      return $self->convert_accents($root, \&docbook_accent);
     } elsif ($root->{'cmdname'} eq 'item' or $root->{'cmdname'} eq 'itemx'
              or $root->{'cmdname'} eq 'headitem' or $root->{'cmdname'} eq 
'tab') {
       if ($root->{'cmdname'} eq 'item'

Index: Texinfo/Convert/HTML.pm
===================================================================
RCS file: /sources/texinfo/texinfo/tp/Texinfo/Convert/HTML.pm,v
retrieving revision 1.157
retrieving revision 1.158
diff -u -b -r1.157 -r1.158
--- Texinfo/Convert/HTML.pm     29 Sep 2011 14:22:20 -0000      1.157
+++ Texinfo/Convert/HTML.pm     29 Sep 2011 20:01:38 -0000      1.158
@@ -1584,7 +1584,7 @@
   my $command = shift;
   my $args = shift;
 
-  return $self->xml_accents($command, $self->in_upper_case());
+  return $self->xml_accents($command, undef, $self->in_upper_case());
 }
 
 foreach my $command (keys(%accent_commands)) {

Index: Texinfo/Convert/Text.pm
===================================================================
RCS file: /sources/texinfo/texinfo/tp/Texinfo/Convert/Text.pm,v
retrieving revision 1.67
retrieving revision 1.68
diff -u -b -r1.67 -r1.68
--- Texinfo/Convert/Text.pm     29 Sep 2011 16:37:21 -0000      1.67
+++ Texinfo/Convert/Text.pm     29 Sep 2011 20:01:39 -0000      1.68
@@ -156,38 +156,19 @@
   $ignored_types{$type} = 1;
 }
 
-# find the innermost accent and format the correspponding text contents
-sub _find_innermost_accent($;$$)
+sub eight_bit_accents($$$$;$)
 {
-  my $current = shift;
-  my $encoding = shift;
-  my $in_upper_case = shift;
-  my ($contents, $stack)
-      = Texinfo::Common::find_innermost_accent_contents($current);
-
-  # FIXME shouldn't it be better to format the innermost contents with 
-  # a converter, if present?
-  my $options = {};
-  $options->{'enabled_encoding'} = $encoding if (defined($encoding));
-  $options->{'sc'} = $in_upper_case if (defined($in_upper_case));
-  return (convert({'contents' => $contents}, $options), 
-          $stack);
-}
-
-sub eight_bit_accents($$$;$)
-{
-  my $current = shift;
+  my $unicode_formatted = shift;
+  my $stack = shift;
   my $encoding = shift;
   my $convert_accent = shift;
   my $in_upper_case = shift;
 
+  my $result = $unicode_formatted;
+
   my $debug;
   #$debug = 1;
 
-  my ($unicode_formatted, $stack) 
-    = _find_innermost_accent($current, $encoding, $in_upper_case);
-  my $result = $unicode_formatted;
-
   if ($debug) {
     print STDERR "STACK: ".join('|', map {$_->{'cmdname'}} @$stack)."\n";
   }
@@ -308,14 +289,12 @@
 }
 
 # format a stack of accents as ascii
-sub ascii_accents ($;$)
+sub ascii_accents ($$;$)
 {
-  my $current = shift;
+  my $result = shift;
+  my $stack = shift;
   my $in_upper_case = shift;
 
-  my ($result, $stack) 
-    = _find_innermost_accent($current, undef, $in_upper_case);
-
   $result = uc($result) if ($in_upper_case and $result =~ /^\w$/);
   foreach my $accent_command (reverse(@$stack)) {
     $result = ascii_accent ($result, $accent_command);
@@ -324,13 +303,12 @@
 }
 
 # format a stack of accents as unicode
-sub unicode_accents ($$;$)
+sub unicode_accents ($$$;$)
 {
-  my $current = shift;
+  my $result = shift;
+  my $stack = shift;
   my $format_accent = shift;
   my $in_upper_case = shift;
-  my ($result, $stack) = _find_innermost_accent($current,
-          'utf-8', $in_upper_case);
 
   while (@$stack) {
     my $formatted_result
@@ -355,13 +333,23 @@
   my $in_upper_case = shift;
   
   return '' if (!$accent->{'args'});
+
+  my ($contents, $stack)
+      = Texinfo::Common::find_innermost_accent_contents($accent);
+
+  my $options = {};
+  $options->{'enabled_encoding'} = $encoding if (defined($encoding));
+  $options->{'sc'} = $in_upper_case if (defined($in_upper_case));
+  my $text = convert({'contents' => $contents}, $options);
+
   if ($encoding and $encoding eq 'utf-8') {
-    return unicode_accents($accent, \&ascii_accent, $in_upper_case);
+    return unicode_accents($text, $stack, \&ascii_accent, $in_upper_case);
   } elsif ($encoding 
            and $Texinfo::Encoding::eight_bit_encoding_aliases{$encoding}) {
-    return eight_bit_accents($accent, $encoding, \&ascii_accent, 
$in_upper_case);
+    return eight_bit_accents($text, $stack, $encoding, \&ascii_accent, 
+                             $in_upper_case);
   } else {
-    my $result = ascii_accents($accent, $in_upper_case);
+    my $result = ascii_accents($text, $stack, $in_upper_case);
   }
 }
 

Index: Texinfo/Convert/XML.pm
===================================================================
RCS file: /sources/texinfo/texinfo/tp/Texinfo/Convert/XML.pm,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -b -r1.43 -r1.44
--- Texinfo/Convert/XML.pm      29 Sep 2011 13:57:21 -0000      1.43
+++ Texinfo/Convert/XML.pm      29 Sep 2011 20:01:39 -0000      1.44
@@ -43,6 +43,8 @@
 # will save memory.
 %EXPORT_TAGS = ( 'all' => [ qw(
   convert
+  convert_tree
+  output
 ) ] );
 
 @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
@@ -53,7 +55,7 @@
 $VERSION = '0.01';
 
 my %defaults = (
-  'ENABLE_ENCODING'      => 1,
+  'ENABLE_ENCODING'      => 0,
   'SHOW_MENU'            => 1,
   'EXTENSION'            => 'xml',
   'perl_encoding'        => 'utf8',
@@ -317,7 +319,17 @@
   return $attribute;
 }
 
-my @node_directions = ('Next', 'Prev', 'Up');
+sub _texinfo_xml_accent($$;$)
+{
+  my $text = shift;
+  my $root = shift;
+  my $in_upper_case = shift;
+
+  my $result = "<accent type=\"$xml_accent_types{$root->{'cmdname'}}\">";
+  $result .= $text;
+  $result .= '</accent>';
+  return $result;
+}
 
 sub convert($$;$)
 {
@@ -328,6 +340,16 @@
   return $self->_convert_document_sections($root, $fh);
 }
 
+sub convert_tree($$)
+{
+  my $self = shift;
+  my $root = shift;
+
+  return $self->_convert($root);
+}
+
+my @node_directions = ('Next', 'Prev', 'Up');
+
 sub _convert($$;$);
 
 sub _convert($$;$)
@@ -385,11 +407,16 @@
       }
       return $xml_commands_formatting{$root->{'cmdname'}};
     } elsif ($xml_accent_types{$root->{'cmdname'}}) {
-      $result = "<accent type=\"$xml_accent_types{$root->{'cmdname'}}\">";
-      $result .= $self->_convert($root->{'args'}->[0])
-        if ($root->{'args'} and $root->{'args'}->[0]);
-      $result .= '</accent>';
-      return $result;
+      if ($self->get_conf('ENABLE_ENCODING')) {
+        return $self->convert_accents($root, \&_texinfo_xml_accent);
+      } else {
+        if (!$root->{'args'}) {
+          $result = '';
+        } else {
+          $result = $self->_convert($root->{'args'}->[0]);
+        }
+        return _texinfo_xml_accent($result, $root);
+      }
     } elsif ($root->{'cmdname'} eq 'item' or $root->{'cmdname'} eq 'itemx'
              or $root->{'cmdname'} eq 'headitem' or $root->{'cmdname'} eq 
'tab') {
       if ($root->{'cmdname'} eq 'item'

Index: t/accents.t
===================================================================
RCS file: /sources/texinfo/texinfo/tp/t/accents.t,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- t/accents.t 29 Sep 2011 15:17:08 -0000      1.13
+++ t/accents.t 29 Sep 2011 20:01:39 -0000      1.14
@@ -22,8 +22,9 @@
   my $reference = $test->[2]; 
   my $parser = Texinfo::Parser::parser({'context' => 'preformatted'});
   my $tree = $parser->parse_texi_text($texi);
-  my ($text, $commands_stack) = 
-    Texinfo::Convert::Text::_find_innermost_accent($tree->{'contents'}->[0]);
+  my ($contents, $commands_stack) = 
+    Texinfo::Common::find_innermost_accent_contents($tree->{'contents'}->[0]);
+  my $text = Texinfo::Convert::Text::convert({'contents' => $contents});
   my @stack = map {$_->{'cmdname'}} @$commands_stack;
   if (defined($reference)) {
     ok ($reference eq join('|',($text, @stack)), 'innermost '.$name);
@@ -70,9 +71,15 @@
   my $parser = Texinfo::Parser::parser({'context' => 'preformatted'});
   my $text_root = $parser->parse_texi_text($texi);
   my $tree = $text_root->{'contents'}->[0];
+
+  my ($contents, $commands_stack) = 
+    Texinfo::Common::find_innermost_accent_contents($tree);
+  my $text = Texinfo::Convert::Text::convert({'contents' => $contents});
+
   my $result = 
-       Texinfo::Convert::Text::eight_bit_accents($tree, 
+       Texinfo::Convert::Text::eight_bit_accents($text, $commands_stack, 
     'iso-8859-1', \&Texinfo::Convert::Text::ascii_accent);
+
   my $html_converter = Texinfo::Convert::HTML->converter();
   $html_converter->{'conf'}->{'USE_NUMERIC_ENTITY'} = 0;
   my $result_xml = Texinfo::Convert::Converter::xml_accents($html_converter, 
@@ -80,8 +87,14 @@
   $html_converter->{'conf'}->{'USE_NUMERIC_ENTITY'} = 1;
   my $result_xml_entity 
       = Texinfo::Convert::Converter::xml_accents($html_converter, $tree);
-  my $result_unicode = Texinfo::Convert::Text::unicode_accents($tree,
-                      \&Texinfo::Convert::Text::ascii_accent);
+
+  ($contents, $commands_stack) =
+    Texinfo::Common::find_innermost_accent_contents($tree);
+  $text = Texinfo::Convert::Text::convert({'contents' => $contents},
+                               {'enabled_encoding' => 'utf-8'});
+
+  my $result_unicode = Texinfo::Convert::Text::unicode_accents($text, 
+              $commands_stack, \&Texinfo::Convert::Text::ascii_accent);
   if (defined($reference)) {
     #ok (Encode::decode('iso-8859-1', $reference) eq $result, $name);
     #ok ($reference eq Encode::encode('iso-8859-1', $result), $name);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]