From 72d5675fef11c85b481b0b139c59fb27e1d327b6 Mon Sep 17 00:00:00 2001 From: mitaa Date: Fri, 4 Dec 2015 00:48:59 +0100 Subject: [PATCH] Address review comments --- src/librustdoc/html/markdown.rs | 18 ++++---- src/librustdoc/html/render.rs | 74 +++++++++++++++------------------ 2 files changed, 43 insertions(+), 49 deletions(-) diff --git a/src/librustdoc/html/markdown.rs b/src/librustdoc/html/markdown.rs index eccdd08db8a7..a6d6802c0e10 100644 --- a/src/librustdoc/html/markdown.rs +++ b/src/librustdoc/html/markdown.rs @@ -35,7 +35,7 @@ use std::fmt; use std::slice; use std::str; -use html::render::with_unique_id; +use html::render::derive_id; use html::toc::TocBuilder; use html::highlight; use html::escape::Escape; @@ -307,17 +307,17 @@ pub fn render(w: &mut fmt::Formatter, s: &str, print_toc: bool) -> fmt::Result { let opaque = unsafe { (*data).opaque as *mut hoedown_html_renderer_state }; let opaque = unsafe { &mut *((*opaque).opaque as *mut MyOpaque) }; - let text = with_unique_id(id, |id| { - let sec = opaque.toc_builder.as_mut().map_or("".to_owned(), |builder| { - format!("{} ", builder.push(level as u32, s.clone(), id.to_owned())) - }); + let id = derive_id(id); - // Render the HTML - format!("\ - {sec}{}", - s, lvl = level, id = id, sec = sec) + let sec = opaque.toc_builder.as_mut().map_or("".to_owned(), |builder| { + format!("{} ", builder.push(level as u32, s.clone(), id.clone())) }); + // Render the HTML + let text = format!("\ + {sec}{}", + s, lvl = level, id = id, sec = sec); + let text = CString::new(text).unwrap(); unsafe { hoedown_buffer_puts(ob, text.as_ptr()) } } diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 3372c9d4807a..aac2a52984a1 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -372,23 +372,19 @@ pub fn reset_ids() { USED_ID_MAP.with(|s| *s.borrow_mut() = init_ids()); } -pub fn with_unique_id T>(candidate: String, f: F) -> T { +pub fn derive_id(candidate: String) -> String { USED_ID_MAP.with(|map| { - let (id, ret) = match map.borrow_mut().get_mut(&candidate) { - None => { - let ret = f(&candidate); - (candidate, ret) - }, + let id = match map.borrow_mut().get_mut(&candidate) { + None => candidate, Some(a) => { let id = format!("{}-{}", candidate, *a); - let ret = f(&id); *a += 1; - (id, ret) + id } }; - map.borrow_mut().insert(id, 1); - ret + map.borrow_mut().insert(id.clone(), 1); + id }) } @@ -1745,10 +1741,9 @@ fn item_module(w: &mut fmt::Formatter, cx: &Context, ItemType::AssociatedType => ("associated-types", "Associated Types"), ItemType::AssociatedConst => ("associated-consts", "Associated Constants"), }; - try!(with_unique_id(short.to_owned(), |id| - write!(w, "

\ - {name}

\n", - id = id, name = name))); + try!(write!(w, "

\ + {name}

\n
", + id = derive_id(short.to_owned()), name = name)); } match myitem.inner { @@ -1970,10 +1965,10 @@ fn item_trait(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, fn trait_item(w: &mut fmt::Formatter, cx: &Context, m: &clean::Item) -> fmt::Result { let name = m.name.as_ref().unwrap(); - try!(with_unique_id(format!("{}.{}", shortty(m), name), |id| - write!(w, "

", + let id = derive_id(format!("{}.{}", shortty(m), name)); + try!(write!(w, "

", id = id, - stab = m.stability_class()))); + stab = m.stability_class())); try!(render_assoc_item(w, m, AssocItemLink::Anchor)); try!(write!(w, "

")); try!(document(w, cx, m)); @@ -2162,12 +2157,11 @@ fn item_struct(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, if fields.peek().is_some() { try!(write!(w, "

Fields

\n

")); for field in fields { - let name = field.name.as_ref().unwrap(); - try!(with_unique_id(format!("structfield.{}", name), |id| - write!(w, " + ")); } @@ -2234,9 +2228,8 @@ fn item_enum(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, if !e.variants.is_empty() { try!(write!(w, "

Variants

\n
{}", - field.stability_class(), - id, - name))); + try!(write!(w, "
\ + {name}", + stab = field.stability_class(), + name = field.name.as_ref().unwrap())); try!(document(w, cx, field)); try!(write!(w, "
")); for variant in &e.variants { - let name = variant.name.as_ref().unwrap(); - try!(with_unique_id(format!("variant.{}", name), |id| - write!(w, "
{}", id, name))); + try!(write!(w, "
{name}", + name = variant.name.as_ref().unwrap())); try!(document(w, cx, variant)); match variant.inner { clean::VariantItem(ref var) => { @@ -2254,10 +2247,11 @@ fn item_enum(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, try!(write!(w, "

Fields

\n ")); for field in fields { - let v = variant.name.as_ref().unwrap(); - let f = field.name.as_ref().unwrap(); - try!(with_unique_id(format!("variant.{}.field.{}", v, f), |id| - write!(w, "")); } @@ -2474,33 +2468,33 @@ fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLi clean::MethodItem(..) | clean::TyMethodItem(..) => { // Only render when the method is not static or we allow static methods if !is_static_method(item) || render_static { - try!(with_unique_id(format!("method.{}", name), |id| - write!(w, "

", id, shortty(item)))); + let id = derive_id(format!("method.{}", name)); + try!(write!(w, "

", id, shortty(item))); try!(render_assoc_item(w, item, link)); try!(write!(w, "

\n")); } } clean::TypedefItem(ref tydef, _) => { - try!(with_unique_id(format!("assoc_type.{}", name), |id| - write!(w, "

", id, shortty(item)))); + let id = derive_id(format!("assoc_type.{}", name)); + try!(write!(w, "

", id, shortty(item))); try!(write!(w, "type {} = {}", name, tydef.type_)); try!(write!(w, "

\n")); } clean::AssociatedConstItem(ref ty, ref default) => { - try!(with_unique_id(format!("assoc_const.{}", name), |id| - write!(w, "

", id, shortty(item)))); + let id = derive_id(format!("assoc_const.{}", name)); + try!(write!(w, "

", id, shortty(item))); try!(assoc_const(w, item, ty, default.as_ref())); try!(write!(w, "

\n")); } clean::ConstantItem(ref c) => { - try!(with_unique_id(format!("assoc_const.{}", name), |id| - write!(w, "

", id, shortty(item)))); + let id = derive_id(format!("assoc_const.{}", name)); + try!(write!(w, "

", id, shortty(item))); try!(assoc_const(w, item, &c.type_, Some(&c.expr))); try!(write!(w, "

\n")); } clean::AssociatedTypeItem(ref bounds, ref default) => { - try!(with_unique_id(format!("assoc_type.{}", name), |id| - write!(w, "

", id, shortty(item)))); + let id = derive_id(format!("assoc_type.{}", name)); + try!(write!(w, "

", id, shortty(item))); try!(assoc_type(w, item, bounds, default)); try!(write!(w, "

\n")); }

{}", id, f))); + try!(write!(w, "
\ + {f}", + v = variant.name.as_ref().unwrap(), + f = field.name.as_ref().unwrap())); try!(document(w, cx, field)); try!(write!(w, "