Подробный гайд по проверке параметров кодирования .fig
Файлы .fig — это нативный формат Figma, который представляет собой не текстовый, а сложный бинарный контейнер. Проверка его параметров кодирования требует понимания внутренней структуры. Ниже приведено подробное руководство.
Что такое .fig и его внутренняя структура
Файл .fig — это стандартный ZIP-архив (в режиме без сжатия / store mode), который содержит следующие компоненты:
| Компонент | Обязателен | Описание |
|---|---|---|
canvas.fig |
Да | Бинарный документ Figma (закодирован в Kiwi) |
thumbnail.png |
Да | Миниатюра для файлового браузера Figma (без неё Figma отклоняет файл) |
meta.json |
Да | Метаданные: имя файла, цвет фона, координаты рендеринга |
images/ |
Нет | Изображения, названные по SHA-1 хешу |
Основной интерес представляет canvas.fig, внутри которого находится бинарный формат Kiwi, созданный соучредителем Figma Эваном Уоллесом. Kiwi похож на Protocol Buffers, но оптимизирован для JavaScript и имеет более компактное кодирование.
Бинарная структура canvas.fig
Файл canvas.fig имеет чёткую бинарную разметку.
Вот его структура:
| Смещение | Размер | Содержимое |
|---|---|---|
| 0 | 8 байт | Прелюдия (ASCII): fig-kiwi, fig-deck или fig-jam. |
| 8 | 4 байта | Версия (uint32 little-endian). Известные значения: 101, 106 |
| 12 | 4 байта | Длина N чанка схемы (uint32 LE) |
| 16 | N байт | Сжатая схема Kiwi (deflateRaw) |
| ... | 4 байта | Длина M чанка данных (uint32 LE) |
| ... | M байт | Сжатые данные Kiwi (Zstandard / Zstd) |
Ключевые параметры кодирования:
- Схема (чанк 0): сжата алгоритмом deflateRaw (RFC 1951, без обёрток zlib/gzip).
- Данные (чанк 1): сжаты алгоритмом Zstandard (Zstd). При чтении следует проверять магические байты Zstd (
0x28 0xB5 0x2F 0xFD), чтобы отличить от старых файлов с deflateRaw. - Схема Kiwi: определяет 194 типа сообщений, центральный тип —
NodeChange(около 390 полей).
Пошаговое руководство по проверке
Шаг 1: Проверка ZIP-оболочки
Убедитесь, что файл является ZIP-архивом.
Это можно сделать стандартными средствами:
- Linux/macOS:
unzip -l file.fig - Windows: откройте файл архиватором (7-Zip, WinRAR) или используйте PowerShell:
Expand-Archive -Path file.fig -DestinationPath output
Внутри вы должны увидеть как минимум canvas.fig, thumbnail.png и meta.json.
Шаг 2: Извлечение canvas.fig
Если ZIP-структура подтверждена, извлеките canvas.fig для дальнейшего анализа.
Шаг 3: Проверка заголовка и версии
Используйте hex-редактор (например, xxd, HxD, hexdump) или скрипт для чтения первых 16 байт canvas.fig:
- Байты 0–7: должны содержать один из прелюдов:
fig-kiwi,fig-deckилиfig-jam.. - Байты 8–11: значение версии (uint32 LE). Известные версии:
101,106. Figma принимает версию105, но отклоняет109.
Пример на Python:
import struct
with open('canvas.fig', 'rb') as f:
data = f.read(16)
prelude = data[:8].decode('ascii', errors='ignore')
version = struct.unpack('<I', data[8:12])[0]
print(f"Prelude: {prelude}, Version: {version}")
Шаг 4: Проверка сжатия чанков
Прочитайте длину первого чанка (смещение 12, uint32 LE), затем пропустите его и прочитайте длину второго чанка. Проверьте магические байты Zstd во втором чанке.
Пример на Python:
import struct
with open('canvas.fig', 'rb') as f:
f.seek(12)
schema_len = struct.unpack('<I', f.read(4))[0]
f.seek(12 + 4 + schema_len)
msg_len = struct.unpack('<I', f.read(4))[0]
msg_data = f.read(4)
is_zstd = msg_data == b'\x28\xb5\x2f\xfd'
print(f"Schema chunk length: {schema_len}, Message chunk length: {msg_len}, Zstd compressed: {is_zstd}")
Шаг 5: Декодирование схемы и данных Kiwi
Для полноценного декодирования потребуются специализированные библиотеки:
fig-kiwi(npm) — пакет для чтения/записи.figфайлов с TypeScript-определениями, производными от схемы Kiwi.kiwi-schema— декодер бинарного формата Kiwi.pako— для распаковки deflate-сжатой схемы.fzstd— для распаковки Zstd-сжатых данных.
Пример использования CLI из fig-kiwi:
node cli --schema figma.kiwi --root-type NodeChanges --to-json simple.fig
Эта команда распакует simple.fig и выведет JSON-представление данных.
Сводная таблица параметров кодирования
| Параметр | Значение / Алгоритм | Где проверять |
|---|---|---|
| Формат контейнера | ZIP (store mode) | Структура архива |
| Прелюдия | fig-kiwi (8 байт) |
Смещение 0 в canvas.fig |
| Версия | uint32 LE (например, 101, 106) | Смещение 8 |
| Сжатие схемы | deflateRaw | Чанк 0 |
| Сжатие данных | Zstandard (Zstd) | Чанк 1, магические байты 0x28 0xB5 0x2F 0xFD |
| Формат сериализации | Kiwi (бинарный) | Внутри чанков после распаковки |
| Корневой тип | NodeChange[] |
В схеме Kiwi |
Важное замечание о формате Xfig
Существует также формат .fig от программы Xfig — это совершенно другой, текстовый формат для векторной графики. Файлы Xfig обычно кодируются в UTF-8. Если ваш файл открывается как текст и содержит команды вроде #FIG 3.2, то это Xfig, а не Figma. Для проверки кодировки Xfig достаточно открыть файл в текстовом редакторе и посмотреть, отображаются ли символы корректно.
Важно
Проверка параметров кодирования .fig (Figma) сводится к анализу ZIP-архива, извлечению canvas.fig и проверке его бинарных заголовков и чанков. Ключевые моменты — это подтверждение прелюдии fig-kiwi, чтение версии и определение алгоритмов сжатия (deflateRaw для схемы, Zstd для данных). Для глубокого анализа используйте специализированные библиотеки fig-kiwi и kiwi-schema.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.