[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

(DTPtechNote:1682) [JavaScript][Indesign CS3]num_glyph



選択テキストの数字字形を変更します。
このあいだのセミナーでデモやったやつの完全版(かも)。
処理として選べるのは
"すべてを標準字形にする", 
"すべてを二分字形にする", 
"すべてを三分字形にする", 
"すべてを四分字形にする", 
"2桁だけを二分字形にする", 
"3桁だけを三分字形にする", 
"4桁だけを四分字形にする", 
"2桁を二分字形に、3桁を三分字形にする", 
"2桁を二分字形に、3桁を三分字形、4桁を四分字形にする"

いろいろテストしてみてください。特に不具合がないようなら表に公開します。
全角(FULL_WIDTH_FORM)も必要?
全角数字のグリフって好きじゃないんですよねえ。。。と個人的嗜好。
InDesign CS3でのみ動作します。CS2以前では動きませんし、対応するつもりもありません。


/*
num_glyph.jsx
(c)2007 www.seuzo.jp
選択テキストの数字字形を変更します。
2007.08.08	ver.0.1	AppleScript版プロトタイプ。
2007.09.18	ver.0.2 GUIをつけた。いろいろ処理を選べるようにした。JavaScriptで書き直し。
*/


////////////////////////////////////////////エラー処理 
function myerror(mess) { 
  if (arguments.length > 0) { alert(mess); }
  exit();
}


////////////////////////////////////////////リストダイアログ
/*
myTitle	ダイアログ(バー)のタイトル
myPrompt	メッセージ
myList	ポップアップに展開するリスト

result	選択したリスト番号
*/
function listDialog(myTitle, myPrompt, myList){
	var myTitle, myPrompt, myList;
	var myDialog = app.dialogs.add({name:myTitle,canCancel:true});
	with(myDialog){
		with(dialogColumns.add()){
			// プロンプト
			staticTexts.add({staticLabel:myPrompt});
			with(borderPanels.add()) {
				with(dialogColumns.add()){
					// ポップアップメニュー
					var mySelecteditem = dropdowns.add({stringList:myList, selectedIndex:0});
				}
			}
		}
	}
	// ダイアログボックスを表示
	if(myDialog.show() == true){
		var ans = mySelecteditem.selectedIndex;
		//正常にダイアログを片付ける
		myDialog.destroy();
		//選択したアイテムの番号を返す
		return ans
	} else {
		// ユーザが「キャンセル」をクリックしたので、メモリからダイアログボックスを削除
		myDialog.destroy();
	}
}


////////////////////////////////////////////正規表現検
//正規表現で検索して、ヒットオブジェクトを返すだけ
function my_regex(my_range_obj, my_find_str, my_change_str) {
        //検索の初期化
        app.findGrepPreferences = NothingEnum.nothing;
        app.changeGrepPreferences = NothingEnum.nothing;
        //検索オプション
        app.findChangeGrepOptions.includeLockedLayersForFind = false;//ロックされたレイヤーをふくめるかどうか
        app.findChangeGrepOptions.includeLockedStoriesForFind = false;//ロックされたストーリーを含めるかどうか
        app.findChangeGrepOptions.includeHiddenLayers = false;//非表示レイヤーを含めるかどうか
        app.findChangeGrepOptions.includeMasterPages = false;//マスターページを含めるかどうか
        app.findChangeGrepOptions.includeFootnotes = false;//脚注を含めるかどうか
        app.findChangeGrepOptions.kanaSensitive = true;//カナを区別するかどうか
        app.findChangeGrepOptions.widthSensitive = true;//全角半角を区別するかどうか

        app.findGrepPreferences.findWhat = my_find_str;//検索文字の設定
        //app.changeGrepPreferences.changeTo = my_change_str;//置換文字の設定
        return my_range_obj.findGrep();//検索の実行
}


////////////////////////////////////////////字形の一括変換
/*
my_obj	字形を変更したいテキストオブジェクト
my_gliph	グリフフォーム(ex. AlternateGlyphForms.MONOSPACED_HALF_WIDTH_FORM;//半角字形
*/
function all_glyph_change(my_obj, my_gliph) {
	for (var i = 0; i < my_obj.length; i++) {
		my_obj[i].glyphForm = my_gliph;
	}
}


/////実行
////////////////まずは選択しているもののチェック
if (app.documents.length == 0) {myerror("ドキュメントが開かれていません")}
var mydocument = app.activeDocument;
if (mydocument.selection.length == 0) {myerror("テキストを選択してください")}
var myselection = mydocument.selection[0];
var myclass =myselection.reflect.name;
myclass = "Text, TextColumn, Story, Paragraph, Line, Word, Character".match(myclass);
if (myclass == null) {myerror("テキストを選択してください")}

////////////////処理の選択
var myList = ["すべてを標準字形にする", 
"すべてを二分字形にする", 
"すべてを三分字形にする", 
"すべてを四分字形にする", 
"2桁だけを二分字形にする", 
"3桁だけを三分字形にする", 
"4桁だけを四分字形にする", 
"2桁を二分字形に、3桁を三分字形にする", 
"2桁を二分字形に、3桁を三分字形、4桁を四分字形にする"];
var ans_int = listDialog("num_glyph", "数字の字形を変更します。処理を選択してください?n", myList);
//myList[ans_int];

////////////////検索の実行
var hit_obj = my_regex(myselection, "[0-9]+", "");

if (ans_int == 0) {//すべてを標準字形にする
	all_glyph_change(hit_obj, AlternateGlyphForms.NONE);
} else if (ans_int == 1) {//すべてを二分字形にする
	all_glyph_change(hit_obj, AlternateGlyphForms.MONOSPACED_HALF_WIDTH_FORM);
} else if (ans_int == 2) {//すべてを三分字形にする
	all_glyph_change(hit_obj, AlternateGlyphForms.THIRD_WIDTH_FORM);
} else if (ans_int == 3) {//すべてを四分字形にする
	all_glyph_change(hit_obj, AlternateGlyphForms.QUARTER_WIDTH_FORM);
} else if (ans_int == 4) {//2桁だけを二分字形にする
	for (var i = 0; i < hit_obj.length; i++) {
		if (hit_obj[i].contents.length == 2) {
			hit_obj[i].glyphForm = AlternateGlyphForms.MONOSPACED_HALF_WIDTH_FORM;
		}
	}
} else if (ans_int == 5) {//3桁だけを三分字形にする
	for (var i = 0; i < hit_obj.length; i++) {
		if (hit_obj[i].contents.length == 3) {
			hit_obj[i].glyphForm = AlternateGlyphForms.THIRD_WIDTH_FORM;
		}
	}
} else if (ans_int == 6) {//4桁だけを四分字形にする
	for (var i = 0; i < hit_obj.length; i++) {
		if (hit_obj[i].contents.length == 4) {
			hit_obj[i].glyphForm = AlternateGlyphForms.QUARTER_WIDTH_FORM;
		}
	}
} else if (ans_int == 7) {//2桁を二分字形に、3桁を三分字形にする
	for (var i = 0; i < hit_obj.length; i++) {
		if (hit_obj[i].contents.length == 2) {
			hit_obj[i].glyphForm = AlternateGlyphForms.MONOSPACED_HALF_WIDTH_FORM;
		} else if (hit_obj[i].contents.length == 3) {
			hit_obj[i].glyphForm = AlternateGlyphForms.THIRD_WIDTH_FORM;
		}
	}
} else if (ans_int == 8) {//2桁を二分字形に、3桁を三分字形、4桁を四分字形にする
	for (var i = 0; i < hit_obj.length; i++) {
		if (hit_obj[i].contents.length == 2) {
			hit_obj[i].glyphForm = AlternateGlyphForms.MONOSPACED_HALF_WIDTH_FORM;
		} else if (hit_obj[i].contents.length == 3) {
			hit_obj[i].glyphForm = AlternateGlyphForms.THIRD_WIDTH_FORM;
		} else if (hit_obj[i].contents.length == 4) {
			hit_obj[i].glyphForm = AlternateGlyphForms.QUARTER_WIDTH_FORM;
		}
	}
	
}