| 1 | from html.parser import HTMLParser |
| 2 | import xml.etree.ElementTree as ET |
| 3 | |
| 4 | ns = {'one': 'http://schemas.microsoft.com/office/onenote/2010/onenote'} |
| 5 | |
| 6 | |
| 7 | class 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 | |
| 29 | def texts(page): |
| 30 | return [''.join(Text(node.text or '').parts) for node in page.findall('.//one:T', ns)] |
| 31 | |
| 32 | |
| 33 | def pages(directory): |
| 34 | return [ET.parse(p).getroot() for p in sorted(directory.glob('page-*.xml'))] |
| 35 | |
| 36 | |
| 37 | def 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') |