Convert HTML to simplified markdown.
| 22 | |
| 23 | |
| 24 | class HTMLToMarkdown(HTMLParser): |
| 25 | """Convert HTML to simplified markdown.""" |
| 26 | |
| 27 | def __init__(self): |
| 28 | super().__init__() |
| 29 | self.result = [] |
| 30 | self.current_tag = None |
| 31 | self.in_script = False |
| 32 | self.in_style = False |
| 33 | self.in_nav = False |
| 34 | self.in_footer = False |
| 35 | self.in_aside = False |
| 36 | self.list_depth = 0 |
| 37 | self.ordered_list_counter = 0 |
| 38 | self.ignore_tags = {'script', 'style', 'nav', 'footer', 'aside', 'noscript', 'iframe', 'svg', 'path', 'button', 'form', 'input'} |
| 39 | self.block_tags = {'p', 'div', 'article', 'section', 'main', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'li', 'blockquote', 'pre', 'br', 'tr'} |
| 40 | |
| 41 | def handle_starttag(self, tag, attrs): |
| 42 | self.current_tag = tag |
| 43 | |
| 44 | if tag in self.ignore_tags: |
| 45 | if tag == 'script': |
| 46 | self.in_script = True |
| 47 | elif tag == 'style': |
| 48 | self.in_style = True |
| 49 | elif tag == 'nav': |
| 50 | self.in_nav = True |
| 51 | elif tag == 'footer': |
| 52 | self.in_footer = True |
| 53 | elif tag == 'aside': |
| 54 | self.in_aside = True |
| 55 | return |
| 56 | |
| 57 | if self.in_script or self.in_style or self.in_nav or self.in_footer or self.in_aside: |
| 58 | return |
| 59 | |
| 60 | if tag in ('h1', 'h2', 'h3', 'h4', 'h5', 'h6'): |
| 61 | level = int(tag[1]) |
| 62 | self.result.append('\n\n' + '#' * level + ' ') |
| 63 | elif tag == 'p': |
| 64 | self.result.append('\n\n') |
| 65 | elif tag == 'br': |
| 66 | self.result.append('\n') |
| 67 | elif tag == 'li': |
| 68 | if self.ordered_list_counter: |
| 69 | self.result.append(f'\n{self.ordered_list_counter}. ') |
| 70 | self.ordered_list_counter += 1 |
| 71 | else: |
| 72 | self.result.append('\n- ') |
| 73 | elif tag == 'ul': |
| 74 | self.list_depth += 1 |
| 75 | self.ordered_list_counter = 0 |
| 76 | elif tag == 'ol': |
| 77 | self.list_depth += 1 |
| 78 | self.ordered_list_counter = 1 |
| 79 | elif tag == 'blockquote': |
| 80 | self.result.append('\n\n> ') |
| 81 | elif tag == 'pre': |