#!/usr/bin/env python3 """Convert catalogue HTML to terminal text without altering shell examples.""" import re import sys from html.parser import HTMLParser class PlainText(HTMLParser): def __init__(self): super().__init__(convert_charrefs=True) self.parts = [] self.hidden = 0 def handle_starttag(self, tag, attrs): if tag in ('script', 'style'): self.hidden += 1 elif not self.hidden: if tag in ('p', 'div', 'br', 'ul', 'ol', 'pre', 'blockquote', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'): self.parts.append('\n') elif tag == 'li': self.parts.append('\n• ') def handle_endtag(self, tag): if tag in ('script', 'style'): self.hidden = max(0, self.hidden - 1) elif not self.hidden and tag in ('p', 'div', 'li', 'ul', 'ol', 'pre', 'blockquote', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'): self.parts.append('\n') def handle_data(self, data): if not self.hidden: self.parts.append(data) def plain_text(value): parser = PlainText() parser.feed(value) parser.close() result = ''.join(parser.parts).replace('\xa0', ' ') result = '\n'.join(line.strip() for line in result.splitlines()) return re.sub(r'\n{3,}', '\n\n', result).strip() if __name__ == '__main__': sys.stdout.write(plain_text(sys.stdin.read()))