Générer un document Word docx en PHP, comprendre le répertoire word

Bon, promis, c’est le dernier article purement verbeux du dossier avant d’attaquer le code à proprement parler et, tout autant promis, je ne vous ferai pas attendre des plombes avant le prochain numéro. On va aujourd’hui se consacrer au contenu du répertoire word/ qu’on trouve dans un fichier .docx, on va voir ce qui sert à quoi et, notamment, ce qu’on devra par la suite recomposer from scratch (ou non).

Vous détestez le XML ? Passez votre chemin !

C’est le moins qu’on puisse dire; pour le coup, chez Microsoft, ils ont décidé de faire les choses dans les règles (ce qu’ils considèrent être les règles, mais il faut reconnaître que c’est quand même assez propre), ce qui signifie qu’ils ont décidé de séparer dans des fichiers distincts tout ce qui pouvait l’être; on se retrouve ainsi avec pas moins de cinq fichiers xml à la racine de word/ (plus un dans le répertoire theme/, plus un autre dans le répertoire _rels — il a beau avoir une extension .rels, c’est bien un fichier xml), tout ça évidemment par défaut, c’est-à-dire pour notre fichier « Hello World » tout bête (et merci à ceux qui m’ont rétro-suggéré de l’appeler « Hello Word »…les amateurs de calembours se régalent, apparemment).

 document.xml

C’est évidemment le fichier qu’on sera le plus amené à manipuler, puisque c’est celui qui contient le contenu (sic) de notre document. En l’état, il ressemble à ceci :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:mv="urn:schemas-microsoft-com:mac:vml"
            xmlns:mo="http://schemas.microsoft.com/office/mac/office/2008/main"
            xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:o="urn:schemas-microsoft-com:office:office"
            xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
            xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
            xmlns:v="urn:schemas-microsoft-com:vml"
            xmlns:w10="urn:schemas-microsoft-com:office:word"
            xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
            xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml"
            xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
    <w:body>
        <w:p w:rsidR="00636351" w:rsidRDefault="00FD5B61">
            <w:r>
                <w:t>Hello world</w:t>
            </w:r>
        </w:p>
        <w:sectPr w:rsidR="00636351" w:rsidSect="00A13BAE">
            <w:pgSz w:w="11900" w:h="16840"/>
            <w:pgMar w:top="1417" w:right="1417" w:bottom="1417" w:left="1417" w:header="708" w:footer="708" w:gutter="0"/>
            <w:cols w:space="708"/>
        </w:sectPr>
    </w:body>
</w:document>

D’ores et déjà, on peut constater qu’on va vite être gavé par tous ces namespaces, mais rassurez-vous, on va en mettre un bon paquet de côté car on n’a vraiment, mais alors vraiment pas besoin de tous les connaître (math, vml, drawing…).

De toute façon, vous comprendrez vite que les sujets sensibles de ce fichier sont :

  • comment diable Word génère-t-il ses id, et comment pourrons-nous à notre tour en générer ?
  • quelle est donc l’unité de mesure utilisée par les fichiers Word, et pourquoi ?
  • qu’est-ce que c’est que cette structure avec des r, des p, des w, des pgSz, des sectPr, etc. ?

La structure du document

Vous reconnaîtrez certains tags commun à un fichier html correctement formé; on peut décrire la structure ainsi (amusez-vous avec les XSD — si vous les trouvez…bon, c’est cadeau — pour des vrais détails longs et chiants), l’ensemble des tags ici décrits se trouvant dans le namespace w (pour word) :

w:document

L’ensemble du document s’y trouve (c’est l’équivalent du tag <html> en html); on y déclare les namespaces.

w:body

C’est le corps du document, son contenu (équivalent du tag <body> en html).

w:p

C’est un paragraphe (idem en html).

w:r

r pour « [text] run »; Microsoft le définit comme « a discrete section of formatted or unformatted text » (une section discrète [ndlr: au sens mathématique] de texte formaté ou non); c’est l’équivalent d’un <span>.

w:t

Du texte; la différence entre w:r et w:t peut vous sembler floue (à moi aussi, à vrai dire); pour l’instant, notons simplement que w:t est encapsulé dans w:r; nous jouerons ensuite à faire disparaître l’un des deux éléments pour voir ce qu’il advient du document.

w:sectPr

Les propriétés d’une section de document (nous verrons cela en détail; pour l’instant, dans notre exemple, cela correspond aux propriétés du document lui-même, qui ne contient qu’une seule section); on y trouve notamment :

  • w:pgSz : les dimensions de la page (pageSize);
  • w:pgMar : les marges de la page (pageMargins);
  • w:cols : les « définitions de colonne » (on verra ça quand on détaillera les propriétés de section.
Ce qu’on peut constater immédiatement, c’est que les propriétés de section sont dotées de deux identifiants :
<w:sectPr w:rsidR="00636351" w:rsidSect="00A13BAE">
  • rsidR : ID de révision de l’ajout d’une section (sic);
  • rsidSect : ID de révision des propriétés d’une section.
Pour ma part, je retiens que le R de rsidR vaut pour « référence » (ce qui est techniquement faux); en effet, comme vous pouvez le voir, sa valeur est reprise dans le tag w:p
<w:p w:rsidR="00636351" w:rsidDefault="00FD5B61">

Ainsi, ce paragraphe hérite des propriétés décrites dans les propriétés de section (qu’on va désormais appeler sectPr, c’est plus simple) 00636351.

Enfin, notre belle prose se trouve naturellement dans w:t, puisque c’est là que se trouve le texte.

fontTable.xml

 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:fonts xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
    <w:font w:name="Cambria">
        <w:panose1 w:val="02040503050406030204"/>
        <w:charset w:val="00"/>
        <w:family w:val="auto"/>
        <w:pitch w:val="variable"/>
        <w:sig w:usb0="00000003" w:usb1="00000000" w:usb2="00000000" w:usb3="00000000" w:csb0="00000001" w:csb1="00000000"/>
    </w:font>
    <w:font w:name="Times New Roman">
        <w:panose1 w:val="02020603050405020304"/>
        <w:charset w:val="00"/>
        <w:family w:val="auto"/>
        <w:pitch w:val="variable"/>
        <w:sig w:usb0="00000003" w:usb1="00000000" w:usb2="00000000" w:usb3="00000000" w:csb0="00000001" w:csb1="00000000"/>
    </w:font>
    <w:font w:name="Arial">
        <w:panose1 w:val="020B0604020202020204"/>
        <w:charset w:val="00"/>
        <w:family w:val="auto"/>
        <w:pitch w:val="variable"/>
        <w:sig w:usb0="00000003" w:usb1="00000000" w:usb2="00000000" w:usb3="00000000" w:csb0="00000001" w:csb1="00000000"/>
    </w:font>
    <w:font w:name="Calibri">
        <w:panose1 w:val="020F0502020204030204"/>
        <w:charset w:val="00"/>
        <w:family w:val="auto"/>
        <w:pitch w:val="variable"/>
        <w:sig w:usb0="00000003" w:usb1="00000000" w:usb2="00000000" w:usb3="00000000" w:csb0="00000001" w:csb1="00000000"/>
    </w:font>
</w:fonts>

Vous l’avez deviné, on charge ici toutes les polices utilisées par le document (par défaut, il en charge un paquet, vous l’aurez constaté).

J’en profite pour signaler qu’une fenêtre tout à fait innocente, à laquelle on ne fait jamais vraiment attention, de ce type (sous Mac) :

Propriétés du texteEh bien, une telle fenêtre contient un paquet d’informations auxquelles on ne touche pas, mais qui ont une valeur (par exemple, l’espace avant et après un paragraphe); ces valeurs doivent donc être enregistrées en xml, ce qui donne une monstruosité en terme de volume d’information…

Structure du document

Rapidement, la structure de ce fichier :

w:fonts

Ben, c’est là qu’on met nos polices de caractères (font, en anglais; amazing !).

w:font

C’est la structure xml permettant de décrire une police données.

w:panose1

Voilà bien un nom à la con; C’est une information technique décrivant « Pansose-1 Typeface Classification Number » (le numéro du Typeface dans la classification Panose-1 —  plus d’informations à ce sujet sur la page Wikipedia y consacrée, ainsi que sur cette page de documentation).

w:charset

Le charset supporté par la police, et dont la valeur est un ST_UcharHexNumber (comprenez un nombre en héxa, pour faire simple…ben voyons).

w:family

La famille de polices de la police en question (valeur par défaut « auto »…on est pas sorti !).

w:pitch

Le « pitch » (en français…allez savoir…on va dire « largeur », mais vraiment avec des guillemets) correspond au nombre de caractères imprimés sur une largeur d’un pouce (sic); pour les caractères à espacement constant, c’est un nombre (en général, entre 10 et 12), et pour les autres, c’est variable (d’où la valeur « variable »).

w:sig

« Supported Unicode Subranges and Code Pages »…si vraiment ça vous excite, voici un très beau papier sur le sujet; sinon, on peut se contenter d’indiquer que les valeurs données permettent d’identifier une police dans un charset donné, notamment pour pouvoir utiliser une police alternative en cas d’absence de la susdite police…

Ceci conclut pour les fontTable (admettez qu’on a de moins en moins envie de générer du docx, pas vrai ?)

Settings.xml

On peut être tenté de penser qu’il y en a qui se f**tent un peu de notre gueule en créant sur super arborescence pour séparer les méta-données de l’appui des méta-données du document du contenu du document du style du document des polices, etc. pour ensuite nous coller le fichier settings.xml en plein dans le répertoire word/ .

Ce fichier, bien nommé (vous pourrez le constater), déclare ce que, dans le monde d’Adobe, on appelle le Workspace, c’est-à-dire — pour faire simple — les préférences de votre interface et les réglages pour votre document, même si vous ne les avez pas utilisés (par exemple, dire que la décimale est une virgule même si on n’affiche aucun nombre nulle part). Si on était un peu taquin, on pourrait presque appeler ça des méta-données, mais on ne va pas faire les fines bouches (d’autant que notre but n’est pas de créer notre propre standard, mais d’utiliser celui qu’on nous fournit).

Voici donc, proprement inventé, le contenu dudit fichier :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:settings xmlns:o="urn:schemas-microsoft-com:office:office"
            xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
            xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
            xmlns:v="urn:schemas-microsoft-com:vml"
            xmlns:w10="urn:schemas-microsoft-com:office:word"
            xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
            xmlns:sl="http://schemas.openxmlformats.org/schemaLibrary/2006/main">
    <w:zoom w:percent="125"/>
    <w:embedSystemFonts/>
    <w:proofState w:spelling="clean" w:grammar="clean"/>
    <w:doNotTrackMoves/>
    <w:defaultTabStop w:val="708"/>
    <w:hyphenationZone w:val="425"/>
    <w:drawingGridHorizontalSpacing w:val="360"/>
    <w:drawingGridVerticalSpacing w:val="360"/>
    <w:displayHorizontalDrawingGridEvery w:val="0"/>
    <w:displayVerticalDrawingGridEvery w:val="0"/>
    <w:characterSpacingControl w:val="doNotCompress"/>
    <w:savePreviewPicture/>
    <w:compat>
        <w:doNotAutofitConstrainedTables/>
        <w:doNotVertAlignCellWithSp/>
        <w:doNotBreakConstrainedForcedTable/>
        <w:useAnsiKerningPairs/>
        <w:cachedColBalance/>
        <w:splitPgBreakAndParaMark/>
    </w:compat>
    <w:rsids>
        <w:rsidRoot w:val="00FD5B61"/>
        <w:rsid w:val="00FD5B61"/>
    </w:rsids>
    <m:mathPr>
        <m:mathFont m:val="Times New Roman"/>
        <m:brkBin m:val="before"/>
        <m:brkBinSub m:val="--"/>
        <m:smallFrac m:val="off"/>
        <m:dispDef m:val="off"/>
        <m:lMargin m:val="0"/>
        <m:rMargin m:val="0"/>
        <m:wrapRight/>
        <m:intLim m:val="subSup"/>
        <m:naryLim m:val="subSup"/>
    </m:mathPr>
    <w:themeFontLang w:val="fr-FR"/>
    <w:clrSchemeMapping w:bg1="light1" w:t1="dark1" w:bg2="light2" w:t2="dark2" w:accent1="accent1" w:accent2="accent2" w:accent3="accent3"
                        w:accent4="accent4" w:accent5="accent5" w:accent6="accent6" w:hyperlink="hyperlink" w:followedHyperlink="followedHyperlink"/>
    <w:shapeDefaults>
        <o:shapedefaults v:ext="edit" spidmax="1026"/>
        <o:shapelayout v:ext="edit">
            <o:idmap v:ext="edit" data="1"/>
        </o:shapelayout>
    </w:shapeDefaults>
    <w:decimalSymbol w:val=","/>
    <w:listSeparator w:val=";"/>
</w:settings>

Maintenant, on rentre dans le détail, bon appétit.

Structure du document

Je ne reviens pas sur toutes les déclarations de namespaces, on a déjà vu (et on reverra).

On a donc un beau tag w:settings, dans lequel on trouve l’arbo suivante :

w:zoom

C’est le zoom d’affichage du document dans Word (en percent, 100 étant la taille réelle); vous pouvez donc forcer une valeur pour un document donné.

w:embedSystemFonts

Va permettre d’inclure les polices systèmes (système au sens OS, évidemment) dans votre document.

w:proofState

Là, c’est un truc un peu salaud qui dit si votre document est clean niveau orthographe et grammaire; évidemment, clean ne signifie pas, pour MS, que votre document est sans faute; en fait, clean signifie que l’orthographe (w:spelling) et/ou la grammaire (w:grammaire) ont été contrôlées, et dirty qu’elles ne l’ont pas été.

w:doNotTrackMoves

Un nom à double sens…selon vous, cela signifie-t-il « ne pas enregistrer le suivi des modifications » ou bien « ne pas modifier les anciennes versions suivies » ? Ni l’un ni l’autre; il s’agit simplement de ne pas enregistrer des déplacements dans le texte en tant que tel (pour des raisons de rétro-compatibilité), mais plutôt comme une suppression à un endroit et un ajout à un autre; ce tag dispose d’un attribut w:val de type CT_OnOff qui, comme son nom l’indique, est un switch et dont les valeurs possibles sont, comme son nom de l’indique pas, true ou false (ou bien 1 ou 0, voire finalement On ou Off…).

w:defaultTabStop

Je ne peux pas résister à l’envie de vous donner la définition de Microsoft : « Intervalle (en points) entre les taquets de tabulation par défaut dans le document »; les « taquets de tabulation », je trouve que ça claque; vous avez compris l’idée : c’est l’espace (en points) qui sépare deux points de tabulation.

w:hyphenationZone

Pour rappel, hyphen est, en anglais, le trait d’union ou, comme l’appellent les opérateurs de tous les services clients, le « tiret du 6″ (et tant pis pour vous si vous avez un clavier Mac); l’idée est de déterminer jusqu’à quelle distance de la marge de droite (lorsqu’on écrit de gauche à droite, cela va sans dire) on peut couper un mot en deux, avec l’aide de notre ami le « tiret du 6″; cette distance, évidemment, n’est pas donnée en points, pour ne pas faire comme son petit camarade le defaultTabStop; Cette distance est donnée en vingtièmes (j’ai bien dit « vingtièmes ») de points, mais rassurez-vous, c’est très simple et très normal en fait : il vous suffit de savoir que 1440 vingtièmes de points font un pouce (1 inch)…pratique, non ?

w:drawingGridHorizontalSpacing

Tout de suite, no suspens, oui c’est également en vingtièmes de points, et oui on aura bientôt droit au même en vertical; il s’agit du maillage horizontal d’une grille invisible sur laquelle on va pouvoir positionner des éléments flottants (telles des zones de texte, par exemple).

w:drawingGridVerticalSpacing

La même chose, mais il s’agit ici du maillage vertical; et oui, vous vous demandez pourquoi ne pas mettre les deux propriétés en une, qu’on aurait par exemple appelée drawingGridSpacing; moi aussi, je me suis déjà posé cette question…

w:characterSpacingControl

Définit les caractères qui peuvent être compressés (on parle ici de compression d’affichage, en largeur); par exemple, doNotCompress signifie qu’il ne faut pas compresser de caractères, tandis que compressPunctuation signifie qu’on peut compresser les caractères de ponctuation (il s’agit uniquement de réduire les espaces au sein des caractères, pas de déformer les caractères eux-mêmes)…on ne pense pas à toutes ces choses, quand on fait son CV dans Word, pas vrai ?

w:savePreviewPicture

Enfin un que je ne commente pas (juste pour dire que la valeur est un switch, comme pour doNotTrackMoves).

w:compat

Les réglages de compatibilité (il s’agit principalement de compatibilité d’affichage entre les différentes applications, et pas de rétro-compatibilité entre les différentes versions); les voici :

  • w:doNotAutofitConstrainedTables : tout de suite, un bel exemple sur cette doc; le principe, pour faire simple, est de déterminer si une table qui a normalement une largeur donnée peut être automatiquement réduite si elle rencontre une zone flottante qui la gêne, ou bien si elle doit être intégralement déplacée en-dessous (rappelez-vous comme vous avez pu galérer en CSS, à une époque, avec les float, les display et les clear…on est sur le même genre de problématiques); et bien sûr, comme à son habitude, c’est un switch sur une condition négative, donc vous mettez true pour ne pas resizer;
  • w:doNotVertAlignCellWithSp : tiens, MS se met à abbrévier, maintenant…c’était trop simple jusqu’alors, c’est ça ? Celui-là, son rôle, c’est de déterminer si oui ou non on peut aligner verticalement des cellules lorsque celles-ci contiennent des éléments flottants (le « Sp » à la fin, c’est pour shape; si vous pensiez que c’était pour space, je suis comme vous…confus); pour mieux comprendre;
  • w:useAnsiKerningPairs : ce coup-ci on n’est plus en négation; il s’agit de savoir si on applique ou pas les « Kerning pairs »; c’est un truc de typographie qui s’appelle en bon français le crénage; tapez kerning pair dans google images et vous verrez immédiatement de quoi il s’agit; l’idée simple : si vous écrivez les lettres A et V, le bas du A à droite va-t-il empiéter verticalement sur le même espace que le haut du V à gauche ?
  • w:cachedColBalance : authentique ! Cette propriété détermine si WordProcessing devrait ou non calculer incorrectement la hauteur d’un paragraphe dans le but d’équilibrer les hauteurs de colonnes (lorsqu’on écrit sur plusieurs colonnes, cela va sans dire); le rapport avec cached, si quelqu’un l’a trouvé, je suis preneur;
  • w:splitPgBreakAndParaMark : ça a l’air d’un truc de ouf…Pour info, l’appréviation signifie « Split Page Break And Paragraph Mark »; il s’agit de dire si un saut de page au sein d’un paragraphe marque la fin du paragraphe ou non; ce qui est drôle, c’est que, même une fois qu’on a dit ça, on ne sait pas exactement quel switch produit quel effet; si vous mettez la valeur à true, WordProcessing considèrera qu’il doit différencier (c’est dans ce sens qu’il faut comprendre le salit) le saut de page de la fin du paragraphe; ainsi, le contenu restant dans le paragraphe après le saut de page apparaîtra…après le saut de page; ce n’est pas clair, je sais, mais que voulez-vous que je vous dise ? Ce n’est pas clair !
w:rsids

Enregistre les ID de chaque version sauvegardée (ou révision) du document; il contient donc naturellement des tags w:rsid, ainsi qu’un tag w:rsidRoot qui est l’id de la v1, si on veut.

w:mathPr

Les propriétés des textes mathématiques (vous vous rappelez qu’on a un namespace « math » déclaré m?); voici le contenu :

  • m:mathFont : police mathématique (comprenez : police utilisée pour les maths);
  • m:brkBin : Break Binary détermine où scinder un opérateur binaire lorsqu’il est en fin de ligne; les valeurs possibles sont before, after et repeat; Attention, pour le coup, lorsqu’on parle d’opérateur binaire, ce n’est pas au sens 0/1 qu’on connaît bien en informatique, mais au sens mathématique d’un opérateur qui possède deux opérandes (par exemple l’addition ou la soustraction, par opposition aux opérateurs unaires ou unitaires tels que la racine carrée);
  • m:brkBinSub : Break Binary Substraction semble être une redite du précédent, mais pour la soustraction, vrai ? faux ! enfin…presque ! Dans le cas où la propriété précédente a été mise à repeat (et donc qu’elle répète l’opérateur en fin de ligne et en début de ligne suivante), on peut déterminer ce que WordProcessing doit précisément faire pour les soustractions (car doubler un moins change le sens d’une opération : 3 – 3 != 3 – -3); du coup, la valeur de cette propriété est composée de deux caractères, le premier qui s’affiche en fin de ligne et le second en début de ligne suivante);
  • m:smallFrac : les fractions doivent-elles s’afficher de façon réduite ? J’ai lu ça, je me suis dit « génial ! Word réduit les fractions ! »; en fait, il s’agit de réduction d’affichage uniquement;
  • m:dispDef : « Use Display Math Defaults » indique au document d’écraser les propriétés des paragraphes pour ce qui concerne les textes mathématiques (pour éviter les conflits…c’est un genre de peace-maker);
  • m:lMargin : la marge à gauche pour ce qui concerne les maths; elle est évidemment spécifiée en vingtièmes de pouces (ou twips, comme on les appelle affectueusement);
  • m:rMargin : la même chose à droite;
  • m:wrapRight : détermine la justification à droite d’un texte mathématique wrappé; si cette propriété est spécifiée, le texte continuera à la ligne suivante aligné à droite; dans le cas contraire, comme pour le texte normal, il repassera à gauche;
  • m:intLim : Integral Limit Locations; là, on arrive dans du vraiment spécifique; l’idée est de déterminer, lorsqu’on affiche le calcul d’une intégrale, si on affiche les limites de cette intégrale en-dessous et au-dessus du signe de l’intégrale, ou si on les place à droite de ce signe; les différentes valeurs possibles sont undOvr et subSup (celle-ci par défaut);
  • m:naryLim : N-ary Limit Locations; pareil que pour les intégrales, mais pour les limites n-aires autres que les intégrales…bon, je vous avoue que j’atteins les limites de ma propre mémoire mathématique, alors si vous savez ce à quoi ça correspond, que dieu vous garde;
w:themeFontLang

C’est la langue de la police du thème utilisé…Ce que cela signifie, pour faire simple, c’est qu’on indiquera ici si des alphabets particuliers doivent être utilisés (chinois, hébreu, arabe…des alphabets particuliers pour nous, s’entend) en indiquant la langue de la police du thème. Pour une information plus précise, toujours la référence MSDN.

w:clrSchemeMapping

Color Scheme Mapping, c’est la déclaration du mapping de couleurs entre le thème et le document (le thème va définir des couleurs-noms, tels que background ou accent1, par exemple, et le mapping va indiquer la couleur correspondante. On y trouve les attributs suivants, par défaut :

  • w:bg1 et w:bg2 : des couleurs pour les fonds (background);
  • w:t1 et w:t2 : des couleurs pour les textes;
  • w:accent1, jusqu’à w:accent6 : des couleurs pour un type générique appelé accent;
  • w:hyperlink : une couleur pour les liens;
  • w:followedHyperlink: une couleur pour les liens visités (si omise, celle des liens).
w:shapeDefaults
Les propriétés par défaut des formes (chapes), c’est-à-dire des objets flottants dans le document (le contenu est sur le namespace o, pour Office; on est ici sur des propriétés communes à toutes les applis Office). On y trouve :
  • o:shapeDefaults : c’est le même nom, mais pas le même namespace;  on  va y stocker des infos telles que couleur, épaisseur de trait, etc. Par défaut, dans notre fichier, on trouve v:ext (namespace v pour VML) qui indique à WordProcessing comment traiter les extensions VML qui ne seraient pas disponible dans le core dont il dispose, et on trouve aussi spidmax (Shape ID Max) qui est un ID optionnel dans lequel on va enregistrer le plus gros ID de forme mise dans le document (on pourra ainsi, par exemple, recharger les dernières propriétés quand on crée un nouveau shape);
  • o:shapelayout : la disposition d’un shape dans le document; on pourra y retrouver des tags o:idmap (Shape ID Map), o:regrouptable ou encore o:rules.
w:decimalSymbol

Facile, quel caractère utiliser comme décimale (par défaut, en français, la virgule).

w:listSeparator

Facile, quel caractère utiliser comme séparateur dans une liste (avec des tirets); par défaut, en bon français, c’est un point-virgule.

J’ai mal à la tête…quand est-ce qu’on arrive ?

J’avais prévu de finir l’ensemble du répertoire dans cet article, mais je pense qu’il est suffisamment gavant comme cela. Dans le prochain numéro, nous finirons donc cette infâme dissection avec styles.xml, webSettings.xml, theme/theme1.xml et _rels/document.xml.rels (on s’intéressera au passage à [racine]/_rels/.rels qui est caché, mais qui est bien là); Une fois cela fait, c’est promis, on rentrera enfin dans le code…enfin…la conception du code, en tout cas.

Étape précédente : Comprendre le format .docx

Étape suivante : En finir avec le répertoire word/ et attaquer la conception

Les commentaires sont fermés.