diff options
| author | Manish Goregaokar <manishsmail@gmail.com> | 2016-04-05 16:43:22 +0530 |
|---|---|---|
| committer | Manish Goregaokar <manishsmail@gmail.com> | 2016-04-05 16:43:22 +0530 |
| commit | e8ab71fa00f2264f4587ca536e93b909a9358e27 (patch) | |
| tree | 0b839edd6ec8613a587ebe9b916b7ff8c205482b | |
| parent | 7ed71c20e385d193c3bde4bb54c4ae6969ac9615 (diff) | |
| parent | a4e2933c6a26841aa22031c0e0edb7582e5ba657 (diff) | |
| download | rust-e8ab71fa00f2264f4587ca536e93b909a9358e27.tar.gz rust-e8ab71fa00f2264f4587ca536e93b909a9358e27.zip | |
Rollup merge of #32715 - nrc:rustdoc-highlight, r=cmr
rustdoc: factor out function for getting inner html of highlighted source
| -rw-r--r-- | src/librustdoc/html/highlight.rs | 61 | ||||
| -rw-r--r-- | src/librustdoc/html/markdown.rs | 6 | ||||
| -rw-r--r-- | src/librustdoc/html/render.rs | 8 |
3 files changed, 49 insertions, 26 deletions
diff --git a/src/librustdoc/html/highlight.rs b/src/librustdoc/html/highlight.rs index b3cad90ccb5..7ca4703a2e1 100644 --- a/src/librustdoc/html/highlight.rs +++ b/src/librustdoc/html/highlight.rs @@ -17,22 +17,36 @@ use html::escape::Escape; use std::io; use std::io::prelude::*; -use syntax::parse::lexer; +use syntax::parse::lexer::{self, Reader}; use syntax::parse::token; use syntax::parse; -/// Highlights some source code, returning the HTML output. -pub fn highlight(src: &str, class: Option<&str>, id: Option<&str>) -> String { +/// Highlights `src`, returning the HTML output. +pub fn render_with_highlighting(src: &str, class: Option<&str>, id: Option<&str>) -> String { debug!("highlighting: ================\n{}\n==============", src); let sess = parse::ParseSess::new(); let fm = sess.codemap().new_filemap("<stdin>".to_string(), src.to_string()); let mut out = Vec::new(); - doit(&sess, - lexer::StringReader::new(&sess.span_diagnostic, fm), - class, - id, - &mut out).unwrap(); + write_header(class, id, &mut out).unwrap(); + write_source(&sess, + lexer::StringReader::new(&sess.span_diagnostic, fm), + &mut out).unwrap(); + write_footer(&mut out).unwrap(); + String::from_utf8_lossy(&out[..]).into_owned() +} + +/// Highlights `src`, returning the HTML output. Returns only the inner html to +/// be inserted into an element. C.f., `render_with_highlighting` which includes +/// an enclosing `<pre>` block. +pub fn render_inner_with_highlighting(src: &str) -> String { + let sess = parse::ParseSess::new(); + let fm = sess.codemap().new_filemap("<stdin>".to_string(), src.to_string()); + + let mut out = Vec::new(); + write_source(&sess, + lexer::StringReader::new(&sess.span_diagnostic, fm), + &mut out).unwrap(); String::from_utf8_lossy(&out[..]).into_owned() } @@ -43,17 +57,10 @@ pub fn highlight(src: &str, class: Option<&str>, id: Option<&str>) -> String { /// it's used. All source code emission is done as slices from the source map, /// not from the tokens themselves, in order to stay true to the original /// source. -fn doit(sess: &parse::ParseSess, mut lexer: lexer::StringReader, - class: Option<&str>, id: Option<&str>, - out: &mut Write) -> io::Result<()> { - use syntax::parse::lexer::Reader; - - write!(out, "<pre ")?; - match id { - Some(id) => write!(out, "id='{}' ", id)?, - None => {} - } - write!(out, "class='rust {}'>\n", class.unwrap_or(""))?; +fn write_source(sess: &parse::ParseSess, + mut lexer: lexer::StringReader, + out: &mut Write) + -> io::Result<()> { let mut is_attribute = false; let mut is_macro = false; let mut is_macro_nonterminal = false; @@ -184,5 +191,21 @@ fn doit(sess: &parse::ParseSess, mut lexer: lexer::StringReader, } } + Ok(()) +} + +fn write_header(class: Option<&str>, + id: Option<&str>, + out: &mut Write) + -> io::Result<()> { + write!(out, "<pre ")?; + match id { + Some(id) => write!(out, "id='{}' ", id)?, + None => {} + } + write!(out, "class='rust {}'>\n", class.unwrap_or("")) +} + +fn write_footer(out: &mut Write) -> io::Result<()> { write!(out, "</pre>\n") } diff --git a/src/librustdoc/html/markdown.rs b/src/librustdoc/html/markdown.rs index e7304b69510..3baf22b38ef 100644 --- a/src/librustdoc/html/markdown.rs +++ b/src/librustdoc/html/markdown.rs @@ -262,9 +262,9 @@ pub fn render(w: &mut fmt::Formatter, s: &str, print_toc: bool) -> fmt::Result { &Default::default()); s.push_str(&format!("<span class='rusttest'>{}</span>", Escape(&test))); }); - s.push_str(&highlight::highlight(&text, - Some("rust-example-rendered"), - None)); + s.push_str(&highlight::render_with_highlighting(&text, + Some("rust-example-rendered"), + None)); let output = CString::new(s).unwrap(); hoedown_buffer_puts(ob, output.as_ptr()); }) diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 78dd14766e7..1427dfcbaf1 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -2640,16 +2640,16 @@ impl<'a> fmt::Display for Source<'a> { write!(fmt, "<span id=\"{0}\">{0:1$}</span>\n", i, cols)?; } write!(fmt, "</pre>")?; - write!(fmt, "{}", highlight::highlight(s, None, None))?; + write!(fmt, "{}", highlight::render_with_highlighting(s, None, None))?; Ok(()) } } fn item_macro(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, t: &clean::Macro) -> fmt::Result { - w.write_str(&highlight::highlight(&t.source, - Some("macro"), - None))?; + w.write_str(&highlight::render_with_highlighting(&t.source, + Some("macro"), + None))?; render_stability_since_raw(w, it.stable_since(), None)?; document(w, cx, it) } |
