我已经开始了一个项目,在该项目中,我需要使用Adobe Indesign和ExtendScript从一系列INDD文件中以编程方式提取一些数据。的Javascript用于这些程序的脚本的版本不支持任何高阶函数,我已经习惯了使用(Array.reduce()
,Array.forEach()
,Array.map()
,等...)。
有没有办法将此功能添加到ExtendScript?我觉得我正在四英尺高的天花板上走来走去。
ExtendScript似乎支持纯Javascript对象(而不是Indesign DOM对象)的原型,因此可以使用polyfill添加缺少的功能。在“ Polyfill”下有关方法的页面上的MDN上可以找到Polyfill代码。这是一个示例:MDN Array.prototype.reduce()Polyfill。有众多的方法,包括polyfills Array.map()
,Array.indexOf()
,Array.filter()
,和Array.forEach()
。
要实现代码,只需在脚本所在的文件夹中创建一个适当命名的文件(即polyfill.js
或reduce.js
)。将MDF中的polyfill代码复制到您刚刚创建的文件中,如下所示:
// Production steps of ECMA-262, Edition 5, 15.4.4.21
// Reference: http://es5.github.io/#x15.4.4.21
if (!Array.prototype.reduce) {
Array.prototype.reduce = function(callback /*, initialValue*/) {
'use strict';
if (this == null) {
throw new TypeError('Array.prototype.reduce called on null or undefined');
}
if (typeof callback !== 'function') {
throw new TypeError(callback + ' is not a function');
}
var t = Object(this), len = t.length >>> 0, k = 0, value;
if (arguments.length == 2) {
value = arguments[1];
} else {
while (k < len && !(k in t)) {
k++;
}
if (k >= len) {
throw new TypeError('Reduce of empty array with no initial value');
}
value = t[k++];
}
for (; k < len; k++) {
if (k in t) {
value = callback(value, t[k], k, t);
}
}
return value;
};
}
然后在脚本的开头添加以下行,并适当替换文件名:
#include 'polyfill.js';
该行末尾的分号未包含在Adobe文档中,但是我发现,有时ExtendScript如果将其遗忘,则会抛出错误,尤其是在您#include
多次使用时。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句