Artisan Numérique

/bureau/documents/open document/ Transférer les styles des fichiers OpenDocument

Contrairement à certaines idées reçues, OpenDocument, LE format bureautique normalisé et ouvert, n'est en rien lié à OpenOffice. A l'origine OpenOffice utilisait même un système totalement propriétaire. Ce n'est qu'après que le groupe de travail OASIS ait publié l'Open Document Format (aka ODF), et que ce format ait été démocratiquement normalisé contrairement à certains autres, qu'il est apparu en standard dans la célèbre suite libre. Du coup, l'ODF est aussi disponible pour d'autres logiciels (ex. ABIWord) devenant ainsi le format de prédilection pour toute personne ou organisation qui tient un tant soit peu à ce que ses documents ne soient pas liés aux contingences commerciales d'un éditeur.

Mais outre le fait que ce format soit ouvert et normalisé, il est en plus très simple à manipuler. Nous avions déjà vu comment l'exploiter pour ajouter des vignettes à Nautilus, ici l'objectif est de créer un script PERL très simple dont le but est de permettre la recopie du style d'un document vers un autre.

Le besoin

Généralement, lorsque l'on fabrique régulièrement des documents, on finit toujours par avoir une palanquée de modèles. Ces modèles peuvent être un template (ODT) ou plus simplement un document "vierge" qui a été pré-formaté. Avec Nautilus ce type de documents est très facilement utilisable par un click-droit/Créer un document affichant la liste des modèles présents dans le dossier ~/Modèles (cela peut varier d'une distribution à l'autre, le mieux est de regarder dans le fichier ~/.config/user-dirs.dirs).

Jusque là tout va bien et OpenOffice ouvre un nouveau document créé à partir de la recopie du modèle sélectionné. En revanche cela se corse lorsqu'il s'agit de mettre à jour le modèle. En effet, il n'est pas rare qu'au fil de la rédaction d'un document, on ait tellement fait évolué les styles du modèle d'origine que l'on aimerait bien les y replacer. Alors il est certes possible de faire cela à la main par le menu fichiers/Modèles/Gérer mais s'il s'agit de transferer 20 nouveaux styles et d'en mettre à jour une dizaine d'autre, l'exercice n'est pas des plus marrant. L'idée est donc de créer un script qui va littéralement synchroniser les styles du modèle d'origine à partir de ceux d'un document existant.

Le format ODF

L'opération peut sembler complexe mais fort heureusement l'ODF est très bien conçu. N'importe quel fichier ODF est en effet une simple archive ZIP contenant une série des fichiers XML. Et l'un de ces fichiers XML contient l'ensemble des styles du document. Il suffit donc de transférer ce fichier d'une archive à l'autre pour recopier l'ensemble des styles. Il en va de même pour les réglages liés aux documents (par exemple l'affichage ou la couleur de la grille d'une feuille de calcul). Du coup, la recopie de deux simples fichiers va nous permettre de régler notre problème à un détail prés, les images.

En effet, si vos styles utilisent des graphiques comme par exemple pour les fonds de type "bitmap", il va falloir aussi recopier le dossier Pictures de l'archive avec un effet secondaire plus ou moins gênant : la recopie par la même occasion d'images du document d'origine n'ayant rien à voir avec les styles. Dans une première approximation, nous allons nous dire que ce n'est pas bien gênant car ces images, n'étant liées à rien dans le nouveau document, elles seront automatiquement détruites lors de sa sauvegarde. En somme une recopie brutale ne fera au pire qu'augmenter inutilement la taille du modèle. Il serait certes possible de les filtrer intelligemment à partir du fichier XML contenant les styles mais cela rendrait notre script un peu trop compliqué pour un trop faible intérêt.

Mise en oeuvre

Le script qui suit est écrit en perl et il est, je pense, relativement parlant de lui-même. Il s'agit juste de sélectionner le modèle cible dans une liste grâce à Zenity, de décompresser le document source et le modèle dans deux dossiers distincts, de recopier les fichiers styles.xml, settings.xml et le dossier Pictures, puis de recompresser l'ensemble pour écraser le modèle d'origine. Une copie de sauvegarde du modèle est conservée au cas où dans le dossier le dossier temporaire. START_CODEtype="perl" caption="Script de sauvegarder des styles d'un document vers un modèle" source="svn.arnumeral.fr/subversion/public/tools/utilities/ooo-save-style" strip="3-21":END_CODE

Dans ce script, la liste des modèles est récupérée dans le dossier ~/Modèles, libre à vous de changer ce chemin pour les chercher dans un autre dossier. Ensuite il suffit de lier ce script (ln -s ...) dans le dossier ~/.gnome2/nautilus-scripts pour en bénéficier dans Nautilus par un click droit. La procédure get_absolute_path est d'ailleur avant tout là pour rendre ce script compatible avec ce gestionnaire de documents. En revanche, si vous sélectionnez plusieurs documents, seul le premier sera traité.

Il est aussi possible de faire la même chose dans l'autre sens, c'est à dire en recopiant le style d'un modèle sur un ensemble de documents. START_CODEtype="perl" caption="Script d'application d'un style à une ensemble de documents" source="svn.arnumeral.fr/subversion/public/tools/utilities/ooo-apply-style" strip="3-21":END_CODE

Pour ce script là, il sera possible de sélectionner un ensemble de documents. Veillez seulement à ne prendre que des items du type du modèle à appliquer (ex. Traitement de texte, tableur, présentation, etc.).

Conclusion

Ici nous synchronisons nos modèles à partir d'un document, il est aussi possible de faire l'inverse pour "relooker" un document existant en lui appliquant un modèle. Ce sera à peu prés le même code mais en inversant le sens de synchronisation. Les sources de ces deux scripts à jour sont disponibles ici.