Я пытаюсь научиться писать правила Markdown для реализации нового функционала BBCode, используя это руководство, но мне очень трудно разобраться в происходящем, так как многое осталось без объяснений:
Я также изучил документацию по markdown-it, но она очень скудная и, кажется, в основном представляет собой общее высокоуровневое описание функциональности системы. Вот несколько конкретных вопросов:
В руководстве есть такая строка: // standard markdown it inline extension goes here.
Что такое стандартное встроенное расширение (inline extension)? Это место, где вы определяете правила, которые передаются в «линейку» (ruler)? Почему оно возвращает false?
Что такое типы токенов? Я вижу примеры вроде 'link_open' и 'html_inline'. Откуда они берутся? Существует ли где-то статический список доступных типов? Могу ли я добавлять новые? Как парсер узнает, что делать с ними?
Как это работает? Как парсер знает, что делать с 'code_inline'? Что делает функция state.push() и как её следует использовать?
Мне кажется, я почти понял суть, но, думаю, мне не хватает некоторых концепций. Я написал самые простые правила, и они, похоже, работают — мне просто нужно лучшее понимание, чтобы двигаться дальше. Любая помощь будет очень кстати!
Сначала я пытаюсь создать тег [table] для начала работы. Я понимаю, что в Markdown уже есть поддержка таблиц, но (предполагая, что я смогу реализовать поддержку остальных наших тегов BBCode) мы перенесём около 20 миллионов постов в Discourse, поэтому мне нужно обеспечить корректную обратную совместимость для существующих тегов BBCode. При этом использование символа вертикальной черты в Markdown делает перенос постов для конвертации таблиц практически невозможным.
Мой созданный на данный момент тег таблицы постоянно удаляется. Он присутствует в посте, но, как я полагаю, продолжает удаляться скраббером. Вот что у меня есть на данный момент:
Я пробовал другие варианты форматирования белого списка и функции wrap, основываясь на других примерах, которые видел, но пока ничего не работает. Следовательно, я предполагаю, что есть что-то фундаментальное в том, как работает система, чего я не понимаю. Я пытаюсь лучше разобраться в этом, чтобы в будущем мог более последовательно добиваться успеха в реализации подобных функций.
У нас есть простой список BBCode-тегов, которые мы пытаемся поддерживать, как объяснил @Ghan, поскольку наш форум насчитывает более 20 миллионов сообщений. Мы отнюдь не маленькое сообщество, и это было нелегкое решение, но мы пришли к выводу, что Discourse — лучшее программное обеспечение для нас в будущем. Мы уже наладили импорт, и единственное, что мешает нам завершить миграцию, — это решение этой последней задачи. Я могу согласиться отказаться от таблиц, так как мы планируем убрать любой BBCode, который полностью поддерживается Discourse или Markdown. Однако таблицы — это тот случай, когда их нельзя просто легко переформатировать в версию Markdown, поскольку замена тегов table, td, tr и подобных на правильный синтаксис Markdown — задача непростая, а скорее, практически невозможная, насколько я могу судить. Поэтому отказ от них приемлем, даже если их нельзя легко переформатировать, но сам процесс изучения того, как это сделать, скорее всего, поможет нам разобраться со всем остальным.
Например, мы смогли отказаться от [h1], поскольку этот тег действительно легко изменить: все теги H просто нужно заменить на соответствующее количество символов #.
У нас есть полный список по адресу: Tutorial - RpNation - BBcode Guide | RpNation, а также несколько других тегов, помимо упомянутых в этой теме, которые уже были убраны, так как их было очень легко найти и заменить на эквиваленты в Markdown.
Я знаю, что этот пост датирован 2020 годом, но раз на него так и не ответили (кроме как просто сказать «посмотрите другой код» и «таблицы слишком сложны»), я решил внести свой вклад и помочь, чем смогу, поскольку сейчас сам пишу плагин для bbcode и столкнулся с полным отсутствием документации.
Я посмотрел на ваш синтаксис bbcode для [table], и это вполне разумный плагин для создания — нужно просто добавить обёртку. Честно говоря, я не думаю, что Сэм даже смотрел на ссылку, которую вы отправили, потому что ваш формат bbcode для таблиц практически идентичен HTML-формату таблиц, только с тегами bbcode.
Этот пост действительно помог немного разобраться, как это сделать:
Сейчас у меня нет времени подробно объяснить, как реализовать то, что вы хотите (и протестировать, чтобы убедиться, что это работает), но могу сказать, что типы токенов html_raw и html_block довольно удобны. Также лучший способ проверить, работает ли это на самом деле, — добавить console.log() в функцию wrap и посмотреть, что именно возвращается в консоль (и убедиться, что ваши действия работают, не беспокоясь об агрессивном санитайзере Discourse).
Мы начали работу над новым плагином для bbcode после того, как добились некоторого прогресса в расширении возможностей Markdown, но в итоге решили, что это не сработает так хорошо, как мы надеялись. Мы надеемся завершить оставшиеся три (или около того) к этому лету, а вскоре после этого выполнить миграцию.
Однако таблицы, скорее всего, не получат аналога в bbcode, и пользователям будет рекомендовано использовать версию на Markdown. Никто не любит таблицы.
Выглядит действительно хорошо. Я знаю, что вы отказались от таблиц bbcode, но если хотите, я всё ещё могу помочь создать скрипт, чтобы заставить их работать.