This repository has been archived on 2023-05-31. You can view files and clone it, but cannot push or open issues or pull requests.
python-blog/src/articles/utils.py

50 lines
1.5 KiB
Python

import re
import markdown
from bs4 import BeautifulSoup
from django.conf import settings
from django.core.handlers.wsgi import WSGIRequest
from markdown.extensions.codehilite import CodeHiliteExtension
from markdown.extensions.toc import TocExtension
from articles.markdown import LazyLoadingImageExtension
def build_full_absolute_url(request: WSGIRequest | None, url: str) -> str:
if request:
return request.build_absolute_uri(url)
return (settings.BLOG["base_url"] + url)[::-1].replace("//", "/", 1)[::-1]
def format_article_content(content: str) -> str:
md = markdown.Markdown(
extensions=[
"extra",
"admonition",
TocExtension(anchorlink=True),
CodeHiliteExtension(linenums=False, guess_lang=False),
LazyLoadingImageExtension(),
]
)
content = re.sub(r"(\s)#(\w+)", r"\1\#\2", content)
return md.convert(content)
def truncate_words_after_char_count(text: str, char_count: int) -> str:
total_length = 0
text_result = []
for word in text.split():
if len(word) + 1 + total_length > char_count:
break
text_result.append(word)
total_length += len(word) + 1
return " ".join(text_result) + "..."
def find_first_paragraph_with_text(html: str) -> str:
bs = BeautifulSoup(html, "html.parser")
paragraphs = bs.find_all("p", recursive=False)
for paragraph in paragraphs:
if paragraph.text.strip():
return paragraph.text
return ""