Indesign脚本运行两次

时间:2014-04-10 19:27:06

标签: javascript adobe-indesign extendscript xml-import

我正在组装一个脚本来自动生成不同版本的报告。该脚本将首先导入XML文件,然后运行一些其他功能来整理Indesign项目。

当我运行此脚本时,

var myMenuAction = app.menuActions.item("Import XML...");
myMenuAction.invoke();

打开“导入XML”对话框并要求我选择要导入的XML文件,单击“打开”后,弹出“XML导入选项”框。到现在为止还挺好。但是在我单击“确定”后,再次弹出“导入XML”框。

这不是一个非常关键的问题,如果我选择了我想要的文件以及我想要的第一次选项,那么我是否再次选择它们或者只是点击“取消”似乎没有区别,所以脚本仍然按照我的意愿行事,它似乎并不是很整洁。

所以我的问题是我需要做什么才能获得一轮导入XML对话框?

1 个答案:

答案 0 :(得分:2)

是不是宣布了Guru,我实际上也被这个愚弄了。但你自己的观察是正确的!

  

...是否有可能因为有两个实例"导入XML ..."在菜单中(一个位于File下,另一个位于Structure窗口的下拉菜单中)是否正在调用它们?

这确实是正确的。 xx.item(yy)集合中检索一个或更多项。来自Marc Autret's blog

  

最大的秘密在于,上述方法都没有实际返回任何元素。 。 。除了理解一个'元素'作为对象说明符。

你得到的是对多个对象的引用,是的,有两个菜单叫做"导入XML ..."。很难说服InDesign show 有两个; myMenuAction.length不起作用("是#34;单个元素,因此它没有长度),myMenuAction.constructor.name显示[Object MenuAction] - 再次,对于单个元素。但是,alert (myMenuAction.name);最终显示(未)预期输出:

alert box showing two menus

花了大量的遍历DOM来了解如何调用只是一个。我选择了#34; File" - > "导入XML ...",这就是它所需要的:

var myMenu = app.menus.item("Main");
var fileMenu = myMenu.menuElements.item("File");
alert (fileMenu.menuItems.everyItem().name);
var myXmlMenu = fileMenu.menuItems.item("Import XML...");
alert (myXmlMenu.name);
myMenuAction = myXmlMenu.associatedMenuAction;
alert (myMenuAction.name);
myMenuAction.invoke();

如果要使用此警告,可以省略警报。请注意这些字符串在其可本地化的表单中 - 此示例仅适用于英语的InDesign,但在设置为使用其他界面语言时则不适用。

更好的方法是尽可能避免调用菜单。在这种情况下,您可以使用以下代码安全地替换代码:

folder = Folder.myDocuments;
if (File.fs == "Windows")
    myFile = folder.openDlg( 'Load XML', "XML files,*.xml;All files:*.*", false);
else
    myFile = folder.openDlg( 'Load XML', function(file)
        {
            return file instanceof Folder ||
            (!(file.hidden) && file.name.match(/\.(xml)$/i));
        }, false );
}
if (myFile)
    xml = app.activeDocument.importXml(myFile);

一些优点是它的语言环境独立;你可以自定义"打开"在另一个文件夹中启动的对话框(例如,保存当前文档的文件夹)并使用其他或更多文件过滤器;您可以将XML导入当前文档,或直接导入现有元素("导入到选定元素"以及导入XML对话框中的脚本版本);您将获得对刚加载的XML对象的引用,因此您可以在导入后立即对其进行后处理。