diff options
Diffstat (limited to 'filters')
| -rwxr-xr-x | filters/html-converters/md2html | 37 | ||||
| -rwxr-xr-x | filters/syntax-material.py | 37 |
2 files changed, 74 insertions, 0 deletions
diff --git a/filters/html-converters/md2html b/filters/html-converters/md2html new file mode 100755 index 0000000..571c8d7 --- /dev/null +++ b/filters/html-converters/md2html | |||
| @@ -0,0 +1,37 @@ | |||
| 1 | #!/usr/bin/env python3 | ||
| 2 | import io | ||
| 3 | import sys | ||
| 4 | |||
| 5 | import markdown | ||
| 6 | from markdown.extensions.toc import TocExtension | ||
| 7 | |||
| 8 | sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding="utf-8") | ||
| 9 | sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8") | ||
| 10 | |||
| 11 | sys.stdout.write("<div class='markdown-body'>") | ||
| 12 | sys.stdout.flush() | ||
| 13 | |||
| 14 | try: | ||
| 15 | markdown.markdownFromFile( | ||
| 16 | output_format="html5", | ||
| 17 | extensions=[ | ||
| 18 | "markdown.extensions.fenced_code", | ||
| 19 | "markdown.extensions.codehilite", | ||
| 20 | "markdown.extensions.tables", | ||
| 21 | "markdown.extensions.sane_lists", | ||
| 22 | "markdown.extensions.admonition", | ||
| 23 | TocExtension(anchorlink=True, permalink=True), | ||
| 24 | ], | ||
| 25 | extension_configs={ | ||
| 26 | "markdown.extensions.codehilite": { | ||
| 27 | "css_class": "highlight", | ||
| 28 | "guess_lang": False, | ||
| 29 | } | ||
| 30 | }, | ||
| 31 | ) | ||
| 32 | except Exception as e: | ||
| 33 | sys.stdout.write(f"<p>Error rendering markdown: {e}</p>") | ||
| 34 | sys.stdin.seek(0) | ||
| 35 | sys.stdout.write(f"<pre>{sys.stdin.read()}</pre>") | ||
| 36 | |||
| 37 | sys.stdout.write("</div>") | ||
diff --git a/filters/syntax-material.py b/filters/syntax-material.py new file mode 100755 index 0000000..3176691 --- /dev/null +++ b/filters/syntax-material.py | |||
| @@ -0,0 +1,37 @@ | |||
| 1 | #!/usr/bin/env python3 | ||
| 2 | import sys | ||
| 3 | |||
| 4 | from pygments import highlight | ||
| 5 | from pygments.formatters import HtmlFormatter | ||
| 6 | from pygments.lexers import get_lexer_for_filename, guess_lexer | ||
| 7 | from pygments.util import ClassNotFound | ||
| 8 | |||
| 9 | |||
| 10 | def main(): | ||
| 11 | filename = sys.argv[-1] if len(sys.argv) > 1 else "stdin" | ||
| 12 | |||
| 13 | try: | ||
| 14 | data = sys.stdin.read() | ||
| 15 | except Exception: | ||
| 16 | return | ||
| 17 | |||
| 18 | try: | ||
| 19 | lexer = get_lexer_for_filename(filename) | ||
| 20 | except ClassNotFound: | ||
| 21 | try: | ||
| 22 | lexer = guess_lexer(data) | ||
| 23 | except ClassNotFound: | ||
| 24 | sys.stdout.write(f"<pre>{data}</pre>") | ||
| 25 | return | ||
| 26 | |||
| 27 | formatter = HtmlFormatter(style="default", nowrap=True, classprefix="hl-") | ||
| 28 | |||
| 29 | try: | ||
| 30 | sys.stdout.write("<style>.hl- { display: inline; }</style>") | ||
| 31 | highlight(data, lexer, formatter, sys.stdout) | ||
| 32 | except BrokenPipeError: | ||
| 33 | pass | ||
| 34 | |||
| 35 | |||
| 36 | if __name__ == "__main__": | ||
| 37 | main() | ||
