2021-05-23 12:16:20 +00:00
|
|
|
package beeParser
|
|
|
|
|
|
|
|
import (
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
2021-05-24 15:18:14 +00:00
|
|
|
type Annotator interface {
|
2021-05-25 02:53:12 +00:00
|
|
|
Annotate(string) map[string]interface{}
|
2021-05-24 15:18:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type Annotation struct {
|
|
|
|
}
|
2021-05-23 12:16:20 +00:00
|
|
|
|
|
|
|
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.
|
2021-05-25 02:53:12 +00:00
|
|
|
func (a *Annotation) Annotate(annotation string) map[string]interface{} {
|
|
|
|
results := make(map[string]interface{})
|
2021-05-23 12:16:20 +00:00
|
|
|
//split annotation with '@'
|
2021-05-25 02:53:12 +00:00
|
|
|
lines := strings.Split(annotation, "@")
|
2021-05-23 12:16:20 +00:00
|
|
|
//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")
|
2021-05-25 02:53:12 +00:00
|
|
|
results[key] = handleWhitespaceValues(values)
|
2021-05-23 12:16:20 +00:00
|
|
|
}
|
|
|
|
return results
|
|
|
|
}
|