サンプル スクリプト

FrameScript がどのようなものかご理解いただく為に、簡単なサンプル スクリプトを紹介いたします。

  • 制御 : 一般的なスクリプト言語と同じく、スクリプト中で条件分岐したり制御を行ったりする、Loop や If-Then-Else のような制御コマンドがあります。
  • 変数と型 : FrameScript の変数は型を定義せず(宣言せず)に用いることができます。変数は使用したときに生成され、その初期値は整数型のゼロです。変数にはどんな型の値も割り当てることができ、すでに値が割り当てられている変数に、その値とは違う型の値を割り当てることもできます。
    また、変数の一般的なデータ型には、整数型、実数型、文字列型があります。また、これらのデータ型の集合型として、整数リスト、実数リスト、文字列リストがあります。更に、Adobe® FrameMaker® に特徴的なデータ型としては、サイズを扱う Metric 型、テキストの位置を扱う TextLoc 型、テキストの範囲を扱う TextRange 型、 FrameMaker のオブジェクトを扱う Object 型などがあります。
  • ドキュメントの操作 : FrameMaker 文書やブックを生成したり、保存したり、開いたり、閉じたりするコマンドがあります。
  • オブジェクトの操作 : FrameMaker の各種オブジェクト(表、アンカー枠、変数、マーカーなど)を生成したり削除したりすることができます。また、FrameMaker のオブジェクトのプロパティの値を設定することも出来ます。
  • イベント処理 : FrameScript は、FrameMaker の各種イベントに応じて動作を行うことのできるコマンドがあります。イベントには、文書が閉じられた時、FrameMaker が終了する時など、約 30 ものイベントがあります。
  • サンプルコード : 製品には 30 数種類のサンプルコードが付属しています。スクリプティングの学習はもとより、これらのサンプルコードを元に、あなた独自の新しいスクリプトを生み出して行くことが可能です。

【ご注意】製品紹介内の製品パッケージはイメージ画像です。本製品は実際にはお客様にてダウンロードしていただきお届けする形式となっており、パッケージなどは含まれません。

Adobe、FrameMakerは、Adobe Systems Incorporated(アドビシステムズ社)の商標です。



■SAMPLE 1

次のスクリプトは新しいメニューおよびコマンドを作成し、イベント処理を追加しています。
ユーザがメニューのコマンドを選択すると、メッセージを表示します。

// メニューに 'My Menu' を追加。
New Menu Label('My Menu') NewVar(mymenuobj) Addto('!MakerMainMenu');
// 'My Menu' メニューに 'My Command' コマンドを追加。
New Command name('MyCommand') Addto(mymenuobj) EventProc(myMenuEvent) label('My Command');

・・・

// メニューが選択された際のイベント処理
Event myMenuEvent
	// メッセージボックスの表示
	MsgBox '[My Command]が選択されました';
EndEvent

■SAMPLE 2

文書内の全ての文字書式名をコンソールに書き出すスクリプトです。ドキュメントの要素をループ処理しています。

//文字書式名を保存するリストを初期化
New StringList NewVar(CharFmtNameList);

//文書中の文字書式をループ処理し、名前をリストに追加
LOOP ForEach(CharFmt) In(ActiveDoc) LoopVar(CharVar)
	SET CurrCharFmt = CharVar.Name;
	Add Member(CurrCharFmt) To(CharFmtNameList);
ENDLOOP

//取得した文字書式名のリストをソート
Sort List(CharFmtNameList);

//コンソールに出力
WRITE console CharFmtNameList;

■SAMPLE 3

文書内の全てのマスタページ名をコンソールに書き出すスクリプトです。
併せて、現在のドキュメント名とマスターページの数を出力しています。

SET Master_count = 0;
WRITE console ActiveDoc.Name;

//文書中のマスターページをループ処理。名前をコンソールに出力、また同時にマスターページ数をカウント
LOOP ForEach(MasterPage) In(ActiveDoc) LoopVar(Master_var)
	WRITE console Master_var.Name;
	Master_count = Master_count + 1;
ENDLOOP

WRITE console 'マスタページの数:' + Master_count;

■Sample 4

すべての段落のテキストにデフォルトフォントを適用します。

LOOP ForEach (Pgf) In(ActiveDoc) LoopVar(pgfobj)
	SET pageId = pgfobj.Page;
	IF pageId not = 0
		IF pageId.objectname = 'BodyPage'
			TextSelection = pgfobj.TextRange;
			Execute Fc TxtDefault;
		EndIF
	EndIF
ENDLOOP

■Sample 5

もうすこし実用的なサンプルを紹介します。
次のスクリプトは、FrameMaker 上に作成した検索・置換リストを元に、対象ファイル内のテキストを一括検索・置換するスクリプトです。使用方法は下記の通りです。簡単なスクリプトですが、基本的なスクリプトの組み立て方をみていただけると思います。

> STEP 1

FrameMaker 上に作成した検索・置換リストを作成し、選択します。タブ区切りで左列が検索対象。右列が置換文字列です(改行の前にもタブが入っていますが、実装を簡略化するための仕様ですので、ご容赦ください)。

> STEP 2

FrameMaker 上の検索・置換リストを選択してスクリプトを実行すると、ファイル選択ダイアログが表示されます。検索・置換対象のファイルを指定して、 [開く] ボタンを押下します。

> STEP 3

選択したファイルが開かれ、一括検索・置換の実行の確認が表示されます。

> STEP 4

[はい] を押下すると、検索・置換リストの内容に沿った検索・置換処理が行われ、スクリプトが終了します。

//文書がアクティブかどうかの判定
IF ActiveDoc = 0
	MsgBox '文書を選択して下さい。';
	LeaveSub;
EndIF

//======== 検索・置換リストをリストに取り込む ========

//選択したテキストを取得
SET vText = TextSelection.TEXT;

//選択したテキストのフォーマットの検査
SET vTextCount = vText.count;
Get String FromString(vText) StartPos(vTextCount) EndPos(vTextCount) NewVar(vGetEndText);
IF vGetEndText not= CHARTAB;
	MsgBox 'リストの書式が正確でないか、テキストが選択されていません。スクリプトを中止します。';
	LeaveSub;
ENDIF

//リスト変数の定義
New StringList NewVar(vList1);
New StringList NewVar(vList2);

Loop While(vText)
	//選択テキストからテキストを抽出し、リスト1に追加
	Find String(CHARTAB) InString(vText) ReturnPos(vPos) ReturnStatus(vFound);
	SET vEndPos = vPos - 1;
	Get String FromString(vText) StartPos(1) EndPos(vEndPos) NewVar(vGetText1);
	Add Member(vGetText1) To(vList1);
	//抽出したテキストを変数から削除
	SET vStartPos = vPos + 1;
	Get String FromString(vText) StartPos(vStartPos) NewVar(vText);
	//選択テキストからテキストを抽出、2に追加
	Find String(CHARTAB) InString(vText) ReturnPos(vPos) ReturnStatus(vFound);
	SET vEndPos = vPos - 1;
	Get String FromString(vText) StartPos(1) EndPos(vEndPos) NewVar(vGetText2);
	Add Member(vGetText2) To(vList2);
	//抽出したテキストを変数から削除
	SET vStartPos = vPos + 1;
	Get String FromString(vText) StartPos(vStartPos) NewVar(vText);
	//タブしか残っていない場合、Whileを抜けるようvTextを0に
	If vText = CHARTAB
		vText = 0;
	EndIF
EndLoop

//リスト数の不一致を判定
SET Alpha_List_count1 = vList1.count;
SET Alpha_List_count2 = vList2.count;
IF Alpha_List_count1 not= Alpha_List_count2
	MsgBox 'リストの数が一致していません。';
	LeaveSub;
ENDIF

//======== 検索・置換の対象ファイルを開く ========

//検索置換対照となる文書の選択
DialogBox Type(Choosefile) Title(' ファイル名を選択してください ')
Mode(OpenFile) Button(buttonvar)
NewVar(vTargetFileName) Init('*.fm');
if buttonvar = CancelBUTTON
	LEAVESUB;
EndIf

//対照となる文書を開く
Open Document File (vTargetFileName) NewVar(vTargetFile);
ActiveDoc = vTargetFile;

//確認ダイアログボックスの表示
MsgBOX 'リストによる一括検索・置換を始めますか?'
MODE(YesNo) Button(btnVar);
IF btnVar = NoBUTTON
	LEAVESUB;
ENDIF

//======== 検索・置換の実行 ========

LOOP While(lpindex <= Alpha_List_count1) LoopVar(lpindex) Init(1) Incr(1)
	//検索テキストの取得
	Get Member Number(lpindex) From(vList1) NewVar(vList1_Text);
	//置換する番号の計算
	Get Member Number(lpindex) From(vList2) NewVar(vList2_Text);

	SET text_found=1;
	Loop While(text_found)
		Find FromTextLoc
			String(vList1_Text) ReturnStatus(text_found);
		IF text_found
			//置換
			SET TextSelection.Text = vList2_Text;
			SET vNumCount = vNumCount + 1;
		EndIF
	EndLoop
EndLoop

//結果の表示
MsgBOX vNumCount + '個検索置換しました。';

 

FrameScript に関するお問合せは: