Cleanup serialization
This commit is contained in:
parent
401dca032c
commit
9b14f7e578
@ -57,20 +57,13 @@ class RichTextToolbar(gtk.Toolbar):
|
|||||||
self.buf.unapply_tag(tag_name)
|
self.buf.unapply_tag(tag_name)
|
||||||
|
|
||||||
class RichTextHandler(xml.sax.handler.ContentHandler):
|
class RichTextHandler(xml.sax.handler.ContentHandler):
|
||||||
def __init__(self, buf):
|
def __init__(self, serializer, buf):
|
||||||
self.buf = buf
|
self.buf = buf
|
||||||
|
self.serializer = serializer
|
||||||
self.tags = []
|
self.tags = []
|
||||||
|
|
||||||
def _deserialize_element(self, el_name):
|
|
||||||
if el_name == "bold":
|
|
||||||
return "bold"
|
|
||||||
elif el_name == "italic":
|
|
||||||
return "italic"
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
def startElement(self, name, attributes):
|
def startElement(self, name, attributes):
|
||||||
tag = self._deserialize_element(name)
|
tag = self.serializer.deserialize_element(name)
|
||||||
if tag:
|
if tag:
|
||||||
self.tags.append(tag)
|
self.tags.append(tag)
|
||||||
|
|
||||||
@ -84,21 +77,37 @@ class RichTextHandler(xml.sax.handler.ContentHandler):
|
|||||||
self.buf.apply_tag_by_name(tag, start_it, it)
|
self.buf.apply_tag_by_name(tag, start_it, it)
|
||||||
|
|
||||||
def endElement(self, name):
|
def endElement(self, name):
|
||||||
tag = self._deserialize_element(name)
|
tag = self.serializer.deserialize_element(name)
|
||||||
if tag:
|
if tag:
|
||||||
self.tags.remove(tag)
|
self.tags.remove(tag)
|
||||||
|
|
||||||
class RichTextSerializer:
|
class RichTextSerializer:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._open_xml_tags = []
|
self._open_tags = []
|
||||||
|
|
||||||
def _get_xml_tag(self, tag):
|
def deserialize_element(self, el_name):
|
||||||
if tag.get_property("name") == "bold":
|
if el_name == "bold":
|
||||||
return "bold"
|
return "bold"
|
||||||
elif tag.get_property("name") == "italic":
|
elif el_name == "italic":
|
||||||
return "italic"
|
return "italic"
|
||||||
else:
|
else:
|
||||||
return "unknown_tag"
|
return None
|
||||||
|
|
||||||
|
def serialize_tag_start(self, tag):
|
||||||
|
if tag.get_property("name") == "bold":
|
||||||
|
return "<bold>"
|
||||||
|
elif tag.get_property("name") == "italic":
|
||||||
|
return "<italic>"
|
||||||
|
else:
|
||||||
|
return "<unknown>"
|
||||||
|
|
||||||
|
def serialize_tag_end(self, tag):
|
||||||
|
if tag.get_property("name") == "bold":
|
||||||
|
return "</bold>"
|
||||||
|
elif tag.get_property("name") == "italic":
|
||||||
|
return "</italic>"
|
||||||
|
else:
|
||||||
|
return "</unknown>"
|
||||||
|
|
||||||
def serialize(self, buf):
|
def serialize(self, buf):
|
||||||
xml = "<richtext>"
|
xml = "<richtext>"
|
||||||
@ -109,32 +118,26 @@ class RichTextSerializer:
|
|||||||
if not next_it.forward_to_tag_toggle(None):
|
if not next_it.forward_to_tag_toggle(None):
|
||||||
next_it = buf.get_end_iter()
|
next_it = buf.get_end_iter()
|
||||||
|
|
||||||
reopen_xml_tags = []
|
reopen_tags = []
|
||||||
for tag in it.get_toggled_tags(False):
|
for tag in it.get_toggled_tags(False):
|
||||||
xml_tag = self._get_xml_tag(tag)
|
|
||||||
while 1:
|
while 1:
|
||||||
open_xml_tag = self._open_xml_tags.pop()
|
open_tag = self._open_tags.pop()
|
||||||
if open_xml_tag != xml_tag:
|
if open_tag != tag:
|
||||||
xml += "</" + open_xml_tag + ">"
|
xml += self.serialize_tag_end(open_tag)
|
||||||
reopen_xml_tags.append(open_xml_tag)
|
reopen_tags.append(open_tag)
|
||||||
else:
|
else:
|
||||||
xml += "</" + xml_tag + ">"
|
xml += self.serialize_tag_end(tag)
|
||||||
break
|
break
|
||||||
|
|
||||||
for xml_tag in reopen_xml_tags:
|
for tag in reopen_tags + it.get_toggled_tags(True):
|
||||||
self._open_xml_tags.append(xml_tag)
|
self._open_tags.append(tag)
|
||||||
xml += "<" + xml_tag + ">"
|
xml += self.serialize_tag_start(tag)
|
||||||
|
|
||||||
for tag in it.get_toggled_tags(True):
|
|
||||||
xml_tag = self._get_xml_tag(tag)
|
|
||||||
self._open_xml_tags.append(xml_tag)
|
|
||||||
xml += "<" + xml_tag + ">"
|
|
||||||
|
|
||||||
xml += buf.get_text(it, next_it)
|
xml += buf.get_text(it, next_it)
|
||||||
|
|
||||||
if next_it.is_end():
|
if next_it.is_end():
|
||||||
for xml_tag in self._open_xml_tags:
|
for tag in self._open_tags:
|
||||||
xml += "</" + xml_tag + ">"
|
xml += self.serialize_tag_end(tag)
|
||||||
|
|
||||||
xml += "</richtext>"
|
xml += "</richtext>"
|
||||||
|
|
||||||
@ -142,7 +145,7 @@ class RichTextSerializer:
|
|||||||
|
|
||||||
def deserialize(self, xml_string, buf):
|
def deserialize(self, xml_string, buf):
|
||||||
parser = xml.sax.make_parser()
|
parser = xml.sax.make_parser()
|
||||||
handler = RichTextHandler(buf)
|
handler = RichTextHandler(self, buf)
|
||||||
parser.setContentHandler(handler)
|
parser.setContentHandler(handler)
|
||||||
parser.feed(xml_string)
|
parser.feed(xml_string)
|
||||||
parser.close()
|
parser.close()
|
||||||
|
Loading…
Reference in New Issue
Block a user