在TextFrames中查找变量和嵌套的pageItems

时间:2014-07-11 16:06:54

标签: javascript adobe-indesign

我需要导航并提取TextFrame的内容;这意味着:文本,其样式,变量和内部pageItems。

我可以列出所有段落,对于每个段落,我都可以获得TextStyleRanges(请参阅this question),但他们的content不会包含变量' values和pageItems。

我可以列出所有textVariableInstances,但不会告诉我他们在文本中的位置。

同样,我可以列出pageItems,但不提及它们在文本方面的位置。

有时(仅有时候)我得到一个范围只能理解一个字符,在这种情况下我可以得到变量和pageItems;但由于情况并非如此,这不是解决方案。

我可以迭代一个段落的所有字符,从而得到我需要的一切,但这似乎太慢了。

我错过了什么?

如何按预期顺序获取段落的所有文本和非文本部分?

修改

实际上,Dirk的建议很有效,但显然只有当我从TextFrame访问textVariableInstances时才会这样做。我是在TextFrame中的段落内的TextStyleRange中的Text中访问它,因为我试图以递归方式遍历和转换文档。在Text对象中,我有textVariableInstances,但他们的storyOffset属性缺少属性isValidtoSpecifierindex以及谁知道其他人。

所以,我想我现在的问题是:要知道变量实例在Text对象中的位置,我可以可靠地使用类似的东西:

myVariableInstance.storyOffset.index - myText.insertionPoints[0].index

这样我可以用变量的resultText值替换相应的char?

1 个答案:

答案 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();