diff --git a/crates/mq-lang/src/eval/builtin.rs b/crates/mq-lang/src/eval/builtin.rs index 4d2931ab..06bf94fc 100644 --- a/crates/mq-lang/src/eval/builtin.rs +++ b/crates/mq-lang/src/eval/builtin.rs @@ -4429,6 +4429,10 @@ pub fn eval_selector(node: &mq_markdown::Node, selector: &Selector) -> RuntimeVa (_, mq_markdown::Node::List(mq_markdown::List { .. })) => true, _ => false, }, + Selector::Task => matches!( + node, + mq_markdown::Node::List(mq_markdown::List { checked: Some(_), .. }) + ), Selector::MdxJsEsm => node.is_mdx_js_esm(), Selector::Text => node.is_text(), Selector::Toml => node.is_toml(), diff --git a/crates/mq-lang/src/selector.rs b/crates/mq-lang/src/selector.rs index e3744826..e3b2c517 100644 --- a/crates/mq-lang/src/selector.rs +++ b/crates/mq-lang/src/selector.rs @@ -131,6 +131,8 @@ pub enum Selector { MdxJsxFlowElement, /// Matches recursively all child nodes. Recursive, + /// Matches task list markdown node. + Task, /// Matches a specific attribute of a markdown node. Attr(AttrKind), } @@ -291,6 +293,9 @@ impl TryFrom<&Token> for Selector { // List ".[]" | ".list" => Ok(Selector::List(None, None)), + // Task List + ".task" => Ok(Selector::Task), + // TOML ".toml" => Ok(Selector::Toml), @@ -417,6 +422,7 @@ impl Display for Selector { Selector::MdxJsEsm => write!(f, ".mdx_js_esm"), Selector::MdxJsxFlowElement => write!(f, ".mdx_jsx_flow_element"), Selector::Recursive => write!(f, ".."), + Selector::Task => write!(f, ".task"), Selector::Attr(attr) => write!(f, "{}", attr), } } @@ -498,6 +504,8 @@ mod tests { #[case::list(".list", Selector::List(None, None), ".list")] #[case::list_bracket(".[]", Selector::List(None, None), ".list")] #[case::list_with_index(".[1]", Selector::List(Some(1), None), ".[1]")] + // Task List + #[case::task(".task", Selector::Task, ".task")] // TOML #[case::toml(".toml", Selector::Toml, ".toml")] // Strong