cheesy/moku/markdown.py

56 lines
1.4 KiB
Python
Raw Normal View History

from django.apps import apps
from django.conf import settings
2024-03-27 12:28:23 +00:00
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(),
2024-03-27 12:28:23 +00:00
inline=InlineParser(hard_wrap=True),
plugins=[strikethrough, subscript, superscript, url, _username],
)
basic_markdown = Markdown(
2024-03-27 12:28:23 +00:00
renderer=HTMLRenderer(),
inline=InlineParser(hard_wrap=True),
plugins=[strikethrough, subscript, superscript, url],
)