A command-line tool to easily generate HTML documents from Markdown files
npm install markdown-to-document





A command-line tool to easily generate HTML documents from Markdown files.
> The original purpose of this tool was to provide an alternative to using
> Microsoft Word to write and send technical documents.
>
> Use cases: replace docx and pdf files with Markdown (storage in Git,
> editing, ...) and HTML (export, sending by email, ...) files, export a
> multi-files documentation into a single HTML file, etc.
Install the CLI globally using NPM (Node.js >= 22):
``shell`
npm install markdown-to-document -g
> Linux users: EACCES permissions errors when installing packages globally?
> → Follow this guide
> to resolve them.
Compile Markdown files (path) into HTML documents.
`shell`
mdtodoc [options]
Read usage examples to learn how to use the CLI.
| Option | Description |
| ------------------------------- | --------------------------------------------- |
| -V, --version | Output the version number |-d, --dest [value]
| | Destination path (default: next to .md files) |-j, --join
| | Concatenate all files before compilation |-l, --layout [value]
| | HTML layout |-t, --theme [value]
| | CSS theme |-s, --highlight-style [value]
| | Syntax highlighting style |-n, --numbered-headings
| | Enable numbered headings |-c, --code-copy
| | Enable copy code button |-m, --mermaid
| | Enable mermaid |-e, --embed-mode [value]
| | Embed external resources (default: default) |-x, --extension [value...]
| | Extension scripts |-w, --watch
| | Watch input files and compile on change |-h, --help
| | Output usage information |
#### Destination (--dest)
The destination path can be used to change where output HTML files are written.
#### Join (--join)
The --join option concatenates all Markdown source files in one (MERGED.md)MERGED.html
before running the compilation (→ ):
- _Sorting_: README.md and index.md files first, other .md files and---
sub-directories next
- _Front matter_: remove YAML (), TOML (+++) or JSON (;;;) front matter#
from source files
- _Titles_: refactor titles level ( syntax only) according to path depth<...>
- _Paths_: refactor relative paths ()
- _Table of contents_: remove table of contents tokens from child pages
This feature, _experimental and not very configurable for the moment_, can be
very useful to export a multi-files documentation into a single HTML file.
#### Layout (--layout)
A layout is an HTML template used as a base for the output HTML file, e.g.:
`html`
{{ styles }}
{{ body }}
{{ scripts }}
The --layout option can receive the name of a presetpage
(e.g. for page.html) or the path to a custom layout filepath/to/my-layout.html
( or a HTTP URL).
#### Theme (--theme)
A theme is a CSS stylesheet included in the HTML layout.
The --theme option can receive the name of a preset (e.g. github)path/to/my-theme.css
or the path to a custom theme file ( or an HTTP URL).
#### Highlight style (--highlight-style)
Highlight style enables syntax highlighting of code blocks by including the
required script and style in the HTML layout.
The --highlight-style option can receive the name of amonokai
Hightlight.js style
(file name without extension, e.g. ) or the path to a custom style
file (a local path or an HTTP URL).
#### Additional features
_Markdown To Document_ includes additional features:
- Numbered headings (--numbered-headings): enable automatic headingsh2
numbering ( to h6, e.g. 1.1.1.)--code-copy
- Code copy (): add a button Copy in each--mermaid
code block to easily copy the block content
- Mermaid (): add support for mermaid ``
diagrams using fenced code blocks (mermaid ), e.g.:
```markdown`mermaid`
flowchart LR
Markdown --mdtodoc--> HTML``
`mermaid`
flowchart LR
Markdown --mdtodoc--> HTML
#### Embed mode (--embed-mode)
The --embed-mode option allows to inline externally referenced resources
(JS, CSS and images) to output a single HTML file without external dependencies
(it can lead to a large output file).
3 modes are available:
- light: inline light scripts (< 16 KB), stylesheets and light imagesdefault
(< 16 KB)
- : inline light scripts (< 16 KB), stylesheets and all imagesfull
(default)
- : inline everything
#### Extensions (--extension)
The --extension option allows to provide paths to extension scripts to
further customize document generation.
An extension is a JavaScript file using ECMAScript modules format with up to
five exported functions corresponding to available hooks, taking an object in
parameter, doing some modifications on it, and returning it.
`js`
export function hookName({ arg1, arg2, ... }) {
// Modify then return arguments
return { arg1, arg2, ... };
}
These hooks (and their arguments) are available:
- postInit: called after compiler initialization and before source file
loading
- mdIt (MarkdownIt): Markdown.it instance, configure it further, or even.use(...)
load additional plugins with the methodpreCompile
- : called after source file loading and before Markdownmd
compilation
- (string): Markdown documentpreRender
- : called after Markdown compilation and before template/layouttitle
rendering
- (string): HTML document titlestyles
- (string[]): CSS stylesheet URLsscripts
- (string[]): JS scripts URLsbody
- (string): HTML document bodypreInline
- : called after rendering and before inlininghtml
- (string): full HTML documentpreWrite
- : called after inlining and before writing to the output filehtml
- (string): full HTML documentpath
- (string): output file path
Compile a single Markdown file (doc.md) into HTML (doc.html)
`shell`
mdtodoc doc.md
Watch and compile multiple Markdown files using glob syntax
`shell`
mdtodoc *.md --watch
Compile multiple Markdown files into a single HTML file (MERGED.html)
`shell`
mdtodoc *.md --join
Improve the HTML output with a layout, a theme and a highlight style
`shell`
mdtodoc doc.md --layout "page" --theme "github" --highlight-style "atom-one-light"
The compiled Markdown is now included into the predefined layout page
and some CSS styling is added directly into the HTML file.
Enable additional features
`shell`
mdtodoc doc.md -l "page" -t "github" -s "atom-one-light" --numbered-headings --code-copy --mermaid
HTML headings are now automatically numbered, a Copy button
is added in each
code block to copy the content, and diagramsmermaid
are generated fromcode blocks (``mermaid).Embed all externally referenced resources
``
shell`
mdtodoc doc.md -l "page" -t "github" -s "atom-one-light" -n -c --embed-mode "full"All external resources (CSS, JS and images) referenced in the Markdown file
are now embedded into the output HTML file.Use a custom layout (local file) and a custom highlight style (URL)
`
shell`
mdtodoc doc.md -l "./assets/layouts/page.html" -t "github" -s "https://raw.githubusercontent.com/highlightjs/highlight.js/main/src/styles/monokai.css" -n -cRead options documentation for more information on how to use
--layout,--themeand--highlight-styleoptions.Use an extension to do more customization
`
shell`
mdtodoc doc.md -l "page" --extension "./test/data/extension/uppercase_title.js"Title in the output HTML document (
[...] ) is now uppercase.docs/Export a Markdown documentation in a GitLab CI pipeline
In a GitLab repository with Markdown files inside the
folder,.gitlab-ci.yml
the following job can be defined (in) to export all the`
documentation as a single HTML file:yaml`
export-doc:
stage: doc
image: node:lts
before_script:
- npm i markdown-to-document -g
script:
- mdtodoc "docs/*/.md" --join -l "page" -t "github" -s "atom-one-light" -n -c
- mv docs/MERGED.html ./docs.html
artifacts:
paths:
- docs.html`Resources
$3
#### Code editors
Although Markdown documents are simple text files and can be written using
basic text editors, most code editors provide features and extensions to make
writing these documents easier, e.g.:- Markdown All in One
(Visual Studio Code)
- MarkdownEditing (Sublime Text)#### Formatting
Markdown files can be easily formatted with code editors
using built-in features or additional extensions but code formatters like
Prettier also do a good job:shell`
npm install --global prettier
prettier --check "*.md"
prettier --write "*.md"markdown-it-abbr$3
_Markdown To Document_ uses the Markdown.it
compiler and the following plugins to generate HTML code from Markdown:-
- Abbreviation () tag supportmarkdown-it-anchor
-- Header anchors (permalinks) supportmarkdown-it-container
-- Custom block containers (:::) supportmarkdown-it-deflist
-- Definition list (
) tag supportmarkdown-it-emoji
-- Emoji syntax (:memo:→ :memo:) supportmarkdown-it-footnote
-- Footnotes ([^1]) supportmarkdown-it-ins
-- Inserted () tag supportmarkdown-it-mark
-- Marked () tag supportmarkdown-it-sub
-- Subscript () tag supportmarkdown-it-sup
-- Superscript () tag supportmarkdown-it-task-lists
-- Task lists (- [ ]/- [x]) supportmarkdown-it-toc-done-right
-- Table of contents ([[toc]]) supportmdtodocAdditional features also use the following packages:
- highlight.js - JavaScript syntax highlighter with
language auto-detection and zero dependencies
- web-resource-inliner - Inlines
img, script and link tags into the same file
- clipboard.js - A modern approach to copy text to
clipboard
- chokidar - Minimal and efficient
cross-platform file watching library
- mermaid - Generate diagrams from markdown-like textOpen package.json to see the full list of dependencies.
Development
- Link the
command for development:npm linknpm unlink
- Unlink:npm run format[:check]
- Format code with Prettier:npm run lint
- Lint code with ESLint:npm run build:assets
- Build assets:npm run test[:coverage]
- Run tests:npx npm-check-updates -u`
- Upgrade dependencies:License
Markdown To Document is licensed under the GNU General Public License.