mirror of
https://github.com/tylernguyen/wiki.git
synced 2025-02-05 08:23:14 -06:00
70 lines
2.1 KiB
Python
70 lines
2.1 KiB
Python
|
# LINK https://github.com/facelessuser/pymdown-extensions/blob/main/tools/pymdownx_md_render.py
|
||
|
"""Generate Markdown isolated from our current document options."""
|
||
|
import markdown
|
||
|
import yaml
|
||
|
import re
|
||
|
from collections import OrderedDict
|
||
|
|
||
|
def yaml_load(stream, loader=yaml.Loader):
|
||
|
"""
|
||
|
Custom YAML loader.
|
||
|
|
||
|
Load all strings as Unicode.
|
||
|
http://stackoverflow.com/a/2967461/3609487
|
||
|
"""
|
||
|
|
||
|
def construct_yaml_str(self, node):
|
||
|
"""Override the default string handling function to always return Unicode objects."""
|
||
|
|
||
|
return self.construct_scalar(node)
|
||
|
|
||
|
class Loader(loader):
|
||
|
"""Custom Loader."""
|
||
|
|
||
|
Loader.add_constructor(
|
||
|
'tag:yaml.org,2002:str',
|
||
|
construct_yaml_str
|
||
|
)
|
||
|
|
||
|
return yaml.load(stream, Loader)
|
||
|
|
||
|
def get_frontmatter(text):
|
||
|
"""Get front matter from string."""
|
||
|
|
||
|
frontmatter = OrderedDict()
|
||
|
|
||
|
if text.startswith("---"):
|
||
|
m = re.search(r'^(-{3}\r?\n(?!\r?\n)(.*?)(?<=\n)(?:-{3}|\.{3})\r?\n)', text, re.DOTALL)
|
||
|
if m:
|
||
|
yaml_okay = True
|
||
|
try:
|
||
|
frontmatter = yaml_load(m.group(2))
|
||
|
if frontmatter is None:
|
||
|
frontmatter = OrderedDict()
|
||
|
# If we didn't get a dictionary, we don't want this as it isn't front matter.
|
||
|
assert isinstance(frontmatter, (dict, OrderedDict)), TypeError
|
||
|
except Exception:
|
||
|
# We had a parsing error. This is not the YAML we are looking for.
|
||
|
yaml_okay = False
|
||
|
frontmatter = OrderedDict()
|
||
|
|
||
|
if yaml_okay:
|
||
|
text = text[m.end(1):]
|
||
|
|
||
|
return frontmatter, text
|
||
|
|
||
|
def md_sub_render(src="", language="", class_name=None, options=None, md="", **kwargs):
|
||
|
"""Formatter wrapper."""
|
||
|
try:
|
||
|
fm, text = get_frontmatter(src)
|
||
|
md = markdown.markdown(
|
||
|
text,
|
||
|
extensions=fm.get('extensions', []),
|
||
|
extension_configs=fm.get('extension_configs', {})
|
||
|
)
|
||
|
return md
|
||
|
except Exception:
|
||
|
import traceback
|
||
|
print(traceback.format_exc())
|
||
|
raise
|