//! Cluster 8 — transclusion attribute parsing. The basic //! `{{url|alt|key=val}}` shape was already wired; this test pins //! down quote-stripping on quoted values (`key="quoted value"`) //! so an HTML renderer doesn't double-emit `"` artefacts. use nuwiki_core::ast::{BlockNode, InlineNode}; use nuwiki_core::render::{HtmlRenderer, Renderer}; use nuwiki_core::syntax::vimwiki::VimwikiSyntax; use nuwiki_core::syntax::SyntaxPlugin; fn parse(src: &str) -> nuwiki_core::ast::DocumentNode { VimwikiSyntax::new().parse(src) } fn first_transclusion(doc: &nuwiki_core::ast::DocumentNode) -> &nuwiki_core::ast::TransclusionNode { let para = match &doc.children[0] { BlockNode::Paragraph(p) => p, _ => panic!("expected paragraph"), }; for child in ¶.children { if let InlineNode::Transclusion(t) = child { return t; } } panic!("no transclusion in paragraph"); } #[test] fn transclusion_attrs_strip_double_quotes() { let doc = parse(r#"{{cat.png|cat|style="border: 1px"}}"#); let t = first_transclusion(&doc); assert_eq!(t.url, "cat.png"); assert_eq!(t.alt.as_deref(), Some("cat")); assert_eq!( t.attrs.get("style").map(String::as_str), Some("border: 1px") ); } #[test] fn transclusion_attrs_strip_single_quotes() { let doc = parse("{{cat.png|cat|class='thumb'}}"); let t = first_transclusion(&doc); assert_eq!(t.attrs.get("class").map(String::as_str), Some("thumb")); } #[test] fn transclusion_attrs_leave_unquoted_values_alone() { let doc = parse("{{cat.png|cat|width=200}}"); let t = first_transclusion(&doc); assert_eq!(t.attrs.get("width").map(String::as_str), Some("200")); } #[test] fn transclusion_renders_clean_html_with_quoted_attr() { let doc = parse(r#"{{cat.png|cat|style="border: 1px"}}"#); let out = HtmlRenderer::new().render_to_string(&doc).unwrap(); assert!(out.contains(r#"style="border: 1px""#), "got: {out}"); assert!(!out.contains(""")); }