IdExtenso a fait son petit bonhomme de chemin depuis son lancement il y a trois ans. J'avais présenté ce framework aux participants de l'InDesign User Group parisien en mai 2018. Depuis lors, une myriade de nouveaux outils et modules ont émergé, notamment JsxBlind 2.0, un brouilleur de JSXBIN tout équipé. L'autre fameux exemple est bien sûr Claquos 3, lui aussi bâti de A à Z sur des composants IdExtenso :

Le script Claquos 3 s'appuie sur le module ModalScript d'IdExtenso.

Certes, le « framework ExtendScript pour les ninjas d'InDesign » ne récolte qu'une audience de niche dans la sphère du scripting InDesign, mais il progresse fièrement et sûrement sur GitHub avec ses 55 étoiles, 9 forks et jusqu'à 20 clones journaliers, témoignant ainsi de la valeur qu'il possède aux yeux des développeurs JavaScript/ExtendScript expérimentés.

Malgré sa faible visibilité, IdExtenso peut induire sur GitHub une vingtaine de clones par jour.

Mais ne nous voilons pas la face : IdExtenso n'est pas un havre de simplicité et de légèreté. Sa technicité demande un temps d'adaptation, et vous ne pourrez gratter sous la surface qu'armés de solides compétences en JavaScript. La bonne nouvelle, c'est qu'il n'est pas indispensable de comprendre ses rouages pour en faire bon usage !

La colonne vertébrale d'IdExtenso (core) pèse aux alentours de 180 Ko et permet déjà d'usiner de bons petits scripts sans autre formalité. D'ailleurs, vous n'avez même pas besoin d'« installer » la structure sur votre disque puisqu'une « image JSXBIN » est fournie en tant que fichier JSX autonome. Ainsi, il suffit d'inclure un seul fichier dans votre script pour expérimenter l'API minimale de $$.

Le « core » d'IdExtenso fournit des briques fondamentales (JSON, Log, Env, etc.)

ExtendScript amélioré

Le « core » d'IdExtenso fournit $$.JSON, $$.Log, $$.Env et une poignée d'utilitaires de bon aloi. Un fait moins connu est qu'il apporte également des correctifs et améliorations à ExtendScript lui-même. En voici une petite synthèse (en anglais) :

// [[global]]
  .parseInt()       Patched (ExtendScript bug.)
 
// String.prototype
  .lastIndexOf()    Patched (CS4 bug.)
  .split()          Patched (CS4 bug.)
  .toSource()       Improved.
  .codePointAt()    ECMAScript spec.
  ————
  .toBase64()       Converts into Base64.
  .toUTF8()         Converts into UTF8.
  ————
  .rpad()           Right padding.
  .lpad()           Left padding.
  ————
  .trunc()          Truncates.
  .ltrunc()         Left truncation.
  .rtrunc()         Right truncation.
  ————
  .trim()           Removes leading and trailing spaces.
  .ltrim()          Left trim.
  .rtrim()          Right trim.
  ————
  .stripSpaces()    Removes all spaces.
  .charSet()        Set of characters of the string.
 
// String (class)
  .fromCodePoint()  ECMAScript spec.
  .fromBase64()     Gets a string (UTF16) from Base64.
  .fromUTF8()       Gets a string (UTF16) from UTF8.
  ————
  .levenDist()      Levenshtein dist. between 2 strings.
  .levenFilter()    Applies levenDist to an array.
  ————
  .random()         Produces a random string.
 
// Number.prototype
  .toSource()       Variant of toString w/ extra options.
  .toHexa()         Hexadecimal representation.
  .toDecimal()      Variant of toFixed fixing rounding pbs.
  .toIEEE754()      IEEE754 encoder (64bit)
  .toIEEE754_32()   IEEE754 encoder (32bit)
  ————
  .toAdbe()         Adobe tag (0xHHHHHHHH -> 4 chars.)
  .isAdbe()         Whether this number is an Adobe tag.
 
// Number (class)
  .EPSILON          As specified in ECMAScript 2015.
  .MAX_SAFE_INTEGER (idem)
  .MIN_SAFE_INTEGER (idem)
  .isInteger()      (idem)
  .isSafeInteger()  (idem)
  ————
  .flatten()        Prevents exponential representation.
  .parse()          Enhanced parseFloat.
  .format()         Formats a number into a string.
  ————
  .fromIEEE754()    IEEE754 decoder (64bit)
  .fromIEEE754_32() IEEE754 decoder (32bit)
 
// RegExp.prototype
  .toSource()       Valid, ASCII-safe, uneval string.
  .flags()          Flag-string in g-i-m order.
 
// RegExp (class)
  .escape()         Cf github.com/benjamingr/RegExp.escape
 

Note. — Pour une vision détaillée des fonctionnalités ajoutées par IdExtenso, cf. le CHANGELOG.

Modules additionnels

La branche /etc, quoique non incluse dans la distribution minimale, propose une collection de modules complémentaires dont vous ne pourrez bientôt plus vous passer si vous entrez dans le vif du scripting. Je me contenterai ici de signaler les composants les plus récemment mis à jour :

$$.Collator est une version légère et simplifiée de l'algorithme de collation Unicode (UCA). Il permet de trier des mots ou expressions dans différentes langues selon les règles de l'UCA, le tout depuis ExtendScript ! Je suis fier de partager ce code et cet outil après tant d'années de travail. $$.Collator remplace et supplante la version très embryonnaire esquissée en 2010.

$$.Collator supporte plus de 200 langues.

Cette mouture est conçue pour prendre en charge les systèmes d'écriture suivants : LATIN, GREC, CYRILLIQUE, ARABE, HÉBREU, ARMÉNIEN, BENGALI, DEVANAGARI, LAO, MALAYALAM, TAMIL, TELUGU et THAÏ. $$.Collator embarque des règles ajustées (tailoring rules) pour environ 70 langues, ce qui lui permet d'opérer dans plus de 200 langues au total. Un script de démonstration est disponible dans le sous-dossier /tests.

$$.Linguist est un module centré lui aussi sur les langues et la localisation. Son principal composant met en correspondance les codes ISO639-1 avec des informations linguistiques, si bien qu'il peut officier comme une sorte de base de données. À titre d'exemple, le méta-module $$.MetaCollator (qui régénère les ressources de $$.Collator) s'appuie sur $$.Linguist.

Dans les coulisses du module $$.Linguist…

Ce module se charge également d'analyser la collection LanguagesWithVendors du DOM InDesign, permettant ainsi des conversions faciles entre les noms de langues (localisées vs non-localisées, codes ISO, etc.).

$$.Unicode est un module utilitaire orienté Unicode. Pour le moment, il référence les blocs Unicode et la liste des glyphes Adobe, données de première utilité pour les scripts manipulant des caractères, glyphes et polices — tels que IndyFont.

$$.ByteStream (introduit en 2018) est une classe IdExtenso dédiée aux flux binaires entrée/sortie. Je l'utilise constamment pour analyser la structure des fichiers dans différents formats (PNG, OTF, PSD, ou même certaines ressources INDD). C'est l'ami des hackeurs ;-)

YALT est un module de localisation qui alimente mes scripts depuis presque toujours. Intégré à IdExtenso dès son origine, il offre désormais un package par défaut contenant plus de 300 expressions essentielles traduites vers FR, DE, SP, IT et RU. L'immense majorité provient directement d'InDesign, ce qui garantit des schémas de traduction en phase avec l'application.

Note. — La fonction YALT() — i.e. __() — a été sensiblement améliorée ces dernières années. En particulier, lorsqu'un modèle contient une variable %i qui n'est pas honorée par l'argument correspondant, alors l'élément non défini est remplacé par une chaîne vide. Par exemple, invoquer __("abc%1xyz") sans fournir la variable %1 produira la chaîne "abcxyz". (Dans les versions précédentes, le résultat eût été "abcundefinedxyz".)


• IdExtenso: github.com/indiscripts/IdExtenso
Scripts exemples pour débuter
Outils de développement