Split ParseMeta out of SplitMeta

This commit is contained in:
Sasha Koshka 2024-12-09 11:54:53 -05:00
parent 88c5ef2922
commit 847eff17b9

33
meta.go
View File

@ -12,8 +12,11 @@ type Meta = map[string] string
// along with the rest of the input as a string. If there is no metadata, an
// empty map will be returned.
func SplitMeta (input string) (Meta, string, error) {
// i hate crlf!!!!! uwehhh!!!
// i hate crlf!!!!! uwehhh!!! TODO remove
input = strings.ReplaceAll(input, "\r\n", "\n")
// TODO call internal function that takes in an io.Reader and scans it
// by line instead of operating directly on the string. have that call
// yet another function which will solve #11
// stop if there is no front matter
if !strings.HasPrefix(input, frontMatterRule + "\n") {
@ -28,26 +31,34 @@ func SplitMeta (input string) (Meta, string, error) {
}
frontMatterRaw := input[:index]
body := input[index + len(frontMatterRule) + 2:]
frontMatter := make(Meta)
// iterate over the lines
for _, line := range strings.Split(frontMatterRaw, "\n") {
// parse meta
meta, err := ParseMeta(frontMatterRaw)
if err != nil { return Meta { }, "", err }
return meta, body, nil
}
// ParseMeta parses isolated metadata (without the horizontal starting and
// ending rules).
func ParseMeta (input string) (Meta, error) {
meta := make(Meta)
for _, line := range strings.Split(input, "\n") {
line = strings.TrimSpace(line)
if line == "" { continue }
key, value, ok := strings.Cut(line, ":")
if !ok {
return nil, "", ErrFrontMatterMalformed
return nil, ErrFrontMatterMalformed
}
key = strings.ToLower(strings.TrimSpace(key))
value = strings.TrimSpace(value)
if key == "" {
return nil, "", ErrFrontMatterMalformed
return nil, ErrFrontMatterMalformed
}
if _, exists := frontMatter[key]; exists {
return nil, "", ErrFrontMatterDuplicateKey
if _, exists := meta[key]; exists {
return nil, ErrFrontMatterDuplicateKey
}
frontMatter[key] = value
meta[key] = value
}
return frontMatter, body, nil
return meta, nil
}