Handle import/export of StyledText Notes.

svn: r10526
This commit is contained in:
Zsolt Foldvari
2008-04-08 21:43:58 +00:00
parent 6ccb9cb3db
commit 3b4378fe81
2 changed files with 169 additions and 112 deletions

View File

@@ -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()))

View File

@@ -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)