よろよろ帳

InDesign JavaScript 勉強中

グループの一部解除

スペックとアイコンがグループ化されてて普通に解除するとアイコンはグループになってるけどスペックはばらばらになるよその自動処理データにイラっとして書きました。アイコンは20%offとかで数字を検索して親グループをカット&ペーストします。段落スタイルが設定されていたらよかったのですが一番嫌な[基本段落]+でした。

app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){
var Doc=app.activeDocument;
var tmpPasteRemembersLayers=app.clipboardPreferences.pasteRemembersLayers;
app.clipboardPreferences.pasteRemembersLayers=true;
app.findGrepPreferences.findWhat="^[0-9]+";
app.findGrepPreferences.appliedFont="適用フォント名";
app.findGrepPreferences.fillColor="スウォッチ名";
var Res=Doc.findGrep();
for(var i=0; i<Res.length; i++){
    app.select(Res[i].parentTextFrames[0].parent);//グループ選択
    app.cut();
    app.pasteInPlace();
    }
app.clipboardPreferences.pasteRemembersLayers=tmpPasteRemembersLayers;
}

はじめにアイコンのテキストフレームをダイレクト選択して

alert(app.selection[0].parent.constructor.name)

でGroupを確認しました。

適用フォント名の取得は

var sel=app.selection[0];//テキスト選択
var TF=app.activeDocument.textFrames.add();
TF.contents=sel.appliedFont.name;
TF.fit(FitOptions.FRAME_TO_CONTENT);

↓参考
『レイヤーを記憶してペースト』はライブラリやスニペット配置にも効くみたい|InDesign|ぼんぷろぐ
https://www.indesignjs.de/extendscriptAPI/indesign-latest/#FindGrepPreference.html

使用フォント書き出し

開いているインデザインドキュメントの使用フォント一覧を新規ドキュメントに表示します。

var Doc= app.activeDocument;
var Fon=[];
for(var i=0; i<Doc.fonts.length; i++){
    Fon.push(Doc.fonts[i].fullNameNative);
    }
Fon.sort();
var Doc2 = app.documents.add({documentPreferences:{pageWidth:210,pageHeight:297}});
var tx=Doc2.textFrames.add({geometricBounds:[0,0,297,210]});
tx.contents = Fon.join("\r");

使用フォント一覧をテキストファイルでインデザインドキュメントと同階層に保存します。

var Doc= app.activeDocument;
var Fon=[];
for(var i=0; i<Doc.fonts.length; i++){
    Fon.push(Doc.fonts[i].fullNameNative);
    }
Fon.sort();
var FonFile = new File(Doc.filePath+"/fontlist.txt");
FonFile.open("w");
FonFile.write(Fon.join("\r"));
FonFile.close();

セル色[なし]を[紙色]に

表の背景に色が入った時などに。
セル塗り色変更

//ドキュメント上の表全部
app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){
var Doc = app.activeDocument;
app.findTextPreferences.findWhat =NothingEnum.nothing;
app.findTextPreferences.findWhat ="<0016>";//表を検索
var Res=Doc.findText();
for(var i=0; i<Res.length; i++){
    var ResT=Res[i].tables[0];
    for(var j=0; j<ResT.cells.length; j++){
        if(ResT.cells[j].fillColor.name=="None")
        ResT.cells[j].fillColor="Paper";
        }
    }
app.findTextPreferences.findWhat =NothingEnum.nothing;
}
//選択した表
app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){
var sel=app.activeDocument.selection[0];//表を選択
for(var j=0; j<sel.cells.length; j++){
    if(sel.cells[j].fillColor.name=="None")
    sel.cells[j].fillColor="Paper"
    }
}

縦組のみ置換

単位を合字に小数点を中黒に。
どなたかが公開されていた全角数字を半角にするスクリプトを参考にしました。

app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){
var F=["(?<=\\d)cm","(?<=\\d)mm","(?<=\\d)kg","\\.","(?<=\\d)cc","(?<=\\d)ml"];//バックスラッシュ1個だと検索パネルに出ない(macだけ?)
var C=["㎝","㎜","㎏","・","㏄","㎖"];//リットルはLが正しいみたい
var Pg = app.activeDocument.allPageItems;
for (var i=0; i<Pg.length; i++){ 
    if(Pg[i].constructor.name == 'TextFrame'&&Pg[i].parentStory.storyPreferences.storyOrientation==StoryHorizontalOrVertical.VERTICAL){//縦組抽出
        for(var j=0; j<F.length; j++){
            app.findGrepPreferences.findWhat =F[j];
            app.changeGrepPreferences.changeTo =C[j];
            Pg[i].parentStory.changeGrep();
            }
        }
    }
}

追記。allPageItem→storyに手直し。冗長でした。

app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){
var F=["(?<=\\d)cm","(?<=\\d)mm","(?<=\\d)kg","\\.","(?<=\\d)cc","(?<=\\d)ml"];
var C=["㎝","㎜","㎏","・","㏄","㎖"];
var St = app.activeDocument.stories;
for (var i=0; i<St.length; i++){
    if(St[i].storyPreferences.storyOrientation==StoryHorizontalOrVertical.VERTICAL){
        for(var j=0; j<F.length; j++){
            app.findGrepPreferences.findWhat =F[j];
            app.changeGrepPreferences.changeTo =C[j];
            St[i].changeGrep();
            }
        }
    }
}

字取り用

項目[0]とコロン[1]と内容[2]で3つのフレームに分かれているデータに出会ってしまいました。順に選択後実行。[0]にまとめて残りは消します。テキストフレームの字取りデフォルト13Qなのでいったん級数に合わせたフレームグリッドにして戻します。

字取り用
ぼかしました
app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){
var sel=app.activeDocument.selection;
var selGB=sel[0].geometricBounds;
var selGB2=sel[2].geometricBounds;
var ary=[];
sel[2].contents=sel[2].contents.replace(/\r/g,"@\r");//改行用(もっといい方法ありそう)
for(var i=0; i<sel[0].lines.length; i++){//中身まとめる
    for(var j=0; j<sel.length; j++){
    ary.push(sel[j].lines[i].contents);
    }
}
var str=ary.join("");
var selQ=sel[0].parentStory.pointSize;
sel[0].parentStory.storyPreferences.frameType = FrameTypes.FRAME_GRID_TYPE;
sel[0].parentStory.gridData.pointSize=selQ;
sel[0].parentStory.storyPreferences.frameType = FrameTypes.TEXT_FRAME_TYPE;
sel[0].geometricBounds=[selGB[0],selGB[1],Math.max(selGB[2],selGB2[2]),selGB2[3]];
sel[0].parentStory.contents=str.replace(/\r/g,"").replace(/@/g,"\r");
sel[0].parentStory.justification=Justification.LEFT_ALIGN;
var arr2=[];
for(var i=0; i<sel[0].paragraphs.length; i++){
    arr2.push(sel[0].paragraphs[i].contents.indexOf(":"))
    }
var max=arr2.sort(function(a,b){return a < b});//降順
app.findGrepPreferences = app.changeGrepPreferences = null; 
app.findGrepPreferences.findWhat = "^.+(?=:)";
app.changeGrepPreferences.jidori=max[0];//最大値
sel[0].parentStory.changeGrep();
app.findGrepPreferences = app.changeGrepPreferences = null; 
app.findGrepPreferences.findWhat = ":";
app.changeGrepPreferences.leadingAki=0.25;//四部アキ
app.changeGrepPreferences.trailingAki=0.25;
sel[0].parentStory.changeGrep();
app.findGrepPreferences = app.changeGrepPreferences = null; 
for(var i=1; i<sel.length; i++){
    sel[i].remove();
    }
}
//分かれてないやつ用
app.doScript (main, ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
function main (){
var sel=app.activeDocument.selection[0];//テキストフレーム選択
var selGB=sel.geometricBounds;
var selQ=sel.parentStory.pointSize;
sel.parentStory.storyPreferences.frameType = FrameTypes.FRAME_GRID_TYPE;
sel.parentStory.gridData.pointSize=selQ;
sel.parentStory.storyPreferences.frameType = FrameTypes.TEXT_FRAME_TYPE;
sel.geometricBounds=selGB;
var arr=[];
for(var i=0; i<sel.paragraphs.length; i++){
    arr.push(sel.paragraphs[i].contents.indexOf(":"))
    }
var max=arr.sort(function(a,b){return a < b});
app.findGrepPreferences = app.changeGrepPreferences = null; 
app.findGrepPreferences.findWhat = "^.+(?=:)";
app.changeGrepPreferences.jidori=max[0];
sel.parentStory.changeGrep();
app.findGrepPreferences = app.changeGrepPreferences = null; 
app.findGrepPreferences.findWhat = ":";
app.changeGrepPreferences.leadingAki=0.25;
app.changeGrepPreferences.trailingAki=0.25;
sel.parentStory.changeGrep();
app.findGrepPreferences = app.changeGrepPreferences = null; 
}

Scripts Panelに入れるときパスワード不要にする

f:id:keruteru:20211101171544p:plain:w400f:id:keruteru:20211101171546p:plain:w400
新しいmacの設定でどうやるか忘れていたので。
アプリケーションフォルダ選択して⌘I(情報を見る)
右下の鍵を外す(これはパスワード必要)
歯車から「内包している項目に適用…」を選んでOK。