mirror of https://github.com/gogits/gogs.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.5 KiB
70 lines
1.5 KiB
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 |
|
|
|
}
|
|
|