...

Source file src/github.com/chai2010/gettext-go/mo/util.go

Documentation: github.com/chai2010/gettext-go/mo

     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  
     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': // \\n -> \n
    33  				data = append(data, '\n')
    34  				i++
    35  			case 't': // \\t -> \n
    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