"#).as_str());
- match self.media_type {
- MediaType::IMAGE => result.push_str(
- format!(r#"
"#, self.uri).as_str(),
- ),
- MediaType::VIDEO => todo!(),
- MediaType::AUDIO => todo!(),
- }
+ result.push_str(format!(r#"
"#).as_str());
+ result += match self.media_type {
+ MediaType::IMAGE =>
+ format!(r#"
"#, self.uri),
+ MediaType::VIDEO =>
+ format!(r#"
"#, self.uri),
+ MediaType::AUDIO =>
+ format!(r#"
"#, self.uri),
+ }.as_str();
let caption = self
.caption
@@ -311,6 +312,8 @@ impl MediaRule {
match filename.split_at(sep + 1).1.to_ascii_lowercase().as_str() {
"png" | "apng" | "avif" | "gif" | "webp" | "svg" | "bmp" | "jpg" | "jpeg" | "jfif"
| "pjpeg" | "pjp" => Some(MediaType::IMAGE),
+ "mp4" | "m4v" | "webm" | "mov" => Some(MediaType::VIDEO),
+ "mp3" | "ogg" | "flac" | "wav" => Some(MediaType::AUDIO),
_ => None,
}
}
@@ -353,7 +356,7 @@ impl RegexRule for MediaRule {
matches.get(2).unwrap(),
MediaRule::validate_uri(matches.get(2).unwrap().as_str()),
) {
- (_, Ok(uri)) => uri.to_string(),
+ (_, Ok(uri)) => util::process_escaped('\\', ")", uri),
(m, Err(err)) => {
reports.push(
Report::build(ReportKind::Error, token.source(), m.start())
@@ -514,6 +517,9 @@ impl RegexRule for MediaRule {
#[cfg(test)]
mod tests {
+ use crate::parser::langparser::LangParser;
+ use crate::parser::source::SourceFile;
+
use super::*;
#[test]
@@ -527,4 +533,34 @@ mod tests {
));
assert!(re.is_match_at("![r1](uri1)[props1] desc1\n![r2](uri2)[props2] desc2", 26));
}
+
+ #[test]
+ fn element_test() {
+ let source = Rc::new(SourceFile::with_content(
+ "".to_string(),
+ r#"
+![ref1]( image.png )[width = 200px, caption = Caption\,] Description
+![ref2]( ur\)i\\)[type=audio]
+ "#
+ .to_string(),
+ None,
+ ));
+ let parser = LangParser::default();
+ let doc = parser.parse(source, None);
+
+ let borrow = doc.content().borrow();
+ let group = borrow.first().as_ref().unwrap().as_container().unwrap();
+
+ let first = group.contained()[0].downcast_ref::
().unwrap();
+ assert_eq!(first.reference, "ref1");
+ assert_eq!(first.uri, "image.png");
+ assert_eq!(first.media_type, MediaType::IMAGE);
+ assert_eq!(first.width, Some("200px".to_string()));
+ assert_eq!(first.caption, Some("Caption,".to_string()));
+
+ let second = group.contained()[1].downcast_ref::().unwrap();
+ assert_eq!(second.reference, "ref2");
+ assert_eq!(second.uri, "ur)i\\");
+ assert_eq!(second.media_type, MediaType::AUDIO);
+ }
}
diff --git a/src/elements/raw.rs b/src/elements/raw.rs
index a1b0309..34d0760 100644
--- a/src/elements/raw.rs
+++ b/src/elements/raw.rs
@@ -273,3 +273,35 @@ impl RegexRule for RawRule {
bindings
}
}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::compiler::compiler::Target;
+ use crate::parser::langparser::LangParser;
+ use crate::parser::source::SourceFile;
+
+ #[test]
+ fn raw_tests() {
+ let source = Rc::new(SourceFile::with_content(
+ "".to_string(),
+ r#"
+Break{?[kind=block]?}NewParagraph
+ "#
+ .to_string(),
+ None,
+ ));
+ let parser = LangParser::default();
+ let compiler = Compiler::new(Target::HTML, None);
+ let doc = parser.parse(source, None);
+
+ let borrow = doc.content().borrow();
+ let found = borrow
+ .iter()
+ .filter_map(|e| e.downcast_ref::())
+ .collect::>();
+
+ assert_eq!(found[0].compile(&compiler, &*doc), Ok("".to_string()));
+ //assert_eq!(found[1].compile(&compiler, &*doc), Ok("".to_string()));
+ }
+}
diff --git a/src/parser/util.rs b/src/parser/util.rs
index dcfa20d..e79748d 100644
--- a/src/parser/util.rs
+++ b/src/parser/util.rs
@@ -128,7 +128,7 @@ pub fn process_escaped>(escape: char, token: &'static str, content
}
}
// Add trailing escapes
- (0..escaped).for_each(|_| processed.push('\\'));
+ (0..escaped / 2).for_each(|_| processed.push('\\'));
processed
}
@@ -458,6 +458,8 @@ mod tests {
process_escaped('\\', "]", "Unescaped \\\\\\\\]"),
"Unescaped \\\\\\\\]".to_string()
);
+ assert_eq!(process_escaped('\\', ")", "A\\)B\\"), "A)B".to_string(),);
+ assert_eq!(process_escaped('\\', ")", "A\\)B\\\\"), "A)B\\".to_string(),);
}
#[test]