2011年8月27日土曜日

JavaScriptが分からなくともお題は解ける

麻雀に先付け、後付けがあるように、勉強法にも演繹的勉強法、帰納法的勉強法があります。愛だって、とりあえずやってから愛が生まれることもあります。まずはやっちゃいましょう^^

アチキの場合、Scriptに関しては「ど素人状態」。それでも何とか終えました。
やり方はただひとつ。ひたすらググる。ググりさえすれば答えが見つかるいい時代^^
スクリプトの緑部分はアチキの弄ったとこです。

お題1 ・テキストフレームの中のテキストを上下センターにする
古旗さんのテキストフレーム内の文字を天地中央に配置する段落の位置揃えを指定するを合体してみる。
pageObj = app.documents.add();
txtObj = pageObj.textFrames.add();
txtObj.visibleBounds = ["2cm","1cm","4cm","10cm"];
txtObj.contents = "天地中央に自動的にレイアウトします。";
txtObj.textFramePreferences.verticalJustification = VerticalJustification.centerAlign;
txtObj.paragraphs[0].justification = Justification.centerAlign;
これだと新規にドキュメントが作成され、左上2cm、1cmに高さ4cm、幅10cm(x=10, y=20)、右下(x=100, y=40)のテキストフレームが作られ「天地中央に自動的にレイアウトします。」の文字が天地左右のセンターになる。

ちと余計だな。。。意図は選択されたテキストフレーム内の文字を天地左右センターにしたいのだから、、、
txtObj = app.activeDocument.selection;
txtObj.textFramePreferences.verticalJustification = VerticalJustification.centerAlign;
txtObj.paragraphs[0].justification = Justification.centerAlign;
としてみる。こんなに簡単ではないはず。案の定、エラー発生。

ならばとテキストフレームのみ選択するに書き足してもエラー。

どうする?? しばらく考える。



とりあえず選択されたフレーム内のテキストを左右センターするに絞ってやってみる。

txtObj = app.activeDocument.selection;
txtObj.paragraphs[0].justification = Justification.centerAlign;

だとエラーになるので「Justification.centerAlign」でググる

はいさい!の画像フレームのフィットオプションがhit! で、弄った!
var frame = app.activeDocument.selection[0];
frame.parentStory.justification = Justification.centerAlign ;
で動作します^^
なんでparagraphsはダメでparentStoryならOKなのか分かりませんです。
続行、最後に天地センターを加えて
var frame = app.activeDocument.selection[0];
frame.parentStory.justification = Justification.centerAlign ;
frame.textFramePreferences.verticalJustification = VerticalJustification.centerAlign;
で完成^^

8/28追記:合体したスクリプトが動かなかった原因はtxtObj = app.activeDocument.selection;がだったから。
txtObj = app.activeDocument.selection[0]; で動きます。で、txtObj.paragraphs[0].justification = Justification.centerAlign;は単数行ならOKなのですが、複数行ですとparentStoryでないとダメみたいです。

8/31追記:上級編は公式を使った。
var frame = app.activeDocument. textFrames;
for (var i = frame. length - 1; i > -1; i--) {
try {

frame[i].parentStory.justification = Justification.centerAlign ;
frame[i].textFramePreferences.verticalJustification = VerticalJustification.centerAlign;
} catch(frame) {}
}


お題2の1 ・1つのテキストフレームを右へ10mm移動
はいさい! フレームサイズの取得に辿り着けばお題は終わり。
var frame = app.activeDocument.selection[0];
var y = frame.visibleBounds[0];
//左上
var x = frame.visibleBounds[1];
//左上
var y1 = frame.visibleBounds[2];
//左下
var x1 = frame.visibleBounds[3];
//左下 x1
frame.visibleBounds = [ frame.visibleBounds[0], frame.visibleBounds[1]+10, frame.visibleBounds[2], frame.visibleBounds[3]+10];
ちと弄って出来ました^^ ただ単位がmmになってるので出来たわけでして、単位がptだと10ptになってしまいます。アチコチ弄りましたが結局ダメ。
Adobe InDesign スクリプティングチュートリアルを読むと、最初に
app.activeDocument.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.millimeters;
app.activeDocument.viewPreferences.verticalMeasurementUnits = MeasurementUnits.millimeters;
と宣言するみたいです。で、このたった2行で動作するのは感動ものです。

8/31追記:varで宣言しているのだから、frame.visibleBounds=[y, x+10, y1, x1+10];とするべきだな。

再追記(重要):InDesignでJavaScript その7を参考に
var frame = app.activeDocument.selection[0];
frame.move("by",["10mm","0mm"]);
の2行だけで移動できた^^ 


お題2の2 ・2つのテキストフレームの間隔を3mmにする
ここまでくるとお題ははいさい!から出されているんだなとアチキでも気付きます^^ で、こいつは選択しているアイテムを整列させる(等間隔に分布編)
app. activeDocument. distribute (app. activeDocument. selection, DistributeOptions. HORIZONTAL_SPACE, AlignDistributeBounds. MARGIN_BOUNDS, false) ;
を弄ってみます。
app. activeDocument. distribute (app. activeDocument. selection, DistributeOptions. VERTICAL_SPACE, AlignDistributeBounds. ITEM_BOUNDS, false) ;
にすると垂直方向に等間隔に分布されます。
app. activeDocument. distribute (app. activeDocument. selection, DistributeOptions. VERTICAL_SPACE, AlignDistributeBounds. ITEM_BOUNDS, true, absoluteDistributeMeasurement=3) ;
にして垂直方向間隔3mmが完成。
ここは=3) ;を="3mm") ;にすると数値がpt表示でも問題なく動作。


お題3 ・テキストフレーム内の文字「楽しく」にルビをふる
     ・「作成方法」にルビをふる(グループルビ)
こいつは設問の意図を読み間違え、たけうちとおるさんのruby.zipでワ~イ、動いた^^ と喜んでいた。そんなに簡単なわけがない。結構、探すのに難儀したので、後日、書きます。


お題4 ・テキストの中の値段をすべて10円アップする
このお題を見てパッと浮かんだのが消費税。消費税込みの価格は価格*1.05だから*1.05を+10にすればいいだけなのでは? 
「InDesign javaScript 消費税」でググれば古旗さんの

文章中の価格に消費税を加算する (Adobe InDesign & Illustrator CS3/CS4編)がヒットします。
var selObj = app.activeDocument.selection[0]; // 最初に選択した数値のみ処理
var txt = selObj.contents;
selObj.contents = txt.replace(/\d+円/g, repFunc);

function repFunc(n){
n = parseInt(n);
n = n * 1.05; // 消費税5%を乗算する
n = Math.round(n);
return n+"円";
}
n = n * 1.05; をn = n + 10; に書き換えて完成~^^

追記:実際に動かしてみると「1,000円」は「1,10円」になってしまう。

で、先頭に円マークのある価格は
var selObj = app.activeDocument.selection[0]; // 最初に選択した数値のみ処理
var txt = selObj.contents;
selObj.contents = txt.replace(/\\d+/g, repFunc);

function repFunc(n){
n = parseInt(n.substring(1,9999));
n = n * 1.05; // 消費税5%を乗算する
n = Math.round(n);
return "\"+n;
}
なのでひとつにまとめてみようと思ったが、return "\"+n;で

エラー番号:4、終了していない文字列型の定数です

のアラートが出る。まぁバックスラッシュと円マーク絡みだし、こちとらWinXP環境だし。。。そんなわけで終了。

あとは、どうしてこうなるのかの理解なのだが、とりあえずやってしまうと気が抜けていまいち勉強する気にならんのがアチキの欠点。体目当てでやるのが目的ではないのだが(オイ

0 件のコメント:

コメントを投稿