Skip to content

Конвертация экшенов в json формат

Проблема

В процессе разработки плагина, который в том числе должен был уметь запускать экшены, мне понадобилось конвертировать .aia файлы в json формат. Готовые решения, которые получилось найти, на моей тестовой подборке большинство экшенов корректно сконвертировать не смогли. Так я решил написать свой конвертер.

Структура .aia файла

Файл экшенов представляет из себя набор свойств со значениями, с несколькими уровнями вложенности. В этом смысле он похож на json, отличия только в синтаксисе и в том, что в .aia файле многие значения закодированы в хекс или десятичном формате.

Так же как и .json, .aia файл может быть минифицирован, а порядок свойств не имеет значения — если с точки зрения синтаксиса всё корректено, иллюстратор загрузит файл и без проблем запустит экшн.

Имя свойства в экшн файле всегда начинается со слэша — /prop-name. Значение может быть нескольких типов:

  • Число (включая негативные и с плавающей точкой)
  • Строка — выделяется круглыми скобками
  • Закодированая строка в десятичном или хекс формате.
Пример данных в экшн файле
aia
/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: булево свойство, определяющее декодировать ли строки из хекс и десятичного формата в читаемый текст
js
const content = fs.readFileSync('./samples/Default Actions.aia', 'utf8');
const decode = true;
const actionSet = aiaToJSON(content, decode);

console.log(actionSet.actions[0]);
Пример результата
json
{
  "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.

Ссылки

https://github.com/moody4/aiaToJSON