...
1
2
3
4
5 package po
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 if i < len(lines)-1 {
74 buf.WriteString(`\n"` + "\n")
75 } else {
76 buf.WriteString(`"` + "\n")
77 }
78 }
79 return buf.String()
80 }
81
82 func encodeCommentPoString(text string) string {
83 var buf bytes.Buffer
84 lines := strings.Split(text, "\n")
85 if len(lines) > 1 {
86 buf.WriteString(`""` + "\n")
87 }
88 for i := 0; i < len(lines); i++ {
89 if len(lines) > 0 {
90 buf.WriteString("#| ")
91 }
92 buf.WriteRune('"')
93 for _, r := range lines[i] {
94 switch r {
95 case '\\':
96 buf.WriteString(`\\`)
97 case '"':
98 buf.WriteString(`\"`)
99 case '\n':
100 buf.WriteString(`\n`)
101 case '\t':
102 buf.WriteString(`\t`)
103 default:
104 buf.WriteRune(r)
105 }
106 }
107 if i < len(lines)-1 {
108 buf.WriteString(`\n"` + "\n")
109 } else {
110 buf.WriteString(`"`)
111 }
112 }
113 return buf.String()
114 }
115
View as plain text