[Top][All Lists]
[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];
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- texinfo/tp Texinfo/Parser.pm t/results/raw/nest...,
Patrice Dumas <=