我正在使用Adobe CEP(它允许开发人员为Adobe CC产品创建窗口扩展)。我的大部分代码是现代JavaScript(该平台使用Chromium 57、Node.js 7.7.4)。然而,为了访问DOM,我需要在Adobe ExtendScript中编写一些函数,并从普通JS中执行它们。唯一的方法是使用他们提供的
我不能只是将对象参数连接到脚本函数调用中,因为那么字符串将评估为
我看到有像
下面是一个类似于我当前方法的示例: functions.js(ES3/ExtendScript)
如预期,
csInterface.evalScript(script, callback)
来执行脚本。script
必须是一个字符串,在我的情况下是将函数调用转换为字符串。我想能够通过evalScript
传递对象到ExtendScript并返回,但evalScript
只接受和返回字符串。
目前,我正在将每个对象属性作为自己的参数传递。这很笨重,但它可以工作。
我的第一个想法是使用JSON.stringify()
,但不幸的是 ExtendScript 是 ECMAScript 3 的方言,这意味着不支持 JSON.parse()
。我不能只是将对象参数连接到脚本函数调用中,因为那么字符串将评估为
foo([object Object])
。我看到有像
eval()
/uneval()
或 Object.toSource()
这样的函数,但这些在 Chromium 中不受支持。下面是一个类似于我当前方法的示例: functions.js(ES3/ExtendScript)
function drawCircle(x, y, name) {
// pick a layer
var layer = app.activeDocument.layers[0];
var diameter = 10;
var top = y + diameter / 2;
var left = x - diameter / 2;
// draw ellipse in layer
var circle = layer.pathItems.ellipse(top, left, diameter, diameter);
circle.name = name;
circle.filled = true;
return true;
}
app.js(ES6)
const csInterface = new CSInterface(); // provided by Adobe
async function circle() {
const dataObject = {x: 10, y: 10, name: 'Hello world!'};
// the script to call
// evaluates to drawCircle(10,10,'Hello world!');
const script = "drawCircle(" + dataObject.x + "," + dataObject.y + ",'" + dataObject.name + "');";
return new Promise((resolve, reject) => {
csInterface.evalScript(script, (result) => {
resolve(result);
});
});
}
如预期,
circle()
成功调用了 drawCircle()
,并且在我正在工作的文档中出现了一个椭圆。然而,通过连接字符串来执行脚本/调用函数感觉非常不对劲。所以总结一下:
- 我想要一种更好的方法将
dataObject
转换为字符串,并通过evalScript()
将其传递给drawCircle()
, - 我想要从
drawCircle()
返回dataObject
并将其作为对象接收回来。目前,返回一个对象只会得到"[object Object]"
作为返回值。
$.global
,所以我必须重新启动Illustrator来清除JSON.stringify()
,然后才能使用JSON.lave()
。 - Jason WeinzierldecodeURIComponent
,它将无法覆盖某些字符。尤其是如果您需要支持旧版本,比如 Premiere 2019...(我知道escape
已被弃用) - Guntram