72 lines
5.2 KiB
Markdown
72 lines
5.2 KiB
Markdown
# Формат файлов
|
||
|
||
## Структура .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 файла
|
||
```
|
||
|
||
Экспорт выполняется через <kbd>⌘</kbd><kbd>S</kbd> (Сохранить) и <kbd>⇧</kbd><kbd>⌘</kbd><kbd>S</kbd> (Сохранить как) с нативными диалоговыми окнами ОС в десктопном приложении. Экспортированный файл включает `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 | Планируется | Планируется |
|
||
| .pdf | — | Планируется |
|
||
|
||
Подробнее о сроках поддержки форматов см. [Дорожная карта](/ru/development/roadmap).
|
||
|
||
## Формат буфера обмена
|
||
|
||
Копирование/вставка использует то же бинарное Kiwi-кодирование:
|
||
|
||
1. **Копирование** — кодирование выбранных NodeChange[] в бинарный Kiwi, сжатие, запись в буфер обмена с MIME-типом `application/x-figma-design`
|
||
2. **Вставка** — чтение буфера обмена, декомпрессия, декодирование бинарного Kiwi, создание узлов в графе сцены
|
||
3. **Синхронность** — кодирование происходит в обработчике события копирования (не через асинхронный Clipboard API) для совместимости с браузерами
|
||
|
||
Это обеспечивает двусторонний обмен через буфер обмена между OpenPencil и Figma.
|