58 lines
1.0 KiB
Go
58 lines
1.0 KiB
Go
|
|
package ingestion
|
||
|
|
|
||
|
|
import (
|
||
|
|
"os"
|
||
|
|
"strings"
|
||
|
|
)
|
||
|
|
|
||
|
|
func ParseMarkdown(path string) (string, error) {
|
||
|
|
data, err := os.ReadFile(path)
|
||
|
|
if err != nil {
|
||
|
|
return "", err
|
||
|
|
}
|
||
|
|
|
||
|
|
content := string(data)
|
||
|
|
content = stripFrontmatter(content)
|
||
|
|
content = strings.TrimSpace(content)
|
||
|
|
return content, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func stripFrontmatter(content string) string {
|
||
|
|
content = strings.TrimLeft(content, "\n\r\t ")
|
||
|
|
if !strings.HasPrefix(content, "---") {
|
||
|
|
return content
|
||
|
|
}
|
||
|
|
|
||
|
|
rest := content[3:]
|
||
|
|
closing := findFMClosing(rest)
|
||
|
|
if closing < 0 {
|
||
|
|
return content
|
||
|
|
}
|
||
|
|
|
||
|
|
return strings.TrimLeft(rest[closing:], "\n\r")
|
||
|
|
}
|
||
|
|
|
||
|
|
func findFMClosing(s string) int {
|
||
|
|
i := 0
|
||
|
|
for i < len(s) {
|
||
|
|
nl := strings.IndexByte(s[i:], '\n')
|
||
|
|
if nl < 0 {
|
||
|
|
break
|
||
|
|
}
|
||
|
|
lineStart := i + nl + 1
|
||
|
|
if lineStart >= len(s) {
|
||
|
|
break
|
||
|
|
}
|
||
|
|
end := strings.IndexByte(s[lineStart:], '\n')
|
||
|
|
line := s[lineStart:]
|
||
|
|
if end >= 0 {
|
||
|
|
line = s[lineStart : lineStart+end]
|
||
|
|
}
|
||
|
|
if strings.TrimRight(line, "\r") == "---" {
|
||
|
|
return lineStart + len(line)
|
||
|
|
}
|
||
|
|
i = lineStart + len(line)
|
||
|
|
}
|
||
|
|
return -1
|
||
|
|
}
|