
Markdown у HTML і назад: конвертер із живим прев’ю
Вставте Markdown — побачите готову сторінку і чистий HTML поруч. Вставте HTML — отримаєте Markdown, придатний для README чи статті у блозі. Обидва напрями працюють у вашому браузері: текст нікуди не надсилається і ніде не зберігається.
.md — файл читається локально. Підтримано CommonMark у типовому обсязі плюс розширення GFM: таблиці, закреслення, списки задач.
Вставте Markdown вище — HTML з’явиться тут.
.html — файл читається локально. Розбір іде через DOMParser, тому працює і з фрагментом, і з цілою сторінкою.
Вставте HTML вище — Markdown з’явиться тут.
Текст не залишає ваш браузер — перетворення виконується локально, без відправки на сервер.
Що саме підтримано
З боку Markdown — CommonMark у типовому обсязі плюс розширення GFM: заголовки решітками і підкресленням, абзаци, горизонтальні лінії; списки марковані, нумеровані та вкладені, зі щільним і розрідженим оформленням; списки задач у квадратних дужках; цитати, зокрема з лінивим продовженням рядка; код в огорожі з назвою мови та код відступом; таблиці GFM з вирівнюванням колонок; посилання, зображення, автопосилання, посилання на визначення внизу документа; жирний, курсив, закреслення, код у рядку, екрановані символи, жорсткий перенос. З боку HTML розбір іде через DOMParser самого браузера, тому працює і фрагмент, і ціла сторінка з head. Таблиці з об’єднаними клітинками у Markdown не переносяться — такого синтаксису там немає, тож вони лишаються тегами, і інструмент про це каже. Чого свідомо немає: підсвітки синтаксису у блоках коду, зносок, формул і директив конкретних генераторів статики. Це вже не Markdown, а діалект окремого інструмента.
Один перенос рядка: два різні Markdown
Найчастіше джерело розбіжностей між конвертерами — саме одинарний перенос усередині абзацу. За CommonMark це звичайний пробіл: два рядки склеюються в один абзац. Так поводяться Pandoc, генератори документації і більшість статичних сайтів. GitHub у коментарях, описах задач і рецензіях робить навпаки: кожен перенос стає тегом br. Саме тому текст, який гарно виглядав у задачі, після переносу в README злипається в суцільний абзац. Прапорець «Одинарний перенос рядка — це br» перемикає між цими двома звичками. За замовчуванням діє правило CommonMark.
Чому прев’ю показує не все, що є в HTML
Markdown за специфікацією дозволяє HTML усередині себе. Це зручно і водночас означає, що будь-який вставлений текст може містити виконуваний код. Популярні онлайн-переглядачі кладуть результат у innerHTML як є. Бібліотека marked, на якій вони збудовані, з четвертої версії не має вбудованої санітизації взагалі — тег script із чужого Markdown там просто виконається. Тут прев’ю будується вузлами DOM за білим списком: script, iframe, object, обробники подій виду onclick і посилання зі схемою javascript: до нього не потрапляють, а список вирізаного показується під результатом. У вкладці «HTML-код» ви бачите повний вихід без урізань — це текст, а не сторінка, і виконати його неможливо. Потрапити у прев’ю HTML із джерела може лише тоді, коли ви самі увімкнули відповідний прапорець. За замовчуванням теги екрануються і показуються як текст.
