jemdoc-rs
A Rust rewrite of jemdoc+MathJax, a light text-based markup language for creating static websites.
jemdoc-rs converts .jemdoc source files into clean, standards-compliant HTML5 pages with built-in support for MathJax 4.
Installation
Using cargo install
Requires Rust 1.87 or later.
This installs jemdoc-rs to ~/.cargo/bin/, which is typically already on your PATH. You only need to do this once. To update to the latest version, run the same command again.
Pre-built Binaries
Pre-built binaries for Linux, macOS, and Windows are available on the releases page.
Building from Source
The binary will be at target/release/jemdoc-rs. You can copy it to any directory on your PATH.
Quick Start
# Convert a single file (produces index.html from index.jemdoc)
# With a configuration file
# Multiple files
Usage
jemdoc-rs [OPTIONS] [SOURCEFILE...]
| Option | Description |
|---|---|
-c <file> |
Use a configuration file (can be specified multiple times) |
-o <file> |
Write output to a specific file or directory |
--show-config |
Print the default configuration template |
--version |
Show version information |
--help, -h |
Show help message |
Example
The example/ directory contains a set of .jemdoc files demonstrating the full feature set. To generate and preview them:
# Generate all HTML pages
# Preview locally at http://127.0.0.1:8000
make jemdoc runs jemdoc-rs -c mysite.conf *.jemdoc and writes the HTML output in place. make preview starts a local HTTP server using simple-http-server (installed automatically via Cargo if not already present). Run make help to see all available targets.
Markup Reference
Titles and Headings
= Page Title
== Section
=== Subsection
Text Formatting
| Markup | Result |
|---|---|
*bold* |
bold |
/italic/ |
italic |
_underline_ |
underline |
+monospace+ |
monospace |
~ |
non-breaking space |
--- |
em dash |
-- |
en dash |
... |
ellipsis |
Equations (MathJax)
MathJax 4 is always included. Inline math uses $...$ and display math uses \(...\):
Inline equation: $E = mc^2$.
Display equation:
\(
\nabla \times \mathbf{E} = -\frac{\partial\mathbf{B}}{\partial t}
\)
Numbered equations work with LaTeX equation, align, and \label/\eqref commands.
Links
[http://example.com] # URL as link text, opens in new tab
[http://example.com Example Site] # Custom link text, opens in new tab
[/localpage.html Local Page] # Leading / opens in the same tab
[user@example.com] # Mailto link
Images
[img{width}{height}{alt text} path/to/image.png Caption]
Lists
- Unordered item 1
- Unordered item 2
. Ordered item 1
. Ordered item 2
: {Term} Definition
: {Another term} Another definition
Nested lists use repeated markers (--, ...).
Code Blocks
~~~
{Title}{language}
def hello():
print("world")
~~~
Supported languages for syntax highlighting: python/py, c, c++/cpp, ruby/rb, sh, matlab, commented, jemdoc, pyint.
Use {}{raw} to output content verbatim (no highlighting or wrapping).
Info Blocks
~~~
{Optional Title}
Block content here.
~~~
Tables
~~~
{}{table}{optional-id}
Cell 1 | Cell 2 | Cell 3
Row 2 | Cell 5 | Cell 6
~~~
Use || for row breaks within a cell.
Image Blocks
~~~
{}{img_left}{photo.jpg}{alt text}{width}{height}{link}
Description text goes here.
~~~
Raw HTML
Embed raw HTML with double braces: {{<span style="color:red">red</span>}}.
Comments
Lines starting with # are comments and are not included in the output.
# This is a comment
Header Directives
Directives are placed at the top of a .jemdoc file as special comments:
# jemdoc: menu{MENU}{thispage.html}
# jemdoc: addcss{custom.css}
# jemdoc: title{Custom Window Title}
| Directive | Description |
|---|---|
menu{MENUFILE}{current.html}{prefix} |
Add a navigation menu (prefix is optional) |
addcss{file.css} |
Include an additional CSS file |
addjs{file} |
Include an additional JS file |
analytics{G-XXXXXXXXXX} |
Add Google Analytics (GA4) tracking |
title{Window Title} |
Override the browser window title |
nodefaultcss |
Don't include the default CSS |
nofooter |
Hide the page footer |
nodate |
Hide the "last updated" date |
notime |
Show date only (no time) in footer |
noeqs |
Disable equation processing and MathJax loading |
fwtitle |
Use full-width title (above the menu) |
showsource |
Add a link to the .jemdoc source file |
Menu Files
A MENU file defines the navigation sidebar:
Menu Category
Page One [page1.html]
Page Two [page2.html]
Another Category
External Link [\http://example.com]
- Indented lines with
[link]are menu items. - Non-indented lines are category headers.
- Prefix a link with
\to open it in a new tab.
Configuration
jemdoc-rs uses a default HTML template that can be customized. Run jemdoc-rs --show-config to see all configurable sections. Override any section in a .conf file:
# mysite.conf — override the body start to add a favicon
[bodystart]
</head>
<link rel="icon" href="img/icon.png" type="image/x-icon" />
<body>
Use -c mysite.conf to apply the overrides. Multiple -c flags can be used; later files take precedence.