def build_hyperref(match): basename, extension = match.groups() outname = BASENAME_MAP.get(basename, basename) if '#' in extension: anchor = extension.split('#')[-1] return r"\hyperref[%s]" % anchor elif extension != 'html': return r'\href{http://lxml.de/%s.%s}' % (outname, extension) else: return r"\hyperref[_part_%s.tex]" % outname
def build_hyperref(match): basename, extension = match.groups() outname = BASENAME_MAP.get(basename, basename) if '#' in extension: anchor = extension.split('#')[-1] return r"\hyperref[%s]" % anchor elif extension != 'html': return r'\href{http://codespeak.net/lxml/%s.%s}' % ( outname, extension) else: return r"\hyperref[_part_%s.tex]" % outname
def publish(dirname, lxml_path, release): if not os.path.exists(dirname): os.mkdir(dirname) doc_dir = os.path.join(lxml_path, 'doc') script = os.path.join(doc_dir, 'rest2html.py') pubkey = os.path.join(doc_dir, 'pubkey.asc') stylesheet_url = 'style.css' shutil.copy(pubkey, dirname) href_map = HREF_MAP.copy() changelog_basename = 'changes-%s' % release href_map['Release Changelog'] = changelog_basename + '.html' trees = {} menu = Element("div", {"class":"sidemenu"}) # build HTML pages and parse them back for section, text_files in SITE_STRUCTURE: section_head = make_menu_section_head(section, menu) for filename in text_files: if filename.startswith('@'): # special menu entry page_title = filename[1:] url = href_map[page_title] build_menu_entry(page_title, url, section_head) else: path = os.path.join(doc_dir, filename) basename = os.path.splitext(os.path.basename(filename))[0] basename = BASENAME_MAP.get(basename, basename) outname = basename + '.html' outpath = os.path.join(dirname, outname) rest2html(script, path, outpath, stylesheet_url) tree = parse(outpath) trees[filename] = (tree, basename, outpath) build_menu(tree, basename, section_head) # also convert CHANGES.txt rest2html(script, os.path.join(lxml_path, 'CHANGES.txt'), os.path.join(dirname, 'changes-%s.html' % release), '') # integrate menu for tree, basename, outpath in trees.itervalues(): new_tree = merge_menu(tree, menu, basename) title = find_title_tag(new_tree) if title and title[0].text == 'lxml': title[0].text = "lxml - Processing XML and HTML with Python" new_tree.write(outpath)
def publish(dirname, lxml_path, release): if not os.path.exists(dirname): os.mkdir(dirname) doc_dir = os.path.join(lxml_path, 'doc') script = os.path.join(doc_dir, 'rest2html.py') pubkey = os.path.join(doc_dir, 'pubkey.asc') stylesheet_url = 'style.css' shutil.copy(pubkey, dirname) href_map = HREF_MAP.copy() changelog_basename = 'changes-%s' % release href_map['Release Changelog'] = changelog_basename + '.html' trees = {} menu = Element("div", {"class": "sidemenu"}) # build HTML pages and parse them back for section, text_files in SITE_STRUCTURE: section_head = make_menu_section_head(section, menu) for filename in text_files: if filename.startswith('@'): # special menu entry page_title = filename[1:] url = href_map[page_title] build_menu_entry(page_title, url, section_head) else: path = os.path.join(doc_dir, filename) basename = os.path.splitext(os.path.basename(filename))[0] basename = BASENAME_MAP.get(basename, basename) outname = basename + '.html' outpath = os.path.join(dirname, outname) rest2html(script, path, outpath, stylesheet_url) tree = parse(outpath) trees[filename] = (tree, basename, outpath) build_menu(tree, basename, section_head) # also convert CHANGES.txt rest2html(script, os.path.join(lxml_path, 'CHANGES.txt'), os.path.join(dirname, 'changes-%s.html' % release), '') # integrate menu for tree, basename, outpath in trees.itervalues(): new_tree = merge_menu(tree, menu, basename) title = find_title_tag(new_tree) if title and title[0].text == 'lxml': title[0].text = "lxml - Processing XML and HTML with Python" new_tree.write(outpath)
def publish(dirname, lxml_path, release): if not os.path.exists(dirname): os.mkdir(dirname) doc_dir = os.path.join(lxml_path, 'doc') script = os.path.join(doc_dir, 'rest2html.py') pubkey = os.path.join(doc_dir, 'pubkey.asc') stylesheet_url = 'style.css' shutil.copy(pubkey, dirname) href_map = HREF_MAP.copy() changelog_basename = 'changes-%s' % release href_map['Release Changelog'] = changelog_basename + '.html' menu_js = textwrap.dedent(''' function trigger_menu(event) { var sidemenu = document.getElementById("sidemenu"); var classes = sidemenu.getAttribute("class"); classes = (classes.indexOf(" visible") === -1) ? classes + " visible" : classes.replace(" visible", ""); sidemenu.setAttribute("class", classes); event.preventDefault(); event.stopPropagation(); } function hide_menu() { var sidemenu = document.getElementById("sidemenu"); var classes = sidemenu.getAttribute("class"); if (classes.indexOf(" visible") !== -1) { sidemenu.setAttribute("class", classes.replace(" visible", "")); } } ''') trees = {} menu = Element("div", {'class': 'sidemenu', 'id': 'sidemenu'}) SubElement(menu, 'div', {'class': 'menutrigger', 'onclick': 'trigger_menu(event)'}).text = "Menu" menu_div = SubElement(menu, 'div', {'class': 'menu'}) # build HTML pages and parse them back for section, text_files in SITE_STRUCTURE: section_head = make_menu_section_head(section, menu_div) for filename in text_files: if filename.startswith('@'): # special menu entry page_title = filename[1:] url = href_map[page_title] build_menu_entry(page_title, url, section_head) else: path = os.path.join(doc_dir, filename) basename = os.path.splitext(os.path.basename(filename))[0] basename = BASENAME_MAP.get(basename, basename) outname = basename + '.html' outpath = os.path.join(dirname, outname) rest2html(script, path, outpath, stylesheet_url) tree = parse(outpath) if filename == 'main.txt': # inject donation buttons #inject_flatter_button(tree) inject_donate_buttons(lxml_path, script, tree) trees[filename] = (tree, basename, outpath) build_menu(tree, basename, section_head) # also convert CHANGES.txt convert_changelog(lxml_path, os.path.join(dirname, 'changes-%s.html' % release), script, stylesheet_url) # generate sitemap from menu sitemap = XML(textwrap.dedent('''\ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Sitemap of lxml.de - Processing XML and HTML with Python</title> <meta content="lxml - the most feature-rich and easy-to-use library for processing XML and HTML in the Python language" name="description" /> <meta content="Python XML, XML, XML processing, HTML, lxml, simple XML, ElementTree, etree, lxml.etree, objectify, XML parsing, XML validation, XPath, XSLT" name="keywords" /> </head> <body> <h1>Sitemap of lxml.de - Processing XML and HTML with Python</h1> </body> </html> ''')) sitemap_menu = copy.deepcopy(menu) SubElement(SubElement(sitemap_menu[-1], 'li'), 'a', href='http://lxml.de/files/').text = 'Download files' sitemap[-1].append(sitemap_menu) # append to body ElementTree(sitemap).write(os.path.join(dirname, 'sitemap.html')) # integrate sitemap into the menu SubElement(SubElement(menu_div[-1], 'li'), 'a', href='/sitemap.html').text = 'Sitemap' # integrate menu into web pages for tree, basename, outpath in trees.values(): head = find_head(tree)[0] SubElement(head, 'script', type='text/javascript').text = menu_js SubElement(head, 'meta', name='viewport', content="width=device-width, initial-scale=1") find_body(tree)[0].set('onclick', 'hide_menu()') new_tree = merge_menu(tree, menu, basename) title = find_title_tag(new_tree) if title and title[0].text == 'lxml': title[0].text = "lxml - Processing XML and HTML with Python" heading = find_heading_tag(new_tree) if heading: heading[0].text = "lxml - XML and HTML with Python" new_tree.write(outpath)
def publish(dirname, lxml_path, release): if not os.path.exists(dirname): os.mkdir(dirname) doc_dir = os.path.join(lxml_path, 'doc') script = os.path.join(doc_dir, 'rest2html.py') pubkey = os.path.join(doc_dir, 'pubkey.asc') stylesheet_url = 'style.css' shutil.copy(pubkey, dirname) href_map = HREF_MAP.copy() changelog_basename = 'changes-%s' % release href_map['Release Changelog'] = changelog_basename + '.html' trees = {} menu = Element("div", {"class": "sidemenu"}) # build HTML pages and parse them back for section, text_files in SITE_STRUCTURE: section_head = make_menu_section_head(section, menu) for filename in text_files: if filename.startswith('@'): # special menu entry page_title = filename[1:] url = href_map[page_title] build_menu_entry(page_title, url, section_head) else: path = os.path.join(doc_dir, filename) basename = os.path.splitext(os.path.basename(filename))[0] basename = BASENAME_MAP.get(basename, basename) outname = basename + '.html' outpath = os.path.join(dirname, outname) rest2html(script, path, outpath, stylesheet_url) tree = parse(outpath) if filename == 'main.txt': # inject donation buttons #inject_flatter_button(tree) inject_donate_buttons(lxml_path, script, tree) trees[filename] = (tree, basename, outpath) build_menu(tree, basename, section_head) # also convert CHANGES.txt rest2html(script, os.path.join(lxml_path, 'CHANGES.txt'), os.path.join(dirname, 'changes-%s.html' % release), '') # generate sitemap from menu sitemap = XML('''\ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Sitemap of lxml.de - Processing XML and HTML with Python</title> <meta content="lxml - the most feature-rich and easy-to-use library for processing XML and HTML in the Python language" name="description" /> <meta content="Python XML, XML, XML processing, HTML, lxml, simple XML, ElementTree, etree, lxml.etree, objectify, XML parsing, XML validation, XPath, XSLT" name="keywords" /> </head> <body> <h1>Sitemap of lxml.de - Processing XML and HTML with Python</h1> </body> </html> '''.replace(' ', ' ')) sitemap_menu = copy.deepcopy(menu) SubElement(SubElement(sitemap_menu[-1], 'li'), 'a', href='http://lxml.de/files/').text = 'Download files' sitemap[-1].append(sitemap_menu) # append to body ElementTree(sitemap).write(os.path.join(dirname, 'sitemap.html')) # integrate sitemap into the menu SubElement(SubElement(menu[-1], 'li'), 'a', href='http://lxml.de/sitemap.html').text = 'Sitemap' # integrate menu into web pages for tree, basename, outpath in trees.itervalues(): new_tree = merge_menu(tree, menu, basename) title = find_title_tag(new_tree) if title and title[0].text == 'lxml': title[0].text = "lxml - Processing XML and HTML with Python" heading = find_heading_tag(new_tree) if heading: heading[0].text = "lxml - XML and HTML with Python" new_tree.write(outpath)
def publish(dirname, lxml_path, release): if not os.path.exists(dirname): os.mkdir(dirname) book_title = "lxml %s" % release doc_dir = os.path.join(lxml_path, 'doc') script = os.path.join(doc_dir, 'rest2latex.py') pubkey = os.path.join(doc_dir, 'pubkey.asc') shutil.copy(pubkey, dirname) # build pygments macros build_pygments_macros(os.path.join(dirname, '_part_pygments.tex')) # Used in postprocessing of generated LaTeX files header = [] titles = {} replace_interdoc_hyperrefs = re.compile( r'\\href\{([^/}]+)[.]([^./}]+)\}').sub replace_docinternal_hyperrefs = re.compile(r'\\href\{\\#([^}]+)\}').sub replace_image_paths = re.compile(r'^(\\includegraphics{)').sub def build_hyperref(match): basename, extension = match.groups() outname = BASENAME_MAP.get(basename, basename) if '#' in extension: anchor = extension.split('#')[-1] return r"\hyperref[%s]" % anchor elif extension != 'html': return r'\href{http://lxml.de/%s.%s}' % (outname, extension) else: return r"\hyperref[_part_%s.tex]" % outname def fix_relative_hyperrefs(line): line = replace_image_paths(r'\1../html/', line) if r'\href' not in line: return line line = replace_interdoc_hyperrefs(build_hyperref, line) return replace_docinternal_hyperrefs(r'\hyperref[\1]', line) # Building pages for section, text_files in SITE_STRUCTURE: for filename in text_files: if filename.startswith('@'): continue #page_title = filename[1:] #url = href_map[page_title] #build_menu_entry(page_title, url, section_head) basename = os.path.splitext(os.path.basename(filename))[0] basename = BASENAME_MAP.get(basename, basename) outname = basename + '.tex' outpath = os.path.join(dirname, outname) path = os.path.join(doc_dir, filename) print("Creating %s" % outname) rest2latex(script, path, outpath) final_name = os.path.join(dirname, os.path.dirname(outname), "_part_%s" % os.path.basename(outname)) title, hd = tex_postprocess(outpath, final_name, want_header=not header, process_line=fix_relative_hyperrefs) if not header: header = hd titles[outname] = title # integrate generated API docs print("Integrating API docs") apidocsname = 'api.tex' apipath = os.path.join(dirname, apidocsname) tex_postprocess(apipath, os.path.join(dirname, "_part_%s" % apidocsname), process_line=fix_relative_hyperrefs) copy_epydoc_macros(apipath, os.path.join(dirname, '_part_epydoc.tex'), set(header)) # convert CHANGES.txt print("Integrating ChangeLog") find_version_title = re.compile( r'(.*\\section\{)([0-9][^\} ]*)\s+\(([^)]+)\)(\}.*)').search def fix_changelog(line): m = find_version_title(line) if m: line = "%sChanges in version %s, released %s%s" % m.groups() else: line = line.replace(r'\subsection{', r'\subsection*{') return line chgname = 'changes-%s.tex' % release chgpath = os.path.join(dirname, chgname) rest2latex(script, os.path.join(lxml_path, 'CHANGES.txt'), chgpath) tex_postprocess(chgpath, os.path.join(dirname, "_part_%s" % chgname), process_line=fix_changelog) # Writing a master file print("Building %s\n" % TARGET_FILE) master = open(os.path.join(dirname, TARGET_FILE), "w") for hln in header: if hln.startswith(r"\documentclass"): #hln = hln.replace('article', 'book') hln = DOCUMENT_CLASS + EPYDOC_IMPORT elif hln.startswith(r"\begin{document}"): # pygments and epydoc support master.write(PYGMENTS_IMPORT) elif hln.startswith(r"\title{"): hln = replace_content( r'{%s\\\\\\vspace{1cm}\\includegraphics[width=2.5cm]{../html/tagpython-big.png}}' % book_title, hln) elif hln.startswith(r"\date{"): hln = replace_content(r'{%s}' % datetime.date.today().isoformat(), hln) elif hln.startswith("pdftitle"): hln = replace_content(r'{%s}' % book_title, hln) master.write(hln + '\n') master.write("\\setcounter{page}{2}\n") master.write("\\tableofcontents\n") for section, text_files in SITE_STRUCTURE: master.write("\n\n\\part{%s}\n" % section) for filename in text_files: if filename.startswith('@'): continue #print "Not yet implemented: %s" % filename[1:] #page_title = filename[1:] #url = href_map[page_title] #build_menu_entry(page_title, url, section_head) else: basename = os.path.splitext(os.path.basename(filename))[0] basename = BASENAME_MAP.get(basename, basename) outname = basename + '.tex' write_chapter(master, titles[outname], outname) master.write("\\appendix\n") master.write("\\begin{appendix}\n") write_chapter(master, "Changes", chgname) write_chapter(master, "Generated API documentation", apidocsname) master.write("\\end{appendix}\n") master.write("\\end{document}\n")
"--font-encoding=T1", "--output-encoding=utf-8", "--input-encoding=utf-8", "--graphicx-option=pdftex", ]) htmlnsmap = {"h": "http://www.w3.org/1999/xhtml"} replace_invalid = re.compile(r'[-_/.\s\\]').sub replace_content = re.compile("\{[^\}]*\}").sub replace_epydoc_macros = re.compile(r'(,\s*amssymb|dvips\s*,\s*)').sub replace_rst_macros = re.compile( r'(\\usepackage\{color}|\\usepackage\[[^]]*]\{hyperref})').sub BASENAME_MAP = BASENAME_MAP.copy() BASENAME_MAP.update({'api': 'lxmlapi'}) # LaTeX snippets DOCUMENT_CLASS = r""" \documentclass[10pt,english]{report} \usepackage[a4paper]{geometry} \usepackage{tabularx} \usepackage{ifthen} \usepackage[pdftex]{graphicx} \parindent0pt \parskip1ex %%% Fallback definitions for Docutils-specific commands
def publish(dirname, lxml_path, release): if not os.path.exists(dirname): os.mkdir(dirname) book_title = "lxml %s" % release doc_dir = os.path.join(lxml_path, 'doc') script = os.path.join(doc_dir, 'rest2latex.py') pubkey = os.path.join(doc_dir, 'pubkey.asc') shutil.copy(pubkey, dirname) # build pygments macros build_pygments_macros(os.path.join(dirname, '_part_pygments.tex')) # Used in postprocessing of generated LaTeX files header = [] titles = {} replace_interdoc_hyperrefs = re.compile( r'\\href\{([^/}]+)[.]([^./}]+)\}').sub replace_docinternal_hyperrefs = re.compile( r'\\href\{\\#([^}]+)\}').sub replace_image_paths = re.compile( r'^(\\includegraphics{)').sub def build_hyperref(match): basename, extension = match.groups() outname = BASENAME_MAP.get(basename, basename) if '#' in extension: anchor = extension.split('#')[-1] return r"\hyperref[%s]" % anchor elif extension != 'html': return r'\href{http://codespeak.net/lxml/%s.%s}' % ( outname, extension) else: return r"\hyperref[_part_%s.tex]" % outname def fix_relative_hyperrefs(line): line = replace_image_paths(r'\1../html/', line) if r'\href' not in line: return line line = replace_interdoc_hyperrefs(build_hyperref, line) return replace_docinternal_hyperrefs(r'\hyperref[\1]', line) # Building pages have_epydoc_macros = False for section, text_files in SITE_STRUCTURE: for filename in text_files: if filename.startswith('@'): continue #page_title = filename[1:] #url = href_map[page_title] #build_menu_entry(page_title, url, section_head) basename = os.path.splitext(os.path.basename(filename))[0] basename = BASENAME_MAP.get(basename, basename) outname = basename + '.tex' outpath = os.path.join(dirname, outname) path = os.path.join(doc_dir, filename) print "Creating %s" % outname rest2latex(script, path, outpath) final_name = os.path.join(dirname, os.path.dirname(outname), "_part_%s" % os.path.basename(outname)) title, hd = tex_postprocess(outpath, final_name, want_header = not header, process_line=fix_relative_hyperrefs) if not header: header = hd titles[outname] = title # integrate generated API docs print "Integrating API docs" apidocsname = 'api.tex' apipath = os.path.join(dirname, apidocsname) tex_postprocess(apipath, os.path.join(dirname, "_part_%s" % apidocsname), process_line=fix_relative_hyperrefs) copy_epydoc_macros(apipath, os.path.join(dirname, '_part_epydoc.tex'), set(header)) # convert CHANGES.txt print "Integrating ChangeLog" find_version_title = re.compile( r'(.*\\section\{)([0-9][^\} ]*)\s+\(([^)]+)\)(\}.*)').search def fix_changelog(line): m = find_version_title(line) if m: line = "%sChanges in version %s, released %s%s" % m.groups() else: line = line.replace(r'\subsection{', r'\subsection*{') return line chgname = 'changes-%s.tex' % release chgpath = os.path.join(dirname, chgname) rest2latex(script, os.path.join(lxml_path, 'CHANGES.txt'), chgpath) tex_postprocess(chgpath, os.path.join(dirname, "_part_%s" % chgname), process_line=fix_changelog) # Writing a master file print "Building %s\n" % TARGET_FILE master = file( os.path.join(dirname, TARGET_FILE), "w") for hln in header: if hln.startswith(r"\documentclass"): #hln = hln.replace('article', 'book') hln = DOCUMENT_CLASS elif hln.startswith("%% generator ") or hln.startswith("% generated "): master.write(EPYDOC_IMPORT) elif hln.startswith(r"\begin{document}"): # pygments and epydoc support master.write(PYGMENTS_IMPORT) elif hln.startswith(r"\title{"): hln = replace_content( r'{%s\\\\\\vspace{1cm}\\includegraphics[width=2.5cm]{../html/tagpython-big.png}}' % book_title, hln) elif hln.startswith(r"\date{"): hln = replace_content( r'{%s}' % datetime.date.today().isoformat(), hln) elif hln.startswith("pdftitle"): hln = replace_content( r'{%s}' % book_title, hln) master.write(hln) master.write("\\setcounter{page}{2}\n") master.write("\\tableofcontents\n") for section, text_files in SITE_STRUCTURE: master.write("\n\n\\part{%s}\n" % section) for filename in text_files: if filename.startswith('@'): continue #print "Not yet implemented: %s" % filename[1:] #page_title = filename[1:] #url = href_map[page_title] #build_menu_entry(page_title, url, section_head) else: basename = os.path.splitext(os.path.basename(filename))[0] basename = BASENAME_MAP.get(basename, basename) outname = basename + '.tex' write_chapter(master, titles[outname], outname) master.write("\\appendix\n") master.write("\\begin{appendix}\n") write_chapter(master, "Changes", chgname) write_chapter(master, "Generated API documentation", apidocsname) master.write("\\end{appendix}\n") master.write("\\end{document}\n")
"--use-latex-toc", "--font-encoding=T1", "--output-encoding=utf-8", "--input-encoding=utf-8", "--graphicx-option=pdftex", ]) htmlnsmap = {"h" : "http://www.w3.org/1999/xhtml"} replace_invalid = re.compile(r'[-_/.\s\\]').sub replace_content = re.compile("\{[^\}]*\}").sub replace_epydoc_macros = re.compile(r'(,\s*amssymb|dvips\s*,\s*)').sub replace_rst_macros = re.compile(r'(\\usepackage\{color}|\\usepackage\[[^]]*]\{hyperref})').sub BASENAME_MAP = BASENAME_MAP.copy() BASENAME_MAP.update({'api' : 'lxmlapi'}) # LaTeX snippets DOCUMENT_CLASS = r""" \documentclass[10pt,english]{report} \usepackage[a4paper]{geometry} \parindent0pt \parskip1ex """ PYGMENTS_IMPORT = r""" \usepackage{fancyvrb} \input{_part_pygments.tex} """
def publish(dirname, lxml_path, release): if not os.path.exists(dirname): os.mkdir(dirname) doc_dir = os.path.join(lxml_path, 'doc') script = os.path.join(doc_dir, 'rest2html.py') pubkey = os.path.join(doc_dir, 'pubkey.asc') stylesheet_url = 'style.css' shutil.copy(pubkey, dirname) href_map = HREF_MAP.copy() changelog_basename = 'changes-%s' % release href_map['Release Changelog'] = changelog_basename + '.html' trees = {} menu = Element("div", {"class":"sidemenu"}) # build HTML pages and parse them back for section, text_files in SITE_STRUCTURE: section_head = make_menu_section_head(section, menu) for filename in text_files: if filename.startswith('@'): # special menu entry page_title = filename[1:] url = href_map[page_title] build_menu_entry(page_title, url, section_head) else: path = os.path.join(doc_dir, filename) basename = os.path.splitext(os.path.basename(filename))[0] basename = BASENAME_MAP.get(basename, basename) outname = basename + '.html' outpath = os.path.join(dirname, outname) rest2html(script, path, outpath, stylesheet_url) tree = parse(outpath) if filename == 'main.txt': # inject donation buttons #inject_flatter_button(tree) inject_donate_buttons(lxml_path, script, tree) trees[filename] = (tree, basename, outpath) build_menu(tree, basename, section_head) # also convert CHANGES.txt rest2html(script, os.path.join(lxml_path, 'CHANGES.txt'), os.path.join(dirname, 'changes-%s.html' % release), '') # generate sitemap from menu sitemap = XML('''\ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Sitemap of lxml.de - Processing XML and HTML with Python</title> <meta content="lxml - the most feature-rich and easy-to-use library for processing XML and HTML in the Python language" name="description" /> <meta content="Python XML, XML, XML processing, HTML, lxml, simple XML, ElementTree, etree, lxml.etree, objectify, XML parsing, XML validation, XPath, XSLT" name="keywords" /> </head> <body> <h1>Sitemap of lxml.de - Processing XML and HTML with Python</h1> </body> </html> '''.replace(' ', ' ')) sitemap_menu = copy.deepcopy(menu) SubElement(SubElement(sitemap_menu[-1], 'li'), 'a', href='http://lxml.de/files/').text = 'Download files' sitemap[-1].append(sitemap_menu) # append to body ElementTree(sitemap).write(os.path.join(dirname, 'sitemap.html')) # integrate sitemap into the menu SubElement(SubElement(menu[-1], 'li'), 'a', href='http://lxml.de/sitemap.html').text = 'Sitemap' # integrate menu into web pages for tree, basename, outpath in trees.itervalues(): new_tree = merge_menu(tree, menu, basename) title = find_title_tag(new_tree) if title and title[0].text == 'lxml': title[0].text = "lxml - Processing XML and HTML with Python" heading = find_heading_tag(new_tree) if heading: heading[0].text = "lxml - XML and HTML with Python" new_tree.write(outpath)
def publish(dirname, lxml_path, release): if not os.path.exists(dirname): os.mkdir(dirname) doc_dir = os.path.join(lxml_path, 'doc') script = os.path.join(doc_dir, 'rest2html.py') pubkey = os.path.join(doc_dir, 'pubkey.asc') stylesheet_url = 'style.css' shutil.copy(pubkey, dirname) href_map = HREF_MAP.copy() changelog_basename = 'changes-%s' % release href_map['Release Changelog'] = changelog_basename + '.html' menu_js = textwrap.dedent(''' function trigger_menu(event) { var sidemenu = document.getElementById("sidemenu"); var classes = sidemenu.getAttribute("class"); classes = (classes.indexOf(" visible") === -1) ? classes + " visible" : classes.replace(" visible", ""); sidemenu.setAttribute("class", classes); event.preventDefault(); event.stopPropagation(); } function hide_menu() { var sidemenu = document.getElementById("sidemenu"); var classes = sidemenu.getAttribute("class"); if (classes.indexOf(" visible") !== -1) { sidemenu.setAttribute("class", classes.replace(" visible", "")); } } ''') trees = {} menu = Element("div", {'class': 'sidemenu', 'id': 'sidemenu'}) SubElement(menu, 'div', {'class': 'menutrigger', 'onclick': 'trigger_menu(event)'}).text = "Menu" menu_div = SubElement(menu, 'div', {'class': 'menu'}) # build HTML pages and parse them back for section, text_files in SITE_STRUCTURE: section_head = make_menu_section_head(section, menu_div) for filename in text_files: if filename.startswith('@'): # special menu entry page_title = filename[1:] url = href_map[page_title] build_menu_entry(page_title, url, section_head) else: path = os.path.join(doc_dir, filename) basename = os.path.splitext(os.path.basename(filename))[0] basename = BASENAME_MAP.get(basename, basename) outname = basename + '.html' outpath = os.path.join(dirname, outname) rest2html(script, path, outpath, stylesheet_url) tree = parse(outpath) if filename == 'main.txt': # inject donation buttons #inject_flatter_button(tree) inject_donate_buttons(lxml_path, script, tree) trees[filename] = (tree, basename, outpath) build_menu(tree, basename, section_head) # also convert CHANGES.txt convert_changelog(lxml_path, os.path.join(dirname, 'changes-%s.html' % release), script, stylesheet_url) # generate sitemap from menu sitemap = XML(textwrap.dedent('''\ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Sitemap of lxml.de - Processing XML and HTML with Python</title> <meta content="lxml - the most feature-rich and easy-to-use library for processing XML and HTML in the Python language" name="description" /> <meta content="Python XML, XML, XML processing, HTML, lxml, simple XML, ElementTree, etree, lxml.etree, objectify, XML parsing, XML validation, XPath, XSLT" name="keywords" /> </head> <body> <h1>Sitemap of lxml.de - Processing XML and HTML with Python</h1> </body> </html> ''')) sitemap_menu = copy.deepcopy(menu) SubElement(SubElement(sitemap_menu[-1], 'li'), 'a', href='http://lxml.de/files/').text = 'Download files' sitemap[-1].append(sitemap_menu) # append to body ElementTree(sitemap).write(os.path.join(dirname, 'sitemap.html')) # integrate sitemap into the menu SubElement(SubElement(menu_div[-1], 'li'), 'a', href='http://lxml.de/sitemap.html').text = 'Sitemap' # integrate menu into web pages for tree, basename, outpath in trees.itervalues(): head = find_head(tree)[0] SubElement(head, 'script', type='text/javascript').text = menu_js SubElement(head, 'meta', name='viewport', content="width=device-width, initial-scale=1") find_body(tree)[0].set('onclick', 'hide_menu()') new_tree = merge_menu(tree, menu, basename) title = find_title_tag(new_tree) if title and title[0].text == 'lxml': title[0].text = "lxml - Processing XML and HTML with Python" heading = find_heading_tag(new_tree) if heading: heading[0].text = "lxml - XML and HTML with Python" new_tree.write(outpath)