Skip to content

Instantly share code, notes, and snippets.

@AJABON
Last active October 22, 2025 05:11
Show Gist options
  • Select an option

  • Save AJABON/81f2a5292c15d440bb549550d22e4112 to your computer and use it in GitHub Desktop.

Select an option

Save AJABON/81f2a5292c15d440bb549550d22e4112 to your computer and use it in GitHub Desktop.
InDesign: フレームグリッドやカスタムベースライングリッドなどの情報をベースライングリッドに転用するやつ
// baselineGridSetter.jsx InDesign 2025.09.12 (z-)
//
// ヨコ組み限定(タテ組み時のエラー処理してない)
// フレームグリッドやカスタムベースライングリッドなどの情報をベースライングリッドに転用するやつ
//
// カスタムのベースライングリッド > フレームグリッド > ドキュメントグリッド の優先度で対応する
// フレームグリッド > ドキュメントグリッド の場合は、揃え位置を選択できる
// 選択テキスト or テキストフレームにグリッド揃えがある場合、ラジオボタンの初期選択に反映
// てなかんじです
if(app.documents.length == 0){
errFunc();
}
var doc = app.activeDocument;
// カスタムのベースライングリッド > フレームグリッド > ドキュメントグリッド の優先度で取得
var val; // 対象の区分用
if(doc.selection.length){
var sel = app.selection[0];
var txt, obj;
if(sel.hasOwnProperty("baseline")){
txt = sel.texts[0];
}
if(sel.hasOwnProperty("texts")){
obj = sel.texts[0].parentTextFrames[0];
if(txt == undefined){
txt = obj.texts[0];
}
}
if(txt && obj){
// カスタムのベースライングリッドを使用
if(obj.baselineFrameGridOptions.useCustomBaselineFrameGrid == true){
val = 1;
}
// フレームグリッド
if(txt.parentStory.storyPreferences.frameType == FrameTypes.FRAME_GRID_TYPE){
val = 2;
}
}
}
// ドキュメントグリッド
if(val == undefined){
val = 3;
}
var myGridData;
switch(val){
case 1: // カスタムのベースライングリッドを使用
alert("ベースライングリッドを\nカスタムのベースライングリッドに合わせますー。");
app.doScript("customBaselineGridToDocumentBaselineGrid()", ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
break;
case 2: // フレームグリッド
alert("ベースライングリッドを\nフレームグリッドに合わせますー。\n次のダイアログで揃え位置を選択してください。");
myGridData = txt.parentStory.gridData;
selectGridAlignment();
break;
case 3: // ドキュメントグリッド
alert("ベースライングリッドを\nドキュメントグリッドに合わせますー。\n次のダイアログで揃え位置を選択してください。");
myGridData = app.activeWindow.activePage.gridData;
selectGridAlignment();
break;
default:
errFunc();
}
function selectGridAlignment(){
if(val == 2){
var gridAlignment = txt.paragraphs[0].gridAlignment.toString();
var alignToObj = {
ALIGN_EM_TOP: 0,
ALIGN_EM_CENTER: 2,
ALIGN_BASELINE: 2,
ALIGN_EM_BOTTOM: 3
};
}
var dlg = new Window('dialog{text:"予定するグリッド揃えを選択", \
RG: Panel{orientation:"column", alignChildren:"left", spacing:4, \
ALIGN_EM_TOP: RadioButton{text:"仮想ボディの上", enumStr: "ALIGN_EM_TOP"},\
ALIGN_EM_CENTER: RadioButton{text:"仮想ボディの中央", enumStr: "ALIGN_EM_CENTER", value:true},\
ALIGN_BASELINE: RadioButton{text:"欧文ベースライン", enumStr: "ALIGN_BASELINE"},\
ALIGN_EM_BOTTOM: RadioButton{text:"仮想ボディの下", enumStr: "ALIGN_EM_BOTTOM"}\
}, \
BB: Group{orientation:"row", alignment:"right",\
cancelBtn: Button{text:"キャンセル", preferredSize:[70,20], properties:{name:"cancel"}}\
okBtn: Button{text:"OK", preferredSize:[70,20], properties:{name:"ok"}},\
}\
}');
var enumStr = dlg.RG.children[1].enumStr; // 初期値は中央
if(val == 2 && gridAlignment.match(/EM_TOP|EM_CENTER|BASELINE|EM_BOTTOM/)){
enumStr = gridAlignment;
try{
eval("dlg.RG." + enumStr + ".value = true");
}catch(e){}
}
for(var i = 0; i < dlg.RG.children.length; i++){
dlg.RG.children[i].onClick = function(){
enumStr = this.enumStr;
}
}
if(dlg.show() != 1){
errFunc();
}
var alignTo = enumStr.toLowerCase().replace(/^.+_(?!_+$)/, "");
app.doScript("gridDataToBaselineGrid('" + alignTo + "')", ScriptLanguage.JAVASCRIPT, [], UndoModes.FAST_ENTIRE_SCRIPT);
}
// フレームグリッド|ドキュメントグリッドをベースライングリッドに設定
function gridDataToBaselineGrid(alignTo){
// UnitValueでケーサンしたいんだけど QとかHAが非対応なので、いったん定規水平の単位で値の扱いを統一する
var defaultMU = app.scriptPreferences.measurementUnit;
app.scriptPreferences.measurementUnit = doc.viewPreferences.horizontalMeasurementUnits;
var myPointSize = myGridData.pointSize;
if(val == 2){// フレームグリッド
//フレームグリッド1行目の天座標 フレーム内マージンを考慮
var top = obj.geometricBounds[0] + obj.textFramePreferences.insetSpacing[0];
}else{ // ドキュメントグリッド
var top = app.activeWindow.activePage.marginPreferences.top;
}
var center = top + myPointSize / 2;
var baseline = top + myPointSize * 0.8800048828125; // 仮想ボディの欧文ベースライン位置
var bottom = top + myPointSize;
// ベースライングリッド開始位置に適用
eval("doc.gridPreferences.baselineStart = " + alignTo + ";");
// フレームグリッドの行送り値=文字サイズ+行間__ 行間は常時ポイントでしか取得できないのである
var lv = myPointSize + UnitValue(myGridData.lineAki, "pt").as(app.scriptPreferences.measurementUnit);
// ベースライングリッド間隔に適用
doc.gridPreferences.baselineDivision = lv;
//必要あるかわからないけど設定をモドス
app.scriptPreferences.measurementUnit = defaultMU;
}
// カスタムのベースライングリッドをドキュメントのベースライングリッドに適用
function customBaselineGridToDocumentBaselineGrid(){
doc.gridPreferences.baselineStart = obj.geometricBounds[0] + obj.baselineFrameGridOptions.startingOffsetForBaselineFrameGrid;
doc.gridPreferences.baselineDivision = obj.baselineFrameGridOptions.baselineFrameGridIncrement;
}
function errFunc(){
alert("帰れっ!(ఠ虫ఠ)");
exit();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment