Last active
October 22, 2025 05:11
-
-
Save AJABON/81f2a5292c15d440bb549550d22e4112 to your computer and use it in GitHub Desktop.
InDesign: フレームグリッドやカスタムベースライングリッドなどの情報をベースライングリッドに転用するやつ
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // 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