InDesign脚本问题:批量标记YYY标签时未跳过已标记XXX的文本
问题解决:InDesign脚本中正确跳过已标记XML标签的文本
原代码的核心问题
你的脚本之所以会把已标记XXX的文本也打上YYY标签,是因为判断逻辑存在错误:
text.associatedXMLElements是XML元素的集合对象,不是单个XML元素,直接调用.name会返回undefined,导致undefined !== "XXX"永远为true,所有文本都会进入标记分支。
修正后的脚本
var mySelection = app.selection[0]; // 获取选中的文本框 var tagToApply = "YYY"; // 要应用的标签 var tagToSkip = "XXX"; // 需要跳过的标签 var myTextFrame = mySelection; var myStory = myTextFrame.parentStory; var rootXML = app.activeDocument.xmlElements.item(0); // 获取XML根节点 // 检查文本是否未被指定标签标记 function shouldTag(textObj) { // 遍历文本关联的所有XML元素,检查是否存在要跳过的标签 for (var j = 0; j < textObj.associatedXMLElements.length; j++) { var xmlElem = textObj.associatedXMLElements[j]; if (xmlElem.name === tagToSkip) { return false; // 找到要跳过的标签,返回不标记 } } // 检查是否已被目标标签标记,避免重复操作 for (var k = 0; k < textObj.associatedXMLElements.length; k++) { var xmlElem = textObj.associatedXMLElements[k]; if (xmlElem.name === tagToApply) { return false; } } return true; // 符合标记条件,返回true } // 遍历故事中的所有文本范围,处理未被标记的部分 var allTextRanges = myStory.textRanges; for (var i = 0; i < allTextRanges.length; i++) { var currentRange = allTextRanges[i]; if (shouldTag(currentRange)) { // 为文本范围添加XML标签 rootXML.xmlElements.add(tagToApply, currentRange); } }
关键修改说明
- 修正标签判断逻辑:
shouldTag函数会遍历文本关联的所有XML元素,确认是否存在要跳过的XXX标签,或者已经被YYY标记,只有都不满足时才执行标记操作。 - 改用
textRanges遍历:相比texts集合按单个字符拆分的方式,textRanges会按连续文本块划分,更高效地处理未标记区域。 - 增加重复标记检查:避免对已经是
YYY标签的文本重复添加,减少无效操作。
内容的提问来源于stack exchange,提问作者D.I. Abigor
相关产品推荐
相关产品推荐

