- Ordinateurs et électronique
- Logiciel
- Logiciel de publication assistée par ordinateur
- Adobe
- InCopy CS6
- Mode d'emploi
▼
Scroll to page 2
of
107
ADOBE® INCOPY® CS6 GUIDE DES SCRIPTS D’ADOBE INCOPY CS6 : VBSCRIPT © 2012 Adobe Systems Incorporated. Tous droits réservés. Guide des scripts d’Adobe® InCopy® CS6 : VBScript Statut de mise à jour du document (pour l’intégralité du document ; voir chaque chapitre pour obtenir individuellement le statut de mise à jour de chaque chapitre) CS6 Mis à jour Dans tout le document, CS5 est remplacé par CS6 et version 7.0 par version 8.0. Si ce guide est distribué avec un logiciel comprenant un accord avec l’utilisateur final, ce guide, ainsi que le logiciel qu’il décrit, sont fournis sous licence et ne peuvent être utilisés ou copiés qu’en accord avec les termes de cette licence. Sauf autorisation spécifiée dans la licence, aucune partie de ce guide ne peut être reproduite, enregistrée ou transmise sous quelque forme que ce soit, par quelque moyen que ce soit, électronique, mécanique ou autre, sans l’autorisation écrite préalable d’Adobe Systems Incorporated. Veuillez noter que le contenu de ce guide est protégé par des droits d’auteur, même s’il n’est pas distribué avec un logiciel accompagné d’un contrat de licence pour l’utilisateur final. Les informations contenues dans ce document sont données à titre purement indicatif. Elles peuvent être modifiées sans préavis et ne constituent pas un engagement de la part d’Adobe Systems Incorporated. Adobe Systems Incorporated ne peut être tenu pour responsable des erreurs ou des inexactitudes apparaissant dans les informations fournies par ce guide. Nous attirons votre attention sur le fait que les illustrations ou images que vous pouvez être amené à incorporer à vos projets peuvent être protégées par des droits d’auteur, auquel cas leur exploitation sans l’autorisation de l’auteur constituerait une violation de ces droits. Veillez à obtenir toutes les autorisations requises de la part des auteurs. Toutes les références à des noms de société dans les modèles cités en exemple sont indiquées uniquement à des fins de démonstration et ne se réfèrent à aucune organisation existante. Adobe, le logo Adobe, Creative Suite, InCopy, InDesign, Illustrator et Photoshop sont des marques ou des marques déposées d’Adobe Systems Incorporated aux Etats-Unis et/ou dans d’autres pays. Microsoft et Windows sont des marques ou des marques déposées de Microsoft Corporation aux Etats-Unis et dans d’autres pays. Apple et Mac OS sont des marques d’Apple Computer, Incorporated, déposées aux Etats-Unis et dans d’autres pays. Toutes les autres marques citées sont la propriété de leurs détenteurs respectifs. Adobe Systems Incorporated, 345 Park Avenue, San Jose, Californie 95110, Etats-Unis. Avertissement à l’attention des utilisateurs finaux du gouvernement des Etats-Unis. Le logiciel et la documentation sont des articles commerciaux, (« Commercial Items »), selon la définition de ce terme dans l’article 48 C.F.R. §2.101, composés d’un logiciel commercial (« Commercial Computer Software ») et d’une documentation commerciale relative au logiciel (« Commercial Computer Software Documentation ») selon la définition de ces termes dans l’article 48 C.F.R. §12.212 ou 48 C.F.R. §227.7202, selon le cas. Conformément aux articles 48 C.F.R. §12.212 ou 48 C.F.R. §§227.7202-1 à 227.7202-4, selon le cas, le logiciel commercial et la documentation commerciale relative au logiciel sont cédés sous licence aux utilisateurs du gouvernement des Etats-Unis (a) en tant qu’articles commerciaux uniquement et (b) avec les seuls droits conférés à tout autre utilisateur final tenu par les termes et conditions stipulés ici. Droits non publiés réservés en vertu de la législation américaine sur les droits d’auteurs. Adobe Systems Incorporated, 345 Park Avenue, San Jose, CA 95110-2704, Etats-Unis. Pour les utilisateurs finaux du gouvernement des Etats-Unis, Adobe s’engage à respecter toutes les lois sur l’égalité des chances, y compris, le cas échéant, les dispositions du décret-loi (Executive Order) 11246, tel qu’amendé, la section 402 de l’Acte d’assistance à la réhabilitation des vétérans du Vietnam (the Vietnam Era Veterans Readjustment Assistance Act) de 1974 (38 USC 4212) et la section 503 de l’Acte de réhabilitation (Rehabilitation Act) de 1973, tel qu’amendé, ainsi que les règlements de l’article 41 C.F.R., sections 60-1 à 60-60, 60-250 et 60-741. Les règlements et la clause d’action affirmative contenus dans la phrase précédente doivent être inclus comme référence. Sommaire 1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Utilisation des scripts de ce document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 A propos de la structure des scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Pour plus de détails . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 A propos d’InCopy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Relations entre les fichiers InCopy et InDesign . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Articles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Géométrie de la page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Métadonnées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Modèle de document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Différences au niveau de l’interface utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Conception et architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2 Prise en main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Installation des scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Exécution de scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Utilisation du panneau Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Informations relatives au langage VBScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Utilisation des scripts de ce document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Votre premier script InCopy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Analyse du script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Terminologie des scripts et modèle d’objet InCopy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Terminologie des scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Présentation du modèle d’objet InDesign et InCopy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mesures et positionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 15 18 24 Ajout de caractéristiques à « Hello World » . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3 Fonctions de scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Préférences des scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Obtention du script en cours . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Versionnage des scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ciblage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Compilation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Interprétation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 29 29 30 Utilisation de la méthode DoScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Envoi de paramètres à l’objet DoScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Renvoi des valeurs de l’objet DoScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Exécution des scripts au lancement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3 Sommaire 4 4 Texte et saisie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Saisie et importation de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Articles et blocs de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ajout d’un texte à un article . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Remplacement de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Insertion de caractères spéciaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 32 33 33 34 Importation de texte et définition des préférences d’importation de texte . . . . . . . . . . . . . . . . . . . . 34 Exportation de texte et définition des préférences d’exportation de texte . . . . . . . . . . . . . . . . . . . . . 37 Objets texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sélections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Déplacement et copie de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objets texte et itération . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 42 42 44 Mise en forme du texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Définition des valeurs par défaut du texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Polices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Application d’une police . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Modification des propriétés d’un texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Modification de la couleur du texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Création et application des styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Suppression d’un style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Importation de styles de paragraphe et de caractère . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 45 48 48 49 49 50 52 52 Recherche et modification de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Préférences de recherche/modification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Recherche de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Recherche et remplacement d’une mise en forme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Utilisation de l’outil Grep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Recherche de glyphes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 53 53 54 55 57 Tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Correction automatique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Notes de bas de page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 5 Interfaces utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Présentation des boîtes de dialogue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Votre première boîte de dialogue InCopy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 Ajout d’une interface utilisateur à « Hello World » . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 Création d’une interface utilisateur plus complexe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 Utilisation de ScriptUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 Création d’une barre de progression avec ScriptUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 Création d’un panneau avec barre de boutons au moyen de ScriptUI . . . . . . . . . . . . . . . . . 68 Sommaire 5 6 Menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 Présentation du modèle de menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 Localisation et noms de menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Exécution d’une action de menu à partir d’un script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Ajout de menus et d’éléments de menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Menus et événements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Utilisation des objets d’action de menu de script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 7 Evénements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Présentation du modèle de scripts d’événements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 A propos des propriétés des événements et de la propagation des événements . . . . . . 79 Utilisation des objets eventListeners . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Exemple d’objet eventListener « afterNew » . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 8 Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Saisie et importation d’une note . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Ajout d’une note à un article . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Remplacement du texte d’une note . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Conversion de notes et de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Conversion d’une note en texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Conversion d’un texte en note . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Développement et réduction de notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Réduction d’une note . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Développement d’une note . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Suppression d’une note . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 Navigation entre les notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Accès à la première note d’un article . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Accès à la note suivante d’un article . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Accès à la note précédente d’un article . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Accès à la dernière note d’un article . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 86 86 86 86 87 Suivi des modifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Suivi des modifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Navigation entre les modifications suivies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Acceptation et rejet des modifications suivies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Informations sur les modifications faisant l’objet d’un suivi . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 88 89 89 Préférences en matière de suivi des modifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 Sommaire 6 10 Affectations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 Objet affectation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ouverture des fichiers d’affectation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Itérations dans les propriétés d’affectation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Assemblages d’affectation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 93 93 94 Article d’affectation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Objet article affecté . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Itérations dans les propriétés de l’article affecté . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 11 XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 Meilleure méthode appliquée aux scripts XML dans InCopy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 Codage des éléments XML à l’aide des scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Configuration des préférences XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Configuration des préférences d’importation du format XML . . . . . . . . . . . . . . . . . . . . . . . . . 97 Importation du format XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 Création d’une balise XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 Chargement des balises XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Enregistrement des balises XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Création d’un élément XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Déplacement d’un élément XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Suppression d’un élément XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Duplication d’un élément XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 Retrait d’éléments de la structure XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 Création d’un commentaire XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 Création d’une instruction de traitement XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 Utilisation des attributs XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 Utilisation des articles XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Exportation du format XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Ajout d’éléments XML à un article . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Association d’éléments XML à du texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Application des styles aux éléments XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 Utilisation des tableaux XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 1 Introduction Statut de mise à jour du chapitre CS6 Inchangé Ce document décrit les opérations suivantes : X Utilisation de l’environnement de création de scripts Adobe® InCopy® X Utilisation des fonctions avancées de création de scripts X Utilisation et saisie de texte dans un document InCopy, notamment recherche et modification de texte X Création de boîtes de dialogue et autres éléments d’interface utilisateur X Personnalisation et ajout de menus et création d’actions de menu X Réponse aux événements de l’interface utilisateur X Utilisation du langage XML, de la création d’éléments XML et l’importation de données XML à l’ajout d’éléments XML à une mise en page Utilisation des scripts de ce document La plupart des scripts présentés dans ce document sont seulement des extraits de script, pas des scripts entiers. Ils ont pour unique vocation d’illustrer la partie spécifique d’un script correspondant au thème abordé dans le texte. Vous pouvez copier les lignes de script présentées dans ce document et les coller dans votre éditeur de scripts ; vous devez toutefois être bien conscient que certains ajustements seront nécessaires pour que le script puisse fonctionner. En outre, sachez que les scripts copiés à partir de ce document peuvent contenir des sauts de ligne et autres caractères (provenant de la mise en page du document) susceptibles d’entraîner des erreurs dans vos scripts. Tous les scripts présentés dans ce document sont regroupés dans une archive zip, accessible depuis la page d’accueil des scripts InCopy, à l’adresse suivante : http://www.adobe.com/products/InCopy/scripting/index.html. Après avoir téléchargé et décompressé l’archive, déplacez les dossiers correspondant au(x) langage(s) de script de votre choix dans le dossier Scripts Panel du dossier Scripts, situé dans le dossier de l’application InCopy. Vous pouvez alors exécuter les scripts à partir du panneau Scripts de votre application InCopy. A propos de la structure des scripts Les exemples de script sont tous écrits à l’aide d’un modèle commun incluant les fonctions « main », « mySetup », « mySnippet » et « myTeardown ». Nous avons choisi de procéder ainsi afin de simplifier les tests automatisés et la publication ; cette méthode n’est pas justifiée pour la construction de vos scripts. En général, la partie du script qui vous intéressera se trouvera dans la fonction « mySnippet ». 7 CHAPITRE 1: Introduction Pour plus de détails 8 Pour plus de détails Vous trouverez plus de détails sur la création de scripts InCopy sur le forum des utilisateurs consacré aux scripts InCopy (en anglais), à l’adresse suivante : http://www.adobeforums.com. Dans ce forum, les créateurs de scripts peuvent poser des questions, envoyer des réponses et partager leurs dernières compositions. Le forum contient plusieurs centaines d’exemples de scripts. A propos d’InCopy InCopy est une application d’édition de texte collaborative développée pour une utilisation conjointe avec Adobe InDesign®. InCopy vous permet d’effectuer le suivi des modifications, d’ajouter des notes d’édition et d’adapter le texte à l’espace qui lui est réservé. InCopy utilise le même moteur de composition du texte qu’InDesign, c’est pourquoi ces deux applications ajustent la copie dans une page avec une composition identique. InCopy est destinée à l’environnement d’édition. Cette application permet aux divers participants du flux de travail éditorial de collaborer à la création de magazines, journaux et publications d’entreprises, en favorisant l’édition simultanée du texte et de la mise en page. Elle est principalement utilisée par les éditeurs, rédacteurs, correcteurs, réviseurs et autres intervenants. InCopy partage de nombreux panneaux et palettes avec InDesign, mais propose également ses propres éléments d’interface utilisateur. Relations entre les fichiers InCopy et InDesign Les relations entre les fichiers InDesign et InCopy sont importantes en raison de la répartition du travail au sein du flux de travail de publication qui se produit lorsque les mêmes éléments sont ouverts et modifiés dans les deux applications. Il existe deux scénarios courants d’exportation à partir d’InCopy : X Vous pouvez exporter un fichier ICML (basé sur IDML). X Vous pouvez exporter un fichier INCX (basé sur INX). Il existe deux scénarios courants d’exportation à partir d’InDesign qui font appel à InCopy : X Les articles exportés à partir d’InDesign en tant que fichiers InCopy sont des fichiers ou des flux XML ; les modules externes InCopyExport et InCopyWorkflow chargés dans InDesign proposent cette fonction. Cette approche comporte certaines implications d’ordre pratique : les fichiers InCopy sont beaucoup plus petits, ils transitent plus rapidement sur les réseaux, ils ne contiennent pas de géométrie de page, et les données des fichiers/flux XML peuvent être utilisées sans InDesign/InCopy (pour les moteurs de recherche, outils de base de données, etc.). X Les groupes à l’intérieur d’un article (titre, auteur, copie, graphiques ou légendes) peuvent également être exportés. InDesign et Incopy prennent en charge la création de groupes avec les fichiers d’affectation, qui permettent de gérer les fichiers en ajoutant un fichier supplémentaire utilisé pour le suivi des autres fichiers. Une affectation regroupe plusieurs fichiers dont les contenus sont attribués à une seule personne en vue d’une tâche précise : copie, édition, mise en page et/ou rédaction, par exemple. Les articles figurant dans une affectation sont exportés sous la forme de fichiers InCopy. Les informations relatives à la géométrie et les relations entre les fichiers sont incluses dans le fichier d’affectation. InDesign permet à l’utilisateur d’exporter un ensemble d’articles spécifique à l’aide d’une affectation. InCopy ouvre tous les articles situés dans une affectation (sous la forme d’une seule unité). Pour plus de détails, voir le Chapitre 10, « Affectations ». CHAPITRE 1: Introduction Relations entre les fichiers InCopy et InDesign 9 Articles Chaque fichier InCopy constitue un article. Un document InDesign contient plusieurs articles modulables en fonction du nombre de documents InCopy, via le processus d’exportation. Ces articles InDesign exportés contiennent un lien accessible dans le panneau Liens (InDesign) ou dans le panneau Affectations en tant que fichiers d’affectation (InCopy). InCopy ne conserve pas le lien au document InDesign auquel il est associé (s’il en existe un). InDesign conserve les liens avec les fichiers InCopy en tant que liens bidirectionnels. Les articles peuvent être structurés en langage XML. Ceci signifie que des données XML peuvent contenir d’autres données XML. Cette fonction peut servir à concevoir une structure de données dans laquelle le texte brut d’un article est englobé dans une structure externe contenant des données spécifiques à InCopy (les styles, par exemple). Dans InCopy, vous pouvez enregistrer le contenu au format ICML/INCX ou, si l’article possède une structure, la structure logique peut être exportée au format XML. Un fichier ICML ou INCX peut contenir à la fois des données et du texte balisé InCopy. Si le fichier est exporté sous forme de données XML, les données spécifiques à InCopy sont supprimées. Il ne reste alors que le contenu balisé moins les informations relatives au style. Géométrie de la page Les fichiers InCopy ne contiennent pas de géométrie de page. Si la géométrie est requise, elle doit être obtenue à partir du document InDesign. InCopy peut ouvrir des documents InDesign et extraire les informations de conception et les liens vers les articles exportés. Lorsque la géométrie de page est souhaitée dans InCopy, les fichiers d’affectation peuvent également être fournis. Métadonnées La plate-forme XMP (Extensible Metadata Platform) d’Adobe propose une méthode pratique pour créer, échanger et gérer les métadonnées. Les fichiers InCopy prennent en charge XMP. Tout comme InDesign propose la commande Fichier > Informations pour afficher les données XMP, InCopy propose la commande Fichier > Informations sur le fichier. Les intégrateurs de systèmes peuvent conserver ces données ou les éliminer lors de l’exportation. Les métadonnées ajoutées aux articles par les développeurs de logiciels tiers sont conservées lorsqu’elles sont intégrées à des documents InDesign. Vous pouvez visualiser les métadonnées ajoutées dans InDesign (panneau Liens, boîte de dialogue Informations) ou InCopy. Par ailleurs, les développeurs de logiciels tiers peuvent ajouter des fonctionnalités à InDesign de manière à afficher ces métadonnées dans une interface utilisateur personnalisée. Un point d’extension permet aux prestataires de services d’ajouter du contenu de métadonnées aux fichiers InCopy. Pour plus de détails, voir le Chapitre 11, « XML ». CHAPITRE 1: Introduction Conception et architecture 10 Modèle de document Les documents InDesign sont à la base de tout le contenu InDesign. InCopy aussi utilise les documents InDesign, mais il ne s’agit pas du type par défaut. Dans InDesign et InCopy, le document de base est toujours une base de données. Toutefois, dans InCopy ce document peut être incomplet. Dans InDesign, le document principal type est un fichier InDesign ouvert, mais il peut également s’agir d’un fichier INX ou IDML ouvert, qui se révèle généralement être un document InDesign non enregistré. InCopy possède d’autres permutations. Il existe le fichier InDesign de base, ainsi qu’un nouveau document comportant un article InCopy (ou du texte brut ou RTF) importé. De même, il existe les fichiers d’affectation IDML et INX qui possèdent une partie d’un fichier InDesign stockée dans un fichier XML. Le modèle de document InDesign/InCopy correspond à l’ensemble de modules externes du modèle de base requis, dont la version évolue en fonction des modifications dans le temps. Il est important que tous les scripts IDML/INX fonctionnent à la fois dans InDesign et InCopy afin que les documents puissent être déplacés d’une application à l’autre tout en étant fidèlement restitués. Différences au niveau de l’interface utilisateur InDesign et InCopy ont de nombreux panneaux en commun, mais InCopy dispose d’un affichage plus petit et possède plusieurs barres d’outils supplémentaires le long des bordures supérieure, inférieure et gauche. Vous pouvez ancrer la plupart des panneaux InCopy sur ces barres pour les rendre visibles en toutes circonstances, mais avec une taille plus petite. InCopy dispose d’une fenêtre personnalisée à plusieurs vues, dans une fenêtre principale ayant trois onglets : Mode Epreuve en placard, Mode Article et Mode Mise en page. Le Mode Mise en page est le mode d’affichage principal d’InDesign. Les modes Epreuve en placard et Article font partie du mode éditeur, avec et sans fins de lignes exactes, respectivement. Conception et architecture Relation article/fichier Le format ICML est la représentation IDML d’un article InCopy. Il représente la future direction d’InDesign/InCopy et constitue un choix judicieux si vous devez modifier un fichier en dehors d’InDesign. Format ICML Chaque fichier ou flux InCopy utilise le langage XML. Ceci permet de facilement analyser les fichiers InCopy et de les ouvrir dans n’importe quel éditeur de texte. Format INCX Le format INCX est la représentation INX d’un article InCopy. Ce format n’est pas aussi convivial que le format ICML, mais il prend en charge les flux de travail INCX. CHAPITRE 1: Introduction Conception et architecture 11 Opérations sur un document InCopy fournit des implémentations par défaut des opérations exécutées sur les documents (actions sur les fichiers), comme Nouveau, Enregistrer, Enregistrer sous, Enregistrer une copie, Ouvrir, Fermer, Version précédente et Mettre à jour la maquette. Toutes ces actions exécutables sur les fichiers InCopy sont situées dans un seul module externe (InCopyFileActions) sous la forme d’un code source. Les développeurs de logiciels ou les intégrateurs de systèmes sont supposés le remplacer par leurs propres implémentations afin de personnaliser l’interaction pour leur système de flux de travail. Utilisation des métadonnées XMP Les utilisateurs peuvent saisir ou modifier des métadonnées en sélectionnant Fichier > Informations sur le fichier. Ces métadonnées sont enregistrées dans le fichier InCopy. Les développeurs de logiciels et les intégrateurs de systèmes peuvent créer et stocker leurs propres métadonnées à l’aide du SDK XMP. 2 Prise en main Statut de mise à jour du chapitre CS6 Mis à jour Références à CS5 supprimées ou modifiées. Les scripts représentent la fonction la plus puissante d’Adobe® InCopy®. Aucune autre fonction (outil, panneau ou boîte de dialogue visible sur l’interface utilisateur du programme) n’est aussi rapide, facile et économique que le script. Le présent document s’adresse à tous les utilisateurs d’InCopy. Si vous n’avez jamais créé de script, ce document vous aidera à commencer. Si vous avez déjà créé des scripts pour d’autres applications, vous apprendrez à appliquer vos connaissances aux scripts InCopy. Ce document traite également de l’installation et de l’exécution d’un script InCopy, ainsi que des capacités et limites des scripts InCopy. Vous y trouverez aussi des indications sur les logiciels dont vous avez besoin pour commencer à écrire vos propres scripts. A l’aide des scripts, vous pouvez reproduire la plupart des opérations que vous exécutez dans l’interface utilisateur InCopy. Vous pouvez entrer du texte et le mettre en forme, rechercher et modifier du texte, ajouter des notes et imprimer ou exporter les pages du document. Toute opération apportant une modification au document ou à son contenu peut être réalisée à l’aide d’un script. Les scripts vous permettent même d’exécuter certaines opérations qui ne sont pas réalisables avec l’interface utilisateur. Les scripts permettent de créer des menus, d’ajouter des éléments de menu, de créer et d’afficher des boîtes de dialogue et des panneaux, mais également de répondre aux sélections de l’interface utilisateur. Ils peuvent lire et écrire des fichiers texte, analyser des données XML et communiquer avec d’autres applications. Les scripts permettent d’effectuer toutes sortes de tâches, des plus simples (telles que la définition d’un taquet de tabulation à l’emplacement du pointeur de texte) aux plus complexes, comme la définition d’un ensemble complet de fonctions. Vous pouvez commencer avec des scripts simples qui n’exécutent qu’une action, puis passer aux scripts qui automatisent le flux de travail de publication tout entier. Les tâches que vous ne pouvez pas exécuter à l’aide de scripts, telles que la définition d’un espace de travail ou d’un ensemble de raccourcis clavier, sont associées à l’interface utilisateur. En outre, les scripts ne permettent pas d’ajouter de nouveaux types d’objets à un document InCopy ni d’ajouter une nouvelle fonctionnalité de base au programme, telle qu’un moteur de composition de texte. Pour ce type d’extension, vous devez avoir recours au kit SDK (Software Developer’s Kit) d’InCopy, qui vous indique comment écrire des modules externes compilés à l’aide du langage C++. Ce document traite d’Adobe InDesign® et d’InCopy, car InCopy est quasiment toujours utilisé en association avec des documents InDesign. En outre, la création de scripts InDesign est très proche de celle de scripts InCopy. Vous trouverez de plus amples détails sur la création de scripts InDesign dans le Didacticiel de scripts Adobe InDesign et le Guide des scripts d’Adobe InDesign. Installation des scripts Pour installer un script InCopy, il vous suffit de placer le fichier de script dans le dossier Scripts Panel du dossier Scripts, situé dans le dossier de l’application InCopy. Vous pouvez également placer le script dans le dossier Scripts Panel de votre dossier de préférences utilisateur. Vous trouverez le dossier de vos préférences utilisateur à l’emplacement suivant, où <username> correspond à votre nom d’utilisateur et le symbole ~ (tilde) représente le volume système : Windows® XP : C:\Documents and Settings\<username>\Application Data\Adobe\InCopy\ Version 8.0\<locale>\Scripts 12 Prise en main Exécution de scripts 13 Windows® Vista :C:\Users\<username>\App Data\Roaming\Adobe\InCopy\ Version 8.0\<locale>\Scripts Une fois dans le dossier, le script s’affiche dans le panneau Scripts de l’application InCopy (choisissez la commande Fenêtre > Scripts pour afficher ce panneau). Vous pouvez également placer des alias ou des raccourcis de scripts (ou de dossiers contenant des scripts) dans le dossier Scripts Panel. Ils s’afficheront dans le panneau Scripts. Exécution de scripts Pour exécuter un script, vous devez afficher le panneau Scripts (choisissez la commande Fenêtre > Scripts), puis cliquer deux fois sur le nom du script dans le panneau Scripts. De nombreux scripts affichent des éléments d’interface utilisateur (boîtes de dialogue ou panneaux, par exemple), ainsi que des messages d’alerte, si nécessaire. Utilisation du panneau Scripts Le panneau Scripts peut exécuter des AppleScripts (fichiers avec l’extension .spt, .as ou .applescript) compilés ou non, des JavaScripts (fichiers avec l’extension .js ou .jsx), des VBScripts (fichiers avec l’extension .vbs) ou des programmes exécutables à partir de ce panneau. Pour modifier un script affiché dans le panneau Scripts, cliquez deux fois sur le nom du script tout en maintenant la touche Option (Mac OS) ou Alt (Windows) enfoncée. Le script s’ouvre dans l’éditeur défini pour son type de fichier. Pour ouvrir le dossier contenant un script affiché dans le panneau Scripts, cliquez deux fois sur le nom du script tout en maintenant la touche Commande (Mac OS) ou les touches Ctrl+Maj (Windows) enfoncées. Vous pouvez également choisir la commande Faire apparaître dans le Finder (Mac OS) ou Faire apparaître dans l’Explorateur (Windows), dans le menu du panneau Scripts. Le dossier contenant le script s’ouvre dans le Finder (Mac OS) ou l’Explorateur (Windows). Les scripts s’exécutent sous la forme d’une série d’opérations (actions), ce qui signifie que vous pouvez annuler les modifications apportées au document par le script en choisissant la commande Annuler dans le menu Edition. Vous pouvez ainsi dépanner un script, en revenant aux étapes précédentes pour chaque modification. Pour ajouter un raccourci clavier à un script, choisissez la commande Edition > Raccourcis clavier, sélectionnez un ensemble de raccourcis modifiable dans le menu Ensemble, puis sélectionnez l’option Scripts dans le menu Zone du produit. Une liste de scripts apparaît dans le panneau Scripts. Sélectionnez un script, puis affectez-lui un raccourci clavier comme vous le feriez pour n’importe quelle autre fonction d’InCopy. Informations relatives au langage VBScript Les scripts d’apprentissage Visual Basic sont écrits en langage VBScript. Nous avons choisi le langage VBScript, car vous n’avez besoin d’aucun logiciel supplémentaire pour exécuter ou modifier des fichiers VBScript ; vous pouvez les modifier avec n’importe quel éditeur de texte (Bloc-notes, par exemple) et les exécuter à l’aide du panneau Scripts d’InCopy. Les autres versions de Visual Basic incluent Visual Basic 5 Control Creation Edition (CCE), Visual Basic 6, Visual Basic .NET et Visual Basic 2008 Express Edition. Les versions de Visual Basic antérieures à Visual Basic .NET fonctionnent bien avec les scripts InCopy ; la version Visual Basic .NET et les versions plus récentes ne fonctionnent pas aussi bien, car elles n’utilisent pas le type de données Variant, lequel est considérablement utilisé dans les scripts InCopy. De nombreuses applications, comme Microsoft® Word, Microsoft Excel, Microsoft Visio et AutoCAD, contiennent Visual Basic for Applications (VBA). Bien qu’il ne soit pas intégré au programme InCopy, vous pouvez utiliser VBA pour créer des scripts InCopy. Prise en main Utilisation des scripts de ce document 14 Pour utiliser VBScript ou Visual Basic dans les scripts InCopy sous Windows, vous devez installer InCopy depuis le compte d’un utilisateur bénéficiant des droits d’administrateur. Une fois l’installation terminée, n’importe quel utilisateur peut exécuter des scripts InCopy. Les utilisateurs bénéficiant des droits d’administrateur et d’utilisateur avec pouvoirs peuvent ajouter des scripts au panneau Scripts d’InCopy. Utilisation des scripts de ce document Pour utiliser n’importe quel script de ce document, ouvrez le fichier de script d’apprentissage (le nom de fichier figure devant chaque script) ou copiez le code indiqué dans ce chapitre. Les fichiers de script sont stockés dans une archive zip : InCopyCS6ScriptingGuideScripts.zip. Au moment de décompresser l’archive, vous pouvez déplacer le dossier contenant les scripts créés dans le langage de script que vous avez choisi d’utiliser (AppleScript, JavaScript ou VBScript) dans le dossier Scripts Panel. Il est beaucoup plus aisé d’utiliser des fichiers de script que de saisir manuellement les scripts ou de les copier-coller depuis ce document. Si vous n’avez pas accès à l’archive des scripts, vous pouvez saisir le code de script indiqué dans ce chapitre. Pour ce faire : 1. Copiez le script à partir de ce document Adobe PDF et collez-le dans un éditeur de texte (tel que Bloc-notes) ou un éditeur VBScript (tel que VBSEdit). 2. Enregistrez le script dans un fichier de texte brut dans le dossier Scripts Panel (voir la section « Installation des scripts » à la page 12) avec l’extension appropriée : .vbs. 3. Choisissez la commande Fenêtre > Scripts pour afficher le panneau Scripts. 4. Pour exécuter le script, cliquez deux fois sur son nom dans le panneau Scripts. La saisie manuelle de scripts ne fonctionne que pour les scripts présentés dans ce chapitre. Les scripts présentés dans les autres chapitres sont seulement des extraits de script, pas des scripts entiers. Pour les exécuter, vous devez utiliser les scripts contenus dans l’archive de scripts. REMARQUE : si vous copiez et collez des scripts de ce document, soyez conscient que les sauts de ligne provenant de la mise en page du document peuvent entraîner des erreurs dans vos scripts. Ces erreurs pouvant être difficiles à repérer, il est recommandé d’utiliser les scripts dans l’archive zip. Votre premier script InCopy Nous allons maintenant créer un script InCopy pour générer un document, ajouter un bloc de texte et entrer du texte dans ce bloc. Malgré son apparence simple, ce script permet d’effectuer les opérations suivantes : X Etablissement de la communication avec InCopy X Création d’un document X Ajout de texte à un article Lancez un éditeur de texte (Bloc-notes, par exemple), puis saisissez le script suivant (ou ouvrez le script d’apprentissage HelloWorld.vbs : Set myInCopy = CreateObject("InCopy.Application") Set myDocument = myInCopy.Documents.Add Set myStory = myDocument.Stories.Item(1) myStory.Contents = "Hello World!" Prise en main Terminologie des scripts et modèle d’objet InCopy 15 Enregistrez le script dans un fichier de texte brut avec l’extension .vbs dans le dossier Scripts Panel (voir la section « Installation des scripts » à la page 12). Pour exécuter le script, cliquez deux fois sur son nom dans le panneau Scripts d’InDesign. Analyse du script Cette section présente une analyse détaillée du script Hello World. 1. Etablissement de la communication avec l’objet d’application InCopy Set myInCopy = CreateObject("InCopy.Application") 2. Création d’un document et d’une référence au document Set myDocument = myInCopy.Documents.Add 3. Obtention d’une référence au premier article du document (un document autonome contient toujours un article) Set myStory = myDocument.Stories.Item(1) 4. Ajout de texte à l’article en définissant la propriété de contenu sur une chaîne myStory.Contents = "Hello World!" Terminologie des scripts et modèle d’objet InCopy Maintenant que vous avez créé votre premier script InCopy, le moment est venu de vous familiariser avec la terminologie des langages de script en général, et d’InCopy en particulier. Terminologie des scripts Passons tout d’abord en revue quelques termes et concepts utilisés couramment dans la création de scripts. Commentaires Les commentaires permettent d’ajouter un descriptif à un script. Les commentaires sont ignorés pendant l’exécution d’un script (ils ne génèrent donc aucune erreur). Ils permettent de documenter les opérations d’un script (pour mémoire ou pour un autre développeur). Dans ce document, nous utilisons des commentaires pour les scripts d’apprentissage. Pour inclure un commentaire dans un script VBScript, tapez Rem (pour « remarque ») ou ' (guillemet droit simple) à gauche du commentaire. Pour placer une ligne entière en commentaire, insérez le marqueur de commentaire en début de ligne. Par exemple : Rem this is a comment ' and so is this Prise en main Terminologie des scripts et modèle d’objet InCopy 16 Valeurs Le corps d’un caractère de texte, le contenu d’une remarque et le nom de fichier d’un document sont autant d’exemple de valeurs utilisées pour la création de scripts InCopy. Les valeurs sont des données utilisées par un script pendant son exécution. Le type d’une valeur définit quelle sorte de donnée elle contient. Le type de valeur du contenu d’un mot, par exemple, est une chaîne de texte. De même, le type de valeur de l’interligne d’un paragraphe est un nombre. En général, les valeurs utilisées dans un script sont des nombres ou du texte. Le tableau ci-dessous répertorie les types de valeurs les plus couramment utilisées pour la création de scripts InCopy. Type de valeur Nature Exemple Boolean True ou False logique. True Integer Nombres entiers (sans virgule). Les entiers peuvent être positifs ou négatifs. 14 Double Nombre très précis pouvant être décimal. 13.9972 String Série de caractères de texte. Les chaînes de texte sont présentées entre guillemets anglais. "I am a string" Array Liste de valeurs (ces valeurs pouvant être de tout type). Array("0p0", "0p0", "16p4", "20p6") Conversion de valeurs d’un type à un autre Le langage VBScript permet de convertir des valeurs variables d’un type à un autre. Parmi les conversions les plus courantes, citons la conversion de nombres en chaînes de texte (ce qui permet d’entrer des nombres comme texte ou de les afficher dans des boîtes de dialogue) ou la conversion de chaînes de texte en nombres (ce qui permet de définir un corps ou une position de page). Rem To convert from a number to a string: myNumber = 2 myString = cstr(myNumber) Rem To convert from a string to an integer: myString = "2" myNumber = cInt(myString) Rem If your string contains a decimal value, use "cDbl" rather than "cInt": myNumber = cDbl(myString) Variables Une variable est le conteneur d’une valeur. Les variables sont ainsi nommées car les valeurs qu’elles contiennent peuvent changer. Une variable peut contenir un nombre, une chaîne de texte ou une référence à un objet InCopy. Les variables portent un nom. Vous ferez donc référence à une variable par son nom. Pour placer une valeur dans une variable, vous devez l’assigner à cette variable. Dans tous les exemples de scripts et les scripts d’apprentissage accompagnant InCopy, les variables commencent par my. Vous pouvez ainsi différencier facilement les variables créées dans un script des termes du langage de script. Prise en main Terminologie des scripts et modèle d’objet InCopy 17 Affectation d’une valeur à une variable L’affectation de valeurs ou de chaînes de texte à des variables est très simple, comme l’illustrent les exemples suivants : myNumber = 10 myString = "Hello, World!" Set myTextFrame = myDocument.Pages.Item(1).TextFrames.Add Dans la mesure du possible, utilisez des noms évocateurs pour les variables, tels que firstPage ou corporateLogo plutôt que x ou c, par exemple. Votre script sera beaucoup plus lisible. L’utilisation de noms longs n’affecte en rien la vitesse d’exécution du script. Les noms de variables doivent être composés d’un seul mot, mais vous pouvez utiliser les majuscules (pour écrire myFirstPage, par exemple) ou les traits de soulignement (my_first_page) afin de les rendre plus lisibles. Les noms de variables ne peuvent pas commencer par un chiffre, ni contenir des signes de ponctuation ou des guillemets de citation anglais. Variables de tableau de données Un tableau de données (Array) est un conteneur d’une série de valeurs : myArray = Array(1, 2, 3, 4) Rem In Visual Basic.NET: myArray = New Double (1, 2, 3, 4) Pour faire référence à un élément d’un tableau de données, vous devez utiliser son numéro dans le tableau. En VBScript, le premier élément d’un tableau est l’élément 0 : myFirstArrayItem = myArray(0) REMARQUE : vous pouvez utiliser l’instruction OptionBase de Visual Basic pour attribuer le numéro 1 au premier élément d’un tableau de données. Dans les exemples de ce manuel, le premier élément d’un tableau est le numéro 0 et non pas le numéro 1. Il s’agit de l’option par défaut. Si vous avez choisi 1 pour OptionBase, vous devrez ajuster toutes les références des tableaux de données en conséquence dans les exemples de scripts. Un tableau de données peut en contenir un autre, comme dans les exemples ci-dessous : myArray = Array(Array(0,0), Array(72, 72)) Rem In Visual Basic.NET: myArray = New Array(New Double(0,0), NewDouble (0,0)) Détermination du type de valeur d’une variable Parfois, un script doit prendre des décisions en fonction du type de valeur d’un objet. Si vous travaillez sur un script opérant sur une sélection de texte, par exemple, vous devrez peut-être définir l’arrêt du script si aucune sélection n’est effectuée. Rem Given a variable of unknown type, "myMysteryVariable"... myType = TypeName(myMysteryVariable) Rem myType will be a string corresponding to the variable type (e.g., "Rectangle") Prise en main Terminologie des scripts et modèle d’objet InCopy 18 Opérateurs Les opérateurs utilisent des variables ou des valeurs pour exécuter des calculs (addition, soustraction, multiplication et division) et renvoyer une valeur. Par exemple : MyWidth/2 renvoie une valeur égale à la moitié du contenu de la variable myWidth. Vous pouvez également utiliser des opérateurs pour effectuer des comparaisons (est égal à (=), est différent de (<>), est supérieur à (>) ou est inférieur à (<)). Par exemple : MyWidth > myHeight renvoie la valeur « true » (ou 1) si myWidth est supérieur à myHeight, ou « false » (0) si ce n’est pas le cas. En VBScript, utilisez l’opérateur & pour concaténer (ou joindre) deux chaînes. Par exemple : "Pride " & "and Prejudice" renvoie la chaîne de texte : "Pride and Prejudice" Instructions conditionnelles « Si la taille du texte sélectionné est de 12 points, définissez le corps sur 10 points ». Il s’agit d’un exemple d’instruction conditionnelle. Les instructions conditionnelles permettent au script d’évaluer des conditions (telles que la couleur du texte sélectionné, le nombre de pages du document ou la date) et d’agir en fonction du résultat. La plupart des instructions conditionnelles commencent par if. Structures de contrôle Si vous pouviez parler à InCopy, vous pourriez lui dire notamment « Répète vingt fois la procédure suivante. ». En terminologie des scripts, cette instruction est appelée structure de contrôle. Les structures de contrôle gèrent les processus répétitifs ou boucles. Une boucle répète une action continuellement, avec ou sans changement entre les instances (ou itérations) de la boucle, jusqu’à ce qu’une condition spécifique soit remplie. Les structures de contrôle commencent généralement par for. Fonctions Les fonctions sont des modules auxquels vous pouvez faire référence dans un script. Généralement, vous envoyez une valeur ou une série de valeurs à une fonction et obtenez une ou plusieurs autres valeurs. Rien de particulier à mentionner sur le code utilisé dans les fonctions (elles ont été créées pour vous éviter de saisir les mêmes lignes de code de façon répétée dans un script). Les fonctions commencent par function. Présentation du modèle d’objet InDesign et InCopy Lorsque vous pensez aux documents InCopy et InDesign, vous organisez certainement les programmes et leurs composants dans votre esprit. Vous savez que les paragraphes sont contenus dans des blocs de texte qui à leur tour apparaissent sur une page, qu’une page fait partie d’une planche, et que plusieurs planches composent un document. Les documents contiennent des couleurs, des styles, des calques et des planches types. Lorsque vous considérez les objets dans les documents que vous créez, vous pensez intuitivement à leur ordre. Prise en main Terminologie des scripts et modèle d’objet InCopy 19 InDesign et InCopy « appréhendent » le contenu d’un document de la même manière. Un document contient des pages, qui à leur tour contiennent des éléments de page (blocs de texte, rectangles, ellipses, et ainsi de suite). Les blocs de texte contiennent des caractères, des mots, des paragraphes et des blocs ancrés ; les blocs graphiques contiennent des images, des fichiers EPS ou des fichiers PDF ; les groupes contiennent d’autres éléments de page. Tous ces éléments sont les objets qui composent une publication InDesign, et qui sont utilisés pour écrire les scripts InDesign et InCopy. Les objets de votre publication sont organisés dans un ordre spécifique : les paragraphes figurent à l’intérieur d’un article, qui lui-même figure dans un document, qui à son tour figure à l’intérieur de l’objet d’application InCopy. Les termes modèle d’objet et hiérarchie font référence à cette structure. Il est impératif de posséder une bonne compréhension du modèle d’objet pour bien identifier l’objet que vous souhaitez utiliser. Votre meilleur guide pour créer des scripts dans InCopy est votre connaissance de l’application elle-même. Les objets possèdent des propriétés (attributs). Par exemple, les propriétés d’un objet texte incluent la police utilisée pour la mise en forme du texte, le corps et l’interligne appliqués au texte. Les propriétés possèdent des valeurs. Ainsi, le corps des caractères du texte peut être représenté par un nombre (en points) ou par la chaîne « Auto » pour l’interligne automatique. La propriété de couleur de fond du texte peut être définie sur une couleur, un dégradé, une encre mélangée ou une nuance. Les propriétés peuvent être en lecture/écriture ou en lecture seule. Vous pouvez définir les propriétés en lecture/écriture sur d’autres valeurs, mais pas les propriétés en lecture seule. Les objets possèdent également des méthodes. Les méthodes correspondent à des verbes de création de scripts, aux actions qu’un objet peut effectuer. Par exemple, l’objet de document contient des méthodes d’impression, d’exportation et d’enregistrement. Les méthodes possèdent des paramètres ou des valeurs définissant l’effet de la méthode. La méthode open, par exemple, possède un paramètre qui définit le fichier à ouvrir. L’illustration suivante est une vue d’ensemble du modèle d’objet InCopy. Ce diagramme ne représente pas la liste complète des objets disponibles dans les scripts InCopy. Il s’agit simplement d’une structure conceptuelle permettant de comprendre la relation entre les types d’objets. application documents a document libraries document preferences books document defaults application preferences document events application defaults document properties application events document methods application menus document elements application properties pages or spreads application methods page stories page items text objects Prise en main Terminologie des scripts et modèle d’objet InCopy 20 Les objets figurant dans le diagramme sont expliqués dans le tableau suivant : Terme Signification Application InCopy Application defaults Les paramètres par défaut de l’application, tels que les couleurs, les styles de paragraphe et les styles d’objet. Les valeurs par défaut de l’application concernent tous les nouveaux documents. Application events Les événements qui se produisent à mesure qu’un utilisateur travaille dans l’application ou qu’un script s’exécute. Les événements sont générés par l’ouverture, la fermeture ou l’enregistrement d’un document ou par la sélection d’une commande de menu. Les événements peuvent déclencher des scripts. Application menus Les menus, sous-menus et menus contextuels qui s’affichent dans l’interface utilisateur d’InCopy. Vous pouvez attacher des scripts aux menus pour exécuter des commandes. Application methods Les opérations que l’application peut effectuer, notamment rechercher et remplacer du texte, copier la sélection, créer des documents ou ouvrir des bibliothèques. Application preferences Par exemple, les préférences de texte, les préférences d’exportation PDF et les préférences de document. De nombreux objets de préférences existent également au niveau du document. Tout comme dans l’interface utilisateur, les préférences d’application s’appliquent aux nouveaux documents ; les préférences de document modifient les paramètres d’un document spécifique. Application properties Les propriétés de l’application, notamment le chemin complet de l’application, ses paramètres régionaux et le nom d’utilisateur. Books Une collection de livres ouverts. Document Un document InCopy. Document defaults Les paramètres par défaut du document, tels que les couleurs, les styles de paragraphe et les paramètres par défaut de mise en forme de texte. Document elements Par exemple, les articles, les graphiques importés et les pages d’un document. L’illustration ci-dessus indique des pages et des articles, car ces objets sont d’importants conteneurs d’autres objets. Toutefois, les éléments de document incluent également des rectangles, des ovales (ellipses), des groupes, des éléments XML, ainsi que tout autre type d’objet que vous pouvez importer ou créer. Document events Les événements qui se produisent au niveau du document, par exemple, l’importation de texte (voir Application events plus haut dans le tableau). Document methods Les opérations que le document peut effectuer, notamment fermer, imprimer ou exporter un document. Document preferences Les préférences d’un document, telles que les préférences de repères, d’affichage ou de document. Document properties Par exemple, le nom de fichier du document, le nombre de pages ou l’emplacement de l’origine (point zéro). Documents Une collection de documents ouverts. Libraries Une collection de bibliothèques ouvertes. Page Une page dans un document InCopy. Prise en main Terminologie des scripts et modèle d’objet InCopy 21 Terme Signification Page item Tout objet que vous pouvez créer ou placer sur une page. Il existe de nombreux types d’éléments de page, tels que des blocs de texte, des rectangles, des lignes graphiques et des groupes. Pages or spreads Les pages ou les planches dans un document InCopy. Stories Le texte dans un document InCopy. Text objects Les caractères, mots, lignes, paragraphes et colonnes de texte sont des exemples d’objets texte dans un article InCopy. Consultation du modèle d’objet InCopy Vous pouvez afficher le modèle d’objet InCopy à l’intérieur de votre application d’édition de scripts. Toutes les informations de référence sur les objets et leurs propriétés et méthodes sont stockées dans le modèle et peuvent être affichées. Pour afficher le modèle d’objet InCopy, vous devez disposer d’un éditeur/débogueur VBScript, d’une version de Visual Basic ou d’une application incorporant Visual Basic for Applications. Visual Basic 6 Pour afficher le modèle d’objet à l’aide de Visual Basic 6 : 1. Créez un projet Visual Basic, puis choisissez la commande Projet > Références. Visual Basic affiche la boîte de dialogue Références. 2. Dans la liste de références disponibles, sélectionnez l’option Adobe InCopy CS6 Type Library, puis cliquez sur OK. Si la bibliothèque ne figure pas dans la liste des références disponibles, cliquez sur le bouton Parcourir, puis recherchez et sélectionnez le fichier Resources for Visual Basic.tlb. Généralement, ce fichier se trouve dans le dossier ~\Documents and Settings\<username>\Application Data\Adobe\InCopy\Version 8.0\<locale>\Scripting Support\ (<username> étant votre nom d’utilisateur et le symbole ~ (tilde) représentant le volume système). Si nécessaire, recherchez le fichier. Après avoir localisé le fichier, cliquez sur le bouton Ouvrir pour ajouter la référence à votre projet. 3. Choisissez la commande Affichage > Explorateur d’objets. Visual Basic affiche la boîte de dialogue Explorateur d’objets. 4. Choisissez « InCopy » dans la liste de bibliothèques ouvertes du menu Projet/bibliothèque. Visual Basic affiche les objets composant le modèle d’objet InCopy. Prise en main Terminologie des scripts et modèle d’objet InCopy 22 5. Cliquez sur une classe d’objet. Visual Basic affiche les propriétés et les méthodes de l’objet. Pour plus de détails sur une propriété ou une méthode, sélectionnez-la. Visual Basic affiche sa définition au bas de la fenêtre Explorateur d’objets. Visual Basic Express 2008/Visual Basic.NET Pour afficher le modèle d’objet à l’aide de Visual Basic Express 2008/Visual Basic.NET : 1. Créez un projet Visual Basic, puis choisissez la commande Projet > Ajouter la référence. Visual Basic affiche la boîte de dialogue d’ajout de référence. 2. Sélectionnez l’onglet COM. 3. Dans la liste des références disponibles, sélectionnez l’option Adobe InCopy CS6 Type Library. Visual Basic ajoute la référence à la liste de composants sélectionnés. Si la bibliothèque ne figure pas dans la liste des références disponibles, cliquez sur le bouton Parcourir, puis recherchez et sélectionnez le fichier Resources for Visual Basic.tlb. Généralement, ce fichier se trouve dans le dossier ~\Documents and Settings\<username>\Application Data\Adobe\InCopy\Version 8.0\<locale>\Scripting Support\ (<username> étant votre nom d’utilisateur). Après avoir localisé le fichier, cliquez sur le bouton Ouvrir pour ajouter la référence à votre projet. 4. Cliquez sur le bouton OK. 5. Choisissez la commande Affichage > Explorateur d’objets. Visual Basic affiche l’onglet Explorateur d’objets. Prise en main Terminologie des scripts et modèle d’objet InCopy 23 6. Dans la liste des bibliothèques ouvertes affichées dans la fenêtre Objets, choisissez l’option interop.incopy. Visual Basic affiche les objets composant le modèle d’objet InCopy. 7. Cliquez sur une classe d’objet. Visual Basic affiche les propriétés et les méthodes de l’objet. Pour plus de détails sur une propriété ou une méthode, sélectionnez-la. Visual Basic affiche sa définition au bas de la fenêtre Explorateur d’objets. Visual Basic for Applications Pour afficher le modèle d’objet à l’aide de Visual Basic for Applications depuis Microsoft Excel : 1. Lancez Excel. 2. Choisissez la commande Outils > Macro > Visual Basic Editor. Excel affiche la fenêtre de l’éditeur Visual Basic. 3. Choisissez la commande Outils > Références. L’éditeur Visual Basic affiche la boîte de dialogue Références. Prise en main Terminologie des scripts et modèle d’objet InCopy 24 4. Dans la liste de références disponibles, sélectionnez Adobe InCopy CS6 Type Library et cliquez sur OK. Visual Basic ajoute la référence à la liste de composants sélectionnés. Si la bibliothèque ne figure pas dans la liste des références disponibles, cliquez sur le bouton Parcourir, puis recherchez et sélectionnez le fichier Resources for Visual Basic.tlb. Généralement, ce fichier se trouve dans le dossier ~\Documents and Settings\<username>\Application Data\Adobe\InCopy\Version 8.0\<locale>\Scripting Support\ (<username> étant votre nom d’utilisateur). Après avoir localisé le fichier, cliquez sur le bouton Ouvrir pour ajouter la référence à votre projet. 5. Choisissez la commande Affichage > Explorateur d’objets. L’éditeur Visual Basic affiche la fenêtre Explorateur d’objets. 6. Choisissez l’option InCopy dans le menu déroulant Bibliothèques. L’éditeur Visual Basic affiche une liste des objets dans la bibliothèque d’objets InCopy. 7. Cliquez sur un nom d’objet. L’éditeur Visual Basic affiche les propriétés et les méthodes de l’objet. Pour plus de détails sur une propriété ou une méthode, sélectionnez-la. Visual Basic affiche sa définition au bas de la fenêtre Explorateur d’objets. Mesures et positionnement Dans InCopy, tous les éléments et objets sont placés sur une page en fonction des mesures que vous spécifiez. Il est donc très utile de connaître le fonctionnement du système de coordonnées d’InCopy et les unités de mesure qu’il utilise. Coordonnées Comme tout autre programme de mise en page et de dessin, InCopy utilise une géométrie bidimensionnelle simple pour définir la position des objets sur une page ou une planche. La composante horizontale d’une paire de coordonnées est appelée x et sa composante verticale, y. Vous pouvez voir ces coordonnées dans le panneau Transformation ou Contrôle lorsqu’un objet est sélectionné avec l’outil Sélection. Comme dans l’interface utilisateur d’InCopy, les coordonnées sont mesurées par rapport à l’emplacement actuel de l’origine (point zéro) de la règle. Il existe une différence entre les coordonnées utilisées dans InCopy et le système de coordonnées géométrique traditionnel. Sur l’axe vertical (ou y) d’InCopy, les coordonnées au-dessous de l’origine sont des nombres positifs, et celles situées au-dessus, des nombres négatifs. Prise en main Ajout de caractéristiques à « Hello World » 25 Unités de mesure Pour envoyer des valeurs de mesure à InCopy, vous pouvez utiliser soit des nombres (14.65, par exemple), soit des chaînes de mesure (« 1p7.1 », par exemple). Si vous envoyez des nombres, InCopy utilise les unités de mesure actives de la composition ; si vous envoyez des chaînes de mesure (voir le tableau ci-dessous), InCopy utilise les unités de mesure spécifiées dans chaque chaîne. InCopy renvoie les coordonnées et autres valeurs de mesure en utilisant les unités de mesure actives de la composition. Dans certains cas, ces unités ne sont pas représentées sous la même forme que les valeurs de mesure figurant dans le panneau Transformation d’InCopy. Si le système de mesure actif utilise les picas, par exemple, InCopy renvoie des valeurs fractionnaires sous forme de nombres décimaux, au lieu d’utiliser les conventions « picas et points » du panneau Transformation. Ainsi, « 1p6 » est renvoyé sous la forme « 1.5 ». InCopy procède de cette manière, car le système de scripts ne peut pas exécuter d’opération arithmétique avec des chaînes de mesure. Par exemple, si vous additionnez « 0p3.5 » et « 13p4 », vous allez obtenir une erreur de script ; en revanche, si vous additionnez 0,2916 et 13,333 (les mêmes mesures après leur conversion), le résultat sera correct. Si votre script dépend de l’addition, la soustraction, la multiplication ou la division de valeurs de mesure spécifiques, il est préférable de définir les unités de mesure correspondantes au début du script. A la fin du script, vous pouvez rétablir les unités de mesure initialement utilisées avant l’exécution du script. Vous pouvez également utiliser des remplacements d’unités de mesures, comme dans beaucoup de nos exemples de scripts. Un remplacement d’unité de mesure est une chaîne contenant un caractère spécial, comme dans les exemples ci-dessous. Remplacement Signification Exemple c cicéros (le c peut être suivi de didots, si nécessaire) 1.4c cm centimètres .635cm i (or in) pouces .25i mm millimètres 6.35mm p picas (le p peut être suivi de points, si nécessaire) 1p6 pt points 18pt Ajout de caractéristiques à « Hello World » Nous allons maintenant créer un script qui modifie la composition « Hello World » créée avec notre premier script. Ce second script illustre les opérations suivantes : X Obtention du document actif X Changement de la mise en forme du texte dans son bloc X Ajout d’une note Ouvrez le script d’apprentissage ImprovedHelloWorld ou procédez comme suit pour créer le script : 1. Lancez un éditeur de texte (Bloc-notes, par exemple). 2. Vérifiez que le document que vous avez créé précédemment est ouvert. Si vous avez fermé le document sans l’enregistrer, il suffit de réexécuter le script HelloWorld.vbs pour créer un nouveau document. Prise en main Ajout de caractéristiques à « Hello World » 26 3. Entrez le code ci-dessous. Set myInCopy = CreateObject("InCopy.Application") Rem Disable normal error handling (trying to get a nonRem existent font can cause errors). On Error Resume Next Rem Enter the name of a font on your system, if necessary. Set myFont = myInCopy.Fonts.Item("Arial") If Error.Number <> 0 Then Error.Clear End If Rem Resume normal error handling. On Error Goto 0 Rem Get the active document and assign the result to the variable "myDocument" Set myDocument = myInCopy.Documents.Item(1) Set myStory = myDocument.Stories.Item(1) Rem Change the font, size, and paragraph alignment. If TypeName(myFont) <> "Nothing" Then myStory.AppliedFont = myFont End If myStory.PointSize = 48 myStory.Justification = idJustification.idCenterAlign Rem Enter the note at the last insertion point of the story. Set myInsertionPoint = myStory.InsertionPoints.Item(-1) Set myNote = myInsertionPoint.Notes.Add myNote.Texts.Item(1).Contents = "This is a Note." 4. Enregistrez le texte dans un fichier de texte brut avec l’extension .vbs dans le dossier Scripts (voir la section « Installation des scripts » à la page 12). Pour exécuter le nouveau script, cliquez deux fois sur son nom dans le panneau Scripts. 3 Fonctions de scripts Statut de mise à jour du chapitre CS6 Modifié « Versionnage des scripts » à la page 28 et ses trois sous-sections ont été mises à jour, corrigées et clarifiées. Ce chapitre décrit les techniques de scripts en relation avec l’environnement de script InCopy. La quasi-totalité des autres objets du modèle de scripts InCopy possèdent une fonction qui permet de modifier les valeurs par défaut d’un document ou de l’application. En revanche, les fonctions décrites dans ce chapitre commandent le fonctionnement des scripts. Ce document aborde les thèmes suivants : X Objet ScriptPreferences et ses propriétés X Référence au script d’exécution X Exécution des scripts dans les versions antérieures du modèle d’objet de script X Méthode DoScript pour exécuter des scripts X Exécution des scripts au lancement d’InCopy Vous devez avoir préalablement lu le Chapitre 2, « Prise en main » et savoir créer, installer et exécuter les scripts InCopy dans le langage de votre choix. Préférences des scripts L’objet ScriptPreferences fournit les objets et les propriétés liés au mode d’exécution des scripts InCopy. Le tableau suivant décrit plus en détail chaque propriété de l’objet ScriptPreferences : Propriété Description EnableRedraw Active ou désactive la réactualisation de l’écran pendant l’exécution d’un script dans le panneau Scripts. ScriptsFolder Chemin d’accès au dossier des scripts. ScriptsList Liste des scripts disponibles. Cette propriété représente un ensemble d’éléments (tableau de données) sous la forme suivante : [[fileName, filePath], …] fileName correspond au nom du fichier de script et filePath au chemin d’accès complet au script. Vous pouvez utiliser cette fonction pour vérifier la présence d’un script dans l’ensemble des scripts installés. 27 Fonctions de scripts Obtention du script en cours Propriété Description UserInteractionLevel Cette propriété contrôle les alertes et les boîtes de dialogue d’InCopy présentées à l’utilisateur. Lorsque vous paramétrez cette propriété sur idUserInteractionLevels.idNeverInteract, InCopy n’affiche pas d’alertes, ni de boîtes de dialogue ; définissez-la sur idUserInteractionLevels.idInteractWithAlerts pour activer les alertes mais désactiver les boîtes de dialogue, et sur idUserInteractionLevels.idInteractWithAll pour rétablir l’affichage normal des alertes et des boîtes de dialogue. La possibilité de désactiver l’affichage des alertes est pratique lorsque vous ouvrez des documents à l’aide d’un script ; souvent, InCopy affiche une alerte correspondant à des polices ou des fichiers graphiques liés qui sont manquants. Pour éviter cette alerte, définissez le niveau d’interaction utilisateur sur idUserInteractionLevels.idNeverInteract avant d’ouvrir le document, puis rétablissez l’interaction utilisateur (en définissant la propriété sur idUserInteractionLevels.idInteractWithAll) avant d’exécuter le script. Version Version de l’environnement de création de scripts en cours d’utilisation (pour plus de détails, voir la section « Versionnage des scripts » à la page 28). Notez que cette propriété diffère de la version de l’application. 28 Obtention du script en cours Vous pouvez obtenir une référence au script en cours à l’aide de la propriété ActiveScript de l’objet d’application. Vous pouvez utiliser cette propriété pour rechercher les fichiers et les dossiers relatifs au script, comme l’illustre l’exemple suivant (dans le script d’apprentissage ActiveScript) : Set myInCopy = CreateObject("InCopy.Application") myActiveScript = myInCopy.ActiveScript MsgBox ("The current script is: " & myActiveScript) Set myFileSystemObject = CreateObject("Scripting.FileSystemObject") myParentFolder = myFileSystemObject.GetFile(myActiveScript).ParentFolder MsgBox ("The folder containing the active script is: " & myParentFolder) Lorsque vous déboguez des scripts à l’aide de l’éditeur de scripts, la propriété ActiveScript renvoie une erreur. Seuls les scripts exécutés depuis la panneau Scripts figurent dans la propriété ActiveScript. Versionnage des scripts InCopy peut exécuter des scripts utilisant des versions antérieures du modèle d’objet de script InCopy. Pour exécuter un ancien script dans une version plus récente d’InCopy, vous devez prendre en compte les points suivants : X Ciblage : les scripts doivent cibler la version d’InCopy dans laquelle ils sont exécutés (c’est-à-dire, la version en cours). La méthode de ciblage dépend du langage, comme indiqué dans la section « Ciblage » à la page 29. X Compilation : cette opération implique la mise en correspondance des noms dans le script avec les ID de script sous-jacents qui sont interprétés par InCopy. La méthode de compilation dépend du langage, comme indiqué dans la section « Compilation » à la page 29. Fonctions de scripts X Versionnage des scripts 29 Interprétation : cette opération implique la mise en correspondance des ID avec le gestionnaire de demande approprié dans InCopy. Ainsi, InCopy interprète correctement un script créé pour une version antérieure du modèle d’objet de script. Pour cela, paramétrez explicitement les préférences de script de l’application sur l’ancien modèle d’objet dans le script (comme indiqué dans la section « Interprétation » à la page 30) ou exécutez le script à partir d’un dossier du dossier du panneau Scripts comme suit : Dossier Version des scripts pour InCopy Version 8.0 Scripts CS6 Version 7.0 Scripts CS5 et CS5.5 Version 6.0 Scripts CS4 Version 5.0 Scripts CS3 Version 2.0 Scripts CS2 Ciblage Un script doit toujours cibler la version d’InCopy dans laquelle il est exécuté (c’est-à-dire, la version en cours), que ce soit de manière implicite ou explicite. Le ciblage est implicite lorsque le script est lancé depuis le panneau Scripts. Enfin, le ciblage explicite des applications Visual Basic et des scripts VBScripts est effectué à l’aide de la méthode CreateObject : Rem Set Rem Set Rem Set Target InCopy CS6 Roman: myApp = CreateObject("InCopy.Application.CS6") Target InCopy CS6 J: myApp = CreateObject("InCopy.Application.CS6_J") Target the last version of InCopy that was launched: myApp = CreateObject("InCopy.Application") Compilation Vous pouvez créer une version de la compilation des applications Visual Basic en référençant une version antérieure de la bibliothèque de types. Pour générer une version antérieure de la bibliothèque de types, utilisez la méthode PublishTerminology, qui est appliquée à l’objet d’application. La bibliothèque de types est générée dans un dossier (nommé avec la version du DOM) qui se trouve dans le dossier Scripting Support du dossier de préférences de l’application. Par exemple, pour générer le dictionnaire CS5 dans le dossier C:\Documents and Settings\<nom d’utilisateur>\Application Data\Adobe\InCopy\Version 8.0\<langue>\Scripting Support\7.0 : Set myApp = CreateObject("InCopy.Application") Rem Publish the InCopy CS5 type library (version 7.0 DOM) myApp.PublishTerminology(7.0) Les scripts VBScripts ne sont pas préalablement compilés. Pour la compilation, InCopy génère et référence automatiquement la bibliothèque de types appropriée, en fonction de la version du DOM définie pour l’interprétation. Fonctions de scripts Utilisation de la méthode DoScript 30 Interprétation L’objet d’application InCopy comprend un objet ScriptPreferences, permettant à un script d’obtenir ou de définir la version du modèle d’objet de script à utiliser pour l’interprétation de scripts. La version par défaut est la version actuelle de lapplication et persiste. Par exemple, pour modifier la version du modèle d’objet de script en CS5 : Set myInCopy = CreateObject("InCopy.Application") Rem Set to 7.0 DOM myInCopy.ScriptPreferences.Version = 7.0 Utilisation de la méthode DoScript La méthode DoScript permet au script d’exécuter un autre script. Le script peut se présenter sous la forme d’une chaîne de codes valides ou d’un fichier sur disque. Le script peut adopter le même langage de script que le script courant ou un autre langage de script. Les langages disponibles varient d’une plate-forme à une autre : sous Mac OS, vous pouvez exécuter un script AppleScript ou JavaScript ; sous Windows, vous pouvez exécuter un script VBScript ou JavaScript. La méthode DoScript présente plusieurs utilisations possibles : X Exécution d’un script dans un autre langage qui fournit une fonction manquante dans votre langage de script principal. Par exemple, VBScript n’offre pas la possibilité d’afficher un explorateur de fichiers ou de dossiers, contrairement à JavaScript. AppleScript peut être très lent à calculer les fonctions trigonométriques (sinus et cosinus), mais JavaScript effectue ces calculs rapidement. JavaScript ne permet pas d’interroger Microsoft® Excel sur le contenu d’une cellule de feuille de calcul donnée, mais AppleScript et VBScript proposent cette fonctionnalité. Dans tous ces exemples, la méthode DoScript peut exécuter un extrait de code de script dans un autre langage, pour contourner la limitation du langage utilisé pour le corps du script. X Création d’un script « à la volée ». Votre script peut créer un script (sous la forme d’une chaîne) pendant son exécution, qu’il peut ensuite exécuter à l’aide de la méthode DoScript. C’est une méthode idéale pour créer une boîte de dialogue ou un panneau personnalisé en fonction du contenu de la sélection ou des attributs des objets que le script crée. X Incorporation des scripts dans les objets. Les scripts peuvent utiliser la méthode DoScript pour exécuter des scripts qui ont été enregistrés sous la forme de chaînes dans la propriété label des objets. Cette technique permet à un objet de contenir un script qui contrôle ses propriétés de mise en page ou qui met à jour son contenu en fonction de certains paramètres. Les scripts peuvent également être incorporés dans des éléments XML sous la forme d’un attribut de l’élément ou du contenu d’un élément (voir la section « Exécution des scripts au lancement » à la page 31). Envoi de paramètres à l’objet DoScript Pour envoyer un paramètre à un script exécuté par l’objet DoScript, utilisez la forme suivante (dans le script d’apprentissage DoScriptParameters) : Fonctions de scripts Exécution des scripts au lancement 31 Set myInCopy = CreateObject("InCopy.Application") myJavaScript = "alert(""First argument: "" + arguments[0] + ""\rSecond argument: "" + arguments[1]);" myInCopy.DoScript myJavaScript, idScriptLanguage.idJavascript, Array("Hello from DoScript", "Your message here.") myVBScript = "msgbox arguments(1), vbOKOnly, ""First argument: "" & arguments(0)" myInCopy.DoScript myVBScript, idScriptLanguage.idVisualBasic, Array("Hello from DoScript", "Your message here.") Renvoi des valeurs de l’objet DoScript Pour renvoyer une valeur à partir d’un script exécuté par l’objet DoScript, vous pouvez utiliser l’objet ScriptArgs (abréviation de « script arguments ») de l’application. L’extrait de script suivant explique comment procéder (pour consulter le script complet, voir le script d’apprentissage DoScriptReturnValue) : Set myInCopy = CreateObject("InCopy.Application") myJavaScript = "app.scriptArgs.setValue(""ScriptArgumentA"", ""This is the first script argument value."");" & vbCr myJavaScript = myJavaScript & "app.scriptArgs.setValue(""ScriptArgumentB"", ""This is the second script argument value."");" & vbCr myInCopy.DoScript myJavaScript, idScriptLanguage.idJavascript myScriptArgumentA = myInCopy.ScriptArgs.GetValue("ScriptArgumentA") myScriptArgumentB = myInCopy.ScriptArgs.GetValue("ScriptArgumentB") MsgBox "ScriptArgumentA: " & myScriptArgumentA & vbCr & "ScriptArgumentB: " & myScriptArgumentB myVBScript = "Set myInCopy = CreateObject(""InCopy.Application"")" & vbCr myVBScript = myVBScript & "myInCopy.ScriptArgs.SetValue ""ScriptArgumentA"", ""This is the first script argument value.""" & vbCr myVBScript = myVBScript & "myInCopy.ScriptArgs.SetValue ""ScriptArgumentB"", ""This is the second script argument value.""" myInCopy.DoScript myVBScript, idScriptLanguage.idVisualBasic myScriptArgumentA = myInCopy.ScriptArgs.GetValue("ScriptArgumentA") myScriptArgumentB = myInCopy.ScriptArgs.GetValue("ScriptArgumentB") MsgBox "ScriptArgumentA: " & myScriptArgumentA & vbCr & "ScriptArgumentB: " & myScriptArgumentB Exécution des scripts au lancement Pour exécuter un script au lancement d’InCopy, placez le script dans le dossier Startup Scripts du dossier Scripts (pour plus de détails, voir la section « Installation des scripts » à la page 12). 4 Texte et saisie Statut de mise à jour du chapitre CS6 Inchangé La saisie, l’édition et la mise en forme d’un texte représentent la majeure partie du temps consacré à la plupart des documents InCopy. Ainsi, l’automatisation des opérations sur le texte, notamment la saisie, peut représenter des gains de productivité importants. Ce didacticiel décrit comment automatiser avec des scripts les opérations les plus courantes appliquées au texte et à la saisie. Les exemples de scripts de ce chapitre sont présentés par ordre de complexité, en commençant par des scripts très simples et en progressant vers des opérations plus complexes. Vous devez avoir préalablement lu le Chapitre 2, « Prise en main » et savoir créer, installer et exécuter un script. Vous devez également savoir manipuler le texte dans InCopy et connaître la terminologie de base du domaine de la composition. Saisie et importation de texte Cette section décrit le processus d’insertion d’un texte dans les documents InCopy. Tout comme vous pouvez saisir du texte dans des blocs de texte et importer des fichiers texte au moyen de l’interface utilisateur InCopy, vous pouvez créer des blocs de texte, insérer du texte dans un article ou importer des fichiers texte à l’aide de scripts. Articles et blocs de texte Tout le texte d’une mise en page InCopy fait partie d’un article, et chaque article peut contenir un ou plusieurs blocs de texte. Si vous utilisez un document InCopy autonome, celui-ci contient un article, et InCopy ajoute des blocs de texte uniquement si cela se révèle nécessaire pour afficher le texte de l’article. Cela est valable également pour les articles exportés d’InDesign sous la forme d’articles InCopy (fichiers .icml). Lorsque vous utilisez un article InCopy dans un document InDesign, le document peut contenir un nombre quelconque d’articles, et les blocs de texte s’affichent comme s’ils avaient été créés dans la mise en page InDesign. Contrairement à InDesign, InCopy ne peut pas ajouter de nouveaux blocs de texte à l’aide des scripts. Pour plus de détails sur les relations entre les objets texte dans un document InCopy, voir la section « Objets texte » à la page 41. 32 Texte et saisie Saisie et importation de texte 33 Ajout d’un texte à un article Pour ajouter du texte à un article, utilisez la propriété contents. L’exemple de script suivant utilise cette technique pour ajouter du texte à la fin d’un article (pour consulter le script complet, voir AddText) : Set myDocument = myInCopy.Documents.Add Rem Add text to the default story. Set myStory = myDocument.Stories.Item(1) myStory.Contents = "This is the first paragraph of example text." Rem To add more text to the story, we'll use the last insertion point Rem in the story. ("vbCr" is a return character in VBScript.) Set myInsertionPoint = myStory.InsertionPoints.Item(-1) myInsertionPoint.Contents = vbCr & "This is the second paragraph." Remplacement de texte Le script suivant remplace un mot par un groupe de mots, en changeant le contenu de l’objet approprié (pour consulter le script complet, voir ReplaceWord) : Rem Enters text in the default story and then replaces Rem a word in the story with a different phrase. Set myDocument = myInCopy.Documents.Add Rem Add text to the default story. Set myStory = myDocument.Stories.Item(1) myStory.Contents = "This is some example text." Rem Replace the third word "some" with the phrase Rem "a little bit of". myStory.Words.Item(3).Contents = "a little bit of" Le script suivant remplace du texte dans un paragraphe (pour consulter le script complet, voir ReplaceText) : Rem Enters text in the default story, and then replaces Rem the text in the second paragraph. Set myDocument = myInCopy.Documents.Add Set myStory = myDocument.Stories.Item(1) myStory.Contents = "Paragraph 1." & vbCr & "Paragraph 2." & vbCr & "Paragraph 3." & vbCr Rem Replace the text in the second paragraph without replacing Rem the return character at the end of the paragraph. To do this, Rem we'll use the ItemByRange method. Set myStartCharacter = myStory.Paragraphs.Item(2).Characters.Item(1) Set myEndCharacter = myStory.Paragraphs.Item(2).Characters.Item(-2) Set myText = myStory.Texts.ItemByRange(myStartCharacter, myEndCharacter).Item(1) myText.Contents = "This text replaces the text in paragraph 2." Dans le script ci-dessus, nous avons utilisé la méthode ItemByRange pour obtenir une référence au texte du paragraphe (en excluant le caractère de retour chariot à la fin du paragraphe), comme objet texte unique. Nous avons exclu le caractère du retour chariot, car si nous le supprimons, le style de paragraphe appliqué s’en trouve modifié. Pour utiliser la méthode ItemByRange, nous avons utilisé la collection de textes de l’article, mais nous avons spécifié comme paramètres deux caractères : les caractères de début et de fin du paragraphe. Si nous avions utilisé myTextFrame.ParentStory.Characters.ItemByRange, InCopy aurait renvoyé une collection d’objets Character. Nous souhaitions un objet Text pour pouvoir remplacer le contenu en une seule action. Texte et saisie Importation de texte et définition des préférences d’importation de texte 34 Insertion de caractères spéciaux Comme la plupart des éditeurs VBScript prennent en charge Unicode, vous pouvez simplement entrer des caractères Unicode dans des chaînes de caractères exportées dans InCopy. Vous pouvez également utiliser un raccourci clavier InCopy pour entrer directement les caractères Unicode par ID de glyphe : <nnnn> (nnnn étant le code Unicode du caractère). Le script suivant illustre plusieurs méthodes de saisie des caractères spéciaux (pour consulter le script complet, voir SpecialCharacters) : Set myInCopy = CreateObject("InCopy.Application") Set myDocument = myInCopy.Documents.Add Set myStory = myDocument.Stories.Item(1) Rem Entering special characters directly. myStory.Contents = "Registered trademark: ®" & vbCr & "Copyright: ©" & vbCr & "Trademark: ™" & vbCr Rem Entering special characters by their Unicode glyph ID value: myStory.InsertionPoints.Item(-1).Contents = "Not equal to: <2260>" & vbCr myStory.InsertionPoints.Item(-1).Contents = "Square root: <221A>" & vbCr myStory.InsertionPoints.Item(-1).Contents = "Section symbol: <00B6>" & vbCr Rem Entering InCopy special characters by their enumerations: myStory.InsertionPoints.Item(-1).Contents = "Automatic page number marker:" myStory.InsertionPoints.Item(-1).Contents = idSpecialCharacters.idAutoPageNumber myStory.InsertionPoints.Item(-1).Contents = vbCr myStory.InsertionPoints.Item(-1).Contents = "Section symbol:" myStory.InsertionPoints.Item(-1).Contents = idSpecialCharacters.idSectionSymbol myStory.InsertionPoints.Item(-1).Contents = vbCr myStory.InsertionPoints.Item(-1).Contents = "En dash:" myStory.InsertionPoints.Item(-1).Contents = idSpecialCharacters.idEnDash myStory.InsertionPoints.Item(-1).Contents = vbCr Le meilleur moyen pour rechercher l’ID Unicode d’un caractère est d’utiliser le panneau Glyphes dans InCopy (choisissez la commande Texte > Glyphes pour afficher le panneau) ; il vous suffit de placer le curseur sur un caractère dans le panneau pour qu’InCopy affiche sa valeur Unicode. Vous trouverez de plus amples informations sur Unicode sur le site http://www.unicode.org. Importation de texte et définition des préférences d’importation de texte Vous pouvez non seulement saisir des chaînes de caractères mais également importer des fichiers texte créés dans des programmes de traitement de texte et des éditeurs de texte. Le script suivant indique comment importer un fichier texte dans l’article par défaut d’un nouveau document (pour consulter le script complet, voir PlaceTextFile) : Rem Places a text file in the default story of a new document. Set myInCopy = CreateObject("InCopy.Application") Rem Create an example document. Set myDocument = myInCopy.Documents.Add Rem Parameters for Page.place(): Rem File as File object, Rem [ShowingOptions as Boolean = False] Rem You'll have to fill in a valid file path on your system. myDocument.Stories.Item(1).InsertionPoints.Item(1).Place "c:\test.txt", False Pour définir les options d’importation du type de fichier texte à importer, utilisez l’objet de préférences d’importation correspondant. Le script suivant montre comment définir les préférences d’importation de texte (pour consulter le script complet, voir TextImportPreferences). Les commentaires du script expliquent les différentes valeurs possibles pour chaque propriété. Texte et saisie Importation de texte et définition des préférences d’importation de texte 35 Rem TextImportPreferences.vbs Rem An InCopy CS6 VBScript Rem Set myInCopy = CreateObject("InCopy.Application") Rem Sets the text import filter preferences. With myInCopy.TextImportPreferences Rem Options for characterSet: Rem idTextImportCharacterSet.idAnsi Rem idTextImportCharacterSet.idChineseBig5 Rem idTextImportCharacterSet.idGB18030 Rem idTextImportCharacterSet.idGB2312 Rem idTextImportCharacterSet.idKSC5601 Rem idTextImportCharacterSet.idMacintoshCE Rem idTextImportCharacterSet.idMacintoshCyrillic Rem idTextImportCharacterSet.idMacintoshGreek Rem idTextImportCharacterSet.idMacintoshTurkish Rem idTextImportCharacterSet.idRecommendShiftJIS83pv Rem idTextImportCharacterSet.idShiftJIS90ms Rem idTextImportCharacterSet.idshiftJIS90pv Rem idTextImportCharacterSet.idUTF8 Rem idTextImportCharacterSet.idUTF16 Rem idTextImportCharacterSet.idWindowsBaltic Rem idTextImportCharacterSet.idWindowsCE Rem idTextImportCharacterSet.idWindowsCyrillic Rem idTextImportCharacterSet.idWindowsEE Rem icTextImportCharacterSet.idWindowsGreek Rem idTextImportCharacterSet.idWindowsTurkish .CharacterSet = idTextImportCharacterSet.idUTF16 .ConvertSpacesIntoTabs = True .SpacesIntoTabsCount = 3 Rem The dictionary property can take any of the following Rem language names (as strings): Rem Bulgarian Rem Catalan Rem Croatian Rem Czech Rem Danish Rem Dutch Rem English: Canadian Rem English: UK Rem English: USA Rem English: USA Legal Rem English: USA Medical Rem Estonian Rem Finnish Rem French Rem French: Canadian Rem German: Reformed Rem German: Swiss Rem German: Traditional Rem Greek Rem Hungarian Rem Italian Rem Latvian Rem Lithuanian Rem Neutral Rem Norwegian: Bokmal Rem Norwegian: Nynorsk Rem Polish Rem Portuguese Texte et saisie Importation de texte et définition des préférences d’importation de texte 36 Rem Portuguese: Brazilian Rem Romanian Rem Russian Rem Slovak Rem Slovenian Rem Spanish: Castilian Rem Swedish Rem Turkish .Dictionary = "English: USA" Rem platform options: Rem idImportPlatform.idMacintosh Rem idImportPlatform.idPC .Platform = idImportPlatform.idPC .StripReturnsBetweenLines = True .StripReturnsBetweenParagraphs = True .UseTypographersQuotes = True End With Le script suivant montre comment définir les préférences d’importation de texte référencé (pour consulter le script complet, voir TaggedTextImportPreferences) : Rem Sets the tagged text import filter preferences. With myInCopy.TaggedTextImportPreferences RemoveTextFormatting = False Rem StyleConflict property can be: Rem idStyleConflict.idPublicationDefinition Rem idStyleConflict.idTagFileDefinition .StyleConflict = idStyleConflict.idPublicationDefinition .UseTypographersQuotes = True End With Le script suivant montre comment définir les préférences d’importation au format Word et RTF (pour consulter le script complet, voir WordRTFImportPreferences) : With myInCopy.WordRTFImportPreferences Rem convertPageBreaks property can be: Rem idConvertPageBreaks.idColumnBreak Rem idConvertPageBreaks.idNone Rem idConvertPageBreaks.idPageBreak .ConvertPageBreaks = idConvertPageBreaks.idNone Rem convertTablesTo property can be: Rem idConvertTablesOptions.idUnformattedTabbedText Rem idConvertTablesOptions.idUnformattedTable .ConvertTablesTo = idConvertTablesOptions.idUnformattedTable .ImportEndnotes = True .ImportFootnotes = True .ImportIndex = True .ImportTOC = True .ImportUnusedStyles = False .PreserveGraphics = False .PreserveLocalOverrides = False .PreserveTrackChanges = False .RemoveFormatting = False Rem resolveCharacterStyleClash and resolveParagraphStyleClash properties can be: Rem idResolveStyleClash.idResolveClashAutoRename Rem idResolveStyleClash.idResolveClashUseExisting Rem idResolveStyleClash.idResolveClashUseNew .ResolveCharacterStyleClash = Texte et saisie Exportation de texte et définition des préférences d’exportation de texte 37 idResolveStyleClash.idResolveClashUseExisting .ResolveParagraphStyleClash = idResolveStyleClash.idResolveClashUseExisting .UseTypographersQuotes = True End With Le script suivant montre comment définir les préférences d’importation au format Excel (pour consulter le script complet, voir ExcelImportPreferences) : With myInCopy.ExcelImportPreferences Rem alignmentStyle property can be: Rem AlignmentStyleOptions.centerAlign Rem AlignmentStyleOptions.leftAlign Rem AlignmentStyleOptions.rightAlign Rem AlignmentStyleOptions.spreadsheet .AlignmentStyle = idAlignmentStyleOptions.idSpreadsheet .DecimalPlaces = 4 .PreserveGraphics = False Rem Enter the range you want to import as "start cell:end cell". .RangeName = "A1:B16" .SheetIndex = 1 .SheetName = "pathpoints" .ShowHiddenCells = False Rem tableFormatting property can be: Rem idTableFormattingOptions.idExcelFormattedTable Rem idTableFormattingOptions.idExcelUnformattedTabbedText Rem idTableFormattingOptions.idExcelUnformattedTable .TableFormatting = idTableFormattingOptions.idExcelFormattedTable .UseTypographersQuotes = True .ViewName = "" End With Exportation de texte et définition des préférences d’exportation de texte Le script suivant indique comment exporter du texte à partir d’un document InCopy. Vous devez utiliser des objets texte ou article pour exporter un contenu dans des formats de fichier texte ; vous ne pouvez pas exporter tout le texte d’un document en une seule opération. (Pour consulter le script complet, voir ExportTextFile.) Set myDocument = InCopy.Documents.Add Set myStory = myDocument.Stories.Item(0) Rem Fill the story with placeholder text. Set myTextFrame = myStory.TextContainers.Item(1) myTextFrame.Contents = idTextFrameContents.idPlaceholderText Rem Text export method parameters: Rem Format as idExportFormat Rem To As File Rem [ShowingOptions As Boolean = False] Rem Format parameter can be: Rem idExportFormat.idInCopyCSDocument Rem idExportFormat.idInCopyCSDocument Rem idExportFormat.idPDFType Rem idExportFormat.idRTF Texte et saisie Exportation de texte et définition des préférences d’exportation de texte 38 Rem idExportFormat.idTaggedText Rem idExportFormat.idTextType Rem Rem Export the story as text. You must fill in a valid file path on your system. myStory.Export idExportFormat.idTextType, "C:\test.txt" L’exemple suivant indique comment exporter une plage de texte spécifique. (Nous avons omis la fonction myGetBounds dans cette liste ; voir le script d’apprentissage ExportTextRange.) Set myDocument = myInCopy.Documents.Add Set myStory = myDocument.Stories.Item(1) Rem Fill the story with placeholder text. Set myTextFrame = myStory.TextContainers.Item(1) myTextFrame.Contents = idTextFrameContents.idPlaceholderText Set myStartCharacter = myStory.Paragraphs.Item(1).Characters.Item(1) Set myEndCharacter = myStory.Paragraphs.Item(1).Characters.Item(-1) Set myText = myStory.Texts.ItemByRange(myStartCharacter, myEndCharacter).Item(1) Rem Format as idExportFormat Rem To As File Rem [ShowingOptions As Boolean = False] Rem Rem Format parameter can be: Rem idExportFormat.idInCopyCSDocument Rem idExportFormat.idInCopyDocument Rem idExportFormat.idPDFType Rem idExportFormat.idRTF Rem idExportFormat.idTaggedText Rem idExportFormat.idTextType Rem Rem Export the text range. You must fill in a valid file path on your system. myText.Export idExportFormat.idTextType, "C:\test.txt" Pour définir les options d’exportation du type de fichier texte à exporter, utilisez l’objet de préférences d’exportation correspondant. Le script suivant permet de définir les préférences d’exportation d’un texte (pour consulter le script complet, voir TextExportPreferences) : Rem Sets the text export filter preferences. With myInCopy.TextExportPreferences Rem Options for characterSet: Rem idTextExportCharacterSet.idUTF8 Rem idTextExportCharacterSet.idUTF16 Rem idTextExportCharacterSet.idDefaultPlatform .CharacterSet = idTextExportCharacterSet.idUTF16 Rem platform options: Rem idImportPlatform.idMacintosh Rem idImportPlatform.idPC .Platform = idImportPlatform.idPC End With Le script suivant permet de définir les préférences d’exportation d’un texte référencé (pour consulter le script complet, voir TaggedTextExportPreferences) : Rem Sets the tagged text export filter preferences. With myInCopy.TaggedTextExportPreferences Rem Options for characterSet: Rem idTagTextExportCharacterSet.idAnsi Rem idTagTextExportCharacterSet.idASCII Rem idTagTextExportCharacterSet.idGB18030 Rem idTagTextExportCharacterSet.idKSC5601 Rem idTagTextExportCharacterSet.idShiftJIS Rem idTagTextExportCharacterSet.idUTF8 Texte et saisie Exportation de texte et définition des préférences d’exportation de texte 39 Rem idTagTextExportCharacterSet.idUTF16 .CharacterSet = idTagTextExportCharacterSet.idUTF16 Rem tagForm options: Rem idTagTextForm.idAbbreviated Rem idTagTextForm.idVerbose .TagForm = idTagTextForm.idVerbose End With Sachez que l’exportation de texte n’est pas limitée aux filtres d’exportation existants. Etant donné que VBScript peut enregistrer des fichiers texte sur disque, vous pouvez créer un script qui analyse le texte d’un document et l’exporte dans l’ordre de votre choix, à l’aide d’un modèle de balisage de texte qui vous convient. Voici un exemple très simple qui montre comment exporter du texte InCopy au format HTML (pour consulter le script complet, voir ExportHTML) : Function myExportHTML(myInCopy, myDocument) Rem Use the myStyleToTagMapping dictionary to set up Rem your paragraph style to tag mapping. Set myStyleToTagMapping = CreateObject("Scripting.Dictionary") Rem For each style to tag mapping, add a new item to the dictionary. myStyleToTagMapping.Add "body_text", "p" myStyleToTagMapping.Add "heading1", "h1" myStyleToTagMapping.Add "heading2", "h2" myStyleToTagMapping.Add "heading3", "h3" Rem End of style to tag mapping. If myDocument.Stories.Count <> 0 Then Rem Open a new text file. Set myDialog = CreateObject("UserAccounts.CommonDialog") myDialog.Filter = "HTML Files|*.html|All Files|*.*" myDialog.FilterIndex = 1 myDialog.InitialDir = "C:\" myResult = myDialog.ShowOpen Rem If the user clicked the Cancel button, the result is null. If myResult = True Then myTextFileName = myDialog.FileName Set myFileSystemObject = CreateObject("Scripting.FileSystemObject") Set myTextFile = myFileSystemObject.CreateTextFile(myTextFileName) For myCounter = 1 To myInCopy.Documents.Item(1).Stories.Count Set myStory = myDocument.Stories.Item(myCounter) For myParagraphCounter = 1 To myStory.Paragraphs.Count Set myParagraph = myStory.Paragraphs.Item(myParagraphCounter) If myParagraph.Tables.Count = 0 Then If myParagraph.TextStyleRanges.Count = 1 Then Rem If the paragraph is a simple paragraph--no tables, Rem no local formatting--then simply export the text of Rem the paragraph with the appropriate tag. myTag = myStyleToTagMapping.Item (myParagraph.AppliedParagraphStyle.Name) Rem If the tag comes back empty, map it to the basic Rem paragraph tag. If myTag = "" Then myTag = "p" End If myStartTag = "<" & myTag & ">" myEndTag = "</" & myTag & ">" Rem If the paragraph is not the last paragraph Rem in the story, omit the return character. If myParagraph.Characters.Item(-1).Contents = vbCr Then myString = myParagraph.Texts.ItemByRange (myParagraph.Characters.Item(1), myParagraph.Characters.Item(-2)).Item(1).Contents Texte et saisie Exportation de texte et définition des préférences d’exportation de texte 40 Else myString = myParagraph.Contents End If Rem Write the paragraphs' text to the text file. myTextFile.WriteLine myStartTag & myString & myEndTag Else Rem Handle text style range export by iterating through the text style ranges in the paragraph.. For myRangeCounter = 1 To myParagraph.TextStyleRanges.Length myTextStyleRange = myParagraph.TextStyleRanges.Item(myRangeCounter) If myTextStyleRange.Characters.Item(-1) = vbCr Then myString = myTextStyleRange.Texts.ItemByRange (myTextStyleRange.Characters.Item(1), myTextStyleRange.Characters.Item(-2)).Item(1). Contents Else myString = myTextStyleRange.Contents End If Select Case myTextStyleRange.FontStyle Case "Bold": myString = "<b>" & myString & "</b>" Case "Italic": myString = "<i>" & myString & "</i>" End Select myTextFile.write myString Next myTextFile.write vbCr End If Else Rem Handle table export (assumes that there is only one table per paragraph, and that the table is in the paragraph by itself). Set myTable = myParagraph.Tables.Item(1) myTextFile.write "<table border = 1>" For myRowCounter = 1 To myTable.Rows.Count myTextFile.write "<tr>" For myColumnCounter = 1 To myTable.Columns.Count If myRowCounter = 1 Then myString = "<th>" & myTable.Rows.Item (myRowCounter).Cells.Item(myColumnCounter). Texts.Item(1).Contents & "</th>" Else myString = "<td>" & myTable.Rows.Item (myRowCounter).Cells.Item(myColumnCounter). Texts.Item(1).Contents & "</td>" End If myTextFile.write myString Next myTextFile.WriteLine "</tr>" Next myTextFile.WriteLine "</table>" End If Next Rem Close the text file. Texte et saisie Objets texte 41 myTextFile.Close Next End If End If End Function Objets texte Le diagramme suivant illustre une vue du modèle d’objet texte InCopy. Il existe deux types d’objet texte principaux : les objets layout (blocs de texte) et les objets text-stream (articles, points d’insertion, caractères et mots, par exemple). Le diagramme utilise les termes en langage naturel pour les objets ; lorsque vous créez des scripts, vous utilisez les termes correspondants de votre langage de script : document story spread, page, layer insertion points characters text containers text frame words insertion points lines characters paragraphs words text columns lines text style ranges paragraphs texts text columns notes text style ranges texts notes Pour tout objet text-stream, le parent de l’objet est l’article contenant l’objet. Pour obtenir une référence au bloc de texte (ou aux blocs de texte) contenant un objet texte donné, utilisez la propriété ParentTextFrames. Pour un bloc de texte, le parent du bloc de texte est généralement la page ou la planche contenant le bloc de texte. Si le bloc de texte se trouve à l’intérieur d’un groupe ou a été collé à l’intérieur d’un autre élément de page, le parent du bloc de texte est l’élément de page qui le contient. Si le bloc de texte a été converti en bloc ancré, le parent du bloc de texte est le caractère contenant le bloc ancré. Texte et saisie Objets texte 42 Sélections Généralement, les scripts InCopy agissent sur une sélection de texte. Le script suivant permet de déterminer le type de la sélection en cours. Contrairement à de nombreux autres exemples de scripts, ce script n’effectue aucune opération en particulier ; il présente simplement une routine de filtrage de la sélection que vous pouvez utiliser dans vos propres scripts. (Pour consulter le script complet, voir TextSelection.) Set myInCopy = CreateObject("InCopy.Application") If myInCopy.Documents.Count <> 0 Then Rem If the selection contains more than one item, the selection Rem is not text selected with the Type tool. If myInCopy.Selection.Count = 1 Then Select Case TypeName(myInCopy.Selection.Item(1)) Case "InsertionPoint", "Character", "Word", "TextStyleRange", "Line", "Paragraph", "TextColumn", "Text" MsgBox "The selection is a text object." Rem A real script would now act on the text object Rem or pass it on to a function. Case Else MsgBox "The selected object is not a text object. Select some text and try again." End Select Else MsgBox "Please select some text and try again." End If Else MsgBox "No documents are open. Please open a document, select some text, and try again." End If Déplacement et copie de texte Pour déplacer un objet texte dans le texte, utilisez la méthode move. Pour copier le texte, utilisez la méthode duplicate (qui possède exactement les mêmes paramètres que la méthode move). L’extrait de script suivant illustre son mode d’utilisation (pour consulter le script complet, voir MoveText) : Rem Create an example document. Set myDocument = myInCopy.Documents.Add Rem Create a series of paragraphs in the default story. Set myStory = myDocument.Stories.Item(1) myStory.Contents = "WordA" & vbcr & "WordB" & vbcr & "WordC" & vbcr & "WordD" & vbcr Rem Move WordC before WordA. myStory.Paragraphs.Item(3).Move idLocationOptions.idBefore, myStory.Paragraphs.Item(1) Rem Move WordB after WordD (into the same paragraph). myStory.Paragraphs.Item(3).Move idLocationOptions.idAfter, myStory.Paragraphs.Item(-1).Words.Item(1) Rem Note that moving text removes it from its original location. Texte et saisie Objets texte 43 Vous pouvez également utiliser la méthode move pour transférer un texte mis en forme entre deux documents. Le recours à la méthode move ou duplicate est préférable à l’utilisation de la méthode copier-coller pour laquelle vous devez rendre le document visible et sélectionner le texte à copier. Les méthodes move et duplicate sont plus rapides et plus performantes. Le script suivant permet de déplacer du texte d’un document à l’autre à l’aide des méthodes move et duplicate (pour consulter le script complet, voir MoveTextBetweenDocuments) : Rem Moves formatted text from one document to another. Rem Create an example document. Set mySourceDocument = myInCopy.Documents.Add Rem Add text to the default story. Set mySourceStory = mySourceDocument.stories.item(1) mySourceStory.Contents = "This is the source text." & vbCr & "This text is not the source text." & vbcr mySourceStory.paragraphs.item(1).pointSize = 24 Rem Create a new document to move the text to. Set myTargetDocument = myInCopy.Documents.Add Rem Create a text frame in the target document. Set myTargetStory = myTargetDocument.stories.item(1) myTargetStory.contents = "This is the target text. Insert the source text after this paragraph." & vbcr mySourceStory.paragraphs.item(1).duplicate idLocationOptions.idAfter, myTargetStory.insertionPoints.item(-1) Pour copier du texte sans mise en forme entre deux objets texte, vous pouvez également utiliser la propriété contents d’un objet texte et définir la propriété contents d’un autre objet texte à l’aide de cette chaîne. Le script suivant illustre la façon de procéder (pour consulter le script complet, voir CopyUnformattedText) : Rem Shows how to remove formatting from text as you Rem move it to other locations in a document. Set myInCopy = CreateObject("InCopy.Application") Set myDocument = myInCopy.Documents.Add set myStory = myDocument.stories.item(1) myStory.contents = "This is a formatted string." & vbcr & "Text pasted after this text will retain its formatting." & vbcr & vbcr & "Text moved to the following line will take on the formatting of the insertion point." & vbcr & "Italic: " Rem Apply formatting to the first paragraph. myStory.Paragraphs.Item(1).FontStyle = "Bold" Rem Apply formatting to the last paragraph. myStory.Paragraphs.Item(-1).FontStyle = "Italic" Rem Copy from one frame to another using a simple copy. myInCopy.Select myStory.Paragraphs.Item(1).Words.Item(1) myInCopy.Copy myInCopy.Select myStory.Paragraphs.Item(2).InsertionPoints.Item(-1) myInCopy.Paste Rem Copy the unformatted string from the first word to the end of the story Rem by getting and setting the contents of text objects. Note that this doesn't Rem really copy the text; it replicates the text string from one text location Rem to another. myStory.InsertionPoints.Item(-1).Contents = myStory.Paragraphs.Item(1).Words.Item(1).contents Texte et saisie Mise en forme du texte 44 Objets texte et itération Lorsque votre script déplace, supprime ou ajoute du texte pendant une itération dans une série d’objets texte, vous pouvez facilement vous retrouver avec des références de texte incorrectes. Le script suivant illustre ce problème (pour consulter le script complet, voir TextIterationWrong) : Set myDocument = myInCopy.Documents.Add Set myStory = myDocument.Stories.Item(1) myString = "Paragraph 1." & vbCr & "Delete this paragraph." & vbCr & "Paragraph 2." & vbCr & "Paragraph 3." & vbCr & "Paragraph 4." & vbCr & "Paragraph 5." & vbCr & "Delete this paragraph." & vbCr & "Paragraph 6." & vbCr myStory.Contents = myString Rem The following for loop cause an error. For myParagraphCounter = 1 to myStory.Paragraphs.Count If myStory.Paragraphs.Item(myParagraphCounter).Words.Item(1).contents = "Delete" Then myStory.Paragraphs.Item(myParagraphCounter).Delete Else myStory.Paragraphs.Item(myParagraphCounter).PointSize = 24 End If Next Dans l’exemple précédent, certains paragraphes ne sont pas mis en forme. Pourquoi ? La boucle du script balaye les paragraphes à partir du premier paragraphe de l’article jusqu’au dernier. Pendant cette opération, les paragraphes commençant par « Delete » sont supprimés. Lorsque le script supprime le deuxième paragraphe, le troisième paragraphe remonte dans la liste et prend sa place. Lorsque le compteur affiche 3, le script traite le paragraphe qui correspondait au quatrième paragraphe dans l’article ; le troisième paragraphe d’origine devient le deuxième paragraphe et est ignoré. Pour éviter ce problème, effectuez une itération inverse dans les objets texte, comme l’illustre le script suivant (dans le script d’apprentissage TextIterationRight) : Rem Shows how to iterate through text. Set myInCopy = CreateObject("InCopy.Application") Set myDocument = myInCopy.Documents.Add Set myStory = myDocument.Stories.Item(1) myString = "Paragraph 1." & vbCr & "Delete this paragraph." & vbCr & "Paragraph 2." & vbCr & "Paragraph 3." & vbCr & "Paragraph 4." & vbCr & "Paragraph 5." & vbCr & "Delete this paragraph." & vbCr & "Paragraph 6." & vbCr myStory.Contents = myString Rem The following for loop will format all of the paragraphs by iterating Rem backwards through the paragraphs in the story. For myParagraphCounter = myStory.Paragraphs.Count To 1 Step -1 If myStory.Paragraphs.Item(myParagraphCounter).Words.Item(1).contents = "Delete" Then myStory.Paragraphs.Item(myParagraphCounter).Delete Else myStory.Paragraphs.Item(myParagraphCounter).PointSize = 24 End If Next Mise en forme du texte Dans les sections précédentes de ce chapitre, nous avons ajouté du texte à un document et utilisé des articles et des objets texte. Dans cette section, nous allons appliquer une mise en forme au texte. Toutes les fonctions de composition InCopy sont prises en charge par les scripts. Texte et saisie Mise en forme du texte 45 Définition des valeurs par défaut du texte Vous pouvez définir des valeurs de texte par défaut à la fois pour l’application et chaque document. Les valeurs de texte par défaut pour l’application déterminent celles de tous les nouveaux documents. Les valeurs de texte par défaut d’un document définissent la mise en forme de tous les nouveaux objets texte de ce document. (Pour consulter le script complet, voir TextDefaults.) Rem Sets the text defaults of a new document, which set the default formatting Rem for all new text frames. Existing text frames are unaffected. Set myInCopy = CreateObject("InCopy.Application") myInCopy.ViewPreferences.HorizontalMeasurementUnits = idMeasurementUnits.idPoints myInCopy.ViewPreferences.VerticalMeasurementUnits = idMeasurementUnits.idPoints Rem To set the application text formatting defaults, replace "myInCopy" Rem with a reference to a document in the following lines. With myInCopy.TextDefaults .AlignToBaseline = True Rem Because the font might not be available, it's usually best Rem to trap errors using "On Error Resume Next" error handling. Rem Fill in the name of a font on your system. Err.Clear On Error Resume Next .AppliedFont = myInCopy.Fonts.Item("Minion Pro") If Err.Number <> 0 Then Err.Clear End If On Error GoTo 0 Rem Because the font style might not be available, it's usually best Rem to trap errors using "On Error Resume Next" error handling. Err.Clear On Error Resume Next .FontStyle = "Regular" If Err.Number <> 0 Then Err.Clear End If On Error GoTo 0 Rem Because the language might not be available, it's usually best Rem to trap errors using "On Error Resume Next" error handling. Err.Clear On Error Resume Next .AppliedLanguage = "English: USA" If Err.Number <> 0 Then Err.Clear End If On Error GoTo 0 .AutoLeading = 100 .BalanceRaggedLines = False .BaselineShift = 0 .Capitalization = idCapitalization.idNormal .Composer = "Adobe Paragraph Composer" .DesiredGlyphScaling = 100 .DesiredLetterSpacing = 0 .DesiredWordSpacing = 100 .DropCapCharacters = 0 If .DropCapCharacters <> 0 Then .DropCapLines = 3 Rem Assumes that application has a default character style named "myDropCap" .DropCapStyle = myInCopy.CharacterStyles.Item("myDropCap") End If Texte et saisie Mise en forme du texte 46 .FillColor = myInCopy.Colors.Item("Black") .FillTint = 100 .FirstLineIndent = 14 .GridAlignFirstLineOnly = False .HorizontalScale = 100 .HyphenateAfterFirst = 3 .HyphenateBeforeLast = 4 .HyphenateCapitalizedWords = False .HyphenateLadderLimit = 1 .HyphenateWordsLongerThan = 5 .Hyphenation = True .HyphenationZone = 36 .HyphenWeight = 9 .Justification = idJustification.idLeftAlign .KeepAllLinesTogether = False .KeepLinesTogether = True .KeepFirstLines = 2 .KeepLastLines = 2 .KeepWithNext = 0 .KerningMethod = "Optical" .Leading = 14 .LeftIndent = 0 .Ligatures = True .MaximumGlyphScaling = 100 .MaximumLetterSpacing = 0 .MaximumWordSpacing = 160 .MinimumGlyphScaling = 100 .MinimumLetterSpacing = 0 .MinimumWordSpacing = 80 .NoBreak = False .OTFContextualAlternate = True .OTFDiscretionaryLigature = True .OTFFigureStyle = idOTFFigureStyle.idProportionalOldstyle .OTFFraction = True .OTFHistorical = True .OTFOrdinal = False .OTFSlashedZero = True .OTFSwash = False .OTFTitling = False .OverprintFill = False .OverprintStroke = False .PointSize = 11 .Position = idPosition.idNormal .RightIndent = 0 .RuleAbove = False If .RuleAbove = True Then .RuleAboveColor = myInCopy.Colors.Item("Black") .RuleAboveGapColor = myInCopy.Swatches.Item("None") .RuleAboveGapOverprint = False .RuleAboveGapTint = 100 .RuleAboveLeftIndent = 0 .RuleAboveLineWeight = 0.25 .RuleAboveOffset = 14 .RuleAboveOverprint = False .RuleAboveRightIndent = 0 .RuleAboveTint = 100 .RuleAboveType = myInCopy.StrokeStyles.Item("Solid") .RuleAboveWidth = idRuleWidth.idColumnWidth End If .RuleBelow = False Texte et saisie Mise en forme du texte 47 If .RuleBelow = True Then .RuleBelowColor = myInCopy.Colors.Item("Black") .RuleBelowGapColor = myInCopy.Swatches.Item("None") .RuleBelowGapOverPrint = False .RuleBelowGapTint = 100 .RuleBelowLeftIndent = 0 .RuleBelowLineWeight = 0.25 .RuleBelowOffset = 0 .RuleBelowOverPrint = False .RuleBelowRightIndent = 0 .RuleBelowTint = 100 .RuleBelowType = myInCopy.StrokeStyles.Item("Solid") .RuleBelowWidth = idRuleWidth.idColumnWidth End If .SingleWordJustification = idSingleWordJustification.idLeftAlign .Skew = 0 .SpaceAfter = 0 .SpaceBefore = 0 .StartParagraph = idStartParagraph.idAnywhere .StrikeThru = False If .StrikeThru = True Then .StrikeThroughColor = myInCopy.Colors.Item("Black") .StrikeThroughGapColor = myInCopy.Swatches.Item("None") .StrikeThroughGapOverprint = False .StrikeThroughGapTint = 100 .StrikeThroughOffset = 3 .StrikeThroughOverprint = False .StrikeThroughTint = 100 .StrikeThroughType = myInCopy.StrokeStyles.Item("Solid") .StrikeThroughWeight = 0.25 End If .StrokeColor = myInCopy.Swatches.Item("None") .StrokeTint = 100 .StrokeWeight = 0 .Tracking = 0 .Underline = False If .Underline = True Then .UnderlineColor = myInCopy.Colors.Item("Black") .UnderlineGapColor = myInCopy.Swatches.Item("None") .UnderlineGapOverprint = False .UnderlineGapTint = 100 .UnderlineOffset = 3 .UnderlineOverprint = False .UnderlineTint = 100 .UnderlineType = myInCopy.StrokeStyles.Item("Solid") .UnderlineWeight = 0.25 End If .VerticalScale = 100 End With Texte et saisie Mise en forme du texte 48 Polices La collection des polices d’un objet d’application InCopy contient toutes les polices accessibles à InCopy. En revanche, la collection des polices d’un document ne contient que les polices utilisées dans le document. La collection des polices d’un document contient également les polices manquantes (polices utilisées dans le document qui ne sont pas accessibles à InCopy). Le script suivant illustre la différence entre les polices de l’application et celles du document (pour consulter le script complet, voir FontCollections) : Rem Shows the difference between the fonts collection of the application Rem and the fonts collection of a document. Set myInCopy = CreateObject("InCopy.Application") Set myApplicationFonts = myInCopy.Fonts Set myDocument = myInCopy.Documents.Add Set myStory = myDocument.Stories.Item(1) myString = "Document Fonts:" & vbCr For myCounter = 1 To myDocument.Fonts.Count myString = myString & myDocument.Fonts.Item(myCounter).Name & vbCr Next myString = myString & vbCr & "Application Fonts:" & vbCr For myCounter = 1 To myInCopy.Fonts.Count myString = myString & myInCopy.Fonts.Item(myCounter) & vbCr Next myStory.Contents = myString REMARQUE : généralement, le nom des polices se présente sous la forme familyName<tab>fontStyle, où familyName désigne le nom de la famille de polices, <tab> un caractère de tabulation et fontStyle le nom du style de la police. Par exemple : "Adobe Caslon Pro<tab>Semibold Italic" Application d’une police Pour appliquer un changement de police local à une plage de texte, utilisez la propriété appliedFont, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage ApplyFont) : Rem Given a reference to InCopy "myInCopy," a font name "myFontName" Rem and a text object "myText"... myText.appliedFont = myInCopy.Fonts.Item(myFontName) Vous pouvez également appliquer une police en indiquant le nom de la famille de polices et du style de police, comme l’illustre l’extrait de script suivant : myText.AppliedFont = myInCopy.Fonts.Item("Adobe Caslon Pro") myText.FontStyle = "Semibold Italic" Texte et saisie Mise en forme du texte 49 Modification des propriétés d’un texte Les objets texte dans InCopy possèdent des dizaines de propriétés correspondant à leurs attributs de mise en forme. Même un point d’insertion unique est associé à des propriétés qui interviennent sur la mise en forme du texte, y compris les propriétés du paragraphe contenant le point d’insertion. Le script d’apprentissage SetTextProperties permet de définir chaque propriété d’un objet texte. Extrait du script : Rem Shows how to set all read/write properties of a text object. Set myInCopy = CreateObject("InCopy.Application") Set myDocument = myInCopy.Documents.Add() Set myStory = myDocument.Stories.Item(1) myStory.Contents = "x" Set myTextObject = myStory.Characters.Item(1) With myTextObject .AlignToBaseline = False .AppliedCharacterStyle = myDocument.CharacterStyles.Item("[None]") myFontName = "Minion Pro" & vbTab & "Regular" .AppliedFont = myInCopy.Fonts.Item(myFontName) .AppliedLanguage = myInCopy.LanguagesWithVendors.Item("English: USA") .AppliedNumberingList = myDocument.NumberingLists.Item("[Default]") .AppliedParagraphStyle = myDocument.ParagraphStyles.Item("[No Paragraph Style]") .AutoLeading = 120 .BalanceRaggedLines = idBalanceLinesStyle.idNoBalancing .BaselineShift = 0 .BulletsAlignment = idListAlignment.idLeftAlign .BulletsAndNumberingListType = idListType.idNoList .BulletsCharacterStyle = myDocument.CharacterStyles.Item("[None]") .BulletsTextAfter = "^t" .Capitalization = idCapitalization.idNormal .Composer = "Adobe Paragraph Composer" .DesiredGlyphScaling = 100 .DesiredLetterSpacing = 0 .DesiredWordSpacing = 100 .DropCapCharacters = 0 .DropCapLines = 0 .DropCapStyle = myDocument.CharacterStyles.Item("[None]") .DropcapDetail = 0 Rem More text properties in the tutorial script. Modification de la couleur du texte Vous pouvez appliquer des couleurs de fond et de contour aux caractères d’un texte, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage TextColors) : Rem Given two colors "myColorA" and "myColorB"... set myStory = myDocument.Stories.Item(1) myStory.contents = "Text" & vbCr & "Color" Set myText = myStory.Paragraphs.Item(1) myText.PointSize = 72 myText.Justification = idJustification.idCenterAlign Set myText = myStory.Paragraphs.Item(2) myText.StrokeWeight = 3 myText.PointSize = 144 myText.Justification = idJustification.idCenterAlign Texte et saisie Mise en forme du texte 50 Rem Apply a color to the fill of the text. Set myText = myStory.Paragraphs.Item(1) myText.FillColor = myDocument.Colors.Item("DGC1_446a") Rem Use the itemByRange method to apply the color to the stroke of the text. myText.StrokeColor = myDocument.Swatches.Item("DGC1_446b") Set myText = myStory.Paragraphs.Item(2) myText.FillColor = myDocument.Swatches.Item("DGC1_446b") myText.StrokeColor = myDocument.Swatches.Item("DGC1_446a") myText.StrokeWeight = 3 Création et application des styles Même si vous pouvez utiliser des scripts pour appliquer une mise en forme locale, comme dans certains exemples décrits précédemment dans ce chapitre, il est probablement préférable d’utiliser des styles de caractère et de paragraphe pour mettre en forme le texte. Les styles permettent de créer un lien entre le texte mis en forme et le style, ce qui facilite la redéfinition du style, la collecte du texte mis en forme avec un style donné ou la recherche et/ou la modification d’un texte. Les styles de paragraphe et de caractère sont essentiels à la productivité liée à la mise en forme d’un texte et doivent être un élément central pour n’importe quel script appliquant une mise en forme au texte. L’extrait de script suivant montre comment créer et appliquer des styles de paragraphe et de caractère (pour consulter le script complet, voir CreateStyles) : Rem Shows how to create and apply a paragraph style and a character style. Set myInCopy = CreateObject("InCopy.Application") Rem Create an example document. Set myDocument = myInCopy.Documents.Add Rem Create a color for use by one of the paragraph styles we'll create. Set myColor = myAddColor(myDocument, "Red", idColorModel.idProcess, Array(0, 100, 100, 0)) Rem Create a text frame on page 1. Set myStory = myDocument.Stories.Item(1) Rem Fill the text frame with placeholder text. myStory.Contents = "Normal text. Text with a character style applied to it. More normal text." Rem Create a character style named "myCharacterStyle" if Rem no style by that name already exists. Set myCharacterStyle = myAddStyle(myDocument, "myCharacterStyle", 1) Rem At this point, the variable myCharacterStyle contains a reference to a character Rem style object, which you can now use to specify formatting. myCharacterStyle.FillColor = myColor Rem Create a paragraph style named "myParagraphStyle" if Rem no style by that name already exists. Set myParagraphStyle = myAddStyle(myDocument, "myParagraphStyle", 2) Rem At this point, the variable myParagraphStyle contains a reference to a Rem paragraph-style object, which you can now use to specify formatting. myStory.Texts.Item(1).ApplyParagraphStyle myParagraphStyle, True Set myStartCharacter = myStory.Characters.Item(14) Set myEndCharacter = myStory.Characters.Item(55) Set myText = myStory.Texts.ItemByRange(myStartCharacter, myEndCharacter) myText.Item(1).ApplyCharacterStyle myCharacterStyle Function myAddColor(myDocument, myColorName, myColorModel, myColorValue) On Error Resume Next Set myColor = myDocument.Colors.Item(myColorName) If Err.Number <> 0 Then Set myColor = myDocument.Colors.Add myColor.Name = myColorName End If Texte et saisie Mise en forme du texte 51 Err.Clear On Error GoTo 0 myColor.Model = myColorModel myColor.ColorValue = myColorValue Set myAddColor = myColor End Function Function myAddStyle(myDocument, myStyleName, myStyleType) On Error Resume Next Select Case myStyleType Case 1: Set myStyle = myDocument.CharacterStyles.Item(myStyleName) If Err.Number <> 0 Then Set myStyle = myDocument.CharacterStyles.Add myStyle.Name = myStyleName End If Err.Clear On Error GoTo 0 Case 2: Set myStyle = myDocument.ParagraphStyles.Item(myStyleName) If Err.Number <> 0 Then Set myStyle = myDocument.ParagraphStyles.Add myStyle.Name = myStyleName End If Err.Clear On Error GoTo 0 Case 3: Set myStyle = myDocument.ObjectStyles.Item(myStyleName) If Err.Number <> 0 Then Set myStyle = myDocument.ObjectStyles.Add myStyle.Name = myStyleName End If Err.Clear On Error GoTo 0 End Select Set myAddStyle = myStyle End Function Pourquoi utiliser la méthode ApplyParagraphStyle au lieu de définir la propriété AppliedParagraphStyle de l’objet texte ? La méthode offre la possibilité de redéfinir la mise en forme actuelle, tandis que la définition de la propriété sur un style permet de conserver la mise en forme locale. Pourquoi vérifier l’existence d’un style lorsque vous créez un document ? Il peut s’agir d’un style par défaut dans l’application. Si tel est le cas, la création d’un style portant le même nom produit une erreur. Les styles imbriqués appliquent une mise en forme de style de caractère à un paragraphe selon un modèle. L’extrait de script suivant permet de créer et d’appliquer un style de paragraphe contenant des styles imbriqués (pour consulter le script complet, voir NestedStyles) : Rem At this point, the variable myParagraphStyle contains a reference to a Rem paragraoh-style object, which you can now use to specify formatting. Set myNestedStyle = myParagraphStyle.NestedStyles.Add myNestedStyle.AppliedCharacterStyle = myDocument.CharacterStyles.Item("myCharacterStyle") myNestedStyle.Delimiter = "." myNestedStyle.Inclusive = True myNestedStyle.Repetition = 1 Set myStartCharacter = myStory.Characters.Item(1) Texte et saisie Recherche et modification de texte 52 Set myEndCharacter = myStory.Characters.Item(-1) Rem Use the ItemByRange method to apply the paragraph to all text in the Rem story. Note the story object does not have the applyStyle method.) Set myText = myStory.Texts.ItemByRange(myStartCharacter, myEndCharacter).Item(1) myText.ApplyParagraphStyle myParagraphStyle, True Suppression d’un style Lorsque vous supprimez un style à l’aide de l’interface utilisateur, vous pouvez choisir la manière de mettre en forme un texte référencé par ce style. Les scripts InCopy fonctionnent de la même manière, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage RemoveStyle) : Rem Delete the paragraph style myParagraphStyleA and replace with myParagraphStyleB. myParagraphStyleA.Delete myDocument.ParagraphStyles.Item("myParagraphStyleB") Importation de styles de paragraphe et de caractère Vous pouvez importer des styles de paragraphe et de caractère à partir d’autres documents InCopy. L’extrait de script suivant montre comment procéder (pour consulter le script complet, voir ImportTextStyles) : Rem Import the styles from the saved document. Rem ImportStyles parameters: Rem Format as idImportFormat enumeration. Options for text styles are: Rem idImportFormat.idParagraphStylesFormat Rem idImportFormat.idCharacterStylesFormat Rem idImportFormat.idTextStylesFormat Rem From as string (file path) Rem GlobalStrategy as idGlobalClashResolutionStrategy enumeration. Options are: Rem idGlobalClashResolutionStrategy.idDoNotLoadTheStyle Rem idGlobalClashResolutionStrategy.idLoadAllWithOverwrite Rem idGlobalClashResolutionStrategy.idLoadAllWithRename myNewDocument.ImportStyles idImportFormat.idTextStylesFormat, "c:\styles.icml", idGlobalClashResolutionStrategy.idLoadAllWithOverwrite Recherche et modification de texte La fonction de recherche/modification est l’un des outils InCopy les plus performants pour la manipulation du texte. Elle est entièrement prise en charge par les scripts qui peuvent y recourir pour exécuter des opérations qui dépassent le cadre d’utilisation de l’interface utilisateur InCopy. Il existe dans InCopy trois méthodes de recherche de texte : X Vous pouvez rechercher un texte et des attributs de mise en forme et les redéfinir. Ce type d’opération de recherche et de modification utilise les objets FindTextPreferences et ChangeTextPreferences pour définir les paramètres des méthodes findText et changeText. X Vous pouvez effectuer une recherche à partir d’expressions régulières ou utiliser la commande « grep ». Ce type d’opération de recherche et de modification utilise les objets FindGrepPreferences et ChangeGrepPreferences pour définir les paramètres des méthodes findGrep et changeGrep. X Vous pouvez rechercher des glyphes spécifiques (et leur mise en forme) et les remplacer par d’autres glyphes et attributs de mise en forme. Ce type d’opération de recherche et de modification utilise les objets FindGlyphPreferences et ChangeGlyphPreferences pour définir les paramètres des méthodes findGlyph et changeGlyph. Texte et saisie Recherche et modification de texte 53 Toutes les méthodes de recherche et de modification adoptent un seul paramètre facultatif, ReverseOrder, qui définit l’ordre dans lequel les résultats de la recherche sont renvoyés. Si vous utilisez les résultats d’une opération de recherche ou de modification pour ajouter du texte à un article ou en retirer, vous pouvez rencontrer un problème de références de texte incorrectes, comme décrit à la section « Objets texte et itération » à la page 44. Dans ce cas, vous pouvez soit définir les boucles en mode inverse dans la collection d’objets texte renvoyés, soit faire en sorte que l’opération de recherche renvoie les résultats dans l’ordre inverse, puis effectuer normalement une itération dans la collection. Préférences de recherche/modification Avant d’effectuer une recherche, il est recommandé d’effacer les préférences de recherche et de modification, pour s’assurer que les paramètres de recherche précédents n’ont aucun effet sur votre recherche. Vous devez également définir quelques préférences de recherche et de modification pour indiquer le texte, la mise en forme, l’expression régulière ou le glyphe à rechercher et/ou modifier. Une opération de recherche/modification courante comprend les étapes suivantes : 1. Effacer les préférences de recherche/modification. Selon le type d’opération de recherche/modification, le processus peut prendre l’une des trois formes suivantes : Rem Find/Change text preferences (where "myInCopy" is a Rem reference to the InCopy application myInCopy.FindTextPreferences = idNothingEnum.idNothing myInCopy.ChangeTextPreferences = idNothingEnum.idNothing Rem Find/Change grep preferences myInCopy.FindGrepPreferences = idNothingEnum.idNothing myInCopy.ChangeGrepPreferences = idNothingEnum.idNothing Rem Find/Change glyph preferences myInCopy.FindGlyphPreferences = idNothingEnum.idNothing myInCopy.ChangeGlyphPreferences = idNothingEnum.idNothing 2. Définir les paramètres de recherche/modification. 3. Exécuter l’opération de recherche/modification. 4. Effacer de nouveau les préférences de recherche/modification. Recherche de texte L’extrait de script suivant permet de rechercher une chaîne de caractères spécifiée. Même si l’extrait de script fait porter la recherche sur le document entier, vous pouvez aussi effectuer une recherche dans les articles, les blocs de texte, les paragraphes, les colonnes de texte ou tout autre objet texte. La méthode findText et ses paramètres sont identiques pour tous les objets texte. (Pour consulter le script complet, voir FindText.) Rem Clear the find/change preferences. myInCopy.FindTextPreferences = idNothingEnum.idNothing myInCopy.ChangeTextPreferences = idNothingEnum.idNothing Rem Search the document for the string "Text". myInCopy.FindTextPreferences.FindWhat = "text" Rem Set the find options. myInCopy.FindChangeTextOptions.CaseSensitive = False myInCopy.FindChangeTextOptions.IncludeFootnotes = False myInCopy.FindChangeTextOptions.IncludeHiddenLayers = False myInCopy.FindChangeTextOptions.IncludeLockedLayersForFind = False myInCopy.FindChangeTextOptions.IncludeLockedStoriesForFind = False myInCopy.FindChangeTextOptions.IncludeMasterPages = False Texte et saisie Recherche et modification de texte 54 myInCopy.FindChangeTextOptions.WholeWord = False Set myFoundItems = myInCopy.Documents.Item(1).FindText() MsgBox ("Found " & CStr(myFoundItems.Count) & " instances of the search string.") myInCopy.FindTextPreferences = idNothingEnum.idNothing myInCopy.ChangeTextPreferences = idNothingEnum.idNothing L’extrait de script suivant permet de rechercher une chaîne de caractères spécifiée et de la remplacer par une chaîne différente (pour consulter le script complet, voir ChangeText) : Rem Clear the find/change preferences. myInCopy.FindTextPreferences = idNothingEnum.idNothing myInCopy.ChangeTextPreferences = idNothingEnum.idNothing Rem Search the document for the string "Text". myInCopy.FindTextPreferences.FindWhat = "text" Rem Set the find options. myInCopy.FindChangeTextOptions.CaseSensitive = False myInCopy.FindChangeTextOptions.IncludeFootnotes = False myInCopy.FindChangeTextOptions.IncludeHiddenLayers = False myInCopy.FindChangeTextOptions.IncludeLockedLayersForFind = False myInCopy.FindChangeTextOptions.IncludeLockedStoriesForFind = False myInCopy.FindChangeTextOptions.IncludeMasterPages = False myInCopy.FindChangeTextOptions.WholeWord = False Set myFoundItems = myInCopy.Documents.Item(1).FindText MsgBox ("Found " & CStr(myFoundItems.Count) & " instances of the search string.") myInCopy.FindTextPreferences = idNothingEnum.idNothing myInCopy.ChangeTextPreferences = idNothingEnum.idNothing Recherche et remplacement d’une mise en forme Pour rechercher et remplacer la mise en forme du texte, définissez d’autres propriétés des objets findTextPreferences et changeTextPreferences, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage FindChangeFormatting) : Rem Clear the find/change preferences. myInCopy.FindTextPreferences = idNothingEnum.idNothing myInCopy.ChangeTextPreferences = idNothingEnum.idNothing Rem Set the find options. myInCopy.FindChangeTextOptions.CaseSensitive = False myInCopy.FindChangeTextOptions.IncludeFootnotes = False myInCopy.FindChangeTextOptions.IncludeHiddenLayers = False myInCopy.FindChangeTextOptions.IncludeLockedLayersForFind = False myInCopy.FindChangeTextOptions.IncludeLockedStoriesForFind = False myInCopy.FindChangeTextOptions.IncludeMasterPages = False myInCopy.FindChangeTextOptions.WholeWord = False Rem Search the document for the 24 point text and change it to 10 point text. myInCopy.FindTextPreferences.PointSize = 24 myInCopy.ChangeTextPreferences.PointSize = 10 Set myFoundItems = myInCopy.Documents.Item(1).ChangeText myInCopy.FindTextPreferences = idNothingEnum.idNothing myInCopy.ChangeTextPreferences = idNothingEnum.idNothing Vous pouvez également rechercher une chaîne de caractères et appliquer une mise en forme, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage FindChangeStringFormatting) : Rem Clear the find/change preferences before the search. myInCopy.FindTextPreferences = idNothingEnum.idNothing myInCopy.ChangeTextPreferences = idNothingEnum.idNothing Rem Set the general find/change options. myInCopy.findChangeTextOptions.caseSensitive = false Texte et saisie Recherche et modification de texte 55 myInCopy.findChangeTextOptions.includeFootnotes = false myInCopy.findChangeTextOptions.includeHiddenLayers = false myInCopy.findChangeTextOptions.includeLockedLayersForFind = false myInCopy.findChangeTextOptions.includeLockedStoriesForFind = false myInCopy.findChangeTextOptions.includeMasterPages = false myInCopy.findChangeTextOptions.wholeWord = false Rem The following line will only work if your default Rem font has a font style named "Bold" if not, change Rem the text to a font style used by your default font. myInCopy.ChangeTextPreferences.FontStyle = "Bold" Rem In this example, we'll use the InCopy search Rem metacharacter "^9" to find any digit. myInCopy.FindTextPreferences.FindWhat = "WIDGET^9^9^9^9" set myFoundItems = myDocument.ChangeText MsgBox ("Changed " & CStr(myFoundItems.Count) & " instances of the search string.") Rem Clear the find/change preferences after the search. myInCopy.FindTextPreferences = idNothingEnum.idNothing myInCopy.ChangeTextPreferences = idNothingEnum.idNothing Utilisation de l’outil Grep InCopy prend en charge la recherche/modification des expressions régulières à l’aide des méthodes findGrep et changeGrep. Les opérations de recherche/modification des expressions régulières permettent également de rechercher du texte dans un format particulier ou de remplacer la mise en forme du texte par des attributs de mise en forme spécifiés dans les propriétés de l’objet changeGrepPreferences. L’extrait de script suivant montre comment utiliser ces méthodes et les objets de préférences associés (pour consulter le script complet, voir FindGrep) : Rem Clear the find/change preferences. myInCopy.FindGrepPreferences = idNothingEnum.idNothing myInCopy.ChangeGrepPreferences = idNothingEnum.idNothing Rem Set the find options. myInCopy.FindChangeGrepOptions.IncludeFootnotes = False myInCopy.FindChangeGrepOptions.IncludeHiddenLayers = False myInCopy.FindChangeGrepOptions.IncludeLockedLayersForFind = False myInCopy.FindChangeGrepOptions.IncludeLockedStoriesForFind = False myInCopy.FindChangeGrepOptions.IncludeMasterPages = False Rem Regular expression for finding an email address. myInCopy.FindGrepPreferences.FindWhat = "(?i)[A-Z]*?@[A-Z]*?[.]..." Rem Apply the change to 24-point text only. myInCopy.FindGrepPreferences.PointSize = 24 myInCopy.ChangeGrepPreferences.Underline = True myInCopy.Documents.Item(1).ChangeGrep Rem Clear the find/change preferences after the search. myInCopy.FindGrepPreferences = idNothingEnum.idNothing myInCopy.ChangeGrepPreferences = idNothingEnum.idNothing REMARQUE : il manque à l’objet findChangeGrepOptions deux propriétés de l’objet FindChangeTextOptions : WholeWord et CaseSensitive. En fait, vous pouvez définir ces options en utilisant l’expression régulière elle-même. Utilisez (?i) pour activer le respect de la casse et (?-i) pour le désactiver. Utilisez \> pour faire coïncider le début d’un mot et \< la fin d’un mot, ou utilisez \b pour faire coïncider les limites d’un mot. Texte et saisie Recherche et modification de texte 56 Une utilisation pratique de l’outil de recherche/modification grep consiste à convertir le balisage d’un texte (par exemple, certaines formes de balisage du texte brut avec des instructions de mise en forme) en texte InCopy mis en forme. Les balises de paragraphe PageMaker (à différencier des fichiers de format texte balisés PageMaker) illustrent un schéma de balisage de texte simplifié. Dans un fichier texte balisé selon ce schéma, le nom des styles de paragraphe s’affiche en début de paragraphe, comme indiqué dans ces exemples : <heading1>This is a heading. <body_text>This is body text. Nous pouvons créer un script qui utilise l’outil de recherche grep dans le cadre des opérations de recherche/modification de texte pour appliquer la mise en forme au texte et supprimer les balises de marquage, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage ReadPMTags) : Function myReadPMTags(myInCopy, myStory) Set myDocument = myStory.Parent Rem Reset the findGrepPreferences to ensure that previous settings Rem do not affect the search. myInCopy.FindGrepPreferences = idNothingEnum.idNothing myInCopy.ChangeGrepPreferences = idNothingEnum.idNothing myInCopy.FindGrepPreferences.findWhat = "(?i)^<\s*\w+\s*>" Set myFoundItems = myStory.findGrep If myFoundItems.Count <> 0 Then Set myFoundTags = CreateObject("Scripting.Dictionary") For myCounter = 1 To myFoundItems.Count If Not (myFoundTags.Exists(myFoundItems.Item(myCounter).Contents)) Then myFoundTags.Add myFoundItems.Item(myCounter).Contents, myFoundItems.Item(myCounter).Contents End If Next Rem At this point, we have a list of tags to search for. For Each myFoundTag In myFoundTags myString = myFoundTag Rem Find the tag using findWhat. myInCopy.FindTextPreferences.findWhat = myString Rem Extract the style name from the tag. myStyleName = Mid(myString, 2, Len(myString) - 2) Rem Create the style if it does not already exist. Set myStyle = myAddStyle(myDocument, myStyleName) Rem Apply the style to each instance of the tag. myInCopy.ChangeTextPreferences.AppliedParagraphStyle = myStyle myStory.ChangeText Rem Reset the changeTextPreferences. myInCopy.ChangeTextPreferences = idNothingEnum.idNothing Rem Set the changeTo to an empty string. myInCopy.ChangeTextPreferences.ChangeTo = "" Rem Search to remove the tags. myStory.ChangeText Rem Reset the find/change preferences again. myInCopy.ChangeTextPreferences = idNothingEnum.idNothing Next End If Rem Reset the findGrepPreferences. myInCopy.FindGrepPreferences = idNothingEnum.idNothing End Function Function myAddStyle(myDocument, myStyleName) On Error Resume Next Set myStyle = myDocument.ParagraphStyles.Item(myStyleName) If Err.Number <> 0 Then Texte et saisie Tableaux 57 Set myStyle = myDocument.ParagraphStyles.Add myStyle.Name = myStyleName End If Err.Clear On Error GoTo 0 Set myAddStyle = myStyle End Function Recherche de glyphes Vous pouvez rechercher et modifier des caractères individuels dans une police particulière avec les méthodes FindGlyph et ChangeGlyph, ainsi que les objets FindGlyphPreferences et ChangeGlyphPreferences associés. L’extrait de script suivant permet de rechercher et remplacer un glyphe dans un exemple de document (pour consulter le script complet, voir FindChangeGlyphs) : Rem Clear the find/change preferences. myInCopy.FindGlyphPreferences = idNothingEnum.idNothing myInCopy.ChangeGlyphPreferences = idNothingEnum.idNothing Rem Set the find options. myInCopy.FindChangeGrepOptions.IncludeFootnotes = False myInCopy.FindChangeGrepOptions.IncludeHiddenLayers = False myInCopy.FindChangeGrepOptions.IncludeLockedLayersForFind = False myInCopy.FindChangeGrepOptions.IncludeLockedStoriesForFind = False myInCopy.FindChangeGrepOptions.IncludeMasterPages = False Rem You must provide a font that is used in the document for the Rem AppliedFont property of the FindGlyphPreferences object. myInCopy.FindGlyphPreferences.AppliedFont = myDocument.Fonts.Item("Minion Pro Regular"); Rem Provide the glyph ID, not the glyph Unicode value. myInCopy.FindGlyphPreferences.GlyphID = 500; Rem The appliedFont of the changeGlyphPreferences object can be Rem any font available to the application. myInCopy.changeGlyphPreferences.AppliedFont = myInCopy.Fonts.Item("Times New Roman Regular"); myInCopy.Documents.Item(1).ChangeGlyph Rem Clear the find/change preferences after the search. myInCopy.FindGlyphPreferences = idNothingEnum.idNothing myInCopy.ChangeGlyphPreferences = idNothingEnum.idNothing Tableaux Il est possible de créer des tableaux à partir d’un texte existant à l’aide de la méthode ConvertTextToTable ou de créer un tableau vide dans un article à n’importe quel point d’insertion. L’extrait de script suivant illustre trois méthodes différentes pour créer un tableau (pour consulter le script complet, voir MakeTable) : Set Set Set Set Rem Rem Rem Rem Rem Rem Rem myStory = myDocument.Stories.Item(1) myStartCharacter = myStory.Paragraphs.Item(7).Characters.Item(1) myEndCharacter = myStory.Paragraphs.Item(7).Characters.Item(-2) myText = myStory.Texts.ItemByRange(myStartCharacter, myEndCharacter).Item(1) The convertToTable method takes three parameters: [ColumnSeparator as string] [RowSeparator as string] [NumberOfColumns as integer] (only used if the ColumnSeparator and RowSeparator values are the same) In the last paragraph in the story, columns are separated by commas and rows are separated by semicolons, so we provide those characters Texte et saisie Tableaux 58 Rem to the method as parameters. Set myTable = myText.ConvertToTable(",", ";") Set myStartCharacter = myStory.Paragraphs.Item(2).Characters.Item(1) Set myEndCharacter = myStory.Paragraphs.Item(5).Characters.Item(-2) Set myText = myStory.Texts.ItemByRange(myStartCharacter, myEndCharacter).Item(1) Rem In the second through the fifth paragraphs, colums are separated by Rem tabs and rows are separated by returns. These are the default delimiter Rem parameters, so we don't need to provide them to the method. Set myTable = myText.ConvertToTable Rem You can also explicitly add a table--you don't have to convert text to a table. Set myTable = myStory.InsertionPoints.Item(-1).Tables.Add myTable.ColumnCount = 3 myTable.BodyRowCount = 3 L’extrait de script suivant permet de fusionner les cellules d’un tableau (pour consulter le script complet, voir MergeTableCells) : Set myInCopy = CreateObject("InCopy.Application") Set myDocument = myInCopy.Documents.Add Set myStory = myDocument.Stories.Item(1) myString = "Table" & vbCr myStory.Contents = myString Set myTable = myStory.InsertionPoints.Item(-1).Tables.Add myTable.ColumnCount = 4 myTable.BodyRowCount = 4 Rem Merge all of the cells in the first column. myTable.Cells.Item(1).Merge myTable.Columns.Item(1).Cells.Item(-1) Rem Convert column 2 into 2 cells (rather than 4). myTable.Columns.Item(2).Cells.Item(-1).Merge myTable.Columns.Item(2).Cells.Item(-2) myTable.Columns.Item(2).Cells.Item(1).Merge myTable.Columns.Item(2).Cells.Item(2) Rem Merge the last two cells in row 1. myTable.Rows.Item(1).Cells.Item(-1).Merge myTable.Rows.Item(1).Cells.Item(-1) Rem Merge the last two cells in row 3. myTable.Rows.Item(3).Cells.Item(-2).Merge myTable.Rows.Item(3).Cells.Item(-1) L’extrait de script suivant permet de scinder les cellules d’un tableau (pour consulter le script complet, voir SplitTableCells) : myTable.Cells.Item(1).Split idHorizontalOrVertical.idHorizontal myTable.Columns.Item(1).Split idHorizontalOrVertical.idVertical myTable.Cells.Item(1).Split idHorizontalOrVertical.idVertical myTable.Rows.Item(-1).Split idHorizontalOrVertical.idHorizontal myTable.Cells.Item(-1).Split idHorizontalOrVertical.idVertical For myRowCounter = 1 To myTable.Rows.Count Set myRow = myTable.Rows.Item(myRowCounter) For myCellCounter = 1 To myRow.Cells.Count myString = "Row: " & myRowCounter & " Cell: " & myCellCounter myRow.Cells.Item(myCellCounter).contents = myString Next Next L’extrait de script suivant permet de créer des lignes d’en-tête et de notes de bas de page dans un tableau (pour consulter le script complet, voir HeaderAndFooterRows) : Set myTable = myDocument.Stories.Item(1).Tables.Item(1) Rem Convert the first row to a header row. myTable.Rows.Item(1).RowType = idRowTypes.idHeaderRow Rem Convert the last row to a footer row. myTable.Rows.Item(-1).RowType = idRowTypes.idFooterRow Texte et saisie Tableaux 59 L’extrait de script suivant permet d’appliquer des attributs de mise en forme à un tableau (pour consulter le script complet, voir TableFormatting) : Set myTable = myStory.Tables.Item(1) Rem Convert the first row to a header row. myTable.Rows.Item(1).RowType = idRowTypes.idHeaderRow Rem Use a reference to a swatch, rather than to a color. myTable.Rows.Item(1).FillColor = myDocument.Swatches.Item("DGC1_446b") myTable.Rows.Item(1).FillTint = 40 myTable.Rows.Item(2).FillColor = myDocument.Swatches.Item("DGC1_446a") myTable.Rows.Item(2).FillTint = 40 myTable.Rows.Item(3).FillColor = myDocument.Swatches.Item("DGC1_446a") myTable.Rows.Item(3).FillTint = 20 myTable.Rows.Item(4).FillColor = myDocument.Swatches.Item("DGC1_446a") myTable.Rows.Item(4).FillTint = 40 Rem Iterate through the cells to apply the cell stroke formatting. For myCounter = 1 To myTable.Cells.Count myTable.Cells.Item(myCounter).TopEdgeStrokeColor = myDocument.Swatches.Item("DGC1_446b") myTable.Cells.Item(myCounter).TopEdgeStrokeWeight = 1 myTable.Cells.Item(myCounter).BottomEdgeStrokeColor = myDocument.Swatches.Item("DGC1_446b") myTable.Cells.Item(myCounter).BottomEdgeStrokeWeight = 1 Rem When you set a cell stroke to a swatch, make certain you also set the Rem stroke weight. myTable.Cells.Item(myCounter).LeftEdgeStrokeColor = myDocument.Swatches.Item("None") myTable.Cells.Item(myCounter).LeftEdgeStrokeWeight = 0 myTable.Cells.Item(myCounter).RightEdgeStrokeColor = myDocument.Swatches.Item("None") myTable.Cells.Item(myCounter).RightEdgeStrokeWeight = 0 Next L’extrait de script suivant permet d’ajouter une mise en forme de ligne en alternance à un tableau (pour consulter le script complet, voir AlternatingRows) : Set myTable = myDocument.stories.Item(1).tables.Item(1) Rem Convert the first row to a header row. myTable.rows.Item(1).rowType = idRowTypes.idHeaderRow Rem Applly alternating fills to the table. myTable.alternatingFills = idAlternatingFillsTypes.idAlternatingRows myTable.startRowFillColor = myDocument.swatches.Item("DGC1_446a") myTable.startRowFillTint = 60 myTable.endRowFillColor = myDocument.swatches.Item("DGC1_446b") myTable.endRowFillTint = 50 L’extrait de script suivant montre comment traiter la sélection lorsque du texte ou des cellules de tableau sont sélectionnés. Dans cet exemple, le script affiche une alerte pour chaque condition de sélection, mais un véritable script de production pourrait manipuler les éléments sélectionnés. (Pour consulter le script complet, voir TableSelection.) If myInCopy.Documents.Count <> 0 Then If myInCopy.Selection.Count <> 0 Then Select Case TypeName(myInCopy.Selection.Item(1)) Rem When a row, a column, or a range of cells is selected, Rem the type returned is "Cell" Case "Cell" MsgBox ("A cell is selected.") Case "Table" MsgBox ("A table is selected.") Texte et saisie Correction automatique 60 Case "InsertionPoint", "Character", "Word", "TextStyleRange", "Line", "Paragraph", "TextColumn", "Text" If TypeName(myInCopy.Selection.Item(1).Parent) = "Cell" Then MsgBox ("The selection is inside a table cell.") Else MsgBox ("The selection is not inside a table.") End If Case Else MsgBox ("The selection is not inside a table.") End Select End If End If Correction automatique La fonction de correction automatique permet de corriger le texte pendant la saisie. Le script suivant illustre son mode d’utilisation (pour consulter le script complet, voir Autocorrect) : Rem The autocorrect preferences object turns the autocorrect feature Rem on or off. ReDim myNewWordPairList(0) Set myInCopy = CreateObject("InCopy.Application") Rem Add a word pair to the autocorrect list. Each AutoCorrectTable is linked Rem to a specific language. Set myAutoCorrectTable = myInCopy.AutoCorrectTables.Item("English: USA") Rem To safely add a word pair to the auto correct table, get the current Rem word pair list, then add the new word pair to that array, and then Rem set the autocorrect word pair list to the array. myWordPairList = myAutoCorrectTable.AutoCorrectWordPairList ReDim myNewWordPairList(UBound(myWordPairList) + 1) For myCounter = 0 To UBound(myWordPairList) - 1 myNewWordPairList(myCounter) = myWordPairList(myCounter) Next Rem Add a new word pair to the array. myNewWordPairList(UBound(myNewWordPairList)) = (Array("paragraph", "paragraph")) Rem Update the word pair list. myAutoCorrectTable.AutoCorrectWordPairList = myNewWordPairList Rem To clear all autocorrect word pairs in the current dictionary: Rem myAutoCorrectTable.autoCorrectWordPairList = array(()) Rem Turn autocorrect on if it's not on already. If myInCopy.AutoCorrectPreferences.AutoCorrect = False Then yInCopy.AutoCorrectPreferences.AutoCorrect = True End If myInCopy.AutoCorrectPreferences.AutoCorrectCapitalizationErrors = True Notes de bas de page L’extrait de script suivant permet d’ajouter des notes de bas de page à un article (pour consulter le script complet, voir Footnotes) : Set myDocument = myInCopy.Documents.Item(1) With myDocument.FootnoteOptions .SeparatorText = vbTab .MarkerPositioning = idFootnoteMarkerPositioning.idSuperscriptMarker End With Set myStory = myDocument.Stories.Item(1) Rem Add four footnotes at random locations in the story. Texte et saisie Notes de bas de page 61 For myCounter = 1 To 4 myRandomNumber = CLng(myGetRandom(1, myStory.Words.Count)) Set myWord = myStory.Words.Item(myRandomNumber) Set myFootnote = myWord.InsertionPoints.Item(-1).Footnotes.Add Rem Note: when you create a footnote, it contains text--the footnote Rem marker and the separator text (if any). If you try to set the text of Rem the footnote by setting the footnote contents, you will delete the Rem marker. Instead, append the footnote text, as shown below. myFootnote.InsertionPoints.Item(-1).Contents = "This is a footnote." Next Rem This function gets a random number in the range myStart to myEnd. Function myGetRandom(myStart, myEnd) Rem Here's how to generate a random number from a given range: Rem Int((upperbound - lowerbound + 1) * Rnd + lowerbound) myGetRandom = (myEnd - (myStart + 1)) * Rnd + myStart End Function 5 Interfaces utilisateur Statut de mise à jour du chapitre CS6 Inchangé Avec VBScript, vous pouvez créer des boîtes de dialogue pour les questions de type oui/non et la saisie de texte, mais vous aurez parfois besoin de créer des boîtes de dialogue plus complexes pour vos scripts. Avec les scripts InCopy, vous pouvez ajouter des boîtes de dialogue et les compléter avec des éléments d’interface utilisateur courants, comme des listes déroulantes, des champs d’entrée de texte et des champs numériques. Pour que votre script puisse collecter les informations entrées par vos soins ou par tout autre utilisateur et les traiter, utilisez l’objet dialog. Ce chapitre décrit l’utilisation des scripts de boîte de dialogue InCopy. Les exemples de scripts de ce chapitre sont présentés par ordre de complexité, en commençant par des scripts très simples et en progressant vers des opérations plus complexes. REMARQUE : les scripts InCopy créés dans JavaScript peuvent également inclure des interfaces utilisateur créées à l’aide du composant Adobe ScriptUI. Ce chapitre contient certains didacticiels de script ScriptUI ; pour plus de détails, voir le Guide des outils JavaScript Adobe Creative Suite® 3. REMARQUE : en Visual Basic, il est possible de créer des interfaces utilisateur complètes, mais elles seront exécutées à partir d’un fichier Visual Basic exécutable distinct. Avec les scripts InCopy, vous avez la possibilité de créer des boîtes de dialogue complexes à afficher dans InCopy et ressemblant à l’interface utilisateur standard du programme. Les scripts VBScript exécutés depuis le panneau Scripts sont plus rapides que les scripts exécutés dans une application externe. Vous devez avoir préalablement lu le Chapitre 2, « Prise en main » et savoir créer, installer et exécuter un script. Présentation des boîtes de dialogue Une boîte de dialogue InCopy est un objet de script InCopy comme un autre. La boîte de dialogue peut contenir plusieurs types d’éléments (appelés collectivement « objets d’interface » (ou widgets), comme illustré ci-dessous. 62 Interfaces utilisateur Présentation des boîtes de dialogue 63 Les éléments de la figure sont définis dans le tableau suivant : Elément de boîte de dialogue Nom InCopy Text-edit fields Text editbox control Numeric-entry fields Real editbox, integer editbox, measurement editbox, percent editbox, angle editbox Pop-up menus Drop-down control Control that combines a text-edit field with a pop-up menu Combo-box control Check box Check-box control Radio buttons Radio-button control L’objet dialog ne contient pas directement de commandes ; c’est le but de l’objet DialogColumn. L’objet DialogColumns permet de contrôler la position des commandes dans une boîte de dialogue. Dans un objet DialogColumns, il est possible de diviser une colonne de boîte de dialogue en plusieurs autres objets DialogColumns ou BorderPanels (qui peuvent eux-mêmes être divisés en d’autres objets DialogColumns et BorderPanels). Comme tout autre objet de script InCopy, les différentes parties d’une boîte de dialogue possèdent leurs propres propriétés. Par exemple, une commande CheckboxControl possède une propriété pour son texte (StaticLabel) et une autre propriété pour son état (CheckedState). La commande Dropdown possède une propriété (StringList) qui permet de paramétrer la liste d’options figurant dans son menu. Pour utiliser une boîte de dialogue dans un script, vous devez créer l’objet dialog, le remplir de commandes, afficher la boîte de dialogue et rassembler les valeurs de ses commandes afin de les rendre disponibles pour le script. Les boîtes de dialogue restent dans la mémoire InCopy jusqu’à leur destruction. De cette façon, vous pouvez conserver une boîte de dialogue en mémoire et faire en sorte que les données stockées dans ses propriétés soient utilisées par plusieurs scripts. Notez que ces boîtes de Interfaces utilisateur Votre première boîte de dialogue InCopy 64 dialogue occupent de l’espace mémoire et doivent être supprimées lorsqu’elles sont inutilisées. En règle générale, il est préférable de détruire l’objet boîte de dialogue avant la fin de l’exécution du script. Votre première boîte de dialogue InCopy Le processus de création d’une boîte de dialogue InCopy est très simple : vous ajoutez une boîte de dialogue, une colonne à la boîte de dialogue et des commandes à la colonne de la boîte de dialogue. Le script ci-après illustre ce processus (pour consulter le script complet, voir SimpleDialog). Set myInCopy = CreateObject("InCopy.Application") Set myDialog = myInCopy.Dialogs.Add myDialog.name = "Simple Dialog" Rem Add a dialog column. With myDialog.DialogColumns.Add With .StaticTexts.Add .StaticLabel = "This is a very simple dialog box." End With End With Rem Show the dialog box. myResult = myDialog.Show Rem If the user clicked OK, display one message; Rem if they clicked Cancel, display a different message. If myResult = True Then MsgBox "You clicked the OK button." Else MsgBox "You clicked the Cancel button." End If Rem Remove the dialog box from memory. myDialog.Destroy Ajout d’une interface utilisateur à « Hello World » Dans cet exemple, nous ajoutons une interface utilisateur simple au script d’apprentissage « Hello World » présenté au Chapitre 2, « Prise en main ». Les options de la boîte de dialogue vous permettent d’indiquer l’échantillon de texte et de modifier le corps de la police du texte. Pour consulter le script complet, voir HelloWorldUI. Set myInCopy = CreateObject("InCopy.Application") Set myDialog = myInCopy.Dialogs.Add myDialog.CanCancel = True myDialog.Name = " Simple User Interface Example Script" Set myDialogColumn = myDialog.DialogColumns.Add Set myTextEditField = myDialogColumn.TextEditboxes.Add myTextEditField.EditContents = "Hello World!" myTextEditField.MinWidth = 180 Rem Create a number (real) entry field. Set myPointSizeField = myDialogColumn.RealEditboxes.Add myPointSizeField.EditValue = 72 myDialog.Show Rem Get the values from the dialog box controls. myString = myTextEditField.EditContents myPointSize = myPointSizeField.EditValue Rem Remove the dialog box from memory. myDialog.Destroy Rem Create a new document. Set myDocument = myInCopy.Documents.Add Interfaces utilisateur Création d’une interface utilisateur plus complexe 65 Set myStory = myDocument.Stories.Item(1) Rem Enter the text from the dialog box. myStory.Contents = myString Rem Set the size of the text to the size you entered in the dialog box. myStory.Texts.Item(1).PointSize = myPointSize Création d’une interface utilisateur plus complexe Dans l’exemple suivant, nous allons ajouter des commandes supplémentaires et de différents types à notre boîte de dialogue. L’exemple permet de créer une boîte de dialogue ressemblant à l’illustration ci-dessous. Pour consulter le script complet, voir ComplexUI. Function myDisplayDialog(myInCopy) ReDim mySwatchNames(myInCopy.Swatches.Count -1) For myCounter = 1 To myInCopy.Swatches.Count Set mySwatch = myInCopy.Swatches.Item(myCounter) mySwatchNames(myCounter - 1) = mySwatch.Name Next Set myDialog = myInCopy.Dialogs.Add myDialog.CanCancel = True myDialog.Name = "ComplexUI" Rem Create a dialog column. With myDialog.DialogColumns.Add Rem Create a border panel. With .BorderPanels.Add With .DialogColumns.Add With .DialogRows.Add With .StaticTexts.Add .StaticLabel = "Message:" End With Set myTextEditField = .TextEditboxes.Add myTextEditField.EditContents = "Hello World!" myTextEditField.MinWidth = 180 End With End With End With With .BorderPanels.add With .DialogColumns.Add With .DialogRows.Add With .StaticTexts.Add .StaticLabel = "Point Size:" End With Set myPointSizeField = .MeasurementEditboxes.Add myPointSizeField.EditUnits = idMeasurementUnits.idPoints myPointSizeField.EditValue = 72 Interfaces utilisateur Création d’une interface utilisateur plus complexe End With End With End with With .BorderPanels.Add With .DialogColumns.Add With .DialogRows.Add With .StaticTexts.Add .StaticLabel = "Paragraph Alignment:" End With Set myRadioButtonGroup = .RadiobuttonGroups.Add With myRadioButtonGroup With .RadiobuttonControls.Add .StaticLabel = "Left" .CheckedState = True End With With .RadiobuttonControls.Add .StaticLabel = "Center" End With With .RadiobuttonControls.Add .StaticLabel = "Right" End With End With End With End With End With With .BorderPanels.Add With .DialogColumns.Add With .DialogRows.Add With .StaticTexts.Add .StaticLabel = "Text Color:" End With Set mySwatchDropdown = .Dropdowns.Add mySwatchDropdown.StringList = mySwatchNames mySwatchDropdown.SelectedIndex = 2 End With End With End With End With Rem If the user clicked OK, then create the example document. If myDialog.Show = True Then Rem Get the values from the dialog box controls. myString = myTextEditField.EditContents myPointSize = myPointSizeField.EditValue myParagraphAlignment = myRadioButtonGroup.SelectedButton mySwatchName = mySwatchNames(mySwatchDropdown.SelectedIndex) myDialog.Destroy myCreateExampleDocument myInCopy, myString, myPointSize, myParagraphAlignment, mySwatchName Else myDialog.Destroy End If End Function Function myCreateExampleDocument(myInCopy, myString, myPointSize, myParagraphAlignment, mySwatchName) Set myDocument = myInCopy.Documents.Add Set myStory = myDocument.Stories.Item(1) Rem Enter the text from the dialog box in the story. myStory.Contents = myString Rem Set the size of the text to the size you entered in the dialog box. myStory.Texts.Item(1).PointSize = myPointSize 66 Interfaces utilisateur Utilisation de ScriptUI 67 Rem set the paragraph alignment of the text to the Remdialog radio button choice. Select Case myParagraphAlignment Case 0 myStory.Texts.Item(1).Justification = idJustification.idLeftAlign Case 1 myStory.Texts.Item(1).Justification = idJustification.idCenterAlign Case Else myStory.Texts.Item(1).Justification = idJustification.idRightAlign End Select Rem Apply the selected swatch to the fill of the text. myStory.Texts.Item(1).FillColor = myDocument.Swatches.Item(mySwatchName) End function Utilisation de ScriptUI Avec JavaScript, vous pouvez créer et définir des éléments d’interface utilisateur à l’aide du composant de script Adobe appelé ScriptUI. ScriptUI permet aux créateurs de scripts de créer des panneaux flottants, des barres de progression et des boîtes de dialogue interactives dont la complexité est bien supérieure à l’objet dialog intégré d’InCopy. Cela ne signifie pas, cependant, que les éléments d’interface utilisateur créés à l’aide de ScriptUI ne sont pas accessibles aux utilisateurs VBScript. Les scripts InCopy peuvent exécuter des scripts rédigés dans d’autres langages de script à l’aide de la méthode DoScript. Création d’une barre de progression avec ScriptUI L’exemple de script ci-après illustre la création d’une barre de progression à l’aide de JavaScript et ScriptUI, puis l’utilisation de cette barre de progression à partir d’un script VBScript (pour consulter le script complet, voir ProgressBar). #targetengine "session" var myProgressPanel; var myMaximumValue = 300; var myProgressBarWidth = 300; var myIncrement = myMaximumValue/myProgressBarWidth; myCreateProgressPanel(myMaximumValue, myProgressBarWidth); function myCreateProgressPanel(myMaximumValue, myProgressBarWidth){ myProgressPanel = new Window('window', 'Progress'); with(myProgressPanel){ myProgressPanel.myProgressBar = add('progressbar', [12, 12, myProgressBarWidth, 24], 0, myMaximumValue); } } L’extrait de script ci-après permet d’appeler la barre de progression créée dans le script ci-dessus à l’aide d’un script VBScript (pour consulter le script complet, voir CallProgressBar). Set myInCopy = CreateObject("InCopy.Application") myString = "myProgressPanel = myCreateProgressPanel(100, 400);" & vbcr myString = myString & "myProgressPanel.show();" & vbcr myInCopy.DoScript myString, idScriptLanguage.idJavascript For myCounter = 1 to 100 Set myStory = myInCopy.Documents.Item(1) myStory.InsertionPoints.Item(-1).Contents = "x" myString = "myProgressPanel.myProgressBar.value = " & cstr(myCounter) & "/myIncrement;" & vbcr Interfaces utilisateur Utilisation de ScriptUI 68 myInCopy.DoScript myString, idScriptLanguage.idJavascript If(myCounter = 100) Then myString = "myProgressPanel.myProgressBar.value = 0;" & vbcr myString = myString & "myProgressPanel.hide();" & vbcr myInCopy.DoScript myString, idScriptLanguage.idJavascript End If Next Création d’un panneau avec barre de boutons au moyen de ScriptUI Si vous voulez exécuter vos scripts en cliquant sur les boutons d’un panneau flottant, vous pouvez en créer un avec JavaScript et ScriptUI. Peu importe le langage de script utilisé. Le script d’apprentissage suivant permet de créer un panneau flottant simple. Le panneau peut contenir une série de boutons, chaque bouton étant associé à un script stocké sur disque. Cliquez sur le bouton, et le panneau exécute le script (le script, à son tour, peut afficher des boîtes de dialogue ou d’autres éléments d’interface utilisateur). Le bouton, dans le panneau, peut contenir du texte ou des graphiques. (Pour consulter le script complet, voir ButtonBar.) Le script d’apprentissage lit un fichier XML sous la forme suivante : <buttons> <button> <buttonType></buttonType> <buttonName></buttonName> <buttonFileName></buttonFileName> <buttonIconFile></buttonIconFile> </button> ... </buttons> Par exemple : <buttons> <button> <buttonType>text</buttonType> <buttonName>FindChangeByList</buttonName> <buttonFileName>/c/buttons/FindChangeByList.jsx</buttonFileName> <buttonIconFile></buttonIconFile> </button> <button> <buttonType>text</buttonType> <buttonName>SortParagraphs</buttonName> <buttonFileName>/c/buttons/SortParagraphs.jsx</buttonFileName> <buttonIconFile></buttonIconFile> </button> </buttons> Les fonctions suivantes permettent de lire le fichier XML et de configurer la barre de boutons : #targetengine "session" var myButtonBar; main(); function main(){ myButtonBar = myCreateButtonBar(); myButtonBar.show(); } function myCreateButtonBar(){ var myButtonName, myButtonFileName, myButtonType, myButtonIconFile, myButton; Interfaces utilisateur Utilisation de ScriptUI var myButtons = myReadXMLPreferences(); if(myButtons != ""){ myButtonBar = new Window('window', 'Script Buttons', undefined, {maximizeButton:false, minimizeButton:false}); with(myButtonBar){ spacing = 0; margins = [0,0,0,0]; with(add('group')){ spacing = 2; orientation = 'row'; for(var myCounter = 0; myCounter < myButtons.length(); myCounter++){ myButtonName = myButtons[myCounter].xpath("buttonName"); myButtonType = myButtons[myCounter].xpath("buttonType"); myButtonFileName = myButtons[myCounter].xpath("buttonFileName"); myButtonIconFile = myButtons[myCounter].xpath("buttonIconFile"); if(myButtonType == "text"){ myButton = add('button', undefined, myButtonName); } else{ myButton = add('iconbutton', undefined, File(myButtonIconFile)); } myButton.scriptFile = myButtonFileName; myButton.onClick = function(){ myButtonFile = File(this.scriptFile) app.doScript(myButtonFile); } } } } } return myButtonBar; } function myReadXMLPreferences(){ myXMLFile = File.openDialog("Choose the file containing your button bar defaults"); var myResult = myXMLFile.open("r", undefined, undefined); var myButtons = ""; if(myResult == true){ var myXMLDefaults = myXMLFile.read(); myXMLFile.close(); var myXMLDefaults = new XML(myXMLDefaults); var myButtons = myXMLDefaults.xpath("/buttons/button"); } return myButtons; } 69 6 Menus Statut de mise à jour du chapitre CS6 Inchangé Les scripts InCopy permettent d’ajouter des éléments de menu, d’en supprimer, d’exécuter des commandes de menu et d’associer des scripts à des éléments de menu. Ce chapitre décrit l’utilisation des scripts de menus InCopy. Les exemples de scripts de ce chapitre sont présentés par ordre de complexité, en commençant par des scripts très simples et en progressant vers des opérations plus complexes. Vous devez avoir lu le Chapitre 2, « Prise en main » et savoir créer, installer et exécuter un script. Présentation du modèle de menu Le modèle de scripts de menus InCopy comprend une série d’objets qui correspondent aux menus affichés dans l’interface utilisateur de l’application, notamment les menus associés aux panneaux, ainsi que ceux affichés dans la barre de menus principale. Un objet menu contient les objets suivants : X MenuItems : options de menu figurant dans un menu. Cela n’inclut pas les sous-menus. X MenuSeparators : lignes utilisées pour séparer les options de menu dans un menu. X Submenus : options de menu qui contiennent d’autres menus. X MenuElements : tous les objets MenuItems, MenuSeparators et Submenus figurant dans un menu. X EventListeners : répondent aux actions d’un utilisateur (ou script) associées à un menu. X Events : objets events déclenchés par un menu. Chaque objet MenuItem est connecté à un objet MenuAction par l’intermédiaire de la propriété AssociatedMenuAction. Les propriétés de l’objet MenuAction définissent l’action exécutée lorsque l’élément de menu est sélectionné. En plus des objets MenuActions définis par l’interface utilisateur, les créateurs de scripts InCopy peuvent créer leurs propres objets ScriptMenuActions, qui associent un script à une sélection de menu. Un objet MenuAction ou ScriptMenuAction peut être associé à un ou plusieurs objets MenuItems, ou à aucun. 70 Menus Présentation du modèle de menu 71 Le diagramme suivant illustre les relations entre les différents objets de menu : application menuActions menuAction area checked enabled eventListeners eventListener id eventListener ... index label name events event parent event ... title scriptMenuActions scriptMenuAction same as menuAction Pour créer une liste (sous la forme d’un fichier texte) de toutes les actions de menu visibles, exécutez l’extrait de script suivant (dans le script d’apprentissage GetMenuActions) : Set Set Rem Set For myInCopy = CreateObject("InCopy.Application") myFileSystemObject = CreateObject("Scripting.FileSystemObject") You'll need to fill in a valid file path on your system. myTextFile = myFileSystemObject.CreateTextFile("c:\menuactions.txt", True, False) myCounter = 1 To myInCopy.MenuActions.Count Set myMenuAction = myInCopy.MenuActions.Item(myCounter) myTextFile.WriteLine myMenuAction.name Next myTextFile.Close MsgBox "done!" Pour créer une liste (sous la forme d’un fichier texte) de tous les menus disponibles, exécutez l’extrait de script suivant (pour consulter la liste complète des scripts, voir le script d’apprentissage GetMenuNames). Notez que ces scripts peuvent être très lents, car il existe un grand nombre de noms de menu dans InCopy. Set Set Set For myInCopy = CreateObject("InCopy.Application") myFileSystemObject = CreateObject("Scripting.FileSystemObject") myTextFile = myFileSystemObject.CreateTextFile("c:\menunames.txt", True, False) myMenuCounter = 1 To myInCopy.Menus.Count Set myMenu = myInCopy.Menus.Item(myMenuCounter) Menus Présentation du modèle de menu 72 myTextFile.WriteLine myMenu.Name myProcessMenu myMenu, myTextFile Next myTextFile.Close MsgBox "done!" Function myProcessMenu(myMenuItem, myTextFile) myString = "" myMenuName = myMenuItem.Name For myCounter = 1 To myMenuItem.MenuElements.Count If TypeName(myMenuItem.MenuElements.Item(myCounter)) <> "MenuSeparator" Then myString = myGetIndent(myMenuItem.MenuElements.Item(myCounter), myString, False) myTextFile.WriteLine myString & myMenuItem.MenuElements.Item(myCounter).Name myMenuElementName = myMenuItem.MenuElements.Item(myCounter).Name myString = "" If TypeName(myMenuItem.MenuElements.Item(myCounter)) = "Submenu" Then If myMenuItem.MenuElements.Count > 0 Then myProcessMenu myMenuItem.MenuElements.Item(myCounter), myTextFile End If End If End If Next End Function Function myGetIndent(myMenuItem, myString, myDone) Do While myDone = False If TypeName(myMenuItem.Parent) = "Application" Then myDone = True Else myString = myString & vbTab myGetIndent myMenuItem.Parent, myString, myDone End If Loop myGetIndent = myString End Function Localisation et noms de menu Avec les scripts InCopy, les objets MenuItems, Menus, MenuActions et Submenus sont désignés par un nom. Par conséquent, les scripts doivent s’appuyer sur une méthode de recherche d’objets qui soit indépendante de la langue installée de l’application. Pour cela, vous pouvez utiliser une base de données interne de chaînes qui font référence à un élément spécifique, indépendamment de la langue. Par exemple, pour obtenir le nom (indépendamment de la langue) d’une action de menu, vous pouvez utiliser l’extrait de script suivant (pour consulter le script complet, voir GetKeyStrings) : Set myInCopy = CreateObject("InCopy.Application") Rem Fill in the name of the menu action you want. Set myMenuAction = myInCopy.MenuActions.Item("$ID/Convert to Note") myKeyStrings = myInCopy.FindKeyStrings(myMenuAction.Name) myString = "" For Each myKeyString In myKeyStrings myString = myString & myKeyString & vbCr Next MsgBox myString Menus Exécution d’une action de menu à partir d’un script 73 REMARQUE : il est préférable d’obtenir le nom indépendant de la langue d’un objet MenuAction plutôt que celui d’un objet Menus, MenuItem ou Submenu, parce que le titre d’un objet MenuAction sera vraisemblablement une chaîne unique. La plupart des autres objets de menu renvoient plusieurs chaînes si vous utilisez la méthode GetKeyStrings. Une fois que vous disposez de la chaîne indépendante de la langue à utiliser, vous pouvez l’inclure dans vos scripts. Les scripts qui utilisent ces chaînes fonctionneront correctement dans les langues différentes de celle de votre version InCopy. Pour traduire une chaîne indépendante de la langue dans la langue actuelle, utilisez l’extrait de script suivant (dans le script d’apprentissage TranslateKeyString) : Set myInCopy = CreateObject("InCopy.Application") Rem Fill in the appropriate key string in the following line. myString = myInCopy.TranslateKeyString("$ID/Convert to Note") MsgBox myString Exécution d’une action de menu à partir d’un script Les objets MenuActions intégrés d’InCopy peuvent être exécutés à partir d’un script. L’objet MenuAction ne doit pas être nécessairement associé à un objet MenuItem ; cependant, l’exécution d’un objet MenuItem à partir d’un script est en tout point identique à la sélection d’une option de menu dans l’interface utilisateur. Si la sélection de l’option de menu affiche une boîte de dialogue, l’exécution de l’objet MenuAction correspondant à partir d’un script affiche également une boîte de dialogue. Le script suivant illustre le mode d’exécution d’un objet MenuAction à partir d’un script (pour consulter le script complet, voir InvokeMenuAction) : Set myInCopy = CreateObject("InCopy.Application") Rem Get a reference to a menu action. Set myMenuAction = myInCopy.MenuActions.Item("$ID/Convert to Note") Rem Run the menu action. The example action will fail if you do not Rem have text selected. myMenuAction.Invoke REMARQUE : en règle générale, évitez d’essayer d’automatiser les processus InCopy en codant les actions de menu et les sélections de l’interface utilisateur ; le modèle d’objet de script InCopy est un outil de travail bien plus performant. Les actions de menu dépendent d’un certain nombre de conditions d’interface utilisateur, comme la sélection et l’état de la fenêtre. Les scripts utilisant le modèle d’objet sollicitent directement les objets d’un document InCopy, ce qui signifie qu’ils ne dépendent pas de l’interface utilisateur ; leur rapidité et leur cohérence en sont ainsi améliorées. Ajout de menus et d’éléments de menu Les scripts peuvent également créer des menus et des éléments de menu ou en supprimer, comme dans l’interface utilisateur InCopy. L’exemple de script suivant illustre la duplication du contenu d’un sous-menu dans un nouveau menu, à un autre emplacement de menu (pour consulter le script complet, voir CustomizeMenu) : Set Set Set Set Set Set myInCopy = CreateObject("InCopy.Application") myMainMenu = myInCopy.Menus.Item("Main") myTypeMenu = myMainMenu.MenuElements.Item("Type") myFontMenu = myTypeMenu.MenuElements.Item("Font") myKozukaMenu = myFontMenu.Submenus.Item("Kozuka Mincho Pro ") mySpecialFontMenu = myMainMenu.Submenus.Add("Kozuka Mincho Pro") Menus Menus et événements 74 For myCounter = 1 To myKozukaMenu.MenuItems.Count Set myAssociatedMenuAction = myKozukaMenu.MenuItems.Item(myCounter).AssociatedMenuAction mySpecialFontMenu.MenuItems.Add myAssociatedMenuAction Next Pour supprimer le menu personnalisé ajouté par le script ci-dessus, exécutez le script RemoveSpecialFontMenu. Set myMainMenu = myInCopy.Menus.Item("Main") Set mySpecialFontMenu = myMainMenu.Submenus.Item("Kozuka Mincho Pro") mySpecialFontMenu.Delete Menus et événements Les menus et les sous-menus génèrent des événements lorsqu’ils sont sélectionnés dans l’interface utilisateur, et les objets MenuActions et ScriptMenuActions génèrent des événements lorsqu’ils sont utilisés. Les scripts peuvent installer des objets EventListeners pour répondre à ces événements. Le tableau suivant illustre les événements des différents composants de scripts de menu : Objet Evénement Description Menu beforeDisplay Exécute le script associé avant l’affichage du contenu du menu. MenuAction afterInvoke Exécute le script associé lorsque l’objet MenuItem associé est sélectionné, mais à la suite de l’événement onInvoke. beforeInvoke Exécute le script associé lorsque l’objet MenuItem associé est sélectionné, mais avant l’événement onInvoke. afterInvoke Exécute le script associé lorsque l’objet MenuItem associé est sélectionné, mais à la suite de l’événement onInvoke. beforeInvoke Exécute le script associé lorsque l’objet MenuItem associé est sélectionné, mais avant l’événement onInvoke. beforeDisplay Exécute le script associé avant une demande interne de l’état activé/coché de l’objet ScriptMenuActionScriptMenuAction. onInvoke Exécute le script associé lorsque l’objet ScriptMenuAction est appelé. beforeDisplay Exécute le script associé avant l’affichage du contenu de l’objet Submenu. ScriptMenuAction Submenu Pour plus de détails sur les objets Events et EventListeners, voir le Chapitre 7, « Evénements ». Pour modifier les éléments affichés dans un menu, ajoutez un objet EventListener pour l’événement Event beforeDisplay. Lorsque le menu est sélectionné, l’objet EventListener peut alors exécuter un script qui active ou désactive les éléments de menu, modifie le nom de l’élément de menu ou exécute d’autres tâches associées au menu. Cette opération est utilisée en interne pour modifier la liste des menus pour les polices disponibles, les documents récents ou les fenêtres ouvertes. Menus Utilisation des objets d’action de menu de script 75 Utilisation des objets d’action de menu de script Vous pouvez utiliser un objet ScriptMenuAction pour créer un objet MenuAction dont le comportement est implémenté par l’intermédiaire du script prévu pour être exécuté lorsque l’événement Event onInvoke est déclenché. Le script suivant illustre la création d’un objet ScriptMenuAction et son association à un élément de menu (pour consulter le script complet, voir MakeScriptMenuAction). Ce script affiche simplement une alerte lorsque l’élément de menu est sélectionné. Set myInCopy = CreateObject("InCopy.Application") Set mySampleScriptAction = myInCopy.ScriptMenuActions.Add("Display Message") Set myEventListener = mySampleScriptAction.EventListeners.Add("onInvoke", "c:\message.vbs") Set mySampleScriptMenu = myInCopy.Menus.Item("$ID/Main").Submenus.Add("Script Menu Action") Set mySampleScriptMenuItem = mySampleScriptMenu.MenuItems.Add(mySampleScriptAction) Le fichier de script message.vbs contient le code suivant : MsgBox("You selected an example script menu action.") Pour supprimer les objets Menu, Submenu, MenuItem et ScriptMenuAction créés par le script ci-dessus, exécutez l’extrait de script suivant (dans le script d’apprentissage RemoveScriptMenuAction) : Set myInCopy = CreateObject("InCopy.Application") Set mySampleScriptAction = myInCopy.ScriptMenuActions.Item("Display Message") mySampleScriptAction.Delete Set mySampleScriptMenu = myInCopy.Menus.Item("$ID/Main").Submenus.Item("Script Menu Action") mySampleScriptMenu.Delete Vous pouvez également supprimer tous les objets ScriptMenuAction, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage RemoveAllScriptMenuActions). Ce script supprime également les listes de menus de l’objet ScriptMenuAction, mais il ne supprime pas les menus ou sous-menus que vous avez créés. Set myInCopy = CreateObject("InCopy.Application") For myCounter = myInCopy.ScriptMenuActions.Count To 1 Step -1 myInCopy.ScriptMenuActions.Item(myCounter).Delete Next Vous pouvez créer une liste de tous les objets ScriptMenuActions courants, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage GetScriptMenuActions) : Set myInCopy = CreateObject("InCopy.Application") Set myFileSystemObject = CreateObject("Scripting.FileSystemObject") Rem You'll need to fill in a valid file path for your system. Set myTextFile = myFileSystemObject.CreateTextFile("c:\scriptmenuactionnames.txt", True, False) For myCounter = 1 To myInCopy.ScriptMenuActions.Count Set myScriptMenuAction = myInCopy.ScriptMenuActions.Item(myMenuCounter) myTextFile.WriteLine myScriptMenuAction.Name Next myTextFile.Close Menus Utilisation des objets d’action de menu de script 76 L’objet ScriptMenuAction peut également exécuter des scripts pendant l’événement Event beforeDisplay, auquel cas ils sont exécutés avant une demande interne de l’état de l’objet ScriptMenuAction (par exemple, lorsque l’élément de menu est sur le point d’être affiché). Ensuite, le script peut notamment modifier le nom des menus et/ou définir l’état activé/coché. Dans l’exemple de script suivant, un objet EventListener est ajouté à l’événement Event beforeDisplay qui vérifie la sélection en cours. En l’absence de sélection, le script dans l’objet EventListener désactive l’élément de menu. Si un élément est sélectionné, celui-ci est activé, et la sélection de l’élément de menu affiche le type du premier élément de la sélection. (Pour consulter le script complet, voir BeforeDisplay.) Set myInCopy = CreateObject("InCopy.Application") Set mySampleScriptAction = myInCopy.ScriptMenuActions.Add("Display Message") Set myEventListener = mySampleScriptAction.EventListeners.Add("onInvoke", "c:\WhatIsSelected.vbs ") Set mySampleScriptMenu = myInCopy.Menus.Item("$ID/Main").Submenus.Add("Script Menu Action") Set mySampleScriptMenuItem = mySampleScriptMenu.MenuItems.Add(mySampleScriptAction) mySampleScriptMenu.EventListeners.Add "beforeDisplay", "c:\BeforeDisplayHandler.vbs" Le fichier de script d’apprentissage BeforeDisplayHander contient le script suivant : Set myInCopy = CreateObject("InCopy.Application") Set mySampleScriptAction = myInCopy.ScriptMenuActions.Item("Display Message") If myInCopy.Selection.Count > 0 Then mySampleScriptAction.Enabled = True Else mySampleScriptAction.Enabled = False End If Le fichier de script d’apprentissage WhatIsSelected contient le script suivant : Set myInCopy = CreateObject("InCopy.Application") myString = TypeName(myInCopy.Selection.Item(1)) MsgBox "The first item in the selection is a " & myString & "." 7 Evénements Statut de mise à jour du chapitre CS6 Inchangé Les scripts InCopy peuvent répondre aux événements d’application et de document courants, comme l’ouverture d’un fichier, la création d’un fichier, l’impression et l’importation de fichiers texte et graphiques à partir d’un disque. Avec les scripts InCopy, l’objet event répond à un événement qui se produit dans l’application. Les scripts peuvent être associés aux événements par l’intermédiaire de l’objet de script EventListener. Les scripts qui utilisent les événements sont identiques aux autres scripts, à la seule différence près qu’ils sont exécutés automatiquement lorsque l’événement correspondant se produit, et non manuellement par l’utilisateur (dans le panneau Scripts). Ce chapitre décrit le mode d’utilisation des scripts d’événement InCopy. Les exemples de scripts de ce chapitre sont présentés par ordre de complexité, en commençant par des scripts très simples et en progressant vers des opérations plus complexes. Vous devez avoir préalablement lu le Chapitre 2, « Prise en main » et savoir créer, installer et exécuter un script. Ce chapitre décrit les événements d’application et de document. Vous trouverez une description des événements liés aux menus au Chapitre 6, « Menus ». Le modèle de scripts d’événements InCopy est semblable à la recommandation W3C (Worldwide Web Consortium) concernant les événements du modèle d’objet de document DOM (pour plus de détails, visiter le site http://www.w3c.org). Présentation du modèle de scripts d’événements Le modèle de scripts d’événements InCopy comprend une série d’objets qui correspondent aux événements survenant pendant l’utilisation de l’application. Le premier objet, event, correspond à l’une des séries limitées d’actions dans l’interface utilisateur InCopy (ou des actions correspondantes déclenchées par les scripts). Pour répondre à un événement, vous devez enregistrer un objet EventListener avec un objet capable de recevoir l’événement. Lorsque l’événement spécifié atteint l’objet, l’objet EventListener exécute la fonction de script définie dans son gestionnaire (référence à un fichier de script sur disque). Le tableau suivant répertorie les événements auxquels l’objet EventListeners peut répondre. Ces événements peuvent être déclenchés par n’importe quel moyen disponible, notamment les options de menu sélectionnées, les raccourcis clavier ou les actions de script. 77 Evénements Présentation du modèle de scripts d’événements Evénement d’interface utilisateur Nom de l’événement Description Type d’objet Se produit avant que le menu ou le sous-menu ne s’affiche. Event beforeDisplay Se produit avant que l’action de menu du script ne s’affiche ou ne change. Event beforeInvoke Se produit après la sélection de l’action de menu, mais avant son exécution. Event afterInvoke Se produit après l’exécution de l’action de menu. Event onInvoke Exécute l’action de menu ou l’action de menu du script. Event beforeClose Se produit après une demande de fermeture de document, mais avant que le document ne soit fermé. DocumentEvent afterClose Se produit après la fermeture d’un document. DocumentEvent beforeExport Se produit après une demande d’exportation, mais avant que le document ou l’élément de page ne soit exporté. ImportExportEvent afterExport Se produit après l’exportation d’un document ou d’un élément de page. ImportExportEvent beforeImport Se produit avant qu’un fichier ne soit importé, mais avant que le fichier ne soit importé dans un document (avant l’insertion). ImportExportEvent afterImport Se produit après l’importation d’un fichier, mais avant que le fichier ne soit inséré dans une page. ImportExportEvent beforeNew Se produit après une demande de nouveau document, mais avant que le document ne soit créé. DocumentEvent afterNew Se produit après la création d’un document. DocumentEvent beforeOpen Se produit après une demande DocumentEvent d’ouverture de document, mais avant que le document ne soit ouvert. afterOpen Se produit après l’ouverture d’un document. Toute action de beforeDisplay menu Fermer Exporter Importer Nouveau Ouvrir DocumentEvent 78 Evénements Présentation du modèle de scripts d’événements Evénement d’interface utilisateur Nom de l’événement Imprimer beforePrint Se produit après une demande DocumentEvent d’impression de document, mais avant que le document ne soit imprimé. afterPrint Se produit après l’impression d’un document. DocumentEvent beforeRevert Se produit après une demande de restauration d’un document, mais avant que la version antérieure du document ne soit restaurée. DocumentEvent afterRevert Se produit après la restauration de la version antérieure d’un document. DocumentEvent beforeSave Se produit après une demande DocumentEvent d’enregistrement d’un document, mais avant que le document ne soit enregistré. afterSave Se produit après l’enregistrement d’un document. DocumentEvent beforeSaveACopy Se produit après une demande d’enregistrement d’une copie d’un document, mais avant que le document ne soit enregistré. DocumentEvent afterSaveACopy Se produit après l’enregistrement d’un document. DocumentEvent beforeSaveAs Se produit après une demande DocumentEvent d’enregistrement sous un format, mais avant que le document ne soit enregistré. afterSaveAs Se produit après l’enregistrement d’un document. Version précédente Enregistrer Enregistrer une copie Enregistrer sous Description 79 Type d’objet DocumentEvent A propos des propriétés des événements et de la propagation des événements Lorsqu’une action, qu’elle soit exécutée par un utilisateur ou par un script, déclenche un événement, cet événement peut s’étendre, ou se propager, aux objets de script capables d’y répondre. Lorsqu’un événement atteint un objet ayant un objet EventListener enregistré pour cet événement, cet objet EventListener est déclenché par l’événement. Un événement peut être traité par plusieurs objets à mesure qu’il se propage. Il existe trois types de propagation d’événement : X Aucune : seuls les objets EventListeners enregistrés avec la cible de l’événement sont déclenchés par l’événement. L’événement beforeDisplay est l’exemple d’un événement qui ne se propage pas. X Capture : l’événement démarre au niveau supérieur du modèle d’objet de script, l’application, puis se propage à travers le modèle jusqu’à la cible de l’événement. Tout objet EventListeners capable de répondre à l’événement enregistré dans les objets au-dessus de la cible (target) traite l’événement. Evénements Présentation du modèle de scripts d’événements X 80 Bouillonnement : l’événement démarre la propagation vers sa cible (target) et déclenche tout objet EventListeners approprié enregistré avec la cible (target). L’événement se propage alors vers le haut à travers le modèle d’objet de script, déclenchant les objets EventListeners appropriés qui sont enregistrés avec les objets situés au-dessus de la cible (target) dans la hiérarchie du modèle d’objet de script. Le tableau suivant décrit de manière détaillée les propriétés d’un événement (event) et leurs relations avant la propagation d’événement à travers le modèle d’objet de script. Propriété Description Bubbles Si elle est vraie (true), l’événement (event) se propage aux objets de script situés au-dessus de l’objet déclenchant l’événement (event). Cancelable Si elle est vraie (true), le comportement par défaut de l’événement (event) sur sa cible (target) peut être annulé. Pour cela, utilisez la méthode PreventDefault. Captures Si elle est vraie (true), l’événement (event) peut être traité par l’objet EventListeners enregistré avec les objets de script situés au-dessus de l’objet cible de l’événement au cours de la phase de capture de la propagation d’événement. Cela signifie qu’un objet EventListener dans l’application, par exemple, peut répondre à un événement de document avant qu’un objet EventListener ne soit déclenché. CurrentTarget Objet de script actif traitant l’événement (event) (voir la propriété target dans ce tableau). DefaultPrevented Si elle est vraie (true), le comportement par défaut de l’événement (event) sur la cible (target) actuelle (voir la propriété target dans ce tableau) a été bloqué, annulant ainsi l’opération. EventPhase Etape en cours du processus de propagation de l’événement (event). EventType Type d’événement (event), sous la forme d’une chaîne (par exemple, « beforeNew »). PropagationStopped Si elle est vraie (true), l’événement (event) a cessé de se propager au-delà de la cible actuelle (current target) (voir la propriété target dans ce tableau). Pour arrêter la propagation de l’événement, utilisez la méthode StopPropagation. Target Objet dont est issu l’événement (event). A titre d’exemple, la propriété target (cible) d’un événement beforeImport est un document ; pour l’événement beforeNew, il s’agit d’une application. TimeStamp Date et heure auxquelles l’événement (event) s’est produit. Evénements Utilisation des objets eventListeners 81 Utilisation des objets eventListeners Lorsque vous créez un objet EventListener, vous spécifiez le type d’événement (sous forme de chaîne), le gestionnaire d’événements (comme référence de fichier), et vous indiquez si l’objet EventListener peut être déclenché dans la phase de capture de l’événement. L’extrait de script suivant permet d’ajouter un objet EventListener pour un événement spécifique (pour consulter le script complet, voir EventListener). Set myInDesign = CreateObject("InDesign.Application.CS6" Set myEventListener = myInDesign.EventListeners.Add("afterNew", "c:\ICEventListeners\Message.vbs", false) Le script qui est référencé dans le script ci-dessus contient le code suivant : Rem "evt" is the event passed to this script by the event listener. MsgBox ("This event is the " & evt.EventType & " event.") Pour supprimer l’objet EventListener créé par le script ci-dessus, exécutez le script suivant (dans le script d’apprentissage RemoveEventListener) : Set myInDesign = CreateObject("InCopy.Application") Set myFileSystemObject = CreateObject("Scripting.FileSystemObject") Set myFile = myFileSystemObject.GetFile("c:\IDEventHandlers\message.vbs") myResult = myInDesign.RemoveEventListener("afterNew", myFile, False) Lorsqu’un objet EventListener répond à un événement, l’événement peut quand même être traité par d’autres objets EventListeners qui peuvent surveiller l’événement (en fonction de la propagation de l’événement). Par exemple, l’événement afterOpen peut être surveillé par l’objet EventListeners associé à l’application et au document. Les objets eventListeners ne sont plus valides au-delà de la session InCopy en cours. Pour pouvoir utiliser un objet EventListener dans chaque session InCopy, ajoutez le script au dossier des scripts de démarrage (pour plus de détails sur l’installation des scripts, voir le Chapitre 2, « Prise en main »). Lorsque vous ajoutez un script EventListener à un document, il n’est pas enregistré avec le document, ni exporté au format INX. REMARQUE : si vous rencontrez des problèmes avec un script qui définit un objet EventListener, vous pouvez soit exécuter un script qui supprime l’objet EventListener, soit fermer la session et relancer InCopy. Un événement peut déclencher plusieurs objets EventListeners au cours de sa propagation à travers le modèle d’objet de script. L’exemple de script suivant illustre un événement qui déclenche des objets EventListeners enregistrés avec d’autres objets (pour consulter le script complet, voir MultipleEventListeners) : Set myInDesign = CreateObject("InCopy.Application") Set myEventListener = myInDesign.EventListeners.Add("beforeImport", "c:\EventInfo.vbs", True) Set myDocument = myInDesign.Documents.Add Set myEventListener = myDocument.EventListeners.Add("beforeImport", "c:\EventInfo.vbs", False) Evénements Utilisation des objets eventListeners 82 Le script EventInfo.vbs qui est référencé dans le script ci-dessus contient le code suivant : main evt Function main(myEvent) myString = "Current Target: " & myEvent.CurrentTarget.Name MsgBox myString, vbOKOnly, "Event Details" end function Lorsque vous exécutez le script ci-dessus et que vous insérez un fichier, InCopy affiche des alertes répertoriant, dans l’ordre, le nom du document, puis le nom de l’application. L’exemple de script suivant crée un objet EventListener pour chaque événement pris en charge et affiche des informations sur l’événement dans une boîte de dialogue simple. Pour consulter le script complet, voir EventListenersOn. Rem EventListenersOn.vbs Rem An InCopy CS6 JavaScript Rem Rem Installs event listeners for all supported events; displays a Rem message when each event occurs. Rem Set myInCopy = CreateObject("InCopy.Application") myEventNames = Array("beforeQuit", "afterQuit", "beforeNew", "afterNew", "beforeOpen", "afterOpen", "beforeClose", "afterClose", "beforeSave", "afterSave", "beforeSaveAs", "afterSaveAs", "beforeSaveACopy", "afterSaveACopy", "beforeRevert", "afterRevert", "beforePrint", "afterPrint", "beforeExport", "afterExport", "beforeImport", "afterImport", "beforePlace", "afterPlace") For myCounter = 0 To UBound(myEventNames) myInCopy.AddEventListener myEventNames(myCounter), "c:\GetEventInfo.vbs", False If myCounter < UBound(myEventNames) Then myInCopy.EventListeners.Add myEventNames(myCounter), "c:\GetEventInfo.vbs", False End If Next Le script suivant est référencé par le script ci-dessus. La référence de fichier dans le script ci-dessus doit correspondre à l’emplacement de ce script sur votre disque. Pour consulter le script complet, voir GetEventInfo.vbs. Rem GetEventInfo.vbs Rem An InCopy CS6 VBScript Rem Rem Displays information about an Event object; called from an EventListener. main evt Function main(myEvent) myString = "Handling Event: " & myEvent.EventType myString = myString & vbCr & vbCr & "Target: " & myEvent.Target & " " & myEvent.Target.Name myString = myString & vbCr & "Current: " & myEvent.CurrentTarget & " " & myEvent.CurrentTarget.Name myString = myString & vbCr & vbCr & "Phase: " & myGetPhaseName(myEvent.EventPhase) myString = myString & vbCr & "Captures: " & myEvent.Captures myString = myString & vbCr & "Bubbles: " & myEvent.Bubbles myString = myString & vbCr & vbCr & "Cancelable: " & myEvent.Cancelable myString = myString & vbCr & "Stopped: " & myEvent.PropagationStopped myString = myString & vbCr & "Canceled: " & myEvent.DefaultPrevented myString = myString & vbCr & vbCr & "Time: " & myEvent.TimeStamp MsgBox myString, vbOKOnly, "Event Details" end function Rem Function returns a string corresponding to the event phase enumeration. Function myGetPhaseName(myEventPhase) Evénements Exemple d’objet eventListener « afterNew » 83 Select Case myEventPhase Case idEventPhases.idAtTarget myPhaseName = "At Target" Case idEventPhases.idBubblingPhase myPhaseName = "Bubbling" Case idEventPhases.idCapturingPhase myPhaseName = "Capturing" Case idEventPhases.idDone myPhaseName = "Done" Case idEventPhases.idNotDispatching myPhaseName = "Not Dispatching" end select myGetPhaseName = myPhaseName End Function L’exemple de script suivant permet de désactiver tous les objets EventListeners pour l’objet d’application. Pour consulter le script complet, voir EventListenersOff. Rem Rem Rem Rem Set For EventListenersOff.vbs An InCopy CS6 JavaScript Removes all event listeners from the application. myInCopy = CreateObject("InCopy.Application") myCounter = 1 To myInCopy.EventListeners.Count myInCopy.EventListeners.Item(1).Delete Next Exemple d’objet eventListener « afterNew » L’événement afterNew est pratique pour ajouter des informations au document, notamment le nom de l’utilisateur, la date de création du document, les informations de copyright et toute autre information de suivi. L’exemple de script suivant permet d’ajouter ce type d’information aux métadonnées d’un document, également appelées informations de fichier ou informations XMP. Pour consulter le script complet, voir le script d’apprentissage AfterNew. Set myInCopy = CreateObject("InCopy.Application") Set myEventListener = myInCopy.EventListeners.Add("afterNew", "c:\AfterNewHandler.vbs") Le script suivant est référencé par le script ci-dessus. La référence de fichier dans le script ci-dessus doit correspondre à l’emplacement de ce script sur votre disque. Pour consulter le script complet, voir AfterNewHandler.vbs. Rem AfterNewHandler.vbs Rem An InCopy CS6 VBScript Rem Rem Adds metadata to a new document. myAddMetadata evt Function myAddMetadata(myEvent) Set myInCopy = CreateObject("InCopy.Application") Set myDocument = myInCopy.Documents.Item(1) myInCopy.UserName = "Adobe" With myDocument.MetadataPreferences .Author = "Adobe Systems" .Description = "This is a sample document with XMP metadata." & vbCr & "Created: " + myEvent.TimeStamp End With End Function 8 Notes Statut de mise à jour du chapitre CS6 Inchangé Grâce aux fonctions de notes d’édition en ligne d’InDesign et d’InCopy, vous pouvez ajouter des commentaires et des remarques en tant que notes directement au texte sans que cela n’affecte le flux d’un article. Les fonctions d’annotation sont conçues pour fonctionner dans un environnement de groupe de travail. Vous pouvez coder les notes à l’aide de couleurs ou les désactiver selon certains critères. Pour créer des notes, utilisez l’outil Note de la boîte à outils, la commande Notes > Nouvelle note ou l’icône Nouvelle note du panneau Notes. Vous devez avoir préalablement lu le Chapitre 2, « Prise en main » et savoir créer, installer et exécuter un script. Vous devez également savoir manipuler les notes dans InCopy. Saisie et importation d’une note Cette section décrit le processus d’insertion d’une note dans vos documents InCopy. De la même manière que vous pouvez créer une note et remplacer son texte à l’aide de l’interface utilisateur d’InCopy, vous pouvez créer des notes et y insérer du texte à l’aide des scripts. Ajout d’une note à un article Pour ajouter une note à un article, utilisez la méthode Add. L’exemple suivant ajoute une note au dernier point d’insertion. Pour consulter le script complet, voir InsertNote. Set myInCopy = CreateObject("InCopy.Application.CS6") Set myDocument = myIncopy.Documents.Item(1) Set myStory = myDocument.Stories.Item(1) Rem We'll use the last insertion point in the story. Set myInsertionPoint = myStory.insertionPoints.Item(-1) Set myNote = myInsertionPoint.Notes.Add myNote.Texts.Item(1).Contents = "This is a Note." Remplacement du texte d’une note Pour remplacer le texte d’une note, utilisez la propriété Contents, comme illustré dans l’exemple suivant. Pour consulter le script complet, voir Replace. myInCopy = CreateObject("InCopy.Application.CS6") myDocument = myIncopy.Documents.Item(1) Set myStory = myDocument.Stories.Item(1) Set myNote = myStory.Notes.Item(1) Replace text of note with "This is a replaced note." myNote.Texts.Item(1).Contents = "This is a replaced note." 84 Notes Conversion de notes et de texte 85 Conversion de notes et de texte Conversion d’une note en texte Pour convertir une note en texte, utilisez la méthode ConvertToText, comme illustré dans l’exemple suivant. Pour consulter le script complet, voir ConvertToText. Set myInCopy = CreateObject("InCopy.Application.CS6") Set myDocument = myIncopy.Documents.Item(1) Set myStory = myDocument.Stories.Item(1) myNote = myStory.Notes.Item(1) myNote.convertToText() Conversion d’un texte en note Pour convertir un texte en note, utilisez la méthode ConvertToNote, comme illustré dans l’exemple suivant. Pour consulter le script complet, voir ConvertToNote. Set myInCopy = CreateObject("InCopy.Application.CS6") Set myDocument = myIncopy.Documents.Item(1) Set myStory = myDocument.Stories.Item(1) myStory.words.Item(1).convertToNote() Développement et réduction de notes Réduction d’une note L’extrait de script suivant montre comment réduire une note. Pour consulter le script complet, voir CollapseNote. Set myInCopy = CreateObject("InCopy.Application.CS6") Set myDocument = myIncopy.Documents.Item(1) Set myStory = myDocument.Stories.Item(1) Set myNote = myStory.Notes.Item(1) myNote.Collapsed = True Développement d’une note L’extrait de script suivant montre comment développer une note. Pour consulter le script complet, voir ExpandNote. myInCopy = CreateObject("InCopy.Application.CS6") Set myDocument = myIncopy.Documents.Item(1) Set myStory = myDocument.Stories.Item(1) Set myNote = myStory.Notes.Item(1) myNote.Collapsed = False Notes Suppression d’une note 86 Suppression d’une note Pour supprimer une note, utilisez la méthode Delete, comme illustré dans l’exemple suivant. Pour consulter le script complet, voir RemoveNote. Set myInCopy = CreateObject("InCopy.Application.CS6") Set myDocument = myIncopy.Documents.Item(1) Set myStory = myDocument.Stories.Item(1) Set myNote = myStory.Notes.Item(1) myStory.Notes.Item(1).Delete Navigation entre les notes Accès à la première note d’un article L’extrait de script suivant décrit comment accéder à la première note d’un article. Pour consulter le script complet, voir FirstNote. Set myInCopy = CreateObject("InCopy.Application.CS6") Set myDocument = myIncopy.Documents.Item(1) Set myStory = myDocument.Stories.Item(1) Set myNote = myStory.Notes.firstItem() myNote.Texts.Item(1).Contents = "This is the first note." Accès à la note suivante d’un article L’extrait de script suivant décrit comment accéder à la note suivante d’un article. Pour consulter le script complet, voir NextNote. Set myInCopy = CreateObject("InCopy.Application.CS6") Set myDocument = myIncopy.Documents.Item(1) Set myStory = myDocument.Stories.Item(1) Set myNote = myStory.Notes.nextItem(myStory.Notes.Item(1)) myNote.Texts.Item(1).Contents = "This is the next note." Accès à la note précédente d’un article L’extrait de script suivant décrit comment accéder à la note précédente d’un article. Pour consulter le script complet, voir PreviousNote. Set myInCopy = CreateObject("InCopy.Application.CS6") Set myDocument = myIncopy.Documents.Item(1) Set myStory = myDocument.Stories.Item(1) Set myNote = myStory.Notes.previousItem(myStory.Notes.Item(2)) myNote.Texts.Item(1).Contents = "This is the prev note." Notes Navigation entre les notes Accès à la dernière note d’un article L’extrait de script suivant décrit comment accéder à la dernière note d’un article. Pour consulter le script complet, voir LastNote. Set myInCopy = CreateObject("InCopy.Application.CS6") Set myDocument = myIncopy.Documents.Item(1) Set myStory = myDocument.Stories.Item(1) Set myNote = myStory.Notes.lastItem() myNote.Texts.Item(1).Contents = "This is the last note." 87 9 Suivi des modifications Statut de mise à jour du chapitre CS6 Inchangé Les rédacteurs peuvent suivre, afficher, masquer, accepter et rejeter des modifications à mesure qu’un document progresse dans le processus de rédaction et d’édition. Toutes les modifications sont enregistrées et visualisées pour faciliter la révision d’un document. Ce chapitre décrit comment automatiser avec des scripts les opérations les plus courantes appliquées au suivi des modifications. Vous devez avoir préalablement lu le Chapitre 2, « Prise en main » et savoir créer, installer et exécuter un script. Vous devez également savoir manipuler le texte dans InCopy et connaître la terminologie de base du domaine de la composition. Suivi des modifications Cette section explique comment naviguer entre les modifications suivies, les accepter ou les rejeter à l’aide des scripts. Lorsqu’une personne ajoute, supprime ou déplace du texte dans un article, la modification est répercutée dans les modes Epreuve en placard et Article. Navigation entre les modifications suivies Si l’article contient un enregistrement des modifications suivies, l’utilisateur peut les parcourir de façon séquentielle. Les scripts suivants montrent comment naviguer entre les modifications. Le script suivant utilise la méthode nextItem pour rechercher la modification qui suit le point d’insertion : Set myDocument = myInCopy.Documents.Item(1) Set myStory = myDocument.Stories.Item(1) //Story.trackChanges If true, track changes is turned on. If(myStory.TrackChanges=true ) Then Set myChange = myStory.Changes.Item(1) If(myStory.Changes.Count>1) Then Set myChange0 = myStory.Changes.NextItem(myChange) End If End If Dans le script suivant, nous utilisons la méthode previousItem pour rechercher la modification qui précède le point d’insertion : Set myDocument = myInCopy.Documents.Item(1) Set myStory = myDocument.Stories.Item(1) If(myStory.TrackChanges=true ) Then Set myChange = myStory.Changes.LastItem() If(myStory.Changes.Count>1) Then Set myChange0 = myStory.Changes.PreviousItem(myChange) End If End If 88 Suivi des modifications Suivi des modifications 89 Acceptation et rejet des modifications suivies Lorsque vous (ou d’autres personnes) apportez une modification à un article, la fonction de suivi vous permet de passer en revue toutes les modifications et de décider ou non de les intégrer à l’article. Vous pouvez accepter et rejeter les modifications (texte ajouté, supprimé ou déplacé), effectuées par un autre utilisateur. Dans le script suivant, la modification est acceptée : Set myDocument = myInCopy.Documents.Item(1) Set myStory = myDocument.Stories.Item(1) Set myChange = myStory.Changes.Item(1) myChange.Accept Dans le script suivant, la modification est rejetée : Set myDocument = myInCopy.Documents.Item(1) Set myStory = myDocument.Stories.Item(1) Set myChange = myStory.Changes.Item(1) myChange.Reject Informations sur les modifications faisant l’objet d’un suivi Ces informations incluent la date et l’heure de la modification. Le script suivant affiche des informations sur une modification suivie : Set myDocument = myInCopy.Documents.Item(1) Set myStory = myDocument.Stories.Item(1) Set myChange = myStory.Changes.Item(1) With myChange Rem idChangeTypes.idDeletedText (Read Only) Deleted text. Rem idChangeTypes.idInsertedText (Read Only) Insert text. Rem idChangeTypes.idMovedText (Read Only) Moved text. myTypes = .ChangeType Rem Characters A collection of Characters. Set myCharacters = .Characters Rem Character = myCharacters.Item(1); myDate = .Date Rem InsertionPoints A collection of insertion points. Rem insertpoint = myInsertionPoints.Item(1); Set myInsertionPoints = .InsertionPoints Rem Lines (Read Only) A collection of lines. Set myLines = .Lines Rem Paragraphs (Read Only) A collection of paragraphs. Set myParagraphs =.Paragraphs Rem InsertionPoints A collection of insertion points. Rem myInsertpoint = myInsertionPoints.Item(0); Set myStoryOffset = .StoryOffset Rem TtextColumns (Read Only) A collection of text columns. Set myTextColumns = .TextColumns Rem TextStyleRanges (Read Only) A collection of text style ranges. Set myTextStyleRanges = .TextStyleRanges Rem TextVariableInstances (Read Only) A collection of text variable instances. Set myTextVariableInstances = .TextVariableInstances Rem Texts (Read Only) A collection of text objects. Set myTexts = .Texts Suivi des modifications Préférences en matière de suivi des modifications 90 Rem The user who made the change. Note: Valid only when track changes is true. myUserName = .UserName Rem Words A collection of words Set myWords = .Words End With Préférences en matière de suivi des modifications Les préférences de suivi des modifications sont des paramètres destinés aux utilisateurs. Par exemple, vous pouvez indiquer quelles modifications (ajout, suppression ou déplacement de texte) feront l’objet d’un suivi. Vous pouvez préciser l’aspect de chaque type de modification suivie, mais aussi identifier les changements par des barres de couleurs dans les marges. Le script suivant montre comment définir et obtenir ces préférences : Set myTrackChangesPreference = myInCopy.TrackChangesPreferences With myTrackChangesPreference Rem AddedBackgroundColorChoice As idChangeBackgroundColorChoices, The background color option for added text. Rem idChangeBackgroundColorChoices, Background color options for changed text. Rem idChangeBackgroundUsesChangePrefColor The background color for changed text is the same as the track changes preferences background color. For information, see background color for added text, background color for deleted text, or background color for moved text. Rem idChangeBackgroundUsesGalleyBackgroundColor The background color for changed text is the same as the galley background color. Rem idChangeBackgroundUsesUserColor The background color for changed text is the same as the color assigned to the current user. myAddedBackgroundColorChoice = .AddedBackgroundColorChoice .AddedBackgroundColorChoice = idChangeBackgroundColorChoices.idChangeBackgroundUsesChangePrefColor Rem idChangeTextColorChoices,Changed text color options. Rem Property AddedTextColorChoice As idChangeTextColorChoices, The color option for added text. Rem idChangeUsesChangePrefColor,The text color for changed text is the same as the text color defined in track changes preferences. For information, see text color for added text, text color for deleted text, or text color for moved text. Rem idChangeUsesGalleyTextColor,The text color for changed text is the same as the galley text color. myAddedTextColorChoice = .AddedTextColorChoice .AddedTextColorChoice = idChangeTextColorChoices.idChangeUsesChangePrefColor Rem BackgroundColorForAddedText,The background color for added text, specified as an InCopy UI color. Note: Valid only when added background color choice is change background uses change pref color. Type: Array of 3 Doubles (0 - 255) or idInCopyUIColors enumerator myBackgroundColorForAddedText = .BackgroundColorForAddedText .BackgroundColorForAddedText = idUIColors.idGray Rem BackgroundColorForDeletedText, The background color for deleted text, specified as an InCopy UI color. Note: Valid only when deleted background color choice is change background uses change pref color myBackgroundColorForDeletedText = .BackgroundColorForDeletedText .BackgroundColorForDeletedText = idUIColors.idRed Rem BackgroundColorForMovedText,The background color for moved text. Note: Valid only when moved background color choice is change background uses change pref color myBackgroundColorForMovedText = .BackgroundColorForMovedText .BackgroundColorForMovedText = idUIColors.idPink Rem ChangeBarColor, The change bar color, specified as an InCopy UI color. myChangeBarColor = .ChangeBarColor .ChangeBarColor = idUIColors.idCharcoal Rem DeletedBackgroundColorChoice,The background color option for deleted text. Suivi des modifications Préférences en matière de suivi des modifications 91 Rem idChangeBackgroundUsesChangePrefColor The background color for changed text is the same as the track changes preferences background color. For information, see background color for added text, background color for deleted text, or background color for moved text. Rem idChangeBackgroundUsesGalleyBackgroundColor The background color for changed text is the same as the galley background color. Rem idChangeBackgroundUsesUserColor The background color for changed text is the same as the color assigned to the current user. myDeletedBackgroundColorChoice = .DeletedBackgroundColorChoice .DeletedBackgroundColorChoice = idChangeBackgroundColorChoices.idChangeBackgroundUsesUserColor Rem DeletedTextColorChoice, The color option for deleted text. Rem idChangeUsesChangePrefColor,The text color for changed text is the same as the text color defined in track changes preferences. For information, see text color for added text, text color for deleted text, or text color for moved text. Rem idChangeUsesGalleyTextColor,The text color for changed text is the same as the galley text color. myDeletedTextColorChoice = .DeletedTextColorChoice .DeletedTextColorChoice = idChangeTextColorChoices.idChangeUsesChangePrefColor Rem LocationForChangeBar,The change bar location. Rem idChangebarLocations,Change bar location options. Rem idLeftAlign, Change bars are in the left margin. Rem idRightAlign, Change bars are in the right margin myLocationForChangeBar = .LocationForChangeBar .LocationForChangeBar = idChangebarLocations.idLeftAlign Rem MarkingForAddedText, The marking that identifies added text. Rem idChangeMarkings, Marking options for changed text. Rem idOutline, Outlines changed text. Rem idNone, Does not mark changed text. Rem idStrikethrough, Uses a strikethrough to mark changed text. Rem idUnderlineSingle, Underlines changed text. myMarkingForAddedText = .MarkingForAddedText .MarkingForAddedText = idChangeMarkings.idStrikethrough Rem MarkingForDeletedText, The marking that identifies deleted text. Rem idChangeMarkings, Marking options for changed text. Rem idOutline, Outlines changed text. Rem idNone, Does not mark changed text. Rem idStrikethrough, Uses a strikethrough to mark changed text. Rem idUnderlineSingle, Underlines changed text. myMarkingForDeletedText = .MarkingForDeletedText .MarkingForDeletedText = idChangeMarkings.idUnderlineSingle Rem MarkingForMovedText, The marking that identifies moved text. Rem idChangeMarkings, Marking options for changed text. Rem idOutline, Outlines changed text. Rem idNone, Does not mark changed text. Rem idStrikethrough, Uses a strikethrough to mark changed text. Rem idUnderlineSingle, Underlines changed text. myMarkingForMovedText = .MarkingForMovedText .MarkingForMovedText = idChangeMarkings.idOutline Rem MovedBackgroundColorChoice,The background color option for moved text. Rem idChangeBackgroundUsesChangePrefColor The background color for changed text is the same as the track changes preferences background color. For information, see background color for added text, background color for deleted text, or background color for moved text. Rem idChangeBackgroundUsesGalleyBackgroundColor The background color for changed text is the same as the galley background color. Rem idChangeBackgroundUsesUserColor The background color for changed text is the same as the color assigned to the current user. myMovedBackgroundColorChoice = .MovedBackgroundColorChoice .MovedBackgroundColorChoice = Suivi des modifications Préférences en matière de suivi des modifications 92 idChangeBackgroundColorChoices.idChangeBackgroundUsesChangePrefColor Rem MovedTextColorChoice, The color option for moved text. Rem idChangeUsesChangePrefColor,The text color for changed text is the same as the text color defined in track changes preferences. For information, see text color for added text, text color for deleted text, or text color for moved text. Rem idChangeUsesGalleyTextColor,The text color for changed text is the same as the galley text color. myMovedTextColorChoice = .MovedTextColorChoice .MovedTextColorChoice = idChangeTextColorChoices.idChangeUsesChangePrefColor Rem if true, displays added text. myShowAddedText = .ShowAddedText .ShowAddedText = true Rem If true, displays change bars. myShowChangeBars = .ShowChangeBars .ShowChangeBars = true Rem ShowDeletedText, If true, displays deleted text. myShowDeletedText = .ShowDeletedText .ShowDeletedText = true Rem ShowMovedText,If true, displays moved text. myShowMovedText = .ShowMovedText .ShowMovedText = true Rem SpellCheckDeletedText, If true, includes deleted text when using the Spell Check command. mySpellCheckDeletedText = .SpellCheckDeletedText .SpellCheckDeletedText = true Rem TextColorForAddedText, The color for added text, specified as an InCopy UI color. Note: Valid only when added text color choice is change uses change pref color. myTextColorForAddedText = .TextColorForAddedText .TextColorForAddedText = idUIColors.idBlue Rem TextColorForDeletedText,The color for deleted text. myTextColorForDeletedText = .TextColorForDeletedText .TextColorForDeletedText = idUIColors.idYellow Rem TextColorForMovedText,The color for moved text. myTextColorForMovedText = .TextColorForMovedText .TextColorForMovedText = idUIColors.idGreen End With 10 Affectations Statut de mise à jour du chapitre CS6 Inchangé Une affectation est un conteneur pour le texte et les graphiques placé dans un fichier InDesign qui peut être consulté et modifié dans InCopy. En général, une affectation contient du texte et des graphiques associés, comme le corps du texte, les légendes et les illustrations qui composent un article de magazine. Seule l’application InDesign permet de créer des affectations et des fichiers d’affectation. Ce didacticiel explique comment automatiser par des scripts les opérations les plus courantes appliquées aux affectations. Vous devez avoir préalablement lu le Chapitre 2, « Prise en main » et savoir créer, installer et exécuter un script. Objet affectation Cette section explique comment travailler avec des affectations et des fichiers d’affectation. Grâce aux scripts, vous pouvez ouvrir le fichier d’affectation et obtenir les propriétés d’affectation. Ouverture des fichiers d’affectation Le script suivant indique comment ouvrir un fichier d’affectation : Rem Set Set Set Open an exist assignment file myInCopy = CreateObject("InCopy.Application") myDocument = myInCopy.Documents.Open("c:\a.icma") myAssignement = myDocument.Assignments.Item(1) Itérations dans les propriétés d’affectation L’extrait de script suivant indique comment obtenir les propriétés d’affectation, comme le nom d’affectation, le nom d’utilisateur, l’emplacement du fichier d’affectation, ainsi que les options d’exportation de l’affectation. Set myInCopy = CreateObject("InCopy.Application") Set myDocument = myInCopy.Documents.Item(1) Set myAssignement = myDocument.Assignments.Item(1) myuserName = myAssignement.UserName myFilePath = myAssignement.FilePath myDocPath = myAssignement.DocumentPath myFramecolor = myAssignement.FrameColor myincludeLinksWhenPackage = myAssignement.IncludeLinksWhenPackage Rem Export options for assignment files. Rem AssignmentExportOptions.ASSIGNED_SPREADS Exports only spreads with assigned frames Rem AssignmentExportOptions.EMPTY_FRAMES Exports frames but does not export content Rem AssignmentExportOptions.EVERYTHING Exports the entire document. myExportOptions = myAssignement.ExportOptions 93 Affectations Article d’affectation 94 Assemblages d’affectation Les assemblages d’affectation (fichiers .incp créés par InCopy) sont des dossiers compressés qui contiennent les fichiers d’affectation. Une affectation peut être assemblée à l’aide de la méthode createPackage. L’exemple de script suivant utilise cette technique pour créer un fichier d’affectation : Set myInCopy = CreateObject("InCopy.Application") Set myDocument = myInCopy.Documents.Item(1) Set myAssignement = myDocument.Assignments.Item(1) If myAssignement.Packaged = False Then Rem idPackageType.idForwardPackage Creates an assignment package for export. Rem idPackageType.idReturnPackage Create a package to place in the main document. myAssignement.CreatePackage("c:\b.icap",idPackageType.idForwardPackage) End If Article d’affectation Le diagramme suivant illustre un modèle d’objet affectation InCopy. Un document d’affectation contient une ou plusieurs affectations ; une affectation ne contient aucun article ou peut en contenir au moins un. Chaque article affecté contient une référence à un article de texte ou à un article d’image. document 1 1…* assignment 1 0…* assigned story 1 1 text/image story Cette section explique le processus d’obtention d’articles affectés et décrit les propriétés d’article d’affectation. Objet article affecté Le script suivant indique comment obtenir un article affecté à partir d’un objet affectation : Set Set Set Set myInCopy = CreateObject("InCopy.Application") myDocument = myInCopy.Documents.Item(1) myAssignement = myDocument.Assignments.Item(1) myAssignmentStory = myAssignement.AssignedStories.item(1) Affectations Article d’affectation 95 Itérations dans les propriétés de l’article affecté Dans InCopy, les objets article affecté ont des propriétés. Le script suivant indique comment obtenir toutes les propriétés d’un objet article affecté : Set myInCopy = CreateObject("InCopy.Application") Set myDocument = myInCopy.Documents.Item(1) Set myAssignement = myDocument.Assignments.Item(1) Set myAssignmentStory = myAssignement.AssignedStories.item(1) myName = myAssignmentStory.Name myFilePath = myAssignmentStory.FilePath Set myStoryReference = myAssignmentStory.StoryReference 11 XML Statut de mise à jour du chapitre CS6 Inchangé XML (Extensible Markup Language) est un langage de balisage reposant sur le texte, créé et géré par le groupe World Wide Web Consortium (www.w3.org). Comme le langage HTML (Hypertext Markup Language), le langage XML utilise des chevrons pour délimiter les balises (par exemple, <article> ou <para>). Le langage HTML comprend un ensemble prédéfini de balises, tandis que le langage XML permet de décrire le contenu avec plus de précision en créant des balises personnalisées. En raison de sa souplesse, le langage XML est de plus en plus utilisé comme format de stockage des données. InCopy propose un ensemble complet de fonctions d’importation de données XML dans des mises en page ; ces fonctions peuvent même être contrôlées à l’aide des scripts. Vous devez avoir préalablement lu le Chapitre 2, « Prise en main » et savoir créer, installer et exécuter un script. Vous devez également posséder une certaine connaissance des formats XML, DTD et XSLT. Présentation Comme le format XML concerne entièrement le contenu et non la mise en forme, son utilisation dans le cadre d’une mise en page peut se révéler un véritable défi. La stratégie InCopy face à XML est complète et souple, malgré un certain nombre de limites : X Une fois que les éléments XML sont importés dans un document InCopy, ils deviennent des éléments InCopy qui correspondent à la structure XML. Les représentations InCopy des éléments XML sont différentes des éléments XML proprement dits. X Chaque élément XML ne peut figurer qu’une seule fois dans une mise en page. Si vous souhaitez dupliquer les informations de l’élément XML dans la mise en page, vous devez dupliquer l’élément XML lui-même. X L’ordre d’affichage des éléments XML dans une mise en page dépend principalement de leur ordre d’affichage dans la structure XML. X Tout texte qui s’affiche dans un article associé à un élément XML fait partie des données de cet élément. Meilleure méthode appliquée aux scripts XML dans InCopy Il est conseillé d’effectuer la majorité des opérations sur un fichier XML à l’extérieur d’InCopy, avant d’importer le fichier dans une mise en page InCopy. Ainsi, vous pouvez utiliser d’excellents outils, comme les analyseurs et les éditeurs XML. Si vous devez réorganiser ou dupliquer des éléments dans une structure de données XML importante, le meilleur moyen consiste à transformer le format XML à l’aide du format XSLT. Cette opération s’effectue pendant l’importation du fichier XML. 96 XML Codage des éléments XML à l’aide des scripts 97 Codage des éléments XML à l’aide des scripts Cette section décrit le mode de configuration des préférences générales XML et des préférences d’importation XML, le mode d’importation du format XML, la création d’éléments XML et l’ajout d’attributs XML. Les scripts de cette section illustrent les techniques d’utilisation du contenu XML ; vous trouverez les scripts permettant d’appliquer des attributs de mise en forme aux éléments XML à la section « Ajout d’éléments XML à un article » à la page 102. Configuration des préférences XML Vous pouvez définir l’aspect du panneau de la structure InCopy à l’aide de l’objet des préférences d’affichage XML, comme l’indique l’extrait de script suivant (dans le script d’apprentissage XMLViewPreferences) : Set myXMLViewPreferences = myDocument.XMLViewPreferences myXMLViewPreferences.ShowAttributes = True myXMLViewPreferences.ShowStructure = True myXMLViewPreferences.ShowTaggedFrames = True myXMLViewPreferences.ShowTagMarkers = True myXMLViewPreferences.ShowTextSnippets = True Vous pouvez également définir des préférences de balisage XML prédéfini (le nom des balises par défaut et les couleurs de l’interface utilisateur pour les tableaux et les articles) à l’aide de l’objet des préférences XML, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage XMLPreferences) : Set myXMLPreferences = myDocument.XMLPreferences myXMLPreferences.DefaultCellTagColor = idUIColors.idBlue myXMLPreferences.DefaultCellTagName = "cell" myXMLPreferences.DefaultImageTagColor = idUIColors.idBrickRed myXMLPreferences.DefaultImageTagName = "image" myXMLPreferences.DefaultStoryTagColor = idUIColors.idCharcoal myXMLPreferences.DefaultStoryTagName = "text" myXMLPreferences.DefaultTableTagColor = idUIColors.idCuteTeal myXMLPreferences.DefaultTableTagName = "table" Configuration des préférences d’importation du format XML Avant d’importer un fichier XML, vous pouvez définir des préférences d’importation XML qui peuvent appliquer une transformation XSLT, gérer les espaces dans le fichier XML ou créer des éléments de texte de répétition. Pour cela, utilisez l’objet des préférences d’importation XML, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage XMLImportPreferences) : Set myXMLImportPreferences = myDocument.XMLImportPreferences myXMLImportPreferences.AllowTransform = False myXMLImportPreferences.CreateLinkToXML = False myXMLImportPreferences.IgnoreUnmatchedIncoming = True myXMLImportPreferences.IgnoreWhitespace = True myXMLImportPreferences.ImportCALSTables = True myXMLImportPreferences.ImportStyle = idXMLImportStyles.idMergeImport myXMLImportPreferences.ImportTextIntoTables = False myXMLImportPreferences.ImportToSelected = False myXMLImportPreferences.RemoveUnmatchedExisting = False myXMLImportPreferences.RepeatTextElements = True Rem The following properties are only used when the Rem AllowTransform property is set to True. Rem myXMLImportPreferences.TransformFilename = "c:\myTransform.xsl" XML Codage des éléments XML à l’aide des scripts 98 Rem If you have defined parameters in your XSL file, then you can pass Rem parameters to the file during the XML import process. For each parameter, Rem enter an array containing two strings. The first string is the name of the Rem parameter, the second is the value of the parameter.Rem myXMLImportPreferences.TransformParameters = Array(Array("format", "1")) Importation du format XML Une fois que vous avez défini les préférences d’importation du format XML, vous pouvez importer un fichier XML, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage ImportXML) : myDocument.ImportXML("c:\completeDocument.xml") Si vous devez importer le contenu d’un fichier XML dans un élément XML spécifique, utilisez la méthode importXML de l’élément XML, à la place de la méthode correspondante du document. Voir l’extrait de script suivant (dans le script d’apprentissage ImportXMLIntoElement) : Set myXMLTag = myDocument.XMLTags.Add("xml_element") Set myRootXMLElement = myDocument.XMLElements.Item(1) set myMXLElement = myRootElement.XMLElements.Add(myXMLTag) myRootXMLElement.ImportXML "c:\completeDocument.xml" Vous pouvez également définir la propriété ImportToSelected de l’objet XMLImportPreferences sur true (vrai), puis sélectionner l’élément XML et importer le fichier XML, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage ImportXMLIntoSelectedXMLElement) : Set myDocument = myInDesign.Documents.Add myDocument.ImportXML "c:\test.xml" Set myRootXMLElement = myDocument.XMLElements.Item(1) Set myLastXMLElement = myRootXMLElement.XMLElements.Item(-1) Rem Select the XML element myDocument.Select myLastXMLElement, idSelectionOptions.idReplaceWith myDocument.XMLImportPreferences.ImportToSelected = True myDocument.ImportXML "c:\test.xml" Création d’une balise XML Les balises XML sont les noms des éléments XML à créer dans un document. Lorsque vous importez un contenu au format XML, le nom des éléments présents dans le fichier XML est ajouté à la liste des balises XML dans le document. Vous pouvez également créer directement des balises XML, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage MakeXMLTags) : Rem Set Rem Set Rem Set You can create an XML tag without specifying a color for the tag. myXMLTagA = myDocument.XMLTags.Add("XML_tag_A") You can define the highlight color of the XML tag using the UIColors enumeration... myXMLTagB = myDocument.XMLTags.Add("XML_tag_B", UIColors.Gray) ...or you can provide an RGB array to set the color of the tag. myXMLTagC = myDocument.XMLTags.Add("XML_tag_C", Array(0, 92, 128)) XML Codage des éléments XML à l’aide des scripts 99 Chargement des balises XML Vous pouvez importer des balises XML à partir d’un fichier XML sans importer le contenu XML du fichier. Cette opération peut être utile pour établir un mappage balise-style ou style-balise avant d’importer les données XML, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage LoadXMLTags) : myDocument.LoadTags("c:\test.xml") Enregistrement des balises XML Tout comme vous pouvez charger des balises XML à partir d’un fichier, vous pouvez enregistrer des balises XML dans un fichier, comme l’illustre le script suivant. Seules les balises sont alors enregistrées dans le fichier XML ; les données du document n’y sont pas incluses. Comme vous l’espériez sans doute, ce processus est plus rapide que l’opération d’exportation du format XML, et le fichier généré est plus petit. L’exemple de script suivant permet d’enregistrer les balises XML (pour consulter le script complet, voir SaveXMLTags) : myDocument.SaveXMLTags("c:\xml_tags.xml", "Tag set created October 5, 2006") Création d’un élément XML Normalement, vous créez des éléments XML en important un fichier XML, mais vous pouvez également créer un élément XML à l’aide des scripts InCopy, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage CreateXMLElement) : Set myXMLTag = myDocument.XMLTags.Add("myXMLTag") Set myRootElement = myDocument.XMLElements.Item(1) Set myXMLElement = myRootElement.XMLElements.Add(myXMLTag) myXMLElement.Contents = "This is an XML element containing text." Déplacement d’un élément XML Vous pouvez déplacer des éléments XML dans la structure XML à l’aide de la méthode move, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage MoveXMLElement) : Set myDocument = myInCopy.Documents.Add Set myXMLTag = myDocument.XMLTags.Add("myXMLTag") Set myRootElement = myDocument.XMLElements.Item(1) Set myXMLElementA = myRootElement.XMLElements.Add(myXMLTag) myXMLElementA.Contents = "This is XML element A." Set myXMLElementB = myRootElement.XMLElements.Add(myXMLTag) myXMLElementB.Contents = "This is XML element B." myXMLElementA.Move idLocationOptions.idAfter, myXMLElementB Suppression d’un élément XML Un élément XML est supprimé à la fois de la mise en page et de la structure XML, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage DeleteXMLElement) : myRootXMLElement.XMLElements.Item(1).delete XML Codage des éléments XML à l’aide des scripts 100 Duplication d’un élément XML Lorsque vous dupliquez un élément XML, le nouvel élément XML s’affiche immédiatement après l’élément XML d’origine dans la structure XML, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage DuplicateXMLElement) : Set myDocument = myInCopy.Documents.Add Set myXMLTag = myDocument.XMLTags.Add("myXMLTag") Set myRootElement = myDocument.XMLElements.Item(1) Set myXMLElementA = myRootElement.XMLElements.Add(myXMLTag) myXMLElementA.Contents = "This is XML element A." Set myXMLElementB = myRootElement.XMLElements.Add(myXMLTag) myXMLElementB.Contents = "This is XML element B." myXMLElementA.Duplicate Retrait d’éléments de la structure XML Pour annuler une association entre un objet texte et un élément XML, utilisez la méthode untag, comme l’illustre le script suivant. Les objets ne sont pas supprimés, mais ils ne sont plus liés à un élément XML (lequel est supprimé). Le contenu de l’élément XML supprimé est alors associé à l’élément XML parent. Si l’élément XML est l’élément racine, les objets de mise en page (texte ou élément de page) associés à l’élément XML restent dans le document. (Pour consulter le script complet, voir UntagElement.) Set myXMLElement = myDocument.XMLElements.Item(1).XMLElements.Item(-2) myXMLElement.Untag Création d’un commentaire XML Les commentaires XML sont utilisés pour effectuer des annotations dans des structures de données XML. Vous pouvez ajouter un commentaire XML en utilisant, par exemple, un script qui ressemble à l’extrait de script suivant (dans le script d’apprentissage MakeXMLComment) : Set myRootElement = myDocument.XMLElements.Item(1) Set myXMLElement = myRootElement.XMLElements.Add(myXMLTag) Set myXMLComment = myXMLElement.XMLComments.Add("This is an XML comment.") Création d’une instruction de traitement XML Une instruction de traitement est un élément XML qui contient des indications pour l’application qui lit le document XML. Les instructions de traitement XML sont ignorées par InCopy, mais elles peuvent être insérées dans une structure XML InCopy pour être exportées dans d’autres applications. Un document XML peut contenir plusieurs instructions de traitement. Une instruction de traitement XML comprend deux parties : cible et valeur. Exemple d’instruction de traitement XML : <?xml-stylesheet type="text/css" href="generic.css"?> L’extrait de script suivant permet d’ajouter une instruction de traitement XML (pour consulter le script complet, voir MakeProcessingInstruction) : Set myRootXMLElement = myDocument.XMLElements.Item(1) myRootXMLElement.XMLInstructions.Add "xml-stylesheet type=""text/css""", "href=""generic.css""" XML Codage des éléments XML à l’aide des scripts 101 Utilisation des attributs XML Les attributs XML sont des « métadonnées » qui peuvent être associées à un élément XML. Pour ajouter un attribut à un élément, utilisez un script qui ressemble à l’extrait suivant. Un élément XML peut comporter un nombre quelconque d’attributs XML, mais chaque nom d’attribut doit être unique pour un même élément (c’est-à-dire que vous ne pouvez pas avoir deux attributs nommés « id »). L’extrait de script suivant permet d’ajouter un attribut XML à un élément XML (pour consulter le script complet, voir MakeXMLAttribute) : Set Set Set Set Set XML myDocument = myInCopy.Documents.Add myXMLTag = myDocument.XMLTags.Add("myXMLElement") myRootElement = myDocument.XMLElements.Item(1) myXMLElement = myRootElement.XMLElements.Add(myXMLTag) myXMLAttribure = myXMLElement.XMLAttributes.Add("example_attribute", "This is an attribute.") Outre la création d’attributs directement à l’aide des scripts, vous pouvez convertir les éléments XML en attributs. Le contenu textuel de l’élément XML devient alors la valeur d’un attribut XML ajouté à l’élément XML parent. Comme le nom de l’élément XML devient le nom de l’attribut, cette méthode peut échouer si un attribut portant ce nom existe déjà dans l’élément XML parent. Si l’élément XML contient des éléments de page, ils sont supprimés de la mise en page. Lorsque vous convertissez un attribut XML en élément XML, vous pouvez spécifier l’emplacement où le nouvel élément XML est ajouté. Le nouvel élément XML peut être ajouté au début ou à la fin de l’attribut XML parent. Par défaut, le nouvel élément est ajouté au début de l’élément parent. Vous pouvez également spécifier une balise de marquage XML pour le nouvel élément XML. Si vous ignorez ce paramètre, le nouvel élément XML est créé avec la même balise XML que celle de l’élément XML contenant l’attribut XML. Le script suivant permet de convertir un élément XML en attribut XML (pour consulter le script complet, voir le script d’apprentissage ConvertElementToAttribute) : Set myXMLTag = myDocument.XMLTags.Add("myXMLElement") Set myRootXMLElement = myDocument.XMLElements.Item(1) Set myXMLElement = myRootXMLElement.XMLElements.Add(myXMLTag) Set myTargetXMLElement = myXMLElement.XMLElements.Add(myXMLTag) myTargetXMLElement.Contents = "This is content in an XML element." myTargetXMLElement.ConvertToAttribute Vous pouvez également convertir un attribut XML en élément XML, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage ConvertAttributeToElement) : Set myXMLTag = myDocument.XMLTags.Add("myXMLElement") Set myRootXMLElement = myDocument.XMLElements.Item(1) Set myXMLElement = myRootXMLElement.XMLElements.Add(myXMLTag) Set myXMLattribute = myXMLElement.XMLAttributes.Add("xml_attribute", "This is content in an XML attribute.") myXMLAttribute.ConvertToElement idXMLElementLocation.idElementEnd, myXMLTag XML Ajout d’éléments XML à un article 102 Utilisation des articles XML Lorsque vous importez des éléments XML qui ne sont pas associés à un élément de mise en page (article ou élément de page), ils sont stockés dans un article XML. Vous pouvez utiliser le texte d’éléments XML non placés, comme vous le feriez s’il s’agissait du texte d’un bloc. L’extrait de script suivant explique comment procéder (pour consulter le script complet, voir XMLStory) : Set myXMLStory = myDocument.XmlStories.Item(1) Rem Though the text has not yet been placed in the layout, all text Rem properties are available. myXMLStory.Texts.Item(1).PointSize = 72 Rem Place the Root XML element in the default story so that Rem you can see the result in the Structure panel. myDocument.Stories.Item(1).PlaceXML myRootXMLElement Exportation du format XML Pour exporter des données XML à partir d’un document InCopy, exportez la structure XML entière dans le document ou un élément XML (y compris les éléments XML enfants qu’il contient). L’extrait de script suivant montre comment procéder (pour consulter le script complet, voir ExportXML) : myDocument.Export "XML", "c:\test.xml" Ajout d’éléments XML à un article Précédemment, nous avons étudié le processus d’importation des données XML dans les documents InCopy et l’utilisation de la structure XML dans un document. Dans cette section, nous allons aborder les techniques d’importation des données XML dans un article et l’application d’attributs de mise en forme. Association d’éléments XML à du texte Pour associer un texte à un élément XML existant, utilisez la méthode PlaceXML. Elle consiste à remplacer le contenu de l’élément de page par le contenu de l’élément XML, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage PlaceXML) : myDocument.Stories.Item(1).PlaceXML(myXMLElements.Item(0) Pour associer un objet texte existant à un élément XML existant, utilisez la méthode markup. Elle consiste à fusionner le contenu de l’élément XML (le cas échéant) avec le contenu de l’objet texte. L’extrait de script suivant illustre l’utilisation de la méthode markup (pour consulter le script complet, voir Markup) : Set myInCopy = CreateObject("InCopy.Application") Set myDocument = myInCopy.Documents.Add Set myRootXMLElement = myDocument.XMLElements.Item(1) Set myStory = myDocument.Stories.Item(1) Rem Place the Root XML element in the default story. myStory.PlaceXML myRootXMLElement myString = "This is the first paragraph in the story." myString = myString & "This is the second paragraph in myString = myString & "This is the third paragraph the myString = myString & "This is the fourth paragraph in & vbCr the story." & vbCr story." & vbCr the story." & vbCr XML Ajout d’éléments XML à un article 103 myStory.Contents = myString Set myXMLTag = myDocument.XMLTags.Add("myXMLElement") Set myXMLElement = myRootXMLElement.XMLElements.Add(myXMLTag) Rem Mark up one of the paragraphs with another XML element. myDocument.Stories.Item(1).Paragraphs.Item(3).Markup myXMLElement Insertion d’un texte dans et autour des éléments de texte XML Lorsque vous insérez des données XML dans un article InCopy, vous devez souvent ajouter des espaces (par exemple, des caractères de retour chariot et de tabulation) et du texte statique (étiquettes « nom » ou « adresse ») au texte des éléments XML. L’exemple de script suivant permet d’ajouter du texte à l’intérieur et autour des éléments XML (pour consulter le script complet, voir InsertTextAsContent) : Set myXMLElement = myDocument.XMLElements.Item(1).XMLElements.Item(1) Rem By inserting the return character after the XML element, the character Rem becomes part of the content of the parent XML element, Rem not of the element itself. myXMLElement.InsertTextAsContent vbCr, idXMLElementPosition.idAfterElement Set myXMLElement = myDocument.XMLElements.Item(1).XMLElements.Item(2) myXMLElement.InsertTextAsContent "Static text: ", idXMLElementPosition.idBeforeElement myXMLElement.InsertTextAsContent vbCr, idXMLElementPosition.idAfterElement Rem To add text inside the element, set the location option to beginning or end. Set myXMLElement = myDocument.XMLElements.Item(1).XMLElements.Item(3) myXMLElement.InsertTextAsContent "Text at the start of the element: ", idXMLElementPosition.idElementStart myXMLElement.InsertTextAsContent " Text at the end of the element.", idXMLElementPosition.idElementEnd myXMLElement.InsertTextAsContent vbCr, idXMLElementPosition.idAfterElement Rem Add static text outside the element. Set myXMLElement = myDocument.XMLElements.Item(1).XMLElements.Item(4) myXMLElement.InsertTextAsContent "Text before the element: ", idXMLElementPosition.idBeforeElement myXMLElement.InsertTextAsContent " Text after the element.", idXMLElementPosition.idAfterElement Rem To insert text inside the text of an element, work with the text objects contained by the element. myXMLElement.Words.Item(2).InsertionPoints.Item(1).Contents = "(the third word of) " Mappage des balises aux styles Le moyen le plus rapide d’appliquer une mise en forme aux éléments de texte XML est de recourir à la méthode XMLImportMaps, appelée également mappage balise-style. Vous pouvez alors associer une balise XML spécifique à un style de paragraphe ou de caractère. Lorsque vous utilisez la méthode MapTagsToStyles du document, InCopy applique le style au texte, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage MapTagsToStyles) : Set myInCopy = CreateObject("InCopy.Application") Set myDocument = myInCopy.Documents.Item(1) Rem Create a tag to style mapping. myDocument.XMLImportMaps.Add myDocument.XMLTags.Item("heading_1"), myDocument.ParagraphStyles.Item("heading 1") myDocument.XMLImportMaps.Add myDocument.XMLTags.Item("heading_2"), myDocument.ParagraphStyles.Item("heading 2") myDocument.XMLImportMaps.Add myDocument.XMLTags.Item("para_1"), XML Ajout d’éléments XML à un article 104 myDocument.ParagraphStyles.Item("para 1") myDocument.XMLImportMaps.Add myDocument.XMLTags.Item("body_text"), myDocument.ParagraphStyles.Item("body text") Rem Apply the XML tag to style mapping. myDocument.MapXMLTagsToStyles Mappage des styles aux balises Lorsque vous avez mis en forme un texte qui n’est pas associé à des éléments XML, et que vous souhaitez placer ce texte dans une structure XML, utilisez le mappage style-balise pour associer les styles de paragraphe et de caractère aux balises XML. Pour cela, utilisez les objets XMLExportMaps pour créer les liens entre les balises et les styles XML, puis utilisez la méthode MapStylesToTags pour créer les éléments XML correspondants, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage MapStylesToTags) : Set myInCopy = CreateObject("InCopy.Application") Set myDocument = myInCopy.Documents.Item(1) Rem Create a tag to style mapping. myDocument.XMLExportMaps.Add myDocument.ParagraphStyles.Item("heading 1"), myDocument.XMLTags.Item("heading_1") myDocument.XMLExportMaps.Add myDocument.ParagraphStyles.Item("heading 2"), myDocument.XMLTags.Item("heading_2") myDocument.XMLExportMaps.Add myDocument.ParagraphStyles.Item("para 1"), myDocument.XMLTags.Item("para_1") myDocument.XMLExportMaps.Add myDocument.ParagraphStyles.Item("body text"), myDocument.XMLTags.Item("body_text") Rem Apply the tag to style mapping. myDocument.MapStylesToXMLTags Une autre méthode consiste tout simplement à utiliser le script pour créer une nouvelle balise XML pour chacun des styles de paragraphe ou de caractère du document, puis à appliquer le mappage style-balise, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage MapAllStylesToTags) : Set Set Rem Rem For myInCopy = CreateObject("InCopy.Application") myDocument = myInCopy.Documents.Item(1) Create tags that match the style names in the document, creating an XMLExportMap for each tag/style pair. myCounter = 1 To myDocument.ParagraphStyles.Count Set myParagraphStyle = myDocument.ParagraphStyles.Item(myCounter) myParagraphStyleName = myParagraphStyle.Name myXMLTagName = Replace(myParagraphStyleName, " ", "_") myXMLTagName = Replace(myXMLTagName, "[", "") myXMLTagName = Replace(myXMLTagName, "]", "") Set myXMLTag = myDocument.XMLTags.Add(myXMLTagName) myDocument.XMLExportMaps.Add myParagraphStyle, myXMLTag Next Rem Apply the tag to style mapping. myDocument.MapStylesToXMLTags XML Ajout d’éléments XML à un article 105 Application des styles aux éléments XML Outre l’utilisation des mappages balise-style et style-balise ou l’application des styles au texte et aux éléments de page associés aux éléments XML, vous pouvez également appliquer directement des styles aux éléments XML. Le fragment de script suivant vous montre comment utiliser les méthodes ApplyParagraphStyle et ApplyCharacterStyle. (Pour consulter le script complet, voir ApplyStylesToXMLElements.) Set myInCopy = CreateObject("InCopy.Application") Set myDocument = myInCopy.Documents.Item(1) Rem Add XML elements. Set myRootXMLElement = myDocument.XMLElements.Item(1) Set myXMLElementA = myRootXMLElement.XMLElements.Add(myDocument.XMLTags.Item("heading_1")) myXMLElementA.Contents = "Heading 1" myXMLElementA.ApplyParagraphStyle myDocument.ParagraphStyles.Item("heading 1"), True myXMLElementA.InsertTextAsContent vbCr, idXMLElementPosition.idAfterElement Set myXMLElementB = myRootXMLElement.XMLElements.Add(myDocument.XMLTags.Item("para_1")) myXMLElementB.Contents = "This is the first paragraph in the article." myXMLElementB.ApplyParagraphStyle myDocument.ParagraphStyles.Item("para 1"), True myXMLElementB.InsertTextAsContent vbCr, idXMLElementPosition.idAfterElement Set myXMLElementC = myRootXMLElement.XMLElements.Add(myDocument.XMLTags.Item("body_text")) myXMLElementC.Contents = "This is the second paragraph in the article." myXMLElementC.ApplyParagraphStyle myDocument.ParagraphStyles.Item("body text"), True myXMLElementC.InsertTextAsContent vbCr, idXMLElementPosition.idAfterElement Set myXMLElementD = myRootXMLElement.XMLElements.Add(myDocument.XMLTags.Item("heading_2")) myXMLElementD.Contents = "Heading 2" myXMLElementD.ApplyParagraphStyle myDocument.ParagraphStyles.Item("heading 2"), True myXMLElementD.InsertTextAsContent vbCr, idXMLElementPosition.idAfterElement Set myXMLElementE = myRootXMLElement.XMLElements.Add(myDocument.XMLTags.Item("para_1")) myXMLElementE.Contents = "This is the first paragraph following the subhead." myXMLElementE.ApplyParagraphStyle myDocument.ParagraphStyles.Item("para 1"), True myXMLElementE.InsertTextAsContent vbCr, idXMLElementPosition.idAfterElement Set myXMLElementF = myRootXMLElement.XMLElements.Add(myDocument.XMLTags.Item("body_text")) myXMLElementF.Contents = "This is the second paragraph following the subhead." myXMLElementF.ApplyParagraphStyle myDocument.ParagraphStyles.Item("body text"), True myXMLElementF.InsertTextAsContent vbCr, idXMLElementPosition.idAfterElement Set myXMLElementG = myXMLElementF.XMLElements.Add(myDocument.XMLTags.Item("body_text")) myXMLElementG.Contents = "Note:" Set myXMLElementG = myXMLElementG.Move(idLocationOptions.idAtBeginning, myXMLElementF) myXMLElementG.InsertTextAsContent " ", idXMLElementPosition.idAfterElement myXMLElementG.ApplyCharacterStyle myDocument.CharacterStyles.Item("Emphasis"), True Set myStory = myDocument.Stories.Item(1) Rem Associate the root XML element with the story. myRootXMLElement.PlaceXML myStory XML Ajout d’éléments XML à un article 106 Utilisation des tableaux XML InCopy importe automatiquement les données XML dans les cellules du tableau lorsque les données sont balisées à l’aide du marquage de tableau standard HTML. Si vous ne pouvez pas ou préférez ne pas utiliser le balisage de tableau par défaut, InCopy permet de convertir les éléments XML en tableau à l’aide de la méthode ConvertElementToTable. Pour utiliser cette méthode, les éléments XML à convertir en tableau doivent être conformes à une structure spécifique. Chaque rangée du tableau doit correspondre à un élément XML spécifique, et cet élément doit contenir une série d’éléments XML correspondant aux cellules de la rangée. L’extrait de script suivant explique comment utiliser cette méthode (pour consulter le script complet, voir ConvertXMLElementToTable). L’élément XML utilisé pour désigner la rangée du tableau est utilisé par ce processus. Set myInCopy = CreateObject("InCopy.Application") Set myDocument = myInCopy.Documents.Add Rem Create a series of XML tags. Set myRowTag = myDocument.XMLTags.Add("row") Set myCellTag = myDocument.XMLTags.Add("cell") Set myTableTag = myDocument.XMLTags.Add("table") Rem Add XML elements. Set myRootXMLElement = myDocument.XMLElements.Item(1) With myRootXMLElement Set myTableXMLElement = .XMLElements.Add(myTableTag) With myTableXMLElement For myRowCounter = 1 To 6 With .XMLElements.Add(myRowTag) myString = "Row " & CStr(myRowCounter) For myCellCounter = 1 To 4 With .XMLElements.Add(myCellTag) .Contents = myString & ":Cell " & CStr(myCellCounter) End With Next End With Next End With End With Set myTable = myTableXMLElement.ConvertElementToTable(myRowTag, myCellTag) Set myStory = myDocument.Stories.Item(1) myStory.PlaceXML myDocument.XMLElements.Item(1) Une fois que vous utilisez un tableau contenant des éléments XML, vous pouvez appliquer directement des styles de tableau et de cellule aux éléments XML, au lieu d’appliquer les styles aux tableaux ou aux cellules associés aux éléments XML. Pour cela, utilisez les méthodes applyTableStyle et applyCellStyle, comme l’illustre l’extrait de script suivant (dans le script d’apprentissage ApplyTableStyle) : Set myInCopy = CreateObject("InCopy.Application") Set myDocument = myInCopy.Documents.Add Rem Create a series of XML tags. Set myRowTag = myDocument.XMLTags.Add("row") Set myCellTag = myDocument.XMLTags.Add("cell") Set myTableTag = myDocument.XMLTags.Add("table") Rem Create a table style and a cell style. Set myTableStyle = myDocument.TableStyles.Add myTableStyle.StartRowFillColor = myDocument.Colors.Item("Black") myTableStyle.StartRowFillTint = 25 myTableStyle.EndRowFillColor = myDocument.Colors.Item("Black") myTableStyle.EndRowFillTint = 10 Set myCellStyle = myDocument.CellStyles.Add XML Ajout d’éléments XML à un article myCellStyle.FillColor = myDocument.Colors.Item("Black") myCellStyle.FillTint = 45 Rem Add XML elements. Set myRootXMLElement = myDocument.XMLElements.Item(1) With myRootXMLElement Set myTableXMLElement = .XMLElements.Add(myTableTag) With myTableXMLElement For myRowCounter = 1 To 6 With .XMLElements.Add(myRowTag) myString = "Row " + CStr(myRowCounter) For myCellCounter = 1 To 4 With .XMLElements.Add(myCellTag) .Contents = myString & ":Cell " + CStr(myCellCounter) End With Next End With Next End With End With Set myTable = myTableXMLElement.ConvertElementToTable(myRowTag, myCellTag) Set myTableXMLElement = myDocument.XMLElements.Item(1).XMLElements.Item(1) myTableXMLElement.ApplyTableStyle myTableStyle myTableXMLElement.XMLElements.Item(1).ApplyCellStyle myCellStyle myTableXMLElement.XMLElements.Item(6).ApplyCellStyle myCellStyle myTableXMLElement.XMLElements.Item(11).ApplyCellStyle myCellStyle myTableXMLElement.XMLElements.Item(16).ApplyCellStyle myCellStyle myTableXMLElement.XMLElements.Item(17).ApplyCellStyle myCellStyle myTableXMLElement.XMLElements.Item(22).ApplyCellStyle myCellStyle myDocument.Stories.Item(1).PlaceXML myDocument.XMLElements.Item(1) myTable.AlternatingFills = idAlternatingFillsTypes.idAlternatingRows 107