dmc-transform 0.3.2

Transform pipeline and built-in transformers for the dmc compiler
Documentation
use dmc_parser::ast::*;
use dmc_parser::parse;
use dmc_transform::{DisableGfm, Pipeline};

fn run(src: &str) -> Document {
  let mut doc = parse(src);
  let p = Pipeline::new().add(DisableGfm);
  p.run_silent(&mut doc);
  doc
}

#[test]
fn strikethrough_downgrades_to_text() {
  let doc = run("hello ~~old~~ new\n");
  let para = doc
    .children
    .iter()
    .find_map(|n| match n {
      Node::Paragraph(p) => Some(p),
      _ => None,
    })
    .unwrap();
  let has_strike = para.children.iter().any(|n| matches!(n, Node::Strikethrough(_)));
  assert!(!has_strike, "strikethrough should be downgraded");
  let texts: Vec<&str> = para
    .children
    .iter()
    .filter_map(|n| match n {
      Node::Text(t) => Some(t.value.as_str()),
      _ => None,
    })
    .collect();
  assert!(texts.iter().any(|s| s.contains("~~old~~")), "raw ~~ markers should appear in output");
}

#[test]
fn table_downgrades_to_paragraph() {
  let doc = run("| a | b |\n|---|---|\n| 1 | 2 |\n");
  let has_table = doc.children.iter().any(|n| matches!(n, Node::Table(_)));
  assert!(!has_table, "table should be downgraded");
}

#[test]
fn task_list_loses_checked_marker_node() {
  let doc = run("- [x] done\n- [ ] open\n");
  fn has_task_item(nodes: &[Node]) -> bool {
    nodes.iter().any(|n| {
      matches!(n, Node::TaskListItem(_))
        || (if let Node::List(l) = n { has_task_item(&l.children) } else { false })
        || (if let Node::ListItem(li) = n { has_task_item(&li.children) } else { false })
    })
  }
  assert!(!has_task_item(&doc.children), "TaskListItem should be downgraded to ListItem");
}