# Produce necessary xml files to generate Qt Help collection. # Arguments: # * fname: the base name of the Help Project (.qhp) and Help Collection Project (.qhcp) files to be generated # * htmldir: path of the directory containing html documentation files, relative to fname import sys import lxml.html as lh import lxml.etree as etree if len(sys.argv) < 3: sys.exit('Usage: %s fname htmldir' % sys.argv[0]) # Parameters fname = sys.argv[1] htmldir = sys.argv[2] title = 'Interpreter Manual' version = '1.0' namespace = 'octave.org.interpreter.1.0' # Utility functions def get_toc (node): toc = list () for li in node.iterchildren('li'): item = dict () for a in li.iter('a'): item['name'] = a.text_content () item['link'] = a.attrib['href'] break for ul in li.iter('ul'): item['children'] = get_toc (ul) break toc.append(item) return toc def populate_toc (node, toc, hdir): for item in toc: selt = etree.SubElement (node, 'section') selt.attrib['title'] = item['name'] selt.attrib['ref'] = hdir + '/' +item['link'] if (item.has_key('children')): populate_toc (selt, item['children'], hdir) def get_keywords (node): out = list () keys = list () for code in node.iter('code'): item = dict () a = code.getparent () key = code.text_content () # Only retain the first entry for a given keyword if (key not in keys): keys.append (key) item['name'] = key item['link'] = a.attrib['href'] out.append(item) return out def populate_keywords (node, ref, hdir): for item in ref: selt = etree.SubElement (node, 'keyword') selt.attrib['name'] = item['name'] selt.attrib['ref'] = hdir + '/' + item['link'] # Parse index.html to retrieve the table of contents url = htmldir + '/index.html' node = lh.parse(url).getroot () for elt in node.iter('div'): if (elt.attrib.has_key('class') and elt.attrib['class'] == 'contents'): node = elt for elt in node.iter('ul'): if elt.attrib['class'] == 'no-bullet': node = elt break break toc = get_toc (node); # Parse Function-Index.html to retrieve the function reference url = htmldir + '/Function-Index.html' node = lh.parse(url).getroot () for elt in node.iter('table'): if (elt.attrib.has_key('class') and elt.attrib['class'] == 'index-fn'): node = elt break ref = get_keywords (node) # Prepare Qt Help Project document root = etree.Element("QtHelpProject") root.attrib['version'] = version elt = etree.SubElement (root, 'namespace') elt.text = namespace elt = etree.SubElement (root, 'virtualFolder') elt.text = 'doc' elt = etree.SubElement (root, 'customFilter') elt.attrib['name'] = 'Interpreter 1.0' selt = etree.SubElement (elt, 'filterAttribute') selt.text = 'interpreter' selt = etree.SubElement (elt, 'filterAttribute') selt.text = '1.0' elt = etree.SubElement (root, 'filterSection') selt = etree.SubElement (elt, 'filterAttribute') selt.text = 'interpreter' selt = etree.SubElement (elt, 'filterAttribute') selt.text = '1.0' selt = etree.SubElement (elt, 'toc') sselt = etree.SubElement (selt, 'section') sselt.attrib['title'] = title populate_toc (sselt, toc, htmldir) selt = etree.SubElement (elt, 'keywords') populate_keywords (selt, ref, htmldir) selt = etree.SubElement (elt, 'files') sselt = etree.SubElement (selt, 'file') sselt.text = htmldir + '/*.html' sselt = etree.SubElement (selt, 'file') sselt.text = htmldir + '/*.png' fid = open (fname + '.qhp', 'w+') fid.write ('\n') fid.write (etree.tostring (root, pretty_print = True)) fid.close () # Prepare Qt Help Collection Project document root = etree.Element("QHelpCollectionProject") root.attrib['version'] = version elt = etree.SubElement (root, 'docFiles') selt = etree.SubElement (elt, 'generate') sselt = etree.SubElement (selt, 'file') ssselt = etree.SubElement (sselt, 'input') ssselt.text = fname + '.qhp' ssselt = etree.SubElement (sselt, 'output') ssselt.text = fname + '.qch' selt = etree.SubElement (elt, 'register') sselt = etree.SubElement (selt, 'file') sselt.text = fname + '.qch' fid = open (fname + '.qhcp', 'w+') fid.write ('\n') fid.write (etree.tostring (root, pretty_print = True)) fid.close ()