1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 """classes that hold units of comma-separated values (.csv) files (csvunit)
23 or entire files (csvfile) for use with localisation
24 """
25
26 import csv
27
28 from translate.misc import sparse
29 from translate.storage import base
30
31
33 - def __init__(self, fileobj, fieldnames):
34 self.fieldnames = fieldnames
35 self.contents = fileobj.read()
36 self.parser = sparse.SimpleParser(defaulttokenlist=[",", "\n"], whitespacechars="\r")
37 self.parser.stringescaping = 0
38 self.parser.quotechars = '"'
39 self.tokens = self.parser.tokenize(self.contents)
40 self.tokenpos = 0
41
44
51
53 lentokens = len(self.tokens)
54 while self.tokenpos < lentokens and self.tokens[self.tokenpos] == "\n":
55 self.tokenpos += 1
56 if self.tokenpos >= lentokens:
57 raise StopIteration()
58 thistokens = []
59 while self.tokenpos < lentokens and self.tokens[self.tokenpos] != "\n":
60 thistokens.append(self.tokens[self.tokenpos])
61 self.tokenpos += 1
62 while self.tokenpos < lentokens and self.tokens[self.tokenpos] == "\n":
63 self.tokenpos += 1
64 fields = []
65
66 currentfield = ''
67 fieldparts = 0
68 for token in thistokens:
69 if token == ',':
70
71 if fieldparts == 1:
72 currentfield = self.getvalue(currentfield)
73 fields.append(currentfield)
74 currentfield = ''
75 fieldparts = 0
76 else:
77 currentfield += token
78 fieldparts += 1
79
80 if fieldparts:
81 if fieldparts == 1:
82 currentfield = self.getvalue(currentfield)
83 fields.append(currentfield)
84 values = {}
85 for fieldnum in range(len(self.fieldnames)):
86 if fieldnum >= len(fields):
87 values[self.fieldnames[fieldnum]] = ""
88 else:
89 values[self.fieldnames[fieldnum]] = fields[fieldnum]
90 return values
91
92
93 -class csvunit(base.TranslationUnit):
94 spreadsheetescapes = [("+", "\\+"), ("-", "\\-"), ("=", "\\="), ("'", "\\'")]
100
109
118
130
131 - def todict(self, encoding='utf-8'):
132 comment, source, target = self.comment, self.source, self.target
133 source, target = self.add_spreadsheet_escapes(source, target)
134 if isinstance(comment, unicode):
135 comment = comment.encode(encoding)
136 if isinstance(source, unicode):
137 source = source.encode(encoding)
138 if isinstance(target, unicode):
139 target = target.encode(encoding)
140 return {'location': comment, 'source': source, 'target': target}
141
142 -class csvfile(base.TranslationStore):
143 """This class represents a .csv file with various lines.
144 The default format contains three columns: location, source, target"""
145 UnitClass = csvunit
146 Name = _("Comma Separated Value")
147 Mimetypes = ['text/comma-separated-values', 'text/csv']
148 Extensions = ["csv"]
149 - def __init__(self, inputfile=None, fieldnames=None):
150 base.TranslationStore.__init__(self, unitclass=self.UnitClass)
151 self.units = []
152 if fieldnames is None:
153 self.fieldnames = ['location', 'source', 'target']
154 else:
155 if isinstance(fieldnames, basestring):
156 fieldnames = [fieldname.strip() for fieldname in fieldnames.split(",")]
157 self.fieldnames = fieldnames
158 self.filename = getattr(inputfile, 'name', '')
159 if inputfile is not None:
160 csvsrc = inputfile.read()
161 inputfile.close()
162 self.parse(csvsrc)
163
164 - def parse(self, csvsrc):
171
178
187