1
Fork 0

Improve sidebar rendering and add methods list

This commit is contained in:
Guillaume Gomez 2017-10-10 23:39:10 +02:00
parent bed9a85c40
commit 8fb1250aba
2 changed files with 69 additions and 20 deletions

View file

@ -3513,12 +3513,29 @@ impl<'a> fmt::Display for Sidebar<'a> {
} }
} }
fn get_methods(i: &clean::Impl) -> Vec<String> {
i.items.iter().filter_map(|item| {
match item.name {
// Maybe check with clean::Visibility::Public as well?
Some(ref name) if !name.is_empty() && item.visibility.is_some() && item.is_method() => {
Some(format!("<a href=\"#method.{name}\">{name}</a>", name = name))
}
_ => None,
}
}).collect::<Vec<_>>()
}
fn sidebar_assoc_items(it: &clean::Item) -> String { fn sidebar_assoc_items(it: &clean::Item) -> String {
let mut out = String::new(); let mut out = String::new();
let c = cache(); let c = cache();
if let Some(v) = c.impls.get(&it.def_id) { if let Some(v) = c.impls.get(&it.def_id) {
if v.iter().any(|i| i.inner_impl().trait_.is_none()) { let ret = v.iter()
out.push_str("<li><a href=\"#methods\">Methods</a></li>"); .filter(|i| i.inner_impl().trait_.is_none())
.flat_map(|i| get_methods(i.inner_impl()))
.collect::<String>();
if !ret.is_empty() {
out.push_str(&format!("<a class=\"sidebar-title\" href=\"#methods\">Methods\
</a><div class=\"sidebar-links\">{}</div>", ret));
} }
if v.iter().any(|i| i.inner_impl().trait_.is_some()) { if v.iter().any(|i| i.inner_impl().trait_.is_some()) {
@ -3534,16 +3551,33 @@ fn sidebar_assoc_items(it: &clean::Item) -> String {
let inner_impl = target.def_id().or(target.primitive_type().and_then(|prim| { let inner_impl = target.def_id().or(target.primitive_type().and_then(|prim| {
c.primitive_locations.get(&prim).cloned() c.primitive_locations.get(&prim).cloned()
})).and_then(|did| c.impls.get(&did)); })).and_then(|did| c.impls.get(&did));
if inner_impl.is_some() { if let Some(impls) = inner_impl {
out.push_str("<li><a href=\"#deref-methods\">"); out.push_str("<a class=\"sidebar-title\" href=\"#deref-methods\">");
out.push_str(&format!("Methods from {:#}&lt;Target={:#}&gt;", out.push_str(&format!("Methods from {:#}&lt;Target={:#}&gt;",
impl_.inner_impl().trait_.as_ref().unwrap(), impl_.inner_impl().trait_.as_ref().unwrap(),
target)); target));
out.push_str("</a></li>"); out.push_str("</a>");
let ret = impls.iter()
.filter(|i| i.inner_impl().trait_.is_none())
.flat_map(|i| get_methods(i.inner_impl()))
.collect::<String>();
out.push_str(&format!("<div class=\"sidebar-links\">{}</div>", ret));
} }
} }
} }
out.push_str("<li><a href=\"#implementations\">Trait Implementations</a></li>"); let ret = v.iter()
.filter_map(|i| if let Some(ref i) = i.inner_impl().trait_ {
let out = format!("{:#}", i).replace("<", "&lt;").replace(">", "&gt;");
Some(format!("<a href=\"#impl-{:#}\">{name}</a>", i, out))
} else {
None
})
.collect::<String>();
if !ret.is_empty() {
out.push_str("<a class=\"sidebar-title\" href=\"#implementations\">\
Trait Implementations</a>");
out.push_str(&format!("<div class=\"sidebar-links\">{}</div>", ret));
}
} }
} }
@ -3564,7 +3598,7 @@ fn sidebar_struct(fmt: &mut fmt::Formatter, it: &clean::Item,
sidebar.push_str(&sidebar_assoc_items(it)); sidebar.push_str(&sidebar_assoc_items(it));
if !sidebar.is_empty() { if !sidebar.is_empty() {
write!(fmt, "<div class=\"block items\"><ul>{}</ul></div>", sidebar)?; write!(fmt, "<div class=\"block items\">{}</div>", sidebar)?;
} }
Ok(()) Ok(())
} }
@ -3606,7 +3640,7 @@ fn sidebar_trait(fmt: &mut fmt::Formatter, it: &clean::Item,
sidebar.push_str("<li><a href=\"#implementors\">Implementors</a></li>"); sidebar.push_str("<li><a href=\"#implementors\">Implementors</a></li>");
write!(fmt, "<div class=\"block items\"><ul>{}</ul></div>", sidebar) write!(fmt, "<div class=\"block items\">{}</div>", sidebar)
} }
fn sidebar_primitive(fmt: &mut fmt::Formatter, it: &clean::Item, fn sidebar_primitive(fmt: &mut fmt::Formatter, it: &clean::Item,
@ -3614,7 +3648,7 @@ fn sidebar_primitive(fmt: &mut fmt::Formatter, it: &clean::Item,
let sidebar = sidebar_assoc_items(it); let sidebar = sidebar_assoc_items(it);
if !sidebar.is_empty() { if !sidebar.is_empty() {
write!(fmt, "<div class=\"block items\"><ul>{}</ul></div>", sidebar)?; write!(fmt, "<div class=\"block items\">{}</div>", sidebar)?;
} }
Ok(()) Ok(())
} }
@ -3624,7 +3658,7 @@ fn sidebar_typedef(fmt: &mut fmt::Formatter, it: &clean::Item,
let sidebar = sidebar_assoc_items(it); let sidebar = sidebar_assoc_items(it);
if !sidebar.is_empty() { if !sidebar.is_empty() {
write!(fmt, "<div class=\"block items\"><ul>{}</ul></div>", sidebar)?; write!(fmt, "<div class=\"block items\">{}</div>", sidebar)?;
} }
Ok(()) Ok(())
} }
@ -3641,7 +3675,7 @@ fn sidebar_union(fmt: &mut fmt::Formatter, it: &clean::Item,
sidebar.push_str(&sidebar_assoc_items(it)); sidebar.push_str(&sidebar_assoc_items(it));
if !sidebar.is_empty() { if !sidebar.is_empty() {
write!(fmt, "<div class=\"block items\"><ul>{}</ul></div>", sidebar)?; write!(fmt, "<div class=\"block items\">{}</div>", sidebar)?;
} }
Ok(()) Ok(())
} }
@ -3657,7 +3691,7 @@ fn sidebar_enum(fmt: &mut fmt::Formatter, it: &clean::Item,
sidebar.push_str(&sidebar_assoc_items(it)); sidebar.push_str(&sidebar_assoc_items(it));
if !sidebar.is_empty() { if !sidebar.is_empty() {
write!(fmt, "<div class=\"block items\"><ul>{}</ul></div>", sidebar)?; write!(fmt, "<div class=\"block items\">{}</div>", sidebar)?;
} }
Ok(()) Ok(())
} }

View file

@ -188,18 +188,16 @@ nav.sub {
.js-only, .hidden { display: none !important; } .js-only, .hidden { display: none !important; }
.sidebar {
padding: 10px;
}
.sidebar img { .sidebar img {
margin: 20px auto; margin: 20px auto;
display: block; display: block;
margin-top: 10px;
} }
.sidebar .location { .sidebar .location {
border: 1px solid; border: 1px solid;
font-size: 17px; font-size: 17px;
margin: 30px 0 20px 0; margin: 30px 10px 20px 10px;
text-align: center; text-align: center;
word-wrap: break-word; word-wrap: break-word;
} }
@ -220,7 +218,7 @@ nav.sub {
.location a:first-child { font-weight: 500; } .location a:first-child { font-weight: 500; }
.block { .block {
padding: 0 10px; padding: 0;
margin-bottom: 14px; margin-bottom: 14px;
} }
.block h2, .block h3 { .block h2, .block h3 {
@ -229,7 +227,7 @@ nav.sub {
text-align: center; text-align: center;
} }
.block ul, .block li { .block ul, .block li {
margin: 0; margin: 0 10px;
padding: 0; padding: 0;
list-style: none; list-style: none;
} }
@ -245,6 +243,23 @@ nav.sub {
transition: border 500ms ease-out; transition: border 500ms ease-out;
} }
.sidebar-title {
border-top: 1px solid #777;
border-bottom: 1px solid #777;
text-align: center;
font-size: 17px;
margin-bottom: 5px;
}
.sidebar-links {
margin-bottom: 15px;
}
.sidebar-links > a {
padding-left: 10px;
width: 100%;
}
.content { .content {
padding: 15px 0; padding: 15px 0;
} }