15 scripts InDesign et bouts de code cruellement méconnus
February 21, 2023 | Snippets | fr | en
Si vous visitez ce site de temps à autre, vous savez qu'il renferme une ribambelle de scripts InDesign en libre accès, mais peut-être ignorez-vous que d'autres pépites se multiplient dans notre répertoire GitHub IdGoodies. Ce dernier n'étant guère documenté, il était temps de vous offrir un aperçu des scripts clé-en-main et des codes intégrables que vous y découvrirez…
1. BookUpdateTOCs (script)
Actualise toutes les tables des matières (d'un livre). — InDesign n'offre pas de solution immédiate pour automatiser la mise à jour de toutes les tables des matières existant dans un livre. Ce script s'en occupe : il visite les chapitres l'un après l'autre et appelle la commande Update-Table-Of-Contents chaque fois qu'elle est disponible. Puis il affiche un rapport succinct à la fin du travail.
NOTE. — Les chapitres inactifs sont momentanément ouverts, sauvegardés et refermés.
2. DocPreventOpening (script)
Interdit l'ouverture de certains documents InDesign. — Ce script empêche l'ouverture des documents dont le nom correspond à un certain motif d'expression régulière : modifiez la constante RE_EXCLUDE
dans le code pour l'ajuster à vos objectifs. L'implémentation s'appuie sur l'événement beforeOpen
disponible dans CS5/CS6/CC.
• Pour installer le gestionnaire d'événement il suffit d'exécuter le script manuellement (une seule fois par session InDesign).
• Pour le désinstaller, vous devez fermer InDesign. Bien entendu, si vous avez installé le code en « script de démarrage » (dossier startup scripts
), pensez à supprimer le fichier !
AVERTISSEMENT. - N'installez pas ce script en démarrage automatique à moins de savoir exactement ce que vous faites. Les utilisateurs perdraient la possibilité d'ouvrir certains fichiers et n'en seraient pas avisés. Si vous déployez cette solution, veillez à ce que tous vos clients soient informés de ce qui se passe. Fournissez-leur systématiquement les instructions permettant de désinstaller le script !
3. DocShowClosestByName (script)
Active le document dont le nom est le plus similaire. — Basé sur cette discussion en anglais : « Javascript to find a similar filename among all open documents », ce script détecte et active parmi les documents ouverts celui dont le nom est le plus proche du document courant d'après la distance de Levenshtein.
NOTE. — Une expression régulière personnalisée peut être fournie à la fonction showClosestDocByName
afin d'ignorer certaines parties du nom de fichier avant de lancer la procédure (par exemple, tels préfixes ou suffixes partagés entre vos documents).
4. LinkAutoUpdate (script)
Actualise les liens images dynamiquement. — Ce script met automatiquement à jour les liens périmés d'un document InDesign, sur la foi d'un gestionnaire d'événement. Vous pouvez l'exécuter manuellement (une fois par session) ou bien le charger en « script de démarrage » (dossier startup scripts
).
NOTE. — Un code alternatif a été proposé par あるふぁ(仮), se basant sur l'événement afterAttributeChanged
et déléguant la procédure à l'objet BridgeTalk. La solution délivrée ici s'appuie sur l'événement afterLinksChanged
disponible dans CS5/CS6/CC.
5. ReframeAllPages (script)
Recadre toutes les pages selon les éléments présents. — Ce script examine chaque page du document actif, détermine la région occupée par les éléments maquettés et « recadre » la page de sorte qu'elle circonscrive exactement cette région. (Les marges sont également mises à zéro.)
NOTE. — Ce script est annulable (Ctrl Z) et affiche un rapport succinct.
6. SelApplyStyleNone (script)
Applique le style [Sans] à la sélection. — Ce script applique « de force » le style de caractère [Sans]
au texte sélectionné ou au point d'insertion, s'assurant que tous les attributs de caractère sont bel et bien neutralisés. Le code a le même effet qu'un clic utilisateur sur le style [Sans]
dans la palette des Styles de caractère, opération qui ne peut pas être associée simplement à un raccourci clavier ! Par conséquent, il vous est suggéré d'assigner un raccourci à ce script afin de prendre le contrôle de cette action.
NOTE. — Supporte toute version d'InDesign de CS4 to CC. Le script est annulable par Ctrl/Cmd Z.
7. SelPlacePDFPage (script)
Change facilement la page d'un PDF importé. — Avez-vous à modifier régulièrement la page-cible d'un PDF importé dans votre document InDesign ? Sélectionnez le bloc graphique et exécutez ce script utilitaire, bien plus confortable que l'interface d'InDesign !
DISCUSSION (en anglais) : adobe.ly/3HoxrZ2
8. DocBackupSave (code)
Archive les états successifs d'un document. — Cette fonction crée un backup du document — avant son nouvel enregistrement — afin que ses versions successives soient mémorisées, horodatées et conservées dans un sous-dossier. La première fois que vous appelez la fonction sur un document fraîchement créé et non sauvegardé, elle se borne à invoquer la méthode save
native. Puis, les appels consécutifs produisent une copie du fichier existant dans le dossier d'historisation avant d'enregistrer la nouvelle version. Chaque « backup » est nommé selon la syntaxe :
<AAAA>-<MM>-<JJ>_<hhmmss>_<NomDuDocument>
où la signature temporelle <AAAA>-<MM>-<JJ>_<hhmmss>
reflète la date et l'heure de modification.
Utiliser backupSave(doc)
plutôt que doc.save()
peut vous prémunir contre des scénarios-catastrophe, par exemple celui où le document en cours de travail est soudain corrompu et ne peut plus être récupéré par les voies habituelles. Au-delà de cette solution de sécurité, la disponibilité de sauvegardes successives permet également d'archiver les étapes d'un projet.
ASTUCE. — Assignez à votre script backupSave();
un raccourci, par exemple Cmd+Alt+S, via Édition > Raccourcis clavier…
9. DocGrepTextFindAll (code)
Récupère tous les éléments trouvés par une recherche Grep ou Texte. — Cette fonction enregistre en dur la liste des éléments que détecterait votre requête Grep active dans le dialogue Rechercher/Remplacer (ou la requête Texte si aucune commande Grep n'est disponible). Les résultats sont mémorisés dans un fichier UTF8 (typiquement findGrep.txt
) et peuvent être affichés directement. La fonction elle-même renvoie true
si tout s'est déroulé comme prévu.
ASTUCE. — Assignez à votre script showFindAll();
un raccourci, par exemple Cmd+Alt+F, via Édition > Raccourcis clavier…
10. FontGlyphCount (code)
Compte les glyphes d'une police de caractères. — Ce bout de code ajoute une méthode glyphCount
aux instances de l'objet Font
. Vous pouvez l'exploiter dans des scripts chargés de déterminer ou d'afficher le nombre de glyphes disponibles dans une police — notamment ceux qui manipulent les index GID.
11. GroupAddItems (code)
Ajoute des éléments à un groupe. — Ce code introduit une méthode addItems
dans le prototype de l'objet Group
. Cette fonctionnalité pourtant naturelle n'est pas disponible dans l'API des composants InDesign et représente un véritable défi technique (du moins quand il n'est pas possible de détruire temporairement le groupe cible en vue de le cloner). La solution proposée ici repose sur une brillante idée de Uwe Laubender (discutée sur le forum scripting d'InDesign).
NOTE. — L'astuce consiste à créer temporairement un objet MultiStateObject
(MSO), lequel peut assimiler le groupe cible sous la forme d'un « état » (State
). Les nouveaux éléments sont alors adjoints à cet état et, lorsque ce dernier est finalement libéré, le groupe est correctement restauré avec les composants additionnels. Des problèmes peuvent encore se manifester dans des cas extrêmes. La présente implémentation tolère que le groupe (G) appartienne à un objet ancré (AO) ou soit inscrit dans un autre composant par « Coller dedans ». Par contre, aucune solution n'est disponible à ce jour si G est directement inscrit dans un objet SplineItem
.
12. SelFirstImage (code)
Identifie le « premier » élément graphique sur une page. — Étant donné une page (et optionnellement un calque cible), ce code identifie et retourne, s'il existe, l'élément SplineItem
le plus proche du « coin supérieur gauche » et contenant un objet Graphic
. Par « coin supérieur gauche », nous visons en réalité un couple de coordonnées (haut, gauche) dont la somme soit minimale. En moyenne, cet algorithme détermine un objet que l'utilisateur/trice perçoit comme le premier élément géométrique de la page candidate.
13. SelFlattenTransform (code)
Neutralise les transformations de l'objet sélectionné. — Ce code opère sur la sélection. Il « aplatit » les attributs transformationnels de telle sorte que tous les points géométriques soient maintenus à leur emplacement mais que l'objet ne subisse plus l'effet d'aucune rotation, inclinaison ou mise à l'échelle. (À la fin de l'opération, le composant sélectionné n'aura pas changé d'apparence.)
NOTE. — Le code proposé ne se préoccupe pas des éléments internes appartenant à des groupes, objets multi-états, etc.
14. TableCellBox (code)
Crée la boîte englobante d'une cellule (ou d'une plage de cellules). — Considérant une cellule de tableau (spécificateur, singulier ou pluriel, de type Cell
), le code crée un objet Rectangle
englobant toute la région délimitée visuellement, en tenant compte de l'épaisseur des contours et des transformations actives. Cet algorithme expérimental, suscité par cette discussion, développe une idée originale de Uwe Laubender.
NOTE. — Plusieurs problèmes ont été résolus, notamment un bug InDesign affectant la méthode duplicate()
appliquée à un objet inscrit dans une entité GraphicCell
. Le code tolère également la présence d'objets multi-états ou de boutons dans la cellule graphique. Il peut même générer plusieurs « boîtes » si la plage de cellules fournie en entrée parcourt plusieurs planches en raison de blocs chaînés.
15. TextSortParagraphs (code)
Tri rapide de paragraphes InDesign. — Ce code réarrange une plage de paragraphes en vertu d'une fonction de tri personnalisable. Array.prototype.sort
est employé par défaut (ce qui classe les paragraphes selon l'ordre UTF16 implicite). Cependant, votre code client peut fournir en second argument une fonction bien plus adéquate…