然后,在当前的.jsx
文件顶部,您需要通过添加以下代码行#include
引入json2.js
文件:
#include "json2.js";
这类似于您如何在现代JavaScript(ES6)中使用import
语句来包含一个模块。
如果您决定将json2.js
文件保存在与您的.jsx
文件不同的位置/文件夹中,则可以提供指向该文件位置的路径名。
通过在您的.jsx
文件中包括json2.js
,您现在将拥有可用的JSON方法:JSON.parse()
和JSON.stringify()
。
以下ExtendScript(.jsx
)是一个工作示例,生成JSON以指示与当前InDesign文档(.indd
)相关联的所有链接。
example.jsx
#include "json2.js";
$.level=0;
var doc = app.activeDocument;
function loadXMPLibrary() {
if (!ExternalObject.AdobeXMPScript) {
try {
ExternalObject.AdobeXMPScript = new ExternalObject('lib:AdobeXMPScript');
} catch (e) {
alert('Failed loading AdobeXMPScript library\n' + e.message, 'Error', true);
return false;
}
}
return true;
}
function getLinksInfoAsJson(doc) {
var linksInfObj = {};
linksInfObj['indd-name'] = doc.name;
linksInfObj.location = doc.filePath.fsName;
linksInfObj.links = [];
for (var i = 0, len = doc.links.length; i < len; i++) {
var linkFilepath = File(doc.links[i].filePath).fsName;
var linkFileName = doc.links[i].name;
var xmpFile = new XMPFile(linkFilepath, XMPConst.FILE_INDESIGN, XMPConst.OPEN_FOR_READ);
var allXMP = xmpFile.getXMP();
var documentID = allXMP.getProperty(XMPConst.NS_XMP_MM, 'DocumentID', XMPConst.STRING);
var instanceID = allXMP.getProperty(XMPConst.NS_XMP_MM, 'InstanceID', XMPConst.STRING);
instanceID = instanceID ? String(instanceID) : null;
documentID = documentID ? String(documentID) : null;
linksInfObj.links.push({
'name': linkFileName,
'path': linkFilepath,
'docId': documentID,
'insId': instanceID
});
}
return JSON.stringify(linksInfObj, null, 2);
}
if (loadXMPLibrary()) {
var linksJson = getLinksInfoAsJson(doc);
$.writeln(linksJson);
}
输出:
运行上述脚本将会在您的控制台上记录JSON格式,类似于以下示例:
{
"indd-name": "foobar.indd",
"location": "/path/to/the/document",
"links":[
{
"name": "one.psd",
"path": "/path/to/the/document/links/one.psd",
"docId": "5E3AE91C0E2AD0A57A0318E078A125D6",
"insId": "xmp.iid:0480117407206811AFFD9EEDCD311C32"
},
{
"name": "two.jpg",
"path": "/path/to/the/document/links/two.jpg",
"docId": "EDC4CCF902ED087F654B6AB54C57A833",
"insId": "xmp.iid:FE7F117407206811A61394AAF02B0DD6"
},
{
"name": "three.png",
"path": "/path/to/the/document/links/three.png",
"docId": null,
"insId": null
}
]
}
注意事项:对于 JSON 的建模:
你可能已经注意到,上面的 JSON 输出结构与你在给定示例中尝试构造的结构不同。主要区别在于,你使用链接文件名作为属性/键名,例如以下示例:{
"one.psd": {
"docId": "5E3AE91C0E2AD0A57A0318E078A125D6",
"insId": "xmp.iid:0480117407206811AFFD9EEDCD311C32"
},
"two.jpg": {
"docId": "EDC4CCF902ED087F654B6AB54C57A833",
"insId": "xmp.iid:FE7F117407206811A61394AAF02B0DD6"
}
...
}
这种生成类似于示例的JSON并不理想,因为如果您有两个链接,它们都具有相同的名称,那么您只会报告其中一个。在对象内部,您不能有两个具有相同名称的属性/键。
编辑:
针对OP的评论做出回应:
嗨,RobC,除了使用#include 'json2.js'
外,还有其他方法可以在JSX文件中包含外部js文件吗?
以下是几种替代方法:
您可以利用$.evalFile()
。例如,将#include"json2.js";
替换为以下两行:
var json2 = File($.fileName).path + "/" + "json2.js";
$.evalFile(json2);
注意: 这个例子假设json2.js
与您的.jsx
文件在同一文件夹中。
或者,如果你想完全避免存在额外的json2.js
文件。你可以在你的.jsx
文件的顶部添加一个IIFE(立即调用函数表达式),然后将json2.js文件的内容复制粘贴到其中。例如:
(function () {
})();
注意:如果代码大小是一个问题,那么请考虑在将json2.js
的内容粘贴到IIFE之前对其进行压缩。