...

Source file src/github.com/chai2010/gettext-go/po/file.go

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

     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 po
     6  
     7  import (
     8  	"bytes"
     9  	"fmt"
    10  	"io"
    11  	"io/ioutil"
    12  	"sort"
    13  )
    14  
    15  // File represents an PO File.
    16  //
    17  // See http://www.gnu.org/software/gettext/manual/html_node/PO-Files.html
    18  type File struct {
    19  	MimeHeader Header
    20  	Messages   []Message
    21  }
    22  
    23  // Load loads po file format data.
    24  func Load(data []byte) (*File, error) {
    25  	return loadData(data)
    26  }
    27  
    28  // LoadFile loads a named po file.
    29  func LoadFile(path string) (*File, error) {
    30  	data, err := ioutil.ReadFile(path)
    31  	if err != nil {
    32  		return nil, err
    33  	}
    34  	return loadData(data)
    35  }
    36  
    37  func loadData(data []byte) (*File, error) {
    38  	r := newLineReader(string(data))
    39  	var file File
    40  	for {
    41  		var msg Message
    42  		if err := msg.readPoEntry(r); err != nil {
    43  			if err == io.EOF {
    44  				return &file, nil
    45  			}
    46  			return nil, err
    47  		}
    48  		if msg.MsgId == "" {
    49  			file.MimeHeader.parseHeader(&msg)
    50  			continue
    51  		}
    52  		file.Messages = append(file.Messages, msg)
    53  	}
    54  }
    55  
    56  // Save saves a po file.
    57  func (f *File) Save(name string) error {
    58  	return ioutil.WriteFile(name, []byte(f.String()), 0666)
    59  }
    60  
    61  // Save returns a po file format data.
    62  func (f *File) Data() []byte {
    63  	// sort the massge as ReferenceFile/ReferenceLine field
    64  	var messages []Message
    65  	messages = append(messages, f.Messages...)
    66  	sort.Slice(messages, func(i, j int) bool {
    67  		return messages[i].less(&messages[j])
    68  	})
    69  
    70  	var buf bytes.Buffer
    71  	fmt.Fprintf(&buf, "%s\n", f.MimeHeader.String())
    72  	for i := 0; i < len(messages); i++ {
    73  		fmt.Fprintf(&buf, "%s\n", messages[i].String())
    74  	}
    75  	return buf.Bytes()
    76  }
    77  
    78  // String returns the po format file string.
    79  func (f *File) String() string {
    80  	return string(f.Data())
    81  }
    82  

View as plain text