Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 3fef7a7

Browse files
committedJun 1, 2014
rustdoc: make langstring parsing more robust
This changes the parsing of the language string in code examples so that unrecognized examples are not considered Rust code. This was, for example, the case when a code example was marked `sh` for shell code. This relieves authors of having to mark those samples as `notrust`. Also adds recognition of the positive marker `rust`. By default, unmarked examples are still considered rust. If any rust-specific tags are seen, code is considered rust unless marked as "notrust". Adds test cases for the detection logic.
1 parent 1527dab commit 3fef7a7

File tree

1 file changed

+49
-4
lines changed

1 file changed

+49
-4
lines changed
 

‎src/librustdoc/html/markdown.rs

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -287,10 +287,7 @@ pub fn find_testable_code(doc: &str, tests: &mut ::test::Collector) {
287287
slice::raw::buf_as_slice((*lang).data,
288288
(*lang).size as uint, |lang| {
289289
let s = str::from_utf8(lang).unwrap();
290-
(s.contains("should_fail"),
291-
s.contains("no_run"),
292-
s.contains("ignore"),
293-
s.contains("notrust"))
290+
parse_lang_string(s)
294291
})
295292
};
296293
if notrust { return }
@@ -340,6 +337,35 @@ pub fn find_testable_code(doc: &str, tests: &mut ::test::Collector) {
340337
}
341338
}
342339

340+
fn parse_lang_string(string: &str) -> (bool,bool,bool,bool) {
341+
let mut seen_rust_tags = false;
342+
let mut seen_other_tags = false;
343+
let mut should_fail = false;
344+
let mut no_run = false;
345+
let mut ignore = false;
346+
let mut notrust = false;
347+
348+
let mut tokens = string.as_slice().split(|c: char|
349+
!(c == '_' || c == '-' || c.is_alphanumeric())
350+
);
351+
352+
for token in tokens {
353+
match token {
354+
"" => {},
355+
"should_fail" => { should_fail = true; seen_rust_tags = true; },
356+
"no_run" => { no_run = true; seen_rust_tags = true; },
357+
"ignore" => { ignore = true; seen_rust_tags = true; },
358+
"notrust" => { notrust = true; seen_rust_tags = true; },
359+
"rust" => { notrust = false; seen_rust_tags = true; },
360+
_ => { seen_other_tags = true }
361+
}
362+
}
363+
364+
let notrust = notrust || (seen_other_tags && !seen_rust_tags);
365+
366+
(should_fail, no_run, ignore, notrust)
367+
}
368+
343369
/// By default this markdown renderer generates anchors for each header in the
344370
/// rendered document. The anchor name is the contents of the header spearated
345371
/// by hyphens, and a task-local map is used to disambiguate among duplicate
@@ -367,3 +393,22 @@ impl<'a> fmt::Show for MarkdownWithToc<'a> {
367393
render(fmt, md.as_slice(), true)
368394
}
369395
}
396+
397+
#[cfg(test)]
398+
mod tests {
399+
use super::parse_lang_string;
400+
401+
#[test]
402+
fn test_parse_lang_string() {
403+
assert_eq!(parse_lang_string(""), (false,false,false,false))
404+
assert_eq!(parse_lang_string("rust"), (false,false,false,false))
405+
assert_eq!(parse_lang_string("sh"), (false,false,false,true))
406+
assert_eq!(parse_lang_string("notrust"), (false,false,false,true))
407+
assert_eq!(parse_lang_string("ignore"), (false,false,true,false))
408+
assert_eq!(parse_lang_string("should_fail"), (true,false,false,false))
409+
assert_eq!(parse_lang_string("no_run"), (false,true,false,false))
410+
assert_eq!(parse_lang_string("{.no_run .example}"), (false,true,false,false))
411+
assert_eq!(parse_lang_string("{.sh .should_fail}"), (true,false,false,false))
412+
assert_eq!(parse_lang_string("{.example .rust}"), (false,false,false,false))
413+
}
414+
}

5 commit comments

Comments
 (5)

bors commented on Jun 2, 2014

@bors
Collaborator

saw approval from alexcrichton
at skade@3fef7a7

bors commented on Jun 2, 2014

@bors
Collaborator

merging skade/rust/rustdoc-robust-langstring-parsing = 3fef7a7 into auto

bors commented on Jun 2, 2014

@bors
Collaborator

skade/rust/rustdoc-robust-langstring-parsing = 3fef7a7 merged ok, testing candidate = b981add

bors commented on Jun 2, 2014

@bors
Collaborator

all tests pass:
success: http://buildbot.rust-lang.org/builders/auto-mac-32-opt/builds/6036
success: http://buildbot.rust-lang.org/builders/auto-mac-64-opt/builds/6034
success: http://buildbot.rust-lang.org/builders/auto-mac-64-nopt-c/builds/5130
success: http://buildbot.rust-lang.org/builders/auto-mac-64-nopt-t/builds/5138
success: http://buildbot.rust-lang.org/builders/auto-linux-32-opt/builds/6134
success: http://buildbot.rust-lang.org/builders/auto-linux-32-nopt-c/builds/5222
success: http://buildbot.rust-lang.org/builders/auto-linux-32-nopt-t/builds/5230
success: http://buildbot.rust-lang.org/builders/auto-linux-64-opt/builds/6136
success: http://buildbot.rust-lang.org/builders/auto-linux-64-nopt-c/builds/5221
success: http://buildbot.rust-lang.org/builders/auto-linux-64-nopt-t/builds/5227
success: http://buildbot.rust-lang.org/builders/auto-linux-64-x-android/builds/5287
success: http://buildbot.rust-lang.org/builders/auto-linux-64-x-android-t/builds/3023
success: http://buildbot.rust-lang.org/builders/auto-win-32-opt/builds/6126
success: http://buildbot.rust-lang.org/builders/auto-win-32-nopt-c/builds/5222
success: http://buildbot.rust-lang.org/builders/auto-win-32-nopt-t/builds/5237

bors commented on Jun 2, 2014

@bors
Collaborator

fast-forwarding master to auto = b981add

Please sign in to comment.