Improve code highlight
parent
d32a56e38d
commit
9733c0b5c8
|
@ -50,6 +50,7 @@ div.highlight {
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
display: block;
|
display: block;
|
||||||
|
margin: 20px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.box {
|
.box {
|
||||||
|
|
|
@ -88,6 +88,6 @@ async def markdownify(
|
||||||
# Handle custom emoji
|
# Handle custom emoji
|
||||||
tags.extend(emoji.tags(content))
|
tags.extend(emoji.tags(content))
|
||||||
|
|
||||||
content = markdown(content, extensions=["mdx_linkify", "fenced_code", "codehilite"])
|
content = markdown(content, extensions=["mdx_linkify", "fenced_code"])
|
||||||
|
|
||||||
return content, tags, mentioned_actors
|
return content, tags, mentioned_actors
|
||||||
|
|
|
@ -3,6 +3,7 @@ from functools import lru_cache
|
||||||
from bs4 import BeautifulSoup # type: ignore
|
from bs4 import BeautifulSoup # type: ignore
|
||||||
from pygments import highlight as phighlight # type: ignore
|
from pygments import highlight as phighlight # type: ignore
|
||||||
from pygments.formatters import HtmlFormatter # type: ignore
|
from pygments.formatters import HtmlFormatter # type: ignore
|
||||||
|
from pygments.lexers import get_lexer_by_name # type: ignore
|
||||||
from pygments.lexers import guess_lexer # type: ignore
|
from pygments.lexers import guess_lexer # type: ignore
|
||||||
|
|
||||||
from app.config import CODE_HIGHLIGHTING_THEME
|
from app.config import CODE_HIGHLIGHTING_THEME
|
||||||
|
@ -18,15 +19,29 @@ def highlight(html: str) -> str:
|
||||||
for code in soup.find_all("code"):
|
for code in soup.find_all("code"):
|
||||||
if not code.parent.name == "pre":
|
if not code.parent.name == "pre":
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
# Replace <br> tags with line breaks (Mastodon sends code like this)
|
||||||
code_content = (
|
code_content = (
|
||||||
code.encode_contents().decode().replace("<br>", "\n").replace("<br/>", "\n")
|
code.encode_contents().decode().replace("<br>", "\n").replace("<br/>", "\n")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# If this comes from a microblog.pub instance we may have the language
|
||||||
|
# in the class name
|
||||||
|
if "class" in code.attrs and code.attrs["class"][0].startswith("language-"):
|
||||||
|
try:
|
||||||
|
lexer = get_lexer_by_name(
|
||||||
|
code.attrs["class"][0].removeprefix("language-")
|
||||||
|
)
|
||||||
|
except Exception:
|
||||||
lexer = guess_lexer(code_content)
|
lexer = guess_lexer(code_content)
|
||||||
tag = BeautifulSoup(
|
else:
|
||||||
|
lexer = guess_lexer(code_content)
|
||||||
|
|
||||||
|
# Replace the code with Pygment output
|
||||||
|
code.parent.replaceWith(
|
||||||
|
BeautifulSoup(
|
||||||
phighlight(code_content, lexer, _FORMATTER), "html5lib"
|
phighlight(code_content, lexer, _FORMATTER), "html5lib"
|
||||||
).body.next
|
).body.next
|
||||||
pre = code.parent
|
)
|
||||||
pre.replaceWith(tag)
|
|
||||||
out = soup.body
|
return soup.body.encode_contents().decode()
|
||||||
out.name = "div"
|
|
||||||
return str(out)
|
|
||||||
|
|
Loading…
Reference in New Issue