5.2 KiB
Формат файлов
Структура .fig файла
┌─────────────────────────────────┐
│ Магический заголовок: "fig-kiwi" (8Б) │
│ Версия (4Б uint32 LE) │
│ Длина схемы (4Б uint32 LE) │
│ Сжатая Kiwi-схема │
│ Длина сообщения (4Б uint32 LE) │
│ Сжатое Kiwi-сообщение │ ← NodeChange[] (весь документ)
│ Бинарные данные │ ← Изображения, векторные сети, шрифты
└─────────────────────────────────┘
Конвейер импорта
.fig файл → Парсинг заголовка → Декомпрессия Zstd → Декодирование Kiwi-схемы
→ Декодирование сообщения → NodeChange[] → Построение SceneGraph
→ Разрешение ссылок на блобы → Отрисовка на холсте
Конвейер экспорта
SceneGraph → NodeChange[] → Kiwi-кодирование → Сжатие (Zstd/deflate)
→ Сборка ZIP (заголовок + схема + сообщение + thumbnail.png)
→ Запись .fig файла
Экспорт выполняется через ⌘S (Сохранить) и ⇧⌘S (Сохранить как) с нативными диалоговыми окнами ОС в десктопном приложении. Экспортированный файл включает thumbnail.png, необходимый Figma для предпросмотра. Сжатие использует Zstd через Tauri Rust-команду на десктопе, с fallback на deflate в браузере. ZIP-архив собирается на Rust в десктопном варианте для корректных заголовков Zstd-фреймов (с указанием размера содержимого).
Бинарный кодек Kiwi
Кодек обрабатывает 194-определённую Kiwi-схему Figma с NodeChange в качестве центрального типа (~390 полей). Основные компоненты:
- kiwi-schema — вендорённый из evanw/kiwi, с патчем для ESM и разреженных ID полей
- codec.ts — кодирование/декодирование сообщений с использованием Kiwi-схемы
- protocol.ts — парсинг проводного формата и определение типа сообщения
- schema.ts — 194 определения message/enum/struct
Разреженные ID полей
Схема Figma использует непоследовательные ID полей (например, 1, 2, 5, 10 с пропусками). Вендорённый парсер kiwi-schema пропатчен для корректной обработки этого случая.
Сжатие
Файлы .fig используют Zstd-сжатие для полезных данных схемы и сообщения. Декомпрессия выполняется библиотекой fzstd. При экспорте Zstd-сжатие делегируется Tauri Rust-команде в десктопном приложении (лучшая производительность, корректные заголовки фреймов). В браузере в качестве fallback используется deflate через fflate. Кодирование буфера обмена также использует fflate.
Поддерживаемые форматы
| Формат | Импорт | Экспорт |
|---|---|---|
| .fig (Figma) | ✅ | ✅ |
| .svg | Планируется | Планируется |
| .png | Планируется | Планируется |
| — | Планируется |
Подробнее о сроках поддержки форматов см. Дорожная карта.
Формат буфера обмена
Копирование/вставка использует то же бинарное Kiwi-кодирование:
- Копирование — кодирование выбранных NodeChange[] в бинарный Kiwi, сжатие, запись в буфер обмена с MIME-типом
application/x-figma-design - Вставка — чтение буфера обмена, декомпрессия, декодирование бинарного Kiwi, создание узлов в графе сцены
- Синхронность — кодирование происходит в обработчике события копирования (не через асинхронный Clipboard API) для совместимости с браузерами
Это обеспечивает двусторонний обмен через буфер обмена между OpenPencil и Figma.