from gi.repository import GObject, Gtk, Pango from xml.etree import ElementTree as ET class Section: def __init__(self, name, start, end): self.name = name self.start = start self.end = end class Word: def __init__(self, text, start, end): self.text = text self.start = start self.end = end class XmlView(Gtk.ScrolledWindow): def __init__(self, filename): super(XmlView, self).__init__() self.sections = [] self.words = [] self.view = Gtk.TextView() self.view.set_editable(False) self.view.set_cursor_visible(False) self.buffer = self.view.get_buffer() self.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.ALWAYS) self.add_with_viewport(self.view) #self.inactive_section = self.buffer.create_tag("inactive_section", background="#ffffff") self.active_section = self.buffer.create_tag("active_section", background="red") self.section_title = self.buffer.create_tag("section_title", scale=2, weight=Pango.Weight.BOLD, justification=Gtk.Justification.CENTER) self.subsection_title = self.buffer.create_tag("subsection_title", scale=1.5, weight=Pango.Weight.BOLD, justification=Gtk.Justification.CENTER) self.parse_xml(filename) self.last_section = None self.show_section(0) def get_view(self): return self def parse_sequence(self, sequence, name): self.buffer.insert_with_tags(self.buffer.get_end_iter(), 'Sequence %s\n' % name, self.subsection_title) text = str(sequence.text) for node in sequence: text += node.text text += node.tail for line in text.split('\n'): line = line.strip() if line != '': self.buffer.insert_with_tags(self.buffer.get_end_iter(), ' %s\n' % line) def parse_section(self, section): name = section.get('id') section_start = self.buffer.create_mark('section-start %s' % name, self.buffer.get_end_iter(), True) self.buffer.insert_with_tags(self.buffer.get_end_iter(), 'Section %s\n' % section.get('id'), self.section_title) num = 1 for sequence in section.findall('./sequence'): self.parse_sequence(sequence, section.get('id') + '.' + str(num)) num += 1 self.sections.append(Section(name, section_start, self.buffer.create_mark('section-end %s' % name, self.buffer.get_end_iter(), True))) def parse_xml(self, filename): root = ET.parse(filename) treestore = Gtk.TreeStore(str) for section in root.findall(".//section"): self.parse_section(section) return treestore def show_section(self, section): if self.last_section != None: self.buffer.remove_tag(self.active_section, self.buffer.get_iter_at_mark(self.sections[self.last_section].start), self.buffer.get_iter_at_mark(self.sections[self.last_section].end)) self.last_section = section self.buffer.apply_tag(self.active_section, self.buffer.get_iter_at_mark(self.sections[section].start), self.buffer.get_iter_at_mark(self.sections[section].end))