#!/usr/bin/perl
use strict;
use XML::Simple;
print "<!DOCTYPE html>
<html>
<style>
table, th, td {
border: 1px solid black;
}
</style>
<body>\n";
while( <> ){
if( /^<report>/ ){
next;
}
if( /^ {4}<(.*)>/ ){
process_table();
}
}
sub process_table
{
my ( $table_name ) = ( /<(.*)>/ );
print "<h1>$table_name</h1>\n";
print "<table>\n";
$_ = <>;
if( ! /<header>/ ){
die "<header> entry expected";
}
print "<tr>\n";
$_ = <>;
while( !/<\/header/ ){
my ( $col_name ) = ( /<(.*)\/>/ );
print "<th>$col_name</th>\n";
$_ = <>;
}
print "</tr>\n";
$_ = <>;
if( !/<data>/ ){
die "<data> entry expected";
}
$_ = <>;
while( !/^ {8}<\/data>/ ){
if( /^ {12}<equal>/ ){
$_ = <>;
print "<tr>\n";
while( !/^ {12}<\/equal>/ ){
my ( $val ) = ( /^ {16}<.+?>(.+?)<\/.+?>/ );
print "<td>" . remove_cdata($val) . "</td>\n";
$_ = <>;
}
print "</tr>\n";
$_ = <>;
}elsif( /^ {12}<additional>/ ){
$_ = <>;
print "<tr style=\"background-color:green\">\n";
while( !/^ {12}<\/additional>/ ){
my ( $val ) = ( /^ {16}<.+?>(.+?)<\/.+?>/ );
print "<td><ins>" . remove_cdata( $val ) . "</ins></td>\n";
$_ = <>;
}
print "</tr>\n";
$_ = <>;
}elsif( /^ {12}<missing>/ ){
$_ = <>;
print "<tr style=\"background-color:red\">\n";
while( !/^ {12}<\/missing>/ ){
my ( $val ) = ( /^ {16}<.+?>(.+?)<\/.+?>/ );
print "<td><del>" . remove_cdata( $val ). "</del></td>\n";
$_ = <>;
}
print "</tr>\n";
$_ = <>;
}elsif( /^ {12}<different>/ ){
$_ = <>;
print "<tr style=\"background-color:yellow\">\n";
while( !/^ {12}<\/different>/ ){
my ( $val ) = ( /^ {16}<.+?>(.*?)<\/.+?>/ );
if( not defined $val ){
$_ = <>;
if( !/^ {20}<old_value>/ ){
die "Old value expected";
}
my ( $o_val ) = ( /^ {20}<old_value>(.*?)<\/old_value>/ );
$_ = <>;
if( !/^ {20}<new_value>/ ){
die "New value expected";
}
my ( $n_val ) = ( /^ {20}<new_value>(.*?)<\/new_value>/ );
print "<td><del>" . remove_cdata( $o_val ). "</del><ins>"
. remove_cdata( $n_val ). "</ins></td>\n";
$_ = <>;
$_ = <>;
}else{
print "<td>" . remove_cdata( $val ) . "</td>\n";
$_ = <>;
}
}
print "</tr>\n";
$_ = <>;
}else{
$_ = <>;
}
}
$_ = <>;
print "</table>\n";
}
sub remove_cdata
{
my $val = shift;
if( $val =~ /^<!\[CDATA\[/ ){
$val =~ s/^<!\[CDATA\[//;
$val =~ s/\]\]>$//;
}
$val =~ s/&/&/sg;
$val =~ s/</</sg;
$val =~ s/>/>/sg;
$val =~ s/"/"/sg;
return $val;
}