summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Ilvokhin <d@ilvokhin.com>2026-10-10 20:50:26 +0100
committerDmitry Ilvokhin <d@ilvokhin.com>2026-10-10 20:50:26 +0100
commitd40055bbda27915d1dbb67f5f13b1fef707cd07a (patch)
treedfaf1ab57b8738232c8b9de22c24004be7b1a6f9
parenta26f3db38f3b5b5a347afdfdcedb4dfc75d6a907 (diff)
downloadblog-master.tar.gz
blog-master.tar.bz2
blog-master.zip
Support code formattingHEADmaster
-rw-r--r--blog/blog.py3
-rw-r--r--blog/highlight.py23
-rw-r--r--blog/render.py14
-rw-r--r--requirements.txt5
-rw-r--r--templates/post.html1
5 files changed, 43 insertions, 3 deletions
diff --git a/blog/blog.py b/blog/blog.py
index 4b9a345..8528b82 100644
--- a/blog/blog.py
+++ b/blog/blog.py
@@ -11,6 +11,7 @@ from jinja2 import Template, Environment, FileSystemLoader, select_autoescape
from post import Post
from feed import Feed
from atom import Atom
+from highlight import Highlight
def recreate_workdir(basedir: str) -> None:
@@ -44,6 +45,8 @@ def generate_blog() -> None:
workdir = "remote"
recreate_workdir(workdir)
+ Highlight.generate(workdir)
+
for post in posts:
post.generate(workdir)
diff --git a/blog/highlight.py b/blog/highlight.py
new file mode 100644
index 0000000..e4d7b92
--- /dev/null
+++ b/blog/highlight.py
@@ -0,0 +1,23 @@
+import os
+from typing import cast, Callable
+
+from pygments.formatters import HtmlFormatter
+
+
+def get_style_defs() -> str:
+ # Workaround to avoid mypy to complain about untyped
+ # get_style_defs() call.
+ formatter = HtmlFormatter(style="bw")
+ selector = ".highlight"
+ f = cast(Callable[[str], str], formatter.get_style_defs)
+ return f(selector)
+
+
+class Highlight(object):
+ @staticmethod
+ def generate(basedir: str) -> None:
+ highligh = os.path.join(basedir, "highlight.css")
+
+ with open(highligh, mode='w') as f:
+ style = get_style_defs()
+ f.write(style)
diff --git a/blog/render.py b/blog/render.py
index ad06602..9cda36a 100644
--- a/blog/render.py
+++ b/blog/render.py
@@ -15,5 +15,15 @@ def write_file_content(filename: str, data: str) -> None:
def to_html(filename: str) -> str:
text = read_file_content(filename)
- return markdown.markdown(text, extensions=["fenced_code", "footnotes",
- TocExtension(anchorlink=True)])
+ return markdown.markdown(
+ text,
+ extensions=[
+ "fenced_code",
+ "footnotes",
+ "codehilite",
+ TocExtension(anchorlink=True)
+ ],
+ extension_configs={
+ "codehilite": {"css_class": "highlight"}
+ },
+ )
diff --git a/requirements.txt b/requirements.txt
index f5a8fc9..b6cfaf9 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -5,7 +5,10 @@ MarkupSafe==2.1.1
mypy==0.991
mypy-extensions==1.0.0
pycodestyle==2.10.0
+Pygments==2.21.0
tomli==2.0.1
+types-docutils==0.22.3.20251115
types-Markdown==3.4.2.2
-typing-extensions==4.12.2
+types-Pygments==2.19.0.20251121
+typing_extensions==4.12.2
zipp==3.19.1
diff --git a/templates/post.html b/templates/post.html
index f61a2bd..8a8ac33 100644
--- a/templates/post.html
+++ b/templates/post.html
@@ -10,6 +10,7 @@
<title>{{ title }} | blog.ilvokhin.com</title>
<link rel="stylesheet" type="text/css" href="/style.css" />
+ <link rel="stylesheet" type="text/css" href="/highlight.css" />
</head>
<body class="post">