rubyFlagの設定でエラーが出てしまいます(UXP)
OS:Windows 11
InDesgin ver:ver.19
後ルビのテキストにルビを振るスクリプトをUXPで書きましたが、「rubyFlagのプロパティがない」と エラーが出てしまいます。
元々同じ用途で書いていたスクリプトはエラーを吐かなかったのですが、「𠮷」のような文字がJavaScriptの仕様上ズレてしまうのに対応するため、ルビをチェックする部分を改変しました。
親文字部分が「ズレる漢字」が0~1文字の場合しか現状対応はできていないのですが、**rubyPositions**の値はブラウザ上でJSとして実行しても、カウントは問題ありませんでした。(なぜブラウザでテストしたかは後述)
itemByRangeで範囲が誤っていて(あり得ない区間になっている?)、返り値にObjectが設定されていないのかもしれないと考えています。
Characters.itemByRange()はInDesignに実際に表示されている文字(グリフ)でカウントされていて、かつ閉区間[a,b]での指定だと思っていたのですが、なにぶん公式リファレンスだと情報が足りず、また事情があってInDesignが入っていない環境でコーディング・テストをしなければならないためテストができなくお手上げ状態になってしまいました…。
もしUXPでのCharacters.itemByRange()の挙動についてお詳しい方がおられればアドバイスをいただきたいです。
// 省略
const START_RUBY_CHAR = "(";
const END_RUBY_CHAR = ")";
main();
function main() {
const selected = doc.selection;
selected.forEach((s) => {
const rubyPositions = checkRuby(s);
setRuby(s, rubyPositions);
});
}
function checkRuby(textFrame) {
// 省略
rubyPositions.push({
kanjiStart: j + 1, // 漢字以外にマッチした時にここに到達するので +1 する。文頭かつ漢字の場合は j=-1 なので 0。
rubyStart: rubyStartIndex + 1, // ふりがなの先頭インデックス
rubyEnd: rubyEndIndex, // ")"のインデックス
shiftCount: shiftCount, // このルビでの"("までに出てくる文字のズレのカウント
curCount: curCount, // 親文字開始部分とふりがな開始部分でのズレのカウントの差
});
// 省略
return rubyPositions;
}
function setRuby(textFrame, rubyPositions) {
// positionがずれていくため、後ろから操作する
for (let i = rubyPositions.length - 1; i > -1; i--) {
let rubyString = "";
try {
rubyString = textFrame.parentStory.contents
.substring(rubyPositions[i].rubyStart - rubyPositions[i].shiftCount, rubyPositions[i].rubyEnd) // contentsの返り値はstringなのでshiftCountは使わない
.trim();
} catch (error) {
alert(error.message);
return;
}
textFrame.parentStory.texts
.itemByRange(
rubyPositions[i].rubyStart - 1 - rubyPositions[i].shiftCount,
rubyPositions[i].rubyEnd - rubyPositions[i].shiftCount
)
.remove();
const rubyObject = textFrame.parentStory.characters.itemByRange(
rubyPositions[i].kanjiStart -
rubyPositions[i].shiftCount +
rubyPositions.curCount,
rubyPositions[i].rubyStart - 2 - rubyPositions[i].shiftCount
);
rubyObject.rubyFlag = true; // ここでエラー?
rubyObject.rubyType = 1249011570; // グループルビ定数
// rubyObject.rubyType = RubyTypes.GROUP_RUBY; // 定数はエラーになってしまう?
rubyObject.rubyString = rubyString;
}
}
// InDesignにアラートを表示する関数
// 省略
