(FR) Introdution au Format de fichier SLA pour Scribus 1.4

From Scribus Wiki
Jump to: navigation, search

Format XML des fichiers SLA

Afin de générer des fichiers SLA dans un programme PHP, j'ai étudié le format SLA de Scribus. Voici les notes qui m'ont permis d'aboutir au résultat voulu. Elles ne portent que sur les éléments qui m'ont été utiles pour ce projet, et ne prétend aucunement à l'exhaustivité. La page File_Format_Specification_for_Scribus_1.4 dresse la liste des balises et de leurs attributs, mais il n'y a aucune explication.

Le format XML de Scribus est assez clair à comprendre et cette étude s'est faite assez simplement par 'rétro engineering'. Les balises XML ont des noms parfois opaques, mais les attributs ont des dénominations plus intuitives, même s'il y a quelques faux amis, et même s'ils sont parfois en anglais et parfois en allemand. A partir d'un fichier modèle fait avec SCRIBUS il est possible de voir les parties intéressantes, d'y faire des modifs et de vérifier le résultat dans Scribus.

Attention : les noms des tags et des attribus sont sensibles à la casse. Parfois ils sont en majuscules, parfois ils sont en CamelCase, il faut respecter cela, donc soyez vigilants.

Balise DOCUMENT

Après une entête <?xml version="1.0" encoding="UTF-8"?>, un fichier SLA se compose d'une balise <DOCUMENT...> qui comprend

  • la définition de l'environnement (préférences, styles et autres éléments)
  • le contenu lui même.

Dans le cas d'un format A5, ça donne : <DOCUMENT ANZPAGES="5" PAGEWIDTH="419.527559055118" PAGEHEIGHT="595.275590551181" BORDERLEFT="28.3464566929134" BORDERRIGHT="28.3464566929134" BORDERTOP="34.0157480314961" BORDERBOTTOM="42.5196850393701" PRESET="0" BleedTop="0" BleedLeft="0" BleedRight="0" BleedBottom="0" ORIENTATION="0" PAGESIZE="A5" FIRSTNUM="1" BOOK="1" AUTOSPALTEN="1" ABSTSPALTEN="11" UNITS="4" DFONT="Arial Regular" DSIZE="12" DCOL="1" DGAP="0" TabFill="" TabWidth="36" AUTHOR="" COMMENTS="" KEYWORDS="" PUBLISHER="" DOCDATE="" DOCTYPE="" DOCFORMAT="" DOCIDENT="" DOCSOURCE="" DOCLANGINFO="" DOCRELATION="" DOCCOVER="" DOCRIGHTS="" DOCCONTRIB="" TITLE="" SUBJECT="" VHOCH="33" VHOCHSC="66" VTIEF="33" VTIEFSC="66" VKAPIT="75" BASEGRID="14.4" BASEO="0" AUTOL="20" UnderlinePos="-1" UnderlineWidth="-1" StrikeThruPos="-1" StrikeThruWidth="-1" GROUPC="1" HCMS="0" DPSo="0" DPSFo="0" DPuse="0" DPgam="0" DPbla="1" DPMo="sRGB IEC61966-2.1" DPPr="Fogra27L CMYK Coated Press" DPIn="sRGB IEC61966-2.1" DPInCMYK="Fogra27L CMYK Coated Press" DPIn2="sRGB IEC61966-2.1" DPIn3="Fogra27L CMYK Coated Press" DISc="1" DIIm="0" ALAYER="0" LANGUAGE="French" MINWORDLEN="3" HYCOUNT="2" AUTOMATIC="1" AUTOCHECK="0" GUIDELOCK="0" SnapToGuides="0" SnapToGrid="0" MINGRID="20.0012598425197" MAJGRID="100.00062992126" SHOWGRID="0" SHOWGUIDES="1" showcolborders="1" SHOWFRAME="1" SHOWLAYERM="0" SHOWMARGIN="1" SHOWBASE="0" SHOWPICT="1" SHOWControl="0" SHOWLINK="1" rulerMode="1" showrulers="1" showBleed="1" rulerXoffset="0" rulerYoffset="0" GuideRad="10" GRAB="4" POLYC="4" POLYF="0.707106781186548" POLYR="0" POLYCUR="0" POLYFD="0" POLYS="0" AutoSave="1" AutoSaveTime="600000" ScratchBottom="20.0012598425197" ScratchLeft="100.00062992126" ScratchRight="100.00062992126" ScratchTop="20.0012598425197" GapHorizontal="0" GapVertical="39.9996850393701" StartArrow="0" EndArrow="0" PEN="Black" BRUSH="None" PENLINE="Black" PENTEXT="Black" StrokeText="Black" TextBackGround="None" TextLineColor="None" TextBackGroundShade="100" TextLineShade="100" TextPenShade="100" TextStrokeShade="100" STIL="1" STILLINE="1" WIDTH="1" WIDTHLINE="1" PENSHADE="100" LINESHADE="100" BRUSHSHADE="100" MAGMIN="10" MAGMAX="3200" MAGSTEP="200" CPICT="None" PICTSHADE="100" PICTSCX="1" PICTSCY="1" PSCALE="1" PASPECT="1" EmbeddedPath="0" HalfRes="1" dispX="0.0124" dispY="0.0124" constrain="15" MINORC="#00ff00" MAJORC="#00ff00" GuideC="#000080" BaseC="#c0c0c0" GuideZ="10" BACKG="1" PAGEC="#ffffff" MARGC="#0000ff" RANDF="0" currentProfile="PostScript">

C'est effrayant mais en fait il n'y a à comprendre que ce dont on a besoin, qu'il est facile de trouver et d'adapter aux besoins. Par exemple, pour un document d'un autre format que le A5, les dimensions PAGEWIDTH et PAGEHEIGHT seront différentes.

SHOWLINK="1" demande de montrer dans scribus les liens entre linked frames (0 sinon). C'est très pratique pour élaborer la structure du document.

LANGUAGE="French" sert probablement pour les césures et pour le correcteur orthographique lorsqu'il marche.

Environnement

L'environnement comporte les valeurs des préférences. Je n'ai travaillé que sur les styles et les couleurs, que je détaille un peu ici. Le reste peut être recopié telquel à partir d'un fichier modèle.

Définition des styles

Ici : définition du style de paragraphe par défaut, d'un style de paragraphe "ParMonstyle" et d'un style de caractère "ChaMonstyle".

<STYLE NAME="Default Paragraph Style" DefaultStyle="1" ALIGN="0" LINESPMode="0" LINESP="9" INDENT="0" RMARGIN="0" FIRST="0" VOR="0" NACH="0" DROP="0" DROPLIN="2" DROPDIST="0"/> <STYLE NAME="ParMonstyle" ALIGN="3" LINESP="8.5" INDENT="11.3385826771654" FIRST="0" VOR="0" CPARENT="ChaMonstyle"/> <CHARSTYLE CNAME="Default Character Style" DefaultStyle="1" FONT="Arial Regular" FONTSIZE="12" FEATURES="inherit" FCOLOR="Black" FSHADE="100" SCOLOR="Black" SSHADE="100" TXTSHX="5" TXTSHY="-5" TXTOUT="1" TXTULP="-0.1" TXTULW="-0.1" TXTSTP="-0.1" TXTSTW="-0.1" SCALEH="100" SCALEV="100" BASEO="0" KERN="0" LANGUAGE="French"/> <CHARSTYLE CNAME="ChaMonstyle" FONT="DejaVu Serif Condensed" FONTSIZE="8" wordTrack="0.9" LANGUAGE="French"/>

ANAME c'est le nom du style.

Pour les styles de paragraphes

CPARENT indique le style de caractère sur lequel est basé le style de paragraphe.

Le champ ALIGN vaut : 0 pour un alignement à gauche, 1 pour centré 2 pour aligné à droite 3 pour justifié 4 pour justification totale (yc dernière ligne incomplète)

Le champ VOR vaut l'espace avant un paragraphe et le champ NACH vaut l'espace après.

Couleurs

Les couleurs peuvent être en RGB ou en CMJN

en RGB <COLOR NAME="Green" RGB="#00ff00" Spot="0" Register="0"/>

en CMJN <COLOR NAME="couldept01" CMYK="#789abc00" Spot="0" Register="0"/>

Autres définitions de l'environnement

Les autres éléments de l'environnement sont

  • la définition des différents profiles PDFS : <CheckProfile Name="PDF 1.3"...>
  • l'imprimante <Printer.../>
  • les paramètres PDF <PDF.../>
  • les paramétrages de césure <HYPHEN .../>
  • les gabarits <MASTERPAGE.../>
  • le bloc des sections <sections/> contenant la définition de chaque section <section.../>

et quelques autres structures.

Contenu

Le contenu c'est ce qui se voit : les pages qui sont le support du contenu et le contenu lui-même : cadres contenant et texte contenu des cadres.

Les pages PAGE

Les pages sont définies par des objets <PAGE>

<PAGE PAGEXPOS="519.5" PAGEYPOS="18442.9924" PAGEWIDTH="419.527559055118" PAGEHEIGHT="595.275590551181" BORDERLEFT="28.3464566929134" BORDERRIGHT="28.3464566929134" BORDERTOP="34.0157480314961" BORDERBOTTOM="42.5196850393701" NUM="59" NAM="" MNAM="Normal" Size="A5" Orientation="0" LEFT="0" PRESET="0" VerticalGuides="" HorizontalGuides="" AGhorizontalAutoGap="0" AGverticalAutoGap="0" AGhorizontalAutoCount="0" AGverticalAutoCount="0" AGhorizontalAutoRefer="0" AGverticalAutoRefer="0" AGSelection="0 0 0 0"/>

La structure <PAGE...> contient : - leur positionnement PAGEXPOS et PAGEYPOS dans un même espace absolu contenant toutes les pages - leurs dimensions PAGEHEIGHT et PAGEWIDTH. - les marges - leur numéro : NUM etc

Dans l'exemple donné, vu la valeur de PAGEXPOS = 519, c'est une page de droite, et vu que c'est la page NUM=59 la valeur de PAGEYPOS=18442 est très grande.

Les pages sont séparées par un espace à l'écran paramétrable qui compte aussi pour PAGEYPOS.

Les cadres (frames) : PAGEOBJECTS

<PAGEOBJECT OwnPage="0" PTYPE="4" XPOS="535" YPOS="54" WIDTH="375.874" HEIGHT="519" RADRECT="0" FRTYPE="0" CLIPEDIT="1" PWIDTH="1" PCOLOR="None" PCOLOR2="None" COLUMNS="2" COLGAP="8.5039" NAMEDLST="" SHADE="100" SHADE2="100" GRTYP="0" ROT="0" PLINEART="1" PLINEEND="0" PLINEJOIN="0" LOCALSCX="1" LOCALSCY="1" LOCALX="0" LOCALY="0" PICART="1" PLTSHOW="0" BASEOF="0" textPathType="0" textPathFlipped="0" FLIPPEDH="0" FLIPPEDV="0" SCALETYPE="1" RATIO="1" PRINTABLE="1" ANNOTATION="0" ANNAME="frame0" TEXTFLOWMODE="0" TEXTFLOW="0" TEXTFLOW2="0" TEXTFLOW3="0" AUTOTEXT="0" EXTRA="0" TEXTRA="0" BEXTRA="0" REXTRA="0" FLOP="0" PFILE="" PFILE2="" PFILE3="" PRFILE="" EPROF="" IRENDER="1" EMBEDDED="1" LOCK="0" LOCKR="0" REVERS="0" TransValue="0" TransValueS="0" TransBlend="0" TransBlendS="0" isTableItem="0" TopLine="0" LeftLine="0" RightLine="0" BottomLine="0" isGroupControl="0" NUMDASH="0" DASHS="" DASHOFF="0" NUMPO="16" POCOOR="0 0 0 0 375.908 0 375.908 0 375.908 0 375.908 0 375.908 518.972 375.908 518.972 375.908 518.972 375.908 518.972 0 518.972 0 518.972 0 518.972 0 518.972 0 0 0 0 " NUMCO="16" COCOOR="0 0 0 0 375.908 0 375.908 0 375.908 0 375.908 0 375.908 518.972 375.908 518.972 375.908 518.972 375.908 518.972 0 518.972 0 518.972 0 518.972 0 518.972 0 0 0 0 " NUMGROUP="0" GROUPS="" startArrowIndex="0" endArrowIndex="0" OnMasterPage="" ImageClip="" ImageRes="1" Pagenumber="0" isInline="0" fillRule="1" doOverprint="0" gXpos="0" gYpos="0.0282114473731099" gWidth="782.276340162126" gHeight="519" LAYER="0" BOOKMARK="0" NEXTITEM="1" BACKITEM="-1"> ...(contenu du cadre) ... </PAGEOBJECT>

  • ANNAME contient le nom du frame visible dans la palette
  • OWNPAGE contient le n° de l'item (doit commencer à 0 sinon plantage de scribus). Attention, ownpage peut valoir autre chose que la page courante lorsque cette notion n'est pas pertinente : dans le cas d'un frame à cheval sur plusieurs pages, dans un groupe d'objets ou pour les frames inline notemment. Dans ces derniers cas, ownframe vaut -1.
  • NEXTITEM contient le n° de l'item linké suivant (qui doit exister sinon plantage) ou -1 sinon
  • BACKITEM contient le n° de l'item linké précédent (qui doit exister sinon plantage) ou -1 sinon
  • XPOS, YPOS : coordonnées absolues depuis le haut gauche de l'espace de la 1ère planche (planche 0 de l'item 0)
  • PTYPE : type de cadre. PTYPE="4" indique un cadre de texte. Cette doc ne présente que les text frames.

Attention : Les cadres PAGEOBJECT sont définis au premier niveau de la balise <DOCUMENT>, au même niveau que les <PAGE> donc, et non à l'intérieur d'une PAGE. En effet un cadre peut être à cheval sur plusieurs pages. Le DOCUMENT contient donc tous ces éléments "en vrac", c'est les XPOS et YPOS qui indiquent leur positionnement.

A l'intérieur d'un cadre PAGEOBJECT, tout le contenu est défini par des <BALISEs> et notamment par des <ITEXT ...> pour le contenu textuel.

L'élément textuel de base : ITEXT

Le texte apparaît à l'intérieur d'un <PAGEOBJECT>, en valeur de l'attribut CH (pour "CHAINE" ?).

Basiquement, sans styles, c'est juste ça : <ITEXT CH="Ici votre texte"/>

Cette balise doit ensuite être suivie par une balise de "fin de paragraphe" <PARA/> ou par <trail/> si c'est la fin du cadre (donc : juste avant le </PAGEOBJECT>).

S'il y a 2 paragraphes c'est donc :

<ITEXT CH="Ici un premier paragraphe"/> <para/> <ITEXT CH="Ici le 2ème paragraphe"/> <trail/>

La balise <para/> contient aussi l'indication du style de paragraphe du texte contenu dans les ITEXTs précédents:

<ITEXT CH="Ce texte en style paragraghe ParMonstyle"/> <para PARENT="ParMonstyle"/>

Si il y a des styles de caractères localement sur "Mon texte" en plus du style de paragraphe, ceux ci sont indiqués en attribut de la balise <ITEXT> :

<ITEXT CPARENT="ChaMonstylelocal" CH="Un petit texte stylé"/> <ITEXT CH="et on continue par le style normal du paragraphe"/> <para PARENT="ParMonstyle"/>

ou, avec une couleur :

<ITEXT FONT="Webdings Regular" FCOLOR="monrouge" CH="X"/>

Les caractères spéciaux

  • les doubles quotes dans un texte doivent être échappées en & quot ;

<ITEXT CH="Il a dit & quot ;héhé& quot ;"/>

sinon elles se confondent avec les " de définition des valeurs des attributs dans le XML SLA

  • les < et les > sont échappés en & lt ; et & gt ; pour ne pas interférer avec les définition des balises dans le XML
  • s'il y a un saut de ligne dans une valeur de chaine, il est lu et bien compris par Scribus,

mais c'est sauvegardé ensuite comme un saut de paragraphe (nouveau <para/>)

  • S'il y a des caractères genre dingbats, ils sont insérés directement,

sans décodage. Quand on lit le SLA avec un éditeur de code (ou dans ce wiki), c'est affiché dans la fonte par défaut de l'éditeur, qui parfois affiche le même glyphe, mais pas toujours. <ITEXT FONT="Liberation Mono Regular" CH="►●☻"/> ou <ITEXT FONT="Webdings Regular" CH=""/>

  • les différents espaces cadratins, demi-cadratin, fine et ultrafine sont codés par le caractère unicode spécial qui leur est dédié, à l'intérieur de la chaine dont ils font partie, sauf l'espace insécable qui est spécifié par un tag propre à scribus : <nbspace> qui interrompt la chaine et nécessite donc un 2eme tag <ITEXT> pour la suite.

Exemple :

           <ITEXT CH="espace cadratin"/>
           <ITEXT CH="espace demicadratin"/>
           <ITEXT CH="espace"/>
           <nbspace/>
           <ITEXT CH="insécable"/>
           <ITEXT CH="espace fine"/>
           <ITEXT CH="espace ultrafine"/>

Certaines polices contiennent une bonne définition pour toutes ces espaces, mais pas toutes, loin de là. Il faut tester avant.