cheesy/moku/markdown.py
2025-11-23 10:57:34 +00:00

55 lines
1.4 KiB
Python
Executable file

from django.apps import apps
from django.conf import settings
from mistune import HTMLRenderer, InlineParser, Markdown
from mistune.plugins.formatting import strikethrough, subscript, superscript
from mistune.plugins.url import url
USERNAME_PATTERN = (
r"@[a-z0-9-_.]{"
+ str(settings.USERNAME_MIN_LENGTH)
+ r","
+ str(settings.USERNAME_MAX_LENGTH)
+ r"}"
)
def _parse_username_link(inline, m, state):
User = apps.get_model("moku", "User")
text = m.group(0)
pos = m.end()
if state.in_link:
inline.process_text(text, state)
return pos
try:
user = User.objects.get(username=text[1:])
except User.DoesNotExist:
inline.process_text(text, state)
return pos
state.append_token(
{
"type": "link",
"children": [{"type": "text", "raw": f"@{user.username}"}],
"attrs": {"url": user.get_absolute_url()},
}
)
return pos
def _username(md):
md.inline.register("username", USERNAME_PATTERN, _parse_username_link)
full_markdown = Markdown(
renderer=HTMLRenderer(),
inline=InlineParser(hard_wrap=True),
plugins=[strikethrough, subscript, superscript, url, _username],
)
basic_markdown = Markdown(
renderer=HTMLRenderer(),
inline=InlineParser(hard_wrap=True),
plugins=[strikethrough, subscript, superscript, url],
)