Как разобрать шаблоны #placeholder#, когда регулярки мало.
Шаблон #([^#]+)# не отличает экранированную решётку от разделителя. Небольшой токенайзер на конечном автомате, который делит литералы и плейсхолдеры и уважает экранирование обратным слешем.
Шаблон #([^#]+)# не отличает экранированную решётку от разделителя. Небольшой токенайзер на конечном автомате, который делит литералы и плейсхолдеры и уважает экранирование обратным слешем.
Конфигурации, генерация тест-входов, процедурный контент: за многими функциями стоит пространство вариантов, которое слишком велико, чтобы выписать. Как получить точное число, взять равномерно случайный элемент и выдать несколько разных, и всё это одним …
Чтобы положить текст на слайд, надо знать, что он влезет, до того как его нарисуют. Измерение через canvas, корректный перенос Unicode и поправка на расхождение между canvas и DOM.
Где ставить границы слайдов? Фиксированное число символов режет предложения и оставляет неровные слайды. Как мы превратили разбиение в оптимизацию с небольшой моделью стоимости и динамическим программированием.
Растеризация SVG в PNG через элемент изображения соревнуется с загрузкой шрифта и обычно проигрывает, поэтому экспорт выходит запасным шрифтом. Решение в том, чтобы превратить текст в векторные контуры до растеризации, с шейпингом через HarfBuzz.
SVG-слой может соединять слова в двух строках HTML, но только если знает, куда их поставил браузер. Как измеряются позиции слов и как дуги остаются привязанными при переносах, ресайзе и догрузке шрифтов.
Ссылка может нести всё состояние приложения, если его урезать, сжать и версионировать. Как мы упаковываем целое выравнивание в несколько сотен символов и безопасно читаем его обратно.
Каждое кликабельное слово в редакторе начинается с токена, а простое деление по пробелу путает сокращения, пунктуацию и устойчивые выражения. Токенизатор, который мы сделали, и его настройки.