#!/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/&apos;/'/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');
  }
