Adobe InCopy CS6 desktop publishing software Scripting Guide
Adobe InCopy CS6 is a desktop publishing software designed for collaborative text editing. This guide will teach you how to use its powerful scripting features to automate tasks and improve efficiency. You can create scripts to add and format text, search and replace text, add annotations, print and export documents, and more.
Advertisement
Advertisement
ADOBE
®
INCOPY
®
CS6
ADOBE INCOPY CS6
スクリプティングガイド:
JAVASCRIPT
2012 Adobe Systems Incorporated. All rights reserved.
Adobe® InCopy® CS6 スクリプティングガイド: JavaScript
CS6
更新
ドキュメントの更新ステータス
(ドキュメント全体。各章の更新ステータスについては、それぞれの章を参照してください)
ドキュメント全体で CS5 から CS6 への変更およびバージョン 7.0 から 8.0 への変更。
If this guide is distributed with software that includes an end user agreement, this guide, as well as the software described in it, is furnished under license and may be used or copied only in accordance with the terms of such license. Except as permitted by any such license, no part of this guide may be reproduced, stored in a retrieval system, or transmitted, in any form or by any means, electronic, mechanical, recording, or otherwise, without the prior written permission of Adobe Systems Incorporated. Please note that the content in this guide is protected under copyright law even if it is not distributed with software that includes an end user license agreement.
The content of this guide is furnished for informational use only, is subject to change without notice, and should not be construed as a commitment by Adobe Systems Incorporated. Adobe Systems Incorporated assumes no responsibility or liability for any errors or inaccuracies that may appear in the informational content contained in this guide.
Please remember that existing artwork or images that you may want to include in your project may be protected under copyright law.
The unauthorized incorporation of such material into your new work could be a violation of the rights of the copyright owner. Please be sure to obtain any permission required from the copyright owner.
Any references to company names in sample templates are for demonstration purposes only and are not intended to refer to any actual organization.
Adobe, the Adobe logo, Creative Suite, InCopy, InDesign, Illustrator, and Photoshop are registered trademarks or trademarks of Adobe
Systems Incorporated in the United States and/or other countries. Microsoft and Windows are registered trademarks or trademarks of
Microsoft Corporation in the United States and/or other countries. Apple and Mac OS are trademarks of Apple Computer,
Incorporated, registered in the United States and other countries. All other trademarks are the property of their respective owners.
Adobe Systems Incorporated, 345 Park Avenue, San Jose, California 95110, USA. Notice to U.S. Government End Users. The Software and Documentation are “Commercial Items,” as that term is defined at 48 C.F.R. §2.101, consisting of “Commercial Computer
Software” and “Commercial Computer Software Documentation,” as such terms are used in 48 C.F.R. §12.212 or 48 C.F.R. §227.7202, as applicable. Consistent with 48 C.F.R. §12.212 or 48 C.F.R. §§227.7202-1 through 227.7202-4, as applicable, the Commercial Computer
Software and Commercial Computer Software Documentation are being licensed to U.S. Government end users (a) only as
Commercial Items and (b) with only those rights as are granted to all other end users pursuant to the terms and conditions herein.
Unpublished-rights reserved under the copyright laws of the United States. Adobe Systems Incorporated, 345 Park Avenue, San Jose,
CA 95110-2704, USA. For U.S. Government End Users, Adobe agrees to comply with all applicable equal opportunity laws including, if appropriate, the provisions of Executive Order 11246, as amended, Section 402 of the Vietnam Era Veterans Readjustment Assistance
Act of 1974 (38 USC 4212), and Section 503 of the Rehabilitation Act of 1973, as amended, and the regulations at 41 CFR Parts 60-1 through 60-60, 60-250, and 60-741. The affirmative action clause and regulations contained in the preceding sentence shall be incorporated by reference.
目次
3
目次
4
目次
5
アサインされたストーリーのプロパティに対する繰り返し処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
目次
6
1
概要
章の更新ステータス
CS6
変更なし
このマニュアルでは、次の作業を行う方法について説明します。
Adobe® InCopy® のスクリプティング環境の操作
高度なスクリプティング機能の使用
InCopy ドキュメントのテキストや書式の操作(テキストの検索と変更など)
ダイアログボックスなどのユーザーインターフェイスアイテムの作成
メニューのカスタマイズや追加と、メニューアクションの作成
ユーザーインターフェイスのイベントに対する応答
XML の操作(XML 要素の作成、XML の読み込み、レイアウトへの XML 要素の追加など)
このマニュアルに掲載されているスクリプトの使用方法
このマニュアルに掲載されているスクリプトのほとんどは、完全なスクリプトではありません。 このマニュ
アルの説明内容に関連するスクリプトから特定部分のみを抜粋した、断片的なスクリプトです。 このマニュ
アルに掲載されているスクリプトの行をコピーして、スクリプトエディタに貼り付けることができますが、
スクリプトを実行するには、さらに編集が必要になります。 また、このマニュアルからコピーしたスクリプ
さい。このような文字が含まれていると、スクリプトを正常に実行できません。
このマニュアルに掲載されているすべてのスクリプトの Zip アーカイブは、InCopy のスクリプティングホー
ムページ( http://www.adobe.com/jp/products/incopy/scripting/index.html
)で入手できます。
ウンロードして展開したら、該当するスクリプト言語に対応するフォルダーを InCopy フォルダー内の Scripts
フォルダーの下にある Scripts Panel フォルダーに移動します。 これで、InCopy のスクリプトパネルからスクリ
プトを実行できます。
スクリプトの構造について
サンプルスクリプトはすべて、main、mySetup、mySnippet、myTeardown(関数)などの共通のテンプレー
トを使用して記述されています。 この記述方式は、自動化テストとパブリケーションを簡略化するためのも
のです。通常はスクリプトをこのように構築する必要はありません。 スクリプト作成者の関心を引くと思わ
れるスクリプトの断片は、mySnippet 関数内に記述されています。
詳細情報
InCopy スクリプティングに関するユーザーフォーラム( http://www.adobeforums.com
)でも、InCopy スクリ
プティングに関する情報が入手できます。 このフォーラムでは、質問をしたり、質問に答えたり、新たに作
成したスクリプトを別のユーザーと共有したりできます。 このフォーラムでは、多数のサンプルスクリプト
が提供されています。
7
第 1 章 概要
InCopy について 8
InCopy について
InCopy は、Adobe InDesign® との統合利用を目的に開発された共同作業用のテキスト編集アプリケーションで
す。 InCopy では、変更をトラックしたり、編集上の注釈を追加したり、原稿用のスペースに合わせて原稿を
はめ込んだりすることができます。 InCopy と InDesign は同じテキスト組版エンジンを使用しているので、レ
イアウトに原稿をはめ込んだときの組版結果はまったく同じになります。
や新聞、企業出版物を共同で制作し、テキストの編集とレイアウトの編集を並行して進めることができます。
対象となるユーザーは、編集者、ライター、校正者、原稿の編集者、原稿の加工業者です。
InCopy は、多くのパネルやパレットを InDesign と共有していますが、独自のユーザーインターフェイス項目
も搭載しています。
InCopy ファイルと InDesign ファイルの関係
InCopy ファイルと InDesign ファイルの関係は重要です。これは、出版ワークフローにおける作業の分担は、
1 つの素材の大部分を両方のアプリケーションで開いて変更する場合に発生するためです。
InCopy からの一般的な書き出し方法は、2 種類あります。
(IDML ベースの)ICML ファイルを書き出すことができます。
(INX ベースの)INCX ファイルを書き出すことができます。
InDesign からの一般的な書き出し方法で、InCopy との連携を伴うものは、2 種類あります。
InCopy ファイルとして InDesign から書き出されたストーリーは、XML ファイルまたは XML ストリームで
す(この機能は、InDesign に読み込まれる InCopyExport と InCopyWorkflow のプラグインによって提供さ
である、ページの形状が一切含まれていない、XML ファイルまたは XML ストリーム内のデータは
InDesign や InCopy だけでなく検索エンジンやデータベースツールなどでも使用できるといった実用的な
特徴があります。
記事内の各グループ(見出し、署名欄、原稿、グラフィック、キャプションなど)を書き出すこともで
きます。 InDesign および InCopy では、各グループの作成をアサインファイルでサポートしています。ア
サインファイルは、その他のファイルをトラックする補助ファイルを追加することで、ファイル管理を
行います。 実際には、アサインとは、依頼作業(例えば、原稿の編集、レイアウト、原稿の作成など)
のために 1 人の人間に割り当てられる一連のファイルです。 アサインに含まれるすべてのストーリーは、
保持されます。 InDesign では、アサインに書き出すことによって、特定のストーリー一式を書き出すこと
ができます。 InCopy で、アサインに含まれているすべてのストーリーを同時に(1 つの単位として)開き
を参照してください。
ストーリー
InDesign ドキュメントは、書き出し時に、同じ数の InCopy ドキュメントにモジュール化することができま
クパネル、または InCopy のアサインパレットのアサインファイルで確認できます。
InCopy では、InDesign ドキュメントへのリンクが存在していて関連付けが行われていても、リンクは維持さ
ストーリーは、XML で構造化することができます。 つまり、XML データの中に XML データを含めることがで
いる外部の構造内に、ストーリーの未加工テキストを含めることができます。
第 1 章 概要
InCopy ファイルと InDesign ファイルの関係 9
XML で書き出すことができます。
ICML または INCX ファイルには、InCopy データとマークアップテキストの両方を含めることができます。
ファイルを XML データで書き出した場合は、InCopy 特有のデータが取り除かれ、スタイルの設定に関する情
報以外のマークアップ記述が残ります。
ページの形状
する必要があります。 InCopy では、必要な場合に InDesign ドキュメントを開いて、デザイン情報や書き出さ
れたストーリーへのリンクを抽出することができます。 InCopy 内でページの形状が必要になる場合、アサイ
ンファイルにページの形状を含めて提供することができます。
メタデータ
Adobe Extensible Metadata Platform(XMP)は、メタデータを作成、変換、管理するための実用的な方法を提
供しています。 InCopy ファイルでは、XMP がサポートされています。
XMP データを表示するために、InDesign ではファイル/ファイル情報のコマンドが用意されているように、
は、書き出し時に XMP データをそのまま残しておくことも、取り除くこともできます。
サードパーティーソフトウェア開発者によってストーリーに追加されたメタデータは、InDesign ドキュメン
トに組み込むときにそのまま保持されます。 追加されたメタデータは、InDesign 内で表示できるだけでなく
(リンクパネルのメニューにあるファイル情報ダイアログボックス)、InCopy 内でも表示できます。 さらに、
サードパーティーソフトウェア開発者は、メタデータをカスタムユーザーインターフェイスで表示する機能
を InDesign に追加することもできます。
サービスプロバイダーがメタデータの内容を InCopy ファイルに追加するための拡張のポイントがあります。
を参照してください。
ドキュメントモデル
トを使用することもできますが、デフォルトのドキュメントタイプにはなっていません。
InDesign と InCopy のいずれも、基本のドキュメントは常にデータベースです。ただし、InCopy では、このド
キュメントが不完全なドキュメントになることがあります。 InDesign では、通常、主なドキュメントは開い
ている InDesign ファイルですが、開いている INX または IDML ファイルになることもあります。通常、INX ま
たは IDML ファイルは、保存されていない InDesign ドキュメントのように見えます。
込まれている InCopy ストーリー(またはプレーンテキストや RTF テキスト)があります。 また、IDML や INX
ベースのアサインファイルもあります。これらのアサインファイルには、XML ファイルに保存されている
デルのプラグインセットに対応しており、時間とともに変更に合わせたバージョンアップが重ねられていま
により、ドキュメントをアプリケーション間で移動しても、ほとんど同様に表示することが可能になります。
ユーザーインターフェイスの違い
InDesign と InCopy は多くのパネルを共有していますが、InCopy は小型のセットで、画面の上、左、下の境界
に補助的なツールバーが表示されます。 また、InCopy の多くのパネルは、このツールバーにドッキングさせ
ることができます。ドッキングさせると、パネルは小型化されますが、常に表示されるようになります。
第 1 章 概要 設計とアーキテクチャ 10
また、InCopy には複数のビューによるカスタムウィンドウレイアウトが用意されており、メインウィンドウ
にゲラビュー、ストーリービュー、レイアウトビューの 3 つのタブがあります。 レイアウトビューは InDesign
ウィンドウのビューです。 ゲラビューとストーリービューは、単なるストーリーエディターのビューです。
ゲラビューでは正確な行末が適用され、ストーリービューでは適用されません。
設計とアーキテクチャ
ストーリーとファイルの関係
示しており、特に InDesign 以外でファイルの編集が必要な場合に適した選択です。
ICML 形式
各 InCopy ファイルやストリームは、XML 形式で記述されています。 この利点は、InCopy ファイルを簡単に解
析できることと、あらゆるテキストエディターで開けることです。
INCX 形式
が、INCX ベースのワークフローを引き続きサポートする場合に使用できます。
ドキュメントの操作
InCopy では、ドキュメントの操作(ファイルの操作)のデフォルト実装が提供されています(例えば、新
ファイルの操作は、1 つのプラグイン(InCopyFileActions)にソースコード形式で含まれています。 ソフト
ウェア開発者やシステムインテグレーターが、この部分を独自の実装内容に置き換え、それぞれのワークフ
ローシステムに合わせた相互処理にカスタマイズすることを想定しています。
XMP メタデータの使用
ユーザーは、ファイル/コンテンツファイル情報を選択して、メタデータを入力および編集できます。 この
メタデータは、InCopy ファイルに保存されます。 ソフトウェア開発者やシステムインテグレーターは、XMP
SDK を使用して、独自のメタデータを作成し保存できます。
2
はじめに
CS6
更新
CS5 に関する言及を削除または変更。
章の更新ステータス
インターフェイスに搭載されているツール、パネル、ダイアログボックスなど)と比べても、スクリプティ
ングほど時間と手間とコストを節約してくれるものはありません。
このマニュアルでは、すべての InCopy ユーザーを対象に説明を行います。 まず、スクリプトを初めて作成す
る方のために、スクリプトの基本事項について説明します。 次に、他のアプリケーション向けにスクリプト
を作成した経験がある方のために、InCopy スクリプティングの特徴について説明します。 さらに、スクリプ
トを InCopy にインストールして実行する方法や、InCopy スクリプティングで実現できることと実現できない
こと、スクリプトの作成に必要なソフトウェアについても説明します。
InCopy のユーザーインターフェイスで行える操作のほとんどは、スクリプトを使用して実行することができ
ます。 テキストの入力やフォーマット、テキストの検索や変更、注釈の追加、ドキュメントページの印刷や
書き出しなど、 ドキュメントやその内容に変更を加えるアクションは、すべてスクリプトで実行できます。 ま
た、ユーザーインターフェイスでは行えない高度な処理も実行できます。
スクリプトを使用すれば、メニューの作成、メニュー項目の追加、ダイアログボックスやパネルの作成と表
示、ユーザーインターフェイスで行われた選択への応答などが行えます。 また、テキストファイルの読み取
りや書き込み、XML データの解析、他のアプリケーションとの通信なども行えます。 スクリプトは、カーソ
ル位置でのタブストップの設定のような単純な処理から、非常に複雑な処理まで、様々な用途に活用できま
クフロー全体を自動化するスクリプトを作成できるようになります。
ワークスペースの設定やキーボードショートカットの定義など、スクリプトで実行できない操作がいくつか
ありますが、その多くはユーザーインターフェイスに関係する操作です。 また、InCopy ドキュメントに新し
い種類のオブジェクトを追加したり、InCopy の基本機能を新たに追加する(例えば、新しいテキストコンポ
ジションエンジンを追加する)こともできません。 このような拡張を行いたい場合は、InCopy ソフトウェア
開発キット(SDK)を使用して、C++ でコンパイル済みのプラグインを作成する必要があります。
InCopy は、主に Adobe InDesign® ドキュメントの製作工程の一部として使用されます。したがって、このマ
ニュアルでは、InCopy だけでなく InDesign についても触れています。 また、InDesign と InCopy のスクリプ
ティングは非常に似ています。 InDesign スクリプティングについて詳しくは、『Adobe InDesign スクリプティ
ングチュートリアル』および『Adobe InDesign スクリプティングガイド』を参照してください。
スクリプトのインストール
InCopy にスクリプトをインストールするには、InCopy アプリケーションフォルダー内の Scripts フォルダーに
ある Scripts Panel フォルダーに、スクリプトファイルを保存します。
または、ユーザー環境設定フォルダーの Scripts Panel フォルダーにスクリプトを保存します。 ユーザー環境設
定フォルダーは、次の場所にあります。
< ユーザー名 >
はユーザー名を表し、~(チルド)はシステムボリュー
ムを表します。
Mac OS®:
ユーザ /< ユーザー名 >/ ライブラリ /Preferences/Adobe
InCopy/
Version 8.0-J/ja_JP/Scripts/Scripts Panel
Windows® XP:
C:¥Documents and Settings¥< ユーザー名 >¥Application Data¥Adobe¥InCopy¥
Version 8.0-J¥ja_JP¥Scripts¥Scripts Panel
11
第 2 章 はじめに スクリプトの実行 12
Windows® Vista:
C:¥ ユーザー ¥< ユーザー名 >¥App Data¥Roaming¥Adobe¥InCopy¥
Version 8.0-J¥ja_JP¥Scripts¥Scripts Panel
このフォルダーに保存したスクリプトは、InCopy のスクリプトパネルに表示されます(このパネルを表示す
るには、ウィンドウ/スクリプトを選択します)。
Scripts Panel フォルダーには、スクリプトやスクリプトが保存されているフォルダーのエイリアスやショート
カットを保存することもできます。これらのエイリアスやショートカットも、スクリプトパネルに表示され
ます。
スクリプトの実行
スクリプトを実行するには、スクリプトパネルを表示し(ウィンドウ/スクリプトを選択し)、スクリプトパ
ネルに表示されているスクリプト名をダブルクリックします。 多くの場合、何らかのユーザーインターフェ
イス(ダイアログボックスやパネルなど)が表示され、必要に応じて警告が表示されます。
スクリプトパネルの使用
スクリプトパネルでは、コンパイル済みまたは未コンパイルの AppleScript(拡張子が
.spt
、
.as
、
.applescript
のファイル)
.js
または
.jsx
のファイル)
.vbs
の
ファイル)、実行可能ファイルを実行できます。
スクリプトパネルに表示されているスクリプトを編集するには、Option キー(Mac OS)または Alt キー
(Windows)を押しながらスクリプト名をダブルクリックします。 スクリプトのファイルタイプに対応するエ
ディターで、そのスクリプトファイルが開かれます。
スクリプトパネルに表示されているスクリプトの保存フォルダーを開くには、Command キー(Mac OS)ま
たは Ctrl キーと Shift キー(Windows)を押しながらスクリプト名をダブルクリックします。 または、スクリ
プトパネルのメニューから「Finder で表示」(Mac OS)または「エクスプローラーで表示」(Windows)を選
択します。 そのスクリプトが保存されているフォルダーが、Finder(Mac OS)またはエクスプローラー
(Windows)で表示されます。
スクリプトは一連のアクションとして実行されます。つまり、編集メニューから「取り消し」を選択して、
スクリプトで行った各変更を取り消すことができます。 スクリプトのトラブルシューティングを行う場合は、
これによって問題のアクションが見つけやすくなります。
スクリプトにキーボードショートカットを追加するには、編集/キーボードショートカットを選択し、セッ
トメニューから編集可能なショートカットセットを選択し、機能エリアメニューから「スクリプト」を選択
します。 スクリプトパネル内のスクリプトが一覧表示されます。 スクリプトを選択し、InCopy の通常の機能
と同じようにキーボードショートカットを割り当てます。
JavaScript 言語の詳細
InCopy では、ExtendScript と呼ばれるアドビ システムズ社独自の JavaScript 実装に基づいて JavaScript がサ
ポートされています。 ExtendScript インタープリターは、JavaScript の現行の標準である ECMA 262 に準拠して
おり、 JavaScript 1.5 の言語機能がすべてサポートされています。 Adobe Illustrator® や Adobe Photoshop® などの
Adobe Creative Suite® 製品でも、ExtendScript JavaScript インタープリターが使用されています。
Late Night Software 社の OSA JavaScript(Mac OS)や、Microsoft® JScript(Windows)などの他のバージョンの
JavaScript でもスクリプトを作成できますが、これらの言語と ExtendScript では使用されている用語が異なり
ます。 ExtendScript のサンプルは、他のバージョンの JavaScript では動作しません。
注意 : ExtendScript のツールや機能が複数のアドビ製品に搭載されたのに伴って、ExtendScript のマニュアル
はすべて統合されました。 ExtendScript Toolkit(オブジェクトモデルを参照できる JavaScript 開発環境)や
Suite 5 JavaScript Tools Guide』を参照してください。
第 2 章 はじめに このマニュアルに掲載されているスクリプトの使用方法 13
その他の JavaScript 開発の選択肢
ExtendScript Toolkit を使用して明示的に InCopy 用の JavaScript のスクリプトを作成することもできますが、
Creative Suite Extension Builder(CS Extension Builder)を使用すると、ActionScript で CS エクステンションを開
発できます。 CS エクステンションは Flash ベース(SWF)であるため、潜在的に Creative Suite の様々なアプリ
ケーションで動作する可能性があります。
CS の各アプリケーションは拡張性に優れたインフラストラクチャで構築されており、開発者がアプリケー
ションの機能を拡張できるようになっています。インフラストラクチャは、Flash および Flex テクノロジーが
基盤になっていて、CS の各エクステンションはコンパイルした Flash(SWF)ファイルで配布します。CS に
用意されている Extension Manager を使用すると、CS エクステンションのインストールを実行できます。
様々な Creative Suite アプリケーションに対して一貫性のあるユーザーインターフェイスが提供されます。た
だし、ロジックは、各ホストアプリケーションに適応したものがそれぞれ用意されています。
エクステンションのユーザーインターフェイスは、Flex フレームワークを使用して ActionScript で作成されて
項目からアクセスします。 CS Extension Builder では、Flash Builder のデザインビューを使用して、インタラク
ティブにユーザーインターフェイスを設計できます。 また、CS Extension Builder では、CS エクステンション
用のすべてのアプリケーションロジックを ActionScript で開発できます。使い慣れた Flash Builder 環境で、エ
クステンションを開発してデバッグを行うことができます。
アプリケーションロジックの開発には、Creative Suite ActionScript Wrapper Library(
CSAWLib
)の使用をお勧め
します。CSAWLib は、各ホストアプリケーションのスクリプティング DOM を ActionScript ライブラリとして
公開します。 CSAWLib は、CS Extension Builder 環境に緊密に統合されています。CS Extension Builder 環境には、
エクステンションの基本構造を作成したり、Adobe InDesign や Photoshop、Illustrator などの Creative Suite ア
プリケーションに対してコードを実行してデバッグを行ったりする際に役立つウィザードが用意されていま
す。
スクリプティング DOM のメソッド、プロパティ、ビヘイビアーは、ホストアプリケーションの『JavaScript
Creative Suite SDK のマニュアルを参照してください。CS Extension Builder をインストールしている場合は、
Flash Builder または Eclipse のヘルプシステム内からマニュアルにアクセスできます。
このマニュアルに掲載されているスクリプトの使用方法
このマニュアルに記載されているスクリプトを使用するには、チュートリアルスクリプトファイルを開くか
(ファイル名は各スクリプトの前に記載されています)、この章に記載されているコードをコピーします。
スクリプトファイルは、
InCopyCS6ScriptingGuideScripts.zip
という Zip アーカイブに格納されています。
アーカイブを圧縮解除したら、目的のスクリプト言語(AppleScript、JavaScript または VBScript)で作成され
たスクリプトが保存されているフォルダーを、Scripts Panel フォルダーに移動します。 これらのスクリプト
ファイルを利用するほうが、スクリプトを直接入力したり、このマニュアルからスクリプトをコピーして貼
り付けるよりも簡単です。
スクリプトアーカイブを入手できない場合、この章に掲載されているスクリプトコードを入力することもで
1.
この Adobe PDF 形式のマニュアルからスクリプトをコピーして、ExtendScript Toolkit に貼り付けます。
2.
Scripts Panel フォルダーに、プレーンテキストファイルとしてスクリプトを保存します(
を参照)。ファイル拡張子は
.jsx
を使用します。
3.
ウィンドウ/スクリプトを選択して、スクリプトパネルを表示します。
4.
スクリプトパネルでスクリプト名をダブルクリックして、スクリプトを実行します。
第 2 章 はじめに 最初の InCopy スクリプトの作成 14
手入力でスクリプトを作成する方法は、この章に掲載されているスクリプトに対してのみ有効です。 他の章
に掲載されているスクリプトは、断片的なスクリプトです。完全なスクリプトではありません。 他の章のス
クリプトを実行するには、スクリプトアーカイブのスクリプトを使用する必要があります。
注意 : スクリプトアーカイブのスクリプトを使用せずに、サンプルスクリプトを直接入力する場合は、掲載
されているとおりに大文字と小文字を使い分けることが重要です。 JavaScript では大文字と小文字が区別され
るので、使い分けを誤ると正しく実行されません。
注意 : このマニュアルからスクリプトをコピーして貼り付ける場合は、レイアウトの都合で途中で改行され
ている文があるとエラーになる点に注意してください。 このようなエラーを発見するのは難しいことが多い
ので、Zip アーカイブのスクリプトを使用することをお勧めします。
最初の InCopy スクリプトの作成
では、InCopy スクリプトを実際に作成してみましょう。ここでは、新規ドキュメントを作成し、テキストフ
レームを追加し、そのテキストフレームにテキストを入力するスクリプトを作成します。 非常に簡単な作業
のように思えますが、このスクリプトでは次の処理を行います。
InCopy との通信を確立する。
新規ドキュメントを作成する。
ストーリーにテキストを追加する。
HelloWorld.jsx
。 var myDocument = app.documents.add();
var myStory = myDocument.stories.item(0);
myStory.contents = "Hello World!";
Scripts Panel フォルダーに、プレーンテキストファイルとしてスクリプトを保存します(
.jsx
を使用します。
リプトパネルでスクリプト名をダブルクリックします。または、ExtendScript Toolkit で、ターゲットアプリ
ケーションのポップアップメニューから InCopy を選択し、「実行」をクリックします。
スクリプトの動作の説明
ここでは、Hello World スクリプトの動作について、順を追って説明します。
1.
InCopy アプリケーションオブジェクトとの通信を確立します。
アプリケーションは app
で参照できます。
2.
新規ドキュメントを作成して、その参照を取得します。
Var myDocument = app.documents.add();
3.
ドキュメントの最初のストーリーへの参照を取得します(独立したドキュメントには必ずストーリーが
含まれています)。 var myStory = myDocument.stories.item(0);
4.
コンテンツのプロパティに文字列を設定して、ストーリーにテキストを追加します。 myStory.contents = "Hello World!";
第 2 章 はじめに スクリプティング用語と InCopy オブジェクトモデル 15
スクリプティング用語と InCopy オブジェクトモデル
ここでは、次のスクリプトに進む前に、スクリプト言語に関する一般的な用語と、InCopy スクリプティング
に固有の用語について説明します。
スクリプティングの用語
まず、スクリプティングに関する一般的な用語や概念について説明します。
コメント
コメントを使用して、スクリプトに説明用のテキストを追加することができます。 コメントはスクリプトの
実行時には無視され、エラーが発生しないようになっています。 スクリプトの処理について、自分や他人の
ために注釈を残しておきたい場合は、コメントを使用すると便利です。 このマニュアルのチュートリアルス
クリプトでも、コメントを使用しています。
JavaScript でコメントを入力するには、コメントの左に「
//
」と入力します。または、「
/*
」と「
*/
」でコメ
ントを囲みます。 次に例を示します。
// this is a comment
/* and so is this */
値
InCopy スクリプティングで使用される値の例としては、テキストの文字のポイントサイズ、注釈の内容、ド
キュメントのファイル名などがあります。 値とは、スクリプトで処理を行う際に使用するデータのことです。
値にどのような種類のデータが含まれるかは、値の型によって定義されます。 例えば、単語が格納されてい
る値の型は文字列で、段落の行送りの値の型は数値です。 通常、スクリプトで使用される値は数値かテキス
トです。 InCopy スクリプティングで最もよく使用される値の型を、次の表に示します。
値の型
Boolean
Integer
Number
String
Array
説明
真(True)か偽(False)かを表す論
理値。
例
True
14
数と負の整数があります。
精度の高い数値。小数点が含まれる
ことがあります。
一連のテキスト文字。 文字列は引用
符で囲みます。
13.9972
" これは文字列です "
値のリスト(この値はどの型であっ
てもかまいません)。
["0p0", "0p0", "16p4", "20p6"]
値の型の変換
文字列への変換(テキストの中に挿入したり、ダイアログボックスに表示したりする場合に行います)と、
文字列から数値への変換(ポイントサイズやページ位置を設定する場合に行います)の 2 つです。
第 2 章 はじめに スクリプティング用語と InCopy オブジェクトモデル 16
//To convert from a number to a string:
myNumber = 2;
myString = myNumber + "";
//To convert from a string to an integer:
myString = "2";
myNumber = parseInt(myString);
//If your string contains a decimal value, use "parseFloat" rather than "parseInt":
myNumber = parseFloat(myString);
//You can also convert strings to numbers using the following:
myNumber = +myString;
変数
変数は、値を格納する入れ物のようなものです。 「変数」という名前が表しているように、この入れ物に格
納する値は変更することができます。 変数には数値が格納されることもありますし、テキスト文字列や、
照するときにはこの名前を使用します。 変数に値を格納するには、その変数にデータを割り当てます。
InCopy のすべてのサンプルスクリプトやチュートリアルスクリプトでは、変数名はすべて my
で始まってい
ます。 このようにすることで、スクリプトで独自に作成した変数と、スクリプト言語の予約語を簡単に区別
できるようにしています。
変数への値の割り当て
変数に値や文字列を割り当てるのは簡単です。その方法を次の例に示します。 var myNumber = 10;
var myString = "Hello, World!";
var myTextFrame = myDocument.pages.item(0).textFrames.add();
注意 : JavaScript では、 var
が前に付いていない変数はすべて、デフォルトでグローバルと見なされます(つ
ているスクリプトでは var を使用することをお勧めします。
変数には、意味のある名前を付けるようにしてください。 firstPage
や corporateLogo
などは良い例です。 x
や c
などは悪い例です。
スクリプトの実行速度に悪影響を与えることはありません。
変数は、1 つの単語である必要があります。ただし、読みやすくするために途中で大文字を使用したり
( myFirstPage
、アンダースコアを使用したり( my_first_page
初の文字に数字を使用することはできません。また、変数名に句読点や引用符を含めることもできません。
配列変数
配列オブジェクトには、一連の値を格納することができます。 myArray = [1, 2, 3, 4];
配列に含まれている要素を参照するには、その要素のインデックスを参照します。JavaScript では、配列の最
初の要素は要素 0 です。 var myFirstArrayItem = myArray[0];
次の例のように、配列の中にさらに別の配列を含めることができます。 var myArray = [[0,0], [72,72]];
変数の値の型を調べる
オブジェクトの値の型に基づいて判断を行いたい場合があります。 例えば、選択されたテキストに対して処
理を実行するスクリプトでは、何も選択されていない場合には処理を停止する必要があります。
第 2 章 はじめに スクリプティング用語と InCopy オブジェクトモデル 17
//Given a variable of unknown type, "myMysteryVariable"...
myType = myMysteryVariable.constructor.name;
//myType will be a string corresponding to the JavaScript type (e.g., "Rectangle")
演算子
演算子は、変数や値を使用して計算(加算、減算、乗算、除算)を実行し、値を返します。 例えば、
MyWidth/2
では、変数 myWidth
に格納されている値の半分の値が返されます。
また、演算子を使用して比較(等しい(
=
こともできます。 例えば、
、等しくない(
<>
)、より大きい(
>
、より小さい(
<
))を行う
MyWidth > myHeight
では、 myWidth
が myHeight
よりも大きい場合には true
(または 1)が、そうでない場合には false
(0)が返
されます。
JavaScript では、プラス記号(
+
)を使用して 2 つの文字列を結合させることができます。
"Pride " + "and Prejudice"
//returns the string: "Pride and Prejudice"
条件文
「もし選択されているテキストのサイズが 12 ポイントなら、そのポイントサイズを 10 ポイントに設定しなさ
(選択されているテキストのカラー、ドキュメントのページ数、日付など)を評価して、その結果に従って処
理を行うことができます。 条件文は、ほとんどの場合 if
で始まります。
制御構造
令をしていたことでしょう。 スクリプティングの用語では、このような命令のことを制御構造と呼びます。 制
御構造を使用すると、反復作業、つまりループ処理を行うことができます。 ループの考えは、それぞれルー
プ内で変化があったかなかったかに関わらず、特定の条件を満たすまで、ある動作を何度も何度も繰り返す
ことです。 for
で始まります。
関数
関数とは、スクリプトの中から参照することができるスクリプティングモジュールのことです。 関数に値
(または一連の値)を渡して、返される値を取得する、というのが一般的な使い方です。 関数は、何か特別な
コードで構成されているわけではありません。これらは、スクリプトの中で同じコードを何度も入力する手
間を省くためのものです。 関数は function
で始まります。
第 2 章 はじめに スクリプティング用語と InCopy オブジェクトモデル 18
InDesign および InCopy オブジェクトモデルの理解
InCopy と InDesign ドキュメントの関係を考えるとき、おそらくプログラムと、そのコンポーネントの関係を
考えるでしょう。 同様に、段落はテキストフレームの中にあり、テキストフレームはページの中にあり、 ペー
ジはスプレッドの中にあり、いくつかのスプレッドが集まって 1 つのドキュメントを構成していることもご
存知だと思います。 ドキュメントにはカラー、スタイル、レイヤー、マスタースプレッドなども含まれてい
ます。 ドキュメントにオブジェクトを作成するユーザーは、それらの間に一定の序列があることを直感的に
理解しています。
InDesign や InCopy も、ドキュメントのコンテンツを同じような考え方で「認識」しています。ドキュメント
の中にはページが含まれており、ページの中にはページアイテム(テキストフレーム、長方形、楕円形など)
が含まれています。 テキストフレームの中には文字、単語、段落、アンカーフレームなどが含まれています。
グラフィックフレームの中には画像、EPS、PDF などが含まれています。グループの中には他のページアイテ
ムが含まれています。 これらはすべて、InDesign パブリケーションを構成するオブジェクトです。InDesign お
よび InCopy スクリプトでは、このオブジェクトに対して何らかの操作を行います。
パブリケーションの中にあるオブジェクトは、一定の序列に従って編成されています。 例えば、段落はス
トーリーの中にあり、ストーリーはドキュメントの中にあり、ドキュメントは InCopy アプリケーションオブ
ジェクトの中にあります。 オブジェクトモデルや階層という言葉は、このような構造のことを指しています。
目的のオブジェクトにアクセスするためには、このオブジェクトモデルを理解している必要があります。
InCopy の構造を理解することが、InCopy スクリプティングをマスターする秘訣であると言えます。
オブジェクトにはプロパティ(属性)があります。 例えば、テキストオブジェクトには、テキストの書式設
定に使用するフォント、ポイントサイズ、テキストに適用する行送りなどのプロパティがあります。
プロパティには値が設定されます。例えば、テキストのポイントサイズには、ポイント数を表す数値や、自
動行送りを表す「Auto」などの文字列が設定されます。 また、テキストの塗りカラーには、1 つのカラー、グ
ラデーション、混合インキ、スウォッチなどが設定されます。
プロパティには、読み書き可能なものと読み取り専用のものがあります。 読み書き可能なプロパティは、別
の値に変更することができますが、読み取り専用のプロパティは変更できません。
また、オブジェクトにはメソッドが用意されています。 これは、そのオブジェクトが実行できるアクション
を表しており、スクリプトの中で「動詞」として使用されます。 例えば、ドキュメントオブジェクトには、
印刷、書き出し、保存などを行うメソッドが用意されています。
メソッドはパラメーターを取ります。パラメーターは、メソッドの動作を定義するための値です。 例えば、 open メソッドは、開くファイルを定義するためのパラメーターを取ります。
解するための概念的なフレームワークなので、InCopy スクリプティングで利用できるオブジェクトを完全に
網羅したものではありません。
第 2 章 はじめに スクリプティング用語と InCopy オブジェクトモデル 19 application documents libraries books application preferences application defaults application events application menus application properties application methods a document document preferences document defaults document events document properties document methods document elements pages or spreads stories page text objects
この図に示されている各オブジェクトについて、次の表で説明します。 page items
用語
Application
Application defaults
Application events
Application menus
Application methods
Application preferences
Application properties
Books
Document
表しているもの
InCopy。
アプリケーションのデフォルト設定。カラー、段落スタイル、オブジェクトスタイルな
ど。 アプリケーションのデフォルト設定はすべての新規ドキュメントに影響を与えます。
ユーザーやスクリプトがアプリケーションを操作したときに発生します。 例えば、ドキュ
メントのオープン、クローズ、保存を行ったときや、メニュー項目を選択したときなどに
イベントが生成されます。 イベントに反応してスクリプトを実行させることができます。
InCopy のユーザーインターフェイスに表示されるメニュー、サブメニュー、コンテキスト
メニュー。 メニューの選択にスクリプトを関連付けたり、スクリプトからメニューアク
ションを実行したりできます。
アプリケーションが実行できるアクション。テキストの検索と変更、選択項目のコピー、
新規ドキュメントの作成、ライブラリのオープンなど。
テキストの環境設定、PDF 書き出しの環境設定、ドキュメントの環境設定など。 環境設定
オブジェクトの多くはドキュメントレベルにも存在しています。 ユーザーインターフェイ
スの場合と同じように、アプリケーションの環境設定は新規ドキュメントに適用されま
す。ドキュメントの環境設定は特定のドキュメントの設定を変更します。
アプリケーションのプロパティ。アプリケーションのフルパス、アプリケーションのロ
ケール、ユーザー名など。
開かれているブックのコレクション。
InCopy ドキュメント。
第 2 章 はじめに スクリプティング用語と InCopy オブジェクトモデル 20
用語
Document defaults
Document elements
Document events
Document methods
Document preferences
Document properties
Documents
Libraries
Page
Page item
表しているもの
ドキュメントのデフォルト設定。デフォルトのカラー、段落スタイル、デフォルトのテキ
スト書式など。
ドキュメントのストーリー、読み込んだグラフィック、ページなど。 ページやストーリー
もドキュメント要素ですが、これらは他のオブジェクトを格納するコンテナとして特に重
要な要素なので、この表の前にある図では独立して示されています。ドキュメント要素に
は、このほかにも、長方形、楕円形、グループ、XML 要素などの、読み込んだり作成した
りできるあらゆる種類のオブジェクトが含まれます。
ドキュメントレベルで発生するイベント。テキストの読み込みなど。 この表の
「Application events」を参照してください。
ドキュメントが実行できるアクション。ドキュメントのクローズ、印刷、書き出しなど。
ドキュメントの環境設定。ガイド、表示、ドキュメントの環境設定など。
ドキュメントのファイル名、ページ数、原点の位置など。
開かれているドキュメントのコレクション。
開かれているライブラリのコレクション。
InCopy ドキュメント内の 1 つのページ。
ページ上に作成または配置できる任意のオブジェクト。 ページアイテムには、テキストフ
レーム、長方形、グラフィックの線、グループなど多くの種類があります。
InCopy ドキュメント内のページまたはスプレッド。
Pages or spreads
Stories
Text objects
InCopy ドキュメント内のテキスト。
InCopy ストーリーには、文字、単語、線、段落、テキスト列などのテキストオブジェクト
が含まれます。
InCopy オブジェクトモデルの参照
クトとそのプロパティやメソッドに関する参照情報は、すべてモデルに格納されており、スクリプト編集ア
プリケーションで参照することができます。
ExtendScript Toolkit で InCopy オブジェクトモデルを参照するには:
1.
ExtendScript Toolkit を起動します。
2.
ヘルプ/ Adobe InCopy CS6 オブジェクトモデルを選択します。 InCopy のオブジェクトモデルが読み込ま
れ、独立したウィンドウに表示されます。
3.
表示するオブジェクトを「クラス」リストから選択し、詳細を表示するプロパティまたはメソッドを
「プロパティとメソッド」リストでクリックします。 選択したプロパティまたはメソッドの詳細が表示さ
れます。
第 2 章 はじめに スクリプティング用語と InCopy オブジェクトモデル 21
Tools Guide』を参照してください。
測定値と位置
InCopy では、どのアイテムやオブジェクトも、設定されている測定値に従ってページ上に配置されます。
InCopy の座標系の仕組みと、使用される測定単位について理解しておくと、スクリプトを書く際にその知識
が役に立ちます。
座標
他のページレイアウトプログラムやドロープログラムと同じように、InCopy でも、単純な 2 次元座標を使用
してページやスプレッド上のオブジェクトの位置を設定します。 座標は 2 つの値の組で表しますが、そのう
ちの水平成分を x と呼び、垂直成分を y と呼びます。 選択ツールでオブジェクトを選択すると、変形パネルや
コントロールパネルにこの座標が表示されます。 座標は、InCopy のユーザーインターフェイスと同様に、定
規の現在の原点からの相対位置で測定されます。
は、InCopy の座標では、垂直軸(y 軸)の原点より下が正の数であり、原点より上が負の数である、という
ことです。
測定単位
とができます。 数値を渡したときには、パブリケーションの現在の測定単位が使用されます。測定文字列
(後述の表を参照)を渡したときには、その文字列で指定した測定単位が使用されます。
れる測定値は、変形パネルに表示される測定値と表記の仕方が違うことがあります。 例えば、現在の測定単
位系がパイカである場合、端数のある値はパイカとポイントの形(変形パネルでの表記法)ではなく、小数
の形で返されます。 例えば、「1p6」は「1.5」と返されます。 このようにしている理由は、スクリプティング
システムで測定文字列を使用して算術演算を行おうとすると問題が生じるからです。 例えば、「13p4」に
第 2 章 はじめに 「Hello World」への機能の追加 22
「0p3.5」を足そうとするとスクリプトエラーが発生します。13.333 に .2916(どちらもパイカに換算した値)
を足す場合にはエラーは発生しません。
スクリプトで特定の測定値の加減乗除を行う場合には、スクリプトの始めの部分で測定単位を設定します。
そして、スクリプトの終わりの部分で、スクリプトを実行する前の測定単位に戻します。 または、多くのサ
ンプルスクリプトで行っているように、測定単位をオーバーライドすることができます。 これを行うには、
特別な文字が含まれた文字列を使用します。次に例を示します。
オーバーライド
c cm i(または in) mm p pt
意味
シセロ(必要に応じて c の後にディド値を追加できます)
センチメートル
インチ
ミリメートル
パイカ(必要に応じて p の後にポイント値を追加できます)
ポイント
例
1.4 c
.635 cm
.25 i
6.35 mm
1p6
18 pt
「Hello World」への機能の追加
次に、最初のスクリプトで作成した「Hello World」パブリケーションに変更を加える新しいスクリプトを作
アクティブなドキュメントを取得する。
最初のストーリー内のテキストのフォーマットを変更する。
注釈を追加する。
ImprovedHelloWorld チュートリアルスクリプトを開くか、または次の手順に従ってスクリプトを作成します。
1.
作成したドキュメントが開いていることを確認します。 ドキュメントを保存せずに閉じてしまった場合
は、
HelloWorld.jsx
スクリプトをもう一度実行すればドキュメントが新たに作成されます。
2.
新しいテキストファイルに、次の JavaScript を入力します。
//Get a reference to a font.
try{
//Enter the name of a font on your system, if necessary.
var myFont = app.fonts.item("Arial");
}
on(myError){}
//Get the active document and assign the result to the variable "myDocument"
var myDocument = app.documents.item(0);
with(myDocument.stories.item(0)){
//Change the font, size, and paragraph alignment.
try{
appliedFont = myFont;
}
on(myError){}
justification = Justification.centerAlign;
pointSize = 48;
//Enter the note at the last insertion point of the story.
var myNote = insertionPoints.item(-1).notes.add();
myNote.texts.item(0).contents = "This is a note."
}
第 2 章 はじめに 「Hello World」への機能の追加 23
3.
Scripts Panel フォルダーに、プレーンテキストファイルとしてテキストを保存します(
.jsx
を使用します。
4.
スクリプトパネルでスクリプト名をダブルクリックして、新しいスクリプトを実行します。
3
スクリプティング機能
CS6 編集
章の更新ステータス
および 3 つの副節を、更新、修正および明確化しました。
この章では、InCopy のスクリプティング環境に関連するスクリプティングテクニックを紹介します。 InCopy
のスクリプトモデルを構成するオブジェクトのほとんどは、アプリケーションのデフォルトやドキュメント
を操作するためのオブジェクトですが、 この章ではまず、スクリプトそのものを制御する方法について説明
します。
この章の内容は、次のとおりです。
scriptPreferences
オブジェクトとそのプロパティ
実行中のスクリプトへの参照の取得
以前のバージョンのスクリプトオブジェクトモデルに基づいたスクリプトの実行
doScript
メソッドを使用したスクリプトの実行
InCopy の起動時におけるスクリプトの自動実行
スクリプトを実行する ExtendScript エンジンの制御
ここでは、読者が
を既に読んでおり、該当するスクリプト言語で InCopy のスクリプトを
作成、インストール、実行する方法を理解しているものとして説明を行います。
スクリプトの環境設定
scriptPreferences
オブジェクトには、InCopy でのスクリプトの実行方法に関連するオブジェクトやプロパ
ティが用意されています。 次の表に、scriptPreferences オブジェクトの各プロパティの詳細を示します。
プロパティ
EnableRedraw scriptsFolder scriptsList
説明
スクリプトパネルからスクリプトを実行している最中の画面の再描画をオン
またはオフにします。
Scripts フォルダーへのパス。
使用可能なスクリプトのリスト。 このプロパティは、次に示すような配列の
配列を返します。
[[fileName, filePath], ]
fileName
はスクリプトファイルの名前を表し、
filePath
はスクリプトへの
フルパスを表します。 この機能を使用すれば、目的のスクリプトがインス
トールされているどうかを確認できます。
24
第 3 章 スクリプティング機能 現在のスクリプトの取得 25
プロパティ
userInteractionLevel version
説明
このプロパティは、ユーザーに表示する警告やダイアログボックスを制御し
ます。 このプロパティを
UserInteractionLevels.neverInteract
に設定する
と、警告やダイアログボックスは一切表示されなくなります。
UserInteractionLevels.interactWithAlerts
に設定すると、警告は有効に
なりますが、ダイアログボックスは無効になります。
UserInteractionLevels.interactWithAll
に設定すると、警告とダイアログ
ボックスは通常どおりに表示されます。 警告の表示をオフにする機能は、ス
クリプトでドキュメントを開く場合に便利です。InCopy では、フォントや
リンク先のグラフィックファイルが見つからないと警告が表示されます。 こ
のプロパティを
UserInteractionLevels.neverInteract
に設定してからド
キュメントを開き、スクリプトを終了する直前にプロパティを元に戻せば
(
UserInteractionLevels.interactWithAll
、警告が表示され
るのを避けられます。
を参照してください。 このプロパティは、アプリ
ケーションのバージョンと同じではないことに注意してください。
現在のスクリプトの取得
現在のスクリプトへの参照を取得するには、アプリケーションオブジェクトの activeScript
プロパティを使
用します。 このプロパティは、現在のスクリプトが保存されている場所を基準にしてファイルやフォルダー
を検索する場合に役立ちます。次のスクリプトにその例を示します(チュートリアルスクリプトの var myScript = app.activeScript;
alert("The current script is: " + myScript);
var myParentFolder = File(myScript).parent;
alert("The folder containing the active script is: " + myParentFolder);
スクリプトエディタでスクリプトをデバッグしている場合は、 activeScript
プロパティを取得しようとする
とエラーが発生します。 activeScript
プロパティで返されるのは、スクリプトパレットから実行したスクリ
プトのみです。
ExtendScript Toolkit を使用してスクリプトをデバッグしている場合は、 activeScript
プロパティを取得しよ
うとするとエラーが発生します。 このエラーを回避して、 activeScript
プロパティが使用されているスクリ
プトをデバックするには、次のエラーハンドラーを使用します(チュートリアルスクリプトの GetScriptPath
より)。 function myGetScriptPath() {
try{
return app.activeScript;
}
catch(myError){
return File(myError.fileName);
}
}
スクリプトのバージョン対応
InCopy では、以前のバージョンの InCopy スクリプトオブジェクトモデルに基づいて作成されたスクリプトを
実行できます。 新しいバージョンの InCopy で古いスクリプトを実行する場合は、次の点に注意する必要があ
ります。
第 3 章 スクリプティング機能 スクリプトのバージョン対応 26
ターゲットの設定 - スクリプトを実行する InCopy のバージョン(現在のバージョン)をターゲットに設
言語によって異なります。
コンパイル - この段階では、スクリプトで使用されている名前が InCopy で認識できるスクリプト ID に
異なります。
インタープリターによる実行 - この段階では、スクリプト ID が InCopy の適切なハンドラーに関連付けら
れます。これにより InCopy は、以前のバージョンのスクリプトオブジェクトモデルに基づいて作成され
たスクリプトも正しく解釈できるようになります。 そのためには、スクリプトでアプリケーションのス
クリプト環境設定に古いオブジェクトモデルを明示的に設定するか(
に示すとおり)
フォルダー
Version 8.0 Scripts
Version 7.0 Scripts
Version 6.0 Scripts
Version 5.0 Scripts
Version 2.0 Scripts
スクリプトの InCopy バージョン
CS6
CS5 および CS5.5
CS4
CS3
CS2
ターゲットの設定
スクリプトを実行する InCopy のバージョン(現在のバージョン)が、スクリプトでターゲットとして明示的
または暗黙的に設定されている必要があります。 スクリプトパネルからスクリプトを実行すると暗黙的に
ターゲットが設定されます。
外部(ExtendScript Toolkit)からスクリプトを実行する場合、JavaScript で明示的にターゲットを設定するに
は、 target
ディレクティブを使用します。
//target CS6
#target "InCopy-8.0"
//target the latest version of InCopy
#target "InCopy"
コンパイル
も使用されます。
インタープリターによる実行
インタープリターで使用するスクリプトオブジェクトモデルのバージョンを取得したり設定したりするには、
InCopy アプリケーションオブジェクトの scriptPreferences
オブジェクトを使用します。
アプリケーションの現在のバージョンに設定されており、変更されるまでそのバージョンが使用されます。
例えば、スクリプトオブジェクトモデルのバージョンを CS5 に変更するには、次のようにします。
//Set to 7.0 scripting object model
app.scriptPreferences.version = 7.0;
第 3 章 スクリプティング機能 doScript メソッドの使用 27
doScript メソッドの使用
doScript
このメソッ
ドには、有効なスクリプトコードを表す文字列か、ディスク上のスクリプトファイルを指定できます。 指定
するスクリプトは、現在のスクリプトと同じ言語であっても、異なる言語であってもかまいません。 使用で
きる言語はプラットフォームによって異なります。Mac OS® の場合は AppleScript または JavaScript を実行で
きます。Windows® の場合は VBScript または JavaScript を実行できます。 doScript
メソッドは、次の様々な場合に利用できます。
使用したい機能が、メインのスクリプト言語ではサポートされておらず、別の言語でサポートされてい
る場合。 例えば、VBScript にはファイルブラウザーやフォルダーブラウザーを表示する機能はありません
が、JavaScript にはこの機能が用意されています。 AppleScript では三角関数(サインやコサイン)の計算
に時間がかかる場合がありますが、JavaScript では高速に処理できます。 JavaScript では、Microsoft® Excel
スプレッドシートのセルの内容を照会することはできませんが、AppleScript や VBScript を使用すれば行
うことができます。 どの場合も、別の言語で断片的なスクリプトコードを作成して doScript
メソッドで
実行すれば、メインのスクリプト言語の制約を回避することができます。
スクリプトを動的に生成して実行する場合。 実行時にスクリプトの文字列を動的に生成して、 doScript
メソッドで実行することができます。 この方法は、選択されている内容や作成するオブジェクトの属性
に基づいてダイアログボックスやパネルをカスタマイズしたい場合などに適しています。
オブジェクトにスクリプトを埋め込む場合。 doScript
メソッドを使用すれば、オブジェクトの label
プ
ロパティに文字列として保存されているスクリプトを実行することができます。 このテクニックを利用
すると、特定のパラメーターに基づいてレイアウトプロパティを制御したり内容を更新したりするスク
リプトを、オブジェクト自体に埋め込むことができます。 また、XML 要素にも、属性またはコンテンツ
を
参照してください。
doScript へのパラメーターの渡し方
doScript
で実行するスクリプトにパラメーターを渡すには、次のようにします(チュートリアルスクリプト
の DoScriptParameters より)。 var myParameters = ["Hello from DoScript", "Your message here."];
var myJavaScript = "alert(¥"First argument: ¥" + arguments[0] + ¥"¥¥rSecond argument: ¥" + arguments[1]);";
app.doScript(myJavaScript, ScriptLanguage.javascript, myParameters);
if(File.fs == "Windows"){
var myVBScript = "msgbox arguments(1), vbOKOnly, ¥"First argument: ¥" & arguments(0)";
app.doScript(myVBScript, ScriptLanguage.visualBasic, myParameters);
}
else{
var myAppleScript = "tell application ¥"Adobe InCopy CS6¥"¥rdisplay dialog(¥"First argument:
¥" & item 1 of arguments & return & ¥"Second argument: ¥" & item 2 of arguments)¥rend tell";
app.doScript(myAppleScript, ScriptLanguage.applescriptLanguage, myParameters);
}
doScript からの戻り値
doScript
で実行するスクリプトから値を返すには、アプリケーションの scriptArgs
オブジェクトを使用し
ます(この名前は、「script arguments」を縮めたものです)。 次のスクリプトにその例を示します(完全なス
クリプトについては、DoScriptReturnValue というチュートリアルスクリプトを参照してください)。
第 3 章 スクリプティング機能 起動時におけるスクリプトの自動実行 28 var myJavaScript = "app.scriptArgs.setValue(¥"ScriptArgumentA¥", ¥"This is the first script argument value.¥");¥r";
myJavaScript += "app.scriptArgs.setValue(¥"ScriptArgumentB¥", ¥"This is the second script argument value.¥")";
var myScriptArgumentA = app.scriptArgs.getValue("ScriptArgumentA");
var myScriptArgumentB = app.scriptArgs.getValue("ScriptArgumentB");
alert("ScriptArgumentA: " + myScriptArgumentA + "¥rScriptArgumentB: " + myScriptArgumentB);
if(File.fs == "Windows"){
var myVBScript = "Set myInCopy = CreateObject(¥"InCopy.Application¥")¥r";
myVBScript += "myInCopy.ScriptArgs.SetValue ¥"ScriptArgumentA¥", ¥"This is the first script argument value.¥"¥r";
myVBScript += "myInCopy.ScriptArgs.SetValue ¥"ScriptArgumentB¥", ¥"This is the second script argument value.¥"";
app.doScript(myVBScript, ScriptLanguage.visualBasic);
}
else{
var myAppleScript = "tell application ¥"Adobe InCopy CS6¥"¥r";
myAppleScript += "make script arg with properties{name:¥"ScriptArgumentA¥", value:¥"This is the first script argument value.¥"}¥r";
myAppleScript += "make script arg with properties{name:¥"ScriptArgumentB¥", value:¥"This is the second script argument value.¥"}¥r";
myAppleScript += "end tell¥r";
app.doScript(myAppleScript, ScriptLanguage.applescriptLanguage);
}
var myScriptArgumentA = app.scriptArgs.getValue("ScriptArgumentA");
var myScriptArgumentB = app.scriptArgs.getValue("ScriptArgumentB");
alert("ScriptArgumentA: " + myScriptArgumentA + "¥rScriptArgumentB: " + myScriptArgumentB);
起動時におけるスクリプトの自動実行
InCopy の起動時にスクリプトを自動実行させるには、Scripts フォルダーの下にあるスタートアップ用のフォ
ルダーである Startup Scripts フォルダーにスクリプトファイルを保存します(詳しくは、
注意 : InCopy の起動時に、そのセッションの ExtendScript エンジンでスクリプトを実行した場合、そこで作
成されたオブジェクトや関数は、そのセッションの間、他のスクリプトからも使用することができます。 詳
セッションとメインでのスクリプトの実行
InCopy で JavaScript を実行する方法には、 session
と main
の 2 つがあります。
時に使用する ExtendScript エンジンの名前に対応しています。
デフォルトでは、InCopy の JavaScript を実行すると、メイン(main)の ExtendScript エンジンでスクリプト
が解釈されて実行されます。このエンジンは、スクリプトの実行が終了すると破棄されます。 このスクリプ
トで作成されたスクリプトオブジェクトは保持されません。
セッション(session)のエンジンでスクリプトを実行した場合、そこで作成されたオブジェクトは、InCopy
を終了するまで保持されます。 このオブジェクトは、 session
エンジンで実行される他のスクリプトからも参
照できます。 InCopy JavaScript のターゲットとして session
エンジンを設定するには、スクリプトの先頭に次
の行を追加します。
#targetengine "session"
また、ExtendScript のパーシスタント(永続的)な解釈および実行環境を独自に作成することもできます。 こ
れを行うには、
#targetenging
文を使用して、独自の ExtendScript エンジンの名前を設定します。次のスクリ
プトにその例を示します。
#targetengine "adobe"
4
テキストと組版
章の更新ステータス
CS6
変更なし
テキストの入力、編集、フォーマットといった作業は、InCopy ドキュメントの製作工程の中でも、最も時間
のかかる作業の 1 つです。 したがって、テキストや書式に関する作業を自動化できれば、生産性の大幅な向
上が期待できます。
このチュートリアルでは、テキストや書式に関する一般的な操作をスクリプトで実行する方法について説明
ここでは、読者が
を既に読んでおり、スクリプトを作成、インストール、実行する方法
を理解しているものとして説明を行います。 また、InCopy でテキストを操作する方法や、組版に関する基本
的な用語を理解しているものとしています。
テキストの入力と読み込み
ここでは、InCopy ドキュメントにテキストを配置する方法について説明します。 InCopy のユーザーインター
フェイスを使用してテキストフレームにテキストを入力したり、テキストファイルを配置したりするのと同
じように、スクリプトを使用してテキストフレームを作成し、ストーリーにテキストを挿入し、テキスト
ファイルを配置することができます。
ストーリーとテキストフレーム
InCopy レイアウトの中にあるテキストは、すべてストーリーの中に含まれています。どのストーリーにも 1
つ以上のテキストフレームを含めることができます。 独立した InCopy ドキュメントには 1 つのストーリーが
含まれています。テキストフレームは、ストーリーのテキストを表示する必要がある場合にのみ追加されま
す。
.icml
ファイル)として InDesign から書き出されたストーリーにも当ては
まります。
InDesign ドキュメントから生成された InCopy ドキュメントには、複数のストーリーが含まれていることがあ
ります。また、InDesign レイアウトで作成されたテキストフレームが必ず含まれています。 InCopy では、
InDesign と異なり、スクリプトを使用して新しいテキストフレームを追加することはできません。
InCopy ドキュメントの中にあるテキストオブジェクトの関係について詳しくは、 37 ページの「テキストオブ
を参照してください。
ストーリーへのテキストの追加
ストーリーにテキストを追加するには、 contents
プロパティを使用します。
この方法を使用して、ストーリーの末尾にテキストを追加しています(完全なスクリプトについては、
29
第 4 章 テキストと組版 テキストの入力と読み込み 30 var myDocument = app.documents.add();
//Add text to the default story.
var myStory = myDocument.stories.item(0);
myStory.contents = "This is the first paragraph of example text.";
//To add more text to the story, we'll use the last insertion point
//in the story. ("¥r" is a return character in JavaScript.)
var myInsertionPoint = myStory.insertionPoints.item(-1);
myInsertionPoint.contents = "¥rThis is the second paragraph.";
テキストの置換
次のスクリプトでは、適当なオブジェクトの内容を変更することで、1 つの単語をある語句に置換していま
す(完全なスクリプトについては、ReplaceWord を参照してください)。
//Enters text in the default story and then replaces
//a word in the story with a different phrase.
var myDocument = app.documents.add();
var myStory = myDocument.stories.item(0);
myStory.contents = "This is some example text.";
//Replace the third word "some" with the phrase
//"a little bit of".
myStory.words.item(2).contents = "a little bit of";
次のスクリプトでは、段落内のテキストを置換しています(完全なスクリプトについては、ReplaceText を参
照してください)。
//Enters text in the default story, and then replaces
//the text in the second paragraph.
var myDocument = app.documents.add();
var myStory = myDocument.stories.item(0);
myStory.contents = "Paragraph 1.¥rParagraph 2.¥rParagraph 3.¥r";
//Replace the text in the second paragraph without replacing
//the return character at the end of the paragraph. To do this,
//we'll use the ItemByRange method.
var myStartCharacter = myStory.paragraphs.item(1).characters.item(0);
var myEndCharacter = myStory.paragraphs.item(1).characters.item(-2);
myStory.texts.itemByRange(myStartCharacter, myEndCharacter).contents = "This text replaces the text in paragraph 2.";
このスクリプトでは、 itemByRange
しまうと、段落に適用されている段落スタイルが変更される可能性があるからです。 したがって、 itemByRange
メソッドのパラメーターに 2 つの文字(段落の先頭の文字と、末尾の文字(改行文字)の直前
にある文字)を指定しています。
特殊文字の挿入
ExtendScript Toolkit では Unicode がサポートされているので、InCopy に渡すテキスト文字列に Unicode 文字を
簡単に入力できます。 また、JavaScript では、Unicode 文字の字形の識別番号を指定する ¥unnnn という表記
法(nnnn は、目的の文字の Unicode コード)を使用することもできます。 次のスクリプトでは、特殊文字を
いくつかの方法で入力しています(完全なスクリプトについては、SpecialCharacters を参照してください)。
第 4 章 テキストと組版 テキストの配置とテキスト読み込み環境設定の指定 31 var myDocument = app.documents.add();
var myStory = myDocument.stories.item(0);
//Entering special characters directly.
myStory.contents = "Registered trademark: ®¥rCopyright: ©¥rTrademark: ™¥r";
//Entering special characters by their Unicode glyph ID value:
myStory.insertionPoints.item(-1).contents = "Not equal to: ¥u2260¥rSquare root:
¥u221A¥rParagraph: ¥u00B6¥r";
//Entering InCopy special characters by their enumerations:
myStory.insertionPoints.item(-1).contents = "Automatic page number marker:";
myStory.insertionPoints.item(-1).contents = SpecialCharacters.autoPageNumber;
myStory.insertionPoints.item(-1).contents = "¥r";
myStory.insertionPoints.item(-1).contents = "Section symbol:";
myStory.insertionPoints.item(-1).contents = SpecialCharacters.sectionSymbol;
myStory.insertionPoints.item(-1).contents = "¥r";
myStory.insertionPoints.item(-1).contents = "En dash:";
myStory.insertionPoints.item(-1).contents = SpecialCharacters.enDash;
myStory.insertionPoints.item(-1).contents = "¥r";
特定の文字の Unicode ID を調べたい場合は、InCopy の字形パレットを使用するのが最も簡単です(このパ
レットを表示するには、書式/字形を選択します)。パレット内で文字の上にカーソルを移動すると、その文
字の Unicode 値が表示されます。 Unicode について詳しくは、 http://www.unicode.org
を参照してください。
テキストの配置とテキスト読み込み環境設定の指定
テキスト文字列の入力だけでなく、ワードプロセッサーやテキストエディターで作成したテキストファイル
を配置することもできます。 新規ドキュメントのデフォルトストーリーにテキストファイルを配置する方法
を、次のスクリプトに示します(完全なスクリプトについては、PlaceTextFile を参照してください)。
//Places a text file in the default story of a new document.
var myDocument = app.documents.add();
//Parameters for InsertionPoint.place():
//File as File object,
//[ShowingOptions as Boolean = False]
//You'll have to fill in your own file path.
myDocument.stories.item(0).insertionPoints.item(0).place(File("/c/test.txt"), false);
配置するテキストファイルの種類に応じた読み込みオプションを指定するには、対応する読み込み環境設定
オブジェクトを使用します。 テキスト読み込み環境設定の指定方法を、次のスクリプトに示します(完全な
スクリプトについては、TextImportPreferences を参照してください)。 スクリプトのコメントに、各プロパ
ティに指定可能な値を示します。
//Sets the text import filter preferences.
with(app.textImportPreferences){
//Options for characterSet:
//TextImportCharacterSet.ansi
//TextImportCharacterSet.chineseBig5
//TextImportCharacterSet.gb18030
//TextImportCharacterSet.gb2312
//TextImportCharacterSet.ksc5601
//TextImportCharacterSet.macintoshCE
//TextImportCharacterSet.macintoshCyrillic
//TextImportCharacterSet.macintoshGreek
//TextImportCharacterSet.macintoshTurkish
//TextImportCharacterSet.recommendShiftJIS83pv
//TextImportCharacterSet.shiftJIS90ms
//TextImportCharacterSet.shiftJIS90pv
//TextImportCharacterSet.utf8
//TextImportCharacterSet.utf16
//TextImportCharacterSet.windowsBaltic
//TextImportCharacterSet.windowsCE
//TextImportCharacterSet.windowsCyrillic
//TextImportCharacterSet.windowsEE
//TextImportCharacterSet.windowsGreek
第 4 章 テキストと組版 テキストの配置とテキスト読み込み環境設定の指定 32
//TextImportCharacterSet.windowsTurkish
characterSet = TextImportCharacterSet.utf16;
convertSpacesIntoTabs = true;
spacesIntoTabsCount = 3;
//The dictionary property can take any of the following
//language names (as strings):
//Bulgarian
//Catalan
//Croatian
//Czech
//Danish
//Dutch
//English: Canadian
//English: UK
//English: USA
//English: USA Legal
//English: USA Medical
//Estonian
//Finnish
//French
//French: Canadian
//German: Reformed
//German: Swiss
//German: Traditional
//Greek
//Hungarian
//Italian
//Latvian
//Lithuanian
//Neutral
//Norwegian: Bokmal
//Norwegian: Nynorsk
//Polish
//Portuguese
//Portuguese: Brazilian
//Romanian
//Russian
//Slovak
//Slovenian
//Spanish: Castilian
//Swedish
//Turkish
dictionary = "English: USA";
//platform options:
//ImportPlatform.macintosh
//ImportPlatform.pc
platform = ImportPlatform.macintosh;
stripReturnsBetweenLines = true;
stripReturnsBetweenParagraphs = true;
useTypographersQuotes = true;
}
タグ付きテキスト読み込み環境設定の指定方法を、次のスクリプトに示します(完全なスクリプトについて
は、TaggedTextImportPreferences を参照してください)。
//Sets the tagged text import filter preferences.
with(app.taggedTextImportPreferences){
removeTextFormatting = false;
//styleConflict property can be:
//StyleConflict.publicationDefinition
//StyleConflict.tagFileDefinition
styleConflict = StyleConflict.publicationDefinition;
useTypographersQuotes = true;
}
第 4 章 テキストと組版 テキストの配置とテキスト読み込み環境設定の指定 33
Word および RTF 読み込み環境設定の指定方法を、次のスクリプトに示します(完全なスクリプトについて
は、WordRTFImportPreferences を参照してください)。
//Sets the Word/RTF import filter preferences.
with(app.wordRTFImportPreferences){
//convertPageBreaks property can be:
//ConvertPageBreaks.columnBreak
//ConvertPageBreaks.none
//ConvertPageBreaks.pageBreak
convertPageBreaks = ConvertPageBreaks.none;
//convertTablesTo property can be:
//ConvertTablesOptions.unformattedTabbedText
//ConvertTablesOptions.unformattedTable
convertTablesTo = ConvertTablesOptions.unformattedTable;
importEndnotes = true;
importFootnotes = true;
importIndex = true;
importTOC = true;
importUnusedStyles = false;
preserveGraphics = false;
preserveLocalOverrides = false;
preserveTrackChanges = false;
removeFormatting = false;
//resolveCharacterSytleClash and resolveParagraphStyleClash properties can be:
//ResolveStyleClash.resolveClashAutoRename
//ResolveStyleClash.resolveClashUseExisting
//ResolveStyleClash.resolveClashUseNew
resolveCharacterStyleClash = ResolveStyleClash.resolveClashUseExisting;
resolveParagraphStyleClash = ResolveStyleClash.resolveClashUseExisting;
useTypographersQuotes = true;
}
Excel 読み込み環境設定の指定方法を、次のスクリプトに示します(完全なスクリプトについては、
//Sets the Excel import filter preferences.
with(app.excelImportPreferences){
//alignmentStyle property can be:
//AlignmentStyleOptions.centerAlign
//AlignmentStyleOptions.leftAlign
//AlignmentStyleOptions.rightAlign
//AlignmentStyleOptions.spreadsheet
alignmentStyle = AlignmentStyleOptions.spreadsheet;
decimalPlaces = 4;
preserveGraphics = false;
//Enter the range you want to import as "start cell:end cell".
rangeName = "A1:B16";
sheetIndex = 1;
//You'll have to enter a valid worksheet name.
sheetName = "pathpoints";
showHiddenCells = false;
//tableFormatting property can be:
//TableFormattingOptions.excelFormattedTable
//TableFormattingOptions.excelUnformattedTabbedText
//TableFormattingOptions.excelUnformattedTable
tableFormatting = TableFormattingOptions.excelFormattedTable;
useTypographersQuotes = true;
viewName = "";
}
第 4 章 テキストと組版 テキストの書き出しとテキスト書き出し環境設定の指定 34
テキストの書き出しとテキスト書き出し環境設定の指定
書き出すには、テキストオブジェクトやストーリーオブジェクトを使用する必要があることに注意してくだ
さい。1 つの操作でドキュメント内のすべてのテキストを書き出すことはできません (完全なスクリプトに
ついては、ExportTextFile を参照してください)。
//Creates a story in an example document and then exports the text to a text file.
var myDocument = app.documents.add();
var myStory = myDocument.stories.item(0);
//Fill the story with placeholder text.
var myTextFrame = myStory.textContainers[0];
myTextFrame.contents = TextFrameContents.placeholderText;
//Text exportFile method parameters:
//Format as ExportFormat
//To As File
//[ShowingOptions As Boolean = False]
//
//Format parameter can be:
//ExportFormat.inCopyCSDocument
//ExportFormat.inCopyDocument
//ExportFormat.rtf
//ExportFormat.taggedText
//ExportFormat.textType
//
//Export the story as text. You'll have to fill in a valid file path on your system.
myStory.exportFile(ExportFormat.textType, File("/c/test.txt"));
指定したテキスト範囲を書き出す方法を、次の例に示します (ここでは、 myGetBounds
関数は省略していま
す。この関数については、ExportTextRange というチュートリアルスクリプトを参照してください)。 var myDocument = app.documents.add();
var myStory = myDocument.stories.item(0);
//Fill the story with placeholder text.
var myTextFrame = myStory.textContainers[0];
myTextFrame.contents = TextFrameContents.placeholderText;
var myStartCharacter = myStory.paragraphs.item(0).characters.item(0);
var myEndCharacter = myStory.paragraphs.item(1).characters.item(-1);
var myText = myStory.texts.itemByRange(myStartCharacter, myEndCharacter);
//Text exportFile method parameters:
//Format as ExportFormat
//To As File
//[ShowingOptions As Boolean = False]
//
//Format parameter can be:
//ExportFormat.inCopyCSDocument
//ExportFormat.inCopyDocument
//ExportFormat.rtf
//ExportFormat.taggedText
//ExportFormat.textType
//
//Export the text range. You must fill in a valid file path on your system.
myText.exportFile(ExportFormat.textType, File("/c/test.txt"));
書き出すテキストファイルの種類に応じた書き出しオプションを指定するには、対応する書き出し環境設定
オブジェクトを使用します。 テキスト書き出し環境設定を指定する方法を、次のスクリプトに示します(完
全なスクリプトについては、TextExportPreferences を参照してください)。
第 4 章 テキストと組版 テキストの書き出しとテキスト書き出し環境設定の指定 35
//Sets the text export filter preferences.
with(app.textExportPreferences){
//Options for characterSet:
//TextExportCharacterSet.utf8
//TextExportCharacterSet.utf16
//TextExportCharacterSet.defaultPlatform
characterSet = TextExportCharacterSet.utf16;
//platform options:
//ImportPlatform.macintosh
//ImportPlatform.pc
platform = ImportPlatform.macintosh;
}
タグ付きテキスト書き出し環境設定を指定する方法を、次のスクリプトに示します(完全なスクリプトにつ
いては、TaggedTextExportPreferences を参照してください)。
//Sets the tagged text export filter preferences.
with(app.taggedTextExportPreferences){
//Options for characterSet:
//TagTextExportCharacterSet.ansi
//TagTextExportCharacterSet.ascii
//TagTextExportCharacterSet.gb18030
//TagTextExportCharacterSet.ksc5601
//TagTextExportCharacterSet.shiftJIS
//TagTextExportCharacterSet.utf8
//TagTextExportCharacterSet.utf16
characterSet = TagTextExportCharacterSet.utf16;
//tagForm options:
//TagTextForm.abbreviated
//TagTextForm.verbose
tagForm = TagTextForm.verbose;
}
既存の書き出しフィルターを使用しないでテキストを書き出すこともできます。 JavaScript には、テキスト
ファイルをディスクに書き出す機能が用意されています。この機能を利用すれば、スクリプトでドキュメン
ト内のテキストをスキャンして、任意のテキストマークアップスキームを使用して任意の順序でテキストを
書き出すことができます。 HTML 形式で InCopy テキストを書き出す簡単な例を次に示します(完全なスクリ
プトについては、ExportHTML を参照してください)。 function myExportHTML(){
var myStory, myParagraph, myString, myTag, myStartTag, myEndTag,
myTextStyleRange, myTable;
//Use the myStyleToTagMapping array to set up your paragraph style to tag mapping.
var myStyleToTagMapping = new Array;
//For each style to tag mapping, add a new item to the array.
myStyleToTagMapping.push(["body_text", "p"]);
myStyleToTagMapping.push(["heading1", "h1"]);
myStyleToTagMapping.push(["heading2", "h2"]);
myStyleToTagMapping.push(["heading3", "h3"]);
//End of style to tag mapping.
if(app.documents.length !=0){
if(app.documents.item(0).stories.length != 0){
//Open a new text file.
var myTextFile = File.saveDialog("Save HTML As", undefined);
//If the user clicked the Cancel button, the result is null.
if(myTextFile != null){
//Open the file with write access.
myTextFile.open("w");
//Iterate through the stories.
for(var myCounter = 0; myCounter <
app.documents.item(0).stories.length; myCounter ++){
myStory = app.documents.item(0).stories.item(myCounter);
for(var myParagraphCounter = 0; myParagraphCounter <
myStory.paragraphs.length; myParagraphCounter ++){
myParagraph = myStory.paragraphs.item(myParagraphCounter);
第 4 章 テキストと組版 テキストの書き出しとテキスト書き出し環境設定の指定 36 if(myParagraph.tables.length == 0){
if(myParagraph.textStyleRanges.length == 1){
//If the paragraph is a simple paragraph--no tables,
//no local formatting--simply export the text
//of the pararaph with the appropriate tag.
myTag = myFindTag(myParagraph.appliedParagraphStyle.
name, myStyleToTagMapping);
//If the tag comes back empty,
//map it to the basic paragraph tag.
if(myTag == ""){
myTag = "p";
}
myStartTag = "<" + myTag + ">";
myEndTag = "</" + myTag + ">";
//If the paragraph is not the last paragraph in the
//story, omit the return character.
if(myParagraph.characters.item(-1).contents == "¥r"){
myString = myParagraph.texts.itemByRange
(myParagraph.characters.item(0),
myParagraph.characters.item(-2)).contents;
}
else{
myString = myParagraph.contents;
}
//Write the paragraphs' text to the text file.
myTextFile.writeln(myStartTag + myString + myEndTag);
}
else{
//Handle text style range export by iterating
//through the text style ranges in the paragraph.
for(var myRangeCounter = 0; myRangeCounter <
myParagraph.textStyleRanges.length;
myRangeCounter ++){
myTextStyleRange = myParagraph.textStyleRanges.
item(myRangeCounter);
if(myTextStyleRange.characters.item(-1)=="¥r"){
myString = myTextStyleRange.texts.itemByRange
(myTextStyleRange.characters.item(1),
myTextStyleRange.characters.item(-2)).
contents;
}
else{
myString = myTextStyleRange.contents;
}
switch(myTextStyleRange.fontStyle){
case "Bold":
myString = "<b>" + myString + "</b>"
break;
case "Italic":
myString = "<i>" + myString + "</i>"
break;
}
myTextFile.write(myString);
}
myTextFile.write("¥r");
}
}
第 4 章 テキストと組版 テキストオブジェクト 37 else{
//Handle table export (assumes that there is only
//one table per paragraph,and that the table is in the
//paragraph by itself).
myTable = myParagraph.tables.item(0);
myTextFile.writeln("<table border = 1>");
for(var myRowCounter = 0; myRowCounter <
myTable.rows.length; myRowCounter ++){
myTextFile.writeln("<tr>");
for(var myColumnCounter = 0; myColumnCounter <
myTable.columns.length; myColumnCounter++){
if(myRowCounter == 0){
myString = "<th>" + myTable.rows.item
(myRowCounter).cells.item(myColumnCounter).
texts.item(0).contents + "</th>";
}
else{
myString = "<td>" + myTable.rows.item
(myRowCounter).cells.item(myColumnCounter).
texts.item(0).contents + "</td>";
}
myTextFile.writeln(myString);
}
myTextFile.writeln("</tr>");
}
myTextFile.writeln("</table>");
}
}
}
//Close the text file.
myTextFile.close();
}
}
}
}
function myFindTag (myStyleName, myStyleToTagMapping){
var myTag = "";
var myDone = false;
var myCounter = 0;
do{
if(myStyleToTagMapping[myCounter][0] == myStyleName){
myTag = myStyleToTagMapping[myCounter][1];
break;
}
myCounter ++;
} while((myDone == false)||(myCounter < myStyleToTagMapping.length))
return myTag;
}
テキストオブジェクト
次の図は、InCopy のテキストオブジェクトモデルを図式化したものです。 テキストオブジェクトにはレイア
ウトオブジェクト(テキストフレーム)とテキストストリームオブジェクト(ストーリー、挿入点、文字、
単語など)の 2 つの種類があります。 この図では、各オブジェクトの一般的な呼び名を記載しています。ス
クリプトを作成する際は、使用するスクリプト言語で定義されている対応する用語を使用してください。
第 4 章 テキストと組版 テキストオブジェクト 38 document story spread, page, layer
選択
insertion points characters words lines paragraphs text columns text style ranges texts notes text containers text frame insertion points characters words lines paragraphs text columns text style ranges texts notes
テキストストリームオブジェクトの parent
は、そのオブジェクトが含まれているストーリーです。
オブジェクトが含まれているテキストフレーム(またはテキストフレームのコレクション)への参照を取得
するには、 parentTextFrames
プロパティを使用します。
テキストフレームの parent
は、通常、そのテキストフレームが含まれているページまたはスプレッドです。
グループ内にあるテキストフレームや、別のページアイテム内にペーストされたテキストフレームの parent
は、そのテキストフレームが含まれているページアイテムです。 アンカー付きフレームに変換されたテキス
トフレームの parent
は、そのアンカー付きフレームが含まれている文字です。
のの種類を判別する方法を、次のスクリプトに示します。 他の多くのサンプルスクリプトと異なり、このス
クリプトは実際には何も行いません。このスクリプトでは、選択をフィルタリングする方法のみが示されて
います (完全なスクリプトについては、TextSelection を参照してください)。
//Shows how to determine whether the current selection is a text selection.
//Check to see if any documents are open.
if (app.documents.length != 0){
//If the selection contains more than one item, the selection
//is not text selected with the Type tool.
if (app.selection.length != 0){
//Evaluate the selection based on its type.
switch (app.selection[0].constructor.name){
case "InsertionPoint":
case "Character":
case "Word":
case "TextStyleRange":
case "Line":
case "Paragraph":
case "TextColumn":
case "Text":
第 4 章 テキストと組版 テキストオブジェクト 39 case "Story":
//The object is a text object; display the text object type.
//A practical script would do something with the selection,
//or pass the selection on to a function.
alert("Selection is a " + app.selection[0].constructor.name);
//If the selection is inside a note, the parent of the selection
//will be a note object.
if(app.selection[0].parent.constructor.name == "Note"){
alert("Selection is inside a note.");
}
break;
default:
alert("The selected object is not a text object. Select some text and try again.");
break;
}
}
else{
alert("Please select some text and try again.");
}
}
else{
alert("No documents are open.");
}
テキストの移動とコピー
move
テキ
ストをコピーするには、 duplicate
メソッドを使用します(パラメーターは move
メソッドと同じです)
スクリプトにその例を示します(完全なスクリプトについては、MoveText を参照してください)。
//Create an example document.
var myDocument = app.documents.add();
//Create a series of paragraphs in the default story.
var myStory = myDocument.stories.item(0);
myStory.contents = "WordA¥rWordB¥rWordC¥rWordD¥r";
//Move WordC before WordA.
myStory.paragraphs.item(2).move(LocationOptions.before, myStory.paragraphs.item(0));
//Move WordB after WordD (into the same paragraph).
myStory.paragraphs.item(2).move(LocationOptions.after, myStory.paragraphs.item(-1).words.item(0));
//Note that moving text removes it from its original location.
フォーマットされたテキストをドキュメント間で転送する場合にも、 move
して貼り付けるよりも、 move
メソッドや duplicate
メソッドを使用するほうが優れています。コピーして貼
り付けるためには、ドキュメントを表示して、コピーするテキストを選択しなければなりません。 move
や duplicate
を使用するほうが速くて確実です。 move
や duplicate
を使用して、ドキュメント間でテキストを
移動する方法を、次のスクリプトに示します(完全なスクリプトについては、MoveTextBetweenDocuments
を参照してください)。
//Moves formatted text from one document to another.
var mySourceDocument = app.documents.add();
//Add text to the default story.
var mySourceStory = mySourceDocument.stories.item(0);
mySourceStory.contents = "This is the source text.¥rThis text is not the source text.";
mySourceStory.paragraphs.item(0).pointSize = 24;
//Create a new document to move the text to.
var myTargetDocument = app.documents.add();
var myTargetStory = myTargetDocument.stories.item(0);
myTargetStory.contents = "This is the target text. Insert the source text after this paragraph.¥r";
mySourceStory.paragraphs.item(0).duplicate(LocationOptions.after, myTargetStory.insertionPoints.item(-1));
第 4 章 テキストと組版 テキストオブジェクト 40
フォーマットされていないテキストをテキストオブジェクト間でコピーする方法としては、コピーするテキ
ストオブジェクトの contents
プロパティを取得して、その文字列を別のテキストオブジェクトの contents
プロパティに設定する方法があります。 次のスクリプトにその例を示します(完全なスクリプトについては、
//Shows how to remove formatting from text as you move it
//to other locations in a document.
//Create an example document.
var myDocument = app.documents.add();
var myStory = myDocument.stories.item(0);
myStory.contents = "This is a formatted string.¥rText pasted after this text will retain its formatting.¥r¥rText moved to the following line will take on the formatting of the insertion point.¥rItalic: ";
//Apply formatting to the first paragraph.
myStory.paragraphs.item(0).fontStyle = "Bold";
//Apply formatting to the last paragraph.
myStory.paragraphs.item(-1).fontStyle = "Italic";
//Copy from one frame to another using a simple copy.
app.select(myStory.paragraphs.item(0).words.item(0));
app.copy();
app.select(myStory.paragraphs.item(1).insertionPoints.item(-1));
app.paste();
//Copy the unformatted string from the first word to the end of the story
//by getting and setting the contents of text objects. Note that this does
//not really copy the text; it replicates the text string from one text
//location to another.
myStory.insertionPoints.item(-1).contents = myStory.paragraphs.item(0).words.item(0).contents;
テキストオブジェクトと反復処理
一連のテキストオブジェクトに対して繰り返して処理を行っている間に、テキストの移動、削除、追加を行
うと、テキスト参照に問題が発生することがあります。 このような問題が発生する例を、次のスクリプトに
示します(完全なスクリプトについては、TextIterationWrong を参照してください)。
//Shows how *not* to iterate through text.
var myDocument = app.documents.add();
var myString = "Paragraph 1.¥rDelete this paragraph.¥rParagraph 2.¥rParagraph 3.¥rParagraph
4.¥rParagraph 5.¥rDelete this paragraph.¥rParagraph 6.¥r";
var myStory = myDocument.stories.item(0);
myStory.contents = myString;
//The following for loop will fail to format all of the paragraphs.
for(var myParagraphCounter = 0; myParagraphCounter < myStory.paragraphs.length; myParagraphCounter ++){
if(myStory.paragraphs.item(myParagraphCounter).words.item(0).contents == "Delete"){
myStory.paragraphs.item(myParagraphCounter).remove();
}
else{
myStory.paragraphs.item(myParagraphCounter).pointSize = 24;
}
}
この例では、フォーマットされない段落がいくつか発生することになります。 その理由は次のとおりです。 こ
のスクリプトのループは、ストーリー内の最初の段落から最後の段落まで、段落に対して繰り返し処理を行
が削除されると、第 3 段落がその場所に移動します。 次にループカウンターが 2 になると、先ほどまで第 4 段
落であった段落が処理されます。第 3 段落であった段落はこの時点で第 2 段落になっているので、処理は行
われません。
この問題を回避するには、次のスクリプトのように、テキストオブジェクトを逆順で処理します(チュート
リアルスクリプトの TextIterationRight より)。
第 4 章 テキストと組版 テキストのフォーマット 41
//Shows the correct way to iterate through text.
var myDocument = app.documents.add();
var myString = "Paragraph 1.¥rDelete this paragraph.¥rParagraph 2.¥rParagraph 3.¥rParagraph
4.¥rParagraph 5.¥rDelete this paragraph.¥rParagraph 6.¥r";
var myStory = myDocument.stories.item(0);
myStory.contents = myString;
//The following for loop will format all of the paragraphs by iterating
//backwards through the paragraphs in the story.
for(var myParagraphCounter = myStory.paragraphs.length-1; myParagraphCounter >= 0; myParagraphCounter --){
if(myStory.paragraphs.item(myParagraphCounter).words.item(0).contents == "Delete"){
myStory.paragraphs.item(myParagraphCounter).remove();
}
else{
myStory.paragraphs.item(myParagraphCounter).pointSize = 24;
}
}
テキストのフォーマット
前の節では、ドキュメントにテキストを追加し、ストーリーやテキストオブジェクトを操作しました。 この
節では、テキストにフォーマットを適用します。 InCopy のすべてのフォーマット機能は、スクリプティング
で操作することができます。
テキストデフォルトの設定
テキストデフォルトは、アプリケーションとドキュメントの両方で設定できます。 アプリケーションのテキ
ストデフォルトは、新しく作成されるすべてのドキュメントのテキストデフォルトとして使用されます。 ド
キュメントのテキストデフォルトは、そのドキュメントで新しく作成されるすべてのテキストオブジェクト
のフォーマットとして使用されます (完全なスクリプトについては、TextDefaults を参照してください)。
//Sets the text defaults of the application, which set the default formatting
//for all new documents. Existing text frames are unaffected.
//Set the measurement units to points.
app.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.points;
app.viewPreferences.verticalMeasurementUnits = MeasurementUnits.points;
//To set the text formatting defaults for a document, replace "app"
//in the following lines with a reference to a document.
with(app.textDefaults){
alignToBaseline = true;
//Because the font might not be available, it's usually best
//to apply the font within a try...catch structure. Fill in the
//name of a font on your system.
try{
appliedFont = app.fonts.item("Minion Pro");
}
catch(e){}
//Because the font style might not be available, it's usually best
//to apply the font style within a try...catch structure.
try{
fontStyle = "Regular";
}
catch(e){}
//Because the language might not be available, it's usually best
//to apply the language within a try...catch structure.
try{
appliedLanguage = "English: USA";
}
catch(e){}
autoLeading = 100;
balanceRaggedLines = false;
baselineShift = 0;
第 4 章 テキストと組版 テキストのフォーマット 42 capitalization = Capitalization.normal;
composer = "Adobe Paragraph Composer";
desiredGlyphScaling = 100;
desiredLetterSpacing = 0;
desiredWordSpacing = 100;
dropCapCharacters = 0;
if(dropCapCharacters != 0){
dropCapLines = 3;
//Assumes the application has a default character style named "myDropCap"
dropCapStyle = app.characterStyles.item("myDropCap");
}
fillColor = app.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 = Justification.leftAlign;
keepAllLinesTogether = false;
keepLinesTogether = true;
keepFirstLines = 2;
keepLastLines = 2;
keepWithNext = 0;
kerningMethod = "Optical";
kerningValue = 0;
leading = 14;
leftIndent = 0;
ligatures = true;
maximumGlyphScaling = 100;
maximumLetterSpacing = 0;
maximumWordSpacing = 160;
minimumGlyphScaling = 100;
minimumLetterSpacing = 0;
minimumWordSpacing = 80;
noBreak = false;
otfContextualAlternate = true;
otfDiscretionaryLigature = false;
otfFigureStyle = OTFFigureStyle.proportionalOldstyle;
otfFraction = true;
otfHistorical = false;
otfOrdinal = false;
otfSlashedZero = false;
otfSwash = false;
otfTitling = false;
overprintFill = false;
overprintStroke = false;
pointSize = 11;
position = Position.normal;
rightIndent = 0;
ruleAbove = false;
if(ruleAbove == true){
ruleAboveColor = app.colors.item("Black");
第 4 章 テキストと組版 ruleAboveGapColor = app.swatches.item("None");
ruleAboveGapOverprint = false;
ruleAboveGapTint = 100;
ruleAboveLeftIndent = 0;
ruleAboveLineWeight = .25;
ruleAboveOffset = 14;
ruleAboveOverprint = false;
ruleAboveRightIndent = 0;
ruleAboveTint = 100;
ruleAboveType = app.strokeStyles.item("Solid");
ruleAboveWidth = RuleWidth.columnWidth;
}
ruleBelow = false;
if(ruleBelow == true){
} ruleBelowColor = app.colors.item("Black");
ruleBelowGapColor = app.swatches.item("None");
ruleBelowGapOverprint = false;
ruleBelowGapTint = 100;
ruleBelowLeftIndent = 0;
ruleBelowLineWeight = .25;
ruleBelowOffset = 0;
ruleBelowOverprint = false;
ruleBelowRightIndent = 0;
ruleBelowTint = 100;
ruleBelowType = app.strokeStyles.item("Solid");
ruleBelowWidth = RuleWidth.columnWidth;
}
singleWordJustification = SingleWordJustification.leftAlign;
skew = 0;
spaceAfter = 0;
spaceBefore = 0;
startParagraph = StartParagraph.anywhere;
strikeThru = false;
if(strikeThru == true){
strikeThroughColor = app.colors.item("Black");
strikeThroughGapColor = app.swatches.item("None");
strikeThroughGapOverprint = false;
strikeThroughGapTint = 100;
strikeThroughOffset = 3;
strikeThroughOverprint = false;
strikeThroughTint = 100;
strikeThroughType = app.strokeStyles.item("Solid");
strikeThroughWeight = .25;
}
strokeColor = app.swatches.item("None");
strokeTint = 100;
strokeWeight = 0;
tracking = 0;
underline = false;
if(underline == true){
underlineColor = app.colors.item("Black");
underlineGapColor = app.swatches.item("None");
underlineGapOverprint = false;
underlineGapTint = 100;
underlineOffset = 3;
underlineOverprint = false;
underlineTint = 100;
underlineType = app.strokeStyles.item("Solid");
underlineWeight = .25
}
verticalScale = 100;
テキストのフォーマット 43
第 4 章 テキストと組版 テキストのフォーマット 44
フォント
InCopy アプリケーションオブジェクトのフォントコレクションには、InCopy で利用できるすべてのフォント
が含まれています。 これとは対照的に、ドキュメントのフォントコレクションには、そのドキュメントで使
用されているフォントのみが含まれています。 ドキュメントのフォントコレクションには、環境に無いフォ
ント(ドキュメントで使用されているが InCopy では利用できないフォント)も含まれます。 アプリケーショ
ンフォントとドキュメントフォントの違いを調べる方法を、次のスクリプトに示します(完全なスクリプト
については、FontCollections を参照してください)。
//Shows the difference between the fonts collection of the application
//and the fonts collection of a document.
var myApplicationFonts = app.fonts;
var myDocument = app.documents.add();
var myStory = myDocument.stories.item(0);
var myDocumentFonts = myDocument.fonts;
var myFontNames = myApplicationFonts.everyItem().name;
if(myDocumentFonts.length > 0){
var myDocumentFontNames = myDocumentFonts.everyItem().name;
var myString = "Document Fonts:¥r";
for(var myCounter = 0;myCounter<myDocumentFontNames.length; myCounter++){
myString += myDocumentFontNames[myCounter] + "¥r";
}
}
myString += "¥rApplication Fonts:¥r";
for(var myCounter = 0;myCounter<myFontNames.length; myCounter++){
myString += myFontNames[myCounter] + "¥r";
}
myStory.contents = myString;
注意 : フォント名は通常、
familyName<tab>fontStyle
という形式で示されます。
familyName
はフォントファ
ミリー名、
<tab>
はタブ文字、
fontStyle
はフォントスタイル名です。
"Adobe Caslon Pro<tab>Semibold Italic"
フォントの適用
テキストのある範囲にローカルフォントを適用するには、 appliedFont
プロパティを使用します。次のスク
リプトにその例を示します(チュートリアルスクリプトの ApplyFont より)。
//Given a font name "myFontName" and a text object "myText"
myText.appliedFont = app.fonts.item(myFontName);
また、次のスクリプトのように、フォントファミリー名とフォントスタイルを指定してフォントを適用する
こともできます。 myText.appliedFont = app.fonts.item("Adobe Caslon Pro");
myText.fontStyle = "Semibold Italic";
テキストプロパティの変更
InCopy のテキストオブジェクトには、そのフォーマット属性に対応する多数のプロパティが用意されていま
いる段落とほぼ同じプロパティ)が用意されています。 SetTextProperties というチュートリアルスクリプトに
は、テキストオブジェクトのすべてのプロパティを設定する方法が示されています。 次のスクリプトにその
例を示します。
第 4 章 テキストと組版 テキストのフォーマット 45
//Shows how to set all read/write properties of a text object.
var myDocument = app.documents.add();
var myStory = myDocument.stories.item(0);
myStory.contents = "x";
var myTextObject = myStory.characters.item(0);
myTextObject.alignToBaseline = false;
myTextObject.appliedCharacterStyle = myDocument.characterStyles.item("[None]");
myTextObject.appliedFont = app.fonts.item("Minion ProRegular");
myTextObject.appliedLanguage = app.languagesWithVendors.item("English: USA");
myTextObject.appliedNumberingList = myDocument.numberingLists.item("[Default]");
myTextObject.appliedParagraphStyle = myDocument.paragraphStyles.item("[No Paragraph Style]");
myTextObject.autoLeading = 120;
myTextObject.balanceRaggedLines = BalanceLinesStyle.noBalancing;
myTextObject.baselineShift = 0;
myTextObject.bulletsAlignment = ListAlignment.leftAlign;
myTextObject.bulletsAndNumberingListType = ListType.noList;
myTextObject.bulletsCharacterStyle = myDocument.characterStyles.item("[None]");
myTextObject.bulletsTextAfter = "^t";
myTextObject.capitalization = Capitalization.normal;
myTextObject.composer = "Adobe Paragraph Composer";
myTextObject.desiredGlyphScaling = 100;
myTextObject.desiredLetterSpacing = 0;
myTextObject.desiredWordSpacing = 100;
myTextObject.dropCapCharacters = 0;
myTextObject.dropCapLines = 0;
myTextObject.dropCapStyle = myDocument.characterStyles.item("[None]");
myTextObject.dropcapDetail = 0;
//More text properties in the tutorial script.
テキストカラーの変更
テキスト文字の塗りと線にカラーを適用できます。次のスクリプトにその例を示します(チュートリアルス
クリプトの TextColors より)。
//Given two colors "myColorA" and "myColorB"...
var myStory = myDocument.stories.item(0);
//Enter text in the text frame.
myStory.contents = "Text¥rColor"
var myText = myStory.paragraphs.item(0)
myText.pointSize = 72;
myText.justification = Justification.centerAlign;
//Apply a color to the fill of the text.
myText.fillColor = myColorA;
//Use the itemByRange method to apply the color to the stroke of the text.
myText.strokeColor = myColorB;
var myText = myStory.paragraphs.item(1)
myText.strokeWeight = 3;
myText.pointSize = 144;
myText.justification = Justification.centerAlign;
myText.fillColor = myColorB;
myText.strokeColor = myColorA;
myText.strokeWeight = 3;
スタイルの作成と適用
前述のいくつかの例でローカルフォーマットを適用する方法を示しましたが、ここでは、文字スタイルや段
落スタイルを使用してテキストをフォーマットする方法について説明します。 スタイルを使用すると、
フォーマットされたテキストとスタイルの間にリンクが作成されます。そのため、スタイルの再定義、特定
のスタイルでフォーマットされたテキストの収集、テキストの検索や変更などが簡単に行えます。 段落スタ
イルや文字スタイルは、テキストのフォーマット作業を効率化する上で重要な役割を果たします。段落と文
字スタイルはテキストにフォーマットを設定する場合に生産性の鍵となるものであり、テキストにフォー
マットを適用するどんなスクリプトにとっても中心的な存在になるはずです。
第 4 章 テキストと組版 テキストのフォーマット 46
段落スタイルや文字スタイルを作成して適用する方法を、次のスクリプトに示します(完全なスクリプトに
ついては、CreateStyles を参照してください)。
//Shows how to create and apply a paragraph style and a character style.
var myParagraphStyle, myCharacterStyle, myColor, myName;
//Create an example document.
var myDocument = app.documents.add();
//Create a color for use by one of the paragraph styles we'll create.
try{
myColor = myDocument.colors.item("Red");
//If the color does not exist, trying to get its name generates an error.
myName = myColor.name;
}
catch (myError){
//The color style did not exist, so create it.
myColor = myDocument.colors.add({name:"Red", model:ColorModel.process, colorValue:[0, 100,
100, 0]});
}
var myStory = myDocument.stories.item(0);
//Fill the text frame with placeholder text.
myStory.textContainers[0].contents = "Normal text. Text with a character style applied to it. More normal text.";
//Create a character style named "myCharacterStyle" if
//no style by that name already exists.
try{
myCharacterStyle = myDocument.characterStyles.item("myCharacterStyle");
//If the style does not exist, trying to get its name generates an error.
myName = myCharacterStyle.name;
}
catch (myError){
//The style did not exist, so create it.
myCharacterStyle = myDocument.characterStyles.add({name:"myCharacterStyle"});
}
//At this point, the variable myCharacterStyle contains a reference to a
//character-style object, which you can now use to specify formatting.
myCharacterStyle.fillColor = myColor;
//Create a paragraph style named "myParagraphStyle" if
//no style by that name already exists.
try{
myParagraphStyle = myDocument.paragraphStyles.item("myParagraphStyle");
//If the paragraph style does not exist, trying to get its name generates
//an error.
myName = myParagraphStyle.name;
}
catch (myError){
//The paragraph style did not exist, so create it.
myParagraphStyle = myDocument.paragraphStyles.add({name:"myParagraphStyle"});
}
//At this point, the variable myParagraphStyle contains a reference to a
//paragraph-style object, which you can now use to specify formatting.
myStory.texts.item(0).applyParagraphStyle(myParagraphStyle, true);
var myStartCharacter = myStory.characters.item(13);
var myEndCharacter = myStory.characters.item(54);
myStory.texts.itemByRange(myStartCharacter, myEndCharacter).applyCharacterStyle(myCharacterStyle);
テキストオブジェクトの appliedParagraphStyle
プロパティを使用せずに applyParagraphStyle
メソッドを
使用する利点は、 既存のフォーマットをオーバーライドできる点にあります。スタイルにプロパティを設定
しても、ローカルフォーマットは変更されずに保持されます。
新規ドキュメントの作成時に、スタイルが存在するかどうかを確認しているのは、 アプリケーションのデ
フォルトスタイルとして同じ名前のスタイルが存在している可能性があるからです。 その場合、同じ名前で
新しいスタイルを作成しようとするとエラーが発生します。
第 4 章 テキストと組版 テキストの検索と変更 47
先頭文字スタイル(Nested Style)を使用すると、文字スタイルのフォーマットを特定のパターンに従って段
落に適用することができます。 先頭文字スタイルを含む段落スタイルの作成方法を、次のスクリプトに示し
ます(完全なスクリプトについては、NestedStyles を参照してください)。
//At this point, the variable myParagraphStyle contains a reference to a
//paragraph-style object, which you can now use to specify formatting.var myNestedStyle = myParagraphStyle.nestedStyles.add({appliedCharacterStyle:myCharacterStyle, delimiter:".", inclusive:true, repetition:1});
var myStartCharacter = myStory.characters.item(0);
var myEndCharacter = myStory.characters.item(-1);
//Use the itemByRange method to apply the paragraph to all text in the
//story. (Note the story object does not have the applyStyle method.)
myStory.texts.itemByRange(myStartCharacter, myEndCharacter).applyParagraphStyle(myParagraphStyle, true);
スタイルの削除
ユーザーインターフェイスでスタイルを削除する際には、タグ付けされたスタイルでテキストのフォーマッ
ト方法を選択することができますが、 InCopy スクリプティングでもこれと同じことが行えます。次のスクリ
プトにその例を示します(チュートリアルスクリプトの RemoveStyle より)。
//Remove the paragraph style myParagraphStyleA and replace with myParagraphStyleB.
myParagraphStyleA.remove(myDocument.paragraphStyles.item("myParagraphStyleB"));
段落スタイルと文字スタイルの読み込み
他の InCopy ドキュメントから文字スタイルや段落スタイルを読み込むことができます。 次のスクリプトにそ
の例を示します(完全なスクリプトについては、ImportTextStyles を参照してください)。
//Import the styles from the saved document.
//importStyles parameters:
//Format as ImportFormat enumeration. Options for text styles are:
// ImportFormat.paragraphStylesFormat
// ImportFormat.characterStylesFormat
// ImportFormat.textStylesFormat
//From as File
//GlobalStrategy as GlobalClashResolutionStrategy enumeration. Options are:
// GlobalClashResolutionStrategy.doNotLoadTheStyle
// GlobalClashResolutionStrategy.loadAllWithOverwrite
// GlobalClashResolutionStrategy.loadAllWithRename
myDocument.importStyles(ImportFormat.textStylesFormat, File(myFilePath),
GlobalClashResolutionStrategy.loadAllWithOverwrite);
テキストの検索と変更
検索/変更機能は、テキストを操作するための最も強力なツールの 1 つであり、 スクリプティングに完全に
対応しています。スクリプトを使用すれば、ユーザーインターフェイスでは利用できない様々なオプション
が指定できます。 InCopy では、次の 3 つの方法でテキストを検索できます。
テキストやテキストフォーマットを検索して、別のテキストやテキストフォーマットに変更できます。
この場合は、 findTextPreferences
オブジェクトや changeTextPreferences
オブジェクトを使用して、 findText
メソッドや changeText
メソッドのパラメーターを指定します。
正規表現を使用したテキスト検索(grep)を実行できます。 この場合は、 findGrepPreferences
オブジェ
クトや changeGrepPreferences
オブジェクトを使用して、 findGrep
メソッドや changeGrep
メソッドのパ
ラメーターを指定します。
第 4 章 テキストと組版 テキストの検索と変更 48
指定された字形(とそのフォーマット)を検索して、別の字形やフォーマットに置換できます。 この場
合は、 findGlyphPreferences
オブジェクトや changeGlyphPreferences
オブジェクトを使用して、 findGlyph
メソッドや changeGlyph
メソッドのパラメーターを指定します。
どの検索/変更メソッドにも、 reverseOrder
という 1 つのオプションパラメーターがあります。このパラ
メーターで、検索結果を返す順序を指定できます。 検索/変更操作の結果に基づいて、ストーリーのテキス
で説明したテキス
ト参照の問題に注意する必要があります。 この問題が発生する場合は、返されたテキストオブジェクトのコ
レクションを逆順で処理するようにループを設定するか、または、検索結果を逆順で返すように設定して、
そのコレクションを通常の順序で処理します。
検索/変更の環境設定
テキストを検索する前に、検索/変更の環境設定を消去することで、前回の設定を引き継がないようにする
ことができます。 また、必要に応じていくつかの検索/変更環境設定を指定して、対象となるテキスト、
フォーマット、正規表現、字形などを指定することができます。 検索/変更操作を行う一般的な手順を次に
示します。
1.
検索/変更の環境設定を消去します。 検索/変更操作の種類に応じて、次の 3 つのいずれかを行います。
//find/change text preferences
app.findTextPreferences = NothingEnum.nothing;
app.changeTextPreferences = NothingEnum.nothing;
//find/change grep preferences
app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
//find/change glyph preferences
app.findGlyphPreferences = NothingEnum.nothing;
app.changeGlyphPreferences = NothingEnum.nothing;
2.
検索/変更のパラメーターを設定します。
3.
検索/変更操作を実行します。
4.
検索/変更の環境設定を再び消去します。
テキストの検索と変更
指定したテキスト文字列を検索する方法を、次のスクリプトに示します。 このスクリプトではドキュメント
全体を検索していますが、ストーリー、テキストフレーム、段落、テキスト列などのテキストオブジェクト
を検索することもできます。 findText
メソッドとそのパラメーターは、すべてのテキストオブジェクトで共
通しています (完全なスクリプトについては、FindText を参照してください)。
//Clear the find/change preferences.
app.findTextPreferences = NothingEnum.nothing;
app.changeTextPreferences = NothingEnum.nothing;
//Search the document for the string "Text".
app.findTextPreferences.findWhat = "text";
//Set the find options.
app.findChangeTextOptions.caseSensitive = false;
app.findChangeTextOptions.includeFootnotes = false;
app.findChangeTextOptions.includeHiddenLayers = false;
app.findChangeTextOptions.includeLockedLayersForFind = false;
app.findChangeTextOptions.includeLockedStoriesForFind = false;
app.findChangeTextOptions.includeMasterPages = false;
app.findChangeTextOptions.wholeWord = false;
var myFoundItems = app.documents.item(0).findText();
alert("Found " + myFoundItems.length + " instances of the search string.");
指定したテキスト文字列を検索して別の文字列に置換する方法を、次のスクリプトに示します(完全なスク
リプトについては、ChangeText を参照してください)。
第 4 章 テキストと組版 テキストの検索と変更 49
//Clear the find/change preferences.
app.findTextPreferences = NothingEnum.nothing;
app.changeTextPreferences = NothingEnum.nothing;
//Set the find options.
app.findChangeTextOptions.caseSensitive = false;
app.findChangeTextOptions.includeFootnotes = false;
app.findChangeTextOptions.includeHiddenLayers = false;
app.findChangeTextOptions.includeLockedLayersForFind = false;
app.findChangeTextOptions.includeLockedStoriesForFind = false;
app.findChangeTextOptions.includeMasterPages = false;
app.findChangeTextOptions.wholeWord = false;
//Search the document for the string "copy" and change it to "text".
app.findTextPreferences.findWhat = "copy";
app.changeTextPreferences.changeTo = "text";
app.documents.item(0).changeText();
//Clear the find/change preferences after the search.
app.findTextPreferences = NothingEnum.nothing;
app.changeTextPreferences = NothingEnum.nothing;
フォーマットの検索と変更
テキストフォーマットの検索や変更を行うには、 findTextPreferences
オブジェクトや changeTextPreferences
オブジェクトのその他のプロパティを設定します。次のスクリプトにその例を示し
ます(チュートリアルスクリプトの FindChangeFormatting より)。
//Clear the find/change preferences.
app.findTextPreferences = NothingEnum.nothing;
app.changeTextPreferences = NothingEnum.nothing;
//Set the find options.
app.findChangeTextOptions.caseSensitive = false;
app.findChangeTextOptions.includeFootnotes = false;
app.findChangeTextOptions.includeHiddenLayers = false;
app.findChangeTextOptions.includeLockedLayersForFind = false;
app.findChangeTextOptions.includeLockedStoriesForFind = false;
app.findChangeTextOptions.includeMasterPages = false;
app.findChangeTextOptions.wholeWord = false;
//Search the document for the 24 point text and change it to 10 point text.
app.findTextPreferences.pointSize = 24;
app.changeTextPreferences.pointSize = 10;
app.documents.item(0).changeText();
//Clear the find/change preferences after the search.
app.findTextPreferences = NothingEnum.nothing;
app.changeTextPreferences = NothingEnum.nothing;
テキスト文字列を検索してフォーマットを適用することもできます。次のスクリプトにその例を示します
(チュートリアルスクリプトの FindChangeStringFormatting より)。
第 4 章 テキストと組版
//Clear the find/change preferences.
app.findTextPreferences = NothingEnum.nothing;
app.changeTextPreferences = NothingEnum.nothing;
//Set the find options.
app.findChangeTextOptions.caseSensitive = false;
app.findChangeTextOptions.includeFootnotes = false;
app.findChangeTextOptions.includeHiddenLayers = false;
app.findChangeTextOptions.includeLockedLayersForFind = false;
app.findChangeTextOptions.includeLockedStoriesForFind = false;
app.findChangeTextOptions.includeMasterPages = false;
app.findChangeTextOptions.wholeWord = false;
app.findTextPreferences.findWhat = "WIDGET^9^9^9^9";
//The following line will only work if your default font
//has a font style named "Bold" if not, change the text to
//a font style used by your default font.
app.changeTextPreferences.fontStyle = "Bold";
//Search the document. In this example, we'll use the
//InCopy search metacharacter "^9" to find any digit.
var myFoundItems = app.documents.item(0).changeText();
alert("Changed " + myFoundItems.length + " instances of the search string.");
//Clear the find/change preferences after the search.
app.findTextPreferences = NothingEnum.nothing;
app.changeTextPreferences = NothingEnum.nothing;
テキストの検索と変更 50
grep の使用
InCopy の findGrep
メソッドや changeGrep
メソッドを使用すれば、正規表現を利用した検索/変更操作が行
トのフォーマットを changeGrepPreferences
オブジェクトのプロパティで指定したフォーマットに置換する
ことができます。 これらのメソッドや関係する環境設定オブジェクトの使用方法を、次のスクリプトに示し
ます(完全なスクリプトについては、FindGrep を参照してください)。
//Clear the find/change preferences.
app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
//Set the find options.
app.findChangeGrepOptions.includeFootnotes = false;
app.findChangeGrepOptions.includeHiddenLayers = false;
app.findChangeGrepOptions.includeLockedLayersForFind = false;
app.findChangeGrepOptions.includeLockedStoriesForFind = false;
app.findChangeGrepOptions.includeMasterPages = false;
//Regular expression for finding an email address.
app.findGrepPreferences.findWhat = "(?i)[A-Z]*?@[A-Z]*?[.]...";
//Apply the change to 24-point text only.
app.findGrepPreferences.pointSize = 24;
app.changeGrepPreferences.underline = true;
app.documents.item(0).changeGrep();
//Clear the find/change preferences after the search.
app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
注意 :
findChangeTextOptions
オブジェクトで使用できる wholeWord
と caseSensitive
の 2 つのプロパティ
は、 findChangeGrepOptions
オブジェクトでは使用できません。
ンを表現できるからです。 大文字と小文字を区別しない場合は
(?i)
を使用し、区別する場合は
(?-i)
を使用
します。 単語の先頭に一致するには
¥>
を使用し、単語の末尾に一致するには
¥<
を使用し、単語の境界に一致
するには
¥b
を使用します。 grep 検索/変更の利用例として、マークアップテキスト(タグでフォーマットが指定されているプレーンテ
キスト)を InCopy 形式のテキストに変換する処理があります。 簡単なテキストマークアップスキームとして
は、PageMaker の段落タグがあります(これは、PageMaker のタグ付きテキスト形式のファイルとは異なり
ます)。 このスキームでマークアップされたテキストファイルでは、次の例のように、段落スタイルの名前が
段落の先頭に示されます。
第 4 章 テキストと組版 テキストの検索と変更 51
<heading1>This is a heading.
<body_text>This is body text.
grep 検索とテキスト検索/変更を組み合わせれば、テキストにフォーマットを適用して、マークアップタグ
を削除することができます。次のスクリプトにその例を示します(チュートリアルスクリプトの ReadPMTags
より)。 function myReadPMTags(myStory){
var myName, myString, myStyle, myStyleName;
var myDocument = app.documents.item(0);
//Reset the findGrepPreferences to ensure that previous settings
//do not affect the search.
app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
//Find the tags (since this is a JavaScript string, backslashes must be escaped).
app.findGrepPreferences.findWhat = "(?i)^<¥¥s*¥¥w+¥¥s*>";
var myFoundItems = myStory.findGrep();
if(myFoundItems.length != 0){
var myFoundTags = new Array;
for(var myCounter = 0; myCounter<myFoundItems.length; myCounter++){
myFoundTags.push(myFoundItems[myCounter].contents);
}
myFoundTags = myRemoveDuplicates(myFoundTags);
//At this point, we have a list of tags to search for.
for(myCounter = 0; myCounter < myFoundTags.length; myCounter++){
myString = myFoundTags[myCounter];
//Find the tag using findWhat.
app.findTextPreferences.findWhat = myString;
//Extract the style name from the tag.
myStyleName = myString.substring(1, myString.length-1);
//Create the style if it does not already exist.
try{
myStyle = myDocument.paragraphStyles.item(myStyleName);
myName = myStyle.name;
}
catch (myError){
myStyle = myDocument.paragraphStyles.add({name:myStyleName});
}
//Apply the style to each instance of the tag.
app.changeTextPreferences.appliedParagraphStyle = myStyle;
myStory.changeText();
//Reset the changeTextPreferences.
app.changeTextPreferences = NothingEnum.nothing;
//Set the changeTo to an empty string.
app.changeTextPreferences.changeTo = "";
//Search to remove the tags.
myStory.changeText();
//Reset the find/change preferences again.
app.changeTextPreferences = NothingEnum.nothing;
}
}
//Reset the findGrepPreferences.
app.findGrepPreferences = NothingEnum.nothing;
}
第 4 章 テキストと組版 表 52 function myRemoveDuplicates(myArray){
//Semi-clever method of removing duplicate array items; much faster
//than comparing every item to every other item!
var myNewArray = new Array;
myArray = myArray.sort();
myNewArray.push(myArray[0]);
if(myArray.length > 1){
for(var myCounter = 1; myCounter < myArray.length; myCounter ++){
if(myArray[myCounter] != myNewArray[myNewArray.length -1]){
myNewArray.push(myArray[myCounter]);
}
}
}
return myNewArray;
}
字形検索の使用
特定のフォントに含まれている個々の文字を検索/変更するには、 findGlyph
メソッドや changeGlyph
メ
ソッドを使用します。パラメーターは findGlyphPreferences
オブジェクトや changeGlyphPreferences
オブ
ジェクトで設定します。 次のスクリプトでは、サンプルドキュメントの中で字形を検索し、変更しています
(完全なスクリプトについては、FindChangeGlyphs を参照してください)。
//Clear glyph search preferences.
app.findGlyphPreferences = NothingEnum.nothing;
app.changeGlyphPreferences = NothingEnum.nothing;
var myDocument = app.documents.item(0);
//You must provide a font that is used in the document for the
//appliedFont property of the findGlyphPreferences object.
app.findGlyphPreferences.appliedFont = app.fonts.item("Minion ProRegular");
//Provide the glyph ID, not the glyph Unicode value.
app.findGlyphPreferences.glyphID = 500;
//The appliedFont of the changeGlyphPreferences object can be
//any font available to the application.
app.changeGlyphPreferences.appliedFont = app.fonts.item("Times New RomanRegular");
app.changeGlyphPreferences.glyphID = 374;
myDocument.changeGlyph();
//Clear glyph search preferences.
app.findGlyphPreferences = NothingEnum.nothing;
app.changeGlyphPreferences = NothingEnum.nothing;
表
convertTextToTable
メソッドを使用して、既存のテキストから表を作成したり、ストーリー内の任意の挿入
点に空の表を作成することができます。 次のスクリプトでは、3 つの異なる方法で表を作成しています(完全
なスクリプトについては、MakeTable を参照してください)。
第 4 章 テキストと組版 表 53 var myStory = myDocument.stories.item(0);
var myStartCharacter = myStory.paragraphs.item(6).characters.item(0);
var myEndCharacter = myStory.paragraphs.item(6).characters.item(-2);
var myText = myStory.texts.itemByRange(myStartCharacter, myEndCharacter);
//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
//to the method as parameters.
var myTable = myText.convertToTable(",",";");
var myStartCharacter = myStory.paragraphs.item(1).characters.item(0);
var myEndCharacter = myStory.paragraphs.item(4).characters.item(-2);
var myText = myStory.texts.itemByRange(myStartCharacter, myEndCharacter);
//In the second through the fifth paragraphs, colums are separated by
//tabs and rows are separated by returns. These are the default delimiter
//parameters, so we don't need to provide them to the method.
var myTable = myText.convertToTable();
//You can also explicitly add a table--you don't have to convert text to a table.
var myTable = myStory.insertionPoints.item(-1).tables.add();
myTable.columnCount = 3;
myTable.bodyRowCount = 3;
表セルの結合方法を、次のスクリプトに示します(完全なスクリプトについては、MergeTableCells を参照し
てください)。 var myDocument = app.documents.add();
var myStory = myDocument.stories.item(0);
var myString = "Table¥r";
myStory.contents = myString;
var myTable = myStory.insertionPoints.item(-1).tables.add();
myTable.columnCount = 4;
myTable.bodyRowCount = 4;
//Merge all cells in the first column.
myTable.cells.item(0).merge(myTable.columns.item(0).cells.item(-1));
//Convert column 2 into 2 cells (rather than 4).
myTable.columns.item(1).cells.item(-1).merge(myTable.columns.item(1).cells.item(-2));
myTable.columns.item(1).cells.item(0).merge(myTable.columns.item(1).cells.item(1));
//Merge the last two cells in row 1.
myTable.rows.item(0).cells.item(-2).merge(myTable.rows.item(0).cells.item(-1));
//Merge the last two cells in row 3.
myTable.rows.item(2).cells.item(-2).merge(myTable.rows.item(2).cells.item(-1));
表セルの分割方法を、次のスクリプトに示します(完全なスクリプトについては、SplitTableCells を参照して myTable.cells.item(0).split(HorizontalOrVertical.horizontal);
myTable.columns.item(0).split(HorizontalOrVertical.vertical);
myTable.cells.item(0).split(HorizontalOrVertical.vertical);
myTable.rows.item(-1).split(HorizontalOrVertical.horizontal);
myTable.cells.item(-1).split(HorizontalOrVertical.vertical);
for(myRowCounter = 0; myRowCounter < myTable.rows.length; myRowCounter ++){
myRow = myTable.rows.item(myRowCounter);
for(myCellCounter = 0; myCellCounter < myRow.cells.length; myCellCounter ++){
myString = "Row: " + myRowCounter + " Cell: " + myCellCounter;
myRow.cells.item(myCellCounter).contents = myString;
}
}
表にヘッダー行とフッター行を作成する方法を、次のスクリプトに示します(完全なスクリプトについては、
第 4 章 テキストと組版 var myTable = app.documents.item(0).stories.item(0).tables.item(0);
//Convert the first row to a header row.
myTable.rows.item(0).rowType = RowTypes.headerRow;
//Convert the last row to a footer row.
myTable.rows.item(-1).rowType = RowTypes.footerRow;
表にフォーマットを適用する方法を、次のスクリプトに示します(完全なスクリプトについては、
表 54 var myTable = myDocument.stories.item(0).tables.item(0);
//Convert the first row to a header row.
myTable.rows.item(0).rowType = RowTypes.headerRow;
//Use a reference to a swatch, rather than to a color.
myTable.rows.item(0).fillColor = myDocument.swatches.item("DGC1_446b");
myTable.rows.item(0).fillTint = 40;
myTable.rows.item(1).fillColor = myDocument.swatches.item("DGC1_446a");
myTable.rows.item(1).fillTint = 40;
myTable.rows.item(2).fillColor = myDocument.swatches.item("DGC1_446a");
myTable.rows.item(2).fillTint = 20;
myTable.rows.item(3).fillColor = myDocument.swatches.item("DGC1_446a");
myTable.rows.item(3).fillTint = 40;
//Use everyItem to set the formatting of multiple cells at once.
myTable.cells.everyItem().topEdgeStrokeColor = myDocument.swatches.item("DGC1_446b");
myTable.cells.everyItem().topEdgeStrokeWeight = 1;
myTable.cells.everyItem().bottomEdgeStrokeColor = myDocument.swatches.item("DGC1_446b");
myTable.cells.everyItem().bottomEdgeStrokeWeight = 1;
//When you set a cell stroke to a swatch, make certain you also set the
//stroke weight.
myTable.cells.everyItem().leftEdgeStrokeColor = myDocument.swatches.item("None");
myTable.cells.everyItem().leftEdgeStrokeWeight = 0;
myTable.cells.everyItem().rightEdgeStrokeColor = myDocument.swatches.item("None");
myTable.cells.everyItem().rightEdgeStrokeWeight = 0;
表に反復行フォーマットを追加する方法を、次のスクリプトに示します(完全なスクリプトについては、
//Given a table "myTable" containing at least four rows and a document
//"myDocument" containing the colors "DGC1_446a" and "DGC1_446b"...
//Convert the first row to a header row.
myTable.rows.item(0).rowType = RowTypes.headerRow;
//Applly alternating fills to the table.
myTable.alternatingFills = AlternatingFillsTypes.alternatingRows;
myTable.startRowFillColor = myDocument.swatches.item("DGC1_446a");
myTable.startRowFillTint = 60;
myTable.endRowFillColor = myDocument.swatches.item("DGC1_446b");
myTable.endRowFillTint = 50;
テキストや表セルが選択されている場合の選択の処理方法を、次のスクリプトに示します。 このスクリプト
では、選択状況に応じて警告を表示していますが、実際のスクリプトでは選択されているアイテムに応じて
何らかの操作を行うことになります (完全なスクリプトについては、TableSelection を参照してください)。 if(app.documents.length != 0){
if(app.selection.length != 0){
switch(app.selection[0].constructor.name){
//When a row, a column, or a range of cells is selected,
//the type returned is "Cell"
case "Cell":
alert("A cell is selected.");
break;
case "Table":
alert("A table is selected.");
break;
case "InsertionPoint":
case "Character":
case "Word":
case "TextStyleRange":
第 4 章 テキストと組版 自動修正 55
}
}
}
case "Line":
case "Paragraph":
case "TextColumn":
case "Text":
if(app.selection[0].parent.constructor.name == "Cell"){
alert("The selection is inside a table cell.");
}
else{
alert("The selection is not inside a table.");
}
break;
default:
alert("The selection is not inside a table.");
break;
自動修正
自動修正機能を使用すると、テキストが入力されたときにテキストを自動的に修正することができます。 次
のスクリプトにその例を示します(完全なスクリプトについては、Autocorrect を参照してください)。
//The autocorrect preferences object turns the
//autocorrect feature on or off.
app.autoCorrectPreferences.autoCorrect = true;
app.autoCorrectPreferences.autoCorrectCapitalizationErrors = true;
//Add a word pair to the autocorrect list. Each AutoCorrectTable is linked
//to a specific language.
var myAutoCorrectTable = app.autoCorrectTables.item("English: USA");
//To safely add a word pair to the auto correct table, get the current
//word pair list, then add the new word pair to that array, and then
//set the autocorrect word pair list to the array.
var myWordPairList = myAutoCorrectTable.autoCorrectWordPairList;
//Add a new word pair to the array.
myWordPairList.push(["paragarph", "paragraph"]);
//Update the word pair list.
myAutoCorrectTable.autoCorrectWordPairList = myWordPairList;
//To clear all autocorrect word pairs in the current dictionary:
//myAutoCorrectTable.autoCorrectWordPairList = [[]];
脚注
ストーリーに脚注を追加する方法を、次のスクリプトに示します(完全なスクリプトについては、Footnotes
を参照してください)。
第 4 章 テキストと組版 var myWord, myFootnote;
var myDocument = app.documents.item(0);
var myStory = myDocument.stories.item(0);
//Add four footnotes at random locations in the story.
for(myCounter = 0; myCounter < 4; myCounter ++){
myWord = myStory.words.item(myGetRandom(0, myStory.words.length));
var myFootnote = myWord.insertionPoints.item(-1).footnotes.add();
//Note: when you create a footnote, it contains text--the footnote
//marker and the separator text (if any). If you try to set the text of
//the footnote by setting the footnote contents, you will delete the
//marker. Instead, append the footnote text, as shown below.
myFootnote.insertionPoints.item(-1).contents = "This is a footnote.";
//This function gets a random number in the range myStart to myEnd.
function myGetRandom(myStart, myEnd){
var myRange = myEnd - myStart;
return myStart + Math.floor(Math.random()*myRange);
}
脚注 56
5
ユーザーインターフェイス
章の更新ステータス
CS6
変更なし
ダイアログボックスか、テキストを入力するためのダイアログボックスに限られていますが、より複雑なダ
イアログボックスを使用したいこともあります。 InCopy スクリプティングを使用すれば、ポップアップリス
ト、テキスト入力フィールド、数値入力フィールドなどの一般的なユーザーインターフェイスコントロール
を備えたダイアログボックスを作成できます。 ユーザー(または自分)から情報を受け取って、それに基づ
いて処理を実行したい場合は、 dialog
オブジェクトが役に立ちます。
この章では、InCopy のダイアログボックスを使用したスクリプトについて説明します。 最初は簡単なサンプ
ルスクリプトから始めて、徐々に複雑なスクリプトへと進んでいきます。
注意 : JavaScript で InCopy スクリプトを作成する場合は、Adobe ScriptUI コンポーネントを使用してユーザー
インターフェイスを作成することもできます。 この章には、ScriptUI スクリプティングのチュートリアルも含
まれています。詳しくは、『Adobe Creative Suite® 5 JavaScript Tools Guide』を参照してください。
ここでは、読者が
を既に読んでおり、スクリプトを作成、インストール、実行する方法
を理解しているものとして説明を行います。
ダイアログボックスの概要
InCopy のダイアログボックスは、InCopy の他のスクリプティングオブジェクトと同じく、1 つのオブジェク
ることができます。 dialog dialog column static text border panel checkbox control radiobutton group radiobutton control measurement editbox dropdown
57
第 5 章 ユーザーインターフェイス
この図に示されている各アイテムについて、次の表で説明します。
最初の InCopy ダイアログボックスの作成 58
ダイアログボックスの要素
テキスト編集フィールド
数値入力フィールド
ポップアップメニュー
テキスト編集フィールドとポップアップメニューを
組み合わせたコントロール
チェックボックス
ラジオボタン
InCopy での名前
Text editbox control
Real editbox, integer editbox, measurement editbox, percent editbox, angle editbox
Drop-down control
Combo-box control
Check-box control
Radio-button control
これらのコントロールは、 dialog
オブジェクトに直接格納されるのではなく、 dialogColumn
というオブジェ
クトに格納されます。 dialogColumn
を使用することで、ダイアログボックス内のコントロールの位置を制御
することができます。 dialogColumn
の中に、別の dialogColumn
や borderPanel
を含めて、ダイアログボック
スをさらに細かく分割することができます(必要に応じて、 dialogColumn
や borderPanel
の中に別の dialogColumn
や borderPanel
。
InCopy の他のスクリプティングオブジェクトと同じように、ダイアログボックスの各パーツにも固有のプロ
パティがあります。 例えば、 checkboxControl
には、表示されるテキストを表すプロパティ( staticLabel
)
や、コントロールの状態を表すプロパティ( checkedState
)があります。 また、 dropdown
コントロールには、
メニューに表示されるオプションのリストを表すプロパティ( stringList
)があります。
スクリプトの中でダイアログボックスを使用するには、まず dialog
オブジェクトを作成し、そこに様々なコ
ントロールを配置して、ダイアログボックスを表示します。そして、スクリプトの処理に必要な値をそれら
のコントロールから収集します。 ダイアログボックスは、破棄されるまで InCopy のメモリ内に維持されま
を複数のスクリプトで使用することが可能です。ただし、ダイアログボックスを保持するためにメモリが消
費されるので、必要がなくなったら破棄するようにしてください。 一般的には、スクリプトが処理を終了す
る前にダイアログボックスオブジェクトを破棄します。
最初の InCopy ダイアログボックスの作成
クスにダイアログコラムを追加し、ダイアログコラムにコントロールを追加します。 次のスクリプトにその
例を示します(完全なスクリプトについては、SimpleDialog を参照してください)。 var myDialog = app.dialogs.add({name:"Simple Dialog"});
//Add a dialog column.
with(myDialog.dialogColumns.add()){
staticTexts.add({staticLabel:"This is a very simple dialog box."});
}
//Show the dialog box.
var myResult = myDialog.show();
//Display a message.
if(myResult == true){
alert("You clicked the OK button.");
}
else{
alert("You clicked the Cancel button.");
}
//Remove the dialog box from memory.
myDialog.destroy();
第 5 章 ユーザーインターフェイス 「Hello World」へのユーザーインターフェイスの追加 59
「Hello World」へのユーザーインターフェイスの追加
次の例は、 第 2 章「はじめに」 で作成した Hello World チュートリアルスクリプトに、簡単なユーザーイン
ターフェイスを追加したものです。 ダイアログボックスに表示されるオプションを使用して、表示するテキ
ストを指定したり、テキストのポイントサイズを変更したりすることができます。 完全なスクリプトについ
ては、HelloWorldUI を参照してください。 var myDialog = app.dialogs.add({name:"Simple User Interface Example Script",canCancel:true});
with(myDialog){
//Add a dialog column.
with(dialogColumns.add()){
//Create a text edit field.
var myTextEditField = textEditboxes.add({editContents:"Hello World!",
minWidth:180});
//Create a number (real) entry field.
var myPointSizeField = realEditboxes.add({editValue:72});
}
}
//Display the dialog box.
var myResult = myDialog.show();
if(myResult == true){
//Get the values from the dialog box controls.
var myString = myTextEditField.editContents;
var myPointSize = myPointSizeField.editValue;
//Remove the dialog box from memory.
myDialog.destroy();
//Create a new document.
var myDocument = app.documents.add()
with(myDocument){
var myStory = myDocument.stories.item(0);
//Enter the text from the dialog box.
myStory.contents=myString;
//Set the size of the text to the size you entered in the dialog box.
myStory.texts.item(0).pointSize = myPointSize;
}
}
else{
//User clicked Cancel, so remove the dialog box from memory.
myDialog.destroy();
}
さらに複雑なユーザーインターフェイスの作成
次の例では、様々なコントロールをサンプルダイアログボックスに追加します。 この例では、次のようなダ
イアログボックスが作成されます。
完全なスクリプトについては、ComplexUI を参照してください。
第 5 章 ユーザーインターフェイス さらに複雑なユーザーインターフェイスの作成 60 var myDialog = app.dialogs.add({name:"ComplexUI", canCancel:true});
with(myDialog){
var mySwatchNames = app.swatches.everyItem().name;
//Add a dialog column.
with(dialogColumns.add()){
//Create a border panel.
with(borderPanels.add()){
with(dialogColumns.add()){
with(dialogRows.add()){
//The following line shows how to set a property
//as you create an object.
staticTexts.add({staticLabel:"Message:"});
//The following line shows how to set multiple
//properties as you create an object.
var myTextEditField = textEditboxes.add(
{editContents:"Hello World!", minWidth:180});
}
}
}
//Create another border panel.
with(borderPanels.add()){
with(dialogColumns.add()){
with(dialogRows.add()){
staticTexts.add({staticLabel:"Point Size:"});
//Create a number entry field. Note that this field uses
//editValue rather than editText (as a textEditBox would).
var myPointSizeField = measurementEditboxes.add({editValue:72,
editUnits:MeasurementUnits.points});
}
}
}
//Create another border panel.
with(borderPanels.add()){
with(dialogColumns.add()){
with(dialogRows.add()){
staticTexts.add({staticLabel:"Paragraph Alignment:"});
var myRadioButtonGroup = radiobuttonGroups.add();
with(myRadioButtonGroup){
radiobuttonControls.add({staticLabel:"Left",
checkedState:true});
radiobuttonControls.add({staticLabel:"Center"});
radiobuttonControls.add({staticLabel:"Right"});
}
}
}
}
//Create another border panel.
with(borderPanels.add()){
with(dialogColumns.add()){
with(dialogRows.add()){
staticTexts.add({staticLabel:"Text Color:"});
}
var mySwatchDropdown = dropdowns.add({stringList:mySwatchNames,
selectedIndex:4});
}
}
}
}
//Display the dialog box.
if(myDialog.show() == true){
var myParagraphAlignment, myString, myPointSize, myVerticalJustification;
//If the user didn't click the Cancel button,
//then get the values back from the dialog box.
//Get the example text from the text edit field.
var myString = myTextEditField.editContents
//Get the point size from the point size field.
第 5 章 ユーザーインターフェイス var myPointSize = myPointSizeField.editValue;
//Get the paragraph alignment setting from the radiobutton group.
if(myRadioButtonGroup.selectedButton == 0){
myParagraphAlignment = Justification.leftAlign;
}
else if(myRadioButtonGroup.selectedButton == 1){
myParagraphAlignment = Justification.centerAlign;
}
else{
myParagraphAlignment = Justification.rightAlign;
}
var mySwatchName = mySwatchNames[mySwatchDropdown.selectedIndex];
//Remove the dialog box from memory.
myDialog.destroy();
//Now create the document and apply the properties to the text.
var myDocument = app.documents.add();
with(myDocument.stories.item(0)){
//Set the contents of the story to the string you entered
//in the dialog box.
contents = myString;
//Set the alignment of the paragraph.
texts.item(0).justification = myParagraphAlignment;
//Set the point size of the text.
texts.item(0).pointSize = myPointSize;
//Set the fill color of the text.
texts.item(0).fillColor = myDocument.swatches.item(mySwatchName);
}
}
else{
myDialog.destroy()
}
ScriptUI の使用 61
ScriptUI の使用
JavaScript では、ScriptUI というアドビ システムズ社独自のスクリプティングコンポーネントを使用して、
ユーザーインターフェイス要素の作成や定義が行えます。 ScriptUI を使用すれば、InCopy の組み込みの dialog
オブジェクトよりも格段に複雑なインタラクティブダイアログボックスを作成できます。また、フ
ローティングパレットやプログレスバーも作成できます。
AppleScript や VBScript でも、ScriptUI を使用して定義されたユーザーインターフェイス要素にアクセスするこ
とができます。 do script メソッド(AppleScript の場合)や DoScript メソッド(VBScript の場合)を使用すれ
ば、他のスクリプト言語で書かれたスクリプトを実行できます。
ScriptUI を使用したプログレスバーの作成
JavaScript で ScriptUI を使用してプログレスバーを作成する方法を、次のスクリプトに示します(完全なスク
リプトについては、ProgressBar を参照してください)。このスクリプトで作成したプログレスバーは、
AppleScript や VBScript でも使用することが可能です。
第 5 章 ユーザーインターフェイス
ScriptUI の使用 62
#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);
}
}
前のスクリプトで作成したプログレスバーを別の JavaScript で呼び出す方法を、次のスクリプトに示します
(完全なスクリプトについては、CallProgressBar を参照してください)。
#targetengine "session"
myCreateProgressPanel(20, 400);
myProgressPanel.show();
var myStory = app.documents.item(0).stories.item(0);
for(var myCounter = 0; myCounter < 20; myCounter ++){
//Scale the value change to the maximum value of the progress bar.
myProgressPanel.myProgressBar.value = myCounter/myIncrement;
var myInsertionPoint = myStory.insertionPoints.item(-1);
myInsertionPoint.contents = "This is a paragraph¥r.";
}
myProgressPanel.myProgressBar.value = 0;
myProgressPanel.hide();
ScriptUI を使用したボタンバーパネルの作成
スクリプトを実行するボタンが並んだフローティングパレットも、JavaScript と ScriptUI を使用して作成する
ことができます。 実行するスクリプトはどの言語であってもかまいません。
簡単なフローティングパネルの作成方法を、次のチュートリアルスクリプトに示します。 パネルには一連の
ボタンが配置され、各ボタンはディスク上のスクリプトに関連付けられています。 ボタンをクリックすると
スクリプトが実行されます(このスクリプトで、ダイアログボックスや他のユーザーインターフェイス要素
(完全なスクリプトについては、ButtonBar を参照してください)。
このチュートリアルスクリプトは、次の形式の XML ファイルを読み込みます。
<buttons>
<button>
<buttonType></buttonType>
<buttonName></buttonName>
<buttonFileName></buttonFileName>
<buttonIconFile></buttonIconFile>
</button>
...
</buttons>
次に例を示します。
第 5 章 ユーザーインターフェイス
ScriptUI の使用 63
<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>
XML ファイルを読み込んでボタンバーをセットアップする関数は、次のとおりです。
#targetengine "session"
var myButtonBar;
main();
function main(){
myButtonBar = myCreateButtonBar();
myButtonBar.show();
}
function myCreateButtonBar(){
var myButtonName, myButtonFileName, myButtonType, myButtonIconFile, myButton;
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);
}
}
}
}
}
第 5 章 ユーザーインターフェイス 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;
}
ScriptUI の使用 64
6
メニュー
章の更新ステータス
CS6
変更なし
InCopy スクリプティングでは、メニュー項目の追加と削除、任意のメニューコマンドの実行、メニュー項目
へのスクリプトの割り当てを行うことができます。
この章では、InCopy のメニューをスクリプトで操作する方法について説明します。 最初は簡単なサンプルス
クリプトから始めて、徐々に複雑なスクリプトへと進んでいきます。
ここでは、読者が
を既に読んでおり、スクリプトを作成、インストール、実行する方法
を理解しているものとして説明を行います。
メニューモデルについて
InCopy のメニュースクリプトモデルは、アプリケーションのユーザーインターフェイスに表示されるメ
ニューに対応する一連のオブジェクトによって構成されています(メインのメニューバーに表示されるメ
ニューだけでなく、パネルに用意されているメニューも含みます)。
オブジェクトには、次のオブジェク
トが含まれています。
menuItems
— メニューに表示されるメニューオプション (サブメニューは含まれません)
menuSeparators
— メニュー内のメニューオプションを区切るために使用される線
submenus
— 更なるメニュー選択が含まれているメニューオプション
menuElements
— メニューに表示されるすべての menuItems
、 menuSeparators
、 submenus
eventListeners
— メニューに対するユーザーアクションやスクリプトアクションに応答するためのリス
ナー
events
— メニューによって発生した events
どの menuItem
にも、 associatedMenuAction
というプロパティによって menuAction
が割り当てられていま
す。 そのメニュー項目が選択されたときの処理は、 menuAction
のプロパティによって定義されています。
ユーザーインターフェイスで定義されている menuAction
に加えて、独自の scriptMenuAction
を作成して、
メニュー項目にスクリプトを割り当てることができます。
1 つの menuAction
や scriptMenuAction
は、0 個以上の menuItem
に関連付けることができます。
次の図に、様々なメニューオブジェクトの関係を示します。
65
第 6 章 メニュー メニューモデルについて 66 application menuActions menuAction area checked enabled eventListeners id index label name events parent title scriptMenuActions scriptMenuAction same as menuAction eventListener eventListener
...
event event
...
表示可能なすべてのメニューアクションのリスト(テキストファイル)を作成するには、次のスクリプトを
実行します(チュートリアルスクリプトの GetMenuActions より)。 var myMenuActionNames = app.menuActions.everyItem().name;
//Open a new text file.
var myTextFile = File.saveDialog("Save Menu Action Names As", undefined);
//If the user clicked the Cancel button, the result is null.
if(myTextFile != null){
//Open the file with write access.
myTextFile.open("w");
for(var myCounter = 0; myCounter < myMenuActionNames.length; myCounter++){
myTextFile.writeln(myMenuActionNames[myCounter]);
}
myTextFile.close();
}
利用可能なメニューのリスト(テキストファイル)を作成するには、次のスクリプトを実行します(完全な
スクリプトについては、GetMenuNames というチュートリアルスクリプトを参照してください)。 InCopy には
多数のメニューがあるので、このスクリプトの実行には時間がかかる場合があります。
第 6 章 メニュー メニューモデルについて 67 var myMenu;
//Open a new text file.
var myTextFile = File.saveDialog("Save Menu Action Names As", undefined);
//If the user clicked the Cancel button, the result is null.
if(myTextFile != null){
//Open the file with write access.
myTextFile.open("w");
for(var myMenuCounter = 0;myMenuCounter< app.menus.length; myMenuCounter++){
myMenu = app.menus.item(myMenuCounter);
myTextFile.writeln(myMenu.name);
myProcessMenu(myMenu, myTextFile);
}
myTextFile.close();
alert("done!");
}
function myProcessMenu(myMenu, myTextFile){
var myMenuElement;
var myIndent = myGetIndent(myMenu);
for(var myCounter = 0; myCounter < myMenu.menuElements.length; myCounter++){
myMenuElement = myMenu.menuElements.item(myCounter);
if(myMenuElement.getElements()[0].constructor.name != "MenuSeparator"){
myTextFile.writeln(myIndent + myMenuElement.name);
if(myMenuElement.getElements()[0].constructor.name == "Submenu"){
if(myMenuElement.menuElements.length > 0){
myProcessMenu(myMenuElement, myTextFile);
}
}
}
}
}
function myGetIndent(myObject){
var myString = "¥t";
var myDone = false;
do{
if((myObject.parent.constructor.name == "Menu")||
(myObject.parent.constructor.name == "Application")){
myDone = true;
}
else{
myString = myString + "¥t";
myObject = myObject.parent;
}
}while(myDone == false)
return myString;
}
ローカライゼーションとメニュー名
InCopy スクリプティングでは、 menuItem
、 menu
、 menuAction
、 submenu
はすべて名前で参照されます。
がって、アプリケーションがインストールされているロケールに依存せずにオブジェクトを指定する方法が
必要になります。 これを行うには、ロケールに依存せずに特定の項目を参照するための文字列が格納されて
いる内部データベースを使用します。 例えば、次のスクリプトを使用すれば、ロケールに依存しないメ
ニューアクション名を取得することができます(完全なスクリプトについては、GetKeyStrings を参照してく
ださい)。
第 6 章 メニュー スクリプトからのメニューアクションの実行 68 var myString = "";
var myMenuAction = app.menuActions.item("$ID/Convert to Note");
var myKeyStrings = app.findKeyStrings(myMenuAction.name);
if(myKeyStrings.constructor.name == "Array"){
for(var myCounter = 0; myCounter < myKeyStrings.length; myCounter ++){
myString += myKeyStrings[myCounter] + "¥r";
}
}
else{
myString = myKeyStrings;
}
alert(myString);
注意 : ロケールに依存しない名前を取得する場合は、 menu
、 menuItem
、 submenu
の名前を取得するよりも、 menuAction
の名前を取得するほうが便利です。 menuAction
のタイトルは、単一の文字列である場合が多いか
らです。 getKeyStrings
メソッドで複数の文字列が返されま
す。
ロケールに依存しない名前を取得したら、スクリプトで使用することができます。 この文字列を使用したス
クリプトは、現在使用している InCopy と異なるロケールにインストールされている InCopy でも正常に機能
します。
ロケールに依存しない文字列を現在のロケールに変換するには、次のスクリプトを使用します(チュートリ
アルスクリプトの TranslateKeyString より)。 var myString = app.translateKeyString("$ID/Convert to Note");
alert(myString);
スクリプトからのメニューアクションの実行
InCopy に組み込まれている menuAction
は、いずれもスクリプトから実行することができます。 menuAction
が menuItem
に割り当てられているとは限りませんが、その点を除けば、スクリプトから menuAction
を実行することは、ユーザーインターフェイスでメニューオプションを選択することとまったく
応する menuAction
をスクリプトから実行すると同じダイアログボックスが表示されます。
スクリプトから menuAction
を実行する方法を、次のスクリプトに示します(完全なスクリプトについては、
//Get a reference to a menu action.
var myMenuAction = app.menuActions.item("$ID/Convert to Note");
//Run the menu action. This example action will fail if you do not
//have text selected.
myMenuAction.invoke();
注意 : 一般的に、InCopy のプロセスをスクリプトで自動化する場合、メニューアクションやユーザーイン
ターフェイスを選択することで必要な処理を実行するのは、あまりよい方法とは言えません。InCopy のスク
リプトオブジェクトモデルを操作するほうが、はるかに確実で強力な処理を実現できます。 メニューアク
ションは、選択やウィンドウの状態など、ユーザーインターフェイスの様々な条件に依存しています。 オブ
ジェクトモデルを使用すれば、InCopy ドキュメント内のオブジェクトを直接操作できるので、ユーザーイン
ターフェイスに依存することなく、一貫性のある高速な処理を実現できます。
メニューやメニュー項目の追加
InCopy のユーザーインターフェイスと同じように、スクリプトでもメニューやメニュー項目の作成や削除が
法を、次のサンプルスクリプトに示します(完全なスクリプトについては、CustomizeMenu を参照してくだ
さい)。
第 6 章 メニュー メニューとイベント 69 var myMainMenu = app.menus.item("Main");
var myTypeMenu = myMainMenu.menuElements.item("Type");
var myFontMenu = myTypeMenu.menuElements.item("Font");
var myKozukaMenu = myFontMenu.submenus.item("Kozuka Mincho Pro ");
var mySpecialFontMenu = myMainMenu.submenus.add("Kozuka Mincho Pro");
for(myCounter = 0;myCounter < myKozukaMenu.menuItems.length; myCounter++){
var myAssociatedMenuAction = myKozukaMenu.menuItems.item(myCounter).associatedMenuAction;
mySpecialFontMenu.menuItems.add(myAssociatedMenuAction);
}
このスクリプトで追加したカスタムメニューを削除するには、RemoveSpecialFontMenu スクリプトを実行し
ます。 var myMainMenu = app.menus.item("Main");
var mySpecialFontMenu = myMainMenu.submenus.item("Kozuka Mincho Pro");
mySpecialFontMenu.remove();
メニューとイベント
ユーザーインターフェイスでメニューやサブメニューを選択すると、イベントが生成されます。これと同じ
ように、 menuAction
や scriptMenuAction
を実行した場合にも、イベントが生成されます。
用すれば、これらのイベントに応答するために eventListener
を登録することができます。
スクリプティングコンポーネントのイベントを次の表に示します。
オブジェクト
menu menuAction scriptMenuAction submenu
イベント
beforeDisplay afterInvoke beforeInvoke afterInvoke beforeInvoke beforeDisplay onInvoke beforeDisplay
説明
メニューの内容が表示される前に、登録したスクリプトが実
行されます。
関連付けられている menuItem
が選択されて、 onInvoke
イベン
トが発生した後に、登録したスクリプトが実行されます。
関連付けられている menuItem
が選択されて、 onInvoke
イベン
トが発生する前に、登録したスクリプトが実行されます。
関連付けられている menuItem
が選択されて、 onInvoke
イベン
トが発生した後に、登録したスクリプトが実行されます。
関連付けられている menuItem
が選択されて、 onInvoke
イベン
トが発生する前に、登録したスクリプトが実行されます。 scriptMenuAction
の有効/チェックのステータスに対する内
部要求が行われる前に、登録したスクリプトが実行されます。 scriptMenuAction
が呼び出されたときに、登録したスクリプ
トが実行されます。 submenu
の内容が表示される前に、登録したスクリプトが実行
されます。 event
や eventListener
を参照してください。
メニューに表示する項目を変更するには、 beforeDisplay event
に対する eventListener
メ
ニューが選択されると、登録したスクリプト(メニュー項目の有効化/無効化や名前の変更などの、メ
ニューに関連するタスクを実行するスクリプト)が eventListener
によって実行されます。
利用可能なフォント、最近使用したドキュメント、開いているウィンドウなどをメニューに表示するために、
内部的に使用されています。
第 6 章 メニュー スクリプトメニューアクションの操作 70
スクリプトメニューアクションの操作
scriptMenuAction
を使用すると、 menuAction
を新しく作成して、 onInvoke event
の発生時に指定のスクリプ
トを実行することができます。 scriptMenuAction
を作成してメニュー項目に割り当てる方法を、次のスクリプトに示します(完全なスクリ
プトについては、MakeScriptMenuAction を参照してください)。 このスクリプトでは、メニュー項目が選択さ
れると、単に警告が表示されます。 var mySampleScriptAction = app.scriptMenuActions.add("Display Message");
var myEventListener = mySampleScriptAction.eventListeners.add("onInvoke", function(){alert("This menu item was added by a script.");});
//If the submenu "Script Menu Action" does not already exist, create it.
try{
var mySampleScriptMenu = app.menus.item("$ID/Main").submenus.item(
"Script Menu Action");
mySampleScriptMenu.title;
}
catch (myError){
var mySampleScriptMenu = app.menus.item("$ID/Main").submenus.add
("Script Menu Action");
}
var mySampleScriptMenuItem = mySampleScriptMenu.menuItems.add(mySampleScriptAction);
このスクリプトで作成した menu
、 submenu
、 menuItem
、 scriptMenuAction
を削除するには、次のスクリプト
を実行します(チュートリアルスクリプトの RemoveScriptMenuAction より)。
#targetengine "session"
var mySampleScriptAction = app.scriptMenuActions.item("Display Message");
mySampleScriptAction.remove();
var mySampleScriptMenu = app.menus.item("$ID/Main").submenus.item
("Script Menu Action");
mySampleScriptMenu.remove();
すべての scriptMenuAction
を削除することもできます。次のスクリプトにその例を示します(チュートリア
ルスクリプトの RemoveAllScriptMenuActions より)。 このスクリプトでは、 scriptMenuAction
のメニューリス
トも削除されますが、作成したメニューやサブメニューは削除されません。
#targetengine "session"
app.scriptMenuActions.everyItem().remove();
現在のすべての scriptMenuAction
のリストを作成することができます。次のスクリプトにその例を示します
(チュートリアルスクリプトの GetScriptMenuActions より)。 var myScriptMenuActionNames = app.scriptMenuActions.everyItem().name;
//Open a new text file.
var myTextFile = File.saveDialog("Save Script Menu Action Names As", undefined);
//If the user clicked the Cancel button, the result is null.
if(myTextFile != null){
//Open the file with write access.
myTextFile.open("w");
for(var myCounter = 0; myCounter < myScriptMenuActionNames.length; myCounter++){
myTextFile.writeln(myScriptMenuActionNames[myCounter]);
}
myTextFile.close();
} scriptMenuAction
を使用して、 beforeDisplay event
の発生時にスクリプトを実行することもできます。こ
の場合は、 scriptMenuAction
の状態に対する内部要求が行われる前に(メニュー項目が表示される直前に)
スクリプトが実行されます。 これは、スクリプトでメニュー名を変更したり、有効/チェックのステータス
を設定したりする場合に特に役立ちます。
次のサンプルスクリプトでは、 beforeDisplay event
に対する eventListener
を追加して、現在の選択を確認
するようにしています。 何も選択されていない場合は、 eventListener
のスクリプトによってメニュー項目が
第 6 章 メニュー スクリプトメニューアクションの操作 71
無効化されます。 アイテムが選択されている場合は、メニュー項目が有効化されます。メニュー項目を選択
すると、選択されている最初のアイテムの種類が表示されます (完全なスクリプトについては、 var mySampleScriptAction = app.scriptMenuActions.add("Display Message");
var myEventListener = mySampleScriptAction.eventListeners.add("onInvoke", myOnInvokeHandler, false);
var mySampleScriptMenu = app.menus.item("$ID/Main").submenus.add("Script Menu Action");
var mySampleScriptMenuItem = mySampleScriptMenu.menuItems.add(mySampleScriptAction);
mySampleScriptMenu.eventListeners.add("beforeDisplay", myBeforeDisplayHandler, false);
//JavaScript function to run before the menu item is drawn.
function myBeforeDisplayHandler(myEvent){
var mySampleScriptAction = app.scriptMenuActions.item("Display Message");
if(app.documents.length > 0){
if(app.selection.length > 0){
mySampleScriptAction.enabled = true;
}
else{
mySampleScriptAction.enabled = false;
}
}
else{
mySampleScriptAction.enabled = false;
}
}
//JavaScript function to run when the menu item is selected.
function myOnInvokeHandler(myEvent){
myString = app.selection[0].constructor.name;
alert("The first item in the selection is a " + myString + ".");
}
7
イベント
章の更新ステータス
CS6
変更なし
InCopy スクリプティングでは、アプリケーションやドキュメントの一般的なイベント(ファイルのオープ
ン、新規ファイルの作成、印刷、ディスク上のテキストファイルやグラフィックファイルの読み込みなど)
に応答することができます。 アプリケーションで発生するイベントは、 event
オブジェクトによって表されま
す。 イベントにスクリプトを割り当てるには、 eventListener
というスクリプトオブジェクトを使用します。
イベントに割り当てるスクリプトは、通常のスクリプトとほとんど同じですが、通常のスクリプトはユー
ザーが(スクリプトパネルから)実行するのに対して、イベントに割り当てるスクリプトは自動的に(目的
のイベントが発生したときに)実行される点が異なります。
この章では、InCopy のイベントを使用したスクリプトについて説明します。 最初は簡単なサンプルスクリプ
トから始めて、徐々に複雑なスクリプトへと進んでいきます。
ここでは、読者が
を既に読んでおり、スクリプトを作成、インストール、実行する方法
を理解しているものとして説明を行います。
この章では、アプリケーションやドキュメントに関連するイベントについて説明します。 メニューに関連す
を参照してください。
InCopy のイベントスクリプトモデルは、Worldwide Web Consortium(W3C)勧告のドキュメントオブジェク
トモデルイベントに似ています。 詳しくは、 http://www.w3c.org
を参照してください。
イベントスクリプトモデルについて
InCopy のイベントスクリプトモデルは、アプリケーションで発生する各種のイベントに相当する一連のオブ
ジェクトによって構成されています。 その中心となるのが event
オブジェクトです。これは、InCopy のユー
ザーインターフェイスで行われる特定のアクション(またはスクリプトの処理に相当するアクション)を表
します。
イベントに応答するには、そのイベントを受け取るオブジェクトに eventListener
を登録します。
ジェクトが指定のイベントを受け取ると、 eventListener
のハンドラー関数に定義されているスクリプト関
数(スクリプト関数か、ディスク上のスクリプトファイルへの参照)が実行されます。
次の表に、 eventListener
で応答できるイベントを示します。
ドショートカット、スクリプトアクションなどの任意の方法で発生させることができます。
72
第 7 章 イベント イベントスクリプトモデルについて 73
ユーザー
インターフェイス
イベント イベント名
任意のメニューア
クション beforeDisplay beforeDisplay
閉じる
書き出し
読み込み
新規
開く
プリント beforeInvoke afterInvoke onInvoke beforeClose afterClose beforeExport afterExport beforeImport afterImport beforeNew afterNew beforeOpen afterOpen beforePrint afterPrint
説明
メニューやサブメニューが表示される
前に発生。
スクリプトメニューアクションが表示
または変更される前に発生。
メニュー項目が選択された後、メ
ニューアクションの内容が実行される
前に発生。
メニューアクションが実行された後に
発生。
オブジェクトタイプ
Event
Event
Event
Event
メニューアクションやスクリプトメ
ニューアクションの実行時に発生。
「ドキュメントを閉じる」要求が発行
された後、ドキュメントが閉じられる
前に発生。
Event
DocumentEvent
ドキュメントが閉じられた後に発生。 DocumentEvent
書き出し要求が発行された後、ドキュ
メントまたはページアイテムが書き出
される前に発生。
ドキュメントまたはページアイテムが
書き出された後に発生。
ImportExportEvent
ImportExportEvent
ファイルが読み込まれる前、ファイル
がドキュメントに読み込まれる前(配
置される前)に発生。
ファイルが読み込まれた後、ファイル
がページに配置される前に発生。
「新規ドキュメント」要求が発行され
た後、ドキュメントが作成される前に
発生。
新規ドキュメントが作成された後に発
生。
ImportExportEvent
ImportExportEvent
DocumentEvent
DocumentEvent
「ドキュメントを開く」要求が発行さ
れた後、ドキュメントが開かれる前に
発生。
ドキュメントが開かれた後に発生。
DocumentEvent
DocumentEvent
DocumentEvent 「ドキュメントのプリント」要求が発
行された後、ドキュメントがプリント
される前に発生。
ドキュメントがプリントされた後に発
生。
DocumentEvent
第 7 章 イベント イベントスクリプトモデルについて 74
ユーザー
インターフェイス
イベント イベント名
復帰
保存
複製を保存
別名で保存 beforeRevert afterRevert beforeSave afterSave
説明
「ドキュメント復帰」要求が発行され
た後、保存されている以前の状態にド
キュメントが戻される前に発生。
保存されている以前の状態にドキュメ
ントが戻された後に発生。
オブジェクトタイプ
DocumentEvent
DocumentEvent
「ドキュメントの保存」要求が発行さ
れた後、ドキュメントが保存される前
に発生。
DocumentEvent
ドキュメントが保存された後に発生。
DocumentEvent beforeSaveACopy
「ドキュメントの複製保存」要求が発
行された後、ドキュメントが保存され
る前に発生。 afterSaveACopy
DocumentEvent
ドキュメントが保存された後に発生。
DocumentEvent beforeSaveAs afterSaveAs
「ドキュメントの別名保存」要求が発
行された後、ドキュメントが保存され
る前に発生。
DocumentEvent
ドキュメントが保存された後に発生。
DocumentEvent
イベントプロパティとイベントの伝達について
ユーザーやスクリプトによってアクションが実行されてイベントが発生すると、そのイベントに応答可能な
スクリプティングオブジェクトにイベントが伝達されます。 特定のイベントに対する eventListener
が登録
されているオブジェクトにそのイベントが伝達されると、その eventListener
が呼び出されます。
ントが複数のオブジェクトに伝達されて、複数のオブジェクトで処理が行われる場合もあります。
イベントの伝達には、次の 3 種類があります。
伝達しない — イベントターゲットに登録されている eventListener
のみが呼び出されます。
イベントの例としては、 beforeDisplay
イベントがあります。
キャプチャ — スクリプトオブジェクトモデルの最上位(アプリケーション)から始まって、イベント
ターゲットまで伝達されます。 target
の上位にあるオブジェクトに登録されている、そのイベントに応
答可能なすべての eventListener
でイベントが処理されます。
バブル — target
から伝達が開始されます。まず、 target
に登録されている応答可能な eventListener
が呼び出されます。 次に、スクリプトオブジェクトモデルの上方向にイベントが伝達されます。スクリ
プトオブジェクトモデルで target
の上位にあるオブジェクトに登録されている、そのイベントに応答可
能な eventListener
が呼び出されます。
次の表に、 event
のプロパティの詳細と、スクリプトオブジェクトモデルでのイベント伝達に与える影響を
示します。
第 7 章 イベント eventListener の操作 75
プロパティ
Bubbles
Cancelable
Captures
CurrentTarget
DefaultPrevented
EventPhase
EventType
PropagationStopped
Target
TimeStamp
説明
true の場合、 event
が発生したオブジェクトの上位にあるスクリプティングオブ
ジェクトにその event
が伝達されます。 true の場合、 target
における event
のデフォルトの動作をキャンセルできます。
これを行うには、
PreventDefault
メソッドを使用します。 true の場合、イベント伝達のキャプチャフェーズで、イベントのターゲットオブ
ジェクトの上位にあるスクリプティングオブジェクトに登録されている eventListener eventListener
が呼び出される前に、アプリケーションの eventListener
でド
キュメントイベントに応答することができます。 event
この表の
Target
を
参照してください。 true の場合、現在の target
(この表の
Target
を参照)における event
のデフォ
ルト動作が実行されず、アクションがキャンセルされます。 event
の伝達プロセスの現在のステージ。 event
のタイプを表す文字列( beforeNew true の場合、 current target
以降への伝達が中止されます(この表の
Target
を
参照してください)。 stopPropagation
メソッド
を使用します。 event
例えば、 beforeImport
イベントの
Target
はド
キュメントであり、 beforeNew
イベントの
Target
はアプリケーションです。 event
が発生した日時。
eventListener の操作
eventListener
、イベントハンドラー(JavaScript 関数ま
たはファイル参照)、イベントのキャプチャフェーズで eventListener
を呼び出すかどうかを指定します。
定のイベントに対して eventListener
を追加する方法を、次のスクリプトに示します(完全なスクリプトに
ついては、AddEventListener を参照してください)。
#targetengine "session"
main();
function main(){
var myEventListener = app.addEventListener("afterNew", myDisplayEventType,
false);
}
function myDisplayEventType(myEvent){
alert("This event is the " + myEvent.eventType + " event.");
}
このスクリプトで作成した eventListener
を削除するには、次のスクリプトを実行します(チュートリアル
スクリプトの RemoveEventListener より)。 app.removeEventListener("afterNew", myDisplayEventType, false);
1 つの eventListener
でイベントが処理されても、そのイベントを監視している他の eventListener
があれ afterOpen
イベントは、アプリケーションとドキュメントの両方の eventListener
で監視されている可能性
があります。
第 7 章 イベント eventListener の操作 76 eventListener
すべての InCopy セッ
ションで eventListener
を利用できるようにしたい場合は、スタートアップスクリプト用のフォルダーであ
る Startup Scripts にスクリプトを追加します(スクリプトのインストールについて詳しくは、 第 2 章「はじめ
を参照してください)。 eventListener
スクリプトを追加しても、ドキュメントとともに
保存されたり、INX に書き出されたりすることはありません。
注意 :
eventListener
を定義するスクリプトで問題が発生した場合は、その eventListener
を削除するスクリ
プトを実行するか、InCopy を終了して再起動します。
(外部ファイルではなく)スクリプトの中で定義されているハンドラー関数を使用する eventListener
では、
#targetengine "session"
このスクリプトを
#targetengine "main"
(デフォル
トの設定)で実行すると、イベントの発生時に関数が使用できず、エラーが発生します。
スクリプトオブジェクトモデルの中で 1 つのイベントが伝達されて、複数の eventListener
が呼び出される
場合があります。 次のサンプルスクリプトでは、様々なオブジェクトに登録されている eventListener
が 1
つのイベントによって呼び出されます(完全なスクリプトについては、MultipleEventListeners を参照してく
#targetengine "session"
main();
function main(){
var myApplicationEventListener = app.eventListeners.add("beforeImport",
myEventInfo, false);
var myDocumentEventListener = app.documents.item(0).eventListeners.add
("beforeImport", myEventInfo, false);
}
function myEventInfo(myEvent){
var myString = "Current Target: " + myEvent.currentTarget.name;
alert(myString);
}
このスクリプトを実行してファイルを配置すると、ドキュメントの名前を示す警告と、アプリケーションの
名前を示す警告が順に表示されます。
次のサンプルスクリプトでは、サポートされている各イベントの eventListener
を作成して、簡単なダイア
ログボックスにイベントに関する情報を表示しています。 完全なスクリプトについては、EventListenersOn を
参照してください。 main()
function main(){
app.scriptPreferences.version = 5.0;
var myEventNames = [
"beforeQuit", "afterQuit",
"beforeNew", "afterNew",
"beforeOpen", "afterOpen",
"beforeClose", "afterClose",
"beforeSave", "afterSave",
"beforeSaveAs", "afterSaveAs",
"beforeSaveACopy", "afterSaveACopy",
"beforeRevert", "afterRevert",
"beforePrint", "afterPrint",
"beforeExport", "afterExport",
"beforeImport", "afterImport"
] ;
for (var myCounter = 0; myCounter < myEventNames.length; myCounter ++){
app.addEventListener(myEventNames[myCounter], myEventInfo, false);
}
}
function myEventInfo(myEvent){
var myString = "Handling Event: " +myEvent.eventType;
myString += "¥r¥rTarget: " + myEvent.target + " " +myEvent.target.name;
myString += "¥rCurrent: " +myEvent.currentTarget + " "
myStirng += myEvent.currentTarget.name;
myString += "¥r¥rPhase: " + myGetPhaseName(myEvent.eventPhase );
第 7 章 イベント 「afterNew」eventListener の例 77 myString += "¥rCaptures: " +myEvent.captures;
myString += "¥rBubbles: " + myEvent.bubbles;
myString += "¥r¥rCancelable: " +myEvent.cancelable;
myString += "¥rStopped: " +myEvent.propagationStopped;
myString += "¥rCanceled: " +myEvent.defaultPrevented;
myString += "¥r¥rTime: " +myEvent.timeStamp;
alert(myString);
function myGetPhaseName(myPhase){
switch(myPhase){
case EventPhases.atTarget:
myPhaseName = "At Target";
break;
case EventPhases.bubblingPhase:
myPhaseName = "Bubbling";
break;
case EventPhases.capturingPhase:
myPhaseName = "Capturing";
break;
case EventPhases.done:
myPhaseName = "Done";
break;
case EventPhases.notDispatching:
myPhaseName = "Not Dispatching";
break;
}
return myPhaseName;
}
}
アプリケーションオブジェクトのすべての eventListener
をオフにする方法を、次のサンプルスクリプトに
//EventListenersOff.jsx
//An InCopy CS6 JavaScript
#targetengine "session"
app.eventListeners.everyItem().remove();
「afterNew」eventListener の例
afterNew
イベントは、ユーザー名、ドキュメントの作成日、著作権情報、その他の作業に関する情報などを
ドキュメントに追加したい場合に便利です。 ドキュメントのメタデータ(ファイル情報または XMP 情報とも
呼ばれます)にこのような情報を追加する方法を、次のサンプルスクリプトに示します。 完全なスクリプト
リストについては、AfterNew というチュートリアルスクリプトを参照してください。
第 7 章 イベント 「afterNew」eventListener の例 78
#targetengine "session"
//Creates an event listener that will run after a new document is created.
main();
function main(){
var myEventListener = app.eventListeners.add("afterNew",
myAfterNewHandler, false);
}
function myAfterNewHandler(myEvent){
var myDocument = myEvent.parent;
main(myDocument);
function main(myDocument){
app.userName = "Adobe";
myAddXMPData(myDocument);
}
function myAddXMPData(myDocument){
with(myDocument.metadataPreferences){
author = "Adobe Systems";
description = "This is a sample document with XMP metadata. Created:"
+ myEvent.timeStamp + "¥rby: " + app.userName;
}
}
}
8
注釈
章の更新ステータス
CS6
変更なし
InDesign および InCopy では、インライン式の編集上の注釈機能を使用して、ストーリーのフローに影響を与
えることなく、注釈としてコメントを直接テキストに追加できます。 注釈機能は、ワークグループ環境で使
用する目的で設計されています。 特定の条件に基づいて、注釈に色を付けたり、オン / オフを切り替えたりす
ることもできます。
注釈を作成するには、ツールボックスの注釈ツール、注釈/新規注釈のコマンド、または注釈パレットの新
規注釈アイコンを使用します。
ここでは、読者が
を既に読んでおり、スクリプトを作成、インストール、実行する方法
を理解しているものとして説明を行います。 また、InCopy で注釈を操作する方法を理解しているものとして
います。
注釈の入力と読み込み
ここでは、InCopy ドキュメントに注釈を配置する方法について説明します。 InCopy のユーザーインターフェ
イスを使用して注釈を作成したり、注釈のテキストを置換したりするのと同じように、スクリプトを使用し
て注釈を作成したり、注釈にテキストを挿入したりすることができます。
ストーリーへの注釈の追加
ストーリーに注釈を追加するには、 add
メソッドを使用します。 次のサンプルでは、最後の挿入点に注釈を追
加しています。 完全なスクリプトについては、InsertNote を参照してください。 var myDocument = app.documents.item(0);
var myStory = myDocument.stories.item(0);
//Add note to a default story. We'll use the last insertion point in the story.
var myNote = myStory.insertionPoints.item(-1).notes.add();
//Add text to the note
myNote.texts.item(0).contents = "This is a note."
注釈のテキストの置換
注釈のテキストを置換するには、 contents
プロパティを使用します。次のサンプルにその例を示します。 完
全なスクリプトについては、Replace を参照してください。 var myDocument = app.documents.item(0);
var myStory = myDocument.stories.item(0);
var myNote = myStory.notes.item(0);
//Replace text of note with "This is a replaced note."
myNote.texts.item(0).contents = "This is a replaced note."
79
第 8 章 注釈 注釈からテキストへの変換およびテキストから注釈への変換 80
注釈からテキストへの変換およびテキストから注釈への変換
注釈からテキストへの変換
注釈をテキストに変換するには、 convertToText
メソッドを使用します。次のサンプルにその例を示します。
完全なスクリプトについては、ConvertToText を参照してください。 var myDocument = app.documents.item(0);
var myStory = myDocument.stories.item(0);
//Convert the note to text
myStory.notes.item(0).convertToText();
テキストから注釈への変換
テキストを注釈に変換するには、 convertToNote
メソッドを使用します。次のサンプルにその例を示します。
完全なスクリプトについては、ConvertToNote を参照してください。 var myDocument = app.documents.item(0);
myStory = myDocument.stories.item(0);
//Convert text to note
myStory.words.item(0).convertToNote();
注釈の展開と折りたたみ
注釈の折りたたみ
注釈を折りたたむ方法を、次のスクリプトに示します。 完全なスクリプトについては、CollapseNote を参照し
てください。 var myDocument = app.documents.item(0);
var myStory = myDocument.stories.item(0);
var myNote = myStory.notes.item(0);
//Collapse a note
myNote.collapsed = true;
注釈の展開
注釈を展開する方法を、次のスクリプトに示します。 完全なスクリプトについては、ExpandNote を参照して
ください。 var myDocument = app.documents.item(0);
var myStory = myDocument.stories.item(0);
var myNote = myStory.notes.item(0);
//Expand a note
myNote.collapsed = false;
注釈の削除
注釈を削除するには、 remove
メソッドを使用します。次のサンプルにその例を示します。 完全なスクリプト
については、RemoveNote を参照してください。 var myDocument = app.documents.item(0);
var myStory = myDocument.stories.item(0);
//Remove the note
myStory.notes.item(0).remove(myStory.notes.item(0));
第 8 章 注釈 注釈間の移動 81
注釈間の移動
ストーリー内の最初の注釈への移動
ストーリー内の最初の注釈に移動する方法を、次のスクリプトに示します。 完全なスクリプトについては、
FirstNote を参照してください。 var myDocument = app.documents.item(0);
var myStory = myDocument.stories.item(0);
//Get next note
var myNote = myStory.notes.firstItem();
//Add text to the note
myNote.texts.item(0).contents = "This is the first note."
ストーリー内の次の注釈への移動
ストーリー内の次の注釈に移動する方法を、次のスクリプトに示します。 完全なスクリプトについては、
NextNote を参照してください。 var myDocument = app.documents.item(0);
var myStory = myDocument.stories.item(0);
//Get next note
var myNote = myStory.notes.nextItem(myStory.notes.item(0));
text to the note
myNote.texts.item(0).contents = "This is the next note."
ストーリー内の前の注釈への移動
ストーリー内の前の注釈に移動する方法を、次のスクリプトに示します。 完全なスクリプトについては、
PreviousNote を参照してください。 var myDocument = app.documents.item(0);
var myStory = myDocument.stories.item(0);
//Get previous note
var myNote = myStory.notes.previousItem(myStory.notes.item(1));
//Add text to the note
myNote.texts.item(0).contents = "This is the prev note."
ストーリー内の最後の注釈への移動
ストーリー内の最後の注釈に移動する方法を、次のスクリプトに示します。 完全なスクリプトについては、
LastNote を参照してください。 var myDocument = app.documents.item(0);
var myStory = myDocument.stories.item(0);
//Get next note
var myNote = myStory.notes.lastItem();
//Add text to the note
myNote.texts.item(0).contents = "This is the last note."
9
変更のトラック
章の更新ステータス
CS6
変更なし
原稿作成や編集作業の進行中に、ドキュメントの変更のトラック、表示/非表示、適用、取り消しを実行で
この章では、変更のトラックに関する一般的な操作をスクリプトで実行する方法について説明します。
ここでは、読者が
を既に読んでおり、スクリプトを作成、インストール、実行する方法
を理解しているものとして説明を行います。 また、InCopy でテキストを操作する方法や、組版に関する基本
的な用語を理解しているものとしています。
変更のトラック
ここでは、スクリプトを使用して、トラックされた変更に移動したり、変更を適用および取り消しする方法
について説明します。
既存のストーリーに含まれているテキストの追加や削除、移動が行われると、その変更がゲラビューおよび
ストーリービューに示されます。
トラックされた変更への移動
トラックされた変更の記録がストーリーに含まれている場合、ユーザーはトラックされた変更に順次移動す
ることができます。 トラックされた変更に移動する方法を、次のスクリプトに示します。
次のスクリプトでは、 nextItem
メソッドを使用して、挿入点の後の変更に移動します。 var myDocument = app.documents.item(0);
var myStory = myDocument.stories.item(0);
//Story.trackChanges If true, track changes is turned on.
if(myStory.trackChanges==true )
{
var myChangeCount =myStory.changes.length;
var myChange = myStory.changes.item(0);
if(myChangeCount>1)
{
var myChange0 = myStory.changes.nextItem(myChange);
}
}
次のスクリプトでは、 previousItem
メソッドを使用して、挿入点の前の変更に移動します。
82
第 9 章 変更のトラック 変更のトラック 83 var myDocument = app.documents.item(0);
var myStory = myDocument.stories.item(0);
//Story.trackChanges If true, track changes is turned on.
if(myStory.trackChanges==true )
{
var myChangeCount =myStory.changes.length;
var myChange = myStory.changes.lastItem();
if(myChangeCount>1)
{
var myChange0 = myStory.changes.previousItem(myChange);
}
}
トラックされた変更の適用と取り消し
ストーリーに対する変更が行われた場合、変更のトラック機能を使用してすべての変更を見直したり、ス
トーリーにすべての変更を組み込むかどうかを決定できます。 ユーザーは、すべてのユーザーが行った変更
(テキストの追加や削除、移動)を適用および取り消しすることができます。
次のスクリプトでは、変更を適用します。 var myDocument = app.documents.item(0);
var myStory = myDocument.stories.item(0);
var myChange = myStory.changes.item(0);
myChange.accept () ;
次のスクリプトでは、変更を取り消します。 var myDocument = app.documents.item(0);
var myStory = myDocument.stories.item(0);
var myChange = myStory.changes.item(0);
myChange.reject() ;
トラックされた変更に関する情報
変更の情報には日付や時間などが含まれています。 次のスクリプトでは、トラックされた変更の情報を表示
します。 var myDocument = app.documents.item(0);
var myStory = myDocument.stories.item(0);
var myChange = myStory.changes.item(0);
//ChangeTypes.DELETED_TEXT (Read Only) Deleted text.
//ChangeTypes.DELETED_TEXT (Read Only) Deleted text.
//ChangeTypes.MOVED_TEXT (Read Only) Moved text.
var myChangeTypes = myChange.changeType;
//Characters A collection of characters.
var myCharacters = myChange.characters;
//Character = myCharacters.item(0);
var myDate = myChange.date;
//InsertionPoints A collection of insertion points.
// insertpoint = myInsertionPoints.item(0);
var myInsertionPoints = myChange.insertionPoints;
//Change.lines (Read Only) A collection of lines.
var myLines = myChange.lines;
第 9 章 変更のトラック 変更のトラックの環境設定 84
//Change.paragraphs (Read Only) A collection of paragraphs.
var myParagraphs =myChange.paragraphs;
//InsertionPoints A collection of insertion points.
// insertpoint = myInsertionPoints.item(0);
var myStoryOffset = myChange.storyOffset;
//Change.textColumns (Read Only) A collection of text columns.
var myTextColumns = myChange.textColumns;
//Change.textStyleRanges (Read Only) A collection of text style ranges.
var myTextStyleRanges = myChange.textStyleRanges;
//Change.textVariableInstances (Read Only) A collection of text variable instances.
var myTextVariableInstances = myChange.textVariableInstances;
//Change.texts (Read Only) A collection of text objects.
var myTexts = myChange.texts;
var myUserName = myChange.userName;
var myWords = myChange.words;
変更のトラックの環境設定
変更のトラックの環境設定とは、変更のトラックに関するユーザー設定です。 例えば、トラックされる変更
の種類(テキストの追加や削除、移動)を定義できます。 トラックされた変更の種類別の外観を指定したり、
マージンの色付きの変更バーで変更を識別したりできます。 これらの環境設定を設定して取得する方法を、
次のスクリプトに示します。 var myTrackChangesPreference = app.trackChangesPreferences ;
with(myTrackChangesPreference)
{addedBackgroundColorChoice =
ChangeBackgroundColorChoices.CHANGE_BACKGROUND_USES_CHANGE_PREF_COLOR;
addedTextColorChoice = ChangeTextColorChoices.CHANGE_USES_CHANGE_PREF_COLOR ;
backgroundColorForAddedText = UIColors.gray;
var myColor = backgroundColorForDeletedText;
backgroundColorForDeletedText = UIColors.red;
backgroundColorForMovedText = UIColors.pink;
changeBarColor = UIColors.charcoal;
deletedBackgroundColorChoice
=ChangeBackgroundColorChoices.CHANGE_BACKGROUND_USES_CHANGE_PREF_COLOR;
deletedTextColorChoice =ChangeTextColorChoices.CHANGE_USES_CHANGE_PREF_COLOR ;
//ChangebarLocations.LEFT_ALIGN (Read Only) Change bars are in the left margin.
//ChangebarLocations.RIGHT_ALIGN (Read Only) Change bars are in the right margin
locationForChangeBar = ChangebarLocations.LEFT_ALIGN;
//ChangeMarkings.OUTLINE (Read Only) Outlines changed text.
//ChangeMarkings.NONE (Read Only) Does not mark changed text.
//ChangeMarkings.STRIKETHROUGH (Read Only) Uses a strikethrough to mark changed text.
//ChangeMarkings.UNDERLINE_SINGLE (Read Only) Underlines changed text.
markingForAddedText =ChangeMarkings.OUTLINE;
markingForDeletedText = ChangeMarkings.STRIKETHROUGH;
markingForMovedText = ChangeMarkings.UNDERLINE_SINGLE;
movedBackgroundColorChoice
=ChangeBackgroundColorChoices.CHANGE_BACKGROUND_USES_CHANGE_PREF_COLOR;
movedTextColorChoice = ChangeTextColorChoices.CHANGE_USES_CHANGE_PREF_COLOR ;
showAddedText = true;
shhowDeletedText =true;
showMovedText = true;
spellCheckDeletedtext = true;
showChangeBar = true;
textColorForAddedText=UIColors.blue;
textColorForDeletedText=UIColors.yellow;
textColorForMovedText=UIColors.green;
}
10
アサイン
章の更新ステータス
CS6
変更なし
アサインは、InDesign ファイルに含まれるテキストやグラフィック用のコンテナで、InCopy で表示および編
集できます。 一般的に、アサインには、関連するテキストやグラフィックが含まれます(雑誌の記事を構成
このチュートリアルでは、アサインに関する一般的な操作をスクリプトで実行する方法について説明します。
ここでは、読者が
を既に読んでおり、スクリプトを作成、インストール、実行する方法
を理解しているものとして説明を行います。
アサインオブジェクト
この節では、アサインとアサインファイルを操作する方法について説明します。 スクリプトを使用して、ア
サインファイルを開いてアサインのプロパティを取得できます。
アサインファイルを開く
既存のアサインファイルを開く方法を、次のスクリプトに示します。
//Open an exist assignment file
var myDocument = app.open(File("/c/a.icma"));
var myAssignement = myDocument.assignments.item(0);
アサインのプロパティに対する繰り返し処理
アサインのプロパティ(アサイン名、ユーザー名、アサインファイルの場所、アサインの書き出しオプショ
ンなど)を取得する方法を、次のスクリプトに示します。 var myName = myAssignement.name;
var myUserName = myAssignement.userName;
var myDocument = app.documents.item(0);
var myAssignement = myDocument.assignments.item(0);
var myFilePath = myAssignement.filePath;
var myFramecolor = myAssignement.frameColor;
// exportOptions property can be:
// AssignmentExportOptions.ASSIGNED_SPREADS
// AssignmentExportOptions.EMPTY_FRAMES
// AssignmentExportOptions.EVERYTHING
var myExportOptions = myAssignement.exportOptions;
アサインパッケージ
アサインパッケージ(InCopy で作成した .
incp
ファイル)は、アサインファイルが含まれた圧縮フォルダー
です。 createPackage
メソッドを使用すると、アサインをパッケージ化することができます。
クリプトでは、この方法でパッケージファイルを作成しています。
85
第 10 章 アサイン アサインのストーリー 86 var myDocument = app.documents.item(0);
var myAssignement = myDocument.assignments.item(0);
if(myAssignement.packaged==false)
{
var myFile= new File("/c/b.icap");
// PackageType.FORWARD_PACKAGE Creates an assignment package for export.
// PackageType.RETURN_PACKAGE Create a package to place in the main document.
myAssignement.createPackage(myFile,PackageType.FORWARD_PACKAGE);
}
アサインのストーリー
次の図に、InCopy のアサインオブジェクトモデルを示します。 アサインドキュメントには、1 つ以上のアサ
インが含まれます。アサインには、アサインされたストーリーが含まれないか、または 1 つ以上のアサイン
されたストーリーが含まれます。 アサインされた各ストーリーは、テキストストーリーまたは画像ストー
リーを参照します。
document
1
1…* assignment
1
0…* assigned story
1 text/image story
1
この節では、アサインされたストーリーとアサインストーリーのプロパティを取得する方法について説明し
ます。
アサインされたストーリーオブジェクト
アサインオブジェクトから、アサインされたストーリーを取得する方法を、次のスクリプトに示します。 var myDocument = app.documents.item(0);
var myAssignement = myDocument.assignments.item(0);
var myAssignmentStory = myAssignement.assignedStories.item(0);
アサインされたストーリーのプロパティに対する繰り返し処理
オブジェクトのすべてのプロパティを取得する方法を、次のスクリプトに示します。 var myDocument = app.documents.item(0);
var myAssignement = myDocument.assignments.item(0);
var myAssignmentStory = myAssignement.assignedStories.item(0);
if(myAssignmentStory != null)
{
var myName = myAssignmentStory.name;
var myIsvalid = myAssignmentStory.isValid;
var myFilePath = myAssignmentStory.filePath;
var myStoryReference = myAssignmentStory.storyReference;
}
11
XML
章の更新ステータス
CS6
変更なし
XML(Extensible Markup Language)は、World Wide Web Consortium( www.w3.org
)で作成と管理が行われて
いる、テキストベースのマークアップシステムです。 XML では、HTML(Hypertext Markup Language)と同じ
ように、不等号記号で囲まれたマークアップタグ(
<article>
や
<para>
など)が使用されます。
使用できるタグが事前に定義されていますが、XML では独自のタグを作成して、ドキュメントの構造をより
詳細に記述することができます。
高い柔軟性を備えている XML は、データの保存形式として広く利用されています。 InCopy には、XML データ
をページレイアウトに読み込むための様々な機能が用意されていますが、それらはスクリプトを使用して制
御できます。
ここでは、読者が
を既に読んでおり、スクリプトを作成、インストール、実行する方法
を理解しているものとして説明を行います。 また、XML、DTD、XSLT に関する基礎知識を持っていることを前
提としています。
概要
XML はフォーマットを行うためのものではなく、ドキュメントの構造を記述するためのものです。したがっ
て、ページレイアウト作業で XML を活用するには、やや複雑な手順が必要になります。 InCopy は、XML に完
全かつ柔軟に対応できますが、次のような制約があります。
によって表現された XML 要素は、元の XML 要素とは異なります。
い場合は、XML 要素そのものを複製する必要があります。
XML 要素のレイアウト上での出現順序は、XML 構造での出現順序とほぼ同じになります。
XML 要素に関連付けられているストーリー内のテキストは、その要素のデータになります。
InCopy での XML スクリプティングの推奨事項
XML ファイルの処理は、InCopy の外部で(InCopy のレイアウトに XML ファイルを読み込む前に)そのほと
んどを行うのが一般的です。 InCopy の外部では、XML エディターや XML パーサーなどの様々な便利なツール
が利用できます。
大規模な XML データ構造に含まれている要素を再配置したり複製したりする場合は、XSLT を使用して XML
を変換することを推奨します。 これは、XML ファイルを読み込むときに実行できます。
XML 要素のスクリプティング
ここでは、XML 環境設定や XML 読み込み環境設定の指定、XML の読み込み、XML 要素の作成、XML 属性の追
加を行う方法について説明します。 ここでは、XML コンテンツ自体を操作するスクリプトについて説明しま
87
第 11 章 XML
XML 要素のスクリプティング 88
す。XML 要素にフォーマットを適用するスクリプトについては、
を参照してください。
XML 環境設定の指定
XML ビュー環境設定オブジェクトを使用して、InCopy の構造パネルの外観を制御できます。次のスクリプト
にその例を示します(チュートリアルスクリプトの XMLViewPreferences より)。 var myDocument = app.documents.add();
var myXMLViewPreferences = myDocument.xmlViewPreferences;
myXMLViewPreferences.showAttributes = true;
myXMLViewPreferences.showStructure = true;
myXMLViewPreferences.showTaggedFrames = true;
myXMLViewPreferences.showTagMarkers = true;
myXMLViewPreferences.showTextSnippets = true;
また、XML 環境設定オブジェクトを使用して、XML タグ付きプリセット環境設定(表やストーリーのデフォ
ルトのタグ名やユーザーインターフェイスカラー)を指定することもできます。次のスクリプトにその例を
示します(チュートリアルスクリプトの XMLPreferences より)。 var myDocument = app.documents.add();
var myXMLPreferences = myDocument.xmlPreferences;
myXMLPreferences.defaultCellTagColor = UIColors.blue;
myXMLPreferences.defaultCellTagName = "cell";
myXMLPreferences.defaultImageTagColor = UIColors.brickRed;
myXMLPreferences.defaultImageTagName = "image";
myXMLPreferences.defaultStoryTagColor = UIColors.charcoal;
myXMLPreferences.defaultStoryTagName = "text";
myXMLPreferences.defaultTableTagColor = UIColors.cuteTeal;
myXMLPreferences.defaultTableTagName = "table";
XML 読み込み環境設定の指定
XML ファイルを読み込む前に、XML 読み込み環境設定を指定することができます。この環境設定を使用すれ
ば、XSLT 変換を適用したり、XML ファイル内の空白文字の処理方法を制御したり、繰り返すテキスト要素を
作成したりすることができます。 XML 読み込み環境設定オブジェクトの設定方法を、次のスクリプトに示し
ます(チュートリアルスクリプトの XMLImportPreferences より)。 var myDocument = app.documents.add();
var myXMLImportPreferences = myDocument.xmlImportPreferences;
myXMLImportPreferences.allowTransform = false;
myXMLImportPreferences.createLinkToXML = false;
myXMLImportPreferences.ignoreUnmatchedIncoming = true;
myXMLImportPreferences.ignoreWhitespace = true;
myXMLImportPreferences.importCALSTables = true;
myXMLImportPreferences.importStyle = XMLImportStyles.mergeImport;
myXMLImportPreferences.importTextIntoTables = false;
myXMLImportPreferences.importToSelected = false;
myXMLImportPreferences.removeUnmatchedExisting = false;
myXMLImportPreferences.repeatTextElements = true;
//The following properties are only used when the
//AllowTransform property is set to True.
//myXMLImportPreferences.transformFilename = "c:¥myTransform.xsl"
//If you have defined parameters in your XSL file, then you can pass
//parameters to the file during the XML import process. For each parameter,
//enter an array containing two strings. The first string is the name of the
//parameter, the second is the value of the parameter.
//myXMLImportPreferences.transformParameters = [["format", "1"]];
第 11 章 XML
XML 要素のスクリプティング 89
XML の読み込み
XML 読み込み環境設定を指定したら、XML ファイルを読み込みます。次のスクリプトにその例を示します
(チュートリアルスクリプトの ImportXML より)。 myDocument.importXML(File("/c/completeDocument.xml"));
XML ファイルの内容を特定の XML 要素に読み込む必要がある場合は、ドキュメントではなく XML 要素の var myXMLTag = myDocument.xmlTags.add("xml_element");
var myXMLElement = myDocument.xmlElements.item(0).xmlElements.add(myXMLTag);
//Import into the new XML element.
myXMLElement.importXML(File("/c/completeDocument.xml"));
または、 xmlImportPreferences
オブジェクトの importToSelected
プロパティを true に設定し、XML 要素を
選択した状態で XML ファイルを読み込む方法もあります。次のスクリプトにその例を示します(チュートリ
アルスクリプトの ImportXMLIntoSelectedXMLElement より)。 var myXMLTag = myDocument.xmlTags.add("xml_element");
var myXMLElement = myDocument.xmlElements.item(0).xmlElements.add(myXMLTag);
myDocument.select(myXMLElement);
myDocument.xmlImportPreferences.importToSelected = true;
//Import into the selected XML element.
myDocument.importXML(File("/c/test.xml"));
XML タグの作成
の要素名が、ドキュメントの XML タグのリストに追加されます。 また、XML タグを直接作成することもでき
ます。次のスクリプトにその例を示します(チュートリアルスクリプトの MakeXMLTags より)。
//You can create an XML tag without specifying a color for the tag.
var myXMLTagA = myDocument.xmlTags.add("XML_tag_A");
//You can define the highlight color of the XML tag using the UIColors enumeration...
var myXMLTagB = myDocument.xmlTags.add("XML_tag_B", UIColors.gray);
//...or you can provide an RGB array to set the color of the tag.
var myXMLTagC = myDocument.xmlTags.add("XML_tag_C", [0, 92, 128]);
XML タグのロード
XML データを読み込む前にタグとスタイルのマッピングを行いたい場合に便利です。次のスクリプトにその
例を示します(チュートリアルスクリプトの LoadXMLTags より)。 myDocument.loadXMLTags(File("/c/test.xml"));
XML タグの保存
ファイルから XML タグをロードするのとは逆に、XML タグをファイルに保存することもできます。 これを行
うと、タグだけが XML ファイルに保存されます。ドキュメントデータは保存されません。 この処理は、XML
を書き出すより高速で、生成されるファイルも小さくなります。 XML タグを保存する方法を、次のサンプル
スクリプトに示します(完全なスクリプトについては、SaveXMLTags を参照してください)。 myDocument.saveXMLTags(File("/c/xml_tags.xml"), "Tag set created October 5, 2006");
第 11 章 XML
XML 要素のスクリプティング 90
XML 要素の作成
通常、XML 要素は XML ファイルを読み込んで作成しますが、InCopy スクリプティングを使用して XML 要素
を作成することもできます。次のスクリプトにその例を示します(チュートリアルスクリプトの var myXMLTag = myDocument.xmlTags.add("myXMLTag");
var myRootElement = myDocument.xmlElements.item(0);
var myXMLElment = myRootElement.xmlElements.add(myXMLTag);
myXMLElement.contnets = "This is an XML element containing text."
XML 要素の移動
move
メソッドを使用して、XML 構造内の XML 要素を移動できます。次のスクリプトにその例を示します
(チュートリアルスクリプトの MoveXMLElement より)。 var myDocument = app.documents.add();
var myRootXMLElement = myDocument.xmlElements.item(0);
var myXMLTag = myDocument.xmlTags.add("xml_element");
var myXMLElementA = myRootXMLElement.xmlElements.add(myXMLTag);
myXMLElementA.contents = "A";
var myXMLElementB = myRootXMLElement.xmlElements.add(myXMLTag);
myXMLElementB.contents = "B";
var myXMLElementC = myRootXMLElement.xmlElements.add(myXMLTag);
myXMLElementC.contents = "C";
var myXMLElementD = myRootXMLElement.xmlElements.add(myXMLTag);
myXMLElementD.contents = "D";
//Move the XML element containing "A" to after
//the XML element containing "C"
myXMLElementA.move(LocationOptions.after, myRootXMLElement.xmlElements.item(2));
//Move the XML element containing "D" to the beginning of its parent.
myRootXMLElement.xmlElements.item(-1).move(LocationOptions.atBeginning);
//Place the XML structure so that you can see the result.
myDocument.stories.item(0).placeXML(myRootXMLElement);
XML 要素の削除
XML 要素を削除すると、レイアウトと XML 構造の両方から XML 要素が削除されます。次のスクリプトにその
例を示します(チュートリアルスクリプトの DeleteXMLElement より)。 myRootXMLElement.xmlElements.item(0).remove();
XML 要素の複製
XML 要素を複製すると、新しい XML 要素が、XML 構造内の元の XML 要素の直後に追加されます。次のスク
リプトにその例を示します(チュートリアルスクリプトの DuplicateXMLElement より)。 var myDocument = app.documents.item(0);
var myRootXMLElement = myDocument.xmlElements.item(0);
//Duplicate the XML element containing "A"
var myNewXMLElement = myRootXMLElement.xmlElements.item(0).duplicate();
//Change the content of the duplicated XML element.
myNewXMLElement.contents = myNewXMLElement.contents + " duplicate";
XML 構造からのアイテムの削除
XML 要素とテキストオブジェクトとの関連付けを削除するには、 untag
メソッドを使用します。次のスクリ
プトにその例を示します。 このメソッドを使用すると、XML 要素との関連付けは削除されますが、オブジェ
第 11 章 XML
XML 要素のスクリプティング 91
クトそのものは削除されません。 XML 要素が削除されたコンテンツは、親の XML 要素に関連付けられます。
XML 要素がルート XML 要素の場合、その XML 要素に関連付けられているレイアウトオブジェクト(テキスト
またはページアイテム)は、ドキュメントに保持されます (完全なスクリプトについては、UntagElement を
参照してください)。 var myXMLElement = myDocument.xmlElements.item(0).xmlElements.item(-2);
myXMLElement.untag();
XML コメントの作成
のスクリプトに示します(チュートリアルスクリプトの MakeXMLComment より)。 var myRootXMLElement = myDocument.xmlElements.item(0);
var myXMLElement = myRootXMLElement.xmlElements.item(1);
myXMLElement.xmlComments.add("This is an XML comment.");
XML 処理命令の作成
処理命令(PI:Processing Instruction)とは、XML ドキュメントを読み込むアプリケーションに対する命令が
含まれている XML 要素のことです。 XML 処理命令は、InCopy では無視されますが、他のアプリケーションで
使用するために InCopy の XML 構造に挿入することができます。 XML ドキュメントには複数の処理命令を含め
ることができます。
<?xml-stylesheet type="text/css" href="generic.css"?>
XML 処理命令を追加する方法を、次のスクリプトに示します(完全なスクリプトについては、 var myRootXMLElement = myDocument.xmlElements.item(0);
var myXMLProcessingInstruction = myRootXMLElement.xmlInstructions.add("xml-stylesheet type=¥"text/css¥" ", "href=¥"generic.css¥"");
XML 属性の操作
次のスクリプトに示します。 XML 要素には任意の数の XML 属性を追加できますが、各属性の名前はその要素
内で固有のものであることが必要です(例えば、「id」という名前の属性を 2 つ使用することはできません)。
XML 要素に XML 属性を追加する方法を、次のスクリプトに示します(完全なスクリプトについては、 var myDocument = app.documents.item(0);
var myRootXMLElement = myDocument.xmlElements.item(0);
var myXMLElementB = myRootXMLElement.xmlElements.item(1);
myXMLElementB.xmlAttributes.add("example_attribute", "This is an XML attribute. It will not appear in the layout!");
スクリプトを使用して属性を直接作成する以外に、XML 要素を変換して属性を作成することもできます。 こ
れを行うと、XML 要素のテキスト内容が XML 属性の値として使用され、XML 要素の親に追加されます。 XML
要素の名前が属性の名前になるので、同じ名前を持つ属性が XML 要素の親に既に存在している場合は、作成
に失敗します。 XML 要素にページアイテムが含まれている場合、それらのページアイテムはレイアウトから
削除されます。
は、XML 属性の親の先頭または末尾に追加できます。 デフォルトでは、親要素の先頭に追加されます。
第 11 章 XML ストーリーへの XML 要素の追加 92
新しい XML 要素に XML マークアップタグを指定することもできます。 このパラメーターを省略すると、その
XML 属性が含まれている XML 要素と同じ XML タグを使用して新しい XML 要素が作成されます。
XML 要素を XML 属性に変換する方法を、次のスクリプトに示します(完全なスクリプトについては、 var myDocument = app.documents.add();
var myRootXMLElement = myDocument.xmlElements.item(0);
var myXMLTag = myDocument.xmlTags.add("myXMLElement");
var myXMLElement = myRootXMLElement.xmlElements.add(myXMLTag);
myXMLElement.contents = "This is content in an XML element.";
myXMLElement.convertToAttribute();
//Place the XML content so that you can see the result of the change.
var myStory = myDocument.stories.item(0);
myStory.placeXML(myRootXMLElement);
XML 属性を XML 要素に変換することもできます。次のスクリプトにその例を示します(チュートリアルスク
リプトの ConvertAttributeToElement より)。 var myRootXMLElement = myDocument.xmlElements.item(0);
var myXMLElementB = myRootXMLElement.xmlElements.item(1);
//The "at" parameter can be either LocationOptions.atEnd or LocationOptions.atBeginning, but cannot
//be LocationOptions.after or LocationOptions.before.
myXMLElementB.xmlAttributes.item(0).convertToElement(XMLElementLocation.elementEnd, myDocument.xmlTags.item("myXMLElement"));
XML ストーリーの操作
レイアウト要素(ストーリーまたはページアイテム)に関連付けられていない XML 要素を読み込むと、その
要素は XML ストーリーに格納されます。 テキストフレーム内のテキストと同じように、配置されていない
については、XMLStory を参照してください)。 var myXMLStory = myDocument.xmlStories.item(0);
//Though the text has not yet been placed in the layout, all text
//properties are available.
myXMLStory.texts.item(0).pointSize = 72;
//Place the XML element in the layout to see the result.
myDocument.xmlElements.item(0).xmlElements.item(0).placeXML(myDocument.pages.item(0).textFrames.
item(0));
XML の書き出し
InCopy ドキュメントから XML を書き出す方法としては、ドキュメント内の XML 構造全体を書き出す方法と、
プトにその例を示します(完全なスクリプトについては、ExportXML を参照してください)。 myDocument.exportFile("XML", File("/c/test.xml")
ストーリーへの XML 要素の追加
これまでの節では、XML データを InCopy ドキュメントに読み込んで、ドキュメント内の XML 構造を操作す
る方法について説明しました。 この節では、XML 情報をストーリーに読み込んでフォーマットを行う方法に
ついて説明します。
第 11 章 XML ストーリーへの XML 要素の追加 93
XML 要素とテキストとの関連付け
テキストに既存の XML 要素を関連付けるには、 placeXML
メソッドを使用します。
と、ページアイテムの内容が XML 要素の内容に置き換わります。次のスクリプトにその例を示します
(チュートリアルスクリプトの PlaceXML より)。 myDocument.stories.item(0).placeXML(xmlElements.item(0);
既存のテキストオブジェクトに既存の XML 要素を関連付けるには、 markup
メソッドを使用します。
ソッドを使用すると、テキストオブジェクトの内容と XML 要素の内容(存在する場合)が結合されます。 markup
メソッドを使用する方法を、次のスクリプトに示します(完全なスクリプトについては、Markup を
参照してください)。 var myDocument = app.documents.add();
var myRootXMLElement = myDocument.xmlElements.item(0);
var myStory = myDocument.stories.item(0);
myStory.placeXML(myRootXMLElement);
myString = "This is the first paragraph in the story.¥r";
myString += "This is the second paragraph in the story.¥r";
myString += "This is the third paragraph in the story.¥r";
myString += "This is the fourth paragraph in the story.¥r";
myStory.contents = myString;
var myXMLTag = myDocument.xmlTags.add("myXMLlement");
var myXMLElement = myRootXMLElement.xmlElements.add(myXMLTag);
myStory.paragraphs.item(2).markup(myXMLElement);
XML テキスト要素の内部や周囲へのテキストの挿入
や「住所」などのラベル)を XML 要素のテキストに追加したいことがあります。 XML 要素の内部や周囲にテ
キストを追加する方法を、次のサンプルスクリプトに示します(完全なスクリプトについては、 var myXMLElement = myDocument.xmlElements.item(0).xmlElements.item(0);
//By inserting the return character after the XML element, the character
//becomes part of the content of the parent XML element, not of the element itself.
myXMLElement.insertTextAsContent("¥r", XMLElementPosition.afterElement);
myXMLElement = myDocument.xmlElements.item(0).xmlElements.item(1);
myXMLElement.insertTextAsContent("Static text: ", XMLElementPosition.beforeElement);
myXMLElement.insertTextAsContent("¥r", XMLElementPosition.afterElement);
//To add text inside the element, set the location option to beginning or end.
myXMLElement = myDocument.xmlElements.item(0).xmlElements.item(2);
myXMLElement.insertTextAsContent("Text at the start of the element: ",
XMLElementPosition.elementStart);
myXMLElement.insertTextAsContent(" Text at the end of the element.",
XMLElementPosition.elementEnd);
myXMLElement.insertTextAsContent("¥r", XMLElementPosition.afterElement);
//Add static text outside the element.
myXMLElement = myDocument.xmlElements.item(0).xmlElements.item(3);
myXMLElement.insertTextAsContent("Text before the element: ", XMLElementPosition.beforeElement);
myXMLElement.insertTextAsContent(" Text after the element.", XMLElementPosition.afterElement);
//To insert text inside the text of an element, work with the text
//objects contained by the element.
myXMLElement.words.item(2).insertionPoints.item(0).contents = "(the third word of) ";
スタイルへのタグのマッピング
XML テキスト要素にフォーマットを適用する最も簡単な方法の 1 つが、 xmlImportMaps
を使用してタグをス
タイルにマッピングする方法です。 この方法では、特定の XML タグを段落スタイルや文字スタイルに関連付
けることができます。 ドキュメントの mapTagsToStyles
メソッドを使用すると、テキストにスタイルが適用
されます。次のスクリプトにその例を示します(チュートリアルスクリプトの MapTagsToStyles より)。
第 11 章 XML ストーリーへの XML 要素の追加 94 var myDocument = app.documents.item(0);
//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"), myDocument.paragraphStyles.item("para 1"));
myDocument.xmlImportMaps.add(myDocument.xmlTags.item("body_text"), myDocument.paragraphStyles.item("body text"));
//Apply the tag to style mapping.
myDocument.mapXMLTagsToStyles();
//Place the XML element in the layout to see the result.
myDocument.stories.item(0).placeXML(myDocument.xmlElements.item(0));
タグへのスタイルのマッピング
XML 要素が関連付けられていないフォーマットされたテキストを XML 構造に移動したい場合は、スタイルを
タグにマッピングします。これによって、段落スタイルや文字スタイルを XML タグに関連付けることができ
ます。 これを行うには、 xmlExportMaps
オブジェクトを使用して、XML タグとスタイルの間にリンクを作成
し、 mapStylesToTags
メソッドを使用して該当する XML 要素を作成します。次のスクリプトにその例を示し
ます(チュートリアルスクリプトの MapStylesToTags より)。 var myDocument = app.documents.item(0);
//Create a style to tag 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"));
//Apply the style to tag mapping.
myDocument.mapStylesToXMLTags();
別の方法としては、単純に、ドキュメント内のすべての段落スタイルや文字スタイルに対して新しい XML タ
グを作成して、スタイルをタグにマッピングする方法があります。次のスクリプトにその例を示します
(チュートリアルスクリプトの MapAllStylesToTags より)。 var myDocument = app.documents.item(0);
//Create tags that match the style names in the document,
//creating an XMLExportMap for each tag/style pair.
for(var myCounter = 0; myCounter<myDocument.paragraphStyles.length; myCounter++){
var myParagraphStyle = myDocument.paragraphStyles.item(myCounter);
var myParagraphStyleName = myParagraphStyle.name;
var myXMLTagName = myParagraphStyleName.replace(/¥ /gi, "_")
myXMLTagName = myXMLTagName.replace(/¥[/gi, "")
myXMLTagName = myXMLTagName.replace(/¥]/gi, "")
var myXMLTag = myDocument.xmlTags.add(myXMLTagName);
myDocument.xmlExportMaps.add(myParagraphStyle, myXMLTag);
}
//Apply the tag to style mapping.
myDocument.mapStylesToXMLTags();
XML 要素へのスタイルの適用
タグとスタイルをマッピングしたり、XML 要素が関連付けられているテキストやページアイテムにスタイル
を適用したりする以外に、XML 要素にスタイルを直接適用することもできます。 applyParagraphStyle
およ
び applyCharacterStyle
メソッドを使用する方法を、次のスクリプトに示します (完全なスクリプトについ
ては、ApplyStylesToXMLElements を参照してください)。
第 11 章 XML ストーリーへの XML 要素の追加 95 var myDocument = app.documents.add();
myDocument.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.points;
myDocument.viewPreferences.verticalMeasurementUnits = MeasurementUnits.points;
//Create a series of XML tags.
var myHeading1XMLTag = myDocument.xmlTags.add("heading_1");
var myHeading2XMLTag = myDocument.xmlTags.add("heading_2");
var myPara1XMLTag = myDocument.xmlTags.add("para_1");
var myBodyTextXMLTag = myDocument.xmlTags.add("body_text");
//Create a series of paragraph styles.
var myHeading1Style = myDocument.paragraphStyles.add();
myHeading1Style.name = "heading 1";
myHeading1Style.pointSize = 24;
var myHeading2Style = myDocument.paragraphStyles.add();
myHeading2Style.name = "heading 2";
myHeading2Style.pointSize = 14;
myHeading2Style.spaceBefore = 12;
var myPara1Style = myDocument.paragraphStyles.add();
myPara1Style.name = "para 1";
myPara1Style.pointSize = 12;
myPara1Style.firstLineIndent = 0;
var myBodyTextStyle = myDocument.paragraphStyles.add();
myBodyTextStyle.name = "body text";
myBodyTextStyle.pointSize = 12;
myBodyTextStyle.firstLineIndent = 24;
//Create a character style.
var myCharacterStyle = myDocument.characterStyles.add();
myCharacterStyle.name = "Emphasis";
myCharacterStyle.fontStyle = "Italic";
//Add XML elements and apply paragraph styles.
var myRootXMLElement = myDocument.xmlElements.item(0);
var myXMLElementA = myRootXMLElement.xmlElements.add(myHeading1XMLTag);
myXMLElementA.contents = "Heading 1";
myXMLElementA.insertTextAsContent("¥r", XMLElementPosition.afterElement);
myXMLElementA.applyParagraphStyle(myHeading1Style, true);
var myXMLElementB = myRootXMLElement.xmlElements.add(myPara1XMLTag);
myXMLElementB.contents = "This is the first paragraph in the article.";
myXMLElementB.insertTextAsContent("¥r", XMLElementPosition.afterElement);
myXMLElementB.applyParagraphStyle(myPara1Style, true);
var myXMLElementC = myRootXMLElement.xmlElements.add(myBodyTextXMLTag);
myXMLElementC.contents = "This is the second paragraph in the article.";
myXMLElementC.insertTextAsContent("¥r", XMLElementPosition.afterElement);
myXMLElementC.applyParagraphStyle(myBodyTextStyle, true);
var myXMLElementD = myRootXMLElement.xmlElements.add(myHeading2XMLTag);
myXMLElementD.contents = "Heading 2";
myXMLElementD.insertTextAsContent("¥r", XMLElementPosition.afterElement);
myXMLElementD.applyParagraphStyle(myHeading2Style, true);
var myXMLElementE = myRootXMLElement.xmlElements.add(myPara1XMLTag);
myXMLElementE.contents = "This is the first paragraph following the subhead.";
myXMLElementE.insertTextAsContent("¥r", XMLElementPosition.afterElement);
myXMLElementE.applyParagraphStyle(myPara1Style, true);
var myXMLElementF = myRootXMLElement.xmlElements.add(myBodyTextXMLTag);
myXMLElementF.contents = "This is the second paragraph following the subhead.";
myXMLElementF.insertTextAsContent("¥r", XMLElementPosition.afterElement);
myXMLElementF.applyParagraphStyle(myBodyTextStyle, true);
var myXMLElementG = myRootXMLElement.xmlElements.add(myBodyTextXMLTag);
myXMLElementG.contents = "Note:";
myXMLElementG = myXMLElementG.move(LocationOptions.atBeginning, myXMLElementF)
myXMLElementG.insertTextAsContent(" ", XMLElementPosition.afterElement);
myXMLElementG.applyCharacterStyle(myCharacterStyle, true);
// Associate the root XML element with the story.
myDocument.stories.item(0).placeXML(myRootXMLElement);
第 11 章 XML ストーリーへの XML 要素の追加 96
XML 表の操作
HTML 標準の表タグでデータがマークアップされている場合、InCopy はその XML データを自動的に表セルに
読み込みます。 デフォルトの表マークアップを使用できないか、使用を避けたい場合は、 convertElementToTable
メソッドを使用して XML 要素を表に変換できます。
このメソッドを使用するには、表に変換する XML 要素が特定の構造になっている必要があります。 表の各行
が特定の XML 要素に対応しており、その要素の中に、行内の各セルに対応する一連の XML 要素が含まれてい
る必要があります。 このメソッドを使用する方法を、次のスクリプトに示します(完全なスクリプトについ
ては、ConvertXMLElementToTable を参照してください)。 テーブル行を表すために使用されている XML 要素
は、このプロセスによって変換されます。 var myDocument = app.documents.add();
//Create a series of XML tags.
var myRowTag = myDocument.xmlTags.add("row");
var myCellTag = myDocument.xmlTags.add("cell");
var myTableTag = myDocument.xmlTags.add("table");
//Add XML elements.
var myRootXMLElement = myDocument.xmlElements.item(0);
with(myRootXMLElement){
var myTableXMLElement = xmlElements.add(myTableTag);
with(myTableXMLElement){
for(var myRowCounter = 1;myRowCounter < 7;myRowCounter++){
with(xmlElements.add(myRowTag)){
myString = "Row " + myRowCounter;
for(var myCellCounter = 1; myCellCounter < 5; myCellCounter++){
with(xmlElements.add(myCellTag)){
contents = myString + ":Cell " + myCellCounter;
}
}
}
}
}
}
var myTable = myTableXMLElement.convertElementToTable(myRowTag, myCellTag);
var myStory = myDocument.stories.item(0);
myStory.placeXML(myDocument.xmlElements.item(0));
XML 要素で構成されている表では、XML 要素に関連付けられている表やセルにスタイルを適用するのではな
く、XML 要素に表スタイルやセルスタイルを直接適用することができます。 これを行うには、 applyTableStyle
メソッドや applyCellStyle
メソッドを使用します。次のスクリプトにその例を示します
(チュートリアルスクリプトの ApplyTableStyle より)。 var myDocument = app.documents.add();
//Create a series of XML tags.
var myRowTag = myDocument.xmlTags.add("row");
var myCellTag = myDocument.xmlTags.add("cell");
var myTableTag = myDocument.xmlTags.add("table");
//Create a table style and a cell style.
var myTableStyle = myDocument.tableStyles.add({name:"myTableStyle"});
myTableStyle.startRowFillColor = myDocument.colors.item("Black");
myTableStyle.startRowFillTint = 25;
myTableStyle.endRowFillColor = myDocument.colors.item("Black");
myTableStyle.endRowFillTint = 10;
var myCellStyle = myDocument.cellStyles.add();
myCellStyle.fillColor = myDocument.colors.item("Black");
myCellStyle.fillTint = 45
//Add XML elements.
var myRootXMLElement = myDocument.xmlElements.item(0);
with(myRootXMLElement){
var myTableXMLElement = xmlElements.add(myTableTag);
with(myTableXMLElement){
for(var myRowCounter = 1;myRowCounter < 7;myRowCounter++){
with(xmlElements.add(myRowTag)){
第 11 章 XML ストーリーへの XML 要素の追加 97 myString = "Row " + myRowCounter;
for(var myCellCounter = 1; myCellCounter < 5; myCellCounter++){
with(xmlElements.add(myCellTag)){
contents = myString + ":Cell " + myCellCounter;
}
}
}
}
}
}
var myTable = myTableXMLElement.convertElementToTable(myRowTag, myCellTag);
var myTableXMLElement = myDocument.xmlElements.item(0).xmlElements.item(0);
myTableXMLElement.applyTableStyle(myTableStyle);
myTableXMLElement.xmlElements.item(0).applyCellStyle(myCellStyle);
myTableXMLElement.xmlElements.item(5).applyCellStyle(myCellStyle);
myTableXMLElement.xmlElements.item(10).applyCellStyle(myCellStyle);
myTableXMLElement.xmlElements.item(15).applyCellStyle(myCellStyle);
myTableXMLElement.xmlElements.item(16).applyCellStyle(myCellStyle);
myTableXMLElement.xmlElements.item(21).applyCellStyle(myCellStyle);
myDocument.stories.item(0).placeXML(myDocument.xmlElements.item(0));
myTable.alternatingFills = AlternatingFillsTypes.alternatingRows;
Download
Advertisement
Key features
Automate tasks like adding and formatting text, searching and replacing text, adding annotations, printing and exporting documents
Create scripts to manage and manipulate InCopy documents
Customize menus and add menu items
Create dialog boxes, panels, and other user interface elements
Respond to events in the user interface
Work with XML data
Communicate with other applications
Extend the capabilities of InCopy
Frequently asked questions
InCopy CS6 is a collaborative text editing application that works seamlessly with Adobe InDesign, allowing multiple users to work on the same document simultaneously. It is designed to simplify and enhance the workflow for editors, writers, and others involved in the publishing process.
You can create scripts to automate a wide range of tasks, including adding and formatting text, searching and replacing text, adding annotations, printing and exporting documents. You can also create custom user interface elements like dialog boxes and panels, and respond to events in the user interface. It opens up possibilities for extending InCopy's functionality and integrating it with other applications.
You can access scripts through the Script Panel (Window > Scripts). You can either double-click a script to run it or edit it by pressing Option (Mac OS) or Alt (Windows) while double-clicking. You can also add keyboard shortcuts to scripts through the Edit > Keyboard Shortcuts menu.