Skip to main content

A lightweight Markdown demo runner.

Project description

md-demo

md-demo is a lightweight Markdown demo runner. It executes explicitly marked code blocks, captures stdout and stderr, and writes generated output back into the Markdown file.

It is meant for readable demo documents that stay useful as plain Markdown. It is not a notebook system, a sandbox, or a runner for untrusted code.

Warning: md-demo executes code from the document. Run only trusted files.

Install

From a source checkout:

python -m pip install -e ".[test]"

Verify the checkout:

python -m compileall -q src
pytest

Quick start

Create a Markdown file with one runtime and one executable block.

---
md-demo:
  runtime: python
---

```python exe
print("hello")
```

Run:

md-demo demo.md

md-demo updates the file in place by default and inserts a generated result block:

```python exe
print("hello")
```

<!-- md-demo: result start. Do not edit; this block is overwritten. -->
```text
hello
```
<!-- md-demo: result end -->

Do not edit generated result blocks. They are cleared and recreated on normal runs.

Document config

Every runnable document needs config with one runtime. There are two supported forms.

Use YAML front matter by default:

---
md-demo:
  runtime: python
---

If your Markdown renderer shows front matter as visible page content, use hidden HTML comment config instead:

<!-- md-demo
runtime: python
-->

Both forms are parsed only at the top of the document. md-demo preserves whichever form the document already uses by default.

To convert config style while running or clearing a document, use --config-style:

md-demo demo.md --config-style preserve
md-demo demo.md --config-style front-matter
md-demo demo.md --config-style hidden

preserve is the default and does not rewrite the config style. front-matter rewrites the document's md-demo config as YAML front matter. hidden rewrites the document's md-demo config as an HTML comment. Only the md-demo config is converted; unrelated front matter is preserved when practical.

Supported runtime values:

  • python
  • python3
  • bash
  • shell

python3 is an alias for the Python runner. shell is an alias for the bash runner, not /bin/sh.

Output labels

You can optionally add visible text before every generated output block with preface-text.

YAML front matter:

---
md-demo:
  runtime: python
  preface-text: "Output:"
---

Hidden HTML comment config:

<!-- md-demo
runtime: python
preface-text: "Output:"
-->

If preface-text is missing, empty, or null, no label is inserted. The label is generated inside the result region, so changing preface-text updates existing results the next time md-demo runs.

Executable blocks

Only matching-language fenced code blocks marked with exe run.

```python exe
print("runs")
```

Ordinary code blocks are examples only:

```python
print("shown, not run")
```

Executable blocks run top-to-bottom in one persistent runtime. Python variables, imports, functions, shell variables, and shell directory changes can carry forward to later executable blocks.

md-demo captures stdout and stderr. Python blocks should use print for values that should appear in the document. Python last-expression display is not part of v1.

CLI

Update a document in place:

md-demo demo.md

Write the updated Markdown elsewhere:

md-demo demo.md --output rendered.md

Write the updated Markdown to stdout:

md-demo demo.md --output -

Clear generated result blocks without executing code:

md-demo demo.md --clear

Rewrite config style without executing code:

md-demo demo.md --clear --config-style hidden

Print concise help:

md-demo --help

Print the detailed manual:

md-demo --manual

Failure behavior

A normal run behaves like clear and execute:

  1. Old generated results are cleared.
  2. Executable blocks run top-to-bottom.
  3. Fresh result blocks are inserted for blocks that actually ran.

If a block fails, md-demo writes output through the failed block, stops before later executable blocks, and exits nonzero. Later executable blocks are left without result blocks because they did not run.

Intentional failures should be handled inside the demo code:

try:
    validate("")
except ValueError as exc:
    print(type(exc).__name__, exc)

Converting existing documents

AI Disclosure

This tool was primarily generated with assistance from ChatGPT Codex, guided and directed by a human developer. Human involvement included requirements definition, some implementation direction, and cursory code review. The code has not undergone a comprehensive human audit or formal security review.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

md_demo-0.1.0.tar.gz (14.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

md_demo-0.1.0-py3-none-any.whl (13.1 kB view details)

Uploaded Python 3

File details

Details for the file md_demo-0.1.0.tar.gz.

File metadata

  • Download URL: md_demo-0.1.0.tar.gz
  • Upload date:
  • Size: 14.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.7

File hashes

Hashes for md_demo-0.1.0.tar.gz
Algorithm Hash digest
SHA256 c9fa3ffb33bb27ef3fa01905da9bfda3a5c6b5c5f23ce348c99ade5c68b0f56f
MD5 74e6ab61b4f94bac9550d676de3e3ad5
BLAKE2b-256 da44c68bfe213a5b9d5a2715a3698894d4b9f967af5a839b5f8a82b8fa6440b1

See more details on using hashes here.

File details

Details for the file md_demo-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: md_demo-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 13.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.7

File hashes

Hashes for md_demo-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b561bd4324055d5d0baaaff556f5af4839e038f9edbceeaf197687732252dfb4
MD5 77d0e78673b6b46f5d54bdca7ed689eb
BLAKE2b-256 38e19d936a1ef9fcd1623e7524f21543174b01fec6be6af7541e5d0c1e3a2996

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page