about summary refs log tree commit diff
diff options
context:
space:
mode:
authormitaa <mitaa.ceb@gmail.com>2015-12-02 23:49:18 +0100
committermitaa <mitaa.ceb@gmail.com>2015-12-03 00:07:59 +0100
commitfa0269dd35eef80d7898de3843f9ed327c6f3a0c (patch)
treea00581b8b230d8d660db49a1dbe9d453bfc4ce10
parent538689ddc7fe9a7176d6722b6c37e2e082e5fd08 (diff)
downloadrust-fa0269dd35eef80d7898de3843f9ed327c6f3a0c.tar.gz
rust-fa0269dd35eef80d7898de3843f9ed327c6f3a0c.zip
Generate unique IDs for each rustdoc HTML page
-rw-r--r--src/librustdoc/html/markdown.rs6
-rw-r--r--src/librustdoc/html/render.rs70
2 files changed, 36 insertions, 40 deletions
diff --git a/src/librustdoc/html/markdown.rs b/src/librustdoc/html/markdown.rs
index 9496b7e2a6f..eccdd08db8a 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, reset_ids};
+use html::render::with_unique_id;
 use html::toc::TocBuilder;
 use html::highlight;
 use html::escape::Escape;
@@ -322,8 +322,6 @@ pub fn render(w: &mut fmt::Formatter, s: &str, print_toc: bool) -> fmt::Result {
         unsafe { hoedown_buffer_puts(ob, text.as_ptr()) }
     }
 
-    reset_ids();
-
     extern fn codespan(
         ob: *mut hoedown_buffer,
         text: *const hoedown_buffer,
@@ -554,6 +552,7 @@ pub fn plain_summary_line(md: &str) -> String {
 mod tests {
     use super::{LangString, Markdown};
     use super::plain_summary_line;
+    use html::render::reset_ids;
 
     #[test]
     fn test_lang_string_parse() {
@@ -593,6 +592,7 @@ mod tests {
         fn t(input: &str, expect: &str) {
             let output = format!("{}", Markdown(input));
             assert_eq!(output, expect);
+            reset_ids();
         }
 
         t("# Foo bar", "\n<h1 id='foo-bar' class='section-header'>\
diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs
index c4fb9d5d9e7..e7fe4de8d04 100644
--- a/src/librustdoc/html/render.rs
+++ b/src/librustdoc/html/render.rs
@@ -1725,10 +1725,10 @@ fn item_module(w: &mut fmt::Formatter, cx: &Context,
                 ItemType::AssociatedType  => ("associated-types", "Associated Types"),
                 ItemType::AssociatedConst => ("associated-consts", "Associated Constants"),
             };
-            try!(write!(w,
-                        "<h2 id='{id}' class='section-header'>\
-                        <a href=\"#{id}\">{name}</a></h2>\n<table>",
-                        id = short, name = name));
+            try!(with_unique_id(short.to_owned(), |id|
+                write!(w, "<h2 id='{id}' class='section-header'>\
+                          <a href=\"#{id}\">{name}</a></h2>\n<table>",
+                          id = id, name = name)));
         }
 
         match myitem.inner {
@@ -1949,10 +1949,11 @@ 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 {
-        try!(write!(w, "<h3 id='{ty}.{name}' class='method stab {stab}'><code>",
-                    ty = shortty(m),
-                    name = *m.name.as_ref().unwrap(),
-                    stab = m.stability_class()));
+        let name = m.name.as_ref().unwrap();
+        try!(with_unique_id(format!("{}.{}", shortty(m), name), |id|
+                write!(w, "<h3 id='{id}' class='method stab {stab}'><code>",
+                       id = id,
+                       stab = m.stability_class())));
         try!(render_assoc_item(w, m, AssocItemLink::Anchor));
         try!(write!(w, "</code></h3>"));
         try!(document(w, cx, m));
@@ -2141,11 +2142,12 @@ fn item_struct(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
         if fields.peek().is_some() {
             try!(write!(w, "<h2 class='fields'>Fields</h2>\n<table>"));
             for field in fields {
-                try!(write!(w, "<tr class='stab {stab}'>
-                                  <td id='structfield.{name}'>\
-                                    <code>{name}</code></td><td>",
-                            stab = field.stability_class(),
-                            name = field.name.as_ref().unwrap()));
+                let name = field.name.as_ref().unwrap();
+                try!(with_unique_id(format!("structfield.{}", name), |id|
+                    write!(w, "<tr class='stab {}'><td id='{}'><code>{}</code></td><td>",
+                              field.stability_class(),
+                              id,
+                              name)));
                 try!(document(w, cx, field));
                 try!(write!(w, "</td></tr>"));
             }
@@ -2212,8 +2214,9 @@ fn item_enum(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
     if !e.variants.is_empty() {
         try!(write!(w, "<h2 class='variants'>Variants</h2>\n<table>"));
         for variant in &e.variants {
-            try!(write!(w, "<tr><td id='variant.{name}'><code>{name}</code></td><td>",
-                          name = variant.name.as_ref().unwrap()));
+            let name = variant.name.as_ref().unwrap();
+            try!(with_unique_id(format!("variant.{}", name), |id|
+                    write!(w, "<tr><td id='{}'><code>{}</code></td><td>", id, name)));
             try!(document(w, cx, variant));
             match variant.inner {
                 clean::VariantItem(ref var) => {
@@ -2231,11 +2234,10 @@ fn item_enum(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item,
                             try!(write!(w, "<h3 class='fields'>Fields</h3>\n
                                               <table>"));
                             for field in fields {
-                                try!(write!(w, "<tr><td \
-                                                  id='variant.{v}.field.{f}'>\
-                                                  <code>{f}</code></td><td>",
-                                              v = variant.name.as_ref().unwrap(),
-                                              f = field.name.as_ref().unwrap()));
+                                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, "<tr><td id='{}'><code>{}</code></td><td>", id, f)));
                                 try!(document(w, cx, field));
                                 try!(write!(w, "</td></tr>"));
                             }
@@ -2447,44 +2449,38 @@ fn render_impl(w: &mut fmt::Formatter, cx: &Context, i: &Impl, link: AssocItemLi
 
     fn doctraititem(w: &mut fmt::Formatter, cx: &Context, item: &clean::Item,
                     link: AssocItemLink, render_static: bool) -> fmt::Result {
+        let name = item.name.as_ref().unwrap();
         match item.inner {
             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!(write!(w, "<h4 id='method.{}' class='{}'><code>",
-                                *item.name.as_ref().unwrap(),
-                                shortty(item)));
+                    try!(with_unique_id(format!("method.{}", name), |id|
+                        write!(w, "<h4 id='{}' class='{}'><code>", id, shortty(item))));
                 try!(render_assoc_item(w, item, link));
                     try!(write!(w, "</code></h4>\n"));
                 }
             }
             clean::TypedefItem(ref tydef, _) => {
-                let name = item.name.as_ref().unwrap();
-                try!(write!(w, "<h4 id='assoc_type.{}' class='{}'><code>",
-                            *name,
-                            shortty(item)));
+                try!(with_unique_id(format!("assoc_type.{}", name), |id|
+                    write!(w, "<h4 id='{}' class='{}'><code>", id, shortty(item))));
                 try!(write!(w, "type {} = {}", name, tydef.type_));
                 try!(write!(w, "</code></h4>\n"));
             }
             clean::AssociatedConstItem(ref ty, ref default) => {
-                let name = item.name.as_ref().unwrap();
-                try!(write!(w, "<h4 id='assoc_const.{}' class='{}'><code>",
-                            *name, shortty(item)));
+                try!(with_unique_id(format!("assoc_const.{}", name), |id|
+                    write!(w, "<h4 id='{}' class='{}'><code>", id, shortty(item))));
                 try!(assoc_const(w, item, ty, default.as_ref()));
                 try!(write!(w, "</code></h4>\n"));
             }
             clean::ConstantItem(ref c) => {
-                let name = item.name.as_ref().unwrap();
-                try!(write!(w, "<h4 id='assoc_const.{}' class='{}'><code>",
-                            *name, shortty(item)));
+                try!(with_unique_id(format!("assoc_const.{}", name), |id|
+                    write!(w, "<h4 id='{}' class='{}'><code>", id, shortty(item))));
                 try!(assoc_const(w, item, &c.type_, Some(&c.expr)));
                 try!(write!(w, "</code></h4>\n"));
             }
             clean::AssociatedTypeItem(ref bounds, ref default) => {
-                let name = item.name.as_ref().unwrap();
-                try!(write!(w, "<h4 id='assoc_type.{}' class='{}'><code>",
-                            *name,
-                            shortty(item)));
+                try!(with_unique_id(format!("assoc_type.{}", name), |id|
+                    write!(w, "<h4 id='{}' class='{}'><code>", id, shortty(item))));
                 try!(assoc_type(w, item, bounds, default));
                 try!(write!(w, "</code></h4>\n"));
             }