From 67bccc9e1a39ac2749806a37cb53b23322645083 Mon Sep 17 00:00:00 2001 From: Zach DeCook Date: Sat, 14 Jan 2023 13:05:07 -0500 Subject: Mimetypes: Handle source code syntax highlighting --- mime/highlightedcode.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 mime/highlightedcode.py (limited to 'mime/highlightedcode.py') diff --git a/mime/highlightedcode.py b/mime/highlightedcode.py new file mode 100644 index 0000000..63defef --- /dev/null +++ b/mime/highlightedcode.py @@ -0,0 +1,45 @@ +from textual.widgets import Static +from textual.containers import Container +from rich.syntax import Syntax + +# mime list from gemini://geminispace.info/statistics +mimetolexer = { + "text/x-diff": "diff", + "text/x-csrc": "c", + "text/x-python": "python", + "text/markdown": "markdown", + "text/x-patch": "diff", + "text/x-c++src": "cpp", + "text/x-pascal": "pascal", + "text/x-c++hdr": "cpp", + "text/x-go": "go", + "text/x-rust": "rust", + "text/css": "css", + "text/x-php": "php", + # Hopefully, future handlers will take care of these mimes first. + "application/json": "json", + "text/html": "html", + "application/xml": "xml", + "application/atom+xml": "xml", + "text/xml": "xml", + "image/svg+xml": "xml", +} + +class HighlightedCode(Static): + """Plaintext widget.""" + + def __init__(self, fp, id, mime): + super().__init__(id=id) + self.addblock(fp, mime) + + def addblock(self, fp, mime): + code = "" + # Read the whole file first, then render it all. + # Hopefully not a problem, because source code should have terminal length. + for lin in fp: + line = lin + if type(line) is bytes: + line = line.decode("UTF-8") + code += line + lexer = mimetolexer[mime] + self.mount(Static(Syntax(code,lexer=lexer))) -- cgit 1.4.1