Hatena::ブログ(Diary)

名もないテクノ手 このページをアンテナに追加 RSSフィード Twitter

EPUB版『InDesign者のための正規表現入門』

InDesignのTips一覧

2009-07-21

[][][]段落スタイルを記憶して任意のストーリに適用する「set_paragraphStyle 0.3」

何をするスクリプトか?

任意のテキストフレームから段落スタイルの順序を読み取り、異なるテキストフレームに適用します。同じ段落スタイルがいくつ続いてもOKです。設定よりも適用段落数が多い場合は、設定を何度でも繰り返し適用します。実際の処理には、テキストフレームの親ストーリーの各段落を処理しますので、テキストリンクしているテキストフレームでも適用可能です。

D


同梱ファイル3Files

  • README.txt このファイルです。とにかく最初によんでください。
  • ParagraphStyles_GET.jsx 段落スタイルを取得し、設定を記憶するスクリプトです。
  • ParagraphStyles_SET.jsx 設定を読み込み、段落スタイルを適用するスクリプトです。
  • [config.txt] 自動生成される設定用テキストです。

動作環境

このスクリプトが正常に動作する環境は以下の通りです。Windows環境でも動作する可能性がありますが、動作確認はしていません。


ダウンロード

http://www.seuzo.jp/st/scripts_InDesignCS4/index.html#set_paragraphStyle


インストール

スクリプト本体(ParagraphStyles_GET.jsxとParagraphStyles_SET.jsx)を

~/Library/Preferences/Adobe InDesign/Version 6.0-J/ja_JP/Scripts/Scripts Panel/

にコピーしてください。エイリアスを入れておくだけでもかまいません。

スクリプトパレットから使用します。


使用方法

  1. 「ウインドウ」メニューから「スクリプティング」ー「スクリプト」を選択し、スクリプトパレットを出します。
  2. 元となる段落スタイルを含んだテキストフレームをひとつだけ選択します。
  3. スクリプトパレットから、スクリプト「ParagraphStyles_GET.jsx」をダブルクリックします。
  4. 設定確認ダイアログが出現します。よければOKをクリックしてください。
  5. 適用したいテキストフレームを選択してください(複数可)。
  6. スクリプトパレットから、スクリプト「ParagraphStyles_SET.jsx」をダブルクリックします。
  7. 設定確認ダイアログが出現します。よければOKをクリックしてください。
  8. テキストフレームにそれぞれの段落スタイルが適用されたのを確認してください。

既知の不具合、またはToDo、あるいは仕様

  • テキストフレーム中に表組みがあったとしても、表のついてはサポートしていません。


免責事項

  • 本アプリケーションはInDesignにおける作業効率支援なのであって、処理結果を保証するものではありません。かならず確認をされることをおすすめします。
  • このツールを使用する上でデータの破損などのあらゆる不具合・不利益については一切の責任を負いかねますのでご了解ください。
  • このツールはすべてのMacintoshMac OS上で動作をするという確認をとっていませんし、事実上出来ません。したがって、動作を保証するものではありません。

ライセンス

GNU GPLv3

http://sourceforge.jp/projects/opensource/wiki/licenses%252FGNU_General_Public_License_version_3.0


履 歴

2009-06-29 var.0.1 まだおうち使い用

2009-07-05 ver.0.2 選択しているテキストフレームの親ストーリ全体を処理対象とした。http://d.hatena.ne.jp/seuzo/20090710/1247201358

2009-07-21 ver.0.3 段落スタイルグループに対応した。config.txt内の設定段落数よりも適用段落数が多い場合、設定を繰り返すようにした。公開バージョン


ソースコード

ParagraphStyles_GET.jsx
/*
ParagaraphStyles_GET.jsx
段落スタイルを取得してテキストに書き出す

2009-06-29	var.0.1	まだおうち使い用
2009-07-05	ver.0.2	選択しているテキストフレームの親ストーリ全体を処理対象とした。http://d.hatena.ne.jp/seuzo/20090710/1247201358
2009-07-21	ver.0.3	段落スタイルグループに対応した。config.txt内の設定段落数よりも適用段落数が多い場合、設定を繰り返すようにした。公開バージョン
*/

////////////////////////////////////////////エラー終了
function my_error(mess) {
	if (mess !== "") {alert (mess)}
	exit();
}

////////////////////////////////////////////paragraphStyleオブジェクトを渡して、グループを含めたフル段落スタイル名を再帰的に得る
function paragraphStyle2str (my_paragraphStyle, str) {
	if (my_paragraphStyle instanceof ParagraphStyle) {//渡されたものがParagraphStyleだったら、その名前をstrに入れる
		str = my_paragraphStyle.name;
	}
	if (my_paragraphStyle.parent instanceof Document) {
		return str ;
	} else if  (my_paragraphStyle.parent instanceof ParagraphStyleGroup) {
		str = my_paragraphStyle.parent.name + "\t" + str;
		return paragraphStyle2str(my_paragraphStyle.parent, str);
	} 
}

////////////////////////////////////////////カレントスクリプトのフルパスを得る 
function get_my_script_path() {
	try {
		return  app.activeScript;
	} catch (myError) {
		return File (myError.fileName);
	}
}

////////////////////////////////////////////データをファイルに書き込む 
function write_file(my_write_file_path, my_data) {
	var my_file_obj = new File(my_write_file_path);
	//if (!(my_file_obj.exists)) {myerror("ファイルがありません\n" + my_write_file_path)};
	if(my_file_obj.open("w")) {
		my_file_obj.write(my_data);
		my_file_obj.close();
	} else {
		myerror("ファイルが開けません\n" + my_write_file_path);
	}
}



////////////////////////////////////////////実行
//選択しているもののチェック
if (app.documents.length === 0) {my_error("ドキュメントが開かれていません");};
var my_doc = app.activeDocument;
if(my_doc.selection.length !== 1){my_error("テキストフレームをひとつ選択してください")};
var my_selection = app.selection[0];
if((my_selection instanceof TextFrame) !== true) {my_error("テキストフレームを選択してください")};

var my_data = "";//書出しデータ
var my_story =my_selection.parentStory ;
for ( var i =0;i< my_story.paragraphs.length; i++) {
	my_data += paragraphStyle2str(my_story.paragraphs[i].appliedParagraphStyle, "") + "\n";
}
var my_ans = confirm ("下記のとおり設定します。実行しますか?\n" + my_data.replace(/\t/g, "::"));
if (my_ans === false) {my_error("")};

var my_activescript_path = get_my_script_path();
var my_activescript_folder = File(my_activescript_path).parent;
var my_config_path = my_activescript_folder + "/config.txt";
write_file(my_config_path, my_data);
ParagraphStyles_SET.jsx
/*
ParagaraphStyles_SET.jsx
テキストから段落スタイルを取得して適用する

2009-06-29	var.0.1	まだおうち使い用
2009-07-05	ver.0.2	選択しているテキストフレームの親ストーリ全体を処理対象とした。http://d.hatena.ne.jp/seuzo/20090710/1247201358
2009-07-21	ver.0.3	段落スタイルグループに対応した。config.txt内の設定段落数よりも適用段落数が多い場合、設定を繰り返すようにした。公開バージョン
*/

////////////////////////////////////////////エラー終了
function my_error(mess) {
	if (mess !== "") {alert (mess)}
	exit();
}


////////////////////////////////////////////カレントスクリプトのフルパスを得る 
function get_my_script_path() {
	try {
		return  app.activeScript;
	} catch (myError) {
		return File (myError.fileName);
	}
}

////////////////////////////////////////////ファイルの内容を読み込んで返す 
function read_file(my_read_file_path) {
	var my_file_obj = new File(my_read_file_path);
	if (!(my_file_obj.exists)) {myerror("ファイルがありません\n" + my_read_file_path)};
	if(my_file_obj.open("r")) {
		var tmp_str = my_file_obj.read();
		my_file_obj.close();
	} else {
		myerror("ファイルが開けません\n" + my_read_file_path);
	}
	return tmp_str;
}


////////////////////////////////////////////実行
//選択しているもののチェック
if (app.documents.length === 0) {my_error("ドキュメントが開かれていません");};
var my_doc = app.activeDocument;
if(my_doc.selection.length === 0){my_error("テキストフレームを選択してください")};
var my_selection = app.selection;
for (var i = 0;i < my_selection.length;i++) {
	if((my_selection[i] instanceof TextFrame) !== true) {my_error("テキストフレームを選択してください")};
}

//データの読み出し
var my_activescript_path = get_my_script_path();
var my_activescript_folder = File(my_activescript_path).parent;
var my_config_path = my_activescript_folder + "/config.txt";
var my_data = read_file(my_config_path);
my_data = my_data.replace(/[\n\r\s]+$/, "");
var my_ans = confirm ("下記のとおり設定します。実行しますか?\n" + my_data.replace(/\t/g, "::"));
if (my_ans === false) {my_error("")};

//段落スタイル用データのオブジェクト復元と検証
var my_data = my_data.split("\n");
for (var i = 0; i < my_data.length; i++) {
	var tmp_array = my_data[i].split("\t");
	var tmp_paragraphStyle = app.activeDocument;
	for (var ii = 0; ii < tmp_array.length; ii++) {
		if ( ii === (tmp_array.length - 1) ) {//段落スタイル名
			var tmp_obj = tmp_paragraphStyle.paragraphStyles.itemByName(tmp_array[ii]);
			if (tmp_obj.isValid) {//その段落スタイルが存在していれば
				my_data[i] = tmp_obj;
			} else {
				my_error("存在しない段落スタイルが指定されています\n" + tmp_array[ii]);
			}
		} else {//段落スタイルグループ名
			var tmp_obj = tmp_paragraphStyle.paragraphStyleGroups.itemByName(tmp_array[ii]);
			if (tmp_obj.isValid) {//その段落スタイルグループが存在していれば
				tmp_paragraphStyle = tmp_obj;
			} else {
				my_error("存在しない段落スタイルグループが指定されています\n" + tmp_array[ii]);
			}
		}//if
	}//for
}//for
	

//段落スタイルを適用
for (var i = 0;i< my_selection.length;i++){
	var my_story = my_selection[i].parentStory;
	for( var ii = 0;ii< my_story.paragraphs.length;ii++) {
		my_story.paragraphs[ii].appliedParagraphStyle = my_data[(ii % my_data.length)];//my_dataの配列数より適用段落が多い時は、配列内を循環する
	}
}

*1InDesign CS3では動作しません。なぜならInDesign CS3にはオブジェクトに対するisValidプロパティがないからです。設定ファイルを手で書き換える可能性がないならば、この判定を外すことでおそらくInDesign CS3でも動作するはず。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証