Запуск шаблона исследования из нескольких источников произвёл хороший отчёт об инвестиционных инструментах, а затем плохо его напечатал. Девяносто пять маркеров вида [^1] были прямо в тексте, а девять строк вида [^1]: наваливались снизу. И в вебе, и на телефоне.
Причина в том, что сноски не являются частью markdown. Это расширение, и ни один из двух движков markdown, которые мы поставляем — один в вебе, другой на мобильном, — его не реализует. Мы просили модель именно об этой форме, а затем отображали её как буквальный текст.
Один переписчик, два движка
Вместо того чтобы обучать оба рендерера одному расширению, маркеры переписываются до того, как их увидит любой из них, в простую ссылку, которую оба уже отображают одинаково. Определения извлекаются и возвращаются отдельно, а то, что следовало за ними, остаётся хвостом документа. Квадратные скобки остаются в тексте ссылки, так что сложенные цитаты читаются как [1][2], а не как 12.
В вебе цитата рисуется верхним индексом, определения отображаются списком с настоящими якорями, клик по одной прокручивает к ней и мигает строкой, а номер в списке возвращается к первому месту цитирования. Наведение показывает определение без прокрутки. На телефоне те же маркеры рисуются акцентным цветом, а касание одного прокручивает панель к соответствующей строке. Ссылки, не являющиеся цитатами, по-прежнему открываются в браузере, как раньше.
Карточки источников под отчётом никогда не затрагивались — они приходят из другого места и всегда были в порядке.
И в загрузке
Отчёт, который вы скачиваете как .docx, .pdf или .md, проходил через другой конвертер, печатавший сырые маркеры прямо в документ. Спецификация документа не знает верхнего индекса, поэтому цитата печатается как [3], а каждое определение открывает собственную строку, начинающуюся с [3]. Строки продолжения с отступом присоединяются к своему определению. Номера в файле — это номера на экране.
Первая попытка была неверна тем способом, от которого у нас уже была защита
Первая версия превращала номера сносок в обычные ссылки на фрагмент — href="#fn-3". Под <base href="/">, необходимым одностраничному приложению, голый фрагмент разрешается относительно корня сайта, так что ссылка указывает на главную страницу. Обработчик клика отменял навигацию, поэтому это работало — и продолжало бы работать, пока кто-нибудь не тронул бы обработчик.
Проверка, которая у нас уже была именно для этого паттерна, стала красной при локальном прогоне перед пушем. Номера теперь кнопки; они прокручивают, перемещают фокус и уважают предпочтение читателя об уменьшенном движении.