openpencil/packages/docs/ru/reference/file-format.md
2026-03-08 11:40:19 +03:00

72 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Формат файлов
## Структура .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.