@@ -5095,3 +5095,89 @@ fn error_invalid_json_in_data_directive() {
50955095 result.diagnostics
50965096 );
50975097}
5098+
5099+// ---------------------------------------------------------------------------
5100+// @markdown file embedding tests
5101+// ---------------------------------------------------------------------------
5102+
5103+#[test]
5104+fn markdown_file_renders_content() {
5105+ let dir = std::env::temp_dir().join("htmlang_test_markdown_file");
5106+ let _ = std::fs::remove_dir_all(&dir);
5107+ std::fs::create_dir_all(&dir).unwrap();
5108+ let md_path = dir.join("article.md");
5109+ std::fs::write(&md_path, "# Hello\n\nThis is **bold** text.\n").unwrap();
5110+
5111+ let input = "@markdown article.md\n";
5112+ let result = htmlang::parser::parse_with_base(input, Some(&dir));
5113+ let html = htmlang::codegen::generate(&result.document);
5114+ let _ = std::fs::remove_dir_all(&dir);
5115+
5116+ assert!(
5117+ result
5118+ .diagnostics
5119+ .iter()
5120+ .all(|d| d.severity != htmlang::parser::Severity::Error),
5121+ "no errors expected, got: {:?}",
5122+ result.diagnostics
5123+ );
5124+ assert!(
5125+ html.contains("<h1>Hello</h1>"),
5126+ "should render heading from md file, got: {}",
5127+ html
5128+ );
5129+ assert!(
5130+ html.contains("<strong>bold</strong>"),
5131+ "should render bold from md file, got: {}",
5132+ html
5133+ );
5134+}
5135+
5136+#[test]
5137+fn markdown_file_with_variable_path() {
5138+ let dir = std::env::temp_dir().join("htmlang_test_markdown_var");
5139+ let _ = std::fs::remove_dir_all(&dir);
5140+ std::fs::create_dir_all(&dir).unwrap();
5141+ let md_path = dir.join("post.md");
5142+ std::fs::write(&md_path, "# Post Title\n").unwrap();
5143+
5144+ let input = "@let file post.md\n@markdown $file\n";
5145+ let result = htmlang::parser::parse_with_base(input, Some(&dir));
5146+ let html = htmlang::codegen::generate(&result.document);
5147+ let _ = std::fs::remove_dir_all(&dir);
5148+
5149+ assert!(
5150+ result
5151+ .diagnostics
5152+ .iter()
5153+ .all(|d| d.severity != htmlang::parser::Severity::Error),
5154+ "no errors expected, got: {:?}",
5155+ result.diagnostics
5156+ );
5157+ assert!(
5158+ html.contains("<h1>Post Title</h1>"),
5159+ "should resolve variable path for markdown file, got: {}",
5160+ html
5161+ );
5162+}
5163+
5164+#[test]
5165+fn markdown_file_missing_reports_error() {
5166+ let dir = std::env::temp_dir().join("htmlang_test_markdown_missing");
5167+ let _ = std::fs::remove_dir_all(&dir);
5168+ std::fs::create_dir_all(&dir).unwrap();
5169+
5170+ let input = "@markdown nonexistent.md\n";
5171+ let result = htmlang::parser::parse_with_base(input, Some(&dir));
5172+ let _ = std::fs::remove_dir_all(&dir);
5173+
5174+ let has_err = result.diagnostics.iter().any(|d| {
5175+ d.severity == htmlang::parser::Severity::Error
5176+ && d.message.contains("cannot read markdown")
5177+ });
5178+ assert!(
5179+ has_err,
5180+ "expected missing file error, got: {:?}",
5181+ result.diagnostics
5182+ );
5183+}