111 lines
1.8 KiB
Go
111 lines
1.8 KiB
Go
|
package mercury
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"io"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
func ParseText(body io.Reader) (config SpaceMap, err error) {
|
||
|
config = make(SpaceMap)
|
||
|
|
||
|
var space string
|
||
|
var name string
|
||
|
var tags []string
|
||
|
var notes []string
|
||
|
var seq uint64
|
||
|
|
||
|
scanner := bufio.NewScanner(body)
|
||
|
for scanner.Scan() {
|
||
|
line := scanner.Text()
|
||
|
|
||
|
if len(line) == 0 {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
if strings.HasPrefix(line, "#") {
|
||
|
notes = append(notes, strings.TrimPrefix(line, "# "))
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
if strings.HasPrefix(line, "@") {
|
||
|
var c *Space
|
||
|
var ok bool
|
||
|
|
||
|
sp := strings.Fields(strings.TrimPrefix(line, "@"))
|
||
|
space = sp[0]
|
||
|
|
||
|
if c, ok = config[space]; !ok {
|
||
|
c = &Space{Space: space}
|
||
|
}
|
||
|
|
||
|
c.Notes = append(make([]string, 0, len(notes)), notes...)
|
||
|
c.Tags = append(make([]string, 0, len(sp[1:])), sp[1:]...)
|
||
|
|
||
|
config[space] = c
|
||
|
notes = notes[:0]
|
||
|
tags = tags[:0]
|
||
|
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
if space == "" {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
sp := strings.SplitN(line, ":", 2)
|
||
|
if len(sp) < 2 {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
if strings.TrimSpace(sp[0]) == "" {
|
||
|
var c *Space
|
||
|
var ok bool
|
||
|
|
||
|
if c, ok = config[space]; !ok {
|
||
|
c = &Space{Space: space}
|
||
|
}
|
||
|
|
||
|
c.List[len(c.List)-1].Values = append(c.List[len(c.List)-1].Values, sp[1])
|
||
|
config[space] = c
|
||
|
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
fields := strings.Fields(sp[0])
|
||
|
name = fields[0]
|
||
|
if len(fields) > 1 {
|
||
|
tags = fields[1:]
|
||
|
}
|
||
|
|
||
|
var c *Space
|
||
|
var ok bool
|
||
|
|
||
|
if c, ok = config[space]; !ok {
|
||
|
c = &Space{Space: space}
|
||
|
}
|
||
|
|
||
|
seq++
|
||
|
c.List = append(
|
||
|
c.List,
|
||
|
Value{
|
||
|
Seq: seq,
|
||
|
Name: name,
|
||
|
Tags: append(make([]string, 0, len(tags)), tags...),
|
||
|
Notes: append(make([]string, 0, len(notes)), notes...),
|
||
|
Values: []string{sp[1]},
|
||
|
},
|
||
|
)
|
||
|
config[space] = c
|
||
|
|
||
|
notes = notes[:0]
|
||
|
tags = tags[:0]
|
||
|
}
|
||
|
|
||
|
if err = scanner.Err(); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return
|
||
|
}
|