texinfo-commits
[Top][All Lists]
Advanced

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

texinfo/tp Texinfo/Parser.pm t/results/raw/nest...


From: Patrice Dumas
Subject: texinfo/tp Texinfo/Parser.pm t/results/raw/nest...
Date: Tue, 28 Sep 2010 21:26:39 +0000

CVSROOT:        /sources/texinfo
Module name:    texinfo
Changes by:     Patrice Dumas <pertusus>        10/09/28 21:26:39

Modified files:
        tp/Texinfo     : Parser.pm 
        tp/t/results/raw: nested_macros.pl 

Log message:
        parse @macro and @rmacro arguments and keep macro body.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/Texinfo/Parser.pm?cvsroot=texinfo&r1=1.26&r2=1.27
http://cvs.savannah.gnu.org/viewcvs/texinfo/tp/t/results/raw/nested_macros.pl?cvsroot=texinfo&r1=1.1&r2=1.2

Patches:
Index: Texinfo/Parser.pm
===================================================================
RCS file: /sources/texinfo/texinfo/tp/Texinfo/Parser.pm,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -b -r1.26 -r1.27
--- Texinfo/Parser.pm   28 Sep 2010 19:47:03 -0000      1.26
+++ Texinfo/Parser.pm   28 Sep 2010 21:26:39 -0000      1.27
@@ -90,6 +90,7 @@
   'set' => {'arg' => 'special'}, # special arg
   #'clear' => {'arg' => 1, 'skip' => 'line'}, # special arg
   'clear' => {'arg' => 'special'}, # special arg
+  'unmacro' => {'arg' => 1}, 
   # comments
   'comment' => {'arg' => 'lineraw'},
   'c' => {'arg' => 'lineraw'},
@@ -309,7 +310,7 @@
 
 # macro is special
 foreach my $raw_command ('html', 'tex', 'xml', 'docbook', 'verbatim', 
-                         'ignore', 'macro') {
+                         'ignore', 'macro', 'rmacro') {
   $block_commands{$raw_command} = 'raw';
 }
 
@@ -612,20 +613,45 @@
   $parser->{'error_nrs'}++;
 }
 
-sub _parse_macro_command($$)
+sub _parse_macro_command($$$$$;$)
 {
+  my $self = shift;
+  my $command = shift;
   my $line = shift;
   my $parent = shift;
+  my $line_nr = shift;
+  my $top_level = shift;
   my $macro;
-  if ($line =~ /^\s+(\w[\w-]*)\s*(.*)/) {
+  #if ($line =~ /^\s+(\w[\w-]*)\s*(.*)/) {
+  if ($line =~ /^\s+([\w\-]+)\s*(.*)/) {
     my $macro_arg_name = $1;
-    my $macro_arg_args = $2;
-    $macro = { 'cmdname' => 'macro', 'parent' => $parent, 'contents' => [] };
+    my $args_def = $2;
+    my @args;
+
+    if ($args_def =~ s/^\s*{\s*(.*?)\s*}\s*//) {
+      @args = split(/\s*,\s*/ , $1);
+    }
+ 
+    if ($args_def =~ /address@hidden/ and $top_level) {
+      $self->_line_error(sprintf($self->__("Bad syntax for address@hidden"), 
$command));
+    }
+
+    $macro = { 'cmdname' => $command, 'parent' => $parent, 'contents' => [],
+               'special' => {'macro_line' => $line} };
     $macro->{'args'} = [ 
       { 'type' => 'macro_arg_name', 'text' => $macro_arg_name, 
-          'parent' => $macro },
-      { 'type' => 'macro_arg_args', 'text' => $macro_arg_args, 
-          'parent' => $macro} ];
+          'parent' => $macro } ];
+    foreach my $formal_arg (@args) {
+      push @{$macro->{'args'}}, 
+        { 'type' => 'macro_arg_args', 'text' => $formal_arg, 
+          'parent' => $macro};
+      $self->_line_error(sprintf($self->__("Bad address@hidden formal 
argument: %s"),
+                                           $formal_arg), $line_nr)
+            if ($formal_arg !~ /^[\w\-]+$/ and $top_level);
+    }
+  } elsif ($top_level) {
+    _line_error ($self, sprintf($self->
+                    __("%c%s requires a name"), ord('@'), $command), $line_nr);
   }
   return $macro;
 }
@@ -943,20 +969,33 @@
             ($block_commands{$current->{'cmdname'}} eq 'raw')) {
         # special case for macro that may be nested
         my $macro;
-        if ($current->{'cmdname'} eq 'macro' and $line =~ /address@hidden/) {
+        if (($current->{'cmdname'} eq 'macro' 
+              or $current->{'cmdname'} eq 'rmacro') 
+             and $line =~ /address@hidden/) {
           my $mline = $line;
-          $mline =~ s/address@hidden//;
-          $macro = _parse_macro_command ($mline, $current);
+          $mline =~ s/\s*\@(r?macro)//;
+          $macro = _parse_macro_command ($self, $1, $mline, $current, 
$line_nr);
         }
         if ($macro) {
           push @{$current->{'contents'}}, $macro;
           $current = $current->{'contents'}->[-1];
           last;
         } elsif ($line =~ /^(.*?)address@hidden([a-zA-Z][\w-]*)/o and ($2 eq 
$current->{'cmdname'})) {
+          my $end_command = $2;
           $line =~ s/^(.*?)(address@hidden>{'cmdname'})//;
           push @{$current->{'contents'}}, 
             { 'text' => $1, 'type' => 'raw', 'parent' => $current } 
               if ($1 ne '');
+          # store toplevel macro specification
+          if (($end_command eq 'macro' or $end_command eq 'rmacro') 
+               and (! $current->{'parent'} 
+                    or !$current->{'parent'}->{'cmdname'} 
+                    or ($current->{'parent'}->{'cmdname'} ne 'macro'
+                        and $current->{'parent'}->{'cmdname'} ne 'rmacro'))) {
+            $current->{'special'}->{'macrobody'} = 
+               tree_to_texi({ 'contents' => $current->{'contents'} });
+            $self->{'macros'}->{$current->{'args'}->[0]->{'text'}} = $current;
+          }
           $current = $current->{'parent'};
           last unless ($line =~ /\S/);
         } else {
@@ -1145,8 +1184,9 @@
           }
         } elsif (exists($block_commands{$command})) {
           my $macro;
-          if ($command eq 'macro') {
-            $macro = _parse_macro_command ($line, $current);
+          if ($command eq 'macro' or $command eq 'rmacro') {
+            $macro = _parse_macro_command ($self, $command, $line, 
+              $current, $line_nr, 1);
           }
           if ($macro) {
             push @{$current->{'contents'}}, $macro;
@@ -1666,9 +1706,18 @@
        $result .= tree_to_texi ($arg) . ', ';
     }
     $result =~ s/, $//;
-  } elsif ($cmdname eq 'macro') {
-    $result .= ' ' .$cmd->{'args'}->[0]->{'text'}. ' '
-               . $cmd->{'args'}->[1]->{'text'};
+  } elsif ($cmdname eq 'macro' or $cmdname eq 'rmacro') {
+   # my @args = @{$cmd->{'args'}};
+   # my $name = shift @args;
+   # $result .= ' ' .$name->{'text'};
+   # if (@args) {
+   #   $result .= ' {';
+   #   foreach my $arg (@args) {
+   #     $result .= $arg->{'text'} .', ';
+   #   }
+   #   $result =~ s/, $//;
+   #   $result .= '}';
+    $result .= $cmd->{'special'}->{'macro_line'};
   } elsif (defined($cmd->{'args'})) {
     my $braces;
     $braces = 1 if (($cmd->{'args'}->[0]->{'type'} 
@@ -1779,6 +1828,14 @@
       _line_error ($self, sprintf($self->
                     __("%c%s requires a name"), ord('@'), $command), $line_nr);
     }
+  } elsif ($command eq 'unmacro') {
+    if ($line =~ /^(\s+)([\w\-]+)/) {
+      $args = [$2];
+      delete $self->{'macros'}->{$2};
+    } else {
+      _line_error ($self, sprintf($self->
+                    __("%c%s requires a name"), ord('@'), $command), $line_nr);
+    }
   } elsif ($command eq 'defindex' || $command eq 'defcodeindex') {
     if ($line =~ s/^\s+(\w+)\s*//) {
       my $name = $1;

Index: t/results/raw/nested_macros.pl
===================================================================
RCS file: /sources/texinfo/texinfo/tp/t/results/raw/nested_macros.pl,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- t/results/raw/nested_macros.pl      25 Sep 2010 10:01:35 -0000      1.1
+++ t/results/raw/nested_macros.pl      28 Sep 2010 21:26:39 -0000      1.2
@@ -11,7 +11,12 @@
         },
         {
           'parent' => {},
-          'text' => '{ arg,  ex}',
+          'text' => 'arg',
+          'type' => 'macro_arg_args'
+        },
+        {
+          'parent' => {},
+          'text' => 'ex',
           'type' => 'macro_arg_args'
         }
       ],
@@ -29,11 +34,6 @@
               'parent' => {},
               'text' => 'othermacro',
               'type' => 'macro_arg_name'
-            },
-            {
-              'parent' => {},
-              'text' => '',
-              'type' => 'macro_arg_args'
             }
           ],
           'cmdname' => 'macro',
@@ -45,7 +45,11 @@
               'type' => 'raw'
             }
           ],
-          'parent' => {}
+          'parent' => {},
+          'special' => {
+            'macro_line' => ' othermacro 
+'
+          }
         },
         {
           'parent' => {},
@@ -54,15 +58,25 @@
           'type' => 'raw'
         }
       ],
-      'parent' => {}
+      'parent' => {},
+      'special' => {
+        'macro_line' => ' truc   { arg,  ex}
+',
+        'macrobody' => 'in macro \\arg\\
address@hidden othermacro 
+other macro
address@hidden macro
address@hidden
+'
+      }
     }
   ]
 };
 $result_trees{'nested_macros'}{'contents'}[0]{'args'}[0]{'parent'} = 
$result_trees{'nested_macros'}{'contents'}[0];
 $result_trees{'nested_macros'}{'contents'}[0]{'args'}[1]{'parent'} = 
$result_trees{'nested_macros'}{'contents'}[0];
+$result_trees{'nested_macros'}{'contents'}[0]{'args'}[2]{'parent'} = 
$result_trees{'nested_macros'}{'contents'}[0];
 $result_trees{'nested_macros'}{'contents'}[0]{'contents'}[0]{'parent'} = 
$result_trees{'nested_macros'}{'contents'}[0];
 
$result_trees{'nested_macros'}{'contents'}[0]{'contents'}[1]{'args'}[0]{'parent'}
 = $result_trees{'nested_macros'}{'contents'}[0]{'contents'}[1];
-$result_trees{'nested_macros'}{'contents'}[0]{'contents'}[1]{'args'}[1]{'parent'}
 = $result_trees{'nested_macros'}{'contents'}[0]{'contents'}[1];
 
$result_trees{'nested_macros'}{'contents'}[0]{'contents'}[1]{'contents'}[0]{'parent'}
 = $result_trees{'nested_macros'}{'contents'}[0]{'contents'}[1];
 $result_trees{'nested_macros'}{'contents'}[0]{'contents'}[1]{'parent'} = 
$result_trees{'nested_macros'}{'contents'}[0];
 $result_trees{'nested_macros'}{'contents'}[0]{'contents'}[2]{'parent'} = 
$result_trees{'nested_macros'}{'contents'}[0];



reply via email to

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