def PrintMedia(self, thumbs, mediapath): """ Print some media infos via HTML class (Gramps) """ LOG.info('Looking at media...') # Web page filename extensions _WEB_EXT = ['.html', '.htm', '.shtml', '.php', '.php3', '.cgi'] # page title title = _('Gallery') fname = os.path.join(USER_PLUGINS, 'lxml', _('Gallery.html')) of = open(fname, "w") LOG.info('Empty "Gallery.hml" file created') # htmlinstance = page # ignored by current code... lang = xml_lang() page, head, body = Html.page(title, encoding='utf-8', lang=str(lang)) head = body = "" self.text = [] self.XHTMLWriter(fname, page, head, body, of, thumbs, mediapath) LOG.info('End (Media)')
def PrintMedia(self, thumbs, mediapath): """ Print some media infos via HTML class (Gramps) """ LOG.info("Looking at media...") # Web page filename extensions _WEB_EXT = [".html", ".htm", ".shtml", ".php", ".php3", ".cgi"] # page title title = _("Gallery") fname = os.path.join(USER_PLUGINS, "lxml", _("Gallery.html")) of = open(fname, "w") LOG.info('Empty "Gallery.hml" file created') # htmlinstance = page # ignored by current code... lang = xml_lang() page, head, body = Html.page(title, encoding="utf-8", lang=str(lang)) head = body = "" self.text = [] self.XHTMLWriter(fname, page, head, body, of, thumbs, mediapath) LOG.info("End (Media)")
def open(self): """ overwrite method, htmlbackend creates a html object that is written on close """ try: DocBackend.open(self) except IOError as msg: errmsg = "%s\n%s" % (_("Could not create %s") % self._filename, msg) raise ReportError(errmsg) except: raise ReportError(_("Could not create %s") % self._filename) if not os.path.isdir(self.datadirfull()): try: os.mkdir(self.datadirfull()) except IOError as msg: errmsg = "%s\n%s" % (_("Could not create %s") % self.datadirfull(), msg) raise ReportError(errmsg) except: raise ReportError(_("Could not create %s") % self.datadirfull()) self.html_page, self.html_header, self.html_body = Html.page( lang=xml_lang(), title=self.title)
def WriteXML(self, log, first, last, surnames, places, sources): """ Write the result of the query for distributed, shared protocols """ # Custom XML file in buffer self.lang = xml_lang() self.title = _('I am looking at ...') self.footer = _('Content generated by Gramps') self.surnames_title = _('Surnames') self.places_name = _('Places') self.sources_title = _('List of sources') time = date.Today() xml = etree.Element("query") xml.set("lang", self.lang) xml.set("title", self.title) xml.set("footer", self.footer) xml.set("date", gramps.gen.datehandler.displayer.display(time)) xml.set("first", first) xml.set("last", last) # only for info doc = etree.ElementTree(xml) # custom countries list (re-use some Gramps translations ...) ;) countries = [ '', _('Australia'), _('Brazil'), _('Bulgaria'), _('Canada'), _('Chile'), _('China'), _('Croatia'), _('Czech Republic'), _('England'), _('Finland'), _('France'), _('Germany'), _('India'), _('Japan'), _('Norway'), _('Portugal'), _('Russia'), _('Sweden'), _('United States of America'), ] c = etree.SubElement(xml, "clist") self.name = _('Name') self.country = _('Country') c.set("pname", self.name) c.set("country", self.country) for country in countries: c1 = etree.SubElement(c, "country") c1.text = country # data log [(k1, v1), (k2, v2)] = log l = etree.SubElement(xml, "log") l.set("date", v1) l.set("version", v2) s = etree.SubElement(xml, "surnames") s.set("title", self.surnames_title) surnames.sort() cnt = [] for surname in surnames: if surname not in cnt: s1 = etree.SubElement(s, "surname") s1.text = surname cnt.append(surname) p = etree.SubElement(xml, "places") p.set("pname", self.places_name) places.sort() for place in places: p1 = etree.SubElement(p, "place") p1.text = place src = etree.SubElement(xml, "sources") src.set("title", self.sources_title) sources.sort() for source in sources: src1 = etree.SubElement(src, "source") src1.text = source content = etree.XML(etree.tostring(xml, encoding="UTF-8")) # XSLT process xslt_doc = etree.parse( os.path.join(USER_PLUGINS, 'lxml', 'query_html.xsl')) transform = etree.XSLT(xslt_doc) outdoc = transform(content) #print(type(outdoc)) html = os.path.join(USER_PLUGINS, 'lxml', 'query.html') outfile = open(html, 'w') outfile.write(str(outdoc)) outfile.close() # clear the etree content.clear() # This is the end ! sys.stdout.write(_('1. Has generated "%s".\n') % html) LOG.info( _('Try to open\n "%s"\n into your prefered web navigator ...') % html) display_url(html)
def ParseXML(self, tree, filename): """ Parse the validated .gramps """ root = tree.getroot() # GtkTextView ; buffer limitation ... self.text.set_text(_('Parsing file...')) #LOG.info(etree.tostring(root, pretty_print=True)) # namespace issues ! namespace = root.nsmap surname_tag = etree.SubElement(root, NAMESPACE + 'surname') pname_tag = etree.SubElement(root, NAMESPACE + 'pname') private_surname = config.get('preferences.private-surname-text') private_record = config.get('preferences.private-record-text') # variable expr = "//*[local-name() = $name]" # count function # float and seems to also count the parent tag: name[0] ! count_elements = etree.XPath("count(//*[local-name() = $name])") # textual children strings function desc = etree.XPath('descendant-or-self::text()') # TODO: cleanup ! # quick but not a nice method ... msg = [] #tags = [] places = [] sources = [] surnames = [] timestamp = [] thumbs = [] LOG.info('start iteration') for one in root.iter(): #(tag, item) = one.tag, one.items() #print(tag, item) for two in one.iter(): #tags.append(two.tag) msg.append(two.items()) if two.tag == NAMESPACE + 'mediapath': mediapath = two.text else: mediapath = '' # privacy if two.get('priv'): # XML: optional text = private_record else: text = "" # search ptitle and time log for three in two.iter(): # timestamp if two.get('change'): timestamp.append(two.get('change')) # with namespace ... #print(desc(three)) (tag, items) = three.tag, three.items() if three.tag == NAMESPACE + 'ptitle': if text != private_record: text = str(three.text) if text not in places: places.append(text) # temp display if three.tag == NAMESPACE + 'pname': if text != private_record: text = str(three.attrib.get('value')) translation = str(three.attrib.get('lang')) if translation == 'None': translation = xml_lang()[0:2] text = text + _(' - (? or %(lang)s)') % { 'lang': translation } else: text = text + _(' - (%(lang)s)') % { 'lang': translation } if text not in places: places.append(text) # temp display if three.tag == NAMESPACE + 'stitle' and three.text not in sources: # need to add an exception if not three.text: three.text = "" sources.append(three.text) if three.tag == NAMESPACE + 'file' and three.items( ) not in thumbs: thumbs.append(three.items()) # search last name for four in three.iter(): # with namespace ... if four.tag == NAMESPACE + 'surname' and four.text != None: if text != private_record: surnames.append(four.text) else: surnames.append(private_surname) LOG.info('end of loops') # All tags #print(tags) # keys, values; no textual data; # root child level items as keys for revision control ??? #revision = msg #print(revision) log = msg[2] if not log: ErrorDialog( _('Missing header'), _('Not a valid .gramps.\n' 'Cannot run the gramplet...\n' 'Please, try to use a .gramps\n' 'generated by Gramps 5.1.')) LOG.error('header missing') return # dirty XML write method ... # need to create a fake entry ! if int(count_elements(root, name='surname')) > 1: nb_surnames = int(count_elements(root, name='surname')) else: nb_surnames = surnames = [_('0')] if int(count_elements(root, name='pname')) > 1: nb_pnames = int(count_elements(root, name='pname')) else: nb_pnames = places = [_('0')] if int(count_elements(root, name='note')) > 1: nb_notes = int(count_elements(root, name='note')) else: nb_notes = _('0') if int(count_elements(root, name='stitle')) > 1: nb_sources = int(count_elements(root, name='stitle')) else: nb_sources = _('0') # time logs timestamp.sort() start = timestamp[0] end = timestamp[-1] timestamp = [] first = epoch(start) last = epoch(end) header = _('File parsed with') + ' LXML' + str(LXML_VERSION) + '\n\n' [(k1, v1), (k2, v2)] = log file_info = _('File was generated on ') + v1 + '\n\t' + _( ' by Gramps ') + v2 + '\n\n' period = _('Period: ') + first + ' => ' + last + '\n\n' su = '\t' + str(nb_surnames) + '\t' + _( ' entries for surname(s); no frequency yet') + '\n' p = '\t' + str(nb_pnames) + '\t' + _(' entries for place(s)') + '\n' n = '\t' + str(nb_notes) + '\t' + _(' note(s)') + '\n' so = '\t' + str(nb_sources) + '\t' + _(' source(s)') + '\n\n' counters = su + p + n + so libs = 'LIBXML' + str(LIBXML_VERSION) + '\tLIBXSLT' + str( LIBXSLT_VERSION) # GtkTextView self.text.set_text(header + file_info + period + counters + libs) LOG.info('### NEW FILES ###') LOG.info('content parsed and copied') self.WriteXML(log, first, last, surnames, places, sources) self.PrintMedia(thumbs, mediapath) images = os.path.join(USER_PLUGINS, 'lxml', _('Gallery.html')) sys.stdout.write( _('2. Has generated a media index on "%(file)s".\n') % {'file': images}) self.WriteBackXML(filename, root, surnames, places, sources) sys.stdout.write( _('3. Has written entries into "%(file)s".\n') % {'file': filename})
def WriteXML(self, log, first, last, surnames, places, sources): """ Write the result of the query for distributed, shared protocols """ # Custom XML file in buffer self.lang = xml_lang() self.title = _('I am looking at ...') self.footer = _('Content generated by Gramps') self.surnames_title = _('Surnames') self.places_name = _('Places') self.sources_title = _('List of sources') time = date.Today() xml = etree.Element("query") xml.set("lang", self.lang) xml.set("title", self.title) xml.set("footer", self.footer) xml.set("date", gramps.gen.datehandler.displayer.display(time)) xml.set("first", first) xml.set("last", last) # only for info doc = etree.ElementTree(xml) # custom countries list (re-use some Gramps translations ...) ;) countries = ['', _('Australia'), _('Brazil'), _('Bulgaria'), _('Canada'), _('Chile'), _('China'), _('Croatia'), _('Czech Republic'), _('England'), _('Finland'), _('France'), _('Germany'), _('India'), _('Japan'), _('Norway'), _('Portugal'), _('Russia'), _('Sweden'), _('United States of America'), ] c = etree.SubElement(xml, "clist") self.name = _('Name') self.country = _('Country') c.set("pname", self.name) c.set("country", self.country) for country in countries: c1 = etree.SubElement(c, "country") c1.text = country # data log [(k1, v1),(k2, v2)] = log l = etree.SubElement(xml, "log") l.set("date", v1) l.set("version", v2) s = etree.SubElement(xml, "surnames") s.set("title", self.surnames_title) surnames.sort() cnt = [] for surname in surnames: if surname not in cnt: s1 = etree.SubElement(s, "surname") s1.text = surname cnt.append(surname) p = etree.SubElement(xml, "places") p.set("pname", self.places_name) places.sort() for place in places: p1 = etree.SubElement(p, "place") p1.text = place src = etree.SubElement(xml, "sources") src.set("title", self.sources_title) sources.sort() for source in sources: src1 = etree.SubElement(src, "source") src1.text = source content = etree.XML(etree.tostring(xml, encoding="UTF-8")) # XSLT process xslt_doc = etree.parse(os.path.join(USER_PLUGINS, 'lxml', 'query_html.xsl')) transform = etree.XSLT(xslt_doc) outdoc = transform(content) #print(type(outdoc)) html = os.path.join(USER_PLUGINS, 'lxml', 'query.html') outfile = open(html, 'w') outfile.write(str(outdoc)) outfile.close() # clear the etree content.clear() # This is the end ! sys.stdout.write(_('1. Has generated "%s".\n') % html) LOG.info(_('Try to open\n "%s"\n into your prefered web navigator ...') % html) display_url(html)