util.go 2.2 KB

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