:note

セル幅を内容に合わせる

InD_Board セル幅を内容に合わせる の補足。

セルの内容にあわせてセル幅を調整するというスクリプトです(デザイン処理的にどうこうはおいておいて)。

やってることは、コラムごとにテキストの頭とお尻の位置の差の最大値をセル幅にしてます。

セルの中身がないときとオーバーフローしているときには、この値を取得出来ずにエラーになるのを認識してたんですが面倒だったのでとりあえずポストしました。

表のオーバーフローの処理って、while(セルのオーバーフロー) がうまく認識されないので、親テキストフレームの.recompose()メソッドつかった強制認識的な処理をするのですが、前々からこの処理がイヤで、なんとかならないものかと思ってたのですが、いい案が思いついたのでメモついでにアップ。

具体的には、オーバーフロー中無効になっている lines プロパティが有効になったところで処理を抜けるって感じです。

#target "InDesign"

if (app.selection.length === 1) {
  var sel = app.selection[0];
  if (sel.hasOwnProperty('cells')) {
    // selection 選択した列のみに適用
    main(sel, 2);
  };
};

function main (sel, margin) {
  var col = sel.columns;
  for (var i=0, iL=col.length; i < iL ; i++) {
    var cel = col[i].cells;
    var ar = [];
    for (var j=0, jL=cel.length; j < jL ; j++) {
      // if cell has no content
      if (cel[j].texts[0].contents === "") {continue};
      // if cell overflows
      if (cel[j].overflows) {
        while(cel[j].overflows){
          cel[j].width += 1;
          if (cel[j].properties['lines'] !== undefined) {break;};
        }
      };
      var os_start = cel[j].lines[0].insertionPoints[0].horizontalOffset;
      var os_end = cel[j].lines[0].insertionPoints[-1].horizontalOffset;
      ar.push(os_end - os_start);
    };
    col[i].rightInset = col[i].leftInset = margin * 0.5;
    var padding = col[i].rightInset + col[i].leftInset;
    var line_weight = col[i].rightEdgeStrokeWeight * 0.5 + col[i].leftEdgeStrokeWeight * 0.5;
    col[i].width = ar.sort(function(a,b){return b > a})[0] + padding + line_weight;
  };
}
 
comments powered by Disqus
back to top