应用超链接目标时,Indesign 脚本 GREP 搞砸了
Indesign script GREP messes up when applying hyperlink destination
在 InDesign 中偶然发现了一个非常奇怪的脚本、GREP 和超链接问题。我正在尝试编写一个脚本 (js) 来自动创建跨大型书籍 (e-book) 的超链接。我已经成功编写了词汇表超链接脚本,但这是用于章节参考。这个想法是让 GREP 搜索找到所有匹配标题样式(下划线,在本例中为 20pt)的单词,然后在该点插入超链接目标。奇怪的是,当脚本运行时,它弄乱了 GREP 搜索结果,查找上一行的文本。
var doc = app.activeDocument;
doc.hyperlinkTextDestinations.everyItem().remove();
doc.hyperlinkTextSources.everyItem().remove();
doc.hyperlinks.everyItem().remove();
app.findGrepPreferences = app.changeGrepPreferences = null;
app.findGrepPreferences.pointSize = 20;
app.findGrepPreferences.underline = true;
app.findGrepPreferences.findWhat = '';
var results = app.activeDocument.findGrep();
for (var i=0; i < results.length; i++) {
var text = results[i].texts.firstItem();
$.writeln(text.contents);
doc.hyperlinkTextDestinations.add(
text,
{
name: text.contents
}
);
}
运行 此脚本覆盖以下文本(删除了 indesign 样式):
一个值得信赖的称号
一些文字
控制和确定性
一些文字
标题
一些文字
在 InDesign 中编写脚本
一些文字
向控制台输出以下内容:
值得信赖的头衔
控制和确定性
标题
xt
在 InDesi 中编写脚本
前 2 个是正确的,但它弄乱了最后 2 个。如果我注释掉对添加超链接目标方法的调用,我会在控制台中看到正确的文本:
值得信赖的头衔
控制和确定性
标题
在 InDesign 中编写脚本
非常感谢任何帮助。
谢谢,
改为将文本从结尾更改为开头。反转 for
循环,或(更简单)更改返回找到的结果的顺序:
var results = app.activeDocument.findGrep(true);
(这里布尔值的含义见an online reference)。
它从头到尾不起作用的原因是因为您将 result
列表存储到一个变量中,并且当您之后更改文本时它不会更新。不幸的是,'inserting a hyperlink destination' 所做的是:它在 运行 文本中插入一个隐藏字符。从那时起,所有以前找到的位置都不再可信,所以你必须重新执行 findGrep
命令(并跳过第一个找到的结果)——或者从头到尾处理结果,所以您所做的任何更改都不会影响您仍需要处理的文本。
在 InDesign 中偶然发现了一个非常奇怪的脚本、GREP 和超链接问题。我正在尝试编写一个脚本 (js) 来自动创建跨大型书籍 (e-book) 的超链接。我已经成功编写了词汇表超链接脚本,但这是用于章节参考。这个想法是让 GREP 搜索找到所有匹配标题样式(下划线,在本例中为 20pt)的单词,然后在该点插入超链接目标。奇怪的是,当脚本运行时,它弄乱了 GREP 搜索结果,查找上一行的文本。
var doc = app.activeDocument;
doc.hyperlinkTextDestinations.everyItem().remove();
doc.hyperlinkTextSources.everyItem().remove();
doc.hyperlinks.everyItem().remove();
app.findGrepPreferences = app.changeGrepPreferences = null;
app.findGrepPreferences.pointSize = 20;
app.findGrepPreferences.underline = true;
app.findGrepPreferences.findWhat = '';
var results = app.activeDocument.findGrep();
for (var i=0; i < results.length; i++) {
var text = results[i].texts.firstItem();
$.writeln(text.contents);
doc.hyperlinkTextDestinations.add(
text,
{
name: text.contents
}
);
}
运行 此脚本覆盖以下文本(删除了 indesign 样式): 一个值得信赖的称号 一些文字 控制和确定性 一些文字 标题 一些文字 在 InDesign 中编写脚本 一些文字
向控制台输出以下内容:
值得信赖的头衔 控制和确定性
标题 xt 在 InDesi 中编写脚本
前 2 个是正确的,但它弄乱了最后 2 个。如果我注释掉对添加超链接目标方法的调用,我会在控制台中看到正确的文本:
值得信赖的头衔 控制和确定性 标题 在 InDesign 中编写脚本
非常感谢任何帮助。
谢谢,
改为将文本从结尾更改为开头。反转 for
循环,或(更简单)更改返回找到的结果的顺序:
var results = app.activeDocument.findGrep(true);
(这里布尔值的含义见an online reference)。
它从头到尾不起作用的原因是因为您将 result
列表存储到一个变量中,并且当您之后更改文本时它不会更新。不幸的是,'inserting a hyperlink destination' 所做的是:它在 运行 文本中插入一个隐藏字符。从那时起,所有以前找到的位置都不再可信,所以你必须重新执行 findGrep
命令(并跳过第一个找到的结果)——或者从头到尾处理结果,所以您所做的任何更改都不会影响您仍需要处理的文本。