added syntax highlighting

This commit is contained in:
Daniel Fichtinger 2025-06-24 00:37:17 -04:00
parent 68839c5f96
commit 19a10a35bc
3 changed files with 54 additions and 2 deletions

View file

@ -27,7 +27,7 @@ requires = ["hatchling"]
build-backend = "hatchling.build" build-backend = "hatchling.build"
[tool.basedpyright] [tool.basedpyright]
include = ["src"] include = ["src", "."]
exclude = [ exclude = [
"**/node_modules", "**/node_modules",
"**/__pycache__", "**/__pycache__",
@ -47,7 +47,9 @@ reportExplicitAny = false
reportAny = false reportAny = false
reportUnusedCallResult = false reportUnusedCallResult = false
reportCallInDefaultInitializer = false reportCallInDefaultInitializer = false
allowedUntypedLibraries = ["frontmatter"] enableTypeIgnoreComments = true
reportIgnoreCommentWithoutRule = false
allowedUntypedLibraries = ["frontmatter", "pygments"]
[tool.ruff] [tool.ruff]
line-length = 80 line-length = 80
@ -80,4 +82,5 @@ dev = [
"basedpyright>=1.29.4", "basedpyright>=1.29.4",
"pytest>=8.4.0", "pytest>=8.4.0",
"ruff>=0.11.13", "ruff>=0.11.13",
"types-pygments>=2.19.0.20250516",
] ]

View file

@ -2,13 +2,20 @@ from rich import print
from typing import Any, override from typing import Any, override
from pathlib import Path from pathlib import Path
from marko.inline import Link, Image from marko.inline import Link, Image
from marko.block import FencedCode
from marko.html_renderer import HTMLRenderer from marko.html_renderer import HTMLRenderer
from marko.parser import Parser from marko.parser import Parser
from zona.layout import Layout from zona.layout import Layout
from pygments import highlight
from pygments.lexers import get_lexer_by_name, TextLexer
from pygments.formatters import HtmlFormatter
from zona import util from zona import util
from zona.models import Item from zona.models import Item
# TODO: create Ashen pygments style (separate package probably)
class ZonaRenderer(HTMLRenderer): class ZonaRenderer(HTMLRenderer):
def __init__( def __init__(
@ -73,6 +80,25 @@ class ZonaRenderer(HTMLRenderer):
f"{caption}</div>" f"{caption}</div>"
) )
@override
def render_fenced_code(self, element: FencedCode):
# code = element.children
code = "".join(child.children for child in element.children) # type: ignore
lang = element.lang or "text"
try:
lexer = get_lexer_by_name(lang, stripall=False)
except Exception:
lexer = TextLexer(stripall=False) # type: ignore
formatter = HtmlFormatter(style="monokai", nowrap=True, noclasses=True)
highlighted = highlight(code, lexer, formatter) # type: ignore
return (
f'<pre class="code-block language-{lang}">'
f"<code>{highlighted}</code></pre>"
)
def md_to_html( def md_to_html(
content: str, content: str,

23
uv.lock generated
View file

@ -346,6 +346,27 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/76/42/3efaf858001d2c2913de7f354563e3a3a2f0decae3efe98427125a8f441e/typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855", size = 46317, upload-time = "2025-05-26T14:30:30.523Z" }, { url = "https://files.pythonhosted.org/packages/76/42/3efaf858001d2c2913de7f354563e3a3a2f0decae3efe98427125a8f441e/typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855", size = 46317, upload-time = "2025-05-26T14:30:30.523Z" },
] ]
[[package]]
name = "types-docutils"
version = "0.21.0.20250604"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/ef/d0/d28035370d669f14d4e23bd63d093207331f361afa24d2686d2c3fe6be8d/types_docutils-0.21.0.20250604.tar.gz", hash = "sha256:5a9cc7f5a4c5ef694aa0abc61111e0b1376a53dee90d65757f77f31acfcca8f2", size = 40953, upload-time = "2025-06-04T03:10:27.439Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/89/91/887e9591c1ee50dfbf7c2fa2f3f51bc6db683013b6d2b0cd3983adf3d502/types_docutils-0.21.0.20250604-py3-none-any.whl", hash = "sha256:bfa8628176c06a80cdd1d6f3fb32e972e042db53538596488dfe0e9c5962b222", size = 65915, upload-time = "2025-06-04T03:10:26.067Z" },
]
[[package]]
name = "types-pygments"
version = "2.19.0.20250516"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "types-docutils" },
]
sdist = { url = "https://files.pythonhosted.org/packages/71/9a/c1ea3f59001e9d13b93ec8acf02c75b47832423f17471295b8ceebc48a65/types_pygments-2.19.0.20250516.tar.gz", hash = "sha256:b53fd07e197f0e7be38ee19598bd99c78be5ca5f9940849c843be74a2f81ab58", size = 18485, upload-time = "2025-05-16T03:09:30.05Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/a7/0b/32ce3ad35983bf4f603c43cfb00559b37bb5ed90ac4ef9f1d5564b8e4034/types_pygments-2.19.0.20250516-py3-none-any.whl", hash = "sha256:db27de8b59591389cd7d14792483892c021c73b8389ef55fef40a48aa371fbcc", size = 25440, upload-time = "2025-05-16T03:09:29.185Z" },
]
[[package]] [[package]]
name = "typing-extensions" name = "typing-extensions"
version = "4.14.0" version = "4.14.0"
@ -389,6 +410,7 @@ dev = [
{ name = "basedpyright" }, { name = "basedpyright" },
{ name = "pytest" }, { name = "pytest" },
{ name = "ruff" }, { name = "ruff" },
{ name = "types-pygments" },
] ]
[package.metadata] [package.metadata]
@ -409,4 +431,5 @@ dev = [
{ name = "basedpyright", specifier = ">=1.29.4" }, { name = "basedpyright", specifier = ">=1.29.4" },
{ name = "pytest", specifier = ">=8.4.0" }, { name = "pytest", specifier = ">=8.4.0" },
{ name = "ruff", specifier = ">=0.11.13" }, { name = "ruff", specifier = ">=0.11.13" },
{ name = "types-pygments", specifier = ">=2.19.0.20250516" },
] ]