1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
# /=====================================================================\ #
# | LaTeXML::Core::Parameters | #
# | Representation of Parameters for Control Sequences | #
# |=====================================================================| #
# | Part of LaTeXML: | #
# | Public domain software, produced as part of work done by the | #
# | United States Government & not subject to copyright in the US. | #
# |---------------------------------------------------------------------| #
# | Bruce Miller <bruce.miller@nist.gov> #_# | #
# | http://dlmf.nist.gov/LaTeXML/ (o o) | #
# \=========================================================ooo==U==ooo=/ #
package LaTeXML::Core::Parameters;
use strict;
use warnings;
use LaTeXML::Global;
use LaTeXML::Common::Object;
use LaTeXML::Common::Error;
use LaTeXML::Core::Parameter;
use LaTeXML::Core::Tokens;
use base qw(LaTeXML::Common::Object);
sub new {
my ($class, @paramspecs) = @_;
return bless [@paramspecs], $class; }
sub getParameters {
my ($self) = @_;
return @$self; }
sub stringify {
my ($self) = @_;
my $string = '';
foreach my $parameter (@$self) {
my $s = $parameter->stringify;
$string .= ' ' if ($string =~ /\w$/) && ($s =~ /^\w/);
$string .= $s; }
return $string; }
sub equals {
my ($self, $other) = @_;
return (defined $other)
&& ((ref $self) eq (ref $other)) && ($self->stringify eq $other->stringify); }
sub getNumArgs {
my ($self) = @_;
my $n = 0;
foreach my $parameter (@$self) {
$n++ unless $$parameter{novalue}; }
return $n; }
sub revertArguments {
my ($self, @args) = @_;
my @tokens = ();
foreach my $parameter (@$self) {
next if $$parameter{novalue};
push(@tokens, $parameter->revert(shift(@args))); }
return @tokens; }
sub readArguments {
my ($self, $gullet, $fordefn) = @_;
my @args = ();
$gullet->setup_scan();
my ($p, $v);
return map { $p = $_; $v = $p && $p->read($gullet, $fordefn); ($$p{novalue} ? () : $v); } @$self; }
sub readArgumentsAndDigest {
my ($self, $stomach, $fordefn) = @_;
my @args = ();
my $gullet = $stomach->getGullet;
$gullet->setup_scan();
foreach my $parameter (@$self) {
my $value = $parameter->read($gullet, $fordefn);
if (!$$parameter{novalue}) {
$value = $parameter->digest($stomach, $value, $fordefn);
push(@args, $value); } }
return @args; }
sub reparseArgument {
my ($self, $gullet, $tokens) = @_;
if (defined $tokens) {
return $gullet->readingFromMouth(LaTeXML::Core::Mouth->new(), sub { # start with empty mouth
my ($gulletx) = @_;
$gulletx->unread($tokens); # but put back tokens to be read
my @values = $self->readArguments($gulletx);
$gulletx->skipSpaces;
return @values; }); }
else {
return (); } }
#======================================================================
1;
__END__
=pod
=head1 NAME
C<LaTeXML::Core::Parameters> - formal parameters.
=head1 DESCRIPTION
Provides a representation for the formal parameters of L<LaTeXML::Core::Definition>s:
It extends L<LaTeXML::Common::Object>.
=head2 METHODS
=over 4
=item C<< @parameters = $parameters->getParameters; >>
Return the list of C<LaTeXML::Core::Parameter> contained in C<$parameters>.
=item C<< @tokens = $parameters->revertArguments(@args); >>
Return a list of L<LaTeXML::Core::Token> that would represent the arguments
such that they can be parsed by the Gullet.
=item C<< @args = $parameters->readArguments($gullet,$fordefn); >>
Read the arguments according to this C<$parameters> from the C<$gullet>.
This takes into account any special forms of arguments, such as optional,
delimited, etc.
=item C<< @args = $parameters->readArgumentsAndDigest($stomach,$fordefn); >>
Reads and digests the arguments according to this C<$parameters>, in sequence.
this method is used by Constructors.
=back
=head1 SEE ALSO
L<LaTeXML::Core::Parameter>.
=head1 AUTHOR
Bruce Miller <bruce.miller@nist.gov>
=head1 COPYRIGHT
Public domain software, produced as part of work done by the
United States Government & not subject to copyright in the US.
=cut
|