Détecter les enrichissements ponctuels sous ID CS4
May 10, 2010 | Snippets | fr | en

Le Document Object Model d'InDesign CS4 a introduit une très obscure propriété, TextPreference.enableStylePreviewMode, qui déclenche le signalement circonstancié de tous les « remplacements de styles » (de paragraphe et de caractères) sous la forme de biffures ou de barres verticales rouges (voir capture ci-dessus). Pourtant, après des heures d'investigation, je n'ai pas réussi à accéder à cette option d'affichage depuis l'interface d'InDesign CS4. Peut-être bien que je me trompe, mais jusqu'à plus ample informé cette fonctionnalité semble uniquement accessible par les voies du scripting. (Si je suis passé à côté d'une évidence, dépêchez-vous de poster un commentaire pour me ridiculiser !)
Quoi qu'il en soit, je trouve cette option fabuleuse. D'ordinaire, on détecte les formatages locaux en sélectionnant un bout de texte et en regardant dans la palette Styles de paragraphe (ou Styles de caractère) si le nom du style est suivi d'un signe +. Si c'est le cas, on en déduit que la mise en forme du texte contrevient localement aux règles enregistrées dans le style correspondant. (Pour plus de précisions sur ces questions, consultez la rubrique « Remplacement de styles de caractère et de paragraphe » dans l'aide en ligne d'InDesign CS4.) Reste que cette approche est impraticable quand on souhaite dresser un bilan général des écarts de style, notamment à la suite d'une importation depuis Word ou d'une opération similaire.
À noter qu'il est possible d'inclure la détection des remplacements de style dans un profil de contrôle en amont, mais cela me paraît bien lourd pour un usage quotidien.
Le script
ShowHideLocalFormatting.js est le script le plus court que j'aie jamais écrit. Il se contente de basculer entre le mode d'affichage habituel et notre option enrichie en marqueurs rouges :
if ( app.documents.length && app.activeDocument.textPreferences.enableStylePreviewMode^= 1 && app.layoutWindows.length && app.activeWindow.constructor==LayoutWindow ) { app.activeWindow.screenMode = ScreenModeOptions.previewOff; // MAJ 25/05/10 - Merci ptruskier app.activeWindow.overprintPreview = false; }
Le code ci-dessus contient quelques instructions d'appoint qui ne doivent pas vous aveugler. En fait, la seule ligne digne d'intérêt est ici :
app.activeDocument.textPreferences.enableStylePreviewMode^= 1;
Elle commute la valeur de enableStylePreviewMode, ce qui fait que le script fonctionne comme un interrupteur on/off.
Voici le genre de résultat que nous obtenons :
S'il se confirme que cette option d'affichage est inatteignable depuis l'interface d'InDesign CS4, je vous encourage à créer un raccourci privilégié pour lancer ce script. Il pourrait vous rendre d'appréciables services.

Comments
Bonjour Marc,
Il est "marrant" ce script ! En tout cas, je le vois déjà parmi mes scripts utilisés au quotidien.
Bref "Un petit script pour Marc, un grand pas pour les indesigners" !
Merci
Merci Laurent.
Le plus étonnant de l'histoire, c'est qu'apparemment on ne trouve pas ce truc directement dans ID ! (Mais j'attends les autres commentaires pour confirmer.) La seule chose dont je sois sûr, c'est que l'attribut utilisé dans mon script n'existait pas avant CS4.
@+
Marc
Pas mal du tout !!!!!
Ben alors, mes commentaires se barrent maintenant ! J'ai pas dû appuyer sur envoyer :-\
Bref, je disais bravo pour le script, son utilité, la concision de l'écriture et la belle exploration du DOM.
Je te questionnais aussi sur la signification du ^= .
A+ Loic
Merci à tous deux.
@Loic
Le ^ (accent circonflexe) correspond à l'opérateur XOR. Quand tu fais un "XOR 1" sur un booléen, en JavaScript, cela commute la valeur. Plus exactement, JS transtype TRUE en 1 (ou FALSE en 0) et fait l'opération, c-à-d que l'on a respectivement :
TRUE ^ 1 === 0
FALSE ^ 1 === 1
Ensuite, l'écriture ^= est un code condensé qui fonctionne de la même façon que +=. Autrement dit, une instruction de la forme :
X ^= Y;
signifie:
X = X ^ Y;
Par conséquent, si B est un booléen, le code :
B ^= 1;
revient à affecter à B son complémentaire logique exprimé sous la forme 0 ou 1.
Par chance, la propriété "enableStylePreviewMode" que j'ai besoin de switcher accepte de recevoir 0 ou 1 (en lieu de FALSE ou TRUE), donc l'opération :
(...).enableStylePreviewMode ^= 1;
inverse effectivement la valeur de la propriété.
Pourquoi un détour si compliqué ? Pour éviter d'écrire :
(...).enableStylePreviewMode = !(...).enableStylePreviewMode;
ce qui solliciterait deux fois le DOM en parcourant à deux reprises la chaîne prototypée app.activeDocument.textPreferences.enableStylePreviewMode.
Il faut garder à l'esprit que chaque fois qu'on navigue dans le proto d'un objet, on perd du temps. Accessoirement, l'écriture obtenue est beaucoup plus compacte, sans réclamer l'introduction d'une variable.
@+
Marc
what a lovely Script Marc!
I have just tested it in CS5 as well, and it seems to work OK in that version too.
I've added a blog-post to my website about your script. Thank you so much for another great script!
Je te remercie Marc pour l'explication.
Mes collègues ingénieurs m'ont expliqué cela aussi :-)
Deux fois, Marc, pas deux foix :-)
C'est la seule chose que je pige dans tes explications… cela ne va pas loin, je te le concède :-)
@ Cari
Thanks a lot, this is good news for CS5 users. The link: http://carijansen.com/2010/05/10/st...
@ Jean-Christophe
> C'est la seule chose que je pige dans tes explications [...]
Ouix! Maix qu'est-ce que je feraix sans ton oeil de lynx? (Coquille corrigée, merci.)
Très pratique au quotidien.
Merci pour ce script.
Marc,
Nice discovery. It's not unusual for script methods or properties not to have a UI equivalent. There are even keyboard shortcuts that don't have menu entries: recompose all stories (Ctrl+Alt+/) close all documents (Shift+Ctrl+Alt+W), save all documents (Shift+Ctrl+Alt+S), and probably some more.
Thanks also for the ^ exposé -- didn't know about that one and it looks very useful.
Peter
Wow! Awesome script. Just what I need! Thank you so much!
Thanks all.
@Peter
Wow, cool shortcuts! I never knew you could close all documents with the keyboard.
> It's not unusual for script methods or properties
> not to have a UI equivalent.
Yes. In this chapter we also could mention the “InDesign script for Balance Ragged Lines” by Keith Gilbert: http://bit.ly/6TwhKE
I would like to make a compilation of these "under the hood" features...
And all the right-to-left stuff of course.
>I would like to make a compilation of these "under the hood" features...
Don't let anybody stop you ;)
@Marc: very cool!
One additional feature "under the hood": different column gap widths on one single page by manipulating the marginPreferences.columnsPositions-array.
Thanks! This is a terrific finding. I only wish it also worked in CS3. Note that in addition to turning preview mode off, you must also ensure that Overprint Preview is turned off.
Hi Mark how are you doing?
It is a very useful script thanks a lot.
I'll mention it in my blog, if you don't mind?
@ ptruskier
> you must also ensure that Overprint Preview
> is turned off.
You are perfectly right! I've updated the code. Thanks for your comment.
@ Mohammed
> I'll mention it in my blog...
Thank you too ;-)
Direct link to the thread: http://indesignyat.webatu.com/?p=20...
very cool finding!
maybe there is no ui equivalent because of some bugs in the feature? probably only adobe knows.
anyway my first testing worked perfect.
Marc,
Here is another unknown feature: watermarks:
http://www.indesign-faq.de/de/wasse...
Peter
Salut Marc
très pratique en effet,
Peux-tu dire si il est possible de changer la couleur de biffure que ton script active ? ou est-ce encore un mystère des ingénieur d'Adobe ?
++
Pas possible à ma connaissance. Les voies de l'ingénieur (Adobe) sont impénétrables ;-)
Thank you so much.
it´s just the one I was looking for.
works perfect in CS5