GFM vs CommonMark vs Pandoc Markdown: porównanie składni
Wiedzieć, które funkcje Markdownu bezpiecznie się przenoszą
Markdown wygląda jak jeden język, dopóki ten sam plik nie wyrenderuje się inaczej w GitHub, Hugo, Obsidian lub Pandoc. A problem nie polega na tym, że Markdown jest niedostępny.
Problem polega na tym, że „Markdown” opisuje rodzinę powiązanych składni, parserów i funkcji platformowych, a nie jeden uniwersalny format dokumentu. CommonMark definiuje precyzyjne, przenośne jądro, GitHub Flavored Markdown dodaje funkcje przydatne do współpracy w projektach oprogramowania, a Pandoc Markdown rozszerza ten język na poważny format tworzenia dokumentów.

Wybór między nimi zależy od tego, gdzie dokument musi zostać wyświetlony. Plik README, artykuł w blogu Hugo i praca naukowa mają różne wymagania. To porównanie jest częścią szerszego narzędzi dokumentacyjnych obrazu i obejmuje formalne dialekty, rozszerzenia specyficzne dla platform oraz praktyczne zasady przenośności, aby można było wybrać właściwą składnię dla docelowego środowiska. W celu szybkiego zapoznania się ze składnią, ściągawka Markdown obejmuje podstawowe elementy formatowania.
Markdown to nie jeden język
Oryginalna składnia Markdown była celowo mała i luźno specyfikowana. Sprawiało to, że była łatwa w czytaniu i implementacji, ale różne parsery zaczęły interpretować niejednoznaczne dane wejściowe inaczej.
CommonMark został stworzony, aby zdefiniować spójne zasady parsowania dla fundamentalnych struktur Markdown. GitHub Flavored Markdown, zwykle nazywany GFM, opiera się na tej podstawie, dodając kilka powszechnie używanych rozszerzeń.
Pandoc Markdown podejmuje inną drogę. Zamiast pozostać małą składnią skierowaną na web, dodaje funkcje dokumentowe, takie jak cytowania, metadane, przypisy dolne, listy definicyjne, atrybuty i notacja matematyczna.
Uproszczony związek wygląda następująco:
Ta hierarchia jest przydatna, ale nie jest dokładnym dziedziczeniem w każdej implementacji. Każdy renderer może niezależnie włączać, wyłączać lub dodawać składnię.
Krótka odpowiedź
Używaj składni zgodnej z CommonMark, gdy przenośność ma największe znaczenie.
Używaj GFM, gdy piszesz pliki README, pull requesty, szablony zgłoszeń i dokumentację techniczną przeznaczoną głównie dla platform zgodnych z GitHub.
Używaj Pandoc Markdown, gdy dokument źródłowy musi zostać przekonwertowany na PDF, DOCX, EPUB, LaTeX, slajdy lub pracę akademicką z cytowaniami i metadanymi.
Dla technicznego bloga Hugo używaj jądra CommonMark oraz rozszerzeń Goldmark, które Twoja strona włącza wprost. Nie zakładaj, że każda funkcja widoczna w GitHub będzie działała tylko dlatego, że Hugo jest opisany jako zgodny z GFM.
Subiektywna opinia: jeśli zapamiętasz tylko jedną zasadę dla technicznego bloga Hugo, traktuj CommonMark oraz tabele i listy zadań w stylu GFM jako domyślny zestaw, a wszystko inne — przypisy dolne, matematyka, bloki informacyjne, atrybuty nagłówków — jako jawną, przetestowaną rozszerzenie, a nie domyślną funkcję. Ten pojedynczy nawyk zapobiega większości problemów z przenośnością opisanych poniżej.
CommonMark: Przenośne jądro
CommonMark jest formalną specyfikacją podstawowego języka Markdown. Głównym jego wkładem nie jest duży zbiór funkcji, ale spójne parsowanie.
Definiuje, jak parsery powinny interpretować:
- Akapity
- Nagłówki ATX i Setext
- Cytaty blokowe
- Listy uporządkowane i nieuporządkowane
- Blokady kodu z ogranicznikami i wcięte
- Wyróżnienie i mocne wyróżnienie
- Linki i obrazy
- Linki w stylu referencyjnym
- Kod inline
- Linie tematyczne (separatora)
- Surowe bloki HTML
- Twarde i miękkie łamania wierszy
Dokument CommonMark może nadal zachowywać się inaczej na warstwie prezentacji. CSS, podświetlanie składni, kotwice nagłówków, oczyszczanie HTML i polityki linków pozostają poza zasadami parsowania jądra.
CommonMark powinien więc być traktowany jako solidna strukturalna baza, a nie obietnica, że każdy renderer wygeneruje identyczną stronę.
Przenośny przykład CommonMark
# Service Deployment
The service exposes a small HTTP API.
## Requirements
- Linux
- Docker
- 8 GB of memory
## Start the service
```bash
docker compose up -d
```
See the [configuration guide](configuration.md) for details.
Tego typu dokument działa w praktycznie każdym nowoczesnym środowisku Markdown. Wykorzystuje nagłówki, akapity, listy, kod z ogranicznikami i zwykłe linki, nie polegając na rozszerzeniach specyficznych dla dialektu.
GitHub Flavored Markdown: CommonMark dla projektów oprogramowania
GitHub Flavored Markdown jest formalnym dialektem opartym na CommonMark. Zachowuje model parsowania CommonMark i dodaje funkcje często potrzebne w dokumentacji repozytoriów i współpracy.
Formalna specyfikacja GFM dodaje:
- Tabele z użyciem znaków pionowych (pipe tables)
- Elementy list zadań
- Przekreślenie
- Rozszerzone automatyczne linki (autolinks)
- Ograniczenia dotyczące niektórych surowych tagów HTML
Rozszerzenia te są teraz tak powszechne, że wielu użytkowników uważa je za część standardowego Markdown. Nie są one częścią jądra CommonMark.
Tabele GFM
| Backend | Best use |
|---|---|
| Ollama | Local experiments |
| vLLM | Shared inference |
| SGLang | Structured workloads |
Ściśle zgodny z CommonMark parser może potraktować to jako zwykły tekst akapitu. Parser zgodny z GFM rozpoznaje to jako tabelę. Aby poznać składnię tabel i opcje wyrównania, zobacz Tabele w Markdown.
Listy zadań GFM
- [x] Install Docker
- [x] Download the model
- [ ] Add monitoring
Składnia list zadań jest przydatna w zgłoszeniach (issues), pull requestach i dokumentacji projektowej. Poza renderującym narzędziem wspierającym tę funkcję, może ona pojawić się jako zwykła lista zawierająca dosłowne nawiasy kwadratowe.
Przekreślenie GFM
Use the ~~old endpoint~~ new endpoint.
Przekreślenie jest szeroko wspierane, ale nadal jest to rozszerzenie, a nie przenośna składnia CommonMark.
Automatyczne linki GFM
GFM rozpoznaje więcej tekstów przypominających URL-e i adresy e-mail, bez konieczności używania nawiasów kwadratowych lub jawnego składni linków.
Visit https://example.com/docs for details.
W ściśle CommonMark jawne automatyczne linki używają nawiasów kwadratowych:
<https://example.com/docs>
Jawna forma jest bezpieczniejsza, gdy dokument musi przejść przez nieznane procesory Markdown.
GitHub.com wspiera więcej niż formalny GFM
Częstym źródłem pomyłek jest założenie, że każda funkcja Markdown widoczna w GitHub należy do specyfikacji GFM.
Tak nie jest.
GitHub.com dodaje przetwarzanie i funkcje na poziomie platformy wokół parsera GFM. W zależności od kontekstu GitHub może wspierać:
- Wyrażenia matematyczne
- Diagramy Mermaid
- Alerty
- Odwołania do zgłoszeń i pull requestów
- Wspomnienia użytkowników i zespołów
- Odwołania do commitów
- Shortcode emoji
- Składane sekcje HTML
- Podglądy kolorów
- Linki względne do repozytorium
- Automatyczne kotwice nagłówków
Niektóre z tych funkcji to rozszerzenia składni. Inne to zachowanie przetwarzania poetycznego lub integracje z danymi GitHub.
Ta różnica ma znaczenie, ponieważ inny renderer może trafnie twierdzić zgodność z GFM, nie implementując jednak renderera matematyki GitHuba, integracji Mermaid, odwołań do zgłoszeń ani stylowania alertów.
Diagramy Mermaid w GitHub
GitHub renderuje blok kodu z ogranicznikami oznaczony jako mermaid jako diagram:
```mermaid
flowchart LR
A[Markdown] --> B[Rendered diagram]
```
Uniwersalny renderer GFM może wyświetlić ten sam blok jako podświetlony kod źródłowy. Markdown pozostaje poprawny, ale rozszerzone renderowanie jest specyficzne dla platformy. Dla praktycznego wprowadzenia do składni Mermaid, zobacz Szybki start z diagramami Mermaid.
Wyrażenia matematyczne w GitHub
GitHub obsługuje wyrażenia matematyczne inline i blokowe za pomocą delimitatorów dolarów oraz dodatkowych form ucieczki.
The cache size is approximately $2nlhd$ bytes.
$$
C = 2nlhd
$$
Matematyka nie jest częścią formalnego GFM. Przenoszenie tej treści do innego renderera wymaga kompatybilnego rozszerzenia matematycznego, takiego jak KaTeX, MathJax lub wsparcie matematyki Pandoc.
Alerty w GitHub
GitHub obsługuje cytaty blokowe w stylu alertów, takie jak:
> [!WARNING]
> Changing this setting clears the cache.
W GitHubie może to wyglądać jak stylowane ostrzeżenie. W zwykłym renderze CommonMark zazwyczaj pojawia się jako zwykły cytat blokowy zawierający [!WARNING].
Ten fallback jest czytelny, co czyni alerty GitHuba mniej niebezpiecznymi niż rozszerzenia, które całkowicie znikają. Nadal nie są to jednak przenośne elementy prezentacji.
Pandoc Markdown: Markdown jako język dokumentu
Pandoc Markdown jest zaprojektowany do konwersji dokumentów, a nie dla jednej konkretnej strony internetowej. Używa Markdown jako składni źródłowej do tworzenia HTML, PDF, DOCX, EPUB, LaTeX, prezentacji i innych formatów.
Jego domyślny odczytywacz Markdown zawiera duży zestaw rozszerzeń. Ważne możliwości obejmują:
- Bloki metadanych YAML
- Przypisy dolne
- Cytowania
- Wiele formatów tabel
- Listy definicyjne
- Notację matematyczną
- Identyfikatory i atrybuty nagłówków
- Atrybuty bloków kodu
- Podzielone bloki z ogranicznikami (fenced divisions)
- Spany w nawiasach (bracketed spans)
- Indeksy górne i dolne
- Przekreślenie
- Bloki linii (line blocks)
- Numeryczne listy przykładów
- Surowy LaTeX
- Surowy HTML
- Automatyczne numerowanie sekcji
- Przetwarzanie bibliografii
Pandoc Markdown jest znacznie bardziej wyrazisty niż CommonMark lub formalny GFM. Ta wyrazistość czyni go potężnym w wydawnictwach, ale mniej bezpiecznym jako format wymiany.
Przypisy dolne w Pandoc
Markdown has several incompatible dialects.[^dialects]
[^dialects]: CommonMark, GFM, and Pandoc Markdown are three
important examples.
Składnia przypisów dolnych jest wspierana przez wiele nowoczesnych narzędzi, ale nie jest częścią CommonMark ani formalnego GFM.
GitHub obecnie renderuje przypisy dolne w kilku kontekstach treści, ale jest to funkcja platformy GitHub, a nie formalna gwarancja GFM. Renderer twierdzący jedynie zgodność z CommonMark lub GFM może ich nie wspierać.
Cytowania w Pandoc
PagedAttention improves KV cache memory management
[@kwon2023pagedattention].
Z plikiem bibliografii i stylem cytowania, Pandoc może rozwiązać to w sformatowane cytowanie akademickie i bibliografię.
pandoc article.md \
--citeproc \
--bibliography references.bib \
--csl ieee.csl \
-o article.pdf
Składnia cytowań pozostaje czytelna w renderze bez wsparcia, ale nie stanie się sformatowanym odwołaniem bez Pandoc lub innego kompatybilnego procesora cytowań. Elastność po stronie odczytywania w Pandoc wspiera również przepływy konwersji w drugą stronę — zobacz Konwersja dokumentów Word na Markdown jako praktyczny przykład użycia rozszerzonego dialektu Pandoc jako formatu pośredniego.
Listy definicyjne w Pandoc
CommonMark
: A precise specification for core Markdown.
GFM
: A CommonMark-based dialect with software-oriented extensions.
Pandoc Markdown
: An extended authoring format for document conversion.
Listy definicyjne są przydatne w instrukcjach, słownikach i książkach technicznych. Zazwyczaj źle degradują się w rendererach, które ich nie wspierają, ponieważ linie dwukropkowe pozostają widoczne jako zwykły tekst.
Atrybuty nagłówków w Pandoc
## Cache Configuration {#cache-config .deployment}
Pandoc interpretuje klamki jako jawne identyfikatory i listę klas. Wiele innych rendererów Markdown pokazuje tekst atrybutu bezpośrednio w nagłówku.
To jeden z najszybszych przykładów użytecznej składni, której nie należy umieszczać w dokumencie, który ma się renderować wszędzie.
Podzielone bloki w Pandoc
::: warning
Changing this option restarts the server.
Pandoc konwertuje to na strukturalny podział z klasą. Szablony, CSS, filtry lub moduły wyjściowe mogą zdecydować, jak ta struktura powinna wyglądać.
Większość rendererów CommonMark i GFM nie rozpoznaje ogranicznika. Wyświetlają dwukropki i zawartość jako zwykły tekst.
CommonMark vs GFM vs Pandoc Markdown
Poniższa macierz opisuje formalne dialekty, a nie każdą funkcję dodaną przez GitHub.com, Hugo, Obsidian, GitLab lub inną platformę.
| Funkcja | CommonMark | Formalny GFM | Pandoc Markdown |
|---|---|---|---|
| Nagłówki | Tak | Tak | Tak |
| Wyróżnienie | Tak | Tak | Tak |
| Linki i obrazy | Tak | Tak | Tak |
| Cytaty blokowe | Tak | Tak | Tak |
| Listy uporządkowane i nieuporządkowane | Tak | Tak | Tak |
| Bloki kodu z ogranicznikami | Tak | Tak | Tak |
| Surowy składnia HTML | Tak | Ograniczone w niektórych kontekstach | Tak |
| Tabele z użyciem pipe | Nie | Tak | Tak |
| Listy zadań | Nie | Tak | Tak |
| Przekreślenie | Nie | Tak | Tak |
| Rozszerzone automatyczne linki | Nie | Tak | Konfigurowalne |
| Przypisy dolne | Nie | Nie | Tak |
| Cytowania | Nie | Nie | Tak |
| Metadane YAML | Nie | Nie | Tak |
| Listy definicyjne | Nie | Nie | Tak |
| Notacja matematyczna | Nie | Nie | Tak |
| Atrybuty nagłówków | Nie | Nie | Tak |
| Podzielone bloki (fenced divisions) | Nie | Nie | Tak |
| Surowy LaTeX | Nie | Nie | Tak |
| Przetwarzanie bibliografii | Nie | Nie | Tak |
Słowo „Nie” nie oznacza, że platforma nigdy nie może wspierać funkcji. Oznacza to, że funkcja nie jest gwarantowana przez formalną specyfikację tego dialektu.
Jaka składnia działa w GitHub?
Dla plików README, zgłoszeń (issues), pull requestów, dyskusji i wik, GFM jest naturalną bazą.
Można generalnie używać:
- Składni CommonMark
- Tabel
- List zadań
- Przekreślenia
- Rozszerzonych automatycznych linków
- Blok kodu z podświetleniem składni
- Odwołań specyficznych dla GitHub
- Matematyki wspieranej przez GitHub
- Diagramów wspieranych przez GitHub
- Alertów GitHub
- Przypisów dolnych, tam gdzie wspierane przez powierzchnię treści
Ryzyko przenośności zaczyna się, gdy GitHub wykonuje dodatkowe renderowanie wykraczające poza formalny GFM. Diagramy Mermaid, notacja matematyczna, odwołania do zgłoszeń i prezentacja alertów mogą nie przetrwać poza GitHub.
Dla plików repozytorium, które są również publikowane gdzie indziej, testuj źródło w drugim renderze, zamiast traktować podgląd GitHuba jako autorytatywny.
Jaka składnia działa w Hugo?
Hugo używa Goldmark jako domyślnego renderera Markdown. Goldmark jest zgodny z CommonMark i zapewnia rozszerzenia kompatybilne z istotnymi częściami GFM.
W typowej konfiguracji Hugo następujące elementy działają dobrze:
- Struktura CommonMark
- Bloki kodu z ogranicznikami
- Tabele z użyciem pipe
- Przekreślenie
- Listy zadań
- Automatyczne ID nagłówków
- Podświetlanie składni
- Przypisy dolne, gdy rozszerzenie jest włączone
- Listy definicyjne, gdy włączone
- Podmiany typograficzne, gdy włączone
Hugo dodaje również funkcje poza Markdown za pomocą:
- Metadanych front matter
- Shortcode
- Hooków renderowania
- Zasobów strony
- Funkcji referencji wewnętrznych
- Przetwarzania szablonów
- Konfiguracji strony
Te funkcje Hugo nie podróżują z plikiem Markdown. Dla praktycznego przykładu wdrożenia Hugo, zobacz Wdrożenie Hugo do AWS S3.
Front Matter w Hugo to nie treść Markdown
Strona Hugo często zaczyna się od metadanych YAML, TOML lub JSON:
---
title: "Markdown Compatibility"
description: "Compare Markdown dialects and renderers."
date: 2026-07-31
tags:
- Markdown
- documentation
---
Pandoc może również rozpoznawać bloki metadanych YAML, ale interpretuje pola zgodnie ze swoimi szablonami i modułami wyjściowymi. GitHub zazwyczaj wyświetla blok jako sekcję podobną do YAML lub traktuje go jako metadane repozytorium tylko w określonych systemach.
Ta sama składnia może więc być rozpoznawana w więcej niż jednym narzędziu, nie mając tych samych znaczeń.
Surowy HTML w Hugo
Goldmark nie renderuje potencjalnie niebezpiecznego surowego HTML w standardowej konfiguracji Hugo.
Blok taki jak:
<div class="notice">
Restart the service after changing this value.
</div>
może zostać pominął, chyba że renderowanie surowego HTML jest włączone lub treść jest zaimplementowana za pomocą shortcode lub hook renderowania.
Dla kontrolowanego bloga technicznego włączenie surowego HTML może być uzasadnione. Nadal czyni to źródło mniej przenośnym i powinno być to świadoma decyzja na poziomie strony.
Mermaid w Hugo
Blok z ogranicznikami mermaid jest nadal zwykłym blokiem kodu, dopóki motyw Hugo, hook renderowania, shortcode lub potok JavaScript nie przekształci go w diagram.
GitHub i Hugo mogą więc akceptować identyczne źródło Mermaid, używając całkowicie różnych mechanizmów renderowania.
Jaka składnia działa w Pandoc?
Pandoc może czytać kilka dialektów Markdown jawne:
pandoc --from=markdown input.md
pandoc --from=commonmark input.md
pandoc --from=gfm input.md
pandoc --from=commonmark_x input.md
To jedna z najbardziej użytecznych funkcji przenośności Pandoc. Operator może powiedzieć Pandocowi, jaki dialekt stosuje źródło, zamiast polegać na niewyraźnym rozszerzeniu pliku .md.
Pandoc pozwala również włączać lub wyłączać poszczególne rozszerzenia:
pandoc \
--from=markdown-footnotes-pipe_tables \
input.md \
-o output.html
Albo zacząć od węższego formatu i dodać jedną funkcję:
pandoc \
--from=commonmark+footnotes \
input.md \
-o output.html
Można sprawdzić dostępne rozszerzenia za pomocą:
pandoc --list-extensions=markdown
pandoc --list-extensions=commonmark
pandoc --list-extensions=gfm
Ten model rozszerzeń jest potężny, ale oznacza to, że „Pandoc Markdown” nie zawsze jest jedną stałą konfiguracją. Polecenia budowania i pliki domyślnych ustawień są częścią specyfikacji dokumentu.
Jaka składnia działa w Obsidian?
Obsidian przechowuje notatki jako pliki Markdown, ale jego model tworzenia zawiera kilka funkcji specyficznych dla aplikacji.
Wspólnie przykłady obejmują:
- Linki Wiki
- Osadzone notatki
- Osadzone pliki
- Callouts
- Odwołania do bloków
- Tagi
- Właściwości (Properties)
- Wyróżnienia (Highlighting)
- Komentarze
- Zapytania Dataview z wtyczek
- Linki URI specyficzne dla aplikacji
Link Wiki, taki jak:
[[Markdown Compatibility]]
ma sens wewnątrz skarbca Obsidian. GitHub, CommonMark i domyślny odczytywacz Pandoc zwykle wyświetlają go jako dosłowny tekst w nawiasach kwadratowych.
Osadzanie jest jeszcze bardziej specyficzne dla aplikacji:
![[compatibility-table]]
Odwołana treść nie jest obecna w samym pliku. Eksportowanie lub publikowanie notatki wymaga więc etapu rozszerzania, który rozwiązuje osadzenie.
Obsidian jest dobrym przykładem dlaczego przechowywanie w plikach .md nie gwarantuje przenośności Markdown. Dla praktycznego spojrzenia na Obsidian jako narzędzie do zarządzania wiedzą, zobacz Obsidian do osobistego zarządzania wiedzą.
Jaka składnia działa w GitLab?
GitLab Flavored Markdown używa CommonMark jako jądra i zawiera funkcje GFM, takie jak tabele i listy zadań. Następnie dodaje zachowania specyficzne dla GitLab, w tym odwołania krzyżowe, notację matematyczną, diagramy i inne funkcje współpracy.
README napisany w konserwatywnym GFM zazwyczaj przenosi się między GitHub a GitLab bez większych uszkodzeń.
Integracje platformowe nie przenoszą się tak niezawodnie. Odwołania do zgłoszeń, wspomnienia użytkowników, diagramy, obsługa matematyki i specjalna składnia bloków mogą zachowywać się inaczej, nawet gdy podstawowy Markdown pozostaje czytelny.
Macierz wsparcia platformowego
Ta macierz opisuje typowe zachowanie domyślne. Motywy, wtyczki, rozszerzenia i konfiguracja mogą zmieniać pojedyncze komórki.
| Funkcja | GitHub | Hugo Goldmark | Pandoc | Obsidian | GitLab |
|---|---|---|---|---|---|
| Jądro CommonMark | Tak | Tak | Tak | Większość | Tak |
| Tabele z użyciem pipe | Tak | Tak | Tak | Tak | Tak |
| Listy zadań | Tak | Tak | Tak | Tak | Tak |
| Przekreślenie | Tak | Tak | Tak | Tak | Tak |
| Przypisy dolne | Tak | Konfigurowalne | Tak | Tak | Tak |
| Metadane YAML | Zależne od kontekstu | Front matter | Tak | Properties | Zależne od kontekstu |
| Matematyka | Tak | Wymaga konfiguracji | Tak | Tak | Tak |
| Mermaid | Tak | Wymaga konfiguracji | Zależne od wyjścia | Tak | Tak |
| Cytowania | Brak natywnej bibliografii | Wymaga narzędzi | Tak | Zależne od wtyczki | Brak natywnej bibliografii |
| Listy definicyjne | Nie | Konfigurowalne | Tak | Ograniczone | Ograniczone |
| Atrybuty nagłówków | Ograniczone | Zależne od renderera | Tak | Ograniczone | Ograniczone |
| Linki Wiki | Nie | Nie domyślnie | Nie domyślnie | Tak | Zależne od Wiki |
| Callouts lub alerty | Składnia GitHub | Motyw lub shortcode | Zależne od szablonu | Składnia Obsidian | Składnia GitLab |
| Surowy HTML | Oczyszczony lub ograniczony | Wyłączony domyślnie | Tak | Zależne od kontekstu | Oczyszczony lub ograniczony |
„Tak” nadal nie gwarantuje identycznego HTML ani wizualnej prezentacji. Oznacza to, że środowisko rozpoznaje ogólną funkcję.
Składnia, która jest zwykle bezpieczna wszędzie
Najbezpieczniejszy przenośny podzbiór obejmuje:
- Nagłówki ATX używające
# - Zwykłe akapity
- Puste linie między blokami
-dla list nieuporządkowanych1.dla list uporządkowanych- Bloki kodu z ogranicznikami używające backticks
- Kod inline używający backticks
- Wyróżnienie używające
*text* - Mocne wyróżnienie używające
**text** - Zwykłe linki
- Zwykłe obrazy
- Cytaty blokowe
- Linie tematyczne (separatora)
- Jawne automatyczne linki w nawiasach kwadratowych
Celowo konserwatywny dokument mógłby wyglądać tak:
# Deployment Guide
This guide explains how to deploy the service.
## Requirements
- Docker
- Linux
- A supported GPU
## Configuration
Create a file named `compose.yaml`.
```yaml
services:
application:
image: example/application:1.0
```
For more information, see the [configuration reference](config.md).
> Back up existing data before upgrading.
Ta składnia dobrze się przenosi, ponieważ nie zależy od tabel, przypisów dolnych, atrybutów, calloutów ani przetwarzania platformowego.
Składnia, która często się psuje
Problemy z przenośnością mają tendencję do skupiania się wokół małej liczby funkcji.
Tabele z użyciem pipe
Tabele z użyciem pipe są dobrze wspierane przez narzędzia orientowane na GFM, ale nie przez ściśle CommonMark.
Tabela może degradować się w nieczytelny tekst, gdy zostanie przetransportowana przez parser, który jej nie rozpoznaje. Dla bardzo przenośnych dokumentów, rozważ krótkie listy lub semantyczny HTML generowany podczas etapu budowania.
Przypisy dolne
Składnia przypisów dolnych stała się powszechna, ale nadal jest to rozszerzenie.
Różne narzędzia mogą:
- Wspierać tylko jeden format przypisów
- Umieszczać przypisy w różnych miejscach
- Generować różne identyfikatory
- Odrzucać przypisy z wielu akapitów
- Renderować źródło dosłownie
Używaj przypisów dolnych, gdy znany jest potok wydawniczy. Unikaj polegania na nich w plikach README, które muszą się renderować na dowolnych systemach.
ID i atrybuty nagłówków
Ta składnia Pandoc nie jest przenośna:
## Installation {#installation .procedure}
Używaj zwykłego nagłówka i pozwól rendererowi wygenerować własną kotwicę, gdy przenośność ma znaczenie.
Unikaj również twardego kodowania linków do automatycznie generowanych ID nagłówków, chyba że każdy cel używa tych samych zasad slugifikacji.
Callouts i alerty
GitHub, Obsidian, GitLab, MkDocs, Docusaurus i motywy Hugo mogą wspierać bloki podobne do calloutów, ale często używają różnych składni.
Przenośnym fallbackiem jest zwykły cytat blokowy:
> Warning: Back up the database before upgrading.
Jest on mniej wizualnie imponujący, ale zachowuje znaczenie wszędzie.
Linki Wiki
Linki Wiki są zwięzłe wewnątrz narzędzi do zarządzania wiedzą:
[[KV Cache]]
Są to słaba składnia wymiany, ponieważ ścieżka docelowa, nazwa pliku, zasady nagłówków i zachowanie rozszerzania należą do aplikacji.
Używaj standardowych linków Markdown w treści przeznaczonej do publikacji:
[KV cache](kv-cache.md)
Surowy HTML
Surowy HTML to zwykły hak awaryjny, gdy Markdown nie może wyrazić układu. Jest to również częsta awaria przenośności i bezpieczeństwa.
Renderer może:
- Usunąć HTML
- Uciec przed nim (escape)
- Oczyszczać wybrane elementy
- Zezwalać na bloki, ale nie na elementy inline
- Odmawiać parsowania Markdown wewnątrz HTML
- Przypuszczać go bez zmian tylko w trybie zaufanym
Używaj surowego HTML tylko wtedy, gdy docelowy cel publikacji jest kontrolowany.
Notacja matematyczna
Matematyka ograniczona dolarami jest popularna, ale nie jest uniwersalnie interpretowana.
Źródło:
The complexity is $O(n^2)$.
może stać się:
- Zrenderowaną matematyką
- Zwykłym tekstem z znakami dolarów
- Nieprawidłowym wyróżnieniem
- Wejściem do innego parsera matematycznego
Wybierz jeden potok matematyczny i przetestuj go w każdym docelowym środowisku.
Mermaid i inne bloki diagramów
Ogranicznik kodu Mermaid jest syntaktycznie bezpieczny, ponieważ niespierane renderery zwykle wyświetlają go jako kod.
Wynik semantyczny jest nadal inny. Czytelnicy mogą zobaczyć zrenderowany diagram architektury w GitHub i surowe źródło Mermaid w innym środowisku.
To jest grzeczna degradacja, a nie prawdziwa kompatybilność.
Trzy warstwy kompatybilności Markdown
Pomaga rozdzielić kompatybilność na trzy warstwy.
Warstwa 1: Kompatybilność parsowania
Czy parser rozpoznaje strukturę?
Przykłady obejmują nagłówki, tabele, przypisy dolne i podzielone bloki.
Warstwa 2: Kompatybilność transformacji
Czy platforma stosuje dodatkowe przetwarzanie?
Przykłady obejmują:
- Renderowanie Mermaid
- Rozwiązywanie cytowań
- Rozszerzanie linków Wiki
- Łączenie numerów zgłoszeń
- Przetwarzanie shortcode
- Generowanie spisu treści
Warstwa 3: Kompatybilność prezentacji
Czy wynik wygląda i zachowuje się odpowiednio?
Przykłady obejmują:
- Stylowanie tabel
- Podświetlanie składni
- Kolory alertów
- Kotwice nagłówków
- Responsywne obrazy
- Umiejscowienie przypisów dolnych
- Czcionki matematyczne
Dwie platformy mogą parsować identyczną składnię, tworząc zasadniczo różną prezentację.
Lepszy model przenośności
Zamiast pytać, czy plik jest „poprawnym Markdown”, zadaj cztery węższe pytania:
- W jakim dialekcie napisane jest źródło?
- Który parser je czyta?
- Jakie rozszerzenia są włączone?
- Jakie transformacje platformy wykonują się następnie?
Na przykład:
Dialect: CommonMark plus GFM tables
Parser: Goldmark
Extensions: tables, strikethrough, task lists, footnotes
Platform: Hugo
Additional processing: render hooks and Mermaid JavaScript
Ten opis jest znacznie bardziej użyteczny niż mówienie, że „strona używa Markdown”.
Wybór dialektu według przypadku użycia
Pliki README
Używaj GFM.
Pliki README korzystają z:
- Tabel
- List zadań
- Kodu z ogranicznikami
- Automatycznych linków
- Przekreślenia
- Odwołań GitHub
Unikaj nadmiernego polegania na funkcjach tylko GitHuba, gdy repozytorium jest lustrzane na GitLab, renderowane w rejestrze pakietów lub włączone w generowaną dokumentację.
Artykuły techniczne w Hugo
Używaj Markdown zgodnego z CommonMark z udokumentowanym zestawem rozszerzeń Goldmark.
Tabele, kody z ogranicznikami, przypisy dolne i Mermaid mogą być rozsądne, ponieważ kontrolujesz potok budowania. Preferuj shortcode Hugo lub hook renderowania nad osadzaniem dużych ilości surowego HTML.
Utrzymuj składnię specyficzną dla Hugo zizolowaną i łatwo znajdowalną.
Dokumenty akademickie
Używaj Pandoc Markdown.
Cytowania, przetwarzanie bibliografii, przypisy dolne, metadane, notacja matematyczna, odwołania krzyżowe i konwersja do PDF lub DOCX uzasadniają zredukowaną przenośność.
Przechowuj polecenie Pandoc, plik domyślnych ustawień, filtry, bibliografię i szablony obok źródła. Sam plik źródłowy nie w pełni opisuje budowania.
Książki i dokumentacja długiego formatu
Pandoc Markdown jest zazwyczaj najsilniejszą z trzech opcji, gdy wiele formatów wyjściowych ma znaczenie.
Listy definicyjne, cytowania, atrybuty, metadane i strukturalne transformacje stają się ważniejsze, gdy złożoność dokumentu rośnie.
Dla dokumentacji tylko internetowej hostowanej w repozytorium Git, GFM lub generator dokumentacji oparty na CommonMark może pozostać prostszy.
Notatki i osobiste bazy wiedzy
Używaj natywnej składni wybranej aplikacji do notatek, gdy funkcje aplikacji zapewniają realną wartość.
Linki Wiki, osadzenia i callouts Obsidian są użyteczne wewnątrz skarbca. Traktuj eksport jako proces kompilacji, a nie zakładaj, że surowe pliki są już przenośnymi publikacjami.
Wspólna dokumentacja w nieznanym systemach
Używaj konserwatywnego podzbioru CommonMark.
Unikaj:
- Linków Wiki
- Alertów platformowych
- Atrybutów nagłówków
- Cytowań
- Surowego HTML
- Niestandardowych kontenerów
- Osadzeń aplikacji
- Shortcode
Przenośność zazwyczaj wymaga rezygnacji z funkcji wygodnych.
Praktyczne zasady dla przenośnego Markdown
Zacznij od struktury CommonMark
Używaj CommonMark dla szkieletu dokumentu:
- Nagłówki
- Akapity
- Listy
- Linki
- Obrazy
- Cytaty blokowe
- Bloki kodu
Zapewnia to, że główne znaczenie przetrwa nawet, gdy opcjonalne rozszerzenia zawiodą.
Dodawaj funkcje GFM świadomie
Tabele i listy zadań są rozsądne, gdy wszystkie ważne cele je wspierają.
Nie zakładaj, że „większość narzędzi wspiera GFM” bez testowania dokładnego celu. Niektóre twierdzą zgodność z GFM, włączając tylko wybrane rozszerzenia.
Izoluj rozszerzenia platformowe
Utrzymuj składnię specyficzną dla platformy w wyraźnie identyfikowalnych blokach.
Na przykład, scentralizuj shortcode Hugo, cytowania Pandoc lub osadzenia Obsidian, zamiast rozrzucać je przez każdy akapit.
Izolacja ułatwia późniejszą konwersję.
Preferuj grzeczną degradację
Blok Mermaid degraduje się w czytelny kod źródłowy. Alert GitHub degradował się w cytat blokowy.
Osadzenie Wiki może degradować się w niejasną nazwę pliku, a podzielony blok Pandoc może ujawnić interpunkcję wokół treści.
Wybieraj rozszerzenia, których fallback pozostaje zrozumiały.
Nie polegaj na automatycznie generowanych ID nagłówków
Algorytmy kotwic nagłówków różnią się między GitHub, Hugo, Pandoc i generatorami dokumentacji.
Dla linków między dokumentami, używaj jawnych ID wspieranych przez renderera tylko wtedy, gdy docelowy potok jest kontrolowany. W przeciwnym razie linkuj do dokumentu, a nie do wygenerowanego fragmentu.
Przechowuj konfigurację budowania z treścią
Rozszerzenia Pandoc, ustawienia Hugo, wtyczki, filtry i integracje JavaScript określają, jak Markdown się zachowuje.
Committyj powiązane pliki konfiguracyjne ze źródłem:
content/
article.md
pandoc.yaml
references.bib
config/
_default/
markup.yaml
layouts/
_default/
_markup/
Samo rozszerzenie .md nie przechwytuje środowiska wydawniczego. Dla strukturalnego podejścia do dokumentowania tych decyzji, zobacz Rekordy decyzyjne w rozwoju napędzanym przez AI.
Testuj Markdown przeciwko każdemu ważnemu celowi
Wizualny podgląd w jednym edytorze to za mało. Edytor może wspierać bogatszy dialekt niż renderer produkcyjny.
Dla Pandoc, testuj jawne formaty wejściowe:
pandoc --from=commonmark article.md -o commonmark.html
pandoc --from=gfm article.md -o gfm.html
pandoc --from=markdown article.md -o pandoc.html
Ostrzeżenia i widoczna interpunkcja źródłowa ujawniają, które funkcje są specyficzne dla dialektu.
Dla Hugo, zbuduj stronę produkcyjną:
hugo --gc --minify
Następnie sprawdzaj wygenerowany HTML, zamiast polegać tylko na podglądzie w edytorze.
Dla repozytoriów, wyświetlaj commitowany plik na faktycznej platformie hostingowej. Lokalne rozszerzenia Markdown w VS Code mogą nie pasować do GitHub lub GitLab.
Rozwiązywanie typowych niezgodności renderowania
Gdy plik, który działał na jednej platformie, psuje się na innej, awaria zwykle należy do jednej z kilku powtarzalnych wzorców. Tabela poniżej wymienia symptom tak, jakbyś go faktycznie widział, najbardziej prawdopodobną przyczynę oraz konkretne polecenie lub sprawdzenie do potwierdzenia i naprawy.
| Symptom | Prawdopodobna przyczyna | Potwierdź i napraw |
|---|---|---|
Tabela pipe renderuje się jako jeden długi akapit z widocznymi znakami | |
Renderer jest ściśle CommonMark bez rozszerzenia tabel | Uruchom pandoc --from=commonmark file.md -o test.html i sprawdź wynik; albo włącz rozszerzenie tabel, albo eksportuj z --from=gfm |
[^note] pozostaje inline jako dosłowny tekst, zamiast stać się znacznikiem przypisu dolnego |
Rozszerzenie przypisów Goldmark nie jest włączone | W Hugo, sprawdź footnote pod markup.goldmark.extensions w hugo.yaml, przebuduj z hugo --gc --minify i szukaj <sup> w wygenerowanym HTML |
Ogranicznik ```mermaid pokazuje się jako zwykły szary kod źródłowy zamiast diagramu |
Platforma nie wykonuje przetwarzania poetycznego na bloku z ogranicznikami | GitHub renderuje go natywnie; Hugo wymaga hook renderowania, shortcode lub potoku JS — sprawdź zbudowany HTML dla <pre><code class="language-mermaid"> w porównaniu z <svg> |
## Heading {#id} pokazuje dosłowne klamki w zrenderowanym tekście nagłówka |
Składnia atrybutów nagłówka jest specyficzna dla Pandoc, a nie CommonMark lub GFM | Usuń składnię atrybutów dla przenośnego wyjścia, lub przeconwertuj wcześniej z pandoc --from=markdown --to=gfm file.md -o out.md |
[[Note Name]] wyświetla się jako dosłowne podwójne nawiasy kwadratowe |
Składnia linków Wiki jest specyficzna dla aplikacji, takich jak Obsidian | Zamień na standardowy link Markdown, [Note Name](note-name.md), przed eksportem poza skarbca |
[@kwon2023pagedattention] pozostaje jako zwykły tekst w nawiasach kwadratowych zamiast sformatowanego cytowania |
Nie zastosowano bibliografii ani przejścia citeproc | Uruchom ponownie z pandoc --citeproc --bibliography=refs.bib input.md -o output.pdf i potwierdź, że styl CSL jest określony |
> [!WARNING] renderuje się jako zwykły cytatowany akapit zamiast stylowanego alertu |
Stylowanie alertu to funkcja platformy GitHub.com, a nie część formalnego GFM | Oczekiwane poza GitHub; utrzymuj treść czytelną jako zwykły cytat blokowy, zamiast polegać na stylowaniu koloru |
To jest najszybsza pierwsza analiza przed zakładaniem „błędu” Markdown — większość tych niezgodności to brakujące rozszerzenie lub funkcja tylko platformowa, a nie zepsuta składnia. Dla problemów specyficznych dla bloków kodu, takich jak brakujące podświetlanie składni lub niespierane identyfikatory języka, zobacz dedykowany przewodnik o blokach kodu Markdown.
Lintuj przenośny podzbiór
Linter Markdown nie może gwarantować kompatybilności renderera, ale może usunąć unikane niejednoznaczności.
Użyteczne zasady obejmują:
- Używaj spójnych stylów nagłówków
- Dodawaj puste linie wokół list i bloków kodu
- Używaj kodu z ogranicznikami zamiast wciętym
- Określaj języki ograniczników kodu
- Unikaj pomijanych poziomów nagłówków
- Używaj spójnych znaczników list
- Unikaj niejednoznacznego wyróżnienia wokół interpunkcji
- Utrzymuj spójne zakończenia linii
- Waliduj linki i obrazy
Dla publikacji wielocelowej, dodaj test budowania dla każdego ważnego renderera, zamiast polegać tylko na lintingu składni.
Konwersja między dialektami za pomocą Pandoc
Pandoc może normalizować dokumenty z jednego dialektu na inny:
pandoc \
--from=markdown \
--to=gfm \
article.md \
-o article-gfm.md
Albo konwertować GFM na Pandoc Markdown:
pandoc \
--from=gfm \
--to=markdown \
README.md \
-o document.md
To jest użyteczne, ale konwersja nie jest gwarantowana do zachowania każdej funkcji.
Potencjalne straty obejmują:
- Odwołania specyficzne dla platformy
- Stylowanie calloutów
- Złożone tabele
- Osadzone obiekty aplikacji
- Niestandardowe atrybuty
- Zachowanie surowego HTML
- Składnia wtyczek
- Renderowanie diagramów
- Dokładne spacje i formatowanie
Pandoc zachowuje strukturę dokumentu lepiej niż oryginalne formatowanie źródła. Traktuj konwersję jako etap budowania, a nie odwracalny formatownik tekstu.
Rekomendowana strategia dla stron Hugo
Dla technicznego bloga Hugo, najpraktyczniejsza polityka to:
- Używaj CommonMark dla rdzenia prozy i struktury.
- Włącz mały udokumentowany zestaw rozszerzeń Goldmark.
- Używaj tabel i list zadań w stylu GFM, gdzie poprawiają czytelność.
- Implementuj Mermaid przez jeden spójny hook renderowania lub shortcode.
- Obsługuj matematykę przez jeden udokumentowany potok KaTeX lub MathJax.
- Używaj front matter Hugo tylko na początku plików treści.
- Preferuj hook renderowania i shortcode nad surowym HTML.
- Utrzymuj linki źródłowe jako standardowe linki Markdown, gdzie to możliwe.
- Testuj migrowane lub zewnętrzne źródła dokumentów przez Hugo.
- Dokumentuj każdą składnię, która nie renderuje się poprawnie w GitHub.
To podejście akceptuje, że treść Hugo nie jest uniwersalnie przenośna, zachowując przy tym widoczną granicę przenośności.
Najgorszym podejściem jest przypadkowe mieszanie dialektów: alerty GitHub, osadzenia Obsidian, atrybuty Pandoc i shortcode Hugo umieszczone w tym samym dokumencie bez zdefiniowanego potoku budowania.
Tabela decyzyjna
| Przypadek użycia | Rekomendowana składnia | Powód |
|---|---|---|
| Przenośny dokument tekstowy | CommonMark | Najmniejsza niezawodna baza |
| README GitHub | GFM | Tabele, zadania i przepływy repozytorium |
| Szablon zgłoszenia GitHub | GFM plus funkcje GitHub | Platforma jest docelowym celem |
| Artykuł w blogu Hugo | CommonMark plus skonfigurowane rozszerzenia Goldmark | Kontrolowany potok wydawniczy |
| Praca akademicka | Pandoc Markdown | Cytowania, matematyka, metadane, wyjście PDF |
| Książka wieloformatowa | Pandoc Markdown | Strukturalna konwersja na wiele wyjść |
| Skarbca Obsidian | Obsidian Markdown | Odwołania zwrotne, osadzenia i przepływy wiedzy |
| Lustrzane GitHub i GitLab | Konserwatywny GFM | Silny wspólny zestaw funkcji |
| Nierozpoznany renderer | Podzbiór CommonMark | Najniższe ryzyko kompatybilności |
Wniosek
CommonMark, GitHub Flavored Markdown i Pandoc Markdown to nie konkurujące wersje tego samego produktu. Rozwiązują różne problemy.
CommonMark zapewnia niezawodną podstawę parsowania. GFM dodaje praktyczne funkcje do współpracy w oprogramowaniu, a Pandoc Markdown zmienia Markdown w bogaty język źródłowy do wydawania i konwersji.
Najbezpieczniejsza zasada jest prosta: pisz w najmniejszym dialekcie, który spełnia rzeczywisty cel. Używaj CommonMark, gdy treść musi podróżować, GFM, gdy kolaboracja w stylu GitHub jest celem, a Pandoc Markdown, gdy struktura dokumentu i formaty wyjściowe są ważniejsze niż uniwersalne renderowanie.
Przenośność Markdown nie jest osiągnięta przez unikanie każdego rozszerzenia. Jest osiągnięta przez wiedzę, które rozszerzenia są częścią kontraktu źródłowego i testowanie ich w każdym renderze, który ma znaczenie.