mark/meta.go
2019-04-08 22:12:00 +03:00

93 lines
1.5 KiB
Go

package main
import (
"bufio"
"bytes"
"fmt"
"regexp"
"strings"
)
const (
HeaderParent string = `Parent`
HeaderSpace = `Space`
HeaderTitle = `Title`
HeaderLayout = `Layout`
)
type Meta struct {
Parents []string
Space string
Title string
Layout string
}
func extractMeta(data []byte) (*Meta, error) {
headerPattern := regexp.MustCompile(`\[\]:\s*#\s*\(([^:]+):\s*(.*)\)`)
var meta *Meta
scanner := bufio.NewScanner(bytes.NewBuffer(data))
for scanner.Scan() {
line := scanner.Text()
if err := scanner.Err(); err != nil {
return nil, err
}
matches := headerPattern.FindStringSubmatch(line)
if matches == nil {
break
}
if meta == nil {
meta = &Meta{}
}
header := strings.Title(matches[1])
switch header {
case HeaderParent:
meta.Parents = append(meta.Parents, matches[2])
case HeaderSpace:
meta.Space = strings.ToUpper(matches[2])
case HeaderTitle:
meta.Title = strings.TrimSpace(matches[2])
case HeaderLayout:
meta.Layout = strings.TrimSpace(matches[2])
default:
logger.Errorf(
`encountered unknown header '%s' line: %#v`,
header,
line,
)
continue
}
}
if meta == nil {
return nil, nil
}
if meta.Space == "" {
return nil, fmt.Errorf(
"space key is not set (%s header is not set)",
HeaderSpace,
)
}
if meta.Title == "" {
return nil, fmt.Errorf(
"page title is not set (%s header is not set)",
HeaderTitle,
)
}
return meta, nil
}