忍者ブログ

ぼんぷろぐ

InDesign、イラレ、フォトショ(CS6 Win)の勉強中。。。(旧まとめいみブログ)

[ExtendScript]
ExtendScriptのココがJavaScriptじゃないよ

ExtendScriptの独自のものとか、JavaScriptの仕様に反するようなものを知ってる限りあげてみました。といっても1.以外はほんとに重箱の隅みたいなのばかりです。何かほかにもありましたらぜひコメントくださいませ。(「今時のJavaScriptにあるこんな機能がExtendScriptにはない」っていうのは対象外です)

1. File,Folder,Socket,BridgeTalk,UnitValue,$,ScriptUIが使える

Extendというだけあって、様々な組み込みオブジェクトで機能が拡張されています。
File、Folderはそのまんまファイルとフォルダが扱え、SocketはTCP/IP通信、BridgeTalkはアドビアプリの間の通信、UnitValueは長さの単位がついた値の演算や単位変換ができます。$は主にデバッグに使うヘルパーオブジェクトです。ScriptUIはダイアログとかを作るアレです。

2. XMLが使える

XMLを扱うことができます。なんで1.にまとめなかったのかと言えば、独自のリテラル(表記方法)や演算子があることと、XMLがBoolean,null,undefined,Number,String,Objectに次ぐ第7の『型』であることからです。
この機能はE4Xと呼ばれる、ECMAScriptの拡張であるECMA-357に基づいたものであるようです。一時期Firefoxなどでも使えたようですが、今は廃止されています。ですので「ココがJavasScriptじゃない」って言い方は正しくないかもしれません。

3. """でヒアドキュメント

通常『"』1つで囲む文字列を3つにすることで改行やタブなどがそのまま有効な文字列になります。こういうのをヒアドキュメントって言うそうです。
PR

[InDesign]
テキストの右クリックメニューに「字形」を追加するスクリプト




InDesignの字形パネルメニューにある『JIS90字形』『等幅半角字形』などを、テキスト選択時のコンテキストメニュー(右クリックメニュー)から使えるようにするスクリプトです。

//@target "indesign"
var s1 = app.menus.item("文字のコンテキストメニュー").submenus.item("字形");
if (s1.isValid) {
    s1.remove();
} else {
    s1 = app.menus.item("文字のコンテキストメニュー").submenus.add("字形");
    var s2 = app.menus.item("字形パネルメニュー");
    for (var i = 2; i < 15; i++) s1.menuItems.add(s2.menuItems[i].associatedMenuAction);
}

上記スクリプトをInDesignのスクリプトパネルかExtendScript toolkitで1回だけ実行してください。テキストのコンテキストメニューに「字形」が追加されます。消したいときは同じスクリプトをもう一回実行します。


※「字形パネルメニュー」の3項目目~15項目目(サブメニューは含まない)を、「文字のコンテキストメニュー」の下に作った「字形」サブメニューにコピーするという手抜きスクリプトです。ですのでバージョンアップにより字形パネルメニューの順番が変わってたら使えなくなります。
※CS6で開発しています。CCでダメだったらお知らせください。

[InDesign]
源ノ明朝の全グリフ表示するやつ(InDesign+ESTK版)

var sss="""(function(cid){
    var idms1='<?xml version="1.0" encoding="UTF-8" standalone="yes"?><?aid style="50" type="snippet" readerVersion="6.0" featureSet="257" product="8.1(420)" ?><?aid SnippetType="PageItem"?><Document DOMVersion="8.1" Self="d"><Spread Self="ue2"><TextFrame Self="u123" ParentStory="u111"></TextFrame></Spread><Story Self="u111"><ParagraphStyleRange><CharacterStyleRange><Properties><AppliedFont type="string">源ノ明朝</AppliedFont><CustomGlyph type="long">';
    var idms2='</CustomGlyph></Properties><Content><?ACE 1a?></Content></CharacterStyleRange></ParagraphStyleRange></Story></Document>';
    var idmsFile=File("~/Desktop/akitomo.idms");
    idmsFile.encoding="UTF8";
    idmsFile.open("w");
    idmsFile.write(idms1+cid+idms2)
    idmsFile.close();
    var docu=app.activeDocument;
    var tf0=docu.textFrames.itemByName("akitomo");
    var tf1=docu.pages[0].place(idmsFile)[0];
    tf0.parentStory.contents="";
    tf1.parentStory.texts[0].move(LocationOptions.AT_BEGINNING,tf0.texts[0]);
    tf1.remove();
})""";
BridgeTalk.bringToFront("indesign");
indesign.executeScript("app.selection[0].name='akitomo'")
for(var i=1;i<65334;i++){
    indesign.executeScript(sss+"("+i+")")
    $.sleep(200)
}

遊び方

①InDesign上でテキストフレームを1つ選択します
②上記のスクリプトをESTKで、ESTKを対象に実行します
③選択テキストフレームに源ノ明朝のグリフが1つずつ順に表示されます

注意

・②を必ず守りましょう。InDesignのスクリプトパネルから実行しちゃダメ。 をInDesignに変えるのもダメ

・一時停止、停止はESTKの を使いましょう
・文字は13Qで配置されるので、大きく表示したい場合はズームするか、環境設定>一般>拡大縮小時:拡大縮小率を調整 に設定してテキストフレームを拡大しておきます
・再生中もInDesignは操作できるのでプレゼンテーションモードにしたりできます。でも別のドキュメントを開いたりはしないでね
・表示が追いつかずにグリフがとびとびになる場合は$.sleepの値を増やしてね

[ExtendScript]
ExtendScript Toolkitにコード整形機能をつけてみる

Adobeの英語フォーラムかなんかで見かけたんですけど、ESTKのDOMってそのままだとあんまりいじるところが無いですが、
#target estoolkit#dbg
っていうおまじないを書いておくと編集中のテキストを取得したりとかいろいろできるみたいです。ただしいちいち保存しないと実行させてくれない。

てことでなにかと嫌われがちなESTKですが、アレさえあればもっと愛されるツールになるのにっていうアレを実装してみました。



①コード整形には js-beautify を使わせてもらいます。https://github.com/beautify-web/js-beautify からダウンロードしてbeautify.jsを適当な場所に置きます。

②以下のコードの6行目をbeautify.jsを置いた場所に応じて書き換え、jsxファイルとして保存します。
#target estoolkit#dbg
var toolMenu = MenuElement.find ("toolA") || new MenuElement("menu", "ツール", "at the end of menubar", "toolA");
var beautifyCommand = MenuElement.find ("toolA/beautify") || new MenuElement("command", "整形", "at the end of toolA", "toolA/beautify");
var js_beautify = (function () {
    var exports = {};
    #include "C:\\lib\\beautify.js"
    return exports;
})();

beautifyCommand.onSelect = function() {
    try {
        var editor = document.editor;
        var selText=editor.textselection;
        var code=selText.length>0?selText:editor.text;
        code = code.replace(/^\s*#(?=(target|targetengine|include|includepath|script|strict))/mg, "//@");
        if (code.indexOf("\"\"\"") > -1) {
            if(!confirm("\"\"\"が含まれているため正常に整形できない可能性があります.\n続行しますか?")) return;
        }
        code = js_beautify.js_beautify(code);
        if (selText.length>0) document.editor.textselection = code;
        else editor.text = code;
    } catch (e) {
        alert(e);
    }
}

③これを実行すればメニューにツール>整形が追加されるわけですが、起動時に自動実行させるには、こいつをESTKの実行ファイルがあるフォルダの下の"Required"フォルダ内にぶち込んでやります。

これであんなに汚かったコードが…


なんということでしょう こんなに読みやすく…っていうほどでもないな。こりゃ例が悪いわ。1行目のaと2行目のbもちゃんと等幅フォント使ってれば揃います。



プロフィール

あるふぁ(仮)
InDesignで新聞組版のようなことをしてる人です。

InDesignスクリプトについて

つくったInDesignスクリプトのまとめ

twitter

5つの「く」

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