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

5.2 KiB
Raw Blame History

Формат файлов

Структура .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 Планируется Планируется
.pdf — Планируется

Подробнее о сроках поддержки форматов см. Дорожная карта.

Формат буфера обмена

Копирование/вставка использует то же бинарное Kiwi-кодирование:

  1. Копирование — кодирование выбранных NodeChange[] в бинарный Kiwi, сжатие, запись в буфер обмена с MIME-типом application/x-figma-design
  2. Вставка — чтение буфера обмена, декомпрессия, декодирование бинарного Kiwi, создание узлов в графе сцены
  3. Синхронность — кодирование происходит в обработчике события копирования (не через асинхронный Clipboard API) для совместимости с браузерами

Это обеспечивает двусторонний обмен через буфер обмена между OpenPencil и Figma.