I wanted to add syntax highlighting to the new tutorial Data analysis with SQLite and Python.
That page is using the new {% markdown %}
tag from datasette-render-markdown.
I figured out a recipe for adding GitHub-style syntax highlighting to Markdown rendered using that tag.
datasette install datasette-render-markdown
datasette install Pygments
Pygments is an optional dependency for the Python markdown
library which enables syntax highlighting via an extension.
Here's the recipe that worked:
{% markdown
extensions="fenced_code codehilite"
extra_tags="span div"
extra_attrs="span:class div:class" %}
## Here comes some code
Python code here:
```python
def this_will_be(highlighted):
"This works
pass
```
Other languages work too:
```sql
select 1 + 1;
```
{% endmarkdown %}
The magic is all in that opening {% markdown %}
tag.
We're loading two markdown extensions:
datasette-render-markdown
defaults to stripping all but the safest HTML tags and attributes using Bleach.
In this case we want to keep span
and div
tags, since those are used by the syntax highlighter. We also want both of those tags to be allowed to have the class
element on them.
The resulting HTML looks something like this (truncated):
<div class="codehilite">
<pre><span></span><code><span class="k">def</span> <span class="nf">parse_pep</span><span class="p">(</span>
Pygments has a neat collection of default styles. I decided I liked "sas".
I couldn't see an obvious way to output the CSS, so I used ChatGPT to help figure out this Python one-liner to print out the CSS:
python -c 'from pygments.formatters import HtmlFormatter
from pygments.styles import get_style_by_name
formatter = HtmlFormatter(style="sas")
print(formatter.get_style_defs(".codehilite"))
'
I later found out that wasn't necessary - you can run this instead:
pygmentize -f html -S sas -a .codehilite
Both of those will output the CSS you need to add to your stylesheet to style the syntax highlighted text.
Created 2023-07-01T22:38:45-07:00 · Edit