Alt-CWB-ambs
view release on metacpan or search on metacpan
lib/CWB/CEQL/Parser.pm view on Meta::CPAN
=back
The wiki markup is non-recursive, i.e. no substitutions will be applied to
the text wrapped in C<''...''> etc. This behaviour is intentional, so that
e.g. B<**> in a query expression will not be mistaken for a bold face marker,
(as long as the query is displayed in typewriter font, i.e. as C<''<query>''>).
=cut
sub formatHtmlText {
my $self = shift;
my @html_lines = ();
my $in_list = 0;
while (@_) {
my $line = shift;
my $list_item = ($line =~ s{^ -\s+}{}) ? 1 : 0;
$line = $self->encodeEntities($line); # does not affect **, // and ''
$line =~ s{(\*\*|//|'')(.*?)(\1)}{
if ($1 eq "**") { "<b>$2</b>" }
elsif ($1 eq "//") { "<i>$2</i>" }
else { "<code>$2</code>" }
}ge;
if ($list_item) {
push @html_lines, "<ul>"
unless $in_list;
push @html_lines, "<li>$line</li>";
$in_list = 1;
}
else {
push @html_lines, "</ul>"
if $in_list;
push @html_lines, "<p>$line</p>";
$in_list = 0;
}
}
push @html_lines, "</ul>"
if $in_list;
return join("\n", @html_lines);
}
=item I<$html> = I<$grammar>->B<encodeEntities>(I<$string>);
Replacement for B<encode_entities> function from B<HTML::Entities>, to avoid
dependency on this package (which is not part of the standard library).
Transforms unsafe characters C<E<lt>>, C<E<gt>>, C<&> and C<"> into HTML
entities, normalises whitespace and removes other control characters.
If I<$string> is a Unicode string, all non-ASCII characters are replaced
by numerical entities (otherwise, an unknown 8-bit character set is assumed,
so no substitutions can be made).
=cut
sub encodeEntities {
my ($self, $s) = @_;
my %entity = ( '<' => '<', '>' => '>', '&' => '&', '"' => '"' );
$s =~ s/([<>&"])/$entity{$1}/ge; # unsafe characters => entities
$s =~ s/[ \t]+/ /g; # normalise whitespace (but not line breaks)
$s =~ s/[\x00-\x09\x0b\x0c\x0e-\x1f]+//g; # remove other control characters except LF and CR
if (Encode::is_utf8($s)) {
$s =~ s/([^\x00-\x7f])/sprintf "&#x%X;", ord($1)/ge;
}
return $s;
}
=back
=head2 Internal structure of CWB::CEQL::Parser objects
A DPP parser object (i.e. an object that belongs to B<CWB::CEQL::Parser> or
one of its subclasses) is a data structure (hashref) with the following
variables:
=over 4
=item PARAM_DEFAULTS
A hashref containing the global values of grammar parameters, i.e. values set
by the main program for this parser object or the default values defined by
the grammar class.
=item PARAM
Working copy of the grammar parameters, which is used while parsing and may be
modified by grammar rules without affecting the global values. During a
parse, the B<NewParam>, B<SetParam> and B<GetParam> methods operate on this
working copy.
The C<PARAM> variable is re-initialised before each parse with a flat copy of
the C<PARAM_DEFAULTS> hashref. Therefore, care has to be taken when modifying
complex parameter values within grammar rules, as the changes will affect the
global values in C<PARAM_DEFAULTS>. If complex values need to be changed
internally, the grammar rule should always update the parameter with
B<SetParam> and a deep copy of the previous parameter value.
=item INPUT
The current input string passed to the B<Parse> method. This variable is
mostly used to indicate whether the parser is currently active or not (e.g. in
order to avoid nested B<Parse> calls).
=item ERROR
Error message generated by the last parse, or B<undef> if the parse was
successful. This error message is returned by B<ErrorMessage> and
B<HtmlErrorMessage> together with a backtrace of the parser's call stack.
=item CALLSTACK
The C<CALLSTACK> variable is an arrayref with information about the nested
calls of grammar rules and their input strings. Each array element
corresponds to a nested rule invocation and is a hashref with the following
fields:
=over 4
=item RULE
Name of the grammar rule (i.e. Perl B<method>) invoked. When the shift-reduce
parser is called with B<Apply>, a special rule named C<APPLY> is pushed on the
( run in 2.476 seconds using v1.01-cache-2.11-cpan-600a1bdf6e4 )