mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-10-26 20:11:02 +00: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
		
			
				
	
	
		
			70 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			70 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
 | |
| 
 | |
| }
 |