Что такое конвертация HTML в Markdown?
HTML — это отрендеренная разметка, которую отображает браузер: <h1>, <ul>, <table>, <a> и остальное. Markdown — лёгкий текстовый формат, использующий минимум пунктуации (# для заголовков, * для выделения, - для пунктов списка) для кодирования той же структуры. GitHub Flavored Markdown (GFM) расширяет исходную спецификацию CommonMark таблицами, зачёркиванием, списками задач и автоссылками. Конвертация HTML в Markdown возвращает отрендеренный или экспортированный HTML обратно в редактируемый простой текст — именно то, что нужно при миграции контента с CMS или для приведения README в порядок.
Какие возможности GitHub Flavored Markdown поддерживает вывод?
Встроенный движок turndown@7.2.0 с расширением turndown-plugin-gfm формирует полное надмножество GFM из вашего HTML: заголовки ATX от # до ###### из <h1>–<h6>, упорядоченные и неупорядоченные списки с вложенностью, жирный **text** и курсивный *text*, зачёркивание ~~text~~ из <del>, встроенные ссылки [text](url) и изображения , ограждённые блоки кода с языковыми подсказками (```js), inline-фрагменты кода `code`, таблицы с разделителем | из <table>, списки задач GFM - [ ] / - [x] из checkbox-полей, цитаты > и горизонтальные линии ---. Панель предпросмотра повторно рендерит выведенный Markdown с помощью marked@12.0.2, чтобы вы могли визуально подтвердить результат конвертации.
Как работает конвертация HTML в Markdown?
Каждая конвертация выполняется локально в вашем браузере с помощью трёх встроенных библиотек — без CDN, без fetch, без телеметрии. Основные шаги:
- Очистка: вставленный HTML сначала пропускается через
DOMPurify.sanitize(html, { USE_PROFILES: { html: true } }), чтобы удалить элементы<script>, все обработчики событийon*и URIjavascript:— прежде чем что-либо обойдёт разметку. DOMPurify — тот же XSS-санитайзер, что используют Mozilla MDN, Atlassian и Microsoft 365. - Конвертация:
turndownService.turndownобходит очищенный DOM и формирует GitHub Flavored Markdown — заголовки превращаются в префиксы#, списки — в элементы-/1.,<table>— в таблицу с разделителем |, и т. д. Markdown записывается в выходной<textarea>только для чтения черезvalue(никогда черезinnerHTML), что изначально безопасно. - Рендер: сформированный Markdown повторно разбирается через
marked.parse, снова очищается черезDOMPurifyи назначается вinnerHTMLпанели предпросмотра, чтобы вы получили визуальное подтверждение: Markdown round-trip совпадает с ожидаемой структурой. Живой режим дебаунсит ввод на 150 мс, так что вывод обновляется по мере вставки без нагрузки на парсер.
Почему стоит конвертировать HTML в Markdown этим инструментом?
- Конфиденциальность: каждый этап очистки, конвертации и рендера происходит в вашем браузере. HTML — включая экспортированные CMS-публикации, внутреннюю документацию и конфиденциальный исходный код страниц — никогда не попадает на наши серверы.
- Безопасно к XSS по умолчанию: вставленный HTML пропускается через DOMPurify перед тем, как turndown его обойдёт, а панель предпросмотра снова прогоняет повторно отрендеренный HTML через DOMPurify перед
innerHTML, поэтому вставка разметки с тегами<script>или обработчикамиonerror=даёт инертный предпросмотр и чистый Markdown. - GFM-полнота: элементы
<table>конвертируются в таблицы с разделителем |,<del>— в зачёркивание, а checkbox-списки — в списки задач GFM. Большинство онлайн-конвертеров теряет таблицы на пути HTML → Markdown — встроенное расширениеturndown-plugin-gfmих сохраняет.
Каковы распространённые применения конвертации HTML в Markdown?
Конвертация HTML в Markdown встречается при миграции контента, написании документации и архивировании:
- Миграция CMS: экспорт поста WordPress или Ghost в HTML и преобразование в Markdown для пересборки статического сайта на Hugo / Jekyll / 11ty / Astro. Конвертация сохраняет уровни заголовков, ссылки, списки и inline-выделения.
- Приведение README в порядок: вставка отрендеренного HTML со страницы вики или веб-статьи и возврат в редактируемый Markdown для README проекта или сайта с документацией — вместо того чтобы заново набирать структуру вручную.
- Архивирование и заметки: захват HTML-письма или web-клипа и конвертация в Markdown для хранения в Obsidian, Notion или базе знаний в формате простого текста — Markdown остаётся удобным для diff и переживает смену форматов.
Как выглядит пример конвертации HTML в Markdown?
Вставка <h2>Heading</h2><ul><li>a</li><li>b<ul><li>nested</li></ul></li></ul> даёт Markdown с ## Heading, вложенным маркированным списком и панель предпросмотра, которая повторно рендерится в ту же вложенную структуру. Вставка <table> с строкой заголовка и двумя строками данных даёт эквивалентную таблицу | col | col | с разделителем — что подтверждает: конвертация сохраняет заголовки, списки и таблицы.
Работает ли этот конвертер HTML в Markdown полностью в моём браузере?
Да. Каждый этап очистки, конвертации и рендера выполняется локально как JavaScript внутри вкладки браузера. Три встроенные библиотеки — turndown@7.2.0 (с turndown-plugin-gfm@1.0.2), marked@12.0.2 и DOMPurify@3.1.7 — поставляются с того же источника, что и страница, поэтому нет зависимости от CDN, нет fetch, нет XMLHttpRequest, нет navigator.sendBeacon на входе. Инструмент также работает офлайн после загрузки страницы, поскольку это статический бандл HTML/CSS/JS с библиотеками производителя рядом. Экспортированные публикации, внутренние документы и конфиденциальный исходный код страниц остаются на вашем устройстве.
Безопасна ли панель отрендеренного предпросмотра к XSS?
Да. Каждая HTML-строка, присваиваемая innerHTML, сначала проходит через DOMPurify.sanitize(html, { USE_PROFILES: { html: true } }). DOMPurify — это XSS-санитайзер с открытым исходным кодом, поддерживаемый Cure53; это та же библиотека, которую используют Mozilla MDN, Atlassian и Microsoft 365 для защиты HTML от пользователя. Профиль html по умолчанию удаляет элементы <script>, каждый атрибут-обработчик on* (onerror, onclick и т. д.), URI-схемы javascript: внутри href / src. Вставка <img src=x onerror=alert(1)> даёт предпросмотр, в котором document.querySelector('#output-preview img[onerror]') возвращает null и alert не срабатывает.
Конвертируются ли таблицы GFM из HTML?
Да. Направление HTML → Markdown использует turndown-plugin-gfm, который добавляет специальное правило turndown, обходящее узлы <table> и выводящее эквивалентный Markdown с разделителем — строку заголовка, строку выравнивания |---|---| и строки данных. Большинство онлайн-конвертеров теряет таблицы на этом пути; этот сохраняет. Зачёркивание (<del>text</del> → ~~text~~) и списки задач (<input type="checkbox"> → - [ ] / - [x]) конвертируются так же.
Будет ли мой HTML конвертироваться чисто?
Для канонического набора GFM — заголовки h1—h6, упорядоченные и неупорядоченные списки с вложенностью, жирный / курсив / зачёркивание, встроенные ссылки, встроенные изображения, ограждённые блоки кода с языковыми метками, inline-фрагменты кода, таблицы с разделителем |, списки задач, цитаты, горизонтальные линии и автоссылки — конвертация чистая и предсказуемая. Пограничные случаи: HTML-комментарии (<!-- ... -->) удаляются (в Markdown нет синтаксиса комментариев); inline-стили и атрибуты class отбрасываются, поскольку у Markdown нет аналогов; редкие inline-теги вроде <sub> / <sup> превращаются в обычный текст. Это документированное поведение turndown, а не баги.
Поддерживается ли подсветка синтаксиса в ограждённых блоках кода?
Не в v1. Ограждённые блоки кода рендерятся моноширинным шрифтом и тонким фоном, но без подсветки токенов по языкам. Добавление подсветки синтаксиса потребовало бы упаковки Prism или highlight.js, каждая из которых добавляет 15–40 КБ плюс файл грамматики для каждого языка и матрицу тем, которые нужно согласовать с палитрой Workshop Terminal. Пока что рендерер сосредоточен на корректности и XSS-безопасности; если будет запрос на inline-подсветку, опциональный переключатель — реалистичный шаг.
Этот конвертер HTML в Markdown поставляется с turndown@7.2.0 (+ turndown-plugin-gfm@1.0.2), marked@12.0.2 и DOMPurify@3.1.7, упакованными с того же источника, формирует полный набор возможностей GFM и очищает каждую отрендеренную HTML-строку перед тем, как она коснётся DOM. Без загрузок, без CDN, без телеметрии — каждый байт остаётся в вашем браузере.