diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2017-09-21 13:20:14 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-09-21 13:20:14 +0800 |
commit | 0d80af649a50c4b9e5e4ba764399872fc92f70f2 (patch) | |
tree | f09f289260005bc6913119643230c08c81dfab49 /vendor/github.com/chaseadamsio/goorgeous/header.go | |
parent | 66bc0ac251f564491ed0a6d5d4cfa0a11af09303 (diff) | |
download | gitea-0d80af649a50c4b9e5e4ba764399872fc92f70f2.tar.gz gitea-0d80af649a50c4b9e5e4ba764399872fc92f70f2.zip |
Add init support of orgmode document type on file view and readme (#2525)
* add init support of orgmode document type on file view and readme
* fix imports
* fix imports and readmeExist
* fix imports order
* fix format
* remove unnecessary convert
Diffstat (limited to 'vendor/github.com/chaseadamsio/goorgeous/header.go')
-rw-r--r-- | vendor/github.com/chaseadamsio/goorgeous/header.go | 70 |
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 0000000000..66e8b99321 --- /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 + +} |