Skip to main content

nide

A bound volume (Finnish: nide) — assemble Markdown source files into gfm-plus, html, and pdf channel outputs.

Requires Python 3.11 or later.

Install

pip install nide

Manual

The man page provides the CLI reference (man nide after placing the file on your MANPATH):

mkdir -p ~/.local/share/man/man1
cp docs/nide.1 ~/.local/share/man/man1/

Quickstart

Run nide with no arguments for a usage summary, or nide --version to check the installed version. For a dedicated feature walkthrough you can follow in minutes visit quickstart. A step-by-step guided build of a document pipeline is provided in the tutorial.

Pipeline

nide harvest              →  build/section-*.json, build/example-*.json

nide assemble -t html     →  build/tmp.md, build/toc-mint.json
pandoc                    →  build/tmp.html
nide inject               →  build/injected.html
tidy                      →  delivery HTML

nide assemble -t pdf      →  build/pdf.md
liitos                    →  delivery PDF

Commands

nide has seven subcommands. Every name accepts any unambiguous prefix — nide a = assemble, nide ej = eject, nide ex = explain, etc.

nide assemble splices a list of Markdown source files into a single assembled document, driving channel-specific transformations:

  • Section headings are numbered and anchored for html and gfm-plus.
  • Citation definition files are expanded into formatted inline citation entries.
  • Glossary definition files are expanded into <dl> elements for the html channel.
  • Cross-references ([sec](#label), [cite](#label), [eg](#label)) are resolved from JSON look-up tables produced by nide harvest.
  • A table-of-contents data file (build/toc-mint.json) is written alongside the html output.

nide inject post-processes the HTML file that pandoc has produced from nide's build/tmp.md, applying:

  • Custom HTML table of contents (built from build/toc-mint.json).
  • <title> element replaced with the value of html-title from config.
  • Base and skin CSS inlined; <link> tags removed.
  • Remote logo URL replaced with a local data URL.
  • Image src attributes optionally replaced with base64 data URLs.

The result is written to build/injected.html.

nide harvest scans the Markdown sources and writes JSON look-up table (LUT) files for section and example cross-references. Run it before nide assemble whenever source files change.

nide explain performs a dry-run walkthrough without writing any output files. It prints config values, binder contents with exist/missing tags, channel exclusions, auxiliary source file status, and LUT file presence. Useful for diagnosing why an assembly produces unexpected output.

nide doctor [--fix] scans the project layout and reports findings at ERROR or WARN level: missing directories, binder file, source files, first-authored-section heading, auxiliary sources, and LUT files. With --fix, it creates missing directories and runs nide harvest to generate absent LUT files.

nide eject emits a fully-commented nide.yaml template to stdout. Use -o PATH to write it to a file; add -f to overwrite an existing file.

nide version (also -V / --version) prints the installed version and exits.

Three output channels are supported in assembly:

Channel Output Intended consumer
html build/tmp.md + build/toc-mint.json pandoc → nide inject
gfm-plus build/tmp.md direct delivery
pdf build/pdf.md liitos

Configuration

All settings are read from etc/nide.yaml (override with -c). Every key is optional; the built-in defaults are listed below.

Assembly keys

binder: bind.txt
binder-ignores:
  gfm-plus: []
  html: []
  pdf: []
build-path: build
citation-skip-prefixes:
- '#'
citation-sources: []
cite-cosmetics-template: '**\[**<span id="$label$" class="anchor"></span>**$code$\]** $text$'
delete-when:
- contains: '<mark title="Ephemeral region marking">'
  delete:
  - '<mark title="Ephemeral region marking">'
  - '</mark>'
etc-path: etc
first-authored-section: '# Scope'
glossary-sources: []
html-title: No Title Given
logo-local-path: images/OASISLogo-v3.0.png
logo-url: https://docs.oasis-open.org/templates/OASISLogo-v3.0.png
sec-no-toc-postfix: '{.unnumbered .unlisted}'
section-display-to-label-db: section-display-to-label.json
section-display-to-text-db: section-display-to-text.json
section-label-to-display-db: section-label-to-display.json
section-reference-style: number
source-path: src
toc-template:
- '$sec_cnt_disp$ [$text$](#$label$)  '
- "\t$sec_cnt_disp$ [$text$](#$label$)  "
- "\t\t$sec_cnt_disp$ [$text$](#$label$)  "
- "\t\t\t$sec_cnt_disp$ [$text$](#$label$)  "
- "\t\t\t\t$sec_cnt_disp$ [$text$](#$label$)  "
tok-sec: "<a id='$thing$'></a>"
track-examples: false

The section-*-db files are look-up tables produced by nide harvest and must be present before running nide assemble with cross-references.

Inject keys

HTML post-processing settings live under the html-inject: block:

html-inject:
  css-base: ''              # path to base CSS file (empty = skip)
  css-skin: ''              # path to skin CSS file
  images: false             # inline local images as base64 data URLs
  images-path: build/data-url
  intro-trigger: ''         # HTML trigger for TOC end; both triggers required
  logo-data-url: ''         # path to logo data URL .txt file (empty = skip)
  logo-remote-url: ''       # remote logo URL to replace
  toc-trigger: '<h1 id="table-of-contents'

Both toc-trigger and intro-trigger must be non-empty for TOC replacement to occur. The trigger values are pandoc-generated HTML id attributes and depend on the heading text.

Options

Global options

nide [-V|--version]
nide version
Option Description
-V, --version Print version string and exit
version Subcommand alias for --version

Subcommand names accept any unambiguous prefix: nide a = assemble, nide ej = eject, nide ex = explain, nide v = version, etc.

nide assemble

nide assemble [-d|--debug] [-c PATH|--config PATH] [-t CHANNEL|--target CHANNEL]
Option Default Description
-t CHANNEL html Output channel: gfm-plus, html, or pdf
-c PATH etc/nide.yaml Path to the assembly configuration file
-d off Debug mode: write per-stage snapshot files

nide inject

nide inject [-c PATH|--config PATH]
Option Default Description
-c PATH etc/nide.yaml Path to the assembly configuration file

nide harvest

nide harvest [-c PATH|--config PATH]
Option Default Description
-c PATH etc/nide.yaml Path to the assembly configuration file

nide explain

nide explain [-c PATH|--config PATH] [-t CHANNEL|--target CHANNEL]
Option Default Description
-c PATH etc/nide.yaml Path to the assembly configuration file
-t CHANNEL (all channels) Limit channel-exclusion display to one channel

nide doctor

nide doctor [-c PATH|--config PATH] [--fix]
Option Default Description
-c PATH etc/nide.yaml Path to the assembly configuration file
--fix off Create missing directories and run nide harvest

Exit code is 1 if any ERROR-level check fails; 0 otherwise (warnings alone → 0).

nide eject

nide eject [-o PATH|--output PATH] [-f|--force]
Option Default Description
-o PATH stdout Write the template to PATH instead of stdout
-f off Overwrite PATH if it already exists

Environment

Variable Effect
NIDE_CONFIG Default config path when -c is not given (all subcommands)
NIDE_DEBUG Enable debug output; equivalent to -d (assemble mode)
DUMP_LUT Write back section LUT files to etc-path after assembly

Dependencies

Design and requirements

Document Identifier File
Software Requirements Specification KOO-SRS-001 requirements/srs/
Software Design Description KOO-SDD-001 design/sdd/

Both documents follow the MIL-STD-498 DID structure and are rendered into the documentation site alongside the quickstart and tutorial.

Bug Tracker

Any feature requests or bug reports shall go to the todos of nide.

Primary Source repository

The main source of nide is on a mountain in Central Switzerland under configuration control (fossil).

Contributions

If you like to share small changes under the repositories license please kindly do so by sending a patchset. You can send such a patchset per email using git send-email.

Support

Please kindly submit issues at https://todo.sr.ht/~sthagen/nide or write plain text email to ~sthagen/nide@lists.sr.ht to support. Thanks.

Changes

See docs/changes.md for the release history.

Coverage

The test suite maintains high branch coverage (≥99%). The HTML report (if generated) is in site/coverage/.

SBOM

Runtime dependency information is published in docs/sbom/ in SPDX 3.0 (JSON-LD) and CycloneDX 1.6 (JSON) formats. See docs/sbom/README.md for the component inventory and validation guide.

Download files

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

Source Distribution

nide-2026.7.5.tar.gz (60.4 kB view details)

Uploaded Source

Built Distribution

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

nide-2026.7.5-py3-none-any.whl (37.4 kB view details)

Uploaded Python 3

File details

Details for the file nide-2026.7.5.tar.gz.

File metadata

  • Download URL: nide-2026.7.5.tar.gz
  • Upload date:
  • Size: 60.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.5

File hashes

Hashes for nide-2026.7.5.tar.gz
Algorithm Hash digest
SHA256 1ccb3dc1e2260050a4c1989bc0c101a017ab4eeffd02c8d7217dc59c220383b2
MD5 a8d3131fc1d65f3d71d10a75c06a1827
BLAKE2b-256 2f260e4db9ccf4bd07e55b8227432e9862ab71b2f8164a74c2c567c3e9dc0eb1

See more details on using hashes here.

File details

Details for the file nide-2026.7.5-py3-none-any.whl.

File metadata

  • Download URL: nide-2026.7.5-py3-none-any.whl
  • Upload date:
  • Size: 37.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.5

File hashes

Hashes for nide-2026.7.5-py3-none-any.whl
Algorithm Hash digest
SHA256 7d9ce9f261e196677d609df1613a55a034b60143c6474acad2161afcb594d542
MD5 484ccf13d6deb22941ce8ea59036b641
BLAKE2b-256 2e0d152effbfe6ec3248e1b5d9c8182e9201d8a437bd435f902a443ae80fa3be

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 Sentry Error logging StatusPage Status page