【问题标题】:Passing Applescript list to javascript ExtendScript as array for Indesign将 Applescript 列表作为 Indesign 的数组传递给 javascript ExtendScript
【发布时间】:2015-10-14 08:51:59
【问题描述】:

背景

我有大量的 Applescripts(AS),设计师将这些 Applescripts(AS) 与 InDesign 一起使用,以帮助处理生产工作流程。有大量的操作系统交互是 AS 做的,而 JavaScript 做不到,所以离开 AS 是不可能的。

由于限制,我几乎无法安装任何东西。 我无法更新任何内容。脚本编辑器和 ExtendScript Tool Kit 是我必须使用的。

运行环境: OS X 10.8.5 & Adobe CS6

工作原理

用户首选项保存为本地 Applescripts 中的属性,保存在用户的文档文件夹中。

    ###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 将其视为字符串而不是数组。

有什么想法我需要做什么或做错了吗?我希望它很简单,如果我得到答案,我会觉得很愚蠢......

【问题讨论】:

  • eval 是答案,除非我想要实际的 json

标签: javascript json applescript adobe-indesign extendscript


【解决方案1】:

很高兴你有一些有用的东西,但是如果你将文本传递给 ExtendScript,为什么不在 AS 端将其格式化为对 ExtendScript 友好,例如 ['firstvalue', 'secondvalue', 'thirdvalue''] - - 但这将是 AS 中的字符串,例如

--in AS:
"['firstvalue', 'secondvalue', 'thirdvalue"']"

然后,在 ExtendScript 中,如果它位于变量中,例如 myData,您可以这样做(就像我在 ExtendScript Toolkit 中所做的那样):

//in JS:
myArray = eval(myData);

我知道在 web 工作中使用 eval() 是邪恶的,但是对于 ExtendScript 的东西,它可能非常有用。

【讨论】:

  • 我试过这个,传递一个字符串。你是在告诉我 eval 会做我需要的吗?
  • 你不只是需要将值从 AS 获取到 JS (ES) 中吗?由于值是文本,如果文本被格式化为有效的 JS 代码,就像一个简单的数组,eval() 将在 JS sde 上工作,以将数组作为数组提供给您。除非我误解了你在追求什么。
【解决方案2】:

我讨厌在花时间发布一个详尽的问题后找到答案。

https://stackoverflow.com/a/14689556/1204387

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);

就像 Neo 学习功夫一样,突然间,“哇,我知道 JSON!”

var firstlist = JSON.parse(myresult[1]);

给我可行的对象

【讨论】:

    【解决方案3】:

    doScript 可以将脚本参数传递给一种语言到另一种语言。这是一个受文档启发的 sn-p:

    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" );

    【讨论】:

    • 将用户设置到列表,然后说 app.scriptArgs.getValue("user")[0] 有效吗?
    【解决方案4】:

    我认为脚本参数不会返回字符串以外的任何内容,即使它们可以代表任何类型的值。然而,一个字符串可以很容易地用这样的拆分方法变成一个数组:

    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 上下文中将其拆分为数组。

    【讨论】:

    • 问题是值本身可能包含逗号。拆分字符串可能会导致脚本运行错误。
    • 好吧,您可以使用自己的任何值,例如 $$$$$$$$ 或 ###### 并在拆分过程中使用相同的值:将 str 设置为 str & \" ######\"\ 在 APS 端和 str.split("######") 在 js 端;)
    猜你喜欢
    • 2019-03-06
    • 2016-04-03
    • 2012-08-23
    • 1970-01-01
    • 2013-01-24
    • 2012-12-06
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多