Работа с Markdown в Go: библиотеки blackfriday, goldmark и chroma

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с 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

  • Скорость

Рекомендаций