No description
Find a file
2026-05-13 13:59:04 +03:00
docs Использование через структуру 2026-05-13 13:26:02 +03:00
frontmatter.go BOM-игнорирование 2026-05-13 13:59:04 +03:00
frontmatter_test.go BOM-игнорирование 2026-05-13 13:59:04 +03:00
go.mod first commit 2026-05-13 10:59:35 +03:00
LICENSE first commit 2026-05-13 10:59:35 +03:00
README.md Использование через структуру 2026-05-13 13:26:02 +03:00

go-frontmatter

Простая Go-библиотека для парсинга и создания frontmatter-документов.

Установка

go get git.ymnuktech.ru/ymnuk/go-frontmatter

Использование

Парсинг

package main

import (
	"fmt"
	"git.ymnuktech.ru/ymnuk/go-frontmatter"
)

func main() {
	data := []byte(`---
title: My Document
author: John Doe
date: 2024-01-15
---

# Hello World

This is the content of my document.`)

	metadata, body, err := frontmatter.Parse(data)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Println("Metadata:", string(metadata))
	fmt.Println("Body:", string(body))
}

Создание документа

package main

import (
	"fmt"
	"git.ymnuktech.ru/ymnuk/go-frontmatter"
)

func main() {
	metadata := []byte(`title: My Document
author: John Doe
date: 2024-01-15`)

	body := []byte(`# Hello World

This is the content of my document.`)

	data, err := frontmatter.Create(metadata, body)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Println(string(data))
}

Использование с JSON

package main

import (
	"encoding/json"
	"fmt"
	"git.ymnuktech.ru/ymnuk/go-frontmatter"
)

func main() {
	data := []byte(`---
{"title": "My Document", "author": "John Doe"}
---

# Hello World`)

	var meta map[string]interface{}
	metadata, body, err := frontmatter.ParseWith(data, json.Unmarshal)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	if m, ok := metadata.(map[string]interface{}); ok {
		fmt.Println("Title:", m["title"])
		fmt.Println("Author:", m["author"])
	}

	fmt.Println("Body:", string(body))
}

Кастомный разделитель (глобальный)

package main

import (
	"fmt"
	"git.ymnuktech.ru/ymnuk/go-frontmatter"
)

func main() {
	// Установка кастомного разделителя
	frontmatter.SetSeparator("+++")

	data := []byte(`+++
title: My Document
+++

# Content`)

	metadata, body, err := frontmatter.Parse(data)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Println("Metadata:", string(metadata))
	fmt.Println("Body:", string(body))

	// Возврат к разделителю по умолчанию
	frontmatter.SetSeparator("---")
}

Использование структуры Parser

Для независимых парсеров с разными разделителями:

package main

import (
	"fmt"
	"git.ymnuktech.ru/ymnuk/go-frontmatter"
)

func main() {
	// Создаём независимые парсеры
	p1 := frontmatter.New()
	p2 := frontmatter.New()

	p1.SetSeparator("---")
	p2.SetSeparator("+++")

	// Каждый парсер работает со своим разделителем
	data1 := []byte("---\ntitle: Doc1\n---\n# Content1")
	data2 := []byte("+++\ntitle: Doc2\n+++\n# Content2")

	m1, _, _ := p1.Parse(data1)
	m2, _, _ := p2.Parse(data2)

	fmt.Println(string(m1)) // "title: Doc1"
	fmt.Println(string(m2)) // "title: Doc2"
}

API

Структура Parser

  • New() *Parser — создание нового парсера с разделителем по умолчанию

Методы Parser

  • (p *Parser) Parse(data []byte) (metadata []byte, body []byte, err error) — базовый парсинг
  • (p *Parser) ParseWith(data []byte, unmarshal func([]byte, interface{}) error) (metadata interface{}, body []byte, err error) — парсинг с callback десериализации
  • (p *Parser) Create(metadata []byte, body []byte) (data []byte, err error) — создание документа
  • (p *Parser) CreateWith(metadata interface{}, body []byte, marshal func(interface{}) ([]byte, error)) (data []byte, err error) — создание с callback сериализации
  • (p *Parser) SetSeparator(sep string) error — установка разделителя
  • (p *Parser) GetSeparator() string — получение текущего разделителя

Глобальные функции (обратная совместимость)

  • Parse(data []byte) (metadata []byte, body []byte, err error) — базовый парсинг
  • ParseWith(data []byte, unmarshal func([]byte, interface{}) error) (metadata interface{}, body []byte, err error) — парсинг с callback десериализации
  • Create(metadata []byte, body []byte) (data []byte, err error) — создание документа
  • CreateWith(metadata interface{}, body []byte, marshal func(interface{}) ([]byte, error)) (data []byte, err error) — создание с callback сериализации
  • SetSeparator(sep string) error — установка глобального разделителя
  • GetSeparator() string — получение глобального разделителя

Ошибки

  • ErrMissingDelimiter — отсутствует закрывающий разделитель

Лицензия

MIT License — см. файл LICENSE.