JacobCrabill/zigdown
Markdown parser in Zig
5a650f9439b2b2d8ca5e498b349e25bb7308f7bb.tar.gz
518e00df9412df30eea6a1934a7edd2658cdd2d9.tar.gz
0e2491d8e6d2be38dc0c2ce8e103469886e468bb.tar.gz
640de7530c4567a0cadf3f701d1c315724eed4c3.tar.gz
aa24df42183ad415d10bc0a33e6238c437fc0f59
49c31006d8307dcb12bc5770f35b6d5b9e2be68e.tar.gz
e8841a6a9431b7365ac9055688429e1deb8db90f.tar.gz
fe48221d4d9842d916d66b5e71ab3c6307ec28b3.tar.gz
f41b4f66a42100be405f96bdc4ebc4a61095d3e8.tar.gz
4d770d31f732d50d3ec373865822fbe659e47c75.tar.gz
5e9e8f8ff3387b0edcaa90f46ddf3629f4cfeb1d.tar.gz
de0c01e7102e755f6c2e1b3055ae6ca85f261a10.tar.gz
c447dcce961ac438aaeaf117347749fe7d1e8365.tar.gz
1805917414a9a8ba2473717fd69447277a175fae.tar.gz
b670c8df85a1568f498aa5c8cae42f51a90473c0.tar.gz
5f19274632c94fc9c6ed6ab8506ac903d25c8303.tar.gz
<This block will be rendered as a Table of Contents>
Zigdown, inspired by Glow and mdcat, is a tool to parse and render Markdown-like content to the terminal or to HTML. It can also serve up a directory of files to your browser like a psuedo-static web site, or present a set of files interactively as an in-terminal slide show.
This will likely forever be a WIP, but it currently supports the the most common features of simple Markdown files.
This is not a CommonMark-compliant Markdown parser, nor will it ever be one!
Headers
Basic text formatting (Bold, italic, underline)
Console and HTML rendering
Images (rendered to the console using the
Kitty graphics protocol)
Web-based images (fetch from URL & display in-terminal)
(Clickable) Links
Tables
Automatic Table of Contents creation
Neovim integration (Lua)
Enabling TreeSitter parsers to be used in WASM modules
Note that I am not planning to implement complete CommonMark specification support, or even full Markdown support by any definition. Rather, the goal is to support "nicely formatted" Markdown, making some simplifying assumptions about what constitutes a paragraph vs. a code block, for example. The "nicely formatted" caveat simplifies the parser somewhat, enabling easier extension for new features like special warnings, note boxes, and other custom directives.
In addition to my "nicely formatted" caveat, I am also only interested in supporting a very common subset of all Markdown syntax, and ignoring anything I personally find useless or annoying to parse.
The current version of Zig this code compiles with is 0.14.0. I highly recommend using the Zig version manager to install and manage various Zig versions.
zig build run -- console test/sample.md
zig build -l # List build options
zig build -Dtarget=x86_64-linux-musl # Compile for x86-64 Linux using
# statically-linked MUSL libC
zig build
will create a zigdown
binary at zig-out/bin/zigdown
. Add -Doptimize=ReleaseSafe
to
enable optimizations while keeping safety checks and backtraces upon errors. The shorthand options
-Dsafe
and -Dfast
also enable ReleaseSafe and ReleaseFast, respectively.
To enable syntax highlighting within code blocks, you must install the necessary TreeSitter language
parsers and highlight queries for the languages you'd like to highlight. This can be done by
building and installing each language into a location in your $LD_LIBRARY_PATH
environment
variable.
Zigdown comes with a number of TreeSitter parsers and highlight queries built-in:
The parsers are downloaded from Github and the relevant source files are added to the build, and the
queries are stored at data/queries/
, which contain some fixes and improvements to the original
highlighting queries.
The Zigdown cli tool can also download and install parsers for you. For example, to download, build, and install the C and C++ parsers and their highlight queries:
zigdown install-parsers c,cpp # Assumes both exist at github.com/tree-sitter on the 'master' branch
zigdown install-parsers maxxnino:zig # Specify the Github user; still assumes the 'master' branch
zigdown install-parsers tree-sitter:master:rust # Specify Github user, branch, and language
You can also install manually if Zigdown doesn't properly fetch the repo for you (or if the repo is not setup in a standard manner and requires custom setup). For example, to install the C++ parser from the default tree-sitter project on Github:
#!/usr/bin/env bash
# Ensure the TS_CONFIG_DIR is available
export TS_CONFIG_DIR=$HOME/.config/tree-sitter/
mkdir -p ${TS_CONFIG_DIR}/parsers
cd ${TS_CONFIG_DIR}/parsers
# Clone and build a TreeSitter parser library
git clone https://github.com/tree-sitter/tree-sitter-cpp
cd tree-sitter-cpp
make install PREFIX=$HOME/.local/
# Add the install directory to LD_LIBRARY_PATH (if not done so already)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/.local/lib/
In addition to having the parser libraries available for dlopen
, you will also need the highlight
queries. For this, use the provided bash script ./tools/fetch_queries.sh
. This will install the
queries to $TS_CONFIG_DIR/queries
, which defaults to $HOME/.config/tree-sitter/queries
.