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") self.g.write(" <notes>\n")
for key in self.db.get_note_handles(): for key in self.db.get_note_handles():
note = self.db.get_note_from_handle(key) note = self.db.get_note_from_handle(key)
self.write_note(note,2) self.write_note(note, 2)
self.update() self.update()
self.g.write(" </notes>\n") self.g.write(" </notes>\n")
@@ -392,29 +392,53 @@ class GrampsDbXmlWriter(UpdateCallback):
for handle in note_list: for handle in note_list:
self.write_ref("noteref", handle,indent) self.write_ref("noteref", handle,indent)
def write_note(self, note,index=1): def write_note(self, note, index=2):
if not note: if not note:
return 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()) ntype = escxml(note.get_type().xml_str())
format = note.get_format() format = note.get_format()
text = note.get() text = note.get_styledtext()
tags = text.get_tags()
text = str(text)
self.g.write(' type="%s"' % ntype) self.g.write(' type="%s"' % ntype)
if format != note.FLOWED: if format != note.FLOWED:
self.g.write(' format="%d"' % format) self.g.write(' format="%d"' % format)
self.g.write('>') self.g.write('>\n')
self.g.write(self.fix(text.rstrip())) self.write_text('text', text, index + 1)
self.g.write("</note>\n")
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: if not text:
return return
if indent != 0:
self.g.write(" " * indent) if indent:
self.g.write(' ' * indent)
self.g.write('<%s>' % val) self.g.write('<%s>' % val)
self.g.write(self.fix(text.rstrip())) self.g.write(self.fix(text.rstrip()))

View File

@@ -374,6 +374,8 @@ class GrampsParser(UpdateCallback):
self.in_note = 0 self.in_note = 0
self.in_stext = 0 self.in_stext = 0
self.in_scomments = 0 self.in_scomments = 0
self.note_text = None
self.note_tags = []
self.in_witness = False self.in_witness = False
self.db = database self.db = database
self.photo = None self.photo = None
@@ -432,107 +434,110 @@ class GrampsParser(UpdateCallback):
self.eidswap = {} self.eidswap = {}
self.func_map = { self.func_map = {
"address" : (self.start_address, self.stop_address), "address": (self.start_address, self.stop_address),
"addresses" : (None, None), "addresses": (None, None),
"childlist" : (None, None), "childlist": (None, None),
"aka" : (self.start_name, self.stop_aka), "aka": (self.start_name, self.stop_aka),
"attribute" : (self.start_attribute, self.stop_attribute), "attribute": (self.start_attribute, self.stop_attribute),
"attr_type" : (None, self.stop_attr_type), "attr_type": (None, self.stop_attr_type),
"attr_value" : (None, self.stop_attr_value), "attr_value": (None, self.stop_attr_value),
"bookmark" : (self.start_bmark, None), "bookmark": (self.start_bmark, None),
"bookmarks" : (None, None), "bookmarks": (None, None),
"format" : (self.start_format, None), "format": (self.start_format, None),
"name-formats" : (None, None), "name-formats": (None, None),
"child" : (self.start_child, None), "child": (self.start_child, None),
"childof" : (self.start_childof, None), "childof": (self.start_childof, None),
"childref" : (self.start_childref, self.stop_childref), "childref": (self.start_childref, self.stop_childref),
"personref" : (self.start_personref, self.stop_personref), "personref": (self.start_personref, self.stop_personref),
"city" : (None, self.stop_city), "city": (None, self.stop_city),
"county" : (None, self.stop_county), "county": (None, self.stop_county),
"country" : (None, self.stop_country), "country": (None, self.stop_country),
"comment" : (None, self.stop_comment), "comment": (None, self.stop_comment),
"created" : (self.start_created, None), "created": (self.start_created, None),
"ref" : (None, self.stop_ref), "ref": (None, self.stop_ref),
"database" : (self.start_database, self.stop_database), "database": (self.start_database, self.stop_database),
"phone" : (None, self.stop_phone), "phone": (None, self.stop_phone),
"date" : (None, self.stop_date), "date": (None, self.stop_date),
"cause" : (None, self.stop_cause), "cause": (None, self.stop_cause),
"description": (None, self.stop_description), "description": (None, self.stop_description),
"event" : (self.start_event, self.stop_event), "event": (self.start_event, self.stop_event),
"type" : (None, self.stop_type), "type": (None, self.stop_type),
"witness" : (self.start_witness, self.stop_witness), "witness": (self.start_witness, self.stop_witness),
"eventref" : (self.start_eventref, self.stop_eventref), "eventref": (self.start_eventref, self.stop_eventref),
"data_item" : (self.start_data_item, None), "data_item": (self.start_data_item, None),
"families" : (None, self.stop_families), "families": (None, self.stop_families),
"family" : (self.start_family, self.stop_family), "family": (self.start_family, self.stop_family),
"rel" : (self.start_rel, None), "rel": (self.start_rel, None),
"region" : (self.start_region, None), "region": (self.start_region, None),
"father" : (self.start_father, None), "father": (self.start_father, None),
"first" : (None, self.stop_first), "first": (None, self.stop_first),
"call" : (None, self.stop_call), "call": (None, self.stop_call),
"gender" : (None, self.stop_gender), "gender": (None, self.stop_gender),
"header" : (None, None), "header": (None, None),
"last" : (self.start_last, self.stop_last), "last": (self.start_last, self.stop_last),
"map" : (self.start_namemap, None), "map": (self.start_namemap, None),
"mediapath" : (None, self.stop_mediapath), "mediapath": (None, self.stop_mediapath),
"mother" : (self.start_mother, None), "mother": (self.start_mother, None),
"name" : (self.start_name, self.stop_name), "name": (self.start_name, self.stop_name),
"namemaps" : (None, None), "namemaps": (None, None),
"nick" : (None, self.stop_nick), "nick": (None, self.stop_nick),
"note" : (self.start_note, self.stop_note), "note": (self.start_note, self.stop_note),
"noteref" : (self.start_noteref, None), "noteref": (self.start_noteref, None),
"p" : (None, self.stop_ptag), "p": (None, self.stop_ptag),
"parentin" : (self.start_parentin, None), "parentin": (self.start_parentin, None),
"people" : (self.start_people, self.stop_people), "people": (self.start_people, self.stop_people),
"person" : (self.start_person, self.stop_person), "person": (self.start_person, self.stop_person),
"img" : (self.start_photo, self.stop_photo), "img": (self.start_photo, self.stop_photo),
"objref" : (self.start_objref, self.stop_objref), "objref": (self.start_objref, self.stop_objref),
"object" : (self.start_object, self.stop_object), "object": (self.start_object, self.stop_object),
"file" : (self.start_file, None), "file": (self.start_file, None),
"place" : (self.start_place, self.stop_place), "place": (self.start_place, self.stop_place),
"dateval" : (self.start_dateval, None), "dateval": (self.start_dateval, None),
"daterange" : (self.start_daterange, None), "daterange": (self.start_daterange, None),
"datespan" : (self.start_datespan, None), "datespan": (self.start_datespan, None),
"datestr" : (self.start_datestr, None), "datestr": (self.start_datestr, None),
"places" : (None, self.stop_places), "places": (None, self.stop_places),
"placeobj" : (self.start_placeobj, self.stop_placeobj), "placeobj": (self.start_placeobj, self.stop_placeobj),
"ptitle" : (None, self.stop_ptitle), "ptitle": (None, self.stop_ptitle),
"location" : (self.start_location, None), "location": (self.start_location, None),
"lds_ord" : (self.start_lds_ord, self.stop_lds_ord), "lds_ord": (self.start_lds_ord, self.stop_lds_ord),
"temple" : (self.start_temple, None), "temple": (self.start_temple, None),
"status" : (self.start_status, None), "status": (self.start_status, None),
"sealed_to" : (self.start_sealed_to, None), "sealed_to": (self.start_sealed_to, None),
"coord" : (self.start_coord, None), "coord": (self.start_coord, None),
"patronymic" : (None, self.stop_patronymic), "patronymic": (None, self.stop_patronymic),
"pos" : (self.start_pos, None), "pos": (self.start_pos, None),
"postal" : (None, self.stop_postal), "postal": (None, self.stop_postal),
"researcher" : (None, self.stop_research), "range": (self.start_range, None),
"resname" : (None, self.stop_resname ), "researcher": (None, self.stop_research),
"resaddr" : (None, self.stop_resaddr ), "resname": (None, self.stop_resname ),
"rescity" : (None, self.stop_rescity ), "resaddr": (None, self.stop_resaddr ),
"resstate" : (None, self.stop_resstate ), "rescity": (None, self.stop_rescity ),
"rescountry" : (None, self.stop_rescountry), "resstate": (None, self.stop_resstate ),
"respostal" : (None, self.stop_respostal), "rescountry": (None, self.stop_rescountry),
"resphone" : (None, self.stop_resphone), "respostal": (None, self.stop_respostal),
"resemail" : (None, self.stop_resemail), "resphone": (None, self.stop_resphone),
"sauthor" : (None, self.stop_sauthor), "resemail": (None, self.stop_resemail),
"sabbrev" : (None, self.stop_sabbrev), "sauthor": (None, self.stop_sauthor),
"scomments" : (None, self.stop_scomments), "sabbrev": (None, self.stop_sabbrev),
"source" : (self.start_source, self.stop_source), "scomments": (None, self.stop_scomments),
"sourceref" : (self.start_sourceref, self.stop_sourceref), "source": (self.start_source, self.stop_source),
"sources" : (None, None), "sourceref": (self.start_sourceref, self.stop_sourceref),
"spage" : (None, self.stop_spage), "sources": (None, None),
"spubinfo" : (None, self.stop_spubinfo), "spage": (None, self.stop_spage),
"state" : (None, self.stop_state), "spubinfo": (None, self.stop_spubinfo),
"stext" : (None, self.stop_stext), "state": (None, self.stop_state),
"stitle" : (None, self.stop_stitle), "stext": (None, self.stop_stext),
"street" : (None, self.stop_street), "stitle": (None, self.stop_stitle),
"suffix" : (None, self.stop_suffix), "street": (None, self.stop_street),
"title" : (None, self.stop_title), "suffix": (None, self.stop_suffix),
"url" : (self.start_url, None), "tag": (self.start_tag, None),
"repository" : (self.start_repo, self.stop_repo), "text": (None, self.stop_text),
"reporef" : (self.start_reporef, self.stop_reporef), "title": (None, self.stop_title),
"rname" : (None, self.stop_rname), "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): def find_person_by_gramps_id(self, gramps_id):
@@ -1317,6 +1322,21 @@ class GrampsParser(UpdateCallback):
self.name.prefix = attrs.get('prefix', '') self.name.prefix = attrs.get('prefix', '')
self.name.group_as = attrs.get('group', '') 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): def start_note(self, attrs):
self.in_note = 0 self.in_note = 0
if 'handle' in attrs: if 'handle' in attrs:
@@ -1339,6 +1359,13 @@ class GrampsParser(UpdateCallback):
self.info.add('merge-overwrite', NOTE_KEY, self.note) self.info.add('merge-overwrite', NOTE_KEY, self.note)
self.note.format = int(attrs.get('format', gen.lib.Note.FLOWED)) self.note.format = int(attrs.get('format', gen.lib.Note.FLOWED))
self.note.type.set_from_xml_str(attrs['type']) 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: else:
# GRAMPS LEGACY: old notes that were written inside other objects # GRAMPS LEGACY: old notes that were written inside other objects
# We need to create a top-level note, it's type depends on # We need to create a top-level note, it's type depends on
@@ -2174,14 +2201,20 @@ class GrampsParser(UpdateCallback):
attr.set_value(tag) attr.set_value(tag)
self.person.add_attribute(attr) self.person.add_attribute(attr)
def stop_text(self, tag):
self.note_text = tag
def stop_note(self, tag): def stop_note(self, tag):
self.in_note = 0 self.in_note = 0
if self.use_p: if self.use_p:
self.use_p = 0 self.use_p = 0
text = fix_spaces(self.note_list) text = fix_spaces(self.note_list)
elif self.note_text is not None:
text = self.note_text
else: else:
text = tag text = tag
self.note.set(text)
self.note.set_styledtext(gen.lib.StyledText(text, self.note_tags))
if self.address: if self.address:
self.address.add_note(self.note.handle) self.address.add_note(self.note.handle)