123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- // Copyright 2013 ChaiShushan <chaishushan{AT}gmail.com>. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- package mo
- import (
- "bytes"
- "strings"
- )
- func decodePoString(text string) string {
- lines := strings.Split(text, "\n")
- for i := 0; i < len(lines); i++ {
- left := strings.Index(lines[i], `"`)
- right := strings.LastIndex(lines[i], `"`)
- if left < 0 || right < 0 || left == right {
- lines[i] = ""
- continue
- }
- line := lines[i][left+1 : right]
- data := make([]byte, 0, len(line))
- for i := 0; i < len(line); i++ {
- if line[i] != '\\' {
- data = append(data, line[i])
- continue
- }
- if i+1 >= len(line) {
- break
- }
- switch line[i+1] {
- case 'n': // \\n -> \n
- data = append(data, '\n')
- i++
- case 't': // \\t -> \n
- data = append(data, '\t')
- i++
- case '\\': // \\\ -> ?
- data = append(data, '\\')
- i++
- }
- }
- lines[i] = string(data)
- }
- return strings.Join(lines, "")
- }
- func encodePoString(text string) string {
- var buf bytes.Buffer
- lines := strings.Split(text, "\n")
- for i := 0; i < len(lines); i++ {
- if lines[i] == "" {
- if i != len(lines)-1 {
- buf.WriteString(`"\n"` + "\n")
- }
- continue
- }
- buf.WriteRune('"')
- for _, r := range lines[i] {
- switch r {
- case '\\':
- buf.WriteString(`\\`)
- case '"':
- buf.WriteString(`\"`)
- case '\n':
- buf.WriteString(`\n`)
- case '\t':
- buf.WriteString(`\t`)
- default:
- buf.WriteRune(r)
- }
- }
- buf.WriteString(`\n"` + "\n")
- }
- return buf.String()
- }
- func encodeCommentPoString(text string) string {
- var buf bytes.Buffer
- lines := strings.Split(text, "\n")
- if len(lines) > 1 {
- buf.WriteString(`""` + "\n")
- }
- for i := 0; i < len(lines); i++ {
- if len(lines) > 0 {
- buf.WriteString("#| ")
- }
- buf.WriteRune('"')
- for _, r := range lines[i] {
- switch r {
- case '\\':
- buf.WriteString(`\\`)
- case '"':
- buf.WriteString(`\"`)
- case '\n':
- buf.WriteString(`\n`)
- case '\t':
- buf.WriteString(`\t`)
- default:
- buf.WriteRune(r)
- }
- }
- if i < len(lines)-1 {
- buf.WriteString(`\n"` + "\n")
- } else {
- buf.WriteString(`"`)
- }
- }
- return buf.String()
- }
|