#---------------------------------------------------------------------------
#XML Frantext (type "poèmes") -> XHTML-strict, avec table des poèms en tête
#En Perl, avec XML-DOM
#M2-Trad, 2009

#Usage : ?perl FranText2Html.pl fichierSource.xml fichierBut.html
#---------------------------------------------------------------------------

use strict;
use warnings;
use XML::DOM;

sub consXHtmlDoc { # sans arg.

	#le document
	my $doc = XML::DOM::Document->new;
	$doc->setXMLDecl($doc->createXMLDecl("1.0", "UTF-8"));
	
	#la DTD
	my $dtd = $doc->createDocumentType("html", 
	             "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd",
	             "-//W3C//DTD XHTML 1.0 Strict//EN");
	$doc->setDoctype ($dtd);	
	
	#la racine
	my $html = $doc->createElement("html");
	$doc->appendChild($html);
	
	#un en-tête minimal
	my $head = $doc->createElement("head");
	$html->appendChild($head);
			
	my $title = $doc->createElement("title");
	$head->appendChild($title);
	$title->appendChild($doc->createTextNode("Tir\x{00E9} de Frantexte"));
			
	$html->appendChild($doc->createElement("body"));
	
	return $doc;
}#consXHtmlDoc

sub consEnTete ($$) { # doc_source, doc_but
my ($doc_src, $doc_but) = @_;
	
	# récupérer les infos
	my ($titre) = $doc_src->getElementsByTagName("title");
	my ($auteur) = $doc_src->getElementsByTagName("author");
	my ($publ) =  $doc_src->getElementsByTagName("publisher");
		
	my $le_titre = $titre->getFirstChild()->getData();
	my $l_auteur = $auteur->getFirstChild()->getData();
	my $la_publ = $publ->getFirstChild()->getData();
		
	# créer un bloc "div" centré
	my $div =  $doc_but->createElement("div");
	$div->setAttribute("class", "entete");
		
	my $titre_1 = $doc_but->createElement("h2");
	$div->appendChild($titre_1);
	$titre_1->appendChild($doc_but->createTextNode($le_titre));
		
	my $titre_2 = $doc_but->createElement("h4");
	$div->appendChild($titre_2);
	$titre_2->appendChild($doc_but->createTextNode("par"));
		
	my $titre_3 = $doc_but->createElement("h3");
	$div->appendChild($titre_3);
	my $titre_4 = $doc_but->createElement("i");
	$titre_3->appendChild($titre_4);
	$titre_4->appendChild($doc_but->createTextNode($l_auteur));
		
	my $titre_5 = $doc_but->createElement("p");
	$div->appendChild($titre_5);
	$titre_5->appendChild($doc_but->createTextNode($la_publ));

	return $div;
}# consEnTete

sub nbVers($){ # objet "div"
my ($div) = @_;
 	
 	my $k = 0;
 	my ($txt) = $div->getElementsByTagName("p");
 	my @enfs = $txt->getChildNodes();
 	foreach my $enf ( @enfs ){
 		if( $enf->getNodeName() eq '#text' ){ # c'est un vers
 			$k++;
 		}
 	}
 	return $k;
}

sub consTOC ($$) { # doc_source, doc_but
my ($doc_src, $doc_but) = @_;
	
	my $div =  $doc_but->createElement("div");
	$div->setAttribute("class", "TOC");
	my $liste = $doc_but->createElement("ol");
	$div->appendChild($liste);
	
	my $k = 0; # compteur de poèmes
	
	my @listDivs = $doc_src->getDocumentElement()->getElementsByTagName("div");
 	foreach my $div ( @listDivs ){
 	
 		$k++;
 		my ($head) = $div->getElementsByTagName("head");
 		my $le_titre = $head->getFirstChild()->getData(); #chaîne
 		my $nbVers = nbVers($div); # nombre
 		my $l_entree = "$le_titre : $nbVers vers";
 		
 		my $li = $doc_but->createElement("li");
 		$liste->appendChild($li);
 		my $lien = $doc_but->createElement("a");
 		$li->appendChild($lien);
		$lien->setAttribute("href", "#p$k");
 		$lien->appendChild($doc_but->createTextNode($l_entree));
 	}
 	return $div;
}# consTOC

sub consPoeme ($$$) { # numéro, objet "div", doc_but
my ($k, $div, $doc_but) = @_;
	
	my $poeme =  $doc_but->createElement("div");
	$poeme->setAttribute("class", "poeme");
	
	my $titre = $doc_but->createElement("p");
 	$poeme->appendChild($titre);
 	$titre->setAttribute("class", "titre");
 	
 	my $ancre = $doc_but->createElement("a");
 	$ancre->setAttribute("name", "p$k");
	$titre->appendChild($ancre);
	
	my ($head) = $div->getElementsByTagName("head");
 	my $le_titre = $head->getFirstChild()->getData(); #chaîne
 	$le_titre =~ s/^\s*(\S.*\S)\s*$/$1/; #supprimer les blancs et sauts de ligne
 	$ancre->appendChild($doc_but->createTextNode($le_titre));
 	
	my ($txt) = $div->getElementsByTagName("p");
 	my @enfs = $txt->getChildNodes();
 	foreach my $enf ( @enfs ){
 		if( $enf->getNodeName() eq '#text' ){ # c'est un vers
 			my $le_vers = $enf->getData();
 			$le_vers =~ s/^\s*(\S.*\S)\s*$/$1/; #supprimer les blancs et sauts de ligne
 			
 			my $vers = $doc_but->createElement("p");
 			$poeme->appendChild($vers);
 			$vers->appendChild($doc_but->createTextNode($le_vers));
 		}#if
 	}#foreach
 	return $poeme;
}# consPoeme

sub consListPoemes ($$) { # doc_source, doc_but
my ($doc_src, $doc_but) = @_;

	my $k = 0; # compteur de poèmes
	
	my $div =  $doc_but->createElement("div");
	$div->setAttribute("class", "poemes");
	my $liste = $doc_but->createElement("ol");
	$div->appendChild($liste);
	
	my @listDivs = $doc_src->getDocumentElement()->getElementsByTagName("div");
 	foreach my $ldiv ( @listDivs ){
 	
 		$k++;
 		my $li = $doc_but->createElement("li");
		$liste->appendChild($li);
		$li->appendChild(consPoeme($k, $ldiv, $doc_but));
 	}
 	return $div;
}# consListPoemes

sub transformer($$){  # doc_source, doc_but
my($doc_src,  $doc_but) = @_;
	
	my ($body) = ($doc_but->getDocumentElement())->getElementsByTagName("body");
	
	my $en_tete = consEnTete($doc_src, $doc_but);
	$body->appendChild($en_tete);
	my $toc = consTOC($doc_src, $doc_but);
	$body->appendChild($toc);
	my $lp = consListPoemes($doc_src, $doc_but);
	$body->appendChild($lp);
	
	return $doc_but;
}# transformer

sub FranText2Html($$) { # fichier-source, fichier-but
my ($fichIn, $fichOut) = @_;

	my $parseur = XML::DOM::Parser->new();
	my $doc_src = $parseur->parsefile($fichIn);
	
	my $doc_but = transformer($doc_src, consXHtmlDoc());
	
    open(SORTIE,">:utf8", $fichOut);
    print(SORTIE $doc_but->toString());
}#FranText2Html

FranText2Html($ARGV[0], $ARGV[1]);