No description
- Go 100%
| docs | ||
| frontmatter.go | ||
| frontmatter_test.go | ||
| go.mod | ||
| LICENSE | ||
| README.md | ||
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.