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

@ -295,7 +295,7 @@ class GrampsDbXmlWriter(UpdateCallback):
self.g.write(" <notes>\n")
for key in self.db.get_note_handles():
note = self.db.get_note_from_handle(key)
self.write_note(note,2)
self.write_note(note, 2)
self.update()
self.g.write(" </notes>\n")
@ -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)
def write_text(self,val,text,indent=0):
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
@ -432,107 +434,110 @@ class GrampsParser(UpdateCallback):
self.eidswap = {}
self.func_map = {
"address" : (self.start_address, self.stop_address),
"addresses" : (None, None),
"childlist" : (None, None),
"aka" : (self.start_name, self.stop_aka),
"attribute" : (self.start_attribute, self.stop_attribute),
"attr_type" : (None, self.stop_attr_type),
"attr_value" : (None, self.stop_attr_value),
"bookmark" : (self.start_bmark, None),
"bookmarks" : (None, None),
"format" : (self.start_format, None),
"name-formats" : (None, None),
"child" : (self.start_child, None),
"childof" : (self.start_childof, None),
"childref" : (self.start_childref, self.stop_childref),
"personref" : (self.start_personref, self.stop_personref),
"city" : (None, self.stop_city),
"county" : (None, self.stop_county),
"country" : (None, self.stop_country),
"comment" : (None, self.stop_comment),
"created" : (self.start_created, None),
"ref" : (None, self.stop_ref),
"database" : (self.start_database, self.stop_database),
"phone" : (None, self.stop_phone),
"date" : (None, self.stop_date),
"cause" : (None, self.stop_cause),
"address": (self.start_address, self.stop_address),
"addresses": (None, None),
"childlist": (None, None),
"aka": (self.start_name, self.stop_aka),
"attribute": (self.start_attribute, self.stop_attribute),
"attr_type": (None, self.stop_attr_type),
"attr_value": (None, self.stop_attr_value),
"bookmark": (self.start_bmark, None),
"bookmarks": (None, None),
"format": (self.start_format, None),
"name-formats": (None, None),
"child": (self.start_child, None),
"childof": (self.start_childof, None),
"childref": (self.start_childref, self.stop_childref),
"personref": (self.start_personref, self.stop_personref),
"city": (None, self.stop_city),
"county": (None, self.stop_county),
"country": (None, self.stop_country),
"comment": (None, self.stop_comment),
"created": (self.start_created, None),
"ref": (None, self.stop_ref),
"database": (self.start_database, self.stop_database),
"phone": (None, self.stop_phone),
"date": (None, self.stop_date),
"cause": (None, self.stop_cause),
"description": (None, self.stop_description),
"event" : (self.start_event, self.stop_event),
"type" : (None, self.stop_type),
"witness" : (self.start_witness, self.stop_witness),
"eventref" : (self.start_eventref, self.stop_eventref),
"data_item" : (self.start_data_item, None),
"families" : (None, self.stop_families),
"family" : (self.start_family, self.stop_family),
"rel" : (self.start_rel, None),
"region" : (self.start_region, None),
"father" : (self.start_father, None),
"first" : (None, self.stop_first),
"call" : (None, self.stop_call),
"gender" : (None, self.stop_gender),
"header" : (None, None),
"last" : (self.start_last, self.stop_last),
"map" : (self.start_namemap, None),
"mediapath" : (None, self.stop_mediapath),
"mother" : (self.start_mother, None),
"name" : (self.start_name, self.stop_name),
"namemaps" : (None, None),
"nick" : (None, self.stop_nick),
"note" : (self.start_note, self.stop_note),
"noteref" : (self.start_noteref, None),
"p" : (None, self.stop_ptag),
"parentin" : (self.start_parentin, None),
"people" : (self.start_people, self.stop_people),
"person" : (self.start_person, self.stop_person),
"img" : (self.start_photo, self.stop_photo),
"objref" : (self.start_objref, self.stop_objref),
"object" : (self.start_object, self.stop_object),
"file" : (self.start_file, None),
"place" : (self.start_place, self.stop_place),
"dateval" : (self.start_dateval, None),
"daterange" : (self.start_daterange, None),
"datespan" : (self.start_datespan, None),
"datestr" : (self.start_datestr, None),
"places" : (None, self.stop_places),
"placeobj" : (self.start_placeobj, self.stop_placeobj),
"ptitle" : (None, self.stop_ptitle),
"location" : (self.start_location, None),
"lds_ord" : (self.start_lds_ord, self.stop_lds_ord),
"temple" : (self.start_temple, None),
"status" : (self.start_status, None),
"sealed_to" : (self.start_sealed_to, None),
"coord" : (self.start_coord, None),
"patronymic" : (None, self.stop_patronymic),
"pos" : (self.start_pos, None),
"postal" : (None, self.stop_postal),
"researcher" : (None, self.stop_research),
"resname" : (None, self.stop_resname ),
"resaddr" : (None, self.stop_resaddr ),
"rescity" : (None, self.stop_rescity ),
"resstate" : (None, self.stop_resstate ),
"rescountry" : (None, self.stop_rescountry),
"respostal" : (None, self.stop_respostal),
"resphone" : (None, self.stop_resphone),
"resemail" : (None, self.stop_resemail),
"sauthor" : (None, self.stop_sauthor),
"sabbrev" : (None, self.stop_sabbrev),
"scomments" : (None, self.stop_scomments),
"source" : (self.start_source, self.stop_source),
"sourceref" : (self.start_sourceref, self.stop_sourceref),
"sources" : (None, None),
"spage" : (None, self.stop_spage),
"spubinfo" : (None, self.stop_spubinfo),
"state" : (None, self.stop_state),
"stext" : (None, self.stop_stext),
"stitle" : (None, self.stop_stitle),
"street" : (None, self.stop_street),
"suffix" : (None, self.stop_suffix),
"title" : (None, self.stop_title),
"url" : (self.start_url, None),
"repository" : (self.start_repo, self.stop_repo),
"reporef" : (self.start_reporef, self.stop_reporef),
"rname" : (None, self.stop_rname),
"event": (self.start_event, self.stop_event),
"type": (None, self.stop_type),
"witness": (self.start_witness, self.stop_witness),
"eventref": (self.start_eventref, self.stop_eventref),
"data_item": (self.start_data_item, None),
"families": (None, self.stop_families),
"family": (self.start_family, self.stop_family),
"rel": (self.start_rel, None),
"region": (self.start_region, None),
"father": (self.start_father, None),
"first": (None, self.stop_first),
"call": (None, self.stop_call),
"gender": (None, self.stop_gender),
"header": (None, None),
"last": (self.start_last, self.stop_last),
"map": (self.start_namemap, None),
"mediapath": (None, self.stop_mediapath),
"mother": (self.start_mother, None),
"name": (self.start_name, self.stop_name),
"namemaps": (None, None),
"nick": (None, self.stop_nick),
"note": (self.start_note, self.stop_note),
"noteref": (self.start_noteref, None),
"p": (None, self.stop_ptag),
"parentin": (self.start_parentin, None),
"people": (self.start_people, self.stop_people),
"person": (self.start_person, self.stop_person),
"img": (self.start_photo, self.stop_photo),
"objref": (self.start_objref, self.stop_objref),
"object": (self.start_object, self.stop_object),
"file": (self.start_file, None),
"place": (self.start_place, self.stop_place),
"dateval": (self.start_dateval, None),
"daterange": (self.start_daterange, None),
"datespan": (self.start_datespan, None),
"datestr": (self.start_datestr, None),
"places": (None, self.stop_places),
"placeobj": (self.start_placeobj, self.stop_placeobj),
"ptitle": (None, self.stop_ptitle),
"location": (self.start_location, None),
"lds_ord": (self.start_lds_ord, self.stop_lds_ord),
"temple": (self.start_temple, None),
"status": (self.start_status, None),
"sealed_to": (self.start_sealed_to, None),
"coord": (self.start_coord, None),
"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 ),
"rescity": (None, self.stop_rescity ),
"resstate": (None, self.stop_resstate ),
"rescountry": (None, self.stop_rescountry),
"respostal": (None, self.stop_respostal),
"resphone": (None, self.stop_resphone),
"resemail": (None, self.stop_resemail),
"sauthor": (None, self.stop_sauthor),
"sabbrev": (None, self.stop_sabbrev),
"scomments": (None, self.stop_scomments),
"source": (self.start_source, self.stop_source),
"sourceref": (self.start_sourceref, self.stop_sourceref),
"sources": (None, None),
"spage": (None, self.stop_spage),
"spubinfo": (None, self.stop_spubinfo),
"state": (None, self.stop_state),
"stext": (None, self.stop_stext),
"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),
"reporef": (self.start_reporef, self.stop_reporef),
"rname": (None, self.stop_rname),
}
def find_person_by_gramps_id(self, gramps_id):
@ -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)