Hongdown
Hongdown is a Markdown formatter that enforces Hong Minhee's Markdown style conventions. The formatter is implemented in Rust using the Comrak library for parsing. It produces consistently formatted Markdown output following a distinctive style used across multiple projects including Fedify, LogTape, and Optique.
Installation
npm
mise
Cargo
Pre-built binaries
Pre-built binaries for Linux, macOS, and Windows are available on the GitHub Releases page.
Usage
Basic usage
# Format a file and print to stdout
# Format a file in place
# Format multiple files
# Check if files are formatted (exit 1 if not)
# Show diff of formatting changes
# Read from stdin (use --stdin flag or - as filename)
|
|
# Custom line width
Disable directives
Hongdown supports special HTML comments to disable formatting for specific sections of your document:
This entire file will not be formatted.
This line preserves its spacing.
The next line will be formatted normally.
Everything here is preserved as-is
until the next heading (h1 or h2).
Next heading
This section will be formatted normally.
This section is not formatted.
This section is formatted again.
Configuration file
Hongdown looks for a .hongdown.toml file in the current directory and
parent directories. You can also specify a configuration file explicitly
with the --config option.
Below is an example configuration with all available options and their default values:
# File patterns (glob syntax)
= [] # Files to format (default: none, specify on CLI)
= [] # Files to skip (default: none)
# Formatting options
= 80 # Maximum line width (default: 80)
[]
= true # Use === underline for h1 (default: true)
= true # Use --- underline for h2 (default: true)
[]
= "-" # "-", "*", or "+" (default: "-")
= 1 # Spaces before marker (default: 1)
= 2 # Spaces after marker (default: 2)
= 4 # Indentation for nested items (default: 4)
[]
= "." # "." or ")" at odd nesting levels (default: ".")
= ")" # "." or ")" at even nesting levels (default: ")")
= "start" # "start" or "end" for number alignment (default: "start")
= 4 # Indentation for nested items (default: 4)
[]
= "~" # "~" or "`" (default: "~")
= 4 # Minimum fence length (default: 4)
= true # Space between fence and language (default: true)
= "" # Default language for code blocks (default: "")
[]
= "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"
= 3 # Leading spaces (0-3, default: 3)
When include patterns are configured, you can run Hongdown without
specifying files:
# Format all files matching include patterns
# Check all files matching include patterns
CLI options override configuration file settings:
# Use config file but override line width
# Use specific config file
Style rules
Hongdown enforces the following conventions:
Headings
- Level 1 and 2 use Setext-style (underlined with
=or-) - Level 3+ use ATX-style (
###,####, etc.)
Document Title
==============
Section
Lists
- Unordered lists use
-(space-hyphen-two spaces) - Ordered lists use
1.format - 4-space indentation for nested items
- - -
Code blocks
- Fenced with four tildes (
~~~~) - Language identifier on the opening fence
~~~~ rust
fn main() {
println!("Hello, world!");
}
~~~~
Line wrapping
- Lines wrap at approximately 80 display columns
- East Asian wide characters are counted as 2 columns
- Long words that cannot be broken are preserved
Links
- External URLs are converted to reference-style links
- References are placed at the end of each section
- Relative/local URLs remain inline
See the [documentation] for more details.
Tables
- Pipes are aligned accounting for East Asian wide characters
- Minimum column width is maintained
See STYLE.md for the complete style specification, including the philosophy behind these conventions and detailed formatting rules.
Library usage
Hongdown can also be used as a Rust library:
use ;
let input = "# Hello World\nThis is a paragraph.";
let options = default;
let output = format.unwrap;
println!;
Development
This project uses mise for task management.
Initial setup
After cloning the repository, set up the Git pre-commit hook to automatically run quality checks before each commit:
Quality checks
The following tasks are available:
# Run all quality checks
# Individual checks
See AGENTS.md for detailed development guidelines including TDD practices, code style conventions, and commit message guidelines.
Etymology
The name Hongdown is a portmanteau of Hong (from Hong Minhee, the author) and Markdown. It also sounds like the Korean word hongdapda (홍답다), meaning “befitting of Hong” or “Hong-like.”
License
Distributed under the GPL-3.0-or-later. See LICENSE for more information.