From 2f15a11c61fb93ba697928af984e5c1584e15ca9 Mon Sep 17 00:00:00 2001 From: Liigo Zhuang Date: Tue, 12 Aug 2014 19:37:37 +0800 Subject: [PATCH] rustdoc: add tooltips to sidebar --- src/librustdoc/html/render.rs | 44 ++++++++++++++++++++++++------ src/librustdoc/html/static/main.js | 4 ++- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 4f511e390ff98..31971d566948e 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -63,6 +63,26 @@ use html::markdown::Markdown; use html::markdown; use stability_summary; +/// A pair of name and its optional document. +#[deriving(Clone, Eq, Ord)] +pub struct NameDoc(String, Option); + +impl PartialOrd for NameDoc { + fn partial_cmp(&self, other: &NameDoc) -> Option { + let &NameDoc(ref name1, _) = self; + let &NameDoc(ref name2, _) = other; + name1.partial_cmp(name2) + } +} + +impl PartialEq for NameDoc { + fn eq(&self, other: &NameDoc) -> bool { + let &NameDoc(ref name1, _) = self; + let &NameDoc(ref name2, _) = other; + name1.eq(name2) + } +} + /// Major driving force in all rustdoc rendering. This contains information /// about where in the tree-like hierarchy rendering is occurring and controls /// how the current page is being rendered. @@ -89,7 +109,7 @@ pub struct Context { /// functions), and the value is the list of containers belonging to this /// header. This map will change depending on the surrounding context of the /// page. - pub sidebar: HashMap>, + pub sidebar: HashMap>, /// This flag indicates whether [src] links should be generated or not. If /// the source files are present in the html rendering, then this will be /// `true`. @@ -1418,6 +1438,11 @@ fn shorter<'a>(s: Option<&'a str>) -> &'a str { } } +#[inline] +fn shorter_line(s: Option<&str>) -> String { + shorter(s).replace("\n", " ") +} + fn document(w: &mut fmt::Formatter, item: &clean::Item) -> fmt::Result { match item.doc_value() { Some(s) => { @@ -2080,21 +2105,22 @@ impl<'a> fmt::Show for Sidebar<'a> { None => return Ok(()) }; try!(write!(w, "

{}

", short, longty)); - for item in items.iter() { + for &NameDoc(ref name, ref doc) in items.iter() { let curty = shortty(cur).to_static_str(); - let class = if cur.name.get_ref() == item && + let class = if cur.name.get_ref() == name && short == curty { "current" } else { "" }; - try!(write!(w, "\ + try!(write!(w, "\ {name}", ty = short, class = class, href = if curty == "mod" {"../"} else {""}, path = if short == "mod" { - format!("{}/index.html", item.as_slice()) + format!("{}/index.html", name.as_slice()) } else { - format!("{}.{}.html", short, item.as_slice()) + format!("{}.{}.html", short, name.as_slice()) }, - name = item.as_slice())); + title = doc.get_ref().as_slice(), + name = name.as_slice())); } try!(write!(w, "
")); Ok(()) @@ -2110,7 +2136,7 @@ impl<'a> fmt::Show for Sidebar<'a> { } } -fn build_sidebar(m: &clean::Module) -> HashMap> { +fn build_sidebar(m: &clean::Module) -> HashMap> { let mut map = HashMap::new(); for item in m.items.iter() { if ignore_private_item(item) { continue } @@ -2121,7 +2147,7 @@ fn build_sidebar(m: &clean::Module) -> HashMap> { Some(ref s) => s.to_string(), }; let v = map.find_or_insert_with(short.to_string(), |_| Vec::new()); - v.push(myname); + v.push(NameDoc(myname, Some(shorter_line(item.doc_value())))); } for (_, items) in map.mut_iter() { diff --git a/src/librustdoc/html/static/main.js b/src/librustdoc/html/static/main.js index 7b5d1b7be2f63..e42a1adba38c2 100644 --- a/src/librustdoc/html/static/main.js +++ b/src/librustdoc/html/static/main.js @@ -694,8 +694,10 @@ if (crates[i] == window.currentCrate) { klass += ' current'; } + var desc = rawSearchIndex[crates[i]].items[0][3]; div.append($('', {'href': '../' + crates[i] + '/index.html', - 'class': klass}).text(crates[i])); + 'title': desc.replace(/\n/g, ' '), + 'class': klass}).text(crates[i])); } sidebar.append(div); }