Hacks for character encoding in fileformat.py.
I try to consistently translate strings to unicode objects when reading, and encode all unicode objects when writing. But it is not clear when the translation should happen. This module needs to be cleaned up a little.
This commit is contained in:
parent
bf188c99ae
commit
1f2c52bb47
@ -1,6 +1,8 @@
|
||||
import re
|
||||
import types
|
||||
|
||||
file_encoding = 'utf8'
|
||||
|
||||
# The possible fields for each type of object.
|
||||
#
|
||||
# Each field is a tuple (fieldname, fieldtype). Fieldtype is either
|
||||
@ -171,23 +173,27 @@ def write_field_value_str(val):
|
||||
lines = ''
|
||||
if not val:
|
||||
val = ''
|
||||
val = unicode(val)
|
||||
value_lines = val.split('\n')
|
||||
for l in value_lines:
|
||||
lines += ' ' + l + '\n'
|
||||
if len(value_lines) > 1:
|
||||
lines = '\n' + lines
|
||||
return lines
|
||||
|
||||
def write_field_value_int(val):
|
||||
return ' %s\n' % str(val)
|
||||
|
||||
def write_field_value_dict(val):
|
||||
lines = '\n'
|
||||
for (key,values) in val.items():
|
||||
for single_value in values:
|
||||
lines += ' ' + key + ' ' + unicode(single_value) + '\n'
|
||||
lines += ' ' + key + ' ' + single_value + '\n'
|
||||
return lines
|
||||
|
||||
def write_field_value_list(val):
|
||||
lines = ''
|
||||
for single_value in val:
|
||||
lines += ' ' + unicode(single_value)
|
||||
lines += ' ' + single_value
|
||||
return lines
|
||||
|
||||
def make_comment(s):
|
||||
@ -197,7 +203,7 @@ def make_comment(s):
|
||||
def write_action(d):
|
||||
if type(d) in types.StringTypes:
|
||||
return make_comment(d)
|
||||
lines = ''
|
||||
lines = u''
|
||||
if 'comment' in d:
|
||||
lines += make_comment(d['comment'])
|
||||
action = d['action']
|
||||
@ -206,13 +212,14 @@ def write_action(d):
|
||||
for field, ftype in fields[data_type]:
|
||||
if field in d:
|
||||
value_writer = {'s': write_field_value_str,
|
||||
'i': write_field_value_str,
|
||||
'i': write_field_value_int,
|
||||
'd': write_field_value_dict,
|
||||
'l': write_field_value_list}[ftype]
|
||||
lines += field + ':' + value_writer(d[field])
|
||||
return lines
|
||||
return lines.encode(file_encoding)
|
||||
|
||||
def write_actionlist(actions):
|
||||
return '\n'.join(map(write_action, actions))
|
||||
encoding_comment = '# -*- coding: %s -*-\n' % file_encoding
|
||||
return encoding_comment + '\n'.join(map(write_action, actions))
|
||||
|
||||
# test: print write_actionlist([{'comment':'Foo!\nBar!','action':'new-book','isbn':'434545'},{'action':'edit-book','isbn':'654654745','persons':{'author':['ab','foo'],'illustrator':['moo']}},'This\nis\na\ncomment.',{'action':'edit-category','id':'matematikk','name':'Matematikk','placement':['T10','T11']}])
|
||||
|
Reference in New Issue
Block a user