Конвертация экшенов в json формат
Проблема
В процессе разработки плагина, который в том числе должен был уметь запускать экшены, мне понадобилось конвертировать .aia
файлы в json формат. Готовые решения, которые получилось найти, на моей тестовой подборке большинство экшенов корректно сконвертировать не смогли. Так я решил написать свой конвертер.
Структура .aia файла
Файл экшенов представляет из себя набор свойств со значениями, с несколькими уровнями вложенности. В этом смысле он похож на json, отличия только в синтаксисе и в том, что в .aia
файле многие значения закодированы в хекс или десятичном формате.
Так же как и .json
, .aia
файл может быть минифицирован, а порядок свойств не имеет значения — если с точки зрения синтаксиса всё корректено, иллюстратор загрузит файл и без проблем запустит экшн.
Имя свойства в экшн файле всегда начинается со слэша — /prop-name
. Значение может быть нескольких типов:
- Число (включая негативные и с плавающей точкой)
- Строка — выделяется круглыми скобками
- Закодированая строка в десятичном или хекс формате.
Пример данных в экшн файле
/action-1 {
/name [ 22
4f706163697479203630202873656c656374696f6e29
]
/keyIndex 0
/colorIndex 7
/isOpen 1
/eventCount 1
/event-1 {
/useRulersIn1stQuadrant 1
/internalName (ai_plugin_transparency) // обычная строка
/localizedName [ 12
5472616e73706172656e6379 // закодированная строка в hex формате
]
/isOpen 0
/isOn 1
/hasDialog 0
/parameterCount 1
/parameter-1 {
/key 1869635939 // закодированная строка в десятичном формате
/showInPalette 1
/type (unit real)
/value 60.0000038147
/unit 592474723
}
}
}
Логика конвертера
Как уже упомянуто выше, имя каждого свойства в экшн файле начинается со слэша и маркировать свойства — его единственная роль. Это ключевая особенность, помогающая спарсить файл довольно просто. Мы можем, используя слэш как разделитель, надежно разбить текст на сегменты key value
, после чего единственным вопросом останется только способ определения уровня вложенности свойства, иначе говоря — способа достоверно определить принадлежность потомка родителю.
В идеальном случае можно просто посчитать количество табов \t
перед свойством — это и будет его уровень вложенности. Проблема в том, что нельзя надеяться на идеальный случай: даже один удаленный символ приведет к ошибке в конвертации. В то же время иллюстратор такой файл загрузит и не увидит в нём нечего странного.
К счастью, при переборе свойств во вложенной структуре данных, можно гарантировать, что родитель всегда будет предшестовать потомкам. Поэтому мы можем отслеживать вложенность, создав специальный массив, в который будем добавлять, а позже удалять из него свойства в FILO порядке. В таком случае последний элемент в массиве всегда будет прямым родителем перебираемого свойства, а длина массива — его уровнем вложенности.
Как пользоваться
Конвертер принимает на входе только два параметра:
content:
строка в корректномaia
форматеdecode:
булево свойство, определяющее декодировать ли строки из хекс и десятичного формата в читаемый текст
const content = fs.readFileSync('./samples/Default Actions.aia', 'utf8');
const decode = true;
const actionSet = aiaToJSON(content, decode);
console.log(actionSet.actions[0]);
Пример результата
{
"name": "Opacity 60 (selection)",
"keyIndex": 0,
"colorIndex": 7,
"isOpen": 1,
"eventCount": 1,
"events": [
{
"useRulersIn1stQuadrant": 1,
"internalName": "(ai_plugin_transparency)",
"localizedName": "Transparency",
"isOpen": 0,
"isOn": 1,
"hasDialog": 0,
"parameterCount": 1,
"parameters": [
{
"key": "opac",
"showInPalette": 1,
"type": "(unit real)",
"value": 60.0000038147,
"unit": "#Prc"
}
]
}
]
}
ПРИМЕЧАНИЕ
Конвертер создавался для использования в среде, поддерживающей node.js API и ES6 стандарт. Для использования конвертера напрямую в скриптовой среде иллюстратора потребуется портирование на ES3.