Module node_to_odt

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

j'ai déposé, sur le site de Drupal.org, une demande de projet pour un module que j'ai développé : http://drupal.org/node/765546

Ce module permet de produire un fichier sous format odt à partir d'un noeud. Il peut exporter des noeuds ayant un contenu en HTML (avec images et tableaux), champs textes cck, cck matrix field (version DRUPAL-6--1-4), cck imceimage.

Afin de l'améliorer, j'attends vos retours.

Forum : 
Version de Drupal : 

Bonjour,
J'aurai une question à propos de ton module. Pourquoi quand tu construit ton fichier au niveau des image tu commence par "</text:p>" et que tu termine par "text:p text:style-name=Standard" ?

PS = je viens de t'envoyer une nouvelle version de ton module par mail puisqu'on ne peut pas attacher de fichier au commentaire.

PS2= quand dans un champs texte on met un caractère comme < cela créer le fichier met il y a une erreur à l'ouverture
De plus, dans la version que je t'ai envoyé si tu teste sur un serveur il peut y avoir des problèmes de caractère. En effet, je supprime le dernier / mais quand il n'y en a pas il supprime le dernier caractère. Cela correspond à la ligne substr($_SERVER['DOCUMENT_ROOT'],0,-1) dans la class OdtEncode . Si erreur remplacer par $_SERVER['DOCUMENT_ROOT']

bonjour,

merci pour le retour.

effectivement j'avais ajouté une fin </text:p> qui est nécessaire pour que l'image soit correctement placée dans le paragraphe. Si cela n'est pas ajouté, le texte qui se trouve avant l'image dans l'HTML est affiché après l'image.

je n'ai pas reçu ton mail.

je vais regarder pour le caractère <. S'agit-il d'un problème pour du texte filtré ou du texte simple ?

Finalement j'ai trouvé pour le caractère < en fait quand tu met dans un champs texte <Bonjour!> lui le traduit comme étant <Bonjour!> et comme dans la fonction "node_to_odt_node_html_encode" tu utilise html_entity_decode cela provoque des soucis car ils sont retraduit < ce qu'open office ne connait pas car pour lui, la valeur associé à "<" et "<"

Sinon autre soucis qu'il y avait et qui est résolu à propos des images je t'avais dis qu'il fallait repasser par le correction d'open office pour afficher le fichier maintenant c'est bon et c'était le truc le plus simple au monde, la version odtPhp était bug à ce niveau. J'ai repris celle du trunk et c'était bon.

Dans ma version j'ai ajouté aussi l'ajout de fichier directement dans l'archive odt, comme ça je perdait rien de mon nœud.

Pour le mail, il s'agit peut être de ta boite qui a bloqué l'archive je vais t'envoyer le lien d'après un espace de stockage. De mon côté, tout marche du coup. Là j'essaye de passer outre le module checkall et d'ajouter directement la fonctionnalité sur l'export de page.

Tu dois trouver cela bizarre mais en fait, il y a un bug quand tu utilise le module checkall, tu n'as plus le label de group et comme j'ai des labels dans chaque groupe qui sont identique cela devient difficile à savoir qui fait partit de quel groupe.
Si tu as une idée pour faire cela, je suis preneuse ...

http://rapidshare.com/files/394788350/node_to_odt.zip.html

Bonjour,

J'ai remodifié le fichier node_to_odt.module car il y avait des problèmes pour afficher le corps du body. Dans cette version en plus quand il s'agit d'un livre, les sous noeud qui possède des fils permettent d'afficher le mode export Livre.
Le texte d'affichage des consignes qui était en anglais ont été mise en française et laissé.

Ce fichier est complémentaire du zip précédent: http://dl.dropbox.com/u/6109437/node_to_odt.module Il suffit de remplacer le fichier qui existe dans le zip pour avoir la même version que chez moi.

Bonjour,

tout d'abord merci pour tes retours.

Pour les en-têtes de groupes qui ne s'affichent pas, c'est parce que je n'avais pas réussi moins non plus à faire en sorte que le module checkall fonctionne correctement avec.

je viens de tester, pour le moment ta version ne marche pas chez moi (je n'obtiens que le titre du nœud).
Si j'ai une image,j'obtiens une erreur 'File Pictures Denied : can't adding path AdvancedOdf.php. Il me semble que la nouvelle variable d'environnement $stockageImage que tu as ajouté dans OdtEncode n'est pas correcte, car justement le répertoire de stockage des fichiers n'est pas forcément celui qui est indiqué (c'est une données configurable).

Effectivement le fichier n'est pas forcément celui là mais moi j'oblige à stocker là en attendant ... Ce sera à modifier bien évidemment.

Sinon j'ai une autre erreur avec cette fois les tableaux. Si avec le champs wisyg j'ai un tableau dont je modifie la taille avec la souris j'ai une erreur dans le content.xml
En l'occurence une balise toto fermante qui n'est pas remplacé et il manque une balise text:p fermante pour Text_body

Pourquoi avoir mis des balises toto et tata ? qu'elle en était le but?

ces balises permettent de remplacer les tableaux HTMl en format odt au fur et à mesure du traitement de chaque tableau. En particulier pour compter le nombre de colonnes et de cellules du tableau, notamment pour les cas où on rowspan ou des colspan pour des lignes ou des colonnes.

pourquoi as-tu supprimé la ligne $var=html_entity_decode($var,ENT_QUOTES,"UTF-8"); dans node_to_odt_html_encode ?

comme je te l'avais expliqué dans mon mail, html_entity_decode transformait les balises < qui était en dur dans le champs "& lt ;" en balise < du coup Open office se retrouvait avec ce caractère alors qu'open office ne connait que "& lt ;"

Pourquoi tu remplace par toto au lieu de compter directement le nombre de balise table ?

une petite question concernant la fonction get_path_file dans OdtEncode.

qu'est que tu veux dire par ta description ? :

/**
  * Function which give the path of image
    * @param path. Le path peut etre le chemin de l'image depuis le serveur ou le path de l'image depuis la page web.
    *@param boolweb est un boolean qui indique true l'image est le lien web et false sinon
    */

Est-ce tu veux dire qu'il y a parfois des liens relatifs, donc des fichiers interne au site (par exemple avec href='sites/default/files/blabla.jpg') et d'autres fois il s'agit de lien menant à un fichier externe au site web ou une image issue d'un autre site web, avec une url complète de type href="http://gjdklfkl.fr./blabla.jpg" ?

Si boolweb est false, ça veut dire que le fichier est présent sur le serveur ?

oui c'est exactement cela, sauf qu'il s'agit de lien web du site et pas d'autre site

Pour information j'ai trouvé un autre petit soucis avec les images quand j'insère 2 images dans un champs wysig avec le module image il permet d'avoir l'image et le titre en gras quand on enregistre et qu'on veut ré-ajouter une image alors on se retrouve à découper le champ au mauvais endroit ce qui construit mal le fichier dans le content.xml

J'espère que les descriptions suffisent à comprendre toutes les modifications si ce n'est pas le cas dis le moi. Comme ça je m'améliorer pour mes futures codes.

En ce qui concerne mon problème avec les tableaux cela est résolu, il y avait un soucis avec ta regexp sur les champs tableau.

En ce qui concerne ta fonction _table_html_encode, le code parait trés compliqué. Je comprend depuis le début pourquoi tu as mis des balises toto et tata mais cela ne fait pas très sérieux selon les propres dires de mes profs. Je pense qu'il y a moyen de changer cela de façon simplifié mais j'aurai quelques questions en ce qui concerne certain morceau du code.

$substring=substr($var,$beginPosition,($endPosition+8)-$beginPosition);

Pourquoi y'a t-il un décalage de 8 ?

$colspanText=substr($replace,$beginPositionColspan,10);

Pourquoi y'a t-il un décalage de 10 ?

Fichier mise à jour avec les 2 autres modif trouvé : http://dl.dropbox.com/u/6109437/node_to_odt.module

J'aurai des questions quand au style qui sont au début du content.xml. Est ce que c'est toi qui le génère ? est ce que tu génère qch dans style.xml?
Si je veux rajouter la prise en compte des couleurs, comment je dois m'y prendre selon toi? Je sais que pour open office il faut avoir qch dans ce style

<style:style style:name="P2" style:family="paragraph" style:parent-style-name="Standard">
<style:text-properties fo:color="#ff0000" fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/>
</style:style>

alors que sous drupal on a :

<span style="color: rgb(255, 0, 0);">&nbsp;coucou</span>

Aurais-tu quelques conseil ou piste de recherche ?

pour bien comprendre ta réponse au niveau des liens : qu'il y a t-il d'écrit au niveau de ton href dans ton code HTML quand ton boolweb est à true ?

concernant le décalage de 8, il s'agit du calcul jusqu'à la fin de la balise .
De même pour le décalage de 10, c'est pour aller jusqu'au chiffre x après le colspan (colspan="x), mais peut-être cela pourrait poser un problème si on a un colspan supérieur à 9.

En ce qui concerne mon problème avec les tableaux cela est résolu, il y avait un soucis avec ta regexp sur les champs tableau. : où est la modification concernant cette regex ?

A chaque fois qu'on veut ajouter des styles particuliers dans le document odt produit (types souligné, gras), on est obligé de modifier le content.xml du base.odt et de recompresser les fichiers pour reconstruire le base.odt. Donc concernant les couleurs de texte, ça me parait assez compliqué puisqu'il n'existe pas de balise spécifique à celà dans le HTML, contrairement au texte souligné ou gras.

D'autre part, tu n'as pas forcément connaissance de la couleur du texte, en général on a ce type d'information dans le style qui s'applique, donc en fonction des ccs, et pas dans un style spécifique dans un span particulier.

Je pensais que les comentaires dans le code source était suffisant alors je vais t'expliquer ce que j'ai remarqué dans mon cas propre. Pour cela repartons de ton code avant que je le modifie :
Dans la fonction _add_images_in_article ou _image_html_encode,  on avait pour $chemin_system des liens du style D://wamp/www/monsite et $path valait qch dans le style http://monsite/image/image1.jpg 
De là, il y a toute une manip pour récupérer les nom des fichier etc ...

Dans les 2 autres fonctions encode_image_filetransfert et encode_text_filetransfert,  j'ai exclusivement $chemin_system = D://wamp/www/monsite et $path D://wamp/www/monsite/image/image1.jpg

Du coup je ne traite pas de la même façon, mais il y a trés peu de différence, soit $path vaut un lien hypertext soit un chemin vers le disque dur, et donc soit mon boolean est à false et je récupére les noms des images, soit il est à vrai et aprés avoir récupérer les noms des images, je reconstruis le path.

C'est une simple histoire d'ordre pour récupérer les informations en faite

Concernant la modification de la regexp :


if (substr_count($var,"<table")>0){
      error_log("il y a un tableau ");
     //if tables
        /
         --------------------------------------------------
         - CFN - Début de MODIFICATION 8
            Correction des tableaux
            --------------------------------------------------
     */
     $regexpTable=array(
            '<\<table(.|\n|\s)
?\>>',
            '<\</table(.|\n|\s)?\>>'
        );
     $match = preg_match  ( $regexpTable[0],$var);
      error_log("le pattern est trouve ".$match." fois");
        $replaceCount=array('<toto>','</toto>');
       $var=preg_replace($regexpTable,$replaceCount,$var);
        /

         --------------------------------------------------
         - CFN - Fin de MODIFICATION 8
          --------------------------------------------------
     */

Normalement j'ai remis à jour le fichier sur dropbox et comme c'était la même URL je les remis la dernière fois ...

Bonjour,

Je viens de poster un commentaire sur le tracker drupal.org, et maintenant je me rends compte qu'il y avait un fil de discussion en français ici... Bref, on y retourne :)

Je voudrais vous présenter un projet qui pourrait vous intéresser : XHTML2ODT : http://gitorious.org/xhtml2odt.

J'ai présenté cette bibliothèque dans un article ici : http://linuxfr.org//2010/04/12/26720.html donc je ne vais pas tout paraphraser, mais je pense qu'elle pourrait très bien convenir à votre plugin pour Drupal.

Elle s'occupe de la conversion (X)HTML vers ODT, mais il manque bien sûr l'intégration à l'application : pages d'admin, paramètres, infrastructure du plugin, traductions, liens et balises dans les modèles de pages, etc. Je ne connais pas Drupal, donc je ne pourrai pas vous aider là-dessus, par contre je serais très content de vous apporter de l'aide sur ma bibliothèque si vous décidiez de l'utiliser.

Voilà, j'espère que je pourrai vous aider dans cette noble tâche qu'est l'export ODT :)

Bonjour,

merci pour votre proposition, je vais regarder si votre projet peut s'intégrer dans le module.
L'aspect concernant les styles parait très intéressant, car actuellement il faut modifier le template odt de base pour intégrer de nouveaux styles.