Как быстро отображать формулы без веб-движка
Многие приложения таскают с собой целый браузерный движок лишь ради отображения одной формулы. Для mote этот путь был закрыт, поэтому пришлось искать другой.

В mote есть одно нерушимое правило. Не зависеть от веб-движка.
Это стало понятно при создании прототипа. В приложениях такого рода основная часть издержек приходится на встроенный браузерный движок. Поэтому было решено отказаться от него с самого начала.
Проблемой оказались формулы. Обычно для их отображения в браузер загружают KaTeX или MathJax. В mote этот способ использовать было нельзя.
Другие способы тоже не подходили. При использовании собственного рендерера шрифтов начертание символов отличается от того, как они выглядят в других системных приложениях. А в mote было решено отрисовывать весь текст с помощью текстового движка платформы.
В итоге был выбран самый сложный путь.
Расположение определяет mote, символы рисует платформа
Для синтаксиса формул был выбран привычный подход. Внутри предложения формула обрамляется одной парой знаков доллара, а отдельная формула — двумя парами.
После открывающего и перед закрывающим знаком пробелы недопустимы. Это нужно для того, чтобы суммы вроде $5 и $6 не распознавались ошибочно как формулы. В Markdown, который люди пишут вручную, такие небольшие различия важны.
Отрисовка формул была разделена на две части.
Ядро mote вычисляет положение символов и линий. Сами символы отрисовывает текстовый движок каждой платформы.
В ядре содержится упрощённая версия правил вёрстки TeX. Четыре уровня размера, таблица интервалов между символами, разделёнными на восемь классов, расположение индексов, дробей и корней, а также скобки, размер которых увеличивается в соответствии с содержимым.
Однако фактический размер символов определяет не ядро. Это связано с тем, что размер одного и того же символа зависит от шрифта и платформы. Ядро спрашивает: «Каков будет размер этого символа, если отрисовать его с таким размером шрифта?» — и платформа отвечает. На основе полученного значения ядро завершает компоновку, а платформа рисует символы и линии в назначенных местах.
Благодаря этому даже при добавлении новых платформ достаточно поддерживать только один механизм компоновки.
В редакторе исходный текст также остаётся неизменным. Даже когда в режиме живого просмотра отображается формула, её исходные байты остаются внутри строки. В этом месте лишь выделяется пространство, соответствующее размеру формулы.
Поэтому каретка оказывается точно в нужном месте, а символ, по которому щёлкнули, определяется безошибочно. Так соблюдается принцип: оформление экрана не должно изменять файл. В режиме чтения и в PDF используется та же компоновка.

Курсив также не создаётся искусственным наклоном. Используются математические символы Unicode, поэтому отрисовываются настоящие математические глифы, содержащиеся в шрифте.
Неизвестные формулы не скрываются
Если формула отображается неправильно, но незаметно, ошибку трудно обнаружить.
Если неподдерживаемая команда отображается как пустое место, пользователь не может понять, опечатка это или ограничение приложения. Поэтому mote показывает неизвестную команду красным цветом, сохраняя её имя.
Даже если скобки не совпадают, приложение не останавливается. Такие случаи сохраняются в виде тестов, чтобы та же проблема не повторялась.
Принципы производительности также соблюдаются. Для каждой комбинации формулы и размера текста сохраняется до 512 результатов вычислений. При вводе текста одна и та же формула не вычисляется повторно, а когда пользователь ничего не делает, не выполняются никакие фоновые операции.
При экспорте в HTML используется MathML. Поскольку браузер сам отрисовывает формулы, скрипты не требуются. Даже без подключения к интернету формулы отображаются без изменений.
Есть и то, что пока не работает
mote поддерживает не весь TeX.
Пользовательские команды, указание цвета, нумерация формул, многострочные индексы, знаки над символами и текст над стрелками пока не поддерживаются.
Также нет растягивающихся по ширине диакритических знаков. Широкая шляпка выглядит так же, как узкая. Крупные знаки суммы и интеграла отрисовываются не с помощью специальных глифов, а путём увеличения в 1,45 раза. Скобки, которые должны растягиваться только по вертикали, увеличиваются одновременно по горизонтали и вертикали.
Встроенные дроби отображаются уменьшенными, как в TeX. Чтобы они выглядели крупнее, это нужно указать отдельной командой.
Не буду говорить об этих возможностях так, будто они уже существуют. Когда появятся соответствующие запросы, они будут добавляться по одной.
Из-за одной формулы не пришлось менять структуру затрат всего приложения. Вместо этого изменился способ отображения формул.
Этот путь оказался сложнее, но я верю, что именно он позволит проекту жить долго.