if html_has_content(result):
add_anchors(result.getroot())
+ add_table_of_themes(result.getroot())
add_table_of_contents(result.getroot())
return OutputFile.from_string(etree.tostring(result, method='html',
def add_anchor(element, prefix, with_link=True, with_target=True, link_text=None):
+ parent = element.getparent()
+ index = parent.index(element)
+
if with_link:
if link_text is None:
link_text = prefix
anchor = etree.Element('a', href='#%s' % prefix)
anchor.set('class', 'anchor')
anchor.text = unicode(link_text)
- if element.text:
- anchor.tail = element.text
- element.text = u''
- element.insert(0, anchor)
+ parent.insert(index, anchor)
if with_target:
anchor_target = etree.Element('a', name='%s' % prefix)
anchor_target.set('class', 'target')
anchor_target.text = u' '
- if element.text:
- anchor_target.tail = element.text
- element.text = u''
- element.insert(0, anchor_target)
+ parent.insert(index, anchor_target)
def any_ancestor(element, test):
counter = 1
for element in root.iterdescendants():
if element.tag in ('h2', 'h3'):
- if any_ancestor(element, lambda e: e.get('id') in ('footnotes',) or e.get('class') in ('person-list',)):
+ if any_ancestor(element, lambda e: e.get('id') in ('footnotes', 'nota_red') or e.get('class') in ('person-list',)):
continue
element_text = raw_printable_text(element)
root.insert(0, toc)
+
+def add_table_of_themes(root):
+ try:
+ from sortify import sortify
+ except ImportError:
+ sortify = lambda x: x
+
+ book_themes = {}
+ for fragment in root.findall('.//a[@class="theme-begin"]'):
+ if not fragment.text:
+ continue
+ theme_names = [s.strip() for s in fragment.text.split(',')]
+ for theme_name in theme_names:
+ book_themes.setdefault(theme_name, []).append(fragment.get('name'))
+ book_themes = book_themes.items()
+ book_themes.sort(key=lambda s: sortify(s[0]))
+ themes_div = etree.Element('div', id="themes")
+ themes_ol = etree.SubElement(themes_div, 'ol')
+ for theme_name, fragments in book_themes:
+ themes_li = etree.SubElement(themes_ol, 'li')
+ themes_li.text = "%s: " % theme_name
+ for i, fragment in enumerate(fragments):
+ item = etree.SubElement(themes_li, 'a', href="#%s" % fragment)
+ item.text = str(i + 1)
+ item.tail = ' '
+ root.insert(0, themes_div)
+
+
def extract_annotations(html_path):
"""For each annotation, yields a tuple: anchor, text, html."""