From 847eff17b9048e16897d5e11e71cc8860a6cdf71 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Mon, 9 Dec 2024 11:54:53 -0500 Subject: [PATCH] Split ParseMeta out of SplitMeta --- meta.go | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/meta.go b/meta.go index 503a7c0..fb38a75 100644 --- a/meta.go +++ b/meta.go @@ -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 }