#!/bin/perl -w # All rights reserved. # # This program is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. # use strict; use XML::Twig; my $xml_file= shift @ARGV || "pgc.xml"; my $html_file= shift @ARGV || "pgc.html"; my $id; open( HTML, ">$html_file") or die "cannot create $html_file: $!"; my $t= new XML::Twig( pretty_print => 'indented', empty_tags => 'html', char_handler => sub { $_[0]=~ s/'/'/g; return $_[0];}, start_tag_handlers => { item => sub { $id= $_[1]->att( 'id'); } }, twig_handlers => { code => \&code, 'modifiers' => sub { my( $t, $mods)= @_; $_[1]->set_gi( 'dl'); my $title= $mods->first_child( 'title'); $title->move( before => $mods); $title->set_gi( 'h2'); }, 'modifier' => \&modifier, 'modifier/short'=> sub { $_[1]->erase; }, 'section' => sub { $_[1]->set_gi( 'div'); }, 'section/title' => sub { $_[1]->set_gi( 'h2') }, 'item' => sub { $_[1]->set_gi( 'table'); }, 'item/title' => \&item_title, 'level' => \&level, 'subcats' => \&subcats, 'subcat' => \&subcat, 'replace' => \&replace, } ); $t->parsefile( $xml_file); $t->print( \*HTML); sub code { my( $t, $code)= @_; $code->set_gi( 'html'); my $title= $code->first_child( 'title'); my $body= $code->insert( 'body'); $body->set_att( bgcolor => "#FFFFFF"); my $head= new XML::Twig::Elt( 'head'); $title->copy->paste( $head); $head->paste( $code); $title->set_gi( 'h1'); } sub modifier { my( $t, $mod)=@_; my $long= $mod->first_child( 'long'); $long->set_gi( 'dl'); $long->move( after => $mod); $mod->set_gi( 'dt'); $mod->set_text( $mod->att( 'id')); $mod->del_atts; } sub level { my( $t, $elt)= @_; $elt->set_gi( 'tr'); $elt->insert( 'td'); my $str= $id.$elt->att( 'str'); my $estr= new XML::Twig::Elt( 'td', $str); $estr->insert( 'b'); $elt->del_att( 'str'); $estr->paste( $elt); } sub subcats { my( $t, $subcats)= @_; $subcats->set_gi( 'table'); my $td= $subcats->wrap_in( 'td'); $td->set_att( colspan => 2); my $tr= $td->wrap_in( 'tr'); my $title= new XML::Twig::Elt( 'small', 'Sub Categories'); $title->paste( 'before', $subcats); $title->wrap_in( 'b'); } sub subcat { my( $t, $elt)= @_; $elt->set_gi( 'tr'); $elt->insert( 'td', 'small'); my $estr= new XML::Twig::Elt( 'td', $elt->att( 'id')); $estr->insert( 'b', 'small'); $estr->paste( $elt); $elt->del_att( 'id'); } sub replace { my( $t, $replace)= @_; my $text= new XML::Twig::Elt( PCDATA, $replace->att( 'str')); $text->paste( 'before', $replace); $replace->cut; } sub item_title { my( $t, $title)= @_; $title->set_gi( 'h4'); $title->prefix( $id . " "); my $td= $title->wrap_in( 'td'); $td->set_att( colspan => 2); my $tr= $td->wrap_in( 'tr'); }