This document exercises every common (and uncommon) Markdown feature. Use it to verify that your importer handles real-world content gracefully.
- Headings
- Text Formatting
- Links & Images
- Lists
- Blockquotes
- Code
- Tables
- Horizontal Rules
- Special Characters & HTML Entities
- Extended Syntax
- Edge Cases
- Long-Form Content
Alternate heading styles:
This is a plain paragraph. It contains multiple sentences to simulate realistic content. Markdown importers should preserve whitespace and line breaks correctly across paragraph boundaries.
This is a second paragraph, separated by a blank line. It exists to verify that paragraph breaks render as expected rather than collapsing into a single block.
Here is a very short paragraph.
This entire sentence is bold. And this entire sentence is italic. You can also use underscores for bold and underscores for italic.
Combining them: bold and italic together or also bold and italic. You can nest them too: bold with italic inside and italic with bold inside.
This text is struck through. And here is strikethrough with bold inside.
Here is a combination of everything: bold italic strikethrough -- if your parser handles that, congratulations.
Superscript and subscript (HTML fallback): H2O is water. E = mc2 is famous.
Highlighted text using the HTML <mark> tag.
Visit Canva for design tools. Here is a link with a title: Google.
Read more at Wikipedia or check the Markdown Guide.
Autolink style: https://example.com
Bare URL (some parsers auto-link these): https://example.com/path?query=value&foo=bar#anchor
Email link: user@example.com
Reference-style image:
- Apple
- Banana
- Cherry
- Dark cherry
- Maraschino cherry
- Extra sweet
- Extra tart
- Rainier cherry
- Dragonfruit
Using asterisks:
- Item one
- Item two
- Item three
Using plus signs:
- Alpha
- Beta
- Gamma
- First step: gather requirements
- Second step: write code
- Third step: test thoroughly
- Unit tests
- Integration tests
- API integration
- Database integration
- Third-party service integration
- End-to-end tests
- Fourth step: deploy
Starting from a different number:
- This list starts at five
- Then six
- Then seven
- Prepare the environment
- Install Node.js
- Install Python 3.10+
- Configure your editor
- Clone the repository
- Via HTTPS:
git clone https://github.com/example/repo.git - Via SSH:
git clone git@github.com:example/repo.git- Make sure your SSH key is configured
- Test with
ssh -T git@github.com
- Via HTTPS:
- Run the project
- Development:
npm run dev - Production:
npm run build && npm start
- Development:
- Set up project structure
- Implement core parser
- Add support for tables
- Add support for footnotes
- Write unit tests
- Write documentation
- README
- API reference
- Contributing guide
This is a simple blockquote. It contains a single paragraph of quoted text.
This is a multi-paragraph blockquote.
The second paragraph is still part of the same quote. Blockquotes can contain bold, italic, and
inline code.
Dorothy followed her through many of the beautiful rooms in her castle.
The Witch bade her clean the pots and kettles and sweep the floor and keep the fire fed with wood.
"I will do as you say," Dorothy replied, "but only because I must."
Revenue was off the chart:
- Q1: $1.2M
- Q2: $1.8M
- Q3: $2.4M
Things are going well.
total_revenue = sum(quarterly_results)
Use console.log() to print values. The <div> element is a block container. Backtick inside code: `backtick`.
function fibonacci(n) {
if (n <= 1) return n;
const memo = [0, 1];
for (let i = 2; i <= n; i++) {
memo[i] = memo[i - 1] + memo[i - 2];
}
return memo[n];
}
// Usage
console.log(fibonacci(10)); // 55from typing import Generator
def fibonacci(n: int) -> Generator[int, None, None]:
"""Generate the first n Fibonacci numbers."""
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
# Usage
for num in fibonacci(10):
print(num, end=" ")
# Output: 0 1 1 2 3 5 8 13 21 34#!/usr/bin/env bash
set -euo pipefail
# Deploy script
echo "Starting deployment..."
git pull origin main
npm ci --production
pm2 restart all
echo "Deployment complete!"{
"name": "markdown-importer",
"version": "2.0.0",
"dependencies": {
"unified": "^11.0.0",
"remark-parse": "^11.0.0",
"remark-gfm": "^4.0.0"
},
"scripts": {
"test": "vitest run",
"build": "tsc && vite build"
}
}<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test Page</title>
</head>
<body>
<h1>Hello, Markdown!</h1>
<p>This is an <em>HTML</em> code block inside a Markdown file.</p>
</body>
</html>:root {
--primary: #2563eb;
--surface: #f8fafc;
}
.markdown-body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
line-height: 1.6;
color: #1e293b;
max-width: 80ch;
margin: 0 auto;
padding: 2rem;
}
.markdown-body h1 {
border-bottom: 2px solid var(--primary);
padding-bottom: 0.3em;
}This is a plain code block with no language hint.
It should still be rendered as monospaced preformatted text.
Indentation is preserved.
Even deeper indentation.
This is an indented code block.
Some parsers treat 4-space-indented text as code.
No syntax highlighting expected here.
| Name | Role | Location |
|---|---|---|
| Alice | Engineer | Sydney |
| Bob | Designer | Melbourne |
| Charlie | Product Manager | Auckland |
| Left Aligned | Center Aligned | Right Aligned |
|---|---|---|
| Row 1 | Data | $100 |
| Row 2 | More data | $1,500 |
| Row 3 | Even more | $23,000 |
| Feature | Status | Notes |
|---|---|---|
| Parser | β Complete | Handles all CommonMark features |
| Renderer | π§ WIP | Missing table support |
| β Removed | Deprecated in v1.5.0 |
|
newEngine() |
π Shipped | See docs |
| Column A | Column B | Column C | Column D | Column E | Column F | Column G | Column H | Column I | Column J |
|---|---|---|---|---|---|---|---|---|---|
| Data 1A | Data 1B | Data 1C | Data 1D | Data 1E | Data 1F | Data 1G | Data 1H | Data 1I | Data 1J |
| Data 2A | Data 2B | Data 2C | Data 2D | Data 2E | Data 2F | Data 2G | Data 2H | Data 2I | Data 2J |
Three different syntaxes:
All three should produce identical horizontal lines.
- Ampersand: &
- Less than: <
- Greater than: >
- Non-breaking space: Β (between these words)
- Copyright: Β© 2025
- En dash: β
- Em dash: β
- Curly quotes: βHelloβ and βHiβ
Click to expand this collapsible section
This content is hidden by default. It demonstrates that raw HTML works inside Markdown.
- List inside details
- Another item
print("Code inside a collapsible section!")Here are some common emoji shortcodes (GitHub-flavored Markdown):
- π Launch
- π Celebration
β οΈ Warning- π Bug report
- π Documentation
- β¨ New feature
- π₯ Hot fix
- β Done
- π§ Work in progress
- β Removed
- π Approved
- β€οΈ Love it
Here is a sentence with a footnote1. And here is another one2.
Markdown : A lightweight markup language for creating formatted text using a plain-text editor.
CommonMark : A strongly-defined, highly compatible specification of Markdown, created to resolve ambiguities in the original spec.
GFM (GitHub Flavored Markdown) : A superset of CommonMark with extensions like tables, task lists, strikethrough, and autolinks.
Inline math: The equation
Block math:
*[HTML]: Hyper Text Markup Language *[CSS]: Cascading Style Sheets *[GFM]: GitHub Flavored Markdown
The HTML and CSS specs are maintained by the W3C. GFM is maintained by GitHub.
These characters are normally special in Markdown but are escaped here:
* not bold *
# not a heading
[ not a link ]
> not a blockquote
- not a list item
| not a table cell |
` not inline code `
\ a literal backslash
_ not italic _
~ not strikethrough ~
(The heading above is empty -- just ### with nothing after it.)
- Item with content
- Another item with content
- Level 1
- Level 2
- Level 3
- Level 4
- Level 5
- Level 6
- Level 7 -- how deep can your parser go?
- Level 6
- Level 5
- Level 4
- Level 3
- Level 2
This is a single paragraph with an intentionally very long line that does not contain any line breaks. The purpose of this line is to test how the renderer handles horizontal overflow, word wrapping, and scrolling behavior. In many editors and preview tools, a line this long will either wrap naturally at the container boundary, or it will cause a horizontal scrollbar to appear. Either way, this tests an important edge case. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
| Category | Characters |
|---|---|
| Arrows | <-- --> <-> => ==> |
| Currency | $ EUR JPY GBP |
| Math symbols | +- x / != <= >= ~ approx |
| Accented | cafe resume naive |
| CJK | Hanzi Hiragana Katakana |
| Emoji (literal) | Hello World Fire Stars |
| Zero-width chars | AβB (zero-width space between A and B) |
| Right-to-left | Merhaba Dunya |
First quote.
Second quote -- should these merge or stay separate?
- List item one
- List item two This text comes right after the list without a blank line. Some parsers treat it as part of the last list item; others treat it as a new paragraph.
The file path [not a real link] and the bracket text [another fake] should not become clickable if there is no URL.
But this one is real.
The story of markup languages begins long before the web. In the 1960s, IBM developed GML (Generalized Markup Language) to manage large volumes of documentation for their mainframes. This system allowed technical writers to annotate documents with structural metadata -- headings, paragraphs, lists -- without worrying about presentation. The key insight was separating content from formatting, an idea that would echo through decades of computing history.
GML evolved into SGML (Standard Generalized Markup Language), ratified as an ISO standard in 1986. SGML was powerful but complex. It could describe virtually any document structure, but its flexibility came at a cost: the specification ran to hundreds of pages, and building a conforming parser was a formidable engineering challenge.
Tim Berners-Lee, working at CERN in the late 1980s, needed something simpler. His goal was to link documents across the nascent internet so that physicists could share research. He created HTML (HyperText Markup Language) as an application of SGML -- a small, fixed vocabulary of tags designed for a specific purpose. HTML was intentionally limited. You could create headings, paragraphs, lists, and links. That was about it. And that simplicity was its greatest strength.
The web exploded in the 1990s. HTML grew rapidly, accreting new elements with each browser war. Tables, frames, font tags, blink tags -- the language became a chaotic mix of structure and presentation. The W3C responded with CSS to handle presentation and XHTML to impose stricter syntax rules. But for many authors, writing raw HTML felt like programming when all they wanted to do was write.
Enter Markdown. In 2004, John Gruber, with contributions from Aaron Swartz, released a lightweight markup syntax that could be converted to HTML. The philosophy was radical in its simplicity: Markdown should be readable as plain text. A paragraph is just a paragraph. A heading is a line prefixed with #. A list is lines prefixed with -. No angle brackets, no closing tags, no attributes.
Markdown spread quickly through the developer community. GitHub adopted it for README files and comments. Stack Overflow used it for questions and answers. Blogging platforms, documentation tools, and note-taking apps all embraced it. Its popularity revealed a latent demand: people wanted to write structured content without the overhead of a markup language designed for machines.
But Markdown's simplicity also created problems. Gruber's original specification was deliberately informal, leaving many edge cases undefined. What happens when you nest a blockquote inside a list inside another blockquote? Different parsers gave different answers. The CommonMark project, launched in 2014, aimed to resolve these ambiguities with a rigorous specification and a comprehensive test suite.
Today, Markdown exists in many flavors: CommonMark, GitHub Flavored Markdown (GFM), MultiMarkdown, Pandoc Markdown, and more. Each adds its own extensions -- tables, footnotes, task lists, math notation -- while trying to preserve the core promise of readability.
The journey from GML to Markdown spans half a century of computing, but the core insight remains the same: the best tools for writing are the ones that get out of the way and let the author focus on what they want to say.
If you are building a Markdown importer, you already know that the happy path is easy. A heading, a paragraph, some bold text -- any parser can handle that. The hard part is the edges: the deeply nested list that breaks your recursive renderer, the table with a pipe character inside inline code, the footnote that references another footnote, the blockquote that contains a code block that contains a table.
This file exists to push your parser to its limits. Every section above was designed to probe a specific behavior. If your importer can render this entire document correctly -- headings, lists, code blocks, tables, footnotes, math, emoji, HTML entities, edge cases, and all -- then it can handle virtually anything a user will throw at it.
Good luck, and happy parsing.
Generated as a comprehensive Markdown test fixture. Last updated: 2025.

