Converts Markdown to HTML using marked.js, pandoc, or similar tools; supports Jekyll/Hugo templating for static sites. Handles rendering, batch conversion, GFM/CommonMark in Node.js/CLI workflows.
From awesome-copilotnpx claudepluginhub ctr26/dotfiles --plugin awesome-copilotThis skill uses the workspace's default tool permissions.
references/basic-markdown-to-html.mdreferences/basic-markdown.mdreferences/code-blocks-to-html.mdreferences/code-blocks.mdreferences/collapsed-sections-to-html.mdreferences/collapsed-sections.mdreferences/gomarkdown.mdreferences/hugo.mdreferences/jekyll.mdreferences/marked.mdreferences/pandoc.mdreferences/tables-to-html.mdreferences/tables.mdreferences/writing-mathematical-expressions-to-html.mdreferences/writing-mathematical-expressions.mdFetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Uses ctx7 CLI to fetch current library docs, manage AI coding skills (install/search/generate), and configure Context7 MCP for AI editors.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Expert skill for converting Markdown documents to HTML using the marked.js library, or writing data conversion scripts; in this case scripts similar to markedJS/marked repository. For custom scripts knowledge is not confined to marked.js, but data conversion methods are utilized from tools like pandoc and gomarkdown/markdown for data conversion; jekyll/jekyll and gohugoio/hugo for templating systems.
The conversion script or tool should handle single files, batch conversions, and advanced configurations.
For more see basic-markdown-to-html.md
```markdown
# Level 1
## Level 2
One sentence with a [link](https://example.com), and a HTML snippet like `<p>paragraph tag</p>`.
- `ul` list item 1
- `ul` list item 2
1. `ol` list item 1
2. `ol` list item 1
| Table Item | Description |
| One | One is the spelling of the number `1`. |
| Two | Two is the spelling of the number `2`. |
```js
var one = 1;
var two = 2;
function simpleMath(x, y) {
return x + y;
}
console.log(simpleMath(one, two));
```
```
```html
<h1>Level 1</h1>
<h2>Level 2</h2>
<p>One sentence with a <a href="https://example.com">link</a>, and a HTML snippet like <code><p>paragraph tag</p></code>.</p>
<ul>
<li>`ul` list item 1</li>
<li>`ul` list item 2</li>
</ul>
<ol>
<li>`ol` list item 1</li>
<li>`ol` list item 2</li>
</ol>
<table>
<thead>
<tr>
<th>Table Item</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>One</td>
<td>One is the spelling of the number `1`.</td>
</tr>
<tr>
<td>Two</td>
<td>Two is the spelling of the number `2`.</td>
</tr>
</tbody>
</table>
<pre>
<code>var one = 1;
var two = 2;
function simpleMath(x, y) {
return x + y;
}
console.log(simpleMath(one, two));</code>
</pre>
```
For more see code-blocks-to-html.md
```markdown
your code here
```
```html
<pre><code class="language-md">
your code here
</code></pre>
```
```js
console.log("Hello world");
```
```html
<pre><code class="language-js">
console.log("Hello world");
</code></pre>
```
```markdown
```
```
visible backticks
```
```
```
```html
<pre><code>
```
visible backticks
```
</code></pre>
```
For more see collapsed-sections-to-html.md
```markdown
<details>
<summary>More info</summary>
### Header inside
- Lists
- **Formatting**
- Code blocks
```js
console.log("Hello");
```
</details>
```
```html
<details>
<summary>More info</summary>
<h3>Header inside</h3>
<ul>
<li>Lists</li>
<li><strong>Formatting</strong></li>
<li>Code blocks</li>
</ul>
<pre>
<code class="language-js">console.log("Hello");</code>
</pre>
</details>
```
For more see writing-mathematical-expressions-to-html.md
```markdown
This sentence uses `$` delimiters to show math inline: $\sqrt{3x-1}+(1+x)^2$
```
```html
<p>This sentence uses <code>$</code> delimiters to show math inline:
<math-renderer><math xmlns="http://www.w3.org/1998/Math/MathML">
<msqrt><mn>3</mn><mi>x</mi><mo>−</mo><mn>1</mn></msqrt>
<mo>+</mo><mo>(</mo><mn>1</mn><mo>+</mo><mi>x</mi>
<msup><mo>)</mo><mn>2</mn></msup>
</math>
</math-renderer>
</p>
```
```markdown
**The Cauchy-Schwarz Inequality**\
$$\left( \sum_{k=1}^n a_k b_k \right)^2 \leq \left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right)$$
```
```html
<p><strong>The Cauchy-Schwarz Inequality</strong><br>
<math-renderer>
<math xmlns="http://www.w3.org/1998/Math/MathML">
<msup>
<mrow><mo>(</mo>
<munderover><mo data-mjx-texclass="OP">∑</mo>
<mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi>
</munderover>
<msub><mi>a</mi><mi>k</mi></msub>
<msub><mi>b</mi><mi>k</mi></msub>
<mo>)</mo>
</mrow>
<mn>2</mn>
</msup>
<mo>≤</mo>
<mrow><mo>(</mo>
<munderover><mo>∑</mo>
<mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow>
<mi>n</mi>
</munderover>
<msubsup><mi>a</mi><mi>k</mi><mn>2</mn></msubsup>
<mo>)</mo>
</mrow>
<mrow><mo>(</mo>
<munderover><mo>∑</mo>
<mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow>
<mi>n</mi>
</munderover>
<msubsup><mi>b</mi><mi>k</mi><mn>2</mn></msubsup>
<mo>)</mo>
</mrow>
</math>
</math-renderer></p>
```
For more see tables-to-html.md
```markdown
| First Header | Second Header |
| ------------- | ------------- |
| Content Cell | Content Cell |
| Content Cell | Content Cell |
```
```html
<table>
<thead><tr><th>First Header</th><th>Second Header</th></tr></thead>
<tbody>
<tr><td>Content Cell</td><td>Content Cell</td></tr>
<tr><td>Content Cell</td><td>Content Cell</td></tr>
</tbody>
</table>
```
```markdown
| Left-aligned | Center-aligned | Right-aligned |
| :--- | :---: | ---: |
| git status | git status | git status |
| git diff | git diff | git diff |
```
```html
<table>
<thead>
<tr>
<th align="left">Left-aligned</th>
<th align="center">Center-aligned</th>
<th align="right">Right-aligned</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">git status</td>
<td align="center">git status</td>
<td align="right">git status</td>
</tr>
<tr>
<td align="left">git diff</td>
<td align="center">git diff</td>
<td align="right">git diff</td>
</tr>
</tbody>
</table>
```
markedJS/markednpm install -g markednpm install markedSee marked.md Quick Conversion Methods
See marked.md Step-by-Step Workflows
Create ~/.marked.json for persistent options:
{
"gfm": true,
"breaks": true
}
Or use a custom config:
marked -i input.md -o output.html -c config.json
| Option | Description |
|---|---|
-i, --input <file> | Input Markdown file |
-o, --output <file> | Output HTML file |
-s, --string <string> | Parse string instead of file |
-c, --config <file> | Use custom config file |
--gfm | Enable GitHub Flavored Markdown |
--breaks | Convert newlines to <br> |
--help | Show all options |
⚠️ Marked does NOT sanitize output HTML. For untrusted input, use a sanitizer:
import { marked } from 'marked';
import DOMPurify from 'dompurify';
const unsafeHtml = marked.parse(untrustedMarkdown);
const safeHtml = DOMPurify.sanitize(unsafeHtml);
Recommended sanitizers:
| Flavor | Support |
|---|---|
| Original Markdown | 100% |
| CommonMark 0.31 | 98% |
| GitHub Flavored Markdown | 97% |
| Issue | Solution |
|---|---|
| Special characters at file start | Strip zero-width chars: content.replace(/^[\u200B\u200C\u200D\uFEFF]/,"") |
| Code blocks not highlighting | Add a syntax highlighter like highlight.js |
| Tables not rendering | Ensure gfm: true option is set |
| Line breaks ignored | Set breaks: true in options |
| XSS vulnerability concerns | Use DOMPurify to sanitize output |
pandoc# Convert markdown to HTML
pandoc input.md -o output.html
# Convert with standalone document (includes header/footer)
pandoc input.md -s -o output.html
# Explicit format specification
pandoc input.md -f markdown -t html -s -o output.html
# Start pandoc as a filter
pandoc
# Type markdown, then Ctrl-D (Linux/macOS) or Ctrl-Z+Enter (Windows)
Hello *pandoc*!
# Output: <p>Hello <em>pandoc</em>!</p>
# HTML to Markdown
pandoc -f html -t markdown input.html -o output.md
# Markdown to LaTeX
pandoc input.md -s -o output.tex
# Markdown to PDF (requires LaTeX)
pandoc input.md -s -o output.pdf
# Markdown to Word
pandoc input.md -s -o output.docx
| Option | Description |
|---|---|
-f, --from <format> | Input format (markdown, html, latex, etc.) |
-t, --to <format> | Output format (html, latex, pdf, docx, etc.) |
-s, --standalone | Produce standalone document with header/footer |
-o, --output <file> | Output file (inferred from extension) |
--mathml | Convert TeX math to MathML |
--metadata title="Title" | Set document metadata |
--toc | Include table of contents |
--template <file> | Use custom template |
--help | Show all options |
⚠️ Pandoc processes input faithfully. When converting untrusted markdown:
--sandbox mode to disable external file access# Run in sandbox mode for untrusted input
pandoc --sandbox input.md -o output.html
| Flavor | Support |
|---|---|
| Pandoc Markdown | 100% (native) |
| CommonMark | Full (use -f commonmark) |
| GitHub Flavored Markdown | Full (use -f gfm) |
| MultiMarkdown | Partial |
| Issue | Solution |
|---|---|
| PDF generation fails | Install LaTeX (MacTeX, MiKTeX, or texlive) |
| Encoding issues on Windows | Run chcp 65001 before using pandoc |
| Missing standalone headers | Add -s flag for complete documents |
| Math not rendering | Use --mathml or --mathjax option |
| Tables not rendering | Ensure proper table syntax with pipes and dashes |
gomarkdown/markdowngo get github.com/gomarkdown/markdowngo install github.com/gomarkdown/mdtohtml@latestpackage main
import (
"fmt"
"github.com/gomarkdown/markdown"
)
func main() {
md := []byte("# Hello World\n\nThis is **bold** text.")
html := markdown.ToHTML(md, nil, nil)
fmt.Println(string(html))
}
# Install mdtohtml
go install github.com/gomarkdown/mdtohtml@latest
# Convert file
mdtohtml input.md output.html
# Convert file (output to stdout)
mdtohtml input.md
package main
import (
"github.com/gomarkdown/markdown"
"github.com/gomarkdown/markdown/html"
"github.com/gomarkdown/markdown/parser"
)
func mdToHTML(md []byte) []byte {
// Create parser with extensions
extensions := parser.CommonExtensions | parser.AutoHeadingIDs | parser.NoEmptyLineBeforeBlock
p := parser.NewWithExtensions(extensions)
doc := p.Parse(md)
// Create HTML renderer with extensions
htmlFlags := html.CommonFlags | html.HrefTargetBlank
opts := html.RendererOptions{Flags: htmlFlags}
renderer := html.NewRenderer(opts)
return markdown.Render(doc, renderer)
}
The mdtohtml CLI tool has minimal options:
mdtohtml input-file [output-file]
For advanced configuration, use the Go library programmatically with parser and renderer options:
| Parser Extension | Description |
|---|---|
parser.CommonExtensions | Tables, fenced code, autolinks, strikethrough, etc. |
parser.AutoHeadingIDs | Generate IDs for headings |
parser.NoEmptyLineBeforeBlock | No blank line needed before blocks |
parser.MathJax | MathJax support for LaTeX math |
| HTML Flag | Description |
|---|---|
html.CommonFlags | Common HTML output flags |
html.HrefTargetBlank | Add target="_blank" to links |
html.CompletePage | Generate complete HTML page |
html.UseXHTML | Generate XHTML output |
⚠️ gomarkdown does NOT sanitize output HTML. For untrusted input, use Bluemonday:
import (
"github.com/microcosm-cc/bluemonday"
"github.com/gomarkdown/markdown"
)
maybeUnsafeHTML := markdown.ToHTML(md, nil, nil)
html := bluemonday.UGCPolicy().SanitizeBytes(maybeUnsafeHTML)
Recommended sanitizer: Bluemonday
| Flavor | Support |
|---|---|
| Original Markdown | 100% |
| CommonMark | High (with extensions) |
| GitHub Flavored Markdown | High (tables, fenced code, strikethrough) |
| MathJax/LaTeX Math | Supported via extension |
| Mmark | Supported |
| Issue | Solution |
|---|---|
| Windows/Mac newlines not parsed | Use parser.NormalizeNewlines(input) |
| Tables not rendering | Enable parser.Tables extension |
| Code blocks without highlighting | Integrate with syntax highlighter like Chroma |
| Math not rendering | Enable parser.MathJax extension |
| XSS vulnerabilities | Use Bluemonday to sanitize output |
jekyllgem install jekyll bundler# Create a new Jekyll site
jekyll new myblog
# Change to site directory
cd myblog
# Build and serve locally
bundle exec jekyll serve
# Access at http://localhost:4000
# Build site to _site directory
bundle exec jekyll build
# Build with production environment
JEKYLL_ENV=production bundle exec jekyll build
# Serve with live reload
bundle exec jekyll serve --livereload
# Serve with drafts
bundle exec jekyll serve --drafts
| Command | Description |
|---|---|
jekyll new <path> | Create new Jekyll site |
jekyll build | Build site to _site directory |
jekyll serve | Build and serve locally |
jekyll clean | Remove generated files |
jekyll doctor | Check for configuration issues |
| Serve Options | Description |
|---|---|
--livereload | Reload browser on changes |
--drafts | Include draft posts |
--port <port> | Set server port (default: 4000) |
--host <host> | Set server host (default: localhost) |
--baseurl <url> | Set base URL |
⚠️ Jekyll security considerations:
safe: false in productionexclude in _config.yml to prevent sensitive files from being published# _config.yml security settings
exclude:
- Gemfile
- Gemfile.lock
- node_modules
- vendor
| Flavor | Support |
|---|---|
| Kramdown (default) | 100% |
| CommonMark | Via plugin (jekyll-commonmark) |
| GitHub Flavored Markdown | Via plugin (jekyll-commonmark-ghpages) |
| RedCarpet | Via plugin (deprecated) |
Configure markdown processor in _config.yml:
markdown: kramdown
kramdown:
input: GFM
syntax_highlighter: rouge
| Issue | Solution |
|---|---|
| Ruby 3.0+ fails to serve | Run bundle add webrick |
| Gem dependency errors | Run bundle install |
| Slow builds | Use --incremental flag |
| Liquid syntax errors | Check for unescaped { in content |
| Plugin not loading | Add to _config.yml plugins list |
hugo# Create a new Hugo site
hugo new site mysite
# Change to site directory
cd mysite
# Add a theme
git init
git submodule add https://github.com/theNewDynamic/gohugo-theme-ananke themes/ananke
echo "theme = 'ananke'" >> hugo.toml
# Create content
hugo new content posts/my-first-post.md
# Start development server
hugo server -D
# Build site to public directory
hugo
# Build with minification
hugo --minify
# Build for specific environment
hugo --environment production
# Start server with drafts
hugo server -D
# Start with live reload and bind to all interfaces
hugo server --bind 0.0.0.0 --baseURL http://localhost:1313/
# Start with specific port
hugo server --port 8080
| Command | Description |
|---|---|
hugo new site <name> | Create new Hugo site |
hugo new content <path> | Create new content file |
hugo | Build site to public directory |
hugo server | Start development server |
hugo mod init | Initialize Hugo Modules |
| Build Options | Description |
|---|---|
-D, --buildDrafts | Include draft content |
-E, --buildExpired | Include expired content |
-F, --buildFuture | Include future-dated content |
--minify | Minify output |
--gc | Run garbage collection after build |
-d, --destination <path> | Output directory |
| Server Options | Description |
|---|---|
--bind <ip> | Interface to bind to |
-p, --port <port> | Port number (default: 1313) |
--liveReloadPort <port> | Live reload port |
--disableLiveReload | Disable live reload |
--navigateToChanged | Navigate to changed content |
⚠️ Hugo security considerations:
hugo.toml for external commands--enableGitInfo carefully with public repositories# hugo.toml security settings
[security]
enableInlineShortcodes = false
[security.exec]
allow = ['^go$', '^npx$', '^postcss$']
[security.funcs]
getenv = ['^HUGO_', '^CI$']
[security.http]
methods = ['(?i)GET|POST']
urls = ['.*']
| Flavor | Support |
|---|---|
| Goldmark (default) | 100% (CommonMark compliant) |
| GitHub Flavored Markdown | Full (tables, strikethrough, autolinks) |
| CommonMark | 100% |
| Blackfriday (legacy) | Deprecated, not recommended |
Configure markdown in hugo.toml:
[markup]
[markup.goldmark]
[markup.goldmark.extensions]
definitionList = true
footnote = true
linkify = true
strikethrough = true
table = true
taskList = true
[markup.goldmark.renderer]
unsafe = false # Set true to allow raw HTML
| Issue | Solution |
|---|---|
| "Page not found" on paths | Check baseURL in config |
| Theme not loading | Verify theme in themes/ or Hugo Modules |
| Slow builds | Use --templateMetrics to identify bottlenecks |
| Raw HTML not rendering | Set unsafe = true in goldmark config |
| Images not loading | Check static/ folder structure |
| Module errors | Run hugo mod tidy |
markedJS/markedpandocgomarkdown/markdownjekyllhugo