mercredi 15 avril 2009

Index personnalisé sous InDesign grâce à JavaScript

Vous voulez générer un index très personnalisé sous InDesign ? A partir de contenu XML par exemple ? Voici une solution.

Je comptais poster quelque part sur la toile (tant qu'à faire, chez moi) un petit morceau de script que j'ai écrit. C'est assez technique (du moins ça paraît) ce qui est inhabituel sur ce blog, mais ce script est hyper utile et tout bête à utiliser, il est principalement destiné aux graphistes s'intéressant au XML et/ou au JavaScript sous InDesign et au développeurs qui souhaitent utiliser la puissance d'InDesign pour générer de beaux livres.

Attention, il ne s'agit pas de générer un index complet avec le tri alphabétique etc. Mais simplement d'insérer les numéros de pages très simplement où l'on veut et vers ce que l'on veut. Pour ma part, la partie tri alphabétique et écriture brute des noms et informations dans l'index sera effectuée en PHP. Je me suis uniquement soucié de la pagination.

Je suis partis du script écrit par ACut, disponible ici. Je l'en remercie d'ailleurs car son script m'évite bien des prises de tête ! Je n'ai vraiment rien trouvé d'autre répondant d'aussi près à ce que je cherchais.
Et je vous préviens, je ne suis pas une brute en JS, loin de là donc le code que j'ai ajouté à celui de ACut n'est sûrement pas dénué de défauts. Aussi je vous invite à me faire part de vos suggestions sur ce petit bout de code sans prétention.

Objectif


Depuis une structure XML générée en PHP grâce à une base de donnée existante, pouvoir créer un index paginé type index d'annuaire avec des renseignements personnalisés.
Il s'agit de l'annuaire d'un diocèse et dans notre cas, nous présentons les noms et prénoms des responsables et autres membres d'équipes à travers un certain nombre de pages où les personnes sont réparties dans différents secteurs géographiques. En gros, cela ressemble à ça. Et toutes ces pages de paroisses présentes donc tous les membres du diocèse.
L'annuaire comporte ensuite des pages (et des pages) d'indexes, où les personnes sont triées par catégories ET où des informations supplémentaires apparaissent tels que l'adresse, lieu de naissance, etc.

InDesign ne remplit pas ce rôle ?


En effet, InDesign permet de créer des indexes MAIS :
- ce sont des indexes de mots seulement, on ne peut pas donner d'autres informations pour chaque élément,
- L'outil d'index est fait pour générer un index depuis l'interface d'InDesign, et non depuis un contenu XML importé.
- Et finalement, les mots doivent êtres indexés manuellement (vous imaginez le boulot pour un annuaire)

Alors, il existe bien des scripts (très puissants) comme le Index brutal de Marc Autret, mais celui-ci ne nous permettra pas d'insérer nos informations complémentaires sur les personnes. Et c'est un peu compliqué pour nous de devoir générer une liste de mots à indexer à chaque fois.

Le script de ACut


Et bien le script de cette personne est très bon, je l'ai testé, il fonctionne bien MAIS :
- il n'insère pas plusieurs numéros de pages successifs faisant référence à plusieurs signets de même nom (d'ailleurs, est-ce possible ça, plusieurs signets de même nom normalement ?)
- on ne peut générer les signets en XML, ils doivent être appliqués manuellement !

Mon code


Voici donc ce que je propose :
Oublier la manipulation de signets et rechercher directement dans le texte les chaînes de caractères puis retourner la liste des numéros de pages, tout simplement.
Il suffit alors, pour insérer les numéro de pages de Paul DUPOND, d'écrire <<Paul DUPOND>> à l'endroit où ils doivent apparaître. Et c'est tout !

Il faut tout de même que "Paul DUPOND" soit toujours écrit ainsi, on est insensible à la casse à priori, mais on ne peut pas mettre "DUPOND Paul".
Mais cela dit, on peut tout de même succéder les deux balises ainsi <<Paul DUPOND>>, <<DUPOND Paul>> afin de récupérer tous les numéros de pages des deux formes !

En PHP, il ne me reste donc qu'à générer mes pages en brut, et insérer les petites balises spéciales ! L'utilisateur lancera la routine quand il sera prêt à lancer l'impression de son document (pas avant, les numéros de pages ne sont pas dynamique, pas plus que dans la solution de ACut).

Vous me direz "mais si deux personnes ont le même nom?" et Bien je dirais que le problème n'est plus seulement technique, mais informationnel, il faudra bien les différencier dans tous les cas, ces deux personnes. On peut suggérer d'utiliser un numéro en indice par exemple (Paul DUPOND1 et Paul DUPOND2), car cela reste un cas particulier, le script s'y retrouvera et le lecteur également.

Assez parlé, voici le code (à télécharger), à insérer au format js dans le répertoire Scripts (pour CS3, [C]:/Document And Settings/[utilisateur]/Application Data/Adobe/InDesign/Version 5.0/Scripts/Scripts Panel)

2 commentaires:

Ben a dit…

et bien et bien, tu te mets à faire du dev? je vais bientôt me retrouver au chômage :)

Matthieu Riffault a dit…

Oh non, tu seras toujours mon maître là dessus :) En fait je n'aime vraiment pas le développement à ce niveau, c'est beaucoup trop compliqué. En fait j'ai perdu beaucoup de temps à essayer de remplacer les signets de la méthode d'ACut par un attribut XML, et après une bonne demi-journée (perdue) à ne pas comprendre comment interpréter le XML du document actif, j'ai choisis une autre méthode (plus facile, mais moins puissante).
Je trouve que le Javascript est déjà compliqué sur le Web, mais lorsqu'il est mêlé aux Objets propres à une application telle qu'InDesign, là c'est la mort !