Работа с Markdown в Go (Golang): обзор популярных библиотек
Go (Golang) — это современный компилируемый язык, который часто выбирают для создания высокопроизводительных веб-приложений, CLI-утилит и инструментов для генерации статических сайтов. Одна из типичных задач — обработка Markdown-разметки. В этой статье мы рассмотрим три ключевые библиотеки: blackfriday, goldmark и chroma, а также покажем, как объединить их для создания полноценного конвертера Markdown в HTML с подсветкой синтаксиса.
1. Зачем обрабатывать Markdown в Go?
Markdown — это лёгкий язык разметки, широко используемый в документации, блогах, README-файлах и системах управления контентом. В экосистеме Go существует несколько зрелых библиотек, которые позволяют:
- Конвертировать Markdown в HTML для веб-публикации.
- Добавлять подсветку синтаксиса для блоков кода.
- Создавать собственные расширения (например, поддержка LaTeX, диаграмм или кастомных блоков).
- Интегрироваться в генераторы статических сайтов (Hugo, собственные решения).
2. Библиотека blackfriday (v2)
Blackfriday — одна из старейших и наиболее популярных библиотек для Go. Она отличается высокой скоростью работы и близким к стандарту CommonMark поведением. Установка:
go get github.com/russross/blackfriday/v2
Простой пример использования:
package main
import (
"fmt"
"github.com/russross/blackfriday/v2"
)
func main() {
input := []byte("## Привет, Markdown!\n\nЭто **жирный текст** и `код`.")
output := blackfriday.Run(input)
fmt.Println(string(output))
}
Результат — HTML-код с заголовком h2, параграфом и тегами strong/code. Blackfriday поддерживает расширения: таблицы, зачёркивание, задачи (task lists) и автоссылки. Для активации используйте:
html := blackfriday.Run(input,
blackfriday.WithNoExtensions(),
blackfriday.WithExtensions(blackfriday.CommonExtensions),
)
3. Библиотека goldmark (рекомендуемая)
Goldmark — современный парсер Markdown, написанный на чистом Go. Он полностью соответствует спецификации CommonMark 0.30 и предоставляет гибкий API для расширений. Установка:
go get github.com/yuin/goldmark
Базовый пример:
package main
import (
"bytes"
"fmt"
"github.com/yuin/goldmark"
)
func main() {
source := []byte("# Заголовок\n\nОбычный текст с **жирным** и *курсивом*.")
var buf bytes.Buffer
if err := goldmark.Convert(source, &buf); err != nil {
panic(err)
}
fmt.Println(buf.String())
}
Goldmark легко расширяется. Встроенные расширения включают таблицы, списки задач, сноски, автоссылки и подсветку кода через chroma. Пример с расширением таблиц:
import (
"github.com/yuin/goldmark"
"github.com/yuin/goldmark/extension"
)
markdown := goldmark.New(
goldmark.WithExtensions(extension.Table),
)
4. Подсветка кода с chroma
Chroma — это библиотека для подсветки синтаксиса на Go, которая поддерживает более 190 языков программирования и множество тем оформления. Установка:
go get github.com/alecthomas/chroma/v2
Интеграция с goldmark выглядит так:
package main
import (
"bytes"
"fmt"
"github.com/alecthomas/chroma/v2/quick"
"github.com/yuin/goldmark"
highlighting "github.com/yuin/goldmark-highlighting/v2"
)
func main() {
source := []byte("```go\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n fmt.Println(\"Hello, world!\")\n}\n```")
markdown := goldmark.New(
goldmark.WithExtensions(
highlighting.Highlighting,
),
)
var buf bytes.Buffer
if err := markdown.Convert(source, &buf); err != nil {
panic(err)
}
fmt.Println(buf.String())
}
Результат — блок <pre><code> с классами, которые можно стилизовать через CSS. Chroma также позволяет генерировать готовые стили:
quick.Highlight(os.Stdout, "fmt.Println(\"test\")", "go", "html", "monokai")
5. Сравнение blackfriday vs goldmark
- Скорость
Также в библиотеке
regex для Rust: полное руководство с примерами
Sharp для JavaScript (Node.js): полное руководство с примерами
CLI фреймворки для Rust: обзор лучших инструментов для создания утилит командной строки
Очереди задач для C++: реализация и использование
Планировщик задач на C# (.NET): Quartz.NET, Hangfire, Coravel