diff --git a/pyproject.toml b/pyproject.toml index defed5c..c418182 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,7 @@ requires = ["hatchling"] build-backend = "hatchling.build" [tool.basedpyright] -include = ["src"] +include = ["src", "."] exclude = [ "**/node_modules", "**/__pycache__", @@ -47,7 +47,9 @@ reportExplicitAny = false reportAny = false reportUnusedCallResult = false reportCallInDefaultInitializer = false -allowedUntypedLibraries = ["frontmatter"] +enableTypeIgnoreComments = true +reportIgnoreCommentWithoutRule = false +allowedUntypedLibraries = ["frontmatter", "pygments"] [tool.ruff] line-length = 80 @@ -80,4 +82,5 @@ dev = [ "basedpyright>=1.29.4", "pytest>=8.4.0", "ruff>=0.11.13", + "types-pygments>=2.19.0.20250516", ] diff --git a/src/zona/markdown.py b/src/zona/markdown.py index 8418a4e..3992cc5 100644 --- a/src/zona/markdown.py +++ b/src/zona/markdown.py @@ -2,13 +2,20 @@ from rich import print from typing import Any, override from pathlib import Path from marko.inline import Link, Image +from marko.block import FencedCode from marko.html_renderer import HTMLRenderer from marko.parser import Parser 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.models import Item +# TODO: create Ashen pygments style (separate package probably) + class ZonaRenderer(HTMLRenderer): def __init__( @@ -73,6 +80,25 @@ class ZonaRenderer(HTMLRenderer): f"{caption}" ) + @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'
'
+ f"{highlighted}
"
+ )
+
def md_to_html(
content: str,
diff --git a/uv.lock b/uv.lock
index 168f916..be4c5a6 100644
--- a/uv.lock
+++ b/uv.lock
@@ -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" },
]
+[[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]]
name = "typing-extensions"
version = "4.14.0"
@@ -389,6 +410,7 @@ dev = [
{ name = "basedpyright" },
{ name = "pytest" },
{ name = "ruff" },
+ { name = "types-pygments" },
]
[package.metadata]
@@ -409,4 +431,5 @@ dev = [
{ name = "basedpyright", specifier = ">=1.29.4" },
{ name = "pytest", specifier = ">=8.4.0" },
{ name = "ruff", specifier = ">=0.11.13" },
+ { name = "types-pygments", specifier = ">=2.19.0.20250516" },
]