No description
Find a file
Noah Hellman fb663da761 modules/djot.js: ssh -> https
github ci does not like ssh
2023-02-13 18:13:48 +01:00
.github/workflows add github ci script 2023-02-13 18:13:48 +01:00
benches add bench target and scripts to run simple benchmark 2023-02-05 20:36:48 +01:00
examples/jotdown_wasm implement Render trait for html::Renderer 2023-02-10 09:46:18 +01:00
modules test suite, suite bench: update djot.js module 2023-02-05 20:36:49 +01:00
src make Event::is_{,container_}block public 2023-02-12 00:59:18 +01:00
tests test suite: skip rustfmt on generated modules 2023-02-12 00:59:18 +01:00
.gitmodules modules/djot.js: ssh -> https 2023-02-13 18:13:48 +01:00
Cargo.lock workspace: exclude jotdown-afl 2023-02-12 00:59:18 +01:00
Cargo.toml workspace: exclude jotdown-afl 2023-02-12 00:59:18 +01:00
CHANGELOG.md Release 0.1.0 2023-02-06 18:38:51 +01:00
COPYING add MIT license 2023-02-05 20:41:59 +01:00
Makefile workspace: exclude jotdown-afl 2023-02-12 00:59:18 +01:00
README.md add README.md 2023-02-05 21:59:38 +01:00

Jotdown

Jotdown is a pull parser Rust library for the Djot markup language. It parses a Djot document into a sequence of events and may also render the events to HTML.

Jotdown aims to be fast and efficient, using a minimal number of allocations. The API should use idiomatic Rust and be easy to use and flexible. The event interface allows clients to e.g. construct an AST or generate any type of output format. It also allows one to perform filters on the document before generating the output. Jotdown aims to be feature complete and match the syntax reference and the reference implementation in terms of output.

Another goal is to keep the implementation minimal and build times low. The current implementation has zero dependencies, if major non-essential features are added or larger dependencies are utilized, these should be optional using feature flags.

Jotdown supports Rust edition 2021, i.e. Rust 1.56 and above.

Usage

Jotdown is primarily a parsing library but also has a minimal CLI implementation and a simple online demo version.

Library

The Jotdown API is inspired by pulldown-cmark and is overall very similar. The Jotdown crate contains in-source documentation, a rendered version is available at https://docs.rs/jotdown.

While Jotdown is usable, it is still in early development and breaking changes to the API may occur frequently. The Djot syntax is also in quite early stages and may also change significantly.

CLI

The Jotdown crate contains a minimal implementation of a CLI that simply reads from standard input and writes HTML to standard output. It can be built from this repository and run locally with cargo:

$ cargo build --release
$ echo "hello world" | ./target/release/djot
<p>hello world</p>

Alternatively, it can be installed from the crates.io repository using simply:

$ cargo install jotdown

It will be placed in ~/.cargo/bin/jotdown.

Web demo

A version of Jotdown compiled to WebAssembly and runnable in a web browser is available at https://hllmn.net/projects/jotdown/demo. It can also be run locally:

$ cd examples/jotdown_wasm
$ make run

You may need to install wasm-pack and make sure your Rust compiler has the WebAssembly backend.

Status

As of writing, Jotdown implements all the current features of the Djot syntax, including:

  • links, images, either inline or with reference link definitions,
  • autolinks,
  • inline typesetting
    • emphasis,
    • highlight,
    • super/subscript,
    • insert/delete,
    • smart punctuation,
  • inline verbatim, code and code blocks,
  • math,
  • line breaks,
  • comments,
  • symbols,
  • headings, including hierarchical sections, and automatic links
  • block quotes,
  • lists,
    • unordered,
    • ordered,
    • task,
    • definitions,
  • raw inline and blocks,
  • thematic breaks,
  • pipe tables,
  • attributes, on inline and block elements,
  • inline spans and div blocks,
  • footnotes.

The HTML output is in some cases not exactly identical to the reference implementation. There are two test suites that compares Jotdown with the reference implementation. One uses the unit tests of the reference implementation and runs them with Jotdown. It can be run with:

$ make suite

Another target uses the reference implementation to generate html output for its benchmark files and compares it to the output of Jotdown:

$ make suite_bench

Note that it requires node in order to run the reference implementation.