今回は前回作った「linkedText.jsx」をUXPスクリプトの勉強がてらにchatGPTで翻訳してどーにかしようという試みです。
chatGPTと対話
まずはchatGPTと対話してjsxスクリプトをUXPスクリプトに翻訳してもらいました。
UXPスクリプトはpromptが実装されてないので、入力ダイアログを実装する前のコードでやってみました。返ってきたのスクリプトコードが下記。
const {Text,Color}=require("scenegraph");
// テキストフレームを作成する関数
function createTextFrame(page,x,y,width,height){
const textFrame=new Text();
textFrame.fill=new Color("black"); // テキストの色を設定
textFrame.resize(width,height);
textFrame.placeInParentCoordinates({x,y});
// ページにテキストフレームを追加
page.addChild(textFrame);
return textFrame;
};
// ページをまたいでテキストフレームを連結する関数
function linkTextFramesAcrossPages(textFrames){
for(let i=0;i<textFrames.length-1;i++){
const currentFrame=textFrames[i];
const nextFrame=textFrames[i+1];
currentFrame.nextTextFrame=nextFrame;
};
};
// ドキュメントの参照を取得
const myDoc=require("application").activeDocument;
// ページ数を取得
const pageCount=myDoc.pages.length;
// ページごとに処理
const pushTextFrames=[];
for(let i=0;i<pageCount;i++){
const page=myDoc.pages[i];
pushTextFrames.push(createTextFrame(page,36,36,180,50)); // テキストフレームを作成して配列に収める
};
// テキストフレームを連結
linkTextFramesAcrossPages(pushTextFrames);
嫌な予感しかしませんがとりあえず実行。やはりエラー発生!何も起こりませんでした。
この後、何回か対話してみましたが良好な結果が得られず…。やっぱりUXPはまだまだchatGPTが学べるほど情報が少ないということでしょうか。
とっいうわけで少し早いですが、ここからは人間様の手で修正します。
スポンサーリンク
ここからは人間様の出番だ!(今月2回目)
まずは
const {Text,Color}=require("scenegraph");
これは何だか意味が分からないので削除。代わりに
const {app}=require("indesign");
まずはappを定義する。次のテキストフレームを作成する関数はダメダメでした、ほぼ書き直し。
async function createTextFrame(page,x,y,width,height) {
var textFrame=page.textFrames.add();
textFrame.geometricBounds=[y,x,y+height,x+width];
return textFrame;
}
というかjsxと変わらんやんけ、asyncとletくらい。次の連結する関数もダメ!書き直し。
async function linkTextFramesAcrossPages(textFrames){
for(let i=0;i<textFrames.length-1;i++){
textFrames[i].nextTextFrame=textFrames[i+1];
};
};
これもjsxと変わらん。そんでアクティブドキュメントを定義する。
const myDoc=app.activeDocument;
ページ取得もダメみたいですね
const page=myDoc.pages[p];
ではなくUXPでは下記のような感じでした。
const page=myDoc.pages.item(p);
他にもasync・await問題もありいろいろ手を加えて、やっと上手くいきました。
完成形のコードがこちら
const {app}=require("indesign");
linkedText();
// テキストフレームを作成する関数
async function createTextFrame(page,x,y,width,height){
var textFrame=page.textFrames.add();
textFrame.geometricBounds=[y,x,y+height,x+width];
return textFrame;
};
// ページをまたいでテキストフレームを連結する関数
async function linkTextFramesAcrossPages(textFrames){
for(let i=0;i<textFrames.length-1;i++){
textFrames[i].nextTextFrame=textFrames[i+1];
};
};
async function linkedText(){
try{
// ドキュメントの参照を取得
const myDoc=app.activeDocument;
// ページ数を取得
const pageCount=myDoc.pages.length;
const pushTextFrames=[];
for(let p=0;p<pageCount;p++){
pushTextFrames.push(await createTextFrame(myDoc.pages.item(p),36,36,180,50));// テキストフレームを作成して配列に収める
};
// テキストフレームを連結
await linkTextFramesAcrossPages(pushTextFrames);
}catch(e){
alert(e);
};
};
これで狙い通りに動きます。
関数を使うときは必ず「async」を付け、呼び出すときは「await」を使わないとダメですね。スープ出来てないのにラーメンが茹で上がっちゃいます。
jsxとテキスト差分してみる
しかしこのくらいのコードなら意外とUXPでも変わらんじゃないか!
そこでテキスト差分をしてみたところ
varとletとか配列の初期化とかどっちでもいいとこ抜いたら、ほとんど変わらんし。ページの取得が違うくらいでchatGPTで余計回り道やん。
次回はのUXP版・取り消し一発「doscript」と入力ダイアログについて。まだ続きます…
スポンサーリンク
More from my site
スポンサーリンク





