Expand description
Structure similar to `code span` with configurable markers of variable length.
It allows you to define a custom structure with a variable number of markers
(e.g., with % defined as a marker, the user can write %foo% or %%%foo%%%
resulting in the same node).
You add a custom structure by using add_with function, which takes the following arguments:
MARKER- marker charactermd- parser instancef- function that should return your custom Node
Here is an example of a rule turning %foo% into 🦀foo🦀:
use markdown_that::generics::inline::code_pair;
use markdown_that::{MarkdownThat, Node, NodeValue, Renderer};
#[derive(Debug)]
struct Ferris;
impl NodeValue for Ferris {
fn render(&self, node: &Node, fmt: &mut dyn Renderer) {
fmt.text("🦀");
fmt.contents(&node.children);
fmt.text("🦀");
}
}
let md = &mut MarkdownThat::new();
code_pair::add_with::<'%'>(md, |_| Node::new(Ferris));
let html = md.parse("hello %world%").render();
assert_eq!(html.trim(), "hello 🦀world🦀");This generic structure follows the exact rules of code span in CommonMark:
-
Literal marker character sequence can be used inside a structure if its length doesn’t match the length of the opening/closing sequence (e.g., with
%defined as a marker,%%foo%bar%%gets parsed asNode("foo%bar")). -
Single space inside is trimmed to allow you to write
% %%foo %to be parsed asNode("%%foo").
If you define two structures with the same marker, only the first one will work.