LoginSignup
1
2

More than 1 year has passed since last update.

InDesign用連続置換スクリプト(プログレスバー付き)

Last updated at Posted at 2021-11-25
連続置換.jsx
/* 置換設定ファイルを読み込んで連続置換するスクリプト(新字→旧字等の文字置換用)
    置換設定ファイルはTab区切りテキストで
        検索文字列 置換文字列 字形  OpenTypeFeatures
    の形になっていること。
例

卿 卿 エキスパート字形
逢 逢 なし  ["jp04",1]
龍 龍 なし  ["aalt",3]

        based on 2008.12.17 by MishimaBaikamo
        http://www4.tokai.or.jp/high-sea-fleet/
    置換設定ファイルのエンコーディングはUTF-16にしておく(サロゲートペアの問題を避けるため)
*/

main();

function main(){
    //var filename = File.openDialog("開く置換設定ファイルを指定してください","ChangeTextTable.txt");
    var filename = "~/Dropbox/置換表/常用漢字・拡張新字体→旧字体.txt";
    if (filename){
        var fileObj = new File(filename);
        if (fileObj.open("r")){
            var ctTable = new Array();
            try {
                for (var i = 0; !fileObj.eof; i++) ctTable[i] = fileObj.readln();
            } catch(e) {
                alert("ファイルの読み込みに失敗しました。"); return;
            }
            fileObj.close();
        } else {
            alert("ファイルを開けませんでした。"); return;
        }
        //var range = app.activeDocument; //置換範囲はドキュメント全体
        //var range = app.selection[0].parentStory; //置換範囲は文字キャレットのある親ストーリー
        var range = app.selection[0]; //置換範囲は選択範囲のみ

        // 検索・置換機能を使用するので、それらを退避しておく
        var findTextPreferencesOld = app.findTextPreferences.properties;
        var changeTextPreferencesOld = app.changeTextPreferences.properties;
        var findChangeTextOptionsOld = app.findChangeTextOptions.properties;
        app.findTextPreferences = 1851876449; //NothingEnum.nothing;
        app.changeTextPreferences = 1851876449; //NothingEnum.nothing;
        app.findChangeTextOptions = 1851876449; //NothingEnum.nothing;

        //プログレスバーを表示しながら置換していく
        var steps = ctTable.length;
        progress(steps);
        for (var i = 0; i < steps; i++) {
            progress.message(steps + "行のうち" + i + "行目");
            //置換手続き
            changeTextFunction(ctTable[i],range);
            progress.increment();
        }
        // All done.
        progress.close();
    /*
        for (var i = 0, len = ctTable.length; i < len; i++){
            //進行状況をコンソールに表示する
            var j = i +1;
            if (j %10 == 0){
                $.writeln(j +"/"+ len +",  "+ ctTable[i]);
                }
            //置換手続き
            changeTextFunction(ctTable[i],range);
        }
    */
        // 退避しておいた検索・置換の設定を復帰
        app.findTextPreferences.properties = findTextPreferencesOld;
        app.changeTextPreferences.properties = changeTextPreferencesOld;
        app.findChangeTextOptions.properties = findChangeTextOptionsOld;
        if (app.findTextPreferences.kerningMethod=="None") app.findTextPreferences.kerningMethod = 1851876449;
        if (app.changeTextPreferences.kerningMethod=="None") app.changeTextPreferences.kerningMethod = 1851876449;
    } else {
        alert("キャンセルされました。"); return;
    }
}

function changeTextFunction(ctTable,range){
    TAB = String.fromCharCode(0x0009); //タブ
    var ct = ctTable.split(TAB);
    app.findTextPreferences.findWhat = ct[0];
    app.changeTextPreferences.changeTo = ct[1];
    app.changeTextPreferences.glyphForm = glyphFormFunction(ct[2]);
    //置換済み箇所に文字色を付ける場合はあらかじめスウォッチをつくっておく必要がある
    app.changeTextPreferences.fillColor = "旧字体に変換";
    var replace_Texts = range.changeText();
    if (ct[3] != "" && ct[3] != undefined){
        for (var j=0; j<replace_Texts.length; j++){
            replace_Texts[j].opentypeFeatures = eval("["+ct[3]+"]");
        }
    }
}

function glyphFormFunction(str){
    switch (str){
        case "ExpertForm":
        case "エキスパート字形":     return 1247897445; //AlternateGlyphForms.EXPERT_FORM
        case "等幅全角字形":       return 1247897446; //AlternateGlyphForms.FULL_WIDTH_FORM
        case "JIS2004字形":
        case "JIS 2004 字形":
        case "JIS 04 字形":
        case "JIS04字形":         return 1247897396; //AlternateGlyphForms.JIS04_FORM
        case "JIS78Form":
        case "JIS 78 字形":
        case "JIS78字形":         return 1247897399; //AlternateGlyphForms.JIS78_FORM
        case "JIS 83 字形":
        case "JIS83字形":         return 1247897400; //AlternateGlyphForms.JIS83_FORM
        case "JIS 90 字形":
        case "JIS90字形":         return 1247897401; //AlternateGlyphForms.JIS90_FORM
        case "等幅半角字形":  return 1247897453; //AlternateGlyphForms.MONOSPACED_HALF_WIDTH_FORM
        case "印刷標準字形":      return 1247897454; //AlternateGlyphForms.NLC_FORM
        case "NLCForm":
        case "標準字形":
        case "標準字形に戻す":
        case "なし":              return 1852796517; //AlternateGlyphForms.NONE
        case "プロポーショナル字形": return 1247897456; //AlternateGlyphForms.PROPORTIONAL_WIDTH_FORM
        case "等幅4分字形":
        case "等幅4分字形":        return 1247897457; //AlternateGlyphForms.QUARTER_WIDTH_FORM
        case "等幅3分字形":
        case "等幅3分字形":        return 1247897448; //AlternateGlyphForms.THIRD_WIDTH_FORM
        case "TraditionalForm":
        case "旧字体":           return 1247897460; //AlternateGlyphForms.TRADITIONAL_FORM
        default : return 1852796517;
    }
}

//プログレスバーの作成
//https://community.adobe.com/t5/indesign-discussions/progress-bar-script-running/m-p/10461132
/*
// Example is ten things to do. That is the number of 'steps' to do.
var steps = 1000000;
progress(steps);
// Your loop of something to do...
for (var i = 0; i < steps; i++) {
    progress.message("Doing step " + i);
    // Do something.
    progress.increment();
}
// All done.
progress.close();
*/
function progress(steps) {
    var b;
    var t;
    var w;
    w = new Window("palette", "Progress", undefined, {closeButton: false});
    t = w.add("statictext");
    t.preferredSize = [450, -1]; // 450 pixels wide, default height.
    if (steps) {
        b = w.add("progressbar", undefined, 0, steps);
        b.preferredSize = [450, -1]; // 450 pixels wide, default height.
    }
    progress.close = function () {
        w.close();
    };
    progress.increment = function () {
        b.value++;
    };
    progress.message = function (message) {
        t.text = message;
    };
    w.show();

}
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2