Add markdown utils
- External links open in a new tab - Clicking on image open an image modal
This commit is contained in:
parent
a75a080b9c
commit
d7cc620a0a
12 changed files with 51 additions and 16 deletions
|
@ -3,6 +3,8 @@ import bleach
|
|||
from django.utils.html import escape
|
||||
from bs4 import BeautifulSoup
|
||||
from pymdownx import superfences
|
||||
from django.conf import settings
|
||||
from urllib.parse import urlparse
|
||||
|
||||
from judge.markdown_extensions import YouTubeExtension, EmoticonExtension
|
||||
|
||||
|
@ -96,6 +98,35 @@ ALLOWED_ATTRS = [
|
|||
]
|
||||
|
||||
|
||||
def _wrap_img_iframe_with_lazy_load(soup):
|
||||
for img in soup.findAll("img"):
|
||||
if img.get("src"):
|
||||
img["loading"] = "lazy"
|
||||
for img in soup.findAll("iframe"):
|
||||
if img.get("src"):
|
||||
img["loading"] = "lazy"
|
||||
return soup
|
||||
|
||||
|
||||
def _wrap_images_with_featherlight(soup):
|
||||
for img in soup.findAll("img"):
|
||||
if img.get("src"):
|
||||
link = soup.new_tag("a", href=img["src"], **{"data-featherlight": "image"})
|
||||
img.wrap(link)
|
||||
return soup
|
||||
|
||||
|
||||
def _open_external_links_in_new_tab(soup):
|
||||
domain = settings.SITE_DOMAIN.lower()
|
||||
for a in soup.findAll("a", href=True):
|
||||
href = a["href"]
|
||||
if href.startswith("http://") or href.startswith("https://"):
|
||||
link_domain = urlparse(href).netloc.lower()
|
||||
if link_domain != domain:
|
||||
a["target"] = "_blank"
|
||||
return soup
|
||||
|
||||
|
||||
def markdown(value, lazy_load=False):
|
||||
extensions = EXTENSIONS
|
||||
html = _markdown.markdown(
|
||||
|
@ -106,13 +137,13 @@ def markdown(value, lazy_load=False):
|
|||
|
||||
if not html:
|
||||
html = escape(value)
|
||||
|
||||
soup = BeautifulSoup(html, features="html.parser")
|
||||
if lazy_load:
|
||||
soup = BeautifulSoup(html, features="html.parser")
|
||||
for img in soup.findAll("img"):
|
||||
if img.get("src"):
|
||||
img["loading"] = "lazy"
|
||||
for img in soup.findAll("iframe"):
|
||||
if img.get("src"):
|
||||
img["loading"] = "lazy"
|
||||
html = str(soup)
|
||||
soup = _wrap_img_iframe_with_lazy_load(soup)
|
||||
|
||||
soup = _wrap_images_with_featherlight(soup)
|
||||
soup = _open_external_links_in_new_tab(soup)
|
||||
html = str(soup)
|
||||
|
||||
return '<div class="md-typeset content-description">%s</div>' % html
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue