[InDesign][JS]再びnum_glyph 0.3を編集してみた 2008/06/11
市川せうぞーさんのとても便利なInDesign CS3用JavaScriptのnum_glyph 0.3に、以前処理を追加しましたが、本日さらに改造してみました。
※OTFの異体字を利用して算用数字の字形を変更するツールです。
念のため再掲しておきますが、以下2行は上記リンク先に同梱されているReadmeファイルの一部です。
9つ目以降のラジオボタンが追加した処理です。
10個目以降のラジオボタンが追加した処理です。
追記のソースをコピーして利用した場合、カンマとピリオドも数字の仲間と見做して処理してしまいます。その点ご留意くださいませ。
【横組】1桁を二分字形中付に、2桁以上を二分字形にする
横組用の処理を想定しています。
算用数字を等幅半角字形に変更します。
ただし一桁数字は、文字前のアキ量および文字後のアキ量を四分に変更します。
【共通】1桁を全角字形に、2桁以上を二分字形にする
縦組/横組共通の処理を想定しています。
一桁数字を等幅全角字形に、二桁以上を等幅半角字形に変更します。
【縦組】1桁と4桁以上を全角、2桁と3桁を二分字形に
縦組用の処理を想定しています。
【戻し置換】カンマとピリオドを標準字形に
カンマやピリオドが等幅半角だと、隣接する数字との間隔が気になる場合もあろうかと思いますので、カンマとピリオドのみ標準字形に戻すためのボタンを追加しました。
すべてを標準字形にする
ラジオボタンの一番上にある、元からあった処理ですが、オリジナルのスクリプトは文字前/後のアキ量は変更しません。
ところが、上記の横組用の処理を行うと、一桁数字については文字前/後のアキ量が変わってしまいます。
作業の途中で元に戻したい場合を想定し、この処理を行うと字形だけでなくアキ量もベタになるように変更しました。
動作確認はWindows XP Pro SP2でしかとっておりません。
ご利用は自己責任でお願いします。
ここのソースをコピーして利用した上での疑問点は、間違っても市川せうぞーさんに直接問い合わせることはおやめください。
では、追記から。
※OTFの異体字を利用して算用数字の字形を変更するツールです。
念のため再掲しておきますが、以下2行は上記リンク先に同梱されているReadmeファイルの一部です。
このツールを改造して配布することはできません。もし、ソースを改変して使用される場合は、あなたが制作者であり、わたくし(市川)は何等無関係であることをご承知ください。
わたくし(市川)はこのツールのいかなる不具合についても、それを保全する義務および責任がありません。ご承知置きください。
10個目以降のラジオボタンが追加した処理です。
追記のソースをコピーして利用した場合、カンマとピリオドも数字の仲間と見做して処理してしまいます。その点ご留意くださいませ。
【横組】1桁を二分字形中付に、2桁以上を二分字形にする
横組用の処理を想定しています。
算用数字を等幅半角字形に変更します。
ただし一桁数字は、文字前のアキ量および文字後のアキ量を四分に変更します。
【共通】1桁を全角字形に、2桁以上を二分字形にする
縦組/横組共通の処理を想定しています。
一桁数字を等幅全角字形に、二桁以上を等幅半角字形に変更します。
【縦組】1桁と4桁以上を全角、2桁と3桁を二分字形に
縦組用の処理を想定しています。
【戻し置換】カンマとピリオドを標準字形に
カンマやピリオドが等幅半角だと、隣接する数字との間隔が気になる場合もあろうかと思いますので、カンマとピリオドのみ標準字形に戻すためのボタンを追加しました。
すべてを標準字形にする
ラジオボタンの一番上にある、元からあった処理ですが、オリジナルのスクリプトは文字前/後のアキ量は変更しません。
ところが、上記の横組用の処理を行うと、一桁数字については文字前/後のアキ量が変わってしまいます。
作業の途中で元に戻したい場合を想定し、この処理を行うと字形だけでなくアキ量もベタになるように変更しました。
動作確認はWindows XP Pro SP2でしかとっておりません。
ご利用は自己責任でお願いします。
ここのソースをコピーして利用した上での疑問点は、間違っても市川せうぞーさんに直接問い合わせることはおやめください。
では、追記から。
////////////////////////////////////////////エラー処理
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();
}
}
////////////////////////////////////////////正規表現検
//正規表現で検索して、ヒットオブジェクトを返すだけ
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桁を四分字形にする",
"【横組】1桁を二分字形中付に、2桁以上を二分字形にする",
"【共通】1桁を全角字形に、2桁以上を二分字形にする",
"【縦組】1桁と4桁以上を全角、2桁と3桁を二分字形に",
"【戻し置換】カンマとピリオドを標準字形に"];
var ans_int = radioDialog("num_glyph", "数字の字形を変更します。処理を選択してください\n", myList);
//myList[ans_int];
////////////////検索の実行
var hit_obj = my_regex(myselection, "[0-9.,]+", "");
var hit_obj2 = my_regex(myselection, "[.,]+", "");
if (ans_int == 0) {//すべてを標準字形にする
for (var i = 0; i < hit_obj.length; i++) {
if (hit_obj[i].contents.length == 1) {
hit_obj[i].glyphForm = AlternateGlyphForms.NONE;
hit_obj[i].leadingAki = 0;
hit_obj[i].trailingAki = 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;
}
}
} else if (ans_int == 9) {//1桁を二分字形中付に、2桁以上を二分字形にする
for (var i = 0; i < hit_obj.length; i++) {
if (hit_obj[i].contents.length == 1) {
hit_obj[i].glyphForm = AlternateGlyphForms.MONOSPACED_HALF_WIDTH_FORM;
hit_obj[i].leadingAki = 0.25;
hit_obj[i].trailingAki = 0.25;
} else if (hit_obj[i].contents.length >= 2) {
hit_obj[i].glyphForm = AlternateGlyphForms.MONOSPACED_HALF_WIDTH_FORM;
}
}
} else if (ans_int == 10) {//1桁を全角字形に、2桁以上を二分字形にする
for (var i = 0; i < hit_obj.length; i++) {
if (hit_obj[i].contents.length == 1) {
hit_obj[i].glyphForm = AlternateGlyphForms.FULL_WIDTH_FORM;
} else if (hit_obj[i].contents.length >= 2) {
hit_obj[i].glyphForm = AlternateGlyphForms.MONOSPACED_HALF_WIDTH_FORM;
}
}
} else if (ans_int == 11) {//1桁と4桁以上を全角、2桁と3桁を二分字形に
for (var i = 0; i < hit_obj.length; i++) {
if (hit_obj[i].contents.length == 1) {
hit_obj[i].glyphForm = AlternateGlyphForms.FULL_WIDTH_FORM;
} else 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.MONOSPACED_HALF_WIDTH_FORM;
} else if (hit_obj[i].contents.length >= 4) {
hit_obj[i].glyphForm = AlternateGlyphForms.FULL_WIDTH_FORM;
}
}
} else if (ans_int == 12) {//カンマとピリオドを標準字形にする
for (var i = 0; i < hit_obj2.length; i++) {
if (hit_obj2[i].contents.length == 1) {
hit_obj2[i].glyphForm = AlternateGlyphForms.NONE;
hit_obj2[i].leadingAki = -1;
hit_obj2[i].trailingAki = -1;
}
}
}
pre要素の使用でソースが見やすくなるはずです
FC2 blogはpre要素が使用できると思いますので、pre要素を使用すると、プログラムソースがきれーに見えるかもデス
あー忘れてました、pre。
ありがとうございます。
ありがとうございます。
コメントの投稿
トラックバック
http://kstation2.blog10.fc2.com/tb.php/284-06808e63
【縦組】とか【共通】とか書いておきながら、縦中横のこと全然考えてねえや、俺 (^^;
おそまつでした m(_ _)m