INaLCO - M2 Traductique
Cours XML 2011-2012
Contrôle sur machine du 7 mars 2012 : prolongement vers
le traitement de textes en vers.
- But de l'exercice
- Pourquoi restructurer ?
- Structure-cible de la restructuration
- Comment restructurer ?
- Première étape : masquer les
balises <hi>
- Deuxième étape, délimiter les
lignes (alias vers).
- Troisième étape, restaurer les
balises <hi> et supprimer le saut de ligne
en début de vers
- Architecture de l'ensemble
-
On part des réalisations décrites dans le corrigé.
Ces programmes traitent correctement des textes en prose, mais pour des
vers ils sont inadaptés.
En effet, dans les fichiers Frantext, les vers sont traités comme des
lignes ordinaires, marqués seulement par un <lb />
final.
La politique mise en œuvre, qui consiste à "oublier" cette balise
et à confier la gestion des lignes au moteur de rendu, est donc
désastreuse.
On se propose d'étudier une autre politique mieux adaptée à
l'impression de textes en vers.
Voici un exemple de texte-source
(extrait des Odes funambulesques
de Théodore de Banville) et le
résultat obtenu.
Attention !
Cet extrait soigneusement choisi ne fait pas apparaître une quantité de situations qui échappent à notre technique,
comme on le voit aisément en parcourant le fichier complet.
Il y aurait beaucoup à faire pour obtenir une impression saisfaisante du texte tout entier.
On trouvera d'autres sources auquelles appliquer notre technique dans les fichiers Frantext :
L938.xml
[Œuvres poétiques de Marceline Desbordes-Valmore]
M457.xml
[Messéniennes de Casimir Delavigne]
et bien d'autres, mais pas tous les recueils de vers de Frantext !
Par exemple les Odes d'André Chénier (M674.xml)
sont subdivisées en strophes numérotées
pour lesquelles il faudra adapter notre transformation.
Comme on va le voir, notre proposition s'organise en deux étapes :
- Restructuration du document Frantext
- Impression du document restructuré via une feuille de style
très
proche de celles que nous avons vues précédemment.
-
- La nécessité de restructurer vient du désordre dans la
représentation
des vers chez Frantext :
- voici quelques vers "normaux" (d'un pastiche de la Ballade des dames du temps jadis) :
dites-moi sur quel Sinaï<lb/>
ou dans quelle manufacture<lb/>
est le critique Dufaï ?<lb/>
Où ? Sur quelle maculature<lb/>
Lalanne met-il sa rature ?<lb/>
- et voici les suivants :
Où sont les plâtres de Dantan,<lb/>
<hi rend="I"> le globe </hi> et <hi
rend="I"> la
caricature ? </hi><lb/>
mais où sont les neiges d'antan ?<lb/>
- Comme on le voit, notre seul moyen d'appréhender un vers est
de le
prendre comme un contenu textuel entre deux balises
<lb/>
,
capturé par l'expression XPath "text()"
.
Par exemple, nous pouvons isoler les vers "normaux" ci-dessus dans des fo:block
s
avec une règle
<xsl:template match="text()">
<fo:block><xsl:value-of
select="."
/></fo:block>
</xsl:template>
Mais cette technique va échouer sur les vers contenant des mots en
italiques !
Notre exemple va se scinder en trois blocks :
<fo:block>
le globe </fo:block><fo:block>
et </fo:block><fo:block> la
caricature ? </fo:block>
- Comme c'est là notre seul moyen d'action, nous sommes
conduits à
contourner l'obstacle par un prétraitement
qui va transformer les balises <hi>
en des marques "transparentes", comme
XXX le globe YYY
et XXX la
caricature ? YYY<lb/>
marques qui seront ensuite reconverties pour la suite du traitement.
- Dans le même mouvement, on note que les dates de composition
des poèmes figurent comme des pseudo-vers en italiques,
placés en fin de paragraphe :
mais où sont les neiges d'antan ?<lb/>
<hi rend="I"> novembre 1856 : </hi></p>
</div>
Clairement, il s'agit là d'un autre type de données, à distinguer par
une balise spécifique en vue d'un traitement particulier.
-
- Afin d'apporter un minimum de changement aux feuilles de
style
développées précédemment pour la génération du pdf,
nous visons une structure comme celle-ci :
<div>
<head>BALLADE
CÉLÉBRITÉS TEMPS JADIS</head>
<pb n="249"/>
<p>
<ligne>dites-moi sur quel
Sinaï</ligne>
<ligne>ou
dans quelle manufacture</ligne>
<ligne>est
le critique Dufaï ?</ligne>
<ligne>Où
? Sur quelle maculature</ligne>
<ligne>Lalanne met-il sa rature
?</ligne>
<ligne>Où
sont les plâtres de Dantan,</ligne>
<ligne><hi
rend="I"> le globe </hi> et
<hi rend="I">
la caricature ? </hi></ligne>
<ligne>mais où sont les neiges
d'antan ?</ligne>
<ligne>Où
Venet, par le sort trahi,</ligne>
<ligne>a-t-il trouvé sa sépulture
?</ligne>
<ligne>Mirecourt s'est-il fait
spahi ?</ligne>
<ligne>Mantz a-t-il une préfecture
?</ligne>
<ligne>Où
sont les habits sans couture,</ligne>
<ligne>et
Malitourne et Pelletan ?</ligne>
<pb
n="250"/>
<ligne>Où
sont Clesinger et Couture ?</ligne>
<ligne>Où
sont Rolle des dieux haï,</ligne>
<ligne>Bataille, plus beau que
nature,</ligne>
<ligne>Cochinat, qui fut
envahi</ligne>
<ligne>tout vif, par la même
teinture</ligne>
<ligne>que
jadis Toussaint-Louverture,</ligne>
<ligne>et
ce Rhéal qui mit Dante en</ligne>
<ligne>français de maître
d'écriture ?</ligne>
<ligne><hi
rend="I"> envoi : </hi></ligne>
<ligne>ami, quelle déconfiture
!</ligne>
<ligne>Tout s'en va, marchands
d'orviétan</ligne>
<ligne>et
marchands de littérature :</ligne>
<ligne>mais où sont les neiges
d'antan ?</ligne>
<date>
novembre 1856 : </date>
</p>
</div>
- Pour engendrer le pdf à partir de cette structure,
l'adaptation des feuilles de style du corrigé est immédiate :
il suffit d'ajouter deux règles
<xsl:template match="ligne">
<fo:block><xsl:apply-templates
/></fo:block>
</xsl:template>
où apply-templates
est nécessaire pour traiter les
italiques.
- et, par exemple,
<xsl:template match="date">
<fo:block font-style="italic" space-before="10pt"
space-after="16pt">
<xsl:value-of
select="." />
</fo:block>
</xsl:template>
Voyez l'adaptation de la dernière feuille de style du corrigé : Frantext2FO-3b.xsl,
qui a été utilisée pour donner le résultat montré plus haut.
-
Plusieurs voies sont possibles.
La technique présentée en cours le 22 mars utilise un script Perl qui
marie expressions régulières et appel à une transformation XSLT
auxiliaire.
Malgré ses inconvénients (génération de deux fichiers intermédiaires),
nous la conservons ici.
La critiquer et en proposer une meilleure, voila un excellent exercice
d'application !
-
Le contenu du fichier étant supposé logé dans une variable
$txt
,
on procède en deux temps :
- d'abord traiter les dates, caractérisées par leur
position en fin de paragraphe.
my $erd = '<hi
rend=\"I\">(.*? \d{4} : )<\/hi><\/p>';
$txt =~
s/$erd/<date>$1<\/date><\/p>/g;
- ensuite les italiques ordinaires
my $eri = '<hi
rend=\"I\">(.*?)<\/hi>';
$txt =~ s/$eri/XXX$1YYY/g;
- Échantillon du résultat :
<div>
<head>BALLADE CÉLÉBRITÉS TEMPS JADIS</head>
<pb n="249"/>
<p>dites-moi sur quel Sinaï<lb/>
ou dans quelle manufacture<lb/>
est le critique Dufaï ?<lb/>
Où ? Sur quelle maculature<lb/>
Lalanne met-il sa rature ?<lb/>
Où sont les plâtres de Dantan,<lb/>
XXX le globe YYY
et XXX la caricature ? YYY<lb/>
mais où sont les neiges d'antan ?<lb/>
Où Venet, par le sort trahi,<lb/>
a-t-il trouvé sa sépulture ?<lb/>
Mirecourt s'est-il fait spahi ?<lb/>
Mantz a-t-il une préfecture ?<lb/>
Où sont les habits sans couture,<lb/>
et Malitourne et Pelletan ?<pb n="250"/>
Où sont Clesinger et Couture ?<lb/>
Où sont Rolle des dieux haï,<lb/>
Bataille, plus beau que nature,<lb/>
Cochinat, qui fut envahi<lb/>
tout vif, par la même teinture<lb/>
que jadis Toussaint-Louverture,<lb/>
et ce Rhéal qui mit Dante en<lb/>
français de maître d'écriture ?<lb/>
XXX envoi : YYY<lb/>
ami, quelle déconfiture !<lb/>
Tout s'en va, marchands d'orviétan<lb/>
et marchands de littérature :<lb/>
mais où sont les neiges d'antan ?<lb/>
<date> novembre 1856 : </date></p>
</div>
-
- On reprend l'idée de la règle XSLT sur l'élément XPath "
text()
".
On l'orchestre dans une transformation qui reproduit sans changement
tout le document,
sauf les contenus textuels à l'intérieur des paragraphes <p>
qui sont placés à l'intérieur des balises <ligne>
.
Pour suire le détail du code, voyez la section " recopie d'un sous-arbre" du cours XSLT.
Feuile de style complète : lignes.xsl
<xsl:template match="/">
<TEI>
<xsl:copy-of
select="TEI/teiHeader" />
<text><body>
<xsl:apply-templates select="TEI/text/body" />
</body></text>
</TEI>
</xsl:template>
<xsl:template match="div|p">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="head|pb|date">
<xsl:copy-of select = "." />
</xsl:template>
<xsl:template match="p/text()">
<ligne><xsl:value-of select="."
/></ligne>
</xsl:template>
- Échantillon du résultat :
<div>
<head>BALLADE
CÉLÉBRITÉS TEMPS JADIS</head>
<pb n="249"/>
<p>
<ligne>dites-moi sur quel Sinaï</ligne>
<ligne>
ou dans quelle manufacture</ligne>
<ligne>
est le critique Dufaï ?</ligne>
<ligne>
Où ? Sur quelle maculature</ligne>
<ligne>
Lalanne met-il sa rature ?</ligne>
<ligne>
Où sont les plâtres de Dantan,</ligne>
<ligne>
XXX le globe YYY et XXX la caricature ? YYY</ligne>
<ligne>
mais où sont les neiges d'antan ?</ligne>
<ligne>
Où Venet, par le sort trahi,</ligne>
<ligne>
a-t-il trouvé sa sépulture ?</ligne>
<ligne>
Mirecourt s'est-il fait spahi ?</ligne>
<ligne>
Mantz a-t-il une préfecture ?</ligne>
<ligne>
Où sont les habits sans couture,</ligne>
<ligne>
et Malitourne et Pelletan ?</ligne>
<pb
n="250"/>
<ligne>
Où sont Clesinger et Couture ?</ligne>
<ligne>
Où sont Rolle des dieux haï,</ligne>
<ligne>
Bataille, plus beau que nature,</ligne>
<ligne>
Cochinat, qui fut envahi</ligne>
<ligne>
tout vif, par la même teinture</ligne>
<ligne>
que jadis Toussaint-Louverture,</ligne>
<ligne>
et ce Rhéal qui mit Dante en</ligne>
<ligne>
français de maître d'écriture ?</ligne>
<ligne>
XXX envoi : YYY</ligne>
<ligne>
ami, quelle déconfiture !</ligne>
<ligne>
Tout s'en va, marchands d'orviétan</ligne>
<ligne>
et marchands de littérature :</ligne>
<ligne>
mais où sont les neiges d'antan ?</ligne>
<date>
novembre 1856 : </date>
</p>
</div>
-
- pour les balises, transformation inverse :
my $eri = 'XXX(.*?)YYY';
$txt =~ s/$eri/<hi rend=\"I\">$1<\/hi>/g;
- pour les sauts de ligne, une autre expression régulière :
my $erl =
'<ligne>\n(.*?)<\/ligne>';
$txt =~ s/$erl/<ligne>$1<\/ligne>/g;
- voir le résultat à la section précédente.
-
Pour ne pas entrer dans les complexités de la mise en œuvre de XSLT par
Perl,
on conserve l'exécution des feuilles de style pas xsltproc
,
au moyen d'une ligne de commande entre backquotes,
comme dans le Projet Shakespeare évoqué en cours le 9
février.
Ceci nous oblige à produire deux fichiers intermédiaires en plus du
fichier-source et du fichier restructuré.
- celui du résultat de la première étape, pour être
transformé par la deuxième étape ;
- celui du résultat de la deuxième étape, produit par la commande
`xsltproc
lignes.xsl...`
.
Le script expérimental restruct.pl
prend donc comme arguments quatre (4) noms de fichiers :
fichier-source, intermédiaire-1, intermédiaire-2, fichier restructuré.