[XML:Twig et ODF::lpOD] Conversion XML en ODT
Bonjour,
J'ai un petit souci car je ne trouve pas la solution.
J'ai un fichier XML de teste qui ressemble à ça :
Code:
1 2 3 4 5
| <?xml version="1.0" encoding="ISO-8859-1"?>
<paragraph>
Ce tutoriel Perl a pour but de vous expliquer en quelques lignes comment concevoir un plugin <b>Nagios</b> respectant les
normes <b>Nagios</b> avec <b>Perl</b>.<br/>
</paragraph> |
Je souhaiterais le convertir en fichier OpenOffice odt et le contenu du fichier devrait être formaté et donné le résultat suivant :
Citation:
Ce tutoriel Perl a pour but de vous expliquer en quelques lignes comment concevoir un plugin Nagios respectant les normes Nagios avec Perl
Mon but est d'utiliser le module XML:Twig et ODF::lpOD, mais je coince pour le formatage du texte en gras. Si quelqu'un a une idée, je suis preneur :aie:.
Voici un exemple de programme, mais je ne sais pas comment appliquer le gras.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #!/usr/bin/perl
use warnings;
use strict;
use ODF::lpOD;
use XML::Twig;
# Création virtuelle du fichier odt
my $doc = ODF::lpOD::Document->create('text');
my $contexte = $doc->get_body;
my $twig = new XML::Twig(
Twig_handlers => {
'paragraph' => \&xml_paragraph,
'b' => \&xml_style,
},
);
# Création d'un objet twig
$twig->parsefile('test.xml');
# Sauvegarde du document
$doc->save( target => 'test.odt' );
system ('test.odt');
sub xml_paragraph {
my ( $twig, $twig_paragraph ) = @_;
my $paragraphe = odf_paragraph->create( text => $twig_paragraph->text, );
$contexte->insert_element($paragraphe);
return;
}
sub xml_style {
my ( $twig, $twig_style ) = @_;
my $style = $twig_style->name;
my $texte = $twig_style->text;
return;
} |
Styles de textes avec ODF::lpOD
Au départ ODF::lpOD a été conçu pour permettre à des développeurs ne voulant pas voir le XML d'exploiter et de modifier des données dans des documents. Son utilisation pour faire de la conversion relève déjà d'un usage avancé mais elle est parfaitement possible.
Deux lectures préalables s'imposent:
1) La section "Styles de texte" du tutoriel;
2) La section "Creating and using a text style" dans le tutoriel (en Anglais) de la distribution CPAN.
On y voit très concrètement comment créer et mettre en oeuvre un style de texte. Dans le cas qui nous occupe (plus simple que les exemples du tuto) il suffit d'utiliser un paramètre "weight" avec la valeur "bold" dans la création du style de texte (via odf_style->create) pour spécifier des caractères gras.
À part cela, pour convertir un élément XML <paragraph> en un paragraphe ODF réglementaire, la méthode la plus expéditive consiste d'abord à lui affecter le tag "text:p" (défini par la norme ODF pour les paragraphes) et ensuite à changer sa classe en ODF::lpOD::Paragraph (abrégé en odf_paragraph). On peut le faire de la manière suivante dans le handler (en supposant que $p est l'élément <paragraph> courant):
Code:
1 2 3
|
$p->set_tag('text:p');
bless $p, odf_paragraph; |
Optionnellement on peut ensuite affecter un style de paragraphe (via $p->set_style) sauf si le style de paragraphe par défaut convient.
Pour les éléments <b>, on peut procéder de manière analogue mais cette fois il s'agit de leur affecter le tag 'text:span' et la classe odf_text_element. Et bien sûr il faut impérativement affecter à chacun le style de texte en caractères gras qu'on a défini par ailleurs (supposons que ce style s'appelle "Gras" et que l'élément <b> courant est $e):
Code:
1 2 3 4
|
$e->set_tag('text:span');
bless $e, odf_text_element;
$e->set_style("Gras"); |
Remarque: Il est inutile de coder explicitement "use XML::Twig" car XML::Twig est chargé avec ODF::lpOD (cf. liste des dépendances dans INSTALL). Quant a ODF::lpOD::Style, inutile de l'invoquer car tous les sous-modules de ODF::lpOD sont chargés par un simple "use ODF::lpOD".
Styles de textes avec ODF::lpOD (suite)
Autre remarque: l'usage de insert_element($paragraphe) sans paramètre de position fait que chaque nouveau paragraphe est inséré en première position dans le texte. Donc dans le document résultant l'ordre des paragraphes sera inversé. Pour éviter cela il vaut mieux utiliser append_element($paragraphe) qui place les paragraphes à la suite.
insert_element() est destiné à insérer quelque chose soit au début du contexte, soit quelque part avant ou après un élément donné.
ODF::lpOD pour les conversions
Citation:
Envoyé par
djibril
Ok.
Mais comment connaitre tous les noms des balises telles text:span, text:p, etc. ?
C'est le problème, justement, quand on doit utiliser ODF::lpOD pour faire de la conversion à partir de sources non ODF. Une fois qu'on est en ODF on peut oublier les tags mais si on l'utilise pour faire de la conversion vers ODF, on passe à un autre niveau d'utilisation.
Cela dit, dans ce cas de figure on n'a que deux tags (et deux classes ODF) à connaître, soit 'text:p' et 'text:span'. On pourrait aussi avoir besoin de 'text:h' (qui représente les titres) si on devait traité des sources contenant du texte hiérarchisé.
La situation serait franchement plus compliquée s'il fallait convertir en styles ODF des styles définis dans un autre langage (ex: CSS). Là il y aurait potentiellement des dizaines de tags et d'attributs à gérer.
Position des textes en caractères gras
Citation:
Envoyé par
Philou67430
Pour la position dans le paragraphe, ne peux-tu pas utiliser les méthodes XML::Twig current_line, current_column, current_byte ou current_position_in_context ? (je dis ça, mais je n'ai jamais utilisé XML::Twig... je galère même à l'installer).
Pas la peine. Les éléments ODF stylés en caractères gras sont justement les éléments <b> déjà en place. Il n'y a donc pas à rechercher leur position. Chaque élément <b> doit être "re-tagué" sur place en <text:span> et transformé par bless en objet odf_text_element, de manière à posséder la méthode set_style() permettant de lui affecter un style de texte.
En reprenant le code de Djibril, je réécrirais la fonction xml_style (qui en fait ne traite pas un style mais un segment de texte) de la manière suivante:
Code:
1 2 3 4 5 6 7 8 9 10
|
sub xml_style {
my ( $twig, $element ) = @_;
$element->set_tag('text:span');
bless $element, odf_text_element;
$element->set_style("Gras");
return;
} |
Le style de texte "Gras" est lui-même très facile à créer (par exemple à la fin du programme), de la manière suivante:
Code:
1 2 3 4
|
$doc->insert_style(
odf_style->create('text', name => "Gras", weight => "bold")
); |