2015-07-23 4 views
0

фонПередача списка AppleScript для яваскрипта ExtendScript как массив для Indesign

У меня есть груз AppleScripts (AS), который дизайнеры используют с InDesign, которые помогают процессу рабочий процесс производства. Существует много взаимодействия с ОС, которое AS делает, что JavaScript не может, поэтому переход от AS невозможен.

Должностные ограничения Я не смог установить почти ничего. Я ничего не могу обновить. Редактор сценариев и набор инструментов ExtendScript - это то, с чем мне нужно работать.

Условия эксплуатации: 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 рассматривает его как строку, а не массив.

Любые идеи, что мне нужно делать или я делаю неправильно? Надеюсь, это просто, и я чувствую себя глупо, если получаю ответ ...

+0

eval был ответом, если бы я не хотел фактического json – Lithodora

ответ

0

Ненавижу найти ответ после того, как я потрачу время, чтобы опубликовать сложный вопрос.

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

дает мне работоспособные объекты

0

doScript может передать скрипт арг на одного языка на другой. Вот отрывок вдохновлен от дока:

var aps = "tell application \"Adobe InDesign CC 2014\"\ 
 
\t tell script args\ 
 
\t \t set user to item 1 of {\"John\", \"Mike\", \"Brenda\"}\ 
 
\t \t set value name \"user\" value user\ 
 
\t \t \"This is the firest AppleScript script argument value.\"\ 
 
\t end tell\ 
 
end tell" 
 
\t \t \t \t 
 
app.doScript(aps, ScriptLanguage.applescriptLanguage); 
 

 
var user = app.scriptArgs.getValue("user"); 
 
alert(user+ "from JS");

+0

Будет ли пользователь устанавливать список, а затем позже сказать, что app.scriptArgs.getValue («пользователь») [0] работает? – Lithodora

0

Я не думаю, что сценарий арг будет возвращать ничего, кроме строк, даже если они могут представлять какие-либо ценность. Однако строка может быть легко превращена в массив с помощью метода раздельного так:

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\ 
 
\t set str to str & item i of ls\ 
 
\t if i < n then\ 
 
\t \t set str to str & \",\"\ 
 
\t end if\ 
 
end repeat\ 
 
tell application \"Adobe InDesign CC 2014\"\ 
 
\t tell script args\ 
 
\t \t set value name \"str\" value str\ 
 
\t 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, чтобы превратить его в массив.

+0

Проблема в самих значениях может содержать запятую. Разделение строки может привести к неудачному запуску скрипта. – Lithodora

+0

Ну, вы можете использовать любое собственное значение, например $$$$$$$$$ или ######, и использовать это же значение для процесса расщепления: set str to str & \ "###### \ "\ на стороне APS и str.split (" ###### ") на стороне js;) – Loic

1

Рад, что у вас есть что-то, что работает, но если вы передаете текст ExtendScript, почему бы не форматировать его на стороне AS, чтобы он был дружественным к ExtendScript, например ['firstvalue', 'secondvalue', 'thirdvalue' '] --but это будет строка в AS, как

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

Затем в ExtendScript, если это в переменной, как, MyData, вы можете сделать (как я только что сделал в ExtendScript Toolkit):

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

Я знаю, что использование eval() - это зло в веб-работе, но для материалов ExtendScript это может быть очень полезно.

+0

Я пробовал это, передавая строку. Вы говорите мне, что eval сделал бы то, что мне было нужно? – Lithodora

+0

Вам не нужно просто получать значения из AS в JS (ES)? Поскольку значения являются текстом, если текст отформатирован как действительный JS-код, как простой массив, eval() будет работать на JS sde, чтобы дать вам массив в виде массива. Если я не пойму, что тебе нужно. – CRGreen

 Смежные вопросы

  • Нет связанных вопросов^_^