Skip to content

Commit

Permalink
rustdoc: factor out function for getting inner html of highlighted so…
Browse files Browse the repository at this point in the history
…urce
  • Loading branch information
nrc committed Apr 3, 2016
1 parent c0b8c43 commit a4e2933
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 26 deletions.
61 changes: 42 additions & 19 deletions src/librustdoc/html/highlight.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}

Expand All @@ -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;
Expand Down Expand Up @@ -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")
}
6 changes: 3 additions & 3 deletions src/librustdoc/html/markdown.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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());
})
Expand Down
8 changes: 4 additions & 4 deletions src/librustdoc/html/render.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2661,16 +2661,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)
}
Expand Down

0 comments on commit a4e2933

Please sign in to comment.