Quelques améliorations sur le PDF de PostgreSQL

Maintenant que j'arrive à le générer, j'essaie d'améliorer le rendu et de supprimer les messages d'avertissement qui apparaissent un peu partout.

Tout d'abord, dans les balises contenant des commandes à saisir (<screen>, <literallayout>, <programlisting>, <synopsis>), j'ai une première ligne vide. C'est assez désagréable visuellement principalement parce que c'est très visible : le fond est gris pour le contenu de ces balises. Le problème est dû à l'écriture du XML, en voici un exemple :

<screen>
createdb ma_base
[... etc ...]

La solution est simple : supprimer le retour chariot entre <screen> et la première ligne du contenu. On obtient donc ceci :

<screen>createdb ma_base
[... etc ...]

C'est pas très amusant à faire et c'est très très long. Je ne connais pas de moyen d'automatiser cela... si vous en trouvez un, n'hésitez pas à me prévenir par un petit message dans les commentaires.

J'ai eu aussi un autre problème bien gênant. Une commande ou le résultat d'une commande ne tient pas forcément sur une ligne. Dans le cas des balises décrites précédemment, il n'y a pas de retour à la ligne automatique. J'ai donc commencé par modifier ces commandes manuellement mais j'ai fini par trouver une astuce bien intéressante. En ajoutant

<xsl:attribute-set name="monospace.verbatim.properties">
  <xsl:attribute name="wrap-option">wrap</xsl:attribute>
</xsl:attribute-set>

mon problème n'existe plus. J'ai essayé la deuxième astuce qui permet d'ajouter un caractère indiquant un saut de ligne qui n'aurait pas dû exister mais je n'ai pas réussi à le faire fonctionner. Je tenterai de nouveau plus tard.

Le dernier problème que j'ai concerne les tableaux. Sans indication supplémentaire, FOP crée des colonnes de taille égale. Donc, si vous avez cinq colonnes, quelque soit leur contenu, elles disposeront chacune de 1/5 de la largeur du tableau. Difficilement acceptable. Il suffit d'ajouter une information dans la déclaration du tableau pour que la taille des colonnes soit modifiée. Par exemple, avec

<colspec colnum="1" colname="col1" colwidth="1*"/>
<colspec colnum="2" colname="col2" colwidth="2*"/>
<colspec colnum="3" colname="col3" colwidth="1.5*"/>
<colspec colnum="4" colname="col4" colwidth="1*"/>

La première colonne aura 18% de la largeur du tableau, la deuxième 36, la troisième 27 et la dernière 18.

Cela représente beaucoup de modifications manuelles, de générations, de vérifications... et on recommence :)

Cela étant dit, le résultat est très positif.

Commentaires

1. Le mercredi, avril 26 2006, 13:27 par christophe

Euh, je crois que c'est assez simple ton problème de saut de ligne. Une ébauche que je te laisse compléter ;)

while read line; do
if [ "$line" = "<screen>" ]; then
printf "$line"
read line
fi
printf "$line "
done

Il y a peut-être encore plus simple avec sed, mais bon. Reste à ajouter les autres balises et à savoir traiter le cas où il y a des espaces après la dite balise. Un bon case à la place du if ?

2. Le mercredi, avril 26 2006, 14:08 par Guillaume Lelarge

On va dire que ton script marche à moitié car il réalise bien l'opération demandée mais il me supprime tous les espaces en début et en fin de ligne... un peu chiant. Merci quand même.

Voici la solution avec un simple (façon de parler) script perl : sed -e :a -e '/<screen>$/N; s/<screen> /<screen>/; ta' fichier_avant > fichier_apres
J'explique ce soir le truc (trouvé sur http://sed.sourceforge.net/sedfaq4.html#s4.25).

3. Le mercredi, avril 26 2006, 14:26 par christophe

Oups, désolé. J'en suis tout étonné. Je vais voir si c'est réparable... Et j'attends ton explication avec impatience ;)

4. Le mercredi, avril 26 2006, 14:30 par christophe

OK, j'ai trouvé, il suffit de commencer par modifier l'IFS :
IFS='
'

5. Le mercredi, avril 26 2006, 14:37 par Guillaume Lelarge

Pour que je m'en rappelle...

for fichier in *.sgml
do
        backup=${fichier}.bak
        mv ${fichier} ${backup} && \
        sed \
          -e '/<screen>$/N; s/<screen>
/<screen>/;' \
          -e '/<synopsis>$/N; s/<synopsis>
/<synopsis>/;' \
          -e '/<literallayout>$/N; s/<literallayout>
/<literallayout>/;' \
          -e '/<programlisting>$/N; s/<programlisting>
/<programlisting>/;' \
          ${backup} > ${fichier}
done

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

Fil des commentaires de ce billet