1from html.parser import HTMLParser
2import xml.etree.ElementTree as ET
3
4ns = {'one': 'http://schemas.microsoft.com/office/onenote/2010/onenote'}
5
6
7class Text(HTMLParser):
8 def __init__(self, html):
9 super().__init__()
10 self.parts = []
11 self.links = []
12 self.after_br = False
13 self.feed(html)
14
15 def handle_data(self, data):
16 if self.after_br:
17 data = data.removeprefix('\n')
18 self.after_br = False
19 self.parts.append(data)
20
21 def handle_starttag(self, tag, attrs):
22 if tag == 'br':
23 self.parts.append('\n')
24 self.after_br = True
25 if tag == 'a':
26 self.links.extend(value for key, value in attrs if key == 'href')
27
28
29def texts(page):
30 return [''.join(Text(node.text or '').parts) for node in page.findall('.//one:T', ns)]
31
32
33def pages(directory):
34 return [ET.parse(p).getroot() for p in sorted(directory.glob('page-*.xml'))]
35
36
37def project_text(text):
38 """Native HTML expands tabs to eight NBSPs and emits stored CR as a line break."""
39 return text.replace('\t', '\u00a0' * 8).replace('\r', '\n')