...
1
2
3
4
5 package mo
6
7 import (
8 "bytes"
9 "strings"
10 )
11
12 func decodePoString(text string) string {
13 lines := strings.Split(text, "\n")
14 for i := 0; i < len(lines); i++ {
15 left := strings.Index(lines[i], `"`)
16 right := strings.LastIndex(lines[i], `"`)
17 if left < 0 || right < 0 || left == right {
18 lines[i] = ""
19 continue
20 }
21 line := lines[i][left+1 : right]
22 data := make([]byte, 0, len(line))
23 for i := 0; i < len(line); i++ {
24 if line[i] != '\\' {
25 data = append(data, line[i])
26 continue
27 }
28 if i+1 >= len(line) {
29 break
30 }
31 switch line[i+1] {
32 case 'n':
33 data = append(data, '\n')
34 i++
35 case 't':
36 data = append(data, '\t')
37 i++
38 case '\\':
39 data = append(data, '\\')
40 i++
41 }
42 }
43 lines[i] = string(data)
44 }
45 return strings.Join(lines, "")
46 }
47
48 func encodePoString(text string) string {
49 var buf bytes.Buffer
50 lines := strings.Split(text, "\n")
51 for i := 0; i < len(lines); i++ {
52 if lines[i] == "" {
53 if i != len(lines)-1 {
54 buf.WriteString(`"\n"` + "\n")
55 }
56 continue
57 }
58 buf.WriteRune('"')
59 for _, r := range lines[i] {
60 switch r {
61 case '\\':
62 buf.WriteString(`\\`)
63 case '"':
64 buf.WriteString(`\"`)
65 case '\n':
66 buf.WriteString(`\n`)
67 case '\t':
68 buf.WriteString(`\t`)
69 default:
70 buf.WriteRune(r)
71 }
72 }
73 buf.WriteString(`\n"` + "\n")
74 }
75 return buf.String()
76 }
77
78 func encodeCommentPoString(text string) string {
79 var buf bytes.Buffer
80 lines := strings.Split(text, "\n")
81 if len(lines) > 1 {
82 buf.WriteString(`""` + "\n")
83 }
84 for i := 0; i < len(lines); i++ {
85 if len(lines) > 0 {
86 buf.WriteString("#| ")
87 }
88 buf.WriteRune('"')
89 for _, r := range lines[i] {
90 switch r {
91 case '\\':
92 buf.WriteString(`\\`)
93 case '"':
94 buf.WriteString(`\"`)
95 case '\n':
96 buf.WriteString(`\n`)
97 case '\t':
98 buf.WriteString(`\t`)
99 default:
100 buf.WriteRune(r)
101 }
102 }
103 if i < len(lines)-1 {
104 buf.WriteString(`\n"` + "\n")
105 } else {
106 buf.WriteString(`"`)
107 }
108 }
109 return buf.String()
110 }
111
View as plain text