summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/chaseadamsio/goorgeous/header.go
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2017-09-21 13:20:14 +0800
committerGitHub <noreply@github.com>2017-09-21 13:20:14 +0800
commit0d80af649a50c4b9e5e4ba764399872fc92f70f2 (patch)
treef09f289260005bc6913119643230c08c81dfab49 /vendor/github.com/chaseadamsio/goorgeous/header.go
parent66bc0ac251f564491ed0a6d5d4cfa0a11af09303 (diff)
downloadgitea-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.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 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
+
+}