SheetForge Web
SheetForge поставляется с веб-приложением-компаньоном на web.sheetforge.workers.dev. Оно приносит авторинг, проверку и отражение таблиц в браузер — без Unity, без установки.
То же самое ядро, а не переписанное заново
Веб-приложение компилирует в точности те же исходники ядра на C# — те самые, на которых работает headless-набор тестов .NET, — в сборку .NET browser-wasm. Второй копии парсера или валидатора не существует, поэтому они никогда не могут разойтись: правило, исправленное один раз, исправлено сразу в обоих местах.
Из этого дизайна напрямую следуют две вещи.
- Ваши скомпилированные DLL плагинов загружаются без изменений и зажигают здесь те же слоты, что и в редакторе (см. ниже).
- Правила синтаксиса таблиц с этого сайта действуют в браузере идентично. Маркеры, система типов,
@overlap,@style,@enum,@locи целостность ссылок ведут себя одинаково, потому что отвечает один и тот же код. Это включает паритетIntId@Tab,LocRef@Tab— см. Синтаксис таблиц.
Один плагин, двенадцать слотов, два хоста
У плагина нет «веб-подмножества». Сборка — создание экземпляров, порядок, изоляция и шлюз совместимости — это единая чистая функция Core, которую вызывают оба хоста. Различается только обнаружение: Unity индексирует типы проекта, а браузер сканирует загруженную вами сборку.
Так что двенадцать слотов, которые может заполнить плагин, одни и те же с обеих сторон:
| Слот | В браузере |
|---|---|
| Enum · парсеры ячеек · wrapper-типы | Ячейки разбираются, проверяются и проходят round-trip через вашу собственную нотацию |
| Доменные валидаторы | Ваши правила появляются в Problems рядом со встроенными |
| Поставщики рёбер | Связи, зарытые в вашей нотации, отрисовываются на холсте и учитываются в индексе ссылок |
| Структурные маркеры | Ваши строки @marker принимаются и проверяются |
| Шаблоны таблиц | Ваши шаблоны появляются в Создать лист |
| Расширители холста | Виртуальные узлы, дополнительные рёбра, подсказки слоя и отображения |
| Реестры кода | Ключи, живущие в коде, перестают отрисовываться как сломанные ссылки |
| Цветовые пресеты | Отображаются на CSS-переменные приложения |
| Декларативный интерфейс Studio | Ваши действия, панели, значки столбцов и подсказки редактора ячейки, отрисованные в React |
| Строки интерфейса | Ваши метки следуют языку пользователя через тот же оверлей, к которому обращается t() |
| Наблюдатели конвейера | Уведомляются в конце цикла импорта, точно так же, как в редакторе |
Декларативные поверхности — это причина, по которой расширения авторинга плагина вообще здесь существуют. Контракт, который возвращал бы элемент UIToolkit, никогда не смог бы загрузиться в браузере, поэтому оболочка описывается как данные — id, ключ метки, место размещения, тон, — и каждый хост рисует это собственными виджетами.
Там, где пакету нужно что-то, чего словарь сказать не может, он регистрирует богатую панель только для редактора под тем же id. Редактор рисует её, браузер рисует описанную, и расширение никогда просто не отсутствует.
Во время отрисовки действуют два правила. Текст, приходящий от плагина, экранируется, а действие, чья ситуация изменилась с момента отрисовки, отвечает честным no-op вместо того, чтобы действовать по устаревшему id.
Сборка плагина также может заявить, для какого поколения формата плагина она собрана. Если оно выходит за рамки того, что читает этот хост, вся сборка отклоняется с понятной причиной, а не загружается наполовину. Это один и тот же шлюз, читающий одну и ту же декларацию, — на пути маркета, пути сайдлоадинга и обычного локального файла. См. Создание плагинов.
Что остаётся в Unity
Та же честность распространяется и на локализацию: таблица локализации здесь полностью создаётся и проверяется, но синхронизация StringTable Unity Localization — задача редактора — у браузера нет проекта Unity, в который можно было бы записывать таблицы.
Генерация кода и запекание остаются обязанностью только Unity. Браузер не может выпускать файлы .cs или записывать ScriptableObject, и он этого не изображает. То же самое относится ко всему, для чего нужен сам проект: пикер ассетов, перетаскивание из окна Project и регистрации Addressables, которые они подготавливают, существуют только в редакторе; <Type> в AssetRef@Group<Type> разбирается и показывается в браузере, но разрешается — и проверяется по типу — только там, где загружены типы проекта; а у редакторских миниатюр ассетов, увеличенных превью и воспроизведения аудио нет веб-аналога, потому что у браузера нет ассетов проекта для чтения — ячейка ассета в веб-сетке представляет собой её адресный текст.
Веб-вывод — это отражённая таблица — проверенный, прошедший round-trip источник, а не запечённые ассеты. Вы занимаетесь авторингом и проверкой в браузере, а затем запускаете импорт в Unity, когда вам нужны строго типизированные классы и запечённые SO. Таблица в любом случае остаётся единственным источником истины, так что обе поверхности встречаются на таблице.
Что делает веб-приложение
Всё проходит round-trip через единый JSON-контракт границы к ядру WebAssembly, так что интерфейс браузера никогда заново не выводит правило, которым уже владеет ядро.
| Область | Что вы получаете |
|---|---|
| Сессия авторинга | Импорт, проекция и панель Problems, питаемая тем же валидатором импорта, — предварительная диагностика, а не отдельная проверка. Импорт принимает файлы TSV и CSV, а также книги .xlsx — каждый лист книги приходит как отдельная вкладка, прочитанная тем же читателем, что использует редактор (скомпилированным в WebAssembly), и когда что-то пришлось трактовать — закешированное значение формулы, дата как текст yyyy-MM-dd, непрочитанное форматирование — диалог импорта сообщает об этом в примечании «Как была прочитана эта книга». |
| Редактирование таблицы | Виджеты ячеек по типу, undo, закрепление столбцов, сортировка, поиск, группировка и цвет по @style — плюс тот же набор функций столбцов электронной таблицы, что и у редактора: перетаскивание ручки в заголовке, чтобы задать ширину столбца (двойной клик — подогнать; сохраняется для каждого листа в этом браузере), скрытие и показ столбцов с сохранением честных букв и граничной отметки, фильтры значений по столбцам, сочетающиеся с поиском, и очистка данных столбца одним шагом отмены. + Row сразу подготавливает строку с предложенным ключом — столбцы целочисленного id предзаполнены, — готовую к переименованию в ключевой ячейке, а лист без ключевого столбца отключает эту кнопку с указанием причины. Ячейки enum и необязательного boolean открывают тот же пикер с поиском, что используют ячейки-ссылки — причём окно пикера открыто всегда только одно: открытие другого закрывает предыдущее, а клик мимо или Esc закрывает его. Номера строк и буквы столбцов выделяются (Ctrl переключает, Shift захватывает диапазон), заголовок и тело подсвечивают выделение, выделенная ячейка рисует контур, следующий за клавиатурой, а выделение перетаскивается на новую позицию с линией вставки — несмежное выделение прибывает собранным в точке отпускания в том порядке, в котором оно было выделено, как один шаг отмены, — при этом меню правого клика применяют ширину, автоподбор, скрытие, перемещение, удаление и очистку данных к каждому выделенному столбцу (перемещения и удаление — к каждой выделенной строке), а пункты для одиночной цели стоят отдельно, в своём разделе. Листы определений enum имеют ту же ось ширины столбцов, что и листы данных, — перетаскивание, двойной клик для подгонки, точная ширина, автоподбор по данным, скрытие. Свыше 200 строк сетка отрисовывает только видимое окно (плюс оверскан), с распорками, удерживающими настоящую высоту прокрутки, — тот же порог, что использует таблица редактора, так что на крупной таблице оба ощущаются одинаково. |
| Визуальные значения | Ячейки Color, AnimationCurve и Gradient показывают предпросмотр, заполняющий ячейку — образец цвета, ломаную линию кривой, полосу градиента — и открывают полноценный редактор во всплывающем окне: редактор цвета с квадратом HSV, ползунками оттенка и альфы и шестнадцатеричным полем (нативное поле выбора цвета браузера не имеет альфы, поэтому оно не используется); редактор кривой с масштабируемой сеткой, перетаскиваемыми ключами и маркерами касательных, режимами касательных (Free, Auto, Linear, Constant, ClampedAuto — щёлкните правой кнопкой мыши по ключу или используйте выпадающий список), переключателями «Разделённая» и «Взвешенная», числовыми полями, режимами обёртки до и после кривой и предустановками Линейная / Плавный вход-выход / Постоянная; редактор градиента с перетаскиваемыми ключами цвета и альфа-канала (до 8 каждого вида), выбором режима и выбором цветового пространства. Каждое изменение проходит round-trip через ядро WebAssembly — разбор, пересчёт касательных и сэмплирование выполняются на C#, а не на JavaScript, — и зафиксированный текст побайтово совпадает с той же канонической формой, которую пишет редактор. Изменения фиксируются в момент, когда вы их вносите, точно как нативные поля редактора: ячейка, холст и Problems следуют за ними, пока редактор открыт, одна сессия редактирования объединяется в один шаг отмены сколько бы изменений она ни делала, а повторное открытие редактора начинает новый шаг. Кнопки Apply нет — единственная кнопка — Close (Esc тоже закрывает, а в редакторе цвета Esc ещё и восстанавливает значение, каким оно было до начала сессии); откат — это Ctrl+Z. Открытие и закрытие без единого изменения ничего не подготавливает. Необязательный столбец показывает —, если пуст, и предлагает Очистить (по умолчанию) в меню правого клика; List<> из этих трёх — это список плашек, чьи жесты добавления / удаления / изменения порядка / редактирования — каждый отдельный шаг отмены. Полоса предпросмотра помещается в стандартную высоту строки, как в таблице редактора. Строки значений на холсте используют те же самые компоненты. |
| Правка структуры | Добавление / удаление / перемещение столбцов, форма столбца ✎ из четырёх полей, переименование вкладки (включая взаимные обмены и циклы; вкладки xlsx блокируются), создание / удаление таблицы и выпадающий список активных настроек — каждое подготавливается как один шаг отмены. Листы определений enum авторятся так же — определение нового enum, переименование (с переписыванием каждой ссылающейся ячейки @type в том же пакете), удаление, изменение порядка столбцов, правка базового типа и описания — по тем же правилам, что и в редакторе, потому что решение принимает тот же код. |
| Сквозной поиск по таблицам | Пункт All боковой панели ищет по id и значениям полей каждой таблицы по частичному совпадению, перечисляя таблицу · ключ · поле · значение, по 50 строк на страницу — то же сопоставление, тот же порядок и тот же размер страницы, что и в редакторе. Он читает значения, которые сессия показывает прямо сейчас, включая подготовленные правки, так что значение, которое вы только что изменили, находится сразу же. Дважды щёлкните по результату — или выделите его и нажмите Enter — и эта таблица откроется с выделенной найденной ячейкой; поскольку поиск читает саму сессию, к любому результату можно перейти. |
| Локализация | Таблицы локализации здесь — обычные таблицы: авторинг, проверка и покрытие по языкам включены. Ячейка LocRef в таблице данных показывает текст записи на исходном языке прямо в ячейке и открывает тот же пикер ключей, что и другие ссылки; ввод текста в пустую ячейку чеканит ключ, его исходный текст и саму ссылку одним шагом отмены — точно так же, как это делает редактор. Языковая линза переключает видимость языковых столбцов (только отображение), а книга переводов экспортирует выбранные языки в xlsx и повторно импортирует возвращённый файл как слияние только по языковым столбцам. Синхронизация StringTable Unity Localization остаётся за редактором. |
| Холст записи | Материалы и потребители записи — это карточки, которые вы соединяете, перетаскивая линии, — холст повторно использует тот же самый чистый код раскладки, связывания и цепочки правок, что и редактор, так что пиксельная математика живёт в C#, а не в JS-библиотеке графов. Карточки показывают ту же проекцию, что и таблица: столбец, подготовленный в этом пакете, уже стоит на карточке, помеченный как ожидающий, подготовленное переименование показывает новое имя поверх исходного значения, а подготовленное удаление убирает строку и здесь тоже. |
| Вывод | Скачивание TSV / CSV для каждого листа, скачивание книги .xlsx, несущей все выбранные листы в одном файле (имя листа, которое правила книги не могут вместить, корректируется и сообщается, а не переименовывается молча), а также чтение/запись Google Таблиц — с автоматическим обновлением выпадающих списков проверки данных листа после каждой отправки (см. ниже). |
Сделано идентичным, а не просто похожим
Веб-интерфейс намеренно совпадает с Data Studio в редакторе, вплоть до общей логики.
- Общие ответы. Предикаты заголовка (
pending/edited), модальное окно diff и порядок композиции проекции — это общий код C#, так что обе поверхности дают одинаковый ответ на один и тот же вопрос. - Общие предложения. Там, где веб зеркалирует экран Studio, он использует собственные строковые ключи Studio, а значения генерируются из языковых таблиц редактора во время сборки, а не набираются заново. Добавление предложения, которое показывают обе поверхности, — это один ключ в
Lang*.cs; расхождение структурно невозможно, а не просто нежелательно. Две вещи намеренно держатся раздельно, и защита времени сборки обеспечивает эту границу:- строки, которые по-настоящему существуют только в вебе, остаются в веб-каталоге;
- диагностика и отчёты отрисовываются ядром WebAssembly, а не переформулируются в интерфейсе.
- Общий внешний вид. Граф и таблица показаны вместе в панели с изменяемым размером, которая зеркалирует поведение ограничения холста в редакторе, а каждый цвет берётся из набора токенов
.aw-rootредактора как единственного источника истины — никакой захардкоженной палитры. - Общий набор компонентов. Интерфейс построен на собственном наборе
aw, чьи имена классов, токены и размещение всплывающих окон совпадают один в один с USS редактора и каноническим HTML-макетом. Теперь один макет питает два порта — веб-приложение и редактор на UIToolkit — вместо того чтобы веб расходился сам по себе.web/Docs/ui-parity.mdфиксирует, как веб следует за studio при её изменении. - Общие редакторы ячеек. Какой виджет получает ячейка, решает подсказка редактора ячейки от ядра — сначала регистрация пакета, затем встроенная таблица (
BuiltinCellEditorHints), — так что тип плагина, объявляющий архетипColorPicker,CurveEditorилиGradientEditor, открывает здесь те же редакторы, что и в Unity, и два хоста не могут выбрать разные виджеты для одного и того же имени типа. - Паритет холста. Перетаскивание достигло полного паритета с редактором: панорамирование средним перетаскиванием или Alt-перетаскиванием, каскадные меню на пустом месте, инспекторы линий и узлов, призрак выбранной линии и удаление терминуса с диалогом подтверждения. Диапазон масштабирования — редакторский (25–200%), а метрики карточек берутся из ядра, а не из второй копии на JavaScript.
- Общий список типов. Выпадающий список
@typeпредлагает то, что на самом деле знает реестр парсера, сгруппированное точно так же, как группирует редактор: встроенные скаляры (включаяColor,AnimationCurveиGradient), ключиRecordId/IntId, ссылкиRecordId@TabиIntId@Tab,Enum<…>,AssetRef@Group, а также любой тип или wrapper, который зарегистрировал загруженный плагин. Плагин, регистрирующий новый тип, поэтому появляется в браузере без изменений веба. (Пока ядро WebAssembly ещё не закончило загрузку, самая первая отрисовка откатывается к четырём встроенным скалярам.)
Когда что использовать
- Используйте браузер для быстрого авторинга, проверки и правок таблицы откуда угодно, а также для коллег, которые не открывают Unity.
- Используйте Unity, когда вам нужны сгенерированные классы C# и запечённые ScriptableObject — этапы импорта, генерации кода и запекания.
Оба пишут в одну и ту же таблицу, так что изменение, сделанное в одном, подхватывается другим при следующем чтении.
Похожие страницы
- Синтаксис таблиц — правила, которые применяет ядро браузера, без изменений
- Таблицы локализации — таблицы игрового текста, в браузере и в редакторе
- Веб-магазин плагинов — установка и сайдлоадинг плагинов в браузере
- Доступ к Google Таблицам из веба — чтение и запись таблиц с развёрнутого сайта
- Data Studio — поверхность авторинга в редакторе, которую зеркалирует веб-приложение