Category: | HTML Utility |
Author/Contact Info | Briac 'OeufMayo' Pilpré |
Description: | This is a small script that turns a valid XML file into a colorful HTML file! Yay! Some handlers have not been used (most notably entities, notations), but they should be, eventually. Update Tue Sep 4 07:46:13 UTC 2001: added mirod's suggestion. Thanks mirod! |
#!/usr/bin/perl -w use strict; use XML::Parser; my $parser = new XML::Parser( Handlers => { Init => \&init, Start => \&start, End => \&end, Char => \&char, Final => \&final, Proc => \&proc, Comment => \&comment, CdataStart => \&cdstart, CdataEnd => \&cdend, XMLDecl => \&xmldecl, Doctype => \&doctype, } ); my $cdata; my $style = <<'_CSS_'; .element { font-weight: bold; color: red; } .attrname { font-weight: bold; font-style: italic; color: green; } .attrvalue { font-style: italic; color: green; } .comment { color: blue; } .proc { color: green; font-weight: bold; } .cdata { color: violet; } .doctype { font-weight: bold; color: brown; } .xmldecl { font-weight: bold; } _CSS_ if( $ARGV[0]) { $parser->parsefile( $ARGV[0]); } else { $parser->parse( \*STDIN); } sub init { print qq'<html><head><title></title><style type="text/css" +>$style' . '</style></head><body>' } sub final { print '</body></html>' } sub xmldecl { my ($p, $v, $e, $s) = @_; print qq'<p><span class="xmldecl"><?xml version="$v" encoding=" +$e" ' . qq'standalone="' .( $s ? 'yes' : 'no') . '"?></span></p> +'; } sub start { my ( $p, $e, %a ) = @_; print("<ul>"); print(qq'<<span class="element">$e</span>'); foreach ( sort keys %a ) { print qq' <span class="attrname">$_=</span>' . qq'<span class="attrvalue">"$a{$_}"</span>'; } print '>'; } sub end { my ( $p, $e ) = @_; print qq'</<span class="element">$e</span>>'; print '</ul>'; } sub char { my ( $p, $s ) = @_; $s =~ s/\s+/ /g; if ($cdata){ $s =~ s/&/&/gs; $s =~ s/</</gs; $s =~ s/>/>/gs; $s =~ s/"/"/gs; } print "$s"; } sub proc { my ( $e, $t, $d ) = @_; print '<ul>'; print qq'<<span class="proc">?$t</b> $d<b>?</b>>'; print "</span></ul>"; } sub comment { my ( $e, $d ) = @_; print '<ul><span class="comment">'; print "<!-- $d -->"; print '</span></ul>'; } sub cdstart { print '<ul><![CDATA[<span class="cdata">'; $cdata++ } sub cdend { print '</span>]]></ul>'; $cdata-- } sub doctype { my ( $e, $n, $s, $p, $i ) = @_; print qq'<span class="doctype">'; print qq'<!DOCTYPE $n PUBLIC "$p" $i "$s" >'; print qq'</span>'; } |
Back to
Code Catacombs