package LXRng::Markup::File;
use strict;
use HTML::Entities;
sub new {
my ($class, %args) = @_;
return bless(\%args, $class);
}
sub context {
my ($self) = @_;
return $$self{'context'};
}
sub safe_html {
my ($str) = @_;
return encode_entities($str, '^\n\r\t !\#\$\(-;=?-~\200-\377');
}
sub make_format_newline {
my ($self, $node) = @_;
my $line = 0;
my $tree = $self->context->vtree();
my $name = $node->name;
sub {
my ($nl) = @_;
$line++;
$nl = safe_html($nl);
# id="" is not valid XHTML 1.0, but it is an extremely
# handy shorthand for generating line numbers that don't
# affect cut-n-paste.
return qq{$nl}.
qq{};
}
}
sub format_comment {
my ($self, $com) = @_;
$com = safe_html($com);
return qq{};
}
sub format_string {
my ($self, $str) = @_;
$str = safe_html($str);
return qq{$str}
}
sub format_include {
my ($self, $paths, $all, $pre, $inc, $suf) = @_;
my $tree = $self->context->vtree();
if (@$paths > 1) {
$pre = safe_html($pre);
$inc = safe_html($inc);
$suf = safe_html($suf);
my $alts = join("|", map { $_ } @$paths);
return qq{$pre$inc$suf};
}
elsif (@$paths > 0) {
$pre = safe_html($pre);
$inc = safe_html($inc);
$suf = safe_html($suf);
return qq{$pre$inc$suf};
}
else {
return safe_html($all);
}
}
sub format_code {
my ($self, $idre, $syms, $frag) = @_;
my $tree = $self->context->vtree();
my $path = $self->context->path();
Subst::Complex::s($frag,
$idre => sub {
my $sym = $_[1];
if (exists($$syms{$sym})) {
$sym = safe_html($sym);
return qq{$sym}
}
else {
return safe_html($sym);
}
},
qr/(.*?)/ => sub { return safe_html($_[0]) },
);
}
sub format_raw {
my ($self, $str) = @_;
return safe_html($str);
}
sub markupfile {
my ($self, $subst, $parse) = @_;
my ($btype, $frag) = $parse->nextfrag;
return () unless defined $frag;
$btype ||= 'code';
if ($btype and exists $$subst{$btype}) {
return $$subst{$btype}->s($frag);
}
else {
return $frag;
}
}
1;