Hatena::ブログ(Diary)

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

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

InDesignのTips一覧

2008-09-19

[][][]数字を丸数字などに変換(round_num.jsx)

選択した数字テキストを丸数字なんかに変換するスクリプト、(誰も作ってないようだったので)作ってみました。

いままで入力が面倒だった2桁以上の丸数字が、ほらほら嘘みたいに簡単に!(じがじさんだよ)

●使い方:

1)変換したい数字を選択しておく

f:id:seuzo:20080919224108p:image


2)スクリプトを起動する。

f:id:seuzo:20080919224109p:image


3)ハイ、変換できました。

f:id:seuzo:20080919224110p:image


4)選べるオプションは7つ。

    • 丸数字にする ①
    • 白抜き丸数字にする ❷
    • 四角内数字にする
    • 四角(ラウンド)内数字にする
    • 黒四角内白抜き数字にする
    • 黒四角(ラウンド)内白抜き数字にする
    • 括弧内数字にする

f:id:seuzo:20080919224111p:image


まあ、グリフ置換ですね。いつもながら、テスト不足なので不具合などを見つけた人は教えてください。

では、どうぞ。

/*
round_num.jsx
(c)2008 www.seuzo.jp
選択した数字を丸数字などに変換します。

2008-09-19	ver.0.1	とりあえず
2008-09-20	ver.0.2	2桁以上の選択文字がストーリーの最後にある時、処理が失敗するのを修正した。文字列「111」の最初の「11」を選択しているとき、「⑪⑪」と変換されてしまうのを修正した。
*/

#target "InDesign-5.0"

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


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

result	選択したリスト番号
*/
function radioDialog(my_title, my_prompt, my_list){
	var my_dialog = app.dialogs.add({name:my_title, canCancel:true});
	with(my_dialog) {
		with(dialogColumns.add()) {
			// プロンプト
			staticTexts.add({staticLabel:my_prompt});
			with (borderPanels.add()) {
				var my_radio_group = radiobuttonGroups.add();
				with (my_radio_group) {
					for (var i = 0; i < my_list.length; i++){
						if (i == 0) {
							radiobuttonControls.add({staticLabel:my_list[i], checkedState:true});
						} else {
						radiobuttonControls.add({staticLabel:my_list[i]});
						}
					}
				}
			}
		}
	}


	if (my_dialog.show() == true) {
		var ans = my_radio_group.selectedButton;
		//正常にダイアログを片付ける
		my_dialog.destroy();
		//選択したアイテムの番号を返す
		return ans;
	} else {
		// ユーザが「キャンセル」をクリックしたので、メモリからダイアログボックスを削除
		my_dialog.destroy();
	}
}




/////実行
////////////////まずは選択しているもののチェック
if (app.documents.length == 0) {myerror("ドキュメントが開かれていません")}
var my_doc = app.activeDocument;
if (my_doc.selection.length == 0) {myerror("数字(テキスト)を選択してください")}
var my_selection = my_doc.selection[0];
var my_class =my_selection.reflect.name;
my_class = "Text, TextColumn, Story, Paragraph, Line, Word, Character, TextStyleRange".match(my_class);
if (my_class == null) {myerror("数字(テキスト)を選択してください")}
var my_contents = my_selection.contents;//選択している数字(テキスト)
if (my_contents.match(/^(100|\d\d?)$/) ==null) {myerror("数字(max:100)のみを選択してください")};
var my_font = my_selection.appliedFont;//選択テキストのフォント



////////////////検索前処理
//処理の選択ダイアログ
var myList = ["丸数字にする &#9312;", 
"白抜き丸数字にする &#10103;", 
"四角内数字にする", 
"四角(ラウンド)内数字にする", 
"黒四角内白抜き数字にする", 
"黒四角(ラウンド)内白抜き数字にする", 
"括弧内数字にする"];
var ans_int = radioDialog("round_num", "選択した数字テキストを丸数字などに変換します。処理を選択してください\n", myList);

//CIDテーブルのセット
var my_tbl = new Array();//my_tblはCID番号の配列。0番地から100番地までが「0」〜「100」の字形の対応し、101番地から111番地までが「00」〜「09」の字形の対応している。
if (ans_int == 0) {//丸数字にする &#9312;
	my_tbl = [8224, 7555, 7556, 7557, 7558, 7559, 7560, 7561, 7562, 7563, 7564, 7565, 7566, 7567, 7568, 7569, 7570, 7571, 7572, 7573, 7574, 8091, 8102, 8103, 8104, 8105, 8106, 8107, 8108, 8109, 8110, 8111, 10244, 10245, 10246, 10247, 10248, 10249, 10250, 10251, 10252, 10253, 10254, 10255, 10256, 10257, 10258, 10259, 10260, 10261, 10262, 10263, 10264, 10265, 10266, 10267, 10268, 10269, 10270, 10271, 10272, 10273, 10274, 10275, 10276, 10277, 10278, 10279, 10280, 10281, 10282, 10283, 10284, 10285, 10286, 10287, 10288, 10289, 10290, 10291, 10292, 10293, 10294, 10295, 10296, 10297, 10298, 10299, 10300, 10301, 10302, 10303, 10304, 10305, 10306, 10307, 10308, 10309, 10310, 10311, 10312, 10234, 10235, 10236, 10237, 10238, 10239, 10240, 10241, 10242, 10243];
} else if (ans_int == 1) {//白抜き丸数字にする &#10103;
	my_tbl = [10503, 8286, 8287, 8288, 8289, 8290, 8291, 8292, 8293, 8294, 10514, 10515, 10516, 10517, 10518, 10519, 10520, 10521, 10522, 10523, 10524, 10525, 10526, 10527, 10528, 10529, 10530, 10531, 10532, 10533, 10534, 10535, 10536, 10537, 10538, 10539, 10540, 10541, 10542, 10543, 10544, 10545, 10546, 10547, 10548, 10549, 10550, 10551, 10552, 10553, 10554, 10555, 10556, 10557, 10558, 10559, 10560, 10561, 10562, 10563, 10564, 10565, 10566, 10567, 10568, 10569, 10570, 10571, 10572, 10573, 10574, 10575, 10576, 10577, 10578, 10579, 10580, 10581, 10582, 10583, 10584, 10585, 10586, 10587, 10588, 10589, 10590, 10591, 10592, 10593, 10594, 10595, 10596, 10597, 10598, 10599, 10600, 10601, 10602, 10603, 10604, 10504, 10505, 10506, 10507, 10508, 10509, 10510, 10511, 10512, 10513];
} else if (ans_int == 2) {//四角内数字にする
	my_tbl = [10764, 10766, 10768, 10770, 10772, 10774, 10776, 10778, 10780, 10782, 10784, 10785, 10786, 10787, 10788, 10789, 10790, 10791, 10792, 10793, 10794, 10795, 10796, 10797, 10798, 10799, 10800, 10801, 10802, 10803, 10804, 10805, 10806, 10807, 10808, 10809, 10810, 10811, 10812, 10813, 10814, 10815, 10816, 10817, 10818, 10819, 10820, 10821, 10822, 10823, 10824, 10825, 10826, 10827, 10828, 10829, 10830, 10831, 10832, 10833, 10834, 10835, 10836, 10837, 10838, 10839, 10840, 10841, 10842, 10843, 10844, 10845, 10846, 10847, 10848, 10849, 10850, 10851, 10852, 10853, 10854, 10855, 10856, 10857, 10858, 10859, 10860, 10861, 10862, 10863, 10864, 10865, 10866, 10867, 10868, 10869, 10870, 10871, 10872, 10873, 10874, 10765, 10767, 10769, 10771, 10773, 10775, 10777, 10779, 10781, 10783];
} else if (ans_int == 3) {//四角(ラウンド)内数字にする
	my_tbl = [11307, 11309, 11311, 11313, 11315, 11317, 11319, 11321, 11323, 11325, 11327, 11328, 11329, 11330, 11331, 11332, 11333, 11334, 11335, 11336, 11337, 11338, 11339, 11340, 11341, 11342, 11343, 11344, 11345, 11346, 11347, 11348, 11349, 11350, 11351, 11352, 11353, 11354, 11355, 11356, 11357, 11358, 11359, 11360, 11361, 11362, 11363, 11364, 11365, 11366, 11367, 11368, 11369, 11370, 11371, 11372, 11373, 11374, 11375, 11376, 11377, 11378, 11379, 11380, 11381, 11382, 11383, 11384, 11385, 11386, 11387, 11388, 11389, 11390, 11391, 11392, 11393, 11394, 11395, 11396, 11397, 11398, 11399, 11400, 11401, 11402, 11403, 11404, 11405, 11406, 11407, 11408, 11409, 11410, 11411, 11412, 11413, 11414, 11415, 11416, 11417, 11308, 11310, 11312, 11314, 11316, 11318, 11320, 11322, 11324, 11326];
} else if (ans_int == 4) {//黒四角内白抜き数字にする
	my_tbl =[11037, 11039, 11041, 11043, 11045, 11047, 11049, 11051, 11053, 11055, 11057, 11058, 11059, 11060, 11061, 11062, 11063, 11064, 11065, 11066, 11067, 11068, 11069, 11070, 11071, 11072, 11073, 11074, 11075, 11076, 11077, 11078, 11079, 11080, 11081, 11082, 11083, 11084, 11085, 11086, 11087, 11088, 11089, 11090, 11091, 11092, 11093, 11094, 11095, 11096, 11097, 11098, 11099, 11100, 11101, 11102, 11103, 11104, 11105, 11106, 11107, 11108, 11109, 11110, 11111, 11112, 11113, 11114, 11115, 11116, 11117, 11118, 11119, 11120, 11121, 11122, 11123, 11124, 11125, 11126, 11127, 11128, 11129, 11130, 11131, 11132, 11133, 11134, 11135, 11136, 11137, 11138, 11139, 11140, 11141, 11142, 11143, 11144, 11145, 11146, 11147, 11038, 11040, 11042, 11044, 11046, 11048, 11050, 11052, 11054, 11056];
} else if (ans_int == 5) {//黒四角(ラウンド)内白抜き数字にする
	my_tbl =[11576, 11578, 11580, 11582, 11584, 11586, 11588, 11590, 11592, 11594, 11596, 11597, 11598, 11599, 11600, 11601, 11602, 11603, 11604, 11605, 11606, 11607, 11608, 11609, 11610, 11611, 11612, 11613, 11614, 11615, 11616, 11617, 11618, 11619, 11620, 11621, 11622, 11623, 11624, 11625, 11626, 11627, 11628, 11629, 11630, 11631, 11632, 11633, 11634, 11635, 11636, 11637, 11638, 11639, 11640, 11641, 11642, 11643, 11644, 11645, 11646, 11647, 11648, 11649, 11650, 11651, 11652, 11653, 11654, 11655, 11656, 11657, 11658, 11659, 11660, 11661, 11662, 11663, 11664, 11665, 11666, 11667, 11668, 11669, 11670, 11671, 11672, 11673, 11674, 11675, 11676, 11677, 11678, 11679, 11680, 11681, 11682, 11683, 11684, 11685, 11686, 11577, 11579, 11581, 11583, 11585, 11587, 11589, 11591, 11593, 11595];
} else if (ans_int == 6) {//括弧内数字にする
	my_tbl =[8227, 8071, 8072, 8073, 8074, 8075, 8076, 8077, 8078, 8079, 8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089, 8090, 9894, 9895, 9896, 9897, 9898, 9899, 9900, 9901, 9902, 9903, 9904, 9905, 9906, 9907, 9908, 9909, 9910, 9911, 9912, 9913, 9914, 9915, 9916, 9917, 9918, 9919, 9920, 9921, 9922, 9923, 9924, 9925, 9926, 9927, 9928, 9929, 9930, 9931, 9932, 9933, 9934, 9935, 9936, 9937, 9938, 9939, 9940, 9941, 9942, 9943, 9944, 9945, 9946, 9947, 9948, 9949, 9950, 9951, 9952, 9953, 9954, 9955, 9956, 9957, 9958, 9959, 9960, 9961, 9962, 9963, 9964, 9965, 9966, 9967, 9968, 9969, 9970, 9971, 9972, 9973, 9884, 9885, 9886, 9887, 9888, 9889, 9890, 9891, 9892, 9893];
} else {
	myerror("処理をキャンセルしました");
}

//添字のスライド
var my_suffix = 0;
if (my_contents.match(/^0\d$/)) {//00〜09の時
	my_suffix = 101 + parseInt (my_contents);
} else {
	my_suffix = parseInt (my_contents);
}

//選択文字列の変換
var my_insertionPoints = my_selection.insertionPoints[-1];
my_insertionPoints.contents = "1";//強制的に選択文字を「1」にする
my_selection.remove();
my_selection = my_doc.selection[0];


////////////////字形検索置換
app.findGlyphPreferences = NothingEnum.nothing;
app.changeGlyphPreferences = NothingEnum.nothing;
try {
	app.findGlyphPreferences.appliedFont = my_font;
	app.changeGlyphPreferences.appliedFont = my_font;
	app.findGlyphPreferences.glyphID = 18;//検索対象を「1」にする
	app.changeGlyphPreferences.glyphID = my_tbl[my_suffix];
	var my_result = my_selection.changeGlyph ();
} catch(e) {
	app.findGlyphPreferences = NothingEnum.nothing;
	app.changeGlyphPreferences = NothingEnum.nothing;
	//my_doc.selection[0].contents = "" + my_contents;//選択範囲のリストア
	my_doc.undo();//やりなおし
	my_doc.undo();//やりなおし
	myerror("処理が失敗しました\nおそらく、字形がないフォントです。");
}
//設定のリストア
app.findGlyphPreferences = NothingEnum.nothing;
app.changeGlyphPreferences = NothingEnum.nothing;
//置換しなかった時
if (my_result == "") {//字形検索の返り値がなかった(失敗した)
	//my_doc.selection[0].contents = "" + my_contents;//選択範囲のリストア
	my_doc.undo();//やりなおし
	my_doc.undo();//やりなおし
	myerror("処理すべき文字はありませんでした");
}

追記(2008-09-20)

一部の不具合を修正しました。ver.0.2

オモテにアップしました。

http://www.seuzo.jp/st/scripts_InDesignCS3/index.html#round_num

k_ikik_iki 2008/09/20 08:50 か、痒いところに手が届いた!

YUJIYUJI 2008/09/20 12:13 これはかなり便利かもっ(^_^)
いただきます。

seuzoseuzo 2008/09/20 13:11 ありがとうございます。
おかしな動きをしたら、お知らせください。

akatsuki_pocketakatsuki_pocket 2008/09/21 19:38 便利そう!いただきます

seuzoseuzo 2008/09/22 01:52 そもそも「2桁の丸数字ってタグ(スクリプト)でどう書いたらいいか?」って相談を受けたのが最初で、瓢箪からコマなんです。
ん? 瓢箪からコマって、どういう状態をいうんだ? そんなおトクなことなのか? むむむ。

fourfour 2008/09/23 09:40 グリフ置換やりたいです。CS3で仕事したい! 今は 99までの丸数字をコピー&ペーストで insertしてます。遅いのなんのって....

seuzoseuzo 2008/09/23 10:56 fourさん、おひさしぶりです。
CS3などといわないで、この際CS4で、かもーん^^

グリフ置換ねえ、あんまり好きじゃないです。美しくない。
本来なら、characterクラスにcidNumberプロパティがあるべきなんですよね。

mikemike 2008/10/21 16:42 WindowsVistaでも動きましたよ。

seuzoseuzo 2008/10/21 17:15 ありがとうございます。
こうして、動作情報などがここに蓄積されれば、以降にお使いになられる方にとっても有益です。

korokoro 2009/01/14 11:46 IllustratorCS3でも使いたいです。アドバイス願います。とても便利で感動しました。

ダンダン 2009/08/29 16:12 早速試してみましたが残念ながら動作いたしませんでした。
MacOS10.5.8 InDesignCS4(6.0.3)

seuzoseuzo 2009/08/29 16:39 InDesignCS4用のround_numは下記にありますが...
http://d.hatena.ne.jp/seuzo/20090527/1243353039

そういうことじゃなくてですか?

ダンダン 2009/08/29 16:56 大変失礼をいたしました。
完璧に動作いたしました。ありがとうございました。

seuzoseuzo 2009/08/29 17:05 [CS3]というタグが抜けていて、わかりにくかったですね。すいません。訂正しました。

日常のブログのエントリーの中では、「あー、これ下位バージョンでも動作するな...」みたいに思うことがよくあります。
しかし、思うだけで実際にすべてのバージョンでテストしているほど時間があるわけじゃない。
そんな時は、あえてバージョンを書かなかったりします(今回はちがいますが...)。
で、ブログエントリーが古くなって、上位バージョンが発売されるとそこでは動作しなかったり。
うーん、むつかしいなあ。。。

jonycyanjonycyan 2012/06/17 13:28 round_num 0.5
windows7(64bit)版InDesign CS5_Jで完璧に出来ました。
ありがとうございました。

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


画像認証