Konwerter HTML na Markdown
Przetłumacz kod HTML na składnię Markdown (CommonMark, GFM). Nagłówki, listy, tabele, linki, obrazy i bloki kodu. Bezpłatnie, działa lokalnie w przeglądarce.
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
Znaczniki przetłumaczone
elementy HTML, które przeszły przez konwerter (h1, p, strong, a…)
Rozmiar przed
wejściowy HTML
Rozmiar po
wynikowy Markdown
Zmiana rozmiaru
ujemna = Markdown jest krótszy niż HTML
# Project Notes This **HTML** snippet will be converted to *Markdown*. ## Checklist - Headings - Lists - [Links](https://example.com) ``` echo "Hello, Markdown!"; ``` > Portable, readable, diff-friendly.
| HTML wejściowy | Markdown wynikowy |
|---|---|
| <h2>Notatka</h2><p>To jest <strong>ważny</strong> fragment z <a href="https://example.com">linkiem</a> i <em>akcentem</em>.</p><ul><li>punkt jeden</li><li>punkt dwa</li></ul> | ## Notatka To jest **ważny** fragment z [linkiem](https://example.com) i *akcentem*. - punkt jeden - punkt dwa |
| Znacznik HTML | Wynik w Markdown |
|---|---|
| h1 … h6 | # Tytuł … ###### Tytuł — poziom nagłówka hashami (ATX); w trybie Setext H1 i H2 dostają podkreślenia === albo --- |
| p, div, section, article, header, footer | akapit oddzielony pustymi liniami — znacznik znika, zostaje sama treść |
| br | łamanie linii; przy opcji „zachowaj łamania” jako dwie spacje + koniec wiersza |
| hr | pozioma linia --- |
| blockquote | cytat: każda linia treści z prefiksem > |
| pre (i code w środku) | blok kodu w potrójnych backtickach ``` albo tyldach ~~~ — do wyboru w ustawieniach |
| ul, ol, li | lista: - / * / + dla punktowej, 1. 2. 3. dla numerowanej; zagnieżdżenia dwiema spacjami |
| strong, b | pogrubienie **tekst** |
| em, i | kursywa *tekst* |
| code (w linii) | kod w backtickach `kod`; gdy treść zawiera backtick, ogrodzenie jest automatycznie wydłużane |
| a | link [tekst](URL); w trybie odnośników [tekst][1] z definicjami na końcu; bez href zostaje sam tekst |
| img | obraz ; bez src pomijany |
| span | przepuszczany — zostaje tylko treść |
| table, tr, td, th | tabela Markdown (składnia GFM) z wierszem separatora | --- |; kreski | w treści są uciekane |
| script, style | treść pomijana — konwerter przepuszcza tylko węzły tekstowe, a zawartość script/style libxml czyta jako CDATA, która wypada z wyniku |
| inne nierozpoznane | traktowane jak kontener — zostaje tylko przetłumaczona treść dzieci |
Konwersja zachowuje treść i strukturę, ale gubi warstwę prezentacyjną: atrybuty (class, id, style), całe CSS i układ tabel. Dobrą wiadomością jest bezpieczeństwo: zawartość <script> i <style> nie przechodzi do wyniku (konwerter przepuszcza wyłącznie węzły tekstowe), a podgląd na stronie jest dodatkowo escapowany — w pliku .md znajdzie się więc tylko treść, nie kod JS.
Warto wiedzieć — HTML i Markdown w praktyce
Co gubi konwersja
Markdown opisuje strukturę (nagłówki, listy, wyróżnienia), nie wygląd. Znikają klasy i identyfikatory, style inline, atrybuty tabel (width, colspan) i całe CSS. Jeśli układ ma znaczenie, dołącz osobny arkusz stylów po stronie Markdown.
Skrypty i style zostają za burtą
Konwerter przepuszcza wyłącznie węzły tekstowe, a zawartość <script> i <style> libxml czyta jako CDATA — więc kod JS i CSS wypada z wyniku. Podgląd jest dodatkowo escapowany, a mimo to w .md trzymaj samą treść: czyściej i bezpieczniej.
ATX czy Setext
ATX (#, ##, ###) to standard używany wszędzie — od GitHuba po notatniki. Setext (podkreślenia === i ---) działa tylko dla H1 i H2, ale bywa czytelniejszy w prostych dokumentach. H3–H6 w trybie Setext i tak wypadają hashami.
Tabele i odnośniki (GFM)
Tabele HTML zamieniają się na wariant GFM z separatorem | --- | — obsługuje go GitHub i większość renderów. Tryb odnośników przenosi wszystkie URL-e na koniec dokumentu ([tekst][1]), co zostawia czystszy tekst do edycji.
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćKonwerter HTML na Markdown – czysta składnia .md z kodu HTML
Markdown to lżejszy format niż HTML – idealny do README, dokumentacji i CMS. Zamiana HTML na Markdown ręcznie jest żmudna. Narzędzie parsuje drzewo DOM i tłumaczy elementy HTML na odpowiadającą im składnię Markdown (CommonMark lub GitHub Flavored Markdown).
Mapowanie elementów HTML na Markdown
Nagłówki <h1>–<h6> → # do ######. <strong>/<b> → **tekst**. <em>/<i> → *tekst*. <a href="url"> → [tekst](url). <img> → . <ul><li> → - element. <ol><li> → 1. element. <code> → `kod`. <pre><code> → ```język\nkod\n```. <blockquote> → > cytat. <hr> → --- (trzy myślniki).
Tabele HTML na Markdown
<table> → tabela GFM (GitHub Flavored Markdown): | Kolumna 1 | Kolumna 2 | / | --- | --- | / | wartość | wartość |. Uwaga: CommonMark nie obsługuje natywnie tabel – tylko GFM. Opcja w narzędziu: wybierz standard (CommonMark / GFM / MDX).
Co nie konwertuje się idealnie
Inline CSS styles: tracone (Markdown nie ma stylów). <div>, <span>: pomijane (nie mają odpowiednika MD). Zagnieżdżone tabele: spłaszczane. <iframe>: zachowywane jako HTML (fallback). Atrybuty class/id: tracone (Markdown jest semantycznie płaski). Złożone layouty wielokolumnowe: sprowadzane do liniowej struktury.
Markdown flavours – różnice
CommonMark (spec.commonmark.org): podstawowy standard, brak tabel, brak zadań. GFM (GitHub Flavored Markdown): tabele, listy zadań (- [x]), ~~przekreślenie~~, auto-linki. MDX: Markdown + JSX (React) – komponentowe dokumenty. MyST (Sphinx): Markdown dla dokumentacji Python. Narzędzie obsługuje GFM jako domyślny.
Od drzewa DOM do pliku .md – jak działa konwersja
Konwersja nie polega na podmianie znaczników wyrażeniami regularnymi. Narzędzie najpierw parsuje wejście zgodnie z algorytmem parsera HTML5 i buduje drzewo DOM – również wtedy, gdy kod jest niekompletny, ma brakujące zamknięcia albo znaczniki w nietypowej kolejności. Dopiero na gotowym drzewie pracują reguły tłumaczące, dzięki czemu wynik nie zależy od formatowania źródła, takich jak wcięcia czy podział na wiersze.
Przejście po drzewie jest rekurencyjne, od korzenia w dół. Dla każdego węzła elementowego sprawdzany jest jego typ i kontekst, w jakim występuje: inaczej traktowany jest element li wewnątrz listy punktowanej, a inaczej wewnątrz numerowanej; akapit wewnątrz komórki tabeli nie zamienia się na zwykły akapit, bo tabela w GFM wymaga tekstu jednowierszowego. Węzły tekstowe są czyszczone: ciągi spacji i tabulatorów redukowane do pojedynczej spacji, a znaki o znaczeniu składniowym – gwiazdki, podkreślenia, nawiasy kwadratowe, krzyżyki i kreski pionowe – poprzedzane backslashem, żeby renderer nie odczytał ich jako formatowania.
Na końcu wynik składany jest w jeden dokument. Bloki rozdzielane są pustymi liniami, bo Markdown wymaga wolnej linii przed nagłówkiem, listą czy blokiem kodu, aby rozpoznać je jako osobne elementy. Listy dostają wcięcia zgodne z poziomem zagnieżdżenia, a wybrany standard wyjścia decyduje o szczegółach: CommonMark nie zna tabel ani list zadań, GFM obsługuje jedno i drugie i dlatego jest trybem domyślnym, a MDX dodatkowo przepuszcza fragmenty JSX bez zamiany na zwykły tekst.
Przykład: fragment dokumentacji z HTML do Markdown
- Wejście: wklejasz fragment kodu: <h2>Instalacja</h2><p>Uruchom polecenie <code>npm install</code> i sprawdź <a href='https://webp.pl'>dokumentację</a>.</p><ul><li>Node.js 18+</li><li><strong>npm</strong></li></ul><pre><code class='language-bash'>npm run build</code></pre>
- Parsowanie: narzędzie buduje drzewo, w którym korzeń zawiera nagłówek h2, akapit p, listę ul z dwoma elementami li oraz blok pre z elementem code. Klasa na elemencie code informuje parser, że to blok kodu w języku bash, a nie zwykły akapit.
- Nagłówek i akapit: h2 zamienia się na ## Instalacja. W akapicie element code daje fragment w backtickach, a link zamienia się na [dokumentację](https://webp.pl). Kropka kończąca zdanie zostaje w tekście akapitu.
- Lista: typ listy decyduje o znaczniku, więc każdy element li staje się pozycją zaczynającą się od myślnika, a pogrubienie w drugim punkcie daje **npm**. Wynik to dwie linie: - Node.js 18+ oraz - **npm**.
- Blok kodu: pre z elementem code i klasą języka zamienia się w ogrodzenie z nazwą języka, następnie wiersz polecenia i zamykające ogrodzenie. Gdyby klasa nie wskazywała języka, powstałoby ogrodzenie bez nazwy i bez podświetlania składni na GitHubie.
- Sklejenie i zapis: między blokami wstawiane są puste linie, a całość zapisywana jest jako plik .md. Po wklejeniu do README nagłówek, akapit z linkiem, lista i blok kodu renderują się tak samo jak w oryginalnym HTML.
Przypadki brzegowe konwersji HTML na Markdown
| Sytuacja w kodzie HTML | Wynik w pliku .md | Uwaga |
|---|---|---|
| Element br w akapicie | Na końcu wiersza dwie spacje albo backslash | Backslash działa w CommonMark i GFM, dwie spacje bywają obcinane przez edytory i formatery. |
| Gwiazdka, podkreślenie lub nawias kwadratowy w treści | Znak poprzedzony backslashem | Bez escapowania renderer uznałby tekst za składnię pogrubienia, kursywy albo linku. |
| Odnośnik z atrybutem title | [tekst](adres) | Atrybut title nie ma odpowiednika w podstawowej składni Markdown. |
| Obraz bez atrybutu alt |  | Puste nawiasy kwadratowe zostają; opis warto dopisać ręcznie ze względu na dostępność. |
| Lista zagnieżdżona w elemencie li | Wcięcie kilku spacji i inny znacznik poziomu | Wcięcie musi być spójne w całym dokumencie, inaczej renderer potraktuje podlistę jako zwykły tekst. |
| Blok pre z kodem bez klasy języka | Ogrodzenie bez nazwy języka | Nazwa języka pochodzi z atrybutu class, np. language-python. |
| Kreska pionowa w komórce tabeli | Znak poprzedzony backslashem | Bez escapowania rozbiłaby wiersz tabeli na dodatkowe kolumny. |
| Komentarz HTML w kodzie | Pominięty w wyniku | Markdown nie ma składni komentarzy, więc komentarz nie ma jak zostać zapisany. |
Jak korzystać z konwertera, żeby wynik był gotowy do publikacji
- Wklejaj jeden spójny fragment – zamiast całego dokumentu z sekcją head lepiej podać treść artykułu albo pojedynczy blok. Elementy takie jak style, skrypty i metadane i tak nie mają odpowiednika w Markdown, a jedynie zwiększają szum przed konwersją.
- Dopasuj tryb wyjścia do odbiorcy – GFM wybierz wtedy, gdy plik ma trafić na GitHuba albo do README, CommonMark gdy dokument ma być neutralny, a MDX gdy w treści świadomie zostawiasz komponenty JSX.
- Pilnuj pustych linii po konwersji – nagłówek, lista i blok kodu muszą być oddzielone pustą linią od sąsiednich akapitów. Jeśli edytor je usunął, dopisz je ręcznie, bo inaczej renderer scali bloki w jeden akapit.
- Sprawdź bloki kodu źródłowo – nazwa języka bierze się z klasy na elemencie code. Gdy w kodzie HTML jej nie było, blok wyjdzie bez podświetlania i trzeba dopisać język po otwierającym ogrodzeniu.
- Przejrzyj wynik przed commitem – konwersja jest deterministyczna, ale to nie znaczy, że zawsze idealna. Najszybciej wyłapiesz problemy, wklejając gotowy plik do podglądu Markdown i porównując go z oryginalną stroną.
Czego konwersja HTML na Markdown nie uwzględnia
- Scalone komórki tabel – rowspan i colspan nie mają odpowiednika w tabelach GFM. Takie komórki są powielane albo pomijane, więc przed konwersją warto rozbić skomplikowaną tabelę na prostszą, jednowierszową siatkę.
- Elementy interaktywne – pola formularzy, listy rozwijane, przyciski i inne kontrolki nie mają składni w Markdown. Zostaną pominięte albo zamienione na tekst, więc formularza nie da się przenieść tą drogą.
- Atrybuty dostępności – role, aria-label i podobne atrybuty znikają razem z całym HTML-em. Jeśli dokument ma pozostać dostępny, opis elementu trzeba przenieść do zwykłego tekstu albo do opisu obrazu.
- Treść w komponentach webowych – to, co trafia do cienia drzewa albo jest wstawiane przez skrypt po stronie przeglądarki, nie istnieje w kodzie źródłowym, więc konwerter nie ma czego odczytać i wynik będzie niepełny.
Najczęstsze pytania
Jak przekonwertować cały artykuł WordPress na Markdown?
Wyeksportuj post jako HTML (WordPress Export lub widok źródła). Wklej do narzędzia. Dla masowej konwersji: pandoc (CLI): pandoc -f html -t markdown article.html -o article.md. Node: turndown library (npm). Python: html2text, markdownify.
Czy Markdown obsługuje kolory i style tekstu?
Podstawowy Markdown nie. Rozszerzenia: <span style="color:red">tekst</span> (raw HTML w MD). GitHub nie renderuje inline styles w README. Mermaid diagrams (wbudowane w GitHub/GitLab): bloki kodu ```mermaid dla diagramów. LaTeX math: $formula$ w MathJax/KaTeX.
Co to jest front matter w Markdown?
YAML front matter: blok --- na początku pliku z metadanymi (title, date, tags). Używany przez Jekyll, Hugo, Gatsby, Obsidian, Eleventy. Przykład: ---\ntitle: "Artykuł"\ndate: 2024-01-01\ntags: [seo, web]\n---. Narzędzie może generować front matter z meta tagów HTML (<title>, <meta description>).
Jak renderować Markdown w przeglądarce?
marked.js (szybki parser JS), remark (AST-based, plugin ecosystem), markdown-it (rozszerzalny). React: react-markdown (bezpieczny, XSS protection). Vue: vue-markdown-render. Sanitizacja: DOMPurify po konwersji HTML – zapobiega XSS.
Jaka jest różnica między Markdown a reStructuredText?
Markdown: prosty, popularne w GitHub/GitLab/Jupyter. reStructuredText (.rst): używany przez Python (Sphinx documentation), bardziej rygorystyczna składnia, obsługuje bardziej złożone dokumenty techniczne. AsciiDoc: alternatywa z bogatszą semantyką (tabele, cytaty, diagramy).
Czy konwerter HTML na Markdown obsługuje zagnieżdżone listy?
Tak. Każdy poziom listy dostaje własne wcięcie i znacznik odpowiedni dla swojego typu, więc podlista punktowana wewnątrz listy numerowanej zachowa strukturę. Trzeba tylko pamiętać, że wcięcie musi być spójne w całym dokumencie.
Dlaczego w pliku .md zniknęły komentarze HTML i atrybuty data-*?
Markdown nie ma składni komentarzy, a atrybuty data-* nie mają żadnego odpowiednika w tym formacie. Parser pomija je razem z resztą informacji, które nie przekładają się na treść dokumentu.
Jak przenieść tabelę HTML do Markdown bez utraty kolumn?
Wybierz tryb GFM, bo tylko on obsługuje tabele. Przed konwersją usuń z kodu scalone komórki i zagnieżdżone tabele, ponieważ te konstrukcje nie mają odpowiednika i mogą zaburzyć układ kolumn.
Czy można wygenerować wynik w trybie MDX?
Tak, MDX jest jednym z trybów wyjścia i różni się od GFM tym, że fragmenty JSX oraz komponenty React zostają w treści zamiast zostać zamienione na zwykły tekst. Pozostałe elementy tłumaczone są normalnie na składnię Markdown.
Dlaczego blok kodu nie ma podświetlania języka?
Nazwa języka pochodzi z klasy na elemencie code, na przykład language-bash. Jeśli w źródłowym HTML klasy nie było, wyjście zawiera puste ogrodzenie i język trzeba dopisać ręcznie po potrójnym apostrofie.
Powiązane narzędzia: konwerter Markdown na HTML, walidator HTML i ekstraktor tekstu z PDF.