Forums Développement Multimédia

Aller au contenu

[Résolu] Indesign scripting JS - plusieurs noeuds XML dans un même bloc de texte avec plusieurs styles

Indesign scripting JS PAO InDesign Acrobat PDF

9 réponses à ce sujet

#1 Hachi707

    Ceinture Blanche

  • Members
  • Pip
  • 11 messages

Posté 31 August 2012 - 15:13 PM

Bonjour,
Je rencontre quelques soucis dans la création d'un script en JavaScript. J'ai vu que quelque sujet parlait de Indesign scripting donc je tente d'expliquer mon problème ici au cas où quelqu'un connaissant ce langage passerait par là...

J'ai un XML avec 2 noeuds (un prénom et un nom). Je veux ces deux noeuds un seul bloc texte (textFrame) avec chacun un style particulier.

J'arrive à les mettre dans un même bloc de texte et à appliquer un style de paragraphe sur le tout, mais impossible d'appliquer un style de caractère pour le nom et un autre différent pour le prénom...

Si quelqu'un pense pouvoir m’aider, je suis preneuse et je développerai le code que j'ai déjà créé...

#2 Eddy.vh

    Éternel apprenti.

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 1194 messages

Posté 01 September 2012 - 15:19 PM

Bonjour.
Ne te simplifierais-tu pas la vie avec un style grep dans ton style de paragraphe (ou éventuellement des styles imbriqués) ? Pas besoin de script pour ça je pense !

#3 Hachi707

    Ceinture Blanche

  • Members
  • Pip
  • 11 messages

Posté 02 September 2012 - 10:07 AM

Bonjour,
Non je suis obligé d'utiliser un script car je dois faire un document automatisé. J'ai un xml et un fichier indesign avec des style déja créé et une fois le script lancé, il doit créer et remplir automatiquement mon document. Pas de soucis pour ajouter des blocs textes et des images mais je bloque sur un bloc de texte avec plusieurs styles.
Voici mon 1er code qui crée bien un style différents pour chaque noeud mais impossible de placer ces deux noeuds dans un même bloc de texte:


var myRootXMLElement = myDocument.xmlElements.item(0).xmlElements.item(0).xmlElements.item(1 ).xmlElements.item(3)
var myXMLElementA = myRootXMLElement.xmlElements.item(1); //noeud 1 (le prénom)
var myXMLElementB =  myRootXMLElement.xmlElements.item(2); //noeud é2 (le nom)


myParagraphStyle = myDocument.paragraphStyles.item("al_qu_auteur"); // paragraphStyles
myCharacterStyle1 = myDocument.characterStyles.item("al_qu_prenom_auteur"); // characterStyles 1 pour le prénom
myCharacterStyle2 = myDocument.characterStyles.item("al_qu_nom_auteur"); // characterStyles 1 pour le nom

var myTextFrame3 = myPage.textFrames.add({geometricBounds:[156.5, 163, 170, 377.25]});
myTextFrame3.placeXML(myXMLElementA);
 
Je n'affiche que mon noeud prénom. Je ne vois pas comment ajouter le noeud du nom (myXMLElementB) dans le même bloc texte.

Autre code qui ajoute bien les deux, mais cette fois-ci, impossible d'ajouter des styles de caractère:

var myRootXMLElement = myDocument.xmlElements.item(0).xmlElements.item(0).xmlElements.item(1 ).xmlElements.item(3);
var myXMLElementA = myRootXMLElement.xmlElements.item(1);
var myXMLElementB =  myRootXMLElement.xmlElements.item(2);

myParagraphStyle = myDocument.paragraphStyles.item("al_qu_auteur");
myCharacterStyle1 = myDocument.characterStyles.item("al_qu_prenom_auteur");
myCharacterStyle2 = myDocument.characterStyles.item("al_qu_nom_auteur");


var myTextFrame3 = myPage.textFrames.add({geometricBounds:[156.5, 163, 170, 377.25]});
myTextFrame3.contents = myXMLElementA.contents + " " + myXMLElementB.contents ;
myTextFrame3.parentStory.texts.item(0).applyParagraphStyle(myParagraph Style, true);
 

J'ajoute un style de paragraphe mais comment re-différentié les 2 noeuds pour y appliquer un style de caractère différents.

#4 jmlevy

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 322 messages

Posté 02 September 2012 - 11:40 AM

Je suis loin d'être un pro du XML mais je ne vois pas ce qui t'interdit, comme le suggère Eddy, d'utiliser un style GREP dans ton style de paragraphe pour styler automatiquement prénom et nom…

#5 Hachi707

    Ceinture Blanche

  • Members
  • Pip
  • 11 messages

Posté 02 September 2012 - 12:03 PM

Je ne vois pas très bien ce qu'est un style GREP mais je vais me renseigner. Merci pour cette piste. Je vais regarder celà lundi et je vous tiendrais informé.

Cependant je ne vois pas comment il pourra faire la différence automatiquement entre le nom et prénom... Il peux en effet y avoir plusieurs mot dans un nom et/ou prénom. Cela va reconnaitre automatiquement myXMLElementA et myXMLElementB ou je dois baliser pour qu'ils soit reconnus?

#6 Eddy.vh

    Éternel apprenti.

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 1194 messages

Posté 02 September 2012 - 19:41 PM

Bonsoir.

Voir le messageHachi707, le 02 September 2012 - 10:07 AM, dit :

Voici mon 1er code qui crée bien un style différents pour chaque noeud mais impossible de placer ces deux noeuds dans un même bloc de texte

Oh que si, dans un même bloc de texte, pas de problème, ton problème actuel est de placer tes 2 nœuds sur une seule et même ligne… en d'autres termes, un unique paragraphe.
Pour différencier tes deux nœuds et leur appliquer un style de paragraphe agrémenté d'un style grep, puisque les noms et / ou prénoms pourraient eux-même êtres composés de deux termes (Jean Philippe de Monmirail p.ex.), je pense qu'il faudra séparer tes nœuds avec un caractère spécial (un quart d'espace p.ex.). Il deviendra alors facile d'appliquer là regex suivante dans le style de paragraphe utilisé pour ce bloc de texte :

Appliquer le style : X (X est le style de caractère à appliquer au nom)
Au texte : (?<=~4)(\w+ ?)+

Explication :
On applique le style de caractères X à des caractères de mots (\w) répétés une ou plusieurs fois (+) suivis ou non d'une espace ( ?) et ce tout (sous expression marquante entre parenthèse) une ou plusieurs fois (+) à l'unique condition que ces dernier soient précédés d'un quart d'espace (?<=~4)

Voir exemple ci-dessous.
Fichier joint  Capture 2012-09-02 à 20.40.20.png   44.91 Ko   4 téléchargement(s)

Rien ne change pour la reconnaissance de tes balises.

#7 Kosic

    Ceinture Noire

  • Community Manager
  • PipPipPipPipPipPipPip
  • 390 messages

Posté 03 September 2012 - 05:10 AM

Jean-Philippe (espace) de (espace insécable) Monmirail (espace insécable) du (espace insécable) Faou.
C'est logique typographiquement, facile à gérer dans le document original (remplacer toutes les espaces par des insécables et générer une espace entre les champs prénoms et nom) et demande juste un style imbriqué…
"La beauté est dans dans l'œil comme le doigt du sage qui montre la lune de l'idiot qui regarde."
J'me comprends…

Illustrator and I

#8 Loic Aigon

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 1662 messages

Posté 03 September 2012 - 12:01 PM

Hello,

Pourquoi ne pas simplement utiliser les outils natifs d'InDesign ? Tu peux appliquer des styles aux balises via le menu :

Image IPB

quant à l'intégration nom+prenom, tu peux gérer ça en amont de l'import dans ton document. C'est dur à dire sans en savoir plus.

Loic

#9 Eddy.vh

    Éternel apprenti.

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 1194 messages

Posté 03 September 2012 - 13:29 PM

Du coup je m'aperçois avoir oublié le trait d'union de Jean-Philippe. :oops:
Peut-être que Loic aura mis Hachi707 sur la voie de la solution la plus simple !!!

#10 Hachi707

    Ceinture Blanche

  • Members
  • Pip
  • 11 messages

Posté 05 September 2012 - 10:12 AM

Bonjour à tous,

J'avais posté mon problème sur le forum d'adobe également et j'ai reçu une réponse qui fonctionne très bien:


var myPage = app.activeDocument;

var rootElement = myPage.xmlElements.item(0);

var theTextFrameXML = rootElement.xmlElements.add("textframe");
var theTextFrame = myPage.textFrames.add({geometricBounds:[156.5, 163, 170, 377.25]});

theTextFrame.placeXML(theTextFrameXML);

var firstCharacterStyle = myPage.characterStyles.itemByName("al_qu_prenom_auteur");
theTextFrameXML.insertionPoints.item(-1).applyCharacterStyle(firstChar acterStyle);
theTextFrameXML.insertionPoints.item(-1).contents = "First Name";

space = theTextFrameXML.insertionPoints.item(-1).contents = " ";

var secondCharacterStyle = myPage.characterStyles.itemByName("al_qu_nom_auteur");
theTextFrameXML.insertionPoints.item(-1).applyCharacterStyle(secondCha racterStyle);
lastName = theTextFrameXML.insertionPoints.item(-1).contents = "Last Name";
 

Mais je remercie tout le monde pour les réponses et les pistes, car cela va m'aider pour d'autre chose. Merci à tous!!!



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP