11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour tout le monde,

Je suis en train d'élaborer pour moi-même un script InDesign. Je sais, ça ne va pas parler à grand monde (enfin je pense), mais ça n'a pas d'important puisque c'écrit en JS.

L'idée, c'est qu'en un clique, je puisse transformer l'espace standard précédant les caractères type ?!;: d'un document en espace fine (rapport aux règles typographiques et/ou pour éviter les retours à la ligne intempestifs entre, par exemple, un mot et son "?".

Dans la création d'un gros doc InDesign, ça peut être une aide plutôt sympa.

Bon alors, mon script fonctionne mais de la manière dont je l'ai conçu (sans doute mal) il m'affiche une alert pour chaque caractère remplacé avec le nombre de changements effectué. C'est logique me direz-vous, il y a autant d'alert que de caractères à remplacer dans mon script.

Certes, alors je cherche une solution, qui me permette de faire en sorte que l'affichage de l'alert ne se fasse qu'une seule fois, et à la toute fin de l'analyse du document, du type "234 caractères ont été remplacés", ou quelque chose comme ça.

Assez de parlote, voici mon code :

// Script remplaçant les espaces normaux par des espaces fines devant les ;?!:«»

// Nettoyer les ";"
app.findTextPreferences = NothingEnum.nothing;  
app.changeTextPreferences = NothingEnum.nothing;  
  
app.findTextPreferences.findWhat = " ;";  
app.changeTextPreferences.changeTo = "^<;";

alert('Nombre de changements pour ";" = ' + app.activeDocument.changeText().length);
app.activeDocument.changeText();

// Nettoyer les "?"
app.findTextPreferences = NothingEnum.nothing;  
app.changeTextPreferences = NothingEnum.nothing;  

app.findTextPreferences.findWhat = " ?";  
app.changeTextPreferences.changeTo = "^<?";

alert('Nombre de changements pour "?" = ' + app.activeDocument.changeText().length);  
  
app.activeDocument.changeText();

// Nettoyer les "!"
app.findTextPreferences = NothingEnum.nothing;  
app.changeTextPreferences = NothingEnum.nothing;  

app.findTextPreferences.findWhat = " !";  
app.changeTextPreferences.changeTo = "^<!";

alert('Nombre de changements pour "!" = ' + app.activeDocument.changeText().length);  
  
app.activeDocument.changeText();

//Nettoyer les ":"
app.findTextPreferences = NothingEnum.nothing;  
app.changeTextPreferences = NothingEnum.nothing;  

app.findTextPreferences.findWhat = " :";  
app.changeTextPreferences.changeTo = "^<:";

alert('Nombre de changements pour ":" = ' + app.activeDocument.changeText().length);  
  
app.activeDocument.changeText();

// Nettoyer les "«"
app.findTextPreferences = NothingEnum.nothing;  
app.changeTextPreferences = NothingEnum.nothing;  

app.findTextPreferences.findWhat = "« ";  
app.changeTextPreferences.changeTo = "«^<";

alert('Nombre de changements pour "«" = ' + app.activeDocument.changeText().length);  
  
app.activeDocument.changeText();

// Nettoyer les "»"
app.findTextPreferences = NothingEnum.nothing;  
app.changeTextPreferences = NothingEnum.nothing;  

app.findTextPreferences.findWhat = " »";  
app.changeTextPreferences.changeTo = "^<»";

alert('Nombre de changements pour "»" = ' + app.activeDocument.changeText().length);  
  
app.activeDocument.changeText();
//


Merci beaucoup !
Modérateur
Salut Smiley biggrin ,

Bon j'avoue que ton code ne m'est pas très familier Smiley langue . Est-ce que tu peux créer des variables ? Si oui tu crée un variable (ou une par catégorie) au début initialisé a 0 et au lieux d'un alert tu sauvegarde le nombre dans la variable en l'incrémentant (ou alors tu enregistre chaque nombre dans la variable de la catégorie correspondante) et à la fin de ton script tu fait un alert avec le détails / total etc.

Je sais pas si ce raisonnement peut s'appliquer, j'ai du mal a voir comment le code tourne
Modérateur
Je dirais pareil que Laurent mais en alimentant un objet plutôt que des variables différentes. Comme ça, tu peux facilement boucler sur ton objet à la fin et ajouter facilement des checks plus tard sans te soucier de cette partie.


Par contre, tu peux runner où le script dans InDesign ?
Modifié par Yordi (18 May 2018 - 14:36)
Bonjour à tous les deux,

Tout d'abord, merci pour vos réponses !

Alors, j'ai oublié de préciser, le morceau de code, c'est bricolé, mais je n'y connais rien en JS, donc si vous pouviez me faire un exemple pour une fonction, je me chargerai d'adapter à l'ensemble pour voir si ça fonctionne.

@Yordi, pour runner un script dans InDesign, il faut créer un fichier .jsx et y coller le code (perso, j'utilise Brackets, ça se passe bien) et aller placer ledit fichier dans Utilisateurs/Nom/AppData/Roaming/Adobe/Indesign/Version/fr_FR/Scripts/Scripts Panel
Ensuite, dans InDesign, onglet Fenêtre/Utilitaires/Script/Utilisateur/

Merci encore.
Modifié par CKVTDN (18 May 2018 - 16:05)
Modérateur
Sorry, je n'avais pas la suite de la discussion. Tu peux faire quelque chose de simple comme cela :
let obj = {};
// Quotes
obj.quotes = 2;
// Brackets
obj.brackets = 3;
// Thin spaces
obj.thinSpaces = 1;
// whatYouWant
obj.whatYouWant = 1000;

alert(JSON.stringify(obj));


L'idée est donc d'avoir un object (qui s'appelle obj dans ce cas-ci), tu peux définir des enfants à ton object (obj.quotes, obj.brackets, obj.thinSpaces...). Et ensuite tu pourras traiter ton object une seul fois pour l'afficher dans une alert par exemple.