mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	* 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
		
			
				
	
	
		
			71 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
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
 | 
						|
 | 
						|
}
 |