Полтора месяца назад я рассказывал, как научил CraftHub работать с папкой проекта. С тех пор накопилось ещё несколько вещей, которые просили в issue — самая заметная из них наконец решает старую проблему с вложенным JSON. Делюсь, что нового.

Главное: вложенность больше не теряется при импорте

CraftHub превращает JSON-массив объектов в таблицу — но что делать с полем, которое само является объектом? {"robot": {"point": {"x": 1, "y": 2}}} — куда девать point?

Раньше ответ был один: расплющить в отдельные колонки — robot.point.x, robot.point.y — и вложенность терялась безвозвратно. Не самое приятное поведение, когда объект специально сериализован вложенным, а на выходе получаешь плоский список.

Кстати, это не первый заход на тему разделителя пути. В истории репозитория уже был коммит с говорящим названием «добавлен управляющий символ для разделения строк» — точку когда-то тоже пробовали как разделитель и отказались: JSON-ключ сам может легально содержать точку, и путь robot.point было невозможно отличить от поля с буквальным именем "robot.point". Разделитель заменили на непечатаемый control-символ (\x1E), который в реальных ключах не встречается почти никогда — эта часть осталась и сейчас, просто раньше применялась только для расплющивания.

Теперь подход другой. По умолчанию вложенный объект не разбивается — он остаётся одной колонкой типа object и открывается двойным кликом во вложенном редакторе, со своей собственной вложенностью внутри. А если всё-таки нужны классические плоские колонки — в диалоге импорта у такого поля появилась стрелочка, разворачивающая его в дочерние поля вручную, на любую глубину:

Маппинг полей при импорте
Маппинг полей при импорте

То есть расплющивание стало осознанным выбором на импорте, а не побочным эффектом, с которым потом приходится жить до конца работы с файлом.

Редактор сырого JSON — с подсветкой синтаксиса и поиском

В CraftHub есть режим «редактировать как есть» — сырой текст JSON вместо таблицы. Раньше это было обычное текстовое поле: моноширинный шрифт и ничего больше, даже номера строк были самодельные.

Переписал этот режим на AvaloniaEdit — тот же класс редакторных контролов, что стоит за SharpDevelop, только под Avalonia. Добавил свою цветовую схему под тёмную и светлую тему приложения — ключи, строки, числа и true/false/null теперь подсвечиваются по-разному:

Редактор
Редактор

Заодно бесплатно прилетели поиск и замена — у TextEditor они уже встроены, я только повесил на них Ctrl+F/Ctrl+H и сделал так, чтобы повторное нажатие того же сочетания закрывало панель, а не открывало её заново поверх себя.

И по мелочи

  • Перетаскивание файлов на окно. .json, .txt, .cs теперь можно просто перетащить на окно — откроются во вкладках. Пока тащишь, окно подсвечивается затемнением с подсказкой, как на веб-страницах.

Перетаскивание файлов на окно
Перетаскивание файлов на окно
  • Недавние папки. В проводнике появился список последних пяти открытых папок, как в VS Code — с укороченным путём под именем, чтобы сразу было видно, где что лежит.

Недавние папки
Недавние папки
  • Окно «Версии». Список всех релизов CraftHub прямо в приложении, подтянутый с GitHub, с описанием изменений у каждого — не нужно идти на страницу релизов вручную.

Окно Версии
Окно Версии
  • Баг с локалью. На системах с запятой как разделителем дробной части (привет, русская локаль) числа при экспорте JSON превращались в строки: 1.5 становилось "1.5". Починил.

Ссылки

Буду рад багам, идеям и звёздочкам в комментариях — предыдущие статьи из этой серии выросли именно из фидбека читателей.