aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/chaseadamsio/goorgeous/header.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/chaseadamsio/goorgeous/header.go')
-rw-r--r--vendor/github.com/chaseadamsio/goorgeous/header.go70
1 files changed, 70 insertions, 0 deletions
diff --git a/vendor/github.com/chaseadamsio/goorgeous/header.go b/vendor/github.com/chaseadamsio/goorgeous/header.go
new file mode 100644
index 00000000..66e8b993
--- /dev/null
+++ b/vendor/github.com/chaseadamsio/goorgeous/header.go
@@ -0,0 +1,70 @@
+package goorgeous
+
+import (
+ "bufio"
+ "bytes"
+ "regexp"
+ "strings"
+)
+
+// ExtractOrgHeaders finds and returns all of the headers
+// from a bufio.Reader and returns them as their own byte slice
+func ExtractOrgHeaders(r *bufio.Reader) (fm []byte, err error) {
+ var out bytes.Buffer
+ endOfHeaders := true
+ for endOfHeaders {
+ p, err := r.Peek(2)
+ if err != nil {
+ return nil, err
+ }
+ if !charMatches(p[0], '#') && !charMatches(p[1], '+') {
+ endOfHeaders = false
+ break
+ }
+ line, _, err := r.ReadLine()
+ if err != nil {
+ return nil, err
+ }
+ out.Write(line)
+ out.WriteByte('\n')
+ }
+ return out.Bytes(), nil
+}
+
+var reHeader = regexp.MustCompile(`^#\+(\w+?): (.*)`)
+
+// OrgHeaders find all of the headers from a byte slice and returns
+// them as a map of string interface
+func OrgHeaders(input []byte) (map[string]interface{}, error) {
+ out := make(map[string]interface{})
+ scanner := bufio.NewScanner(bytes.NewReader(input))
+
+ for scanner.Scan() {
+ data := scanner.Bytes()
+ if !charMatches(data[0], '#') && !charMatches(data[1], '+') {
+ return out, nil
+ }
+ matches := reHeader.FindSubmatch(data)
+
+ if len(matches) < 3 {
+ continue
+ }
+
+ key := string(matches[1])
+ val := matches[2]
+ switch {
+ case strings.ToLower(key) == "tags" || strings.ToLower(key) == "categories" || strings.ToLower(key) == "aliases":
+ bTags := bytes.Split(val, []byte(" "))
+ tags := make([]string, len(bTags))
+ for idx, tag := range bTags {
+ tags[idx] = string(tag)
+ }
+ out[key] = tags
+ default:
+ out[key] = string(val)
+ }
+
+ }
+ return out, nil
+
+}