texinfo-commits
[Top][All Lists]
Advanced

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

texinfo/tp texi2any.pl Texinfo/Common.pm Texinf...


From: Patrice Dumas
Subject: texinfo/tp texi2any.pl Texinfo/Common.pm Texinf...
Date: Wed, 15 Feb 2012 20:45:31 +0000

CVSROOT:        /sources/texinfo
Module name:    texinfo
Changes by:     Patrice Dumas <pertusus>        12/02/15 20:45:31

Modified files:
        tp             : texi2any.pl 
        tp/Texinfo     : Common.pm 
        tp/Texinfo/Convert: Info.pm 
Added files:
        tp/t           : index_before_item.t 

Log message:
        Move index entries appearing right before an @item in @enumerate
        and @itemize right after the @item.  Reprot from Joel Sherrill and
        request from Karl.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/texi2any.pl?cvsroot=texinfo&r1=1.111&r2=1.112
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/Texinfo/Common.pm?cvsroot=texinfo&r1=1.129&r2=1.130
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/Texinfo/Convert/Info.pm?cvsroot=texinfo&r1=1.81&r2=1.82
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/t/index_before_item.t?cvsroot=texinfo&rev=1.1

Patches:
Index: texi2any.pl
===================================================================
RCS file: /sources/texinfo/texinfo/tp/texi2any.pl,v
retrieving revision 1.111
retrieving revision 1.112
diff -u -b -r1.111 -r1.112
--- texi2any.pl 7 Feb 2012 19:41:39 -0000       1.111
+++ texi2any.pl 15 Feb 2012 20:45:30 -0000      1.112
@@ -774,6 +774,7 @@
 
 exit 1 if (!$result_options);
 
+# For tests, set some strings to values not changing with releases
 my %test_conf = (
     'PACKAGE_VERSION' => '',
     'PACKAGE' => 'texinfo',

Index: Texinfo/Common.pm
===================================================================
RCS file: /sources/texinfo/texinfo/tp/Texinfo/Common.pm,v
retrieving revision 1.129
retrieving revision 1.130
diff -u -b -r1.129 -r1.130
--- Texinfo/Common.pm   9 Feb 2012 00:05:54 -0000       1.129
+++ Texinfo/Common.pm   15 Feb 2012 20:45:30 -0000      1.130
@@ -57,6 +57,7 @@
 protect_first_parenthesis
 protect_hashchar_at_line_beginning
 valid_tree_transformation
+move_index_entries_after_items_in_tree
 ) ] );
 
 @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
@@ -1723,6 +1724,101 @@
   }
 }
 
+sub move_index_entries_after_items($) {
+  # enumerate or itemize
+  my $format = shift;
+
+  my $previous;
+  return unless ($format->{'contents'});
+  foreach my $item (@{$format->{'contents'}}) {
+    #print STDERR "Before proceeding: $previous $item->{'cmdname'} 
(@{$previous->{'contents'}})\n" if ($previous and $previous->{'contents'});
+    if (defined($previous) and $item->{'cmdname'} 
+        and $item->{'cmdname'} eq 'item' 
+        and $previous->{'contents'} and scalar(@{$previous->{'contents'}})) {
+
+      my $previous_ending_container;
+      if ($previous->{'contents'}->[-1]->{'type'}
+          and ($previous->{'contents'}->[-1]->{'type'} eq 'paragraph'
+               or $previous->{'contents'}->[-1]->{'type'} eq 'preformatted')) {
+        $previous_ending_container = $previous->{'contents'}->[-1];
+      } else {
+        $previous_ending_container = $previous;
+      }
+
+      my @gathered_index_entries;
+
+      #print STDERR "Gathering for item $item in previous $previous 
($previous_ending_container)\n";
+      while ($previous_ending_container->{'contents'}->[-1]
+             and (($previous_ending_container->{'contents'}->[-1]->{'type'}
+                   and 
$previous_ending_container->{'contents'}->[-1]->{'type'} eq 
'index_entry_command')
+                  or 
($previous_ending_container->{'contents'}->[-1]->{'cmdname'}
+                      and 
($previous_ending_container->{'contents'}->[-1]->{'cmdname'} eq 'c'
+                           or 
$previous_ending_container->{'contents'}->[-1]->{'cmdname'} eq 'comment')))) {
+        unshift @gathered_index_entries, pop 
@{$previous_ending_container->{'contents'}};
+      }
+      #print STDERR "Gathered: @gathered_index_entries\n";
+      if (scalar(@gathered_index_entries)) {
+        # put back leading comments
+        while (!$gathered_index_entries[0]->{'type'}
+               or $gathered_index_entries[0]->{'type'} ne 
'index_entry_command') {
+          #print STDERR "Putting back $gathered_index_entries[0] 
$gathered_index_entries[0]->{'cmdname'}\n";
+          push @{$previous_ending_container->{'contents'}}, 
+             shift (@gathered_index_entries);
+        }
+
+        # We have the index entries of the previous @item or before item.
+        # Now put them right after the current @item command.
+        if (scalar(@gathered_index_entries)) {
+          my $item_container;
+          if ($item->{'contents'} and $item->{'contents'}->[0]
+              and $item->{'contents'}->[0]->{'type'}
+              and $item->{'contents'}->[0]->{'type'} eq 'preformatted') {
+            $item_container = $item->{'contents'}->[0];
+          } else {
+            $item_container = $item;
+          }
+          foreach my $entry(@gathered_index_entries) {
+            $entry->{'parent'} = $item_container;
+          }
+          if ($item_container->{'contents'} 
+              and $item_container->{'contents'}->[0]
+              and $item_container->{'contents'}->[0]->{'type'}) {
+            if ($item_container->{'contents'}->[0]->{'type'} eq 
'empty_line_after_command') {
+              
+              unshift @gathered_index_entries, shift 
@{$item_container->{'contents'}};
+            } elsif ($item_container->{'contents'}->[0]->{'type'} eq 
'empty_spaces_after_command') {
+               unshift @gathered_index_entries, shift 
@{$item_container->{'contents'}};
+               $gathered_index_entries[0]->{'type'} = 
'empty_line_after_command';
+               $gathered_index_entries[0]->{'text'} .= "\n";
+            }
+          }
+          unshift @{$item_container->{'contents'}}, @gathered_index_entries;
+        }
+      }
+    }
+    $previous = $item;
+  }
+}
+
+sub _move_index_entries_after_items($)
+{
+  my $self = shift;
+  my $type = shift;
+  my $current = shift;
+
+  if ($current->{'cmdname'} and ($current->{'cmdname'} eq 'enumerate'
+                              or $current->{'cmdname'} eq 'itemize')) {
+    move_index_entries_after_items($current);
+  }
+  return $current;
+}
+
+sub move_index_entries_after_items_in_tree($)
+{
+  my $tree = shift;
+  return modify_tree(undef, $tree, \&_move_index_entries_after_items);
+}
+
 1;
 
 __END__

Index: Texinfo/Convert/Info.pm
===================================================================
RCS file: /sources/texinfo/texinfo/tp/Texinfo/Convert/Info.pm,v
retrieving revision 1.81
retrieving revision 1.82
diff -u -b -r1.81 -r1.82
--- Texinfo/Convert/Info.pm     14 Feb 2012 22:27:43 -0000      1.81
+++ Texinfo/Convert/Info.pm     15 Feb 2012 20:45:30 -0000      1.82
@@ -591,10 +591,7 @@
       } else {
         $text_result = $text;
       }
-    }# elsif (!defined($image_file)) {
-     # $self->line_warn(sprintf($self->__("Cannot find address@hidden file 
`%s.txt'"),
-     #                  $basefile), $root->{'line_nr'});
-    #}
+    }
 
     my $result;
 

Index: t/index_before_item.t
===================================================================
RCS file: t/index_before_item.t
diff -N t/index_before_item.t
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ t/index_before_item.t       15 Feb 2012 20:45:31 -0000      1.1
@@ -0,0 +1,155 @@
+use strict;
+
+use Test::More;
+BEGIN { plan tests => 5 };
+
+use lib 'maintain/lib/Unicode-EastAsianWidth/lib/';
+use lib 'maintain/lib/libintl-perl/lib/';
+use lib 'maintain/lib/Text-Unidecode/lib/';
+use Texinfo::Parser qw(parse_texi_text);
+use Texinfo::Common qw(move_index_entries_after_items_in_tree);
+use Texinfo::Convert::Texinfo;
+use DebugTexinfo::DebugTree;
+
+ok(1);
+
+sub run_test($$$)
+{
+  my $in = shift;
+  my $out = shift;
+  my $name = shift;
+
+  my $tree = parse_texi_text(undef, $in);
+
+#print STDERR DebugTexinfo::DebugTree::convert(undef, $tree)."\n";
+
+  my $corrected_tree = move_index_entries_after_items_in_tree($tree);
+  my $texi_result = Texinfo::Convert::Texinfo::convert($corrected_tree);
+
+  if (!defined($out)) {
+    print STDERR " --> $name:\n$texi_result";
+  } else {
+    is ($texi_result, $out, $name);
+  }
+}
+
+run_test ('@itemize
+
address@hidden comment
address@hidden index entry
address@hidden first
+
+in item
address@hidden comment before index entry
address@hidden index in paragraph
address@hidden second 
+
address@hidden index before comment
address@hidden comment between index entries
address@hidden after comment
address@hidden 
+third
address@hidden itemize
+', '@itemize
+
address@hidden comment
address@hidden 
address@hidden index entry
+first
+
+in item
address@hidden comment before index entry
address@hidden 
address@hidden index in paragraph
+second 
+
address@hidden 
address@hidden index before comment
address@hidden comment between index entries
address@hidden after comment
+third
address@hidden itemize
+', 'entries before items');
+
+run_test ('@example
+
address@hidden
+
address@hidden idx
address@hidden it
+
address@hidden ttt
address@hidden comment
address@hidden 
+two
+
address@hidden c
address@hidden gg
address@hidden
+
address@hidden itemize
address@hidden example
+','@example
+
address@hidden
+
address@hidden 
address@hidden idx
+it
+
address@hidden 
address@hidden ttt
address@hidden comment
+two
+
address@hidden c
address@hidden
address@hidden gg
+
+', 'in example');
+
+run_test('
address@hidden
address@hidden gg
address@hidden
address@hidden
address@hidden
address@hidden itemize
+', '
address@hidden
address@hidden
address@hidden
address@hidden
address@hidden gg
address@hidden itemize
+', 'empty_items');
+
+run_test('
address@hidden
address@hidden gg
address@hidden
address@hidden comment
address@hidden
address@hidden inter
address@hidden
address@hidden comment
address@hidden
address@hidden c
address@hidden
+in item
address@hidden itemize
+', '
address@hidden
address@hidden
address@hidden
address@hidden
address@hidden
address@hidden
address@hidden gg
address@hidden comment
address@hidden inter
address@hidden comment
address@hidden c
+in item
address@hidden itemize
+', 'only comments and index entries in items');



reply via email to

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