我需要导航并提取TextFrame
的内容;这意味着:文本,其样式,变量和内部pageItems。
我可以列出所有段落,对于每个段落,我都可以获得TextStyleRanges
(请参阅this question),但他们的content
不会包含变量' values和pageItems。
我可以列出所有textVariableInstances
,但不会告诉我他们在文本中的位置。
同样,我可以列出pageItems
,但不提及它们在文本方面的位置。
有时(仅有时候)我得到一个范围只能理解一个字符,在这种情况下我可以得到变量和pageItems;但由于情况并非如此,这不是解决方案。
我可以迭代一个段落的所有字符,从而得到我需要的一切,但这似乎太慢了。
我错过了什么?
如何按预期顺序获取段落的所有文本和非文本部分?
修改
实际上,Dirk的建议很有效,但显然只有当我从TextFrame访问textVariableInstances
时才会这样做。我是在TextFrame中的段落内的TextStyleRange中的Text中访问它,因为我试图以递归方式遍历和转换文档。在Text对象中,我有textVariableInstances,但他们的storyOffset
属性缺少属性isValid
,toSpecifier
,index
以及谁知道其他人。
所以,我想我现在的问题是:要知道变量实例在Text对象中的位置,我可以可靠地使用类似的东西:
myVariableInstance.storyOffset.index - myText.insertionPoints[0].index
这样我可以用变量的resultText
值替换相应的char?
答案 0 :(得分:2)
textVariableInstance的storyOffset属性产生一个insertionPoint,其索引是包含故事内的实际数字偏移量。 storyOffset属性可用于许多其他可放置在文本中的对象。
对于锚定页面项目,请使用父属性 - 它将产生一个字符。
var t = app.activeDocument.textFrames.item(0);
$.writeln(t.textVariableInstances.item(0).storyOffset.index);
$.writeln(t.rectangles.item(0).parent.index);
修改强>
在编辑之后,您必须在构建文本时做错事。如前所述,您可以在调试器中使用isValid和toSpecifier()来查找它中断的位置。
以下代码适用于我,但对于通用方法,您需要考虑更多可嵌入文本中的内容,例如:特殊字符,包括各个段落结尾,超链接,xml元素,锚定页面项。
#target indesign-8.0
function main() {
var doc = app.activeDocument;
for( var fi=0; fi<doc.textFrames.length; fi++ ) {
var f = app.activeDocument.textFrames.item(fi);
var s = f.parentStory;
for( var pi=0; pi<f.paragraphs.length; pi++ ) {
var p = f.paragraphs.item(pi);
var pl = p.characters.lastItem();
for( var ri=0; ri<p.textStyleRanges.length; ri++ ) {
var r = p.textStyleRanges.item(ri);
var rf = r.characters.firstItem();
var rl = r.characters.lastItem();
var t = r;
if( rl.index>pl.index ) // range goes beyond paragraph
t = s.texts.itemByRange(rf,pl);
$.writeln("text=",t.contents);
if( t.textVariableInstances.length>0 ) {
var tv = t.textVariableInstances.item(0);
$.writeln("variable=",tv.name," ",tv.storyOffset.index);
}
}
$.writeln("\\n");
}
}
}
main();