InDesignをつかってLivecoding

とりあえず動画おば,なにを書いてるかわかりづらいのでデカい表示で見られたほうがいいです.ちなみに動作してる環境はCS4 6.0.5です.

InDesign LiveCoding from nbqx on Vimeo.

scriptUIでreplっぽいものを仕立てあげて,ライブコーディングしてます.とはいってもあくまでもデモってことで,InDesignのドキュメントにあるオブジェクトを探索している程度ですけど.ちょっとひねくれてるかただとかESTKが大嫌いなじぶんみたいなかただとか,ちょっと便利っぽいなーとか思っていただけるかと思います.ある段落スタイルだけをサクっと取り出したり,GUIからだと2ステップぐらい踏む操作を間違えることなく1ステップでやることができたり…

サラっと書いたので,ツッコミどころはありますが以下ソースです.

#target Indesign

//EditTextのjavascriptを実行
var evaluation = function(code){
  var res = {res:true,ret:undefined};
  try{
    res.ret = eval(code);
  }catch(e){
    res.res = false
    res.ret = e.toString();
  }
  return res
}

//ユーティリティ
//TODO: 拡張できるようにする
var _ = {};

//app.activeDocument.selection[0]のショートハンド
_.getSelect = function(){
  var s = app.activeDocument.selection[0];
  if(s){
    return s
  }else{
    return 'none!'
  }
}

//ファイルのパス指定で実行
//ex. load("/opt/indesign/jsonizer.jsx")
_.load = function(path){
  $.evalFile(path);
  return "loading done!"
}

//filter
//usage: _.filter(objs,fn) => obj
//fnはtrue or falseをかえすような関数です
/*
_.filter(app.activeDocument.allPageItems,function(o){
  return (o instanceof TextFrame)
})
*/
_.filter = function(obj,fn){
  var ret = [];
  var tgt = (obj instanceof Array)? obj : [obj];
  
  for(var i=0; i<tgt.length; i++){
    if(fn(tgt[i])){
      ret.push(tgt[i]);
    }
  }

  return ret
}

//merge
//オブジェクト同士をマージするよ
//usage: _.merge([{a:1,b:1},{b:2,c:3}])
_.merge = function(o){
  var ret = {};
  var obj = (o instanceof Array)? o : [o];

  for(var k in obj){
    ret[k] = obj[k];
  }

  return ret
}

//ヘルプを表示する
_.help = (function(){
  return 'TODO: ヘルプを表示する'
})()

//main
//クラスにする
var console;
console = new Window("window", "InDesign Interactive Console beta", undefined, {resizable:true,closeButton:true});
console.orientation = 'column';
console.ta = console.add('edittext',{x:5, y:10, width:360, height:100},"/* 改行はCtrl+Enterでどうぞ */\n",{
  margins:[3,3,3,3],
  enterKeySignalsOnChange:true,
  borderless:false,
  multiline:true,
  scrollable:true});
console.ra = console.add('edittext',{x:5, y:380, width:360, height:100},"実行結果\n",{
  margins:[3,3,3,3],
  readonly:true,
  borderless:false,
  multiline:true,
  scrollable:true});

console.ta.onChange = function(){
  var r = evaluation(console.ta.text);
  if(r.ret!=undefined){
    console.ra.text = r.ret;}
  else{
    console.ra.text = "実行結果";}
}
console.show();

Livecodingするときってじぶんがうれしいショートハンドとか関数をつくっておくと,きもちよくコードが書けます.このスクリプトでは"_"っていうオブジェクトに便利な関数をいれておいています.で,実際に動画では条件にあてはまるものだけの要素の配列を返す_.filterって関数だけつかってます.どんなかはソースを見られたほうが早いかと.

あと実際によくつかうのは_.loadってやつで,要するに$.evalFileのショートハンドなんですけど,引数にファイルのパスを指定してあげて読みこむやつです.読みこむjsxファイルの書きかたを工夫すると,ESTKじゃない環境でスクリプト書いたりしたのを読みこんで実行したり,オブジェクトに便利関数をつっこんで定義してあるだけのファイルを読みこんでLivecoding環境でつかえるようにしたりとかできます.

とかいうやつを既存のネイティヴデータで「これつくったひとはどーやってつくってる?」みたいなのをインタラクティブに調べたりするのに実際に使ったりしてますぜ,っていうネタでした.

テクDTP勉強会でどんな話をしたらいいのかと,過去つくったものをひっぱりだして見てますがネタっぽいものが多くて困っています.というか,ひとりくらいネタっぽいものでもいいんじゃないのかなって最近思うようになってきてしまいました.