将 Applescript 列表传递给 javascript ExtendScript 作为 Indesign 的数组
Passing Applescript list to javascript ExtendScript as array for Indesign
背景
我有一大堆 Applescripts(AS),设计人员将其与 InDesign 一起使用,以帮助处理生产工作流程。 AS 有很多 OS 交互,而 JavaScript 做不到,所以离开 AS 是不可能的。
由于限制,我几乎无法安装任何东西。
我无法更新任何东西。脚本编辑器和 ExtendScript 工具包是我必须使用的工具。
运行环境:
OS X 10.8.5 &
Adobe CS6
工作原理
用户首选项作为属性保存在用户文档文件夹中的本地 Applescript 中。
###property grabber.scpt
set mypath to path to documents folder
set mypropertiesfile to ((mypath & "myproperties.scpt") as string)
set thePropertyScript to load script file mypropertiesfile
set designerinitials to (designerinitials of thePropertyScript) ETC...
一些属性是 AS 列表。
为什么我需要JS?
我正在制作调色板,我更愿意使用 ScriptUI 而不是像这样在 AS 中全部完成:
set dlgRef to make dialog with properties {name:"User Settings", can cancel:true, label:"Dialog Label"}
AS交给JS的字符串是这样的:
{"myname",{firstvalue:"test", secondvalue:"val2", thirdvalue: "val3"},{firstvalue:"test2", secondvalue:"val2", thirdvalue: "val3"}}
这些不是列表,而是文本...
JS
myAppleScript = new File("valid_path_to/property grabber.scpt");
var myreturn = app.doScript(myAppleScript, ScriptLanguage.applescriptLanguage);
var myname = myreturn[0];
var firstlist = myreturn[1];
var secondlist = myreturn[2];
ExtendScript 数据浏览器显示:
firstlist = {firstvalue:"test", secondvalue:"val2", thirdvalue: "val3"}
这不是数组...
我试过使用https://github.com/KAYLukas/applescript-json
json 对列表进行编码,但结果相同。
firstlist = [{firstvalue:"test", secondvalue:"val2", thirdvalue: "val3"}]
我还用
让它变得简单多了
firstlist = {"test","val2","val3"}
JS 仍然将其视为字符串而不是数组。
知道我需要做什么或做错了什么吗?我希望它很简单,如果我得到答案我会觉得自己很愚蠢...
我讨厌在花时间 post 一个复杂的问题后找到答案。
var path = ((File($.fileName)).path); // this is the path of the script
// now build a path to another js file
// e.g. json lib https://github.com/douglascrockford/JSON-js
var libfile = File(path +'/_libs/json2.js');
if(libfile.exists)
$.evalFile(libfile);
像尼奥学功夫,一下子就过去了,"Whoa, I know JSON!"
var firstlist = JSON.parse(myresult[1]);
给我可用的对象
doScript 可以将脚本参数从一种语言传递到另一种语言。以下是受文档启发的片段:
var aps = "tell application \"Adobe InDesign CC 2014\"\
tell script args\
set user to item 1 of {\"John\", \"Mike\", \"Brenda\"}\
set value name \"user\" value user\
\"This is the firest AppleScript script argument value.\"\
end tell\
end tell"
app.doScript(aps, ScriptLanguage.applescriptLanguage);
var user = app.scriptArgs.getValue("user");
alert( user+ "from JS" );
我认为脚本参数不会 return 除了字符串之外的任何东西,即使它们可以表示任何类型的值。但是,可以使用像这样的拆分方法轻松地将字符串转换为数组:
var aps = "set ls to {\"john\", \"mark\"}\
set n to count of items of ls\
set str to \"\"\
repeat with i from 1 to n\
set str to str & item i of ls\
if i < n then\
set str to str & \",\"\
end if\
end repeat\
tell application \"Adobe InDesign CC 2014\"\
tell script args\
set value name \"str\" value str\
end tell\
end tell";
app.doScript(aps, ScriptLanguage.applescriptLanguage);
var str = app.scriptArgs.getValue("str");
var arr = str.split(",");
alert( "Item 1 of APS list is \""+arr[0]+ "\" in the JS context" );
想法是将 APS 列表扁平化为逗号分隔的字符串,稍后将在 javascript 上下文中拆分以将其转换为数组。
很高兴您有一些有用的东西,但是如果您要将文本传递给 ExtendScript,为什么不在 AS 端将其格式化为 ExtendScript 友好的格式,例如 ['firstvalue'、'secondvalue'、 'thirdvalue"'] --但这将是 AS 中的字符串,例如
--in AS:
"['firstvalue', 'secondvalue', 'thirdvalue"']"
然后,在 ExtendScript 中,如果它在变量中,例如 myData,您可以这样做(就像我刚刚在 ExtendScript Toolkit 中所做的那样):
//in JS:
myArray = eval(myData);
我知道在网络工作中使用 eval() 是邪恶的,但对于 ExtendScript 的东西,它可能非常有用。
背景
我有一大堆 Applescripts(AS),设计人员将其与 InDesign 一起使用,以帮助处理生产工作流程。 AS 有很多 OS 交互,而 JavaScript 做不到,所以离开 AS 是不可能的。
由于限制,我几乎无法安装任何东西。 我无法更新任何东西。脚本编辑器和 ExtendScript 工具包是我必须使用的工具。
运行环境: OS X 10.8.5 & Adobe CS6
工作原理
用户首选项作为属性保存在用户文档文件夹中的本地 Applescript 中。
###property grabber.scpt
set mypath to path to documents folder
set mypropertiesfile to ((mypath & "myproperties.scpt") as string)
set thePropertyScript to load script file mypropertiesfile
set designerinitials to (designerinitials of thePropertyScript) ETC...
一些属性是 AS 列表。
为什么我需要JS?
我正在制作调色板,我更愿意使用 ScriptUI 而不是像这样在 AS 中全部完成:
set dlgRef to make dialog with properties {name:"User Settings", can cancel:true, label:"Dialog Label"}
AS交给JS的字符串是这样的:
{"myname",{firstvalue:"test", secondvalue:"val2", thirdvalue: "val3"},{firstvalue:"test2", secondvalue:"val2", thirdvalue: "val3"}}
这些不是列表,而是文本...
JS
myAppleScript = new File("valid_path_to/property grabber.scpt");
var myreturn = app.doScript(myAppleScript, ScriptLanguage.applescriptLanguage);
var myname = myreturn[0];
var firstlist = myreturn[1];
var secondlist = myreturn[2];
ExtendScript 数据浏览器显示:
firstlist = {firstvalue:"test", secondvalue:"val2", thirdvalue: "val3"}
这不是数组...
我试过使用https://github.com/KAYLukas/applescript-json json 对列表进行编码,但结果相同。
firstlist = [{firstvalue:"test", secondvalue:"val2", thirdvalue: "val3"}]
我还用
让它变得简单多了 firstlist = {"test","val2","val3"}
JS 仍然将其视为字符串而不是数组。
知道我需要做什么或做错了什么吗?我希望它很简单,如果我得到答案我会觉得自己很愚蠢...
我讨厌在花时间 post 一个复杂的问题后找到答案。
var path = ((File($.fileName)).path); // this is the path of the script
// now build a path to another js file
// e.g. json lib https://github.com/douglascrockford/JSON-js
var libfile = File(path +'/_libs/json2.js');
if(libfile.exists)
$.evalFile(libfile);
像尼奥学功夫,一下子就过去了,"Whoa, I know JSON!"
var firstlist = JSON.parse(myresult[1]);
给我可用的对象
doScript 可以将脚本参数从一种语言传递到另一种语言。以下是受文档启发的片段:
var aps = "tell application \"Adobe InDesign CC 2014\"\
tell script args\
set user to item 1 of {\"John\", \"Mike\", \"Brenda\"}\
set value name \"user\" value user\
\"This is the firest AppleScript script argument value.\"\
end tell\
end tell"
app.doScript(aps, ScriptLanguage.applescriptLanguage);
var user = app.scriptArgs.getValue("user");
alert( user+ "from JS" );
我认为脚本参数不会 return 除了字符串之外的任何东西,即使它们可以表示任何类型的值。但是,可以使用像这样的拆分方法轻松地将字符串转换为数组:
var aps = "set ls to {\"john\", \"mark\"}\
set n to count of items of ls\
set str to \"\"\
repeat with i from 1 to n\
set str to str & item i of ls\
if i < n then\
set str to str & \",\"\
end if\
end repeat\
tell application \"Adobe InDesign CC 2014\"\
tell script args\
set value name \"str\" value str\
end tell\
end tell";
app.doScript(aps, ScriptLanguage.applescriptLanguage);
var str = app.scriptArgs.getValue("str");
var arr = str.split(",");
alert( "Item 1 of APS list is \""+arr[0]+ "\" in the JS context" );
想法是将 APS 列表扁平化为逗号分隔的字符串,稍后将在 javascript 上下文中拆分以将其转换为数组。
很高兴您有一些有用的东西,但是如果您要将文本传递给 ExtendScript,为什么不在 AS 端将其格式化为 ExtendScript 友好的格式,例如 ['firstvalue'、'secondvalue'、 'thirdvalue"'] --但这将是 AS 中的字符串,例如
--in AS:
"['firstvalue', 'secondvalue', 'thirdvalue"']"
然后,在 ExtendScript 中,如果它在变量中,例如 myData,您可以这样做(就像我刚刚在 ExtendScript Toolkit 中所做的那样):
//in JS:
myArray = eval(myData);
我知道在网络工作中使用 eval() 是邪恶的,但对于 ExtendScript 的东西,它可能非常有用。