NAME
XSH - scripting language for XPath-based editing of XML
PREAMB
foreach my $sec ($dom->findnodes('/recdescent-xml/doc/section')) { my $name=$sec->getAttribute('id');
($title)=$sec->findnodes('./title');
my $t= $title ? get_text($title,0,1) : $name;
print "\n=head1 ",uc($t),"\n\n";
print_description($sec,"","");
my @commands=$dom->findnodes("//rules/rule[\@type='command' and ".
"documentation[contains(\@sections,'$name')]]");
if (@commands) {
print "\n\n=head2 RELATED COMMANDS\n\n";
print join ", ", sort map { get_name($_) }
@commands;
print "\n\n";
}
}
#print "\n=head1 COMMAND REFERENCE\n\n=over 5\n\n"; #foreach ($dom->findnodes("//rules/rule[\@type='command' and documentation]")) { # print "\n\n=item ".get_name($_)."\n\n"; # print get_text($_->findnodes('documentation/shortdesc')); #} #print "\n=back\n\n";
#print "\n=head1 ARGUMENT TYPES\n\n"; #print wrap(" "," ", # join ", ", sort map { get_name($_) } # grep {defined($_)} # $dom->findnodes("//rules/rule[\@type='argtype']")), # "\n\n";
print "\n=head1 COMMAND REFERENCE\n\n";
foreach my $r (sort {get_name($a) cmp get_name($b)} $rules->findnodes('./rule[@type="command"]')) { print_rule_desc($r); }
print "\n=head1 ARGUMENT TYPE REFERENCE\n\n"; print "=over 4\n\n";
foreach my $r (sort {get_name($a) cmp get_name($b)} $rules->findnodes('./rule[@type="argtype"]')) { ($desc)=$r->findnodes('./documentation/description'); if ($desc) { print "\n\n=item ".get_name($r)."\n\n"; print_description($desc,'',''); } }
print "\n=head1 XPATH EXTENSION FUNCTION REFERENCE\n\n"; print "=over 4\n\n"; foreach my $r (sort {get_name($a) cmp get_name($b)} $rules->findnodes('./rule[@type="function"]')) { print_rule_desc($r); }
print "\n\n=back\n\n";
print "\n";
exit;
## ================================================
sub print_rule_desc { my ($r)=@_; return unless $r; my ($ruledoc)=$r->findnodes('./documentation'); return unless $ruledoc; my $name=get_name($r); # ($title)=$ruledoc->findnodes('./title'); # my $t=$title ? get_text($title) : $name; print "\n\n=head2 ",$name,"\n\n"; print "\n\n=over 4\n\n";
@usage=$ruledoc->findnodes('./usage');
if (@usage) {
print "\n\n=item Usage:\n\n";
foreach (@usage) {
my $usage=get_text($_);
$usage=~s/\s+/ /;
print $usage,"\n ";
}
print "\n";
}
@aliases=grep {defined($_)} $r->findnodes('./aliases/alias');
if (@aliases) {
print "\n\n=item Aliases:\n\n";
print join " ",map { get_name($_) } @aliases;
print "\n\n";
}
($desc)=$ruledoc->findnodes('./description');
if ($desc) {
print "\n\n=item Description:\n\n";
print_description($desc,'','');
}
@seealso=grep {defined($_)} $ruledoc->findnodes('./see-also/ruleref');
if (@seealso) {
print "\n\n=item See also:\n\n";
print join " ", grep {defined($_)}
map { $_->getAttribute('ref') } @seealso;
print "\n\n";
}
print "\n\n=back\n\n";
}
sub strip_space { my ($text)=@_; $text=~s/^\s*//; $text=~s/\s*$//; return $text; }
sub get_name { my ($r)=@_; return $r->getAttribute('name') ne "" ? $r->getAttribute('name') : $r->getAttribute('id'); }
sub get_text { my ($node,$no_strip,$noformat)=@_; my $text=""; foreach my $n ($node->childNodes()) { if ($n->nodeType() == XML::LibXML::XML_TEXT_NODE || $n->nodeType() == XML::LibXML::XML_CDATA_SECTION_NODE) { my $data=$n->getData(); $data=~s/\t/ /g; $data=~s/([\/\|><])/"E<$enc{$1}>"/eg unless $noformat; $text.=$data; } elsif ($n->nodeType() == XML::LibXML::XML_ELEMENT_NODE) { if (!$noformat and $n->nodeName() eq 'link') { $text.="".get_text($n,1,$noformat).""; } elsif (!$noformat and $n->nodeName() eq 'xref') { $text.=""; my ($ref)=$node-findnodes("id('".$n->getAttribute('linkend')."')"); if ($ref) { $text.=get_name($ref); } else { print STDERR "Reference to undefined identifier: ",$n->getAttribute('linkend'),"\n"; } $text.=">"; } elsif (!$noformat and $n->nodeName() eq 'typeref') { foreach (split /\s/,$n->getAttribute('types')) { $text.=join ", ", sort map { get_name($_) } grep {defined($_)} $node->findnodes("//rules/rule[\@type='$_']"); } } elsif ($n->nodeName() eq 'tab') { $text.="\t" x $n->getAttribute('count'); } elsif (!$noformat and $n->nodeName() eq 'userinput') { $text.="".get_text($n,1,$noformat).""; } elsif (!$noformat and $n->nodeName() eq 'literal') { $text.="".get_text($n,1,$noformat).""; } else { $text.=get_text($n,$no_strip,$noformat); } } } return $no_strip ? $text : strip_space($text); }
sub max { ($_[0] > $_[1]) ? $_[0] : $_[1] }
sub print_description { my ($desc,$indent,$bigindent)=@_; foreach my $c ($desc->childNodes()) { if ($c->nodeType == XML::LibXML::XML_ELEMENT_NODE) { if ($c->nodeName eq 'para') { my $t=get_text($c); $t=~s/\s+/ /g; print $t,"\n\n"; $indent=$bigindent; } elsif ($c->nodeName eq 'section') { my ($title)=$c->findnodes('./title'); if ($title) { my $t=get_text($title); print "\n\n=head2 $t\n\n"; } print_description($c,$indent,$bigindent); } elsif ($c->nodeName eq 'example') { foreach (map { get_text($_) } $c->findnodes('./title')) { s/\s+/ /g; print "Example: $_\n"; } unless ($c->findnodes('./title')) { print "Example:\n"; } print "\n"; foreach (map { get_text($_,1,1) } $c->findnodes('./code')) { s/\n[ ]*/\n /mg; s/\\\n/\\\n /g; s/\t/ /g; print " $_\n"; } print "\n"; } } } }
print <<'POSTAMB';
AUTHOR
Petr Pajas, pajas@matfyz.cz
SEE ALSO
xsh, XML::XSH2, XML::LibXML, XML::XUpdate, http://xsh.sourceforge.net/doc
1 POD Error
The following errors were encountered while parsing the POD:
- Around line 171:
Unknown E content in E<$enc{$1}>