Работа с Markdown в Go (Golang): от парсинга до кастомизации
Markdown — один из самых популярных языков разметки для документации, блогов и образовательных материалов. В экосистеме Go (Golang) существует несколько мощных библиотек, позволяющих парсить Markdown, конвертировать его в HTML и даже добавлять подсветку синтаксиса. В этой статье мы разберём ключевые инструменты: goldmark, blackfriday и chroma, а также покажем, как интегрировать их в реальные проекты.
Зачем нужна работа с Markdown в Go?
Go — язык, который часто выбирают для создания веб-серверов, API и статических генераторов сайтов. Markdown идеально подходит для хранения контента, так как он:
- Читаем в сыром виде (даже без рендеринга);
- Лёгок для редактирования;
- Поддерживает встраивание кода, таблиц и изображений.
Библиотеки Go позволяют на лету преобразовывать Markdown в безопасный HTML-код, что критично для образовательных платформ (например, pythonlib.ru).
1. goldmark — современный и расширяемый парсер
goldmark — это эталонная библиотека для работы с Markdown в Go. Она поддерживает CommonMark 0.30, GFM (GitHub Flavored Markdown) и легко расширяется через плагины.
Установка:
go get github.com/yuin/goldmark
Базовый пример преобразования Markdown в HTML:
package main
import (
"bytes"
"fmt"
"github.com/yuin/goldmark"
)
func main() {
source := []byte("# Привет, Go!\n\nЭто **жирный** текст и `код`.")
var buf bytes.Buffer
if err := goldmark.Convert(source, &buf); err != nil {
panic(err)
}
fmt.Println(buf.String())
}
Вывод:
<h1>Привет, Go!</h1>
<p>Это <strong>жирный</strong> текст и <code>код</code>.</p>
Расширения goldmark:
goldmark-meta— парсинг YAML-метаданных (заголовки статей);goldmark-highlighting— подсветка кода через Chroma;goldmark-pdf— экспорт в PDF (экспериментально).
Пример с использованием расширения для таблиц (GFM):
import (
"github.com/yuin/goldmark"
"github.com/yuin/goldmark/extension"
)
func main() {
md := goldmark.New(
goldmark.WithExtensions(extension.GFM),
)
// ... конвертация
}
2. blackfriday — проверенный временем парсер
blackfriday — одна из первых библиотек для Markdown в Go. Несмотря на то, что goldmark считается более современной, blackfriday до сих пор используется в многих проектах (например, Hugo).
Установка:
go get github.com/russross/blackfriday/v2
Пример использования:
package main
import (
"fmt"
"github.com/russross/blackfriday/v2"
)
func main() {
input := []byte("## Заголовок\n\nСписок:\n- элемент 1\n- элемент 2")
output := blackfriday.Run(input)
fmt.Println(string(output))
}
Особенности blackfriday:
- Поддержка сносок, определений, зачёркивания;
- Встроенные флаги для настройки HTML-рендеринга;
- Меньше зависимостей, чем у goldmark.
3. Подсветка кода с Chroma
Для образовательных сайтов критически важна подсветка синтаксиса. Chroma — это универсальный синтаксический анализатор, который интегрируется с goldmark и blackfriday.
Установка:
go get github.com/alecthomas/chroma/v2
Интеграция с goldmark через goldmark-highlighting:
import (
"github.com/yuin/goldmark"
highlighting "github.com/yuin/goldmark-highlighting/v2"
)
func main() {
md := goldmark.New(
goldmark.WithExtensions(
highlighting.NewHighlighting(
highlighting.WithStyle("monokai"),
),
),
)
// ... конвертация
}
Теперь любой блок кода в Markdown (```go ... ```) будет подсвечен с использованием темы Monokai.