Pre-process markdown code blocks with external tools to produce html. Because we want to do everything with markdown right?

Usage no npm install needed!

<script type="module">
  import exemd from 'https://cdn.skypack.dev/exemd';


exemd NPM version

[object Object]

Install globally with npm:

npm i -g exemd


    exemd list
    exemd FILE [ -r | --raw ] [ -g | --force-png ] [ -p | --pdf ]
    exemd -h | --help

    -g, --force-png     Generate html+png(inline). Default is html+svg(inline).
    -r, --raw           Generate md+png(inline).
    -p, --pdf           Generate md+pdf(external). Output can be used by pandoc to generate pdf docs.
    -h, --help

    list                List available plugins

    FILE                markdown file name.

What is it

It is a markdown pre-processor that runs code inside code blocks, by pasting the output back into the original document. Regarding output:

  • The default output is HTML+SVG while option -g forces HTML+PNG.

  • If you need markdown, use -r for Markdown+PNG. If you need Markdown+PDF (compatible with pdf generation in pandoc), use -p.


As of March 2015, I am rewriting the documentation of the plugins. Stay tuned for other updates.

Available plugins:

To see the list of currently available plugins and links to the docs, type:

> exemd list

If you are on NPM.js, look here for more examples.


Each Markdown code block should begin with the language specifier followed by a bang (!) between brackets {}, e.g., if you have a diagram in the dot language:

```{dot !}

digraph {
        a -> b[label="0.2",weight="0.2"];
        a -> c[label="0.4",weight="0.4"];
        c -> b[label="0.6",weight="0.6"];
        c -> e[label="0.6",weight="0.6"];
        e -> e[label="0.1",weight="0.1"];
        e -> b[label="0.7",weight="0.7"];


exemd will invoke the exemd-dot plugin (which should be installed separately). The plugin will parse the block code by invoking the actual dot executable and the parsed svg will be pasted into the final markdown (or html).

Depending on the plugin, you can also pass parameters (just as in org-mode)

```{plugin-name ! plugin parameters string}



This section is obsolete, wait for the new documentation that should arrive soon.

Look for npm modules prefixed with exemd. I wrote only exemd-dot and exemd-ditaa for diagrams. Feel free to provide plugins for R (like kintr) or other languages.

Each plugin should export a process(block, opts) function, where:

  • block is the string representing the inner part of the block code

  • opts is an object with the following properties:

    • tmpdir an already setup temporary directory where the plugin can mess around but not delete.
    • params the string following the bang (!) in the block declaration
    • target-mode it can be either html, pdf, or raw

The process function should return the markdown text to replace the original block either directly or through a promise.


  • Vittorio Zaccaria


Copyright (c) 2015 Vittorio Zaccaria
Released under the license

This file was generated by verb-cli on March 20, 2015.