忍者ブログ

ぼんぷろぐ

InDesign、イラレ、フォトショの勉強中。。。

[InDesign]
特定のマスターページアイテムがオーバーライドされてるページを見つけるスクリプト

マスターページ上でアイテムを一つ選択して実行すると、そのアイテムがオーバーライドされているページを探して、見つかったページの番号のボタンが並んだパレットを作ります。ボタンを押すとそのページに飛ぶというしくみです。



※マスターのマスターまでは考慮してません。つまりAマスターを元にBマスターを作り、Bマスターを元にページを作ってAマスター上のアイテムをオーバーライドした場合、これを見つけることはできません。(実装が困難なわけではなく、単なる手抜きです)
PR

[InDesign]
ググって漢字を拾ってきてくれるスクリプト

読みの分からない漢字を入力したいとき、正攻法としてはIMEについてる手書き認識だったり部首検索を使うという手があるのですが、それよりも案外ググってみるのが早かったりすることに気づいている方も多いんじゃないでしょうか。



と、こういう感じで部首とかパーツの文字を適当にググると、漢字辞典のサイトだったりYahoo知恵袋だったりがわりと上位にヒットしてくれて、おまけに目的の文字がしっかり「」で囲まれてることが多いので、試しにInDesignで「ググって1ページ目から「」で囲まれてる漢字1字を取り出す」というだけのやっつけスクリプトを書いてみたところ、(うまくいった例だけを見せてるせいか)思いのほかツイッターで反応があったので公開してみる次第です。
あんまり見かけないExtendScriptでSocketを使ってhttp通信を行う例でもあります。使い方あってるのか分からないけどね。


狙った漢字を取得できる割合はもともと50%くらいしかなかったんですが、「教育漢字は除外する」とかいろいろ条件を加えて漢字ごとに点数をつけるとかして、それでもダメなことがあるので他の候補を表示するダイアログも作ったりして、それなりに使えるものになった気がします。



ダイアログは小塚明朝でかっこよく表示するやつをCS6で作ったのですが、これCCではダメみたいです。ScriptUIでフォントを(サイズも)変えられなくなってしまったみたい。CEPに移行させたい人らの嫌がらせとしか思えん。

[InDesign]
複数段落選択中は各段落の先頭にタブを挿入するようにするスクリプト

前回に続いてメニューアクションにイベントリスナーをつける例をもう一つ。

InDesignではタブの入力は通常の文字入力と異なり、『タブを挿入』のメニューコマンドをタブキーに割り当てられたキーボードショートカットで実行するという形になっています。そこにイベントリスナーで処理を割り込ませ、特定の状況下で挙動を変えてやろうという試みです。具体的には複数段落にわたるテキストを選択している場合、各段落の先頭にタブが挿入されるようにします。さらにデフォルトでShift+Tabに割り当てられている『右インデントタブを挿入』では、各段落の先頭のタブを消去するようにしてみます。

使い方は前回と同様、以下のコードを拡張子jsxで保存してStartup Scriptsフォルダに入れるだけ。
"beforeInvoke"でメニューアクションの実行前に割り込み、条件に当てはまる場合はpreventDefaultで通常のタブ挿入をキャンセルしています。

#targetengine "CopipeCheck"
function addEL(obj, eventName, handler, name) {
    var el0 = obj.eventListeners.item(name);
    if (el0.isValid) el0.remove();
    obj.addEventListener(eventName, handler).name = name;
}

addEL(app.menuActions.itemByID(119698), "beforeInvoke", function (ev){
    var sel0=app.selection[0];
    if (sel0 && sel0.hasOwnProperty("paragraphs") && sel0.paragraphs.length>1){
        ev.preventDefault();
        app.doScript(function(){
            var paras=sel0.paragraphs.everyItem().getElements();
            for (var i=paras.length-1;i>=0;i--) paras[i].insertionPoints[0].contents="\t";
        },ScriptLanguage.JAVASCRIPT,[],UndoModes.ENTIRE_SCRIPT);
    }
}, "Tab1");

addEL(app.menuActions.itemByID(119673), "beforeInvoke", function (ev){
    var sel0=app.selection[0];
    if (sel0 && sel0.hasOwnProperty("paragraphs") && sel0.paragraphs.length>1){
        ev.preventDefault();
        app.doScript(function(){
            var paras=sel0.paragraphs.everyItem().getElements();
            for (var i=paras.length-1;i>=0;i--) {
                var c0=paras[i].characters[0];
                if (c0.contents=="\t") c0.contents="";
            }
        },ScriptLanguage.JAVASCRIPT,[],UndoModes.ENTIRE_SCRIPT);
    }
}, "ShiftTab1");

[InDesign]
テキストをコピペしてテキストフレームができたときに教えてくれるスクリプト

InDesignでは「テキストカーソルを置いてない状態でテキストをペーストすると、新しく作られたテキストフレーム内にペーストされる」という仕様になっていますが、そういうペーストをしたときに警告を出すスクリプトを書いてみました。



もちろん事故防止のためです。別にやらかしたわけではないんですけどね。考えてみたら怖いなーと思ったので。特に怖いのは「文字ツールを使っているが何も選択していない」とき。普通はペーストしたテキストフレーム等はペースト直後に選択された状態になりますが、このときだけ選択状態は変わらず、静かに画面中央あたりにテキストフレームが生まれます。


ダイアログ文の自信なさげな感じを見てわかるとおり、判定は確実じゃありません。自動生成されるテキストフレームが、いつも150pt×150ptのサイズであることを利用しているため、偶然同じサイズのテキストフレームをペーストしたときにも同じ警告が出てしまいます。まあウチはmm単位系でやってるからまず起きないし…てことで深入りしませんでした。


使い方は以下のコードを拡張子jsxで保存してStartup Scriptsフォルダに入れるだけ。「いいえ」を押したらアンドゥしてくれる機能つき
#targetengine "CopipeCheck"
function myHandler() {
    try{
    var sel0 = app.selection[0];
    if (!sel0) sel0=app.layoutWindows[0].activeLayer.textFrames[0]
    if (sel0.constructor.name != "TextFrame") return;
    app.scriptPreferences.measurementUnit = MeasurementUnits.POINTS;
    var vb = sel0.visibleBounds;
    if (Math.abs(vb[2] - vb[0] - 150) + Math.abs(vb[3] - vb[1] - 150) < 0.001) {
        if (!confirm("テキストがテキストフレームとしてペーストされたかも…\nいいですか?")) app.activeDocument.undo()
    }
    }catch(e){}
}

function addEL(obj, eventName, handler, name) {
    var el0 = obj.eventListeners.item(name);
    if (el0.isValid) el0.remove();
    obj.addEventListener(eventName, handler).name = name;
}
addEL(app.menuActions.item("ペースト"), "afterInvoke", myHandler, "CopipeCheck1");

5つの「く」

ハタハタのすばらしさをまとめました。