INaLCO - M2 Traductique

Cours XML 2011-2012

Jean-François Perrot

Contrôle sur machine du 7 mars 2012 : prolongement vers
le traitement de textes en vers.

  1. But de l'exercice

  2. Pourquoi restructurer ?

  3. Structure-cible de la restructuration

  4. Comment restructurer ?
    1. Première étape : masquer les balises <hi>
    2. Deuxième étape, délimiter les lignes (alias vers).
    3. Troisième étape, restaurer les balises <hi> et supprimer le saut de ligne en début de vers
    4. Architecture de l'ensemble

  1. But de l'exercice

    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 :
    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 :
    1. Restructuration du document Frantext
    2. Impression du document restructuré via une feuille de style très proche de celles que nous avons vues précédemment.

  2. Pourquoi restructurer ?

    1. 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/>


    2. 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:blocks 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>

    3. 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.

    4. 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.

  3. Structure-cible de la restructuration

    1. 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>


    2. 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>

        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.
  4. Comment restructurer ?

    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 !
    1. Première étape : masquer les balises <hi>

      Le contenu du fichier étant supposé logé dans une variable $txt, on procède en deux temps :

      1. 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;


      2. ensuite les italiques ordinaires
            my $eri = '<hi rend=\"I\">(.*?)<\/hi>';
            $txt =~ s/$eri/XXX$1YYY/g;


      3. É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>

    2. Deuxième étape, délimiter les lignes (alias vers).

      1. 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>


      2. É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>


    3. Troisième étape, restaurer les balises <hi> et supprimer le saut de ligne en début de vers

      • 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.

    4. Architecture de l'ensemble

      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é.
      1. celui du résultat de la première étape, pour être transformé par la deuxième étape ;
      2. 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é.