diff --git a/src/librustdoc/html/markdown.rs b/src/librustdoc/html/markdown.rs
index cafbbaa828b..48393db3b7d 100644
--- a/src/librustdoc/html/markdown.rs
+++ b/src/librustdoc/html/markdown.rs
@@ -287,10 +287,7 @@ pub fn find_testable_code(doc: &str, tests: &mut ::test::Collector) {
slice::raw::buf_as_slice((*lang).data,
(*lang).size as uint, |lang| {
let s = str::from_utf8(lang).unwrap();
- (s.contains("should_fail"),
- s.contains("no_run"),
- s.contains("ignore"),
- s.contains("notrust"))
+ parse_lang_string(s)
})
};
if notrust { return }
@@ -340,6 +337,35 @@ pub fn find_testable_code(doc: &str, tests: &mut ::test::Collector) {
}
}
+fn parse_lang_string(string: &str) -> (bool,bool,bool,bool) {
+ let mut seen_rust_tags = false;
+ let mut seen_other_tags = false;
+ let mut should_fail = false;
+ let mut no_run = false;
+ let mut ignore = false;
+ let mut notrust = false;
+
+ let mut tokens = string.as_slice().split(|c: char|
+ !(c == '_' || c == '-' || c.is_alphanumeric())
+ );
+
+ for token in tokens {
+ match token {
+ "" => {},
+ "should_fail" => { should_fail = true; seen_rust_tags = true; },
+ "no_run" => { no_run = true; seen_rust_tags = true; },
+ "ignore" => { ignore = true; seen_rust_tags = true; },
+ "notrust" => { notrust = true; seen_rust_tags = true; },
+ "rust" => { notrust = false; seen_rust_tags = true; },
+ _ => { seen_other_tags = true }
+ }
+ }
+
+ let notrust = notrust || (seen_other_tags && !seen_rust_tags);
+
+ (should_fail, no_run, ignore, notrust)
+}
+
/// By default this markdown renderer generates anchors for each header in the
/// rendered document. The anchor name is the contents of the header spearated
/// by hyphens, and a task-local map is used to disambiguate among duplicate
@@ -367,3 +393,22 @@ impl<'a> fmt::Show for MarkdownWithToc<'a> {
render(fmt, md.as_slice(), true)
}
}
+
+#[cfg(test)]
+mod tests {
+ use super::parse_lang_string;
+
+ #[test]
+ fn test_parse_lang_string() {
+ assert_eq!(parse_lang_string(""), (false,false,false,false))
+ assert_eq!(parse_lang_string("rust"), (false,false,false,false))
+ assert_eq!(parse_lang_string("sh"), (false,false,false,true))
+ assert_eq!(parse_lang_string("notrust"), (false,false,false,true))
+ assert_eq!(parse_lang_string("ignore"), (false,false,true,false))
+ assert_eq!(parse_lang_string("should_fail"), (true,false,false,false))
+ assert_eq!(parse_lang_string("no_run"), (false,true,false,false))
+ assert_eq!(parse_lang_string("{.no_run .example}"), (false,true,false,false))
+ assert_eq!(parse_lang_string("{.sh .should_fail}"), (true,false,false,false))
+ assert_eq!(parse_lang_string("{.example .rust}"), (false,false,false,false))
+ }
+}
\ No newline at end of file