about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVitaly _Vi Shukela <vi0oss@gmail.com>2018-01-31 03:48:16 +0300
committerVitaly _Vi Shukela <vi0oss@gmail.com>2018-01-31 03:48:16 +0300
commit73f52d3d8f94f081233b9eb112a1266a6e83dd1a (patch)
treefc269471580112d44d879b977d83b69ee2a758db
parent21882aad7299e8e859785845ac12374990f24dae (diff)
downloadrust-73f52d3d8f94f081233b9eb112a1266a6e83dd1a.tar.gz
rust-73f52d3d8f94f081233b9eb112a1266a6e83dd1a.zip
rustdoc: Foldable impl blocks
Addresses #40363, #45720, #24483, #23986 and so on

* Expands and refactors collapseDocs and toggleAllDocs
* Adds [-] toggle to all impls (including inherent impl)
* Makes it hiding though main css file, not though element style

May need to be addressed:

* "[-]" and anchor link copier are overlaid a bit
* Inherent methods are also hidden by the global [-] toggle.
* Auto-collapsing "Iterator" and so on by default is not implemented yet
* Tested only shallowly and only in Chromiuim
* No tests. Are there tests for css/js part here?
* The new implementation may be a bit slower.
-rw-r--r--src/librustdoc/html/static/main.js156
-rw-r--r--src/librustdoc/html/static/themes/dark.css5
-rw-r--r--src/librustdoc/html/static/themes/main.css5
3 files changed, 115 insertions, 51 deletions
diff --git a/src/librustdoc/html/static/main.js b/src/librustdoc/html/static/main.js
index 0f9e7001c15..a77161bf1a9 100644
--- a/src/librustdoc/html/static/main.js
+++ b/src/librustdoc/html/static/main.js
@@ -296,9 +296,9 @@
     document.onkeydown = handleShortcut;
     document.onclick = function(ev) {
         if (hasClass(ev.target, 'collapse-toggle')) {
-            collapseDocs(ev.target);
+            collapseDocs(ev.target, "toggle");
         } else if (hasClass(ev.target.parentNode, 'collapse-toggle')) {
-            collapseDocs(ev.target.parentNode);
+            collapseDocs(ev.target.parentNode, "toggle");
         } else if (ev.target.tagName === 'SPAN' && hasClass(ev.target.parentNode, 'line-numbers')) {
             var prev_id = 0;
 
@@ -1618,19 +1618,8 @@
                 e.innerHTML = labelForToggleButton(false);
             });
             toggle.title = "collapse all docs";
-            onEach(document.getElementsByClassName("docblock"), function(e) {
-                e.style.display = 'block';
-            });
-            onEach(document.getElementsByClassName("toggle-label"), function(e) {
-                e.style.display = 'none';
-            });
-            onEach(document.getElementsByClassName("toggle-wrapper"), function(e) {
-                removeClass(e, "collapsed");
-            });
             onEach(document.getElementsByClassName("collapse-toggle"), function(e) {
-                onEveryMatchingChild(e, "inner", function(i_e) {
-                    i_e.innerHTML = labelForToggleButton(false);
-                });
+                collapseDocs(e, "show");
             });
         } else {
             addClass(toggle, "will-expand");
@@ -1638,54 +1627,115 @@
                 e.innerHTML = labelForToggleButton(true);
             });
             toggle.title = "expand all docs";
-            onEach(document.getElementsByClassName("docblock"), function(e) {
-                e.style.display = 'none';
-            });
-            onEach(document.getElementsByClassName("toggle-label"), function(e) {
-                e.style.display = 'inline-block';
-            });
-            onEach(document.getElementsByClassName("toggle-wrapper"), function(e) {
-                addClass(e, "collapsed");
-            });
+            
             onEach(document.getElementsByClassName("collapse-toggle"), function(e) {
-                onEveryMatchingChild(e, "inner", function(i_e) {
-                    i_e.innerHTML = labelForToggleButton(true);
-                });
+                collapseDocs(e, "hide");
             });
         }
     }
 
-    function collapseDocs(toggle) {
+    function collapseDocs(toggle, mode) {
         if (!toggle || !toggle.parentNode) {
             return;
         }
-        var relatedDoc = toggle.parentNode.nextElementSibling;
-        if (hasClass(relatedDoc, "stability")) {
-            relatedDoc = relatedDoc.nextElementSibling;
-        }
-        if (hasClass(relatedDoc, "docblock")) {
-            if (!isHidden(relatedDoc)) {
-                relatedDoc.style.display = 'none';
-                onEach(toggle.childNodes, function(e) {
-                    if (hasClass(e, 'toggle-label')) {
+        
+        function adjustToggle(arg) {
+            return function(e) {
+                if (hasClass(e, 'toggle-label')) {
+                    if (arg) {
                         e.style.display = 'inline-block';
-                    }
-                    if (hasClass(e, 'inner')) {
-                        e.innerHTML = labelForToggleButton(true);
-                    }
-                });
-                addClass(toggle.parentNode, 'collapsed');
-            } else {
-                relatedDoc.style.display = 'block';
-                removeClass(toggle.parentNode, 'collapsed');
-                onEach(toggle.childNodes, function(e) {
-                    if (hasClass(e, 'toggle-label')) {
+                    } else {
                         e.style.display = 'none';
                     }
-                    if (hasClass(e, 'inner')) {
-                        e.innerHTML = labelForToggleButton(false);
+                }
+                if (hasClass(e, 'inner')) {
+                    e.innerHTML = labelForToggleButton(arg);
+                }
+            };
+        };
+        
+        if (!hasClass(toggle.parentNode, "impl")) {
+            var relatedDoc = toggle.parentNode.nextElementSibling;
+            if (hasClass(relatedDoc, "stability")) {
+                relatedDoc = relatedDoc.nextElementSibling;
+            }
+            if (hasClass(relatedDoc, "docblock")) {
+                var action = mode;
+                if (action == "toggle") {
+                    if(hasClass(relatedDoc, "hidden-by-usual-hider")) {
+                        action="show";
+                    } else {
+                        action="hide";
+                    }
+                }
+                if (action == "hide") {
+                    addClass(relatedDoc, "hidden-by-usual-hider");
+                    onEach(toggle.childNodes, adjustToggle(true));
+                    addClass(toggle.parentNode, 'collapsed');
+                } else if (action == "show") {
+                    removeClass(relatedDoc, "hidden-by-usual-hider");
+                    removeClass(toggle.parentNode, 'collapsed');
+                    onEach(toggle.childNodes, adjustToggle(false));
+                }
+            }
+        } else {
+            // we are collapsing the impl block
+            function implHider(addOrRemove) {
+                return function(n) {
+                    if(hasClass(n, "method")) {
+                        if (addOrRemove) {
+                            addClass(n, "hidden-by-impl-hider");
+                        } else {
+                            removeClass(n, "hidden-by-impl-hider");
+                        }
+                        var ns = n.nextElementSibling;
+                        while(true) {
+                            if (ns && (
+                                    hasClass(ns, "docblock") ||
+                                    hasClass(ns, "stability") ||
+                                    false
+                                    )) {
+                                if (addOrRemove) {
+                                    addClass(ns, "hidden-by-impl-hider");
+                                } else {
+                                    removeClass(ns, "hidden-by-impl-hider");
+                                }
+                                ns = ns.nextElementSibling;
+                                continue;
+                            }
+                            break;
+                        }
                     }
-                });
+                }
+            }
+            
+            var relatedDoc = toggle.parentNode;
+            
+            while (!hasClass(relatedDoc, "impl-items")) {
+                relatedDoc = relatedDoc.nextElementSibling;
+            }
+            
+            if (!relatedDoc) return;
+            
+            // Hide all functions, but not associated types/consts
+            
+            var action = mode;
+            if (action == "toggle") {
+                if(hasClass(relatedDoc, "fns-now-collapsed")) {
+                    action="show";
+                } else {
+                    action="hide";
+                }
+            }
+            
+            if(action == "show") {
+                removeClass(relatedDoc, "fns-now-collapsed");
+                onEach(toggle.childNodes, adjustToggle(false));
+                onEach(relatedDoc.childNodes, implHider(false));
+            } else if (action == "hide") {
+                addClass(relatedDoc, "fns-now-collapsed");
+                onEach(toggle.childNodes, adjustToggle(true));
+                onEach(relatedDoc.childNodes, implHider(true));
             }
         }
     }
@@ -1714,8 +1764,12 @@
              hasClass(next.nextElementSibling, 'docblock'))) {
             insertAfter(toggle.cloneNode(true), e.childNodes[e.childNodes.length - 1]);
         }
+        if (hasClass(e, 'impl')) {
+            insertAfter(toggle.cloneNode(true), e.childNodes[e.childNodes.length - 1]);
+        }
     }
     onEach(document.getElementsByClassName('method'), func);
+    onEach(document.getElementsByClassName('impl'), func);
     onEach(document.getElementsByClassName('impl-items'), function(e) {
         onEach(e.getElementsByClassName('associatedconstant'), func);
     });
@@ -1803,7 +1857,7 @@
     onEach(document.getElementById('main').getElementsByTagName('pre'), function(e) {
         onEach(e.getElementsByClassName('attributes'), function(i_e) {
             i_e.parentNode.insertBefore(createToggleWrapper(), i_e);
-            collapseDocs(i_e.previousSibling.childNodes[0]);
+            collapseDocs(i_e.previousSibling.childNodes[0], "toggle");
         });
     });
 
diff --git a/src/librustdoc/html/static/themes/dark.css b/src/librustdoc/html/static/themes/dark.css
index 4c6bcab72b7..d8cb9681d04 100644
--- a/src/librustdoc/html/static/themes/dark.css
+++ b/src/librustdoc/html/static/themes/dark.css
@@ -386,3 +386,8 @@ kbd {
 		background: #353535;
 	}
 }
+
+.hidden-by-impl-hider, 
+.hidden-by-usual-hider {
+	display: none;
+}
diff --git a/src/librustdoc/html/static/themes/main.css b/src/librustdoc/html/static/themes/main.css
index e0764640e91..8713f83ecb9 100644
--- a/src/librustdoc/html/static/themes/main.css
+++ b/src/librustdoc/html/static/themes/main.css
@@ -383,3 +383,8 @@ kbd {
 		background: #fff;
 	}
 }
+
+.hidden-by-impl-hider, 
+.hidden-by-usual-hider {
+	display: none;
+}