Работа с Markdown в Go (Golang): библиотеки, парсинг и конвертация

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

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

Начать курс

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

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