gpt4 book ai didi

javascript - InDesign 脚本 : footnotes loosing their style

转载 作者:行者123 更新时间:2023-12-03 11:41:04 25 4
gpt4 key购买 nike

好的,我知道这已经讨论过 here但没有提供明确的答复。我经常需要将 XML 文件导入 InDesign,其中包括许多脚注。当然,在这种情况下,InD 无法自动使用标签。除了所有脚注都失去了样式之外,该脚本效果很好。我知道这可能是因为第 27 行和第 35 行的 contents 。需要使用 move 来代替。不幸的是,我不擅长 JavaScript,无法弄清楚如何正确实现它。

Application.prototype.main = function(){
if ( this.documents.length <= 0 ) return;
var tg = this.selection[0] || this.activeDocument;
if( 'appliedFont' in tg ) tg = tg.parent;
if( tg.constructor == TextFrame ){ tg = tg.parentStory ; }
if(! ('findGrep' in tg) ) return;

var fnPatterns = ["@foot@([\\s\\S]*?)@foot@", "@footnotes_begin@([\\s\\S]*?)@footnotes_end@"];
var count = 0;

for(patterCounter = 0; patterCounter < fnPatterns.length; patterCounter++){
fnPattern = fnPatterns[patterCounter];

var fnFinds = (function(){
this.findGrepPreferences = this.changeGrepPreferences = null;
this.findGrepPreferences.findWhat = fnPattern;
var ret = tg.findGrep();
this.findGrepPreferences = this.changeGrepPreferences = null;

return ret;
}).call(this);


var fnFind, fnText, rg = new RegExp(fnPattern), ip, fnParent, fn, count;

while( fnFind=fnFinds.pop() ){
fnText = fnFind.contents.match(rg)[1];


fnParent = fnFind.parent.getElements()[0];
ip = fnFind.insertionPoints[0].index
try {
fnFind.remove();
fn = fnParent.footnotes.add(LocationOptions.BEFORE, fnParent.insertionPoints[ip]);
fn.texts[0].insertionPoints[-1].contents = fnText;
++count;
}
catch(_){}
}
}

alert((count)? (count+" footnote(s) successfully added."): "No footnote added. Make sure you use the relevant pattern.");
}
app.doScript('app.main();', ScriptLanguage.javascript,
undefined, UndoModes.entireScript, app.activeScript.displayName);

最佳答案

问题与您链接到的问题完全相同:您正在 Javascript 中操作纯字符串翻译,而不是 native InDesign 文本对象本身。请对找到的列表的 text 属性使用 moveduplicate 方法。

基本的解决方案是使用

    fn = fnFind.footnotes.add(LocationOptions.AFTER, fnFind.insertionPoints[-1]);
fnFind.texts[0].move (LocationOptions.AT_END, fn.texts[0]);

但这也会复制开始和结束标记。去除它们需要更多的时间;我根据您的 GREP 模式在您的原始脚本中进行了以下调整,但构建 前缀/后缀 对的显式列表可能更安全,因为您也可以使用它们构建 GREP 搜索。

接下来的问题是,如果您复制(在 InDesign 的 DOM 中重复)找到的文本,原始的“找到”文本现在将附加脚注到它!这是因为在前一行,您将脚注添加到“找到的”文本。所以你不能使用简单的remove来删除它;再次,您需要操作 text 对象,但这次是通过它的各个字符。我最后调整的行“选择”fnFind 文本,减去它的最后一个字符(这是新添加的脚注),然后将其删除。

var fnFind, fnPrefix,fnSuffix, rg = new RegExp(fnPattern), ip, fnParent, fn, count;

while( fnFind=fnFinds.pop() ){
fnPrefix = fnFind.contents.match(/^@[^@]+@/)[0];
fnSuffix = fnFind.contents.match(/@[^@]+@/)[0];

// add footnote
fn = fnFind.footnotes.add(LocationOptions.AFTER, fnFind.insertionPoints[-1]);
// duplicate the text
fnFind.texts[0].characters.itemByRange(fnPrefix.length,fnFind.texts[0].characters.length-fnSuffix.length-1).duplicate(LocationOptions.AT_END, fn.texts[0]);
// remove the original
fnFind.characters.itemByRange(0,fnFind.characters.length-2).remove();
++count;
}

关于javascript - InDesign 脚本 : footnotes loosing their style,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26273356/

25 4 0
文章推荐: javascript - 通过PHP函数获取