From 9616a1b5148145bf389d69ee8c7862e722667e6e Mon Sep 17 00:00:00 2001 From: Folkert Kevelam Date: Sat, 23 Aug 2025 20:32:20 +0200 Subject: [PATCH] Initial commit --- Server/MarkdownPreviewer/__init__.py | 8 ++ Server/MarkdownPreviewer/render_pipeline.py | 94 ++++++++++++++++++++ Server/MarkdownPreviewer/template/index.html | 66 ++++++++++++++ Server/requirements.txt | 2 + Server/setup.py | 20 +++++ 5 files changed, 190 insertions(+) create mode 100644 Server/MarkdownPreviewer/__init__.py create mode 100644 Server/MarkdownPreviewer/render_pipeline.py create mode 100644 Server/MarkdownPreviewer/template/index.html create mode 100644 Server/requirements.txt create mode 100644 Server/setup.py diff --git a/Server/MarkdownPreviewer/__init__.py b/Server/MarkdownPreviewer/__init__.py new file mode 100644 index 0000000..a1e8cf6 --- /dev/null +++ b/Server/MarkdownPreviewer/__init__.py @@ -0,0 +1,8 @@ +from .server import main +import asyncio +import argparse +import sys + +def launcher(): + print(sys.argv) + asyncio.run(main()) diff --git a/Server/MarkdownPreviewer/render_pipeline.py b/Server/MarkdownPreviewer/render_pipeline.py new file mode 100644 index 0000000..a3d616b --- /dev/null +++ b/Server/MarkdownPreviewer/render_pipeline.py @@ -0,0 +1,94 @@ +# Render pipeline for markdown documents. +# Allows filtering and mapping based on blocks and meta keys. +# + +import pandoc + +class MetaCallback: + def __init__(self, key, callback, replace=False): + self.key = key + self.callback = callback + self.replace = replace + + def __call__(self, data): + return self.callback(data) + +class MultiCallback: + def __init__(self, filter): + self.filter = filter + self.callbacks = dict() + + def AddCallback(self, key, callback): + self.callbacks[key] = callback + + def __call__(self, block): + filter_key = self.filter(block) + + if filter_key is None: + return block + + if filter_key in self.callbacks.keys(): + return self.callbacks[filter_key](block) + else: + return block + + +class RenderPipeline: + def __init__(self): + self.pandoc = pandoc.Pandoc() + self.metacallbacks = dict() + self.callbacks = dict() + + def AddMetaCallback(self, key, callback, replace=False): + self.metacallbacks[key] = MetaCallback(key, callback, replace) + + def AddCallback(self, key, callback, replace=False): + self.callbacks[key] = {'cb' : callback, 'replace' : replace} + + def ParseBlock(self, block): + + if 'c' not in block: + return block + + if isinstance(block['c'], dict): + content = self.ParseBlock(block['c']) + elif isinstance(block['c'], list): + content = self.ParseList(block['c']) + else: + return block + + if block['t'] in self.callbacks.keys(): + if self.callbacks[block['t']]['replace'] == True: + return self.callbacks[block['t']]['cb'](block) + else: + self.callbacks[block['t']]['cb'](block) + + return block + + def ParseList(self, pandoc_list): + output_list = list() + for item in pandoc_list: + if isinstance(item, dict): + output_list.append(self.ParseBlock(item)) + else: + output_list.append(item) + + return output_list + + def __call__(self, data): + json_data = self.pandoc.ConvertToJson(data) + + for meta_key, meta_value in json_data['meta'].items(): + if meta_key in self.metacallbacks.keys(): + if self.metacallbacks[meta_key].replace == True: + json_data['meta'][meta_key] = \ + self.metacallbacks[meta_key](meta_value) + else: + self.metacallbacks[meta_key](meta_value) + + json_data['blocks'] = self.ParseList(json_data['blocks']) + + return_data = self.pandoc.ConvertFromJson(json_data) + + return return_data + diff --git a/Server/MarkdownPreviewer/template/index.html b/Server/MarkdownPreviewer/template/index.html new file mode 100644 index 0000000..0436c87 --- /dev/null +++ b/Server/MarkdownPreviewer/template/index.html @@ -0,0 +1,66 @@ + + + + + + + + + + + + +
+ + +
+ {% raw body_content %} +
+ + + + diff --git a/Server/requirements.txt b/Server/requirements.txt new file mode 100644 index 0000000..0dbb214 --- /dev/null +++ b/Server/requirements.txt @@ -0,0 +1,2 @@ +tornado +msgpack diff --git a/Server/setup.py b/Server/setup.py new file mode 100644 index 0000000..de5fd51 --- /dev/null +++ b/Server/setup.py @@ -0,0 +1,20 @@ +from setuptools import setup, find_packages + +with open('requirements.txt') as f: + requirements = f.read().splitlines() + +setup( + name="MarkdownPreviewer", + version="0.0.1", + include_pacakge_data=True, + python_requires=">=3.8", + setup_requires=['setuptools-git-versioning'], + install_requires=requirements, + author="Folkert Kevelam", + author_email="folkert@pyllr.nl", + description="A markdown previewer", + long_description="", + long_description_content_type="text/markdown", + classifiers=[], + version_config={} +)