/
token.go
115 lines (101 loc) · 2.07 KB
/
token.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package vfmt
import (
"fmt"
"strings"
)
const esc = "\033["
var (
clearLine = []byte(esc + "2K\r")
moveUp = []byte(esc + "1A")
moveDown = []byte(esc + "1B")
)
type FormatSymbol uint8
const (
ResetSymbol FormatSymbol = iota
DimSymbol
ResetFGSymbol
ResetBGSymbol
BoldSymbol
UnderlineSymbol
ItalicSymbol
ReverseSymbol
StrikeOutSymbol
NewlineSymbol
ColorSymbol
BGColorSymbol
StyleSymbol
BlinkSymbol
HiddenSymbol
ClearLineSymbol
MovedownSymbol
MoveupSymbol
ListOrderedSymbol
ListUnorderedSymbol
ListItemSymbol
)
type SymValue struct {
Sym FormatSymbol
Value []byte
}
type SymbolsMap map[FormatSymbol]string
func (s SymbolsMap) GetValueOf(sym FormatSymbol) (result any, ok bool) {
res, ok0 := s[sym]
if ok0 && strings.Contains(res, ",") {
result = strings.Split(res, ",")[0]
} else {
result = res
}
ok = ok0
return
}
type IFormatter interface {
Init() error
GetSymbols() SymbolsMap
IsSymbolOf(string) (FormatSymbol, bool)
}
var htmlSet = SymbolsMap{
DimSymbol: "dim",
ColorSymbol: "fg",
ResetFGSymbol: "/fg",
BGColorSymbol: "bg",
ResetBGSymbol: "/bg",
BoldSymbol: "b,strong,bold",
UnderlineSymbol: "u,underline",
ItalicSymbol: "i,italic,em",
NewlineSymbol: "br",
StyleSymbol: "style",
ReverseSymbol: "reverse",
ClearLineSymbol: "cl,clearline",
MovedownSymbol: "md,movedown",
MoveupSymbol: "mu,moveup",
BlinkSymbol: "blink",
ListOrderedSymbol: "ol",
ListUnorderedSymbol: "ul",
ListItemSymbol: "li",
}
type htmlFormatter struct {
IFormatter
symbols *SymbolsMap
}
func (h htmlFormatter) Init() (err error) {
if *h.symbols != nil || len(*h.symbols) > 0 {
err = fmt.Errorf("already_init")
return
}
h.symbols = &htmlSet
return
}
func (h htmlFormatter) GetSymbols() SymbolsMap {
return *h.symbols
}
func (h htmlFormatter) IsSymbolOf(tags string) (sym FormatSymbol, ok bool) {
for s, els := range *h.symbols {
tags = strings.TrimPrefix(tags, "/")
if strings.ContainsAny(els, tags) {
sym = s
ok = true
return
}
}
return
}