diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index cbf93662811da..40f4d13b2942f 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -428,6 +428,7 @@ pub fn derive_id(candidate: String) -> String { /// Generates the documentation for `crate` into the directory `dst` pub fn run(mut krate: clean::Crate, external_html: &ExternalHtml, + playground_url: Option, dst: PathBuf, passes: FxHashSet, css_file_extension: Option, @@ -451,6 +452,13 @@ pub fn run(mut krate: clean::Crate, css_file_extension: css_file_extension.clone(), }; + // If user passed in `--playground-url` arg, we fill in crate name here + if let Some(url) = playground_url { + markdown::PLAYGROUND.with(|slot| { + *slot.borrow_mut() = Some((Some(krate.name.clone()), url)); + }); + } + // Crawl the crate attributes looking for attributes which control how we're // going to emit HTML if let Some(attrs) = krate.module.as_ref().map(|m| &m.attrs) { diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs index 5073baa420e82..afa5d66b11347 100644 --- a/src/librustdoc/lib.rs +++ b/src/librustdoc/lib.rs @@ -160,10 +160,10 @@ pub fn opts() -> Vec { unstable(optmulti("Z", "", "internal and debugging options (only on nightly build)", "FLAG")), stable(optopt("", "sysroot", "Override the system root", "PATH")), - stable(optopt("", "playground-url", - "URL to send code snippets to, may be reset by --markdown-playground-url \ - or `#![doc(html_playground_url=...)]`", - "URL")), + unstable(optopt("", "playground-url", + "URL to send code snippets to, may be reset by --markdown-playground-url \ + or `#![doc(html_playground_url=...)]`", + "URL")), ] } @@ -232,10 +232,6 @@ pub fn main_args(args: &[String]) -> isize { } }; - if let Some(playground) = matches.opt_str("playground-url") { - html::markdown::PLAYGROUND.with(|s| { *s.borrow_mut() = Some((None, playground)); }); - } - let test_args = matches.opt_strs("test-args"); let test_args: Vec = test_args.iter() .flat_map(|s| s.split_whitespace()) @@ -264,6 +260,7 @@ pub fn main_args(args: &[String]) -> isize { None => return 3 }; let crate_name = matches.opt_str("crate-name"); + let playground_url = matches.opt_str("playground-url"); match (should_test, markdown_input) { (true, true) => { @@ -285,7 +282,7 @@ pub fn main_args(args: &[String]) -> isize { info!("going to format"); match output_format.as_ref().map(|s| &**s) { Some("html") | None => { - html::render::run(krate, &external_html, + html::render::run(krate, &external_html, playground_url, output.unwrap_or(PathBuf::from("doc")), passes.into_iter().collect(), css_file_extension, diff --git a/src/librustdoc/markdown.rs b/src/librustdoc/markdown.rs index b617acfabbbf1..29267960a4a81 100644 --- a/src/librustdoc/markdown.rs +++ b/src/librustdoc/markdown.rs @@ -63,7 +63,8 @@ pub fn render(input: &str, mut output: PathBuf, matches: &getopts::Matches, Err(LoadStringError::ReadFail) => return 1, Err(LoadStringError::BadUtf8) => return 2, }; - if let Some(playground) = matches.opt_str("markdown-playground-url") { + if let Some(playground) = matches.opt_str("markdown-playground-url").or( + matches.opt_str("playground-url")) { markdown::PLAYGROUND.with(|s| { *s.borrow_mut() = Some((None, playground)); }); } diff --git a/src/test/rustdoc/playground-arg.rs b/src/test/rustdoc/playground-arg.rs new file mode 100644 index 0000000000000..f0d55ef6e9fcd --- /dev/null +++ b/src/test/rustdoc/playground-arg.rs @@ -0,0 +1,24 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// compile-flags: --playground-url=https://example.com/ -Z unstable-options +// ignore-tidy-linelength + +#![crate_name = "foo"] + +//! ``` +//! use foo::dummy; +//! dummy(); +//! ``` + +pub fn dummy() {} + +// ensure that `extern crate foo;` was inserted into code snips automatically: +// @matches foo/index.html '//a[@class="test-arrow"][@href="https://example.com/?code=extern%20crate%20foo%3B%0Afn%20main()%20%7B%0Ause%20foo%3A%3Adummy%3B%0Adummy()%3B%0A%7D"]' "Run"