Handle import/export of StyledText Notes.
svn: r10526
This commit is contained in:
@@ -392,29 +392,53 @@ class GrampsDbXmlWriter(UpdateCallback):
|
||||
for handle in note_list:
|
||||
self.write_ref("noteref", handle,indent)
|
||||
|
||||
def write_note(self, note,index=1):
|
||||
def write_note(self, note, index=2):
|
||||
if not note:
|
||||
return
|
||||
|
||||
self.write_primary_tag("note", note,2,close=False)
|
||||
self.write_primary_tag('note', note, index, close=False)
|
||||
|
||||
ntype = escxml(note.get_type().xml_str())
|
||||
format = note.get_format()
|
||||
text = note.get()
|
||||
text = note.get_styledtext()
|
||||
tags = text.get_tags()
|
||||
text = str(text)
|
||||
|
||||
self.g.write(' type="%s"' % ntype)
|
||||
if format != note.FLOWED:
|
||||
self.g.write(' format="%d"' % format)
|
||||
self.g.write('>')
|
||||
self.g.write('>\n')
|
||||
|
||||
self.g.write(self.fix(text.rstrip()))
|
||||
self.g.write("</note>\n")
|
||||
self.write_text('text', text, index + 1)
|
||||
|
||||
if tags:
|
||||
self.write_texttags(tags, index + 1)
|
||||
|
||||
self.g.write(' ' * index + '</note>\n')
|
||||
|
||||
|
||||
def write_texttags(self, tags, index=3):
|
||||
for tag in tags:
|
||||
name = tag.name.xml_str()
|
||||
value = tag.value
|
||||
|
||||
self.g.write(' ' * index + '<tag name="%s"' % name)
|
||||
if value:
|
||||
self.g.write(' value="%s"' % value)
|
||||
self.g.write('>\n')
|
||||
|
||||
for (start, end) in tag.ranges:
|
||||
self.g.write((' ' * (index + 1)) +
|
||||
'<range start="%d" end="%d"/>\n' % (start, end))
|
||||
|
||||
self.g.write(' ' * index + '</tag>\n')
|
||||
|
||||
def write_text(self, val, text, indent=0):
|
||||
if not text:
|
||||
return
|
||||
if indent != 0:
|
||||
self.g.write(" " * indent)
|
||||
|
||||
if indent:
|
||||
self.g.write(' ' * indent)
|
||||
|
||||
self.g.write('<%s>' % val)
|
||||
self.g.write(self.fix(text.rstrip()))
|
||||
|
@@ -374,6 +374,8 @@ class GrampsParser(UpdateCallback):
|
||||
self.in_note = 0
|
||||
self.in_stext = 0
|
||||
self.in_scomments = 0
|
||||
self.note_text = None
|
||||
self.note_tags = []
|
||||
self.in_witness = False
|
||||
self.db = database
|
||||
self.photo = None
|
||||
@@ -506,6 +508,7 @@ class GrampsParser(UpdateCallback):
|
||||
"patronymic": (None, self.stop_patronymic),
|
||||
"pos": (self.start_pos, None),
|
||||
"postal": (None, self.stop_postal),
|
||||
"range": (self.start_range, None),
|
||||
"researcher": (None, self.stop_research),
|
||||
"resname": (None, self.stop_resname ),
|
||||
"resaddr": (None, self.stop_resaddr ),
|
||||
@@ -528,6 +531,8 @@ class GrampsParser(UpdateCallback):
|
||||
"stitle": (None, self.stop_stitle),
|
||||
"street": (None, self.stop_street),
|
||||
"suffix": (None, self.stop_suffix),
|
||||
"tag": (self.start_tag, None),
|
||||
"text": (None, self.stop_text),
|
||||
"title": (None, self.stop_title),
|
||||
"url": (self.start_url, None),
|
||||
"repository": (self.start_repo, self.stop_repo),
|
||||
@@ -1317,6 +1322,21 @@ class GrampsParser(UpdateCallback):
|
||||
self.name.prefix = attrs.get('prefix', '')
|
||||
self.name.group_as = attrs.get('group', '')
|
||||
|
||||
def start_tag(self, attrs):
|
||||
tagtype = gen.lib.StyledTextTagType()
|
||||
tagtype.set_from_xml_str(attrs['name'])
|
||||
|
||||
try:
|
||||
tagvalue = attrs['value']
|
||||
except KeyError:
|
||||
tagvalue = None
|
||||
|
||||
self.note_tags.append(gen.lib.StyledTextTag(tagtype, tagvalue))
|
||||
|
||||
def start_range(self, attrs):
|
||||
self.note_tags[-1].ranges.append((int(attrs['start']),
|
||||
int(attrs['end'])))
|
||||
|
||||
def start_note(self, attrs):
|
||||
self.in_note = 0
|
||||
if 'handle' in attrs:
|
||||
@@ -1339,6 +1359,13 @@ class GrampsParser(UpdateCallback):
|
||||
self.info.add('merge-overwrite', NOTE_KEY, self.note)
|
||||
self.note.format = int(attrs.get('format', gen.lib.Note.FLOWED))
|
||||
self.note.type.set_from_xml_str(attrs['type'])
|
||||
|
||||
# Since StyledText was introduced (XML v1.2.1?) the clear text
|
||||
# part of the note is moved between <text></text> tags.
|
||||
# To catch the different versions here we reset the note_text
|
||||
# variable. It will be checked in stop_note() then.
|
||||
self.note_text = None
|
||||
self.note_tags = []
|
||||
else:
|
||||
# GRAMPS LEGACY: old notes that were written inside other objects
|
||||
# We need to create a top-level note, it's type depends on
|
||||
@@ -2174,14 +2201,20 @@ class GrampsParser(UpdateCallback):
|
||||
attr.set_value(tag)
|
||||
self.person.add_attribute(attr)
|
||||
|
||||
def stop_text(self, tag):
|
||||
self.note_text = tag
|
||||
|
||||
def stop_note(self, tag):
|
||||
self.in_note = 0
|
||||
if self.use_p:
|
||||
self.use_p = 0
|
||||
text = fix_spaces(self.note_list)
|
||||
elif self.note_text is not None:
|
||||
text = self.note_text
|
||||
else:
|
||||
text = tag
|
||||
self.note.set(text)
|
||||
|
||||
self.note.set_styledtext(gen.lib.StyledText(text, self.note_tags))
|
||||
|
||||
if self.address:
|
||||
self.address.add_note(self.note.handle)
|
||||
|
Reference in New Issue
Block a user