bee/parser/annotator.go

69 lines
1.6 KiB
Go

package beeParser
import (
"encoding/json"
"strings"
)
type Annotator interface {
Annotate(string) []map[string]interface{}
AnnotateToJson(string) (string, error)
}
type Annotation struct {
}
func isWhitespace(ch byte) bool { return ch == ' ' || ch == '\t' || ch == '\r' }
func handleHeadWhitespace(s string) string {
i := 0
for i < len(s) && isWhitespace(s[i]) {
i++
}
return s[i:]
}
func handleTailWhitespace(s string) string {
i := len(s)
for i > 0 && isWhitespace(s[i-1]) {
i--
}
return s[0:i]
}
//handle value to remove head and tail space.
func handleWhitespaceValues(values []string) []string {
res := make([]string, 0)
for _, v := range values {
v = handleHeadWhitespace(v)
v = handleTailWhitespace(v)
res = append(res, v)
}
return res
}
//parse annotation to generate array with key and values
//start with "@" as a key-value pair,key and values are separated by a space,wrap to distinguish values.
func (a *Annotation) Annotate(comment string) []map[string]interface{} {
results := make([]map[string]interface{}, 0)
//split annotation with '@'
lines := strings.Split(comment, "@")
//skip first line whitespace
for _, line := range lines[1:] {
kvs := strings.Split(line, " ")
key := kvs[0]
values := strings.Split(strings.TrimSpace(line[len(kvs[0]):]), "\n")
annotation := make(map[string]interface{})
annotation[key] = handleWhitespaceValues(values)
results = append(results, annotation)
}
return results
}
//parse annotation to json
func (a *Annotation) AnnotateToJson(comment string) (string, error) {
annotate := a.Annotate(comment)
result, err := json.MarshalIndent(annotate, "", " ")
return string(result), err
}