docs.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /* global anchors */
  2. // add anchor links to headers
  3. anchors.options.placement = 'left';
  4. anchors.add('h3');
  5. // Filter UI
  6. var tocElements = document.getElementById('toc')
  7. .getElementsByTagName('li');
  8. document.getElementById('filter-input')
  9. .addEventListener('keyup', function (e) {
  10. var i, element, children;
  11. // enter key
  12. if (e.keyCode === 13) {
  13. // go to the first displayed item in the toc
  14. for (i = 0; i < tocElements.length; i++) {
  15. element = tocElements[i];
  16. if (!element.classList.contains('display-none')) {
  17. location.replace(element.firstChild.href);
  18. return e.preventDefault();
  19. }
  20. }
  21. }
  22. var match = function () {
  23. return true;
  24. };
  25. var value = this.value.toLowerCase();
  26. if (!value.match(/^\s*$/)) {
  27. match = function (element) {
  28. return element.firstChild.innerHTML.toLowerCase().indexOf(value) !== -1;
  29. };
  30. }
  31. for (i = 0; i < tocElements.length; i++) {
  32. element = tocElements[i];
  33. children = Array.from(element.getElementsByTagName('li'));
  34. if (match(element) || children.some(match)) {
  35. element.classList.remove('display-none');
  36. } else {
  37. element.classList.add('display-none');
  38. }
  39. }
  40. });
  41. var toggles = document.getElementsByClassName('toggle-step-sibling');
  42. for (var i = 0; i < toggles.length; i++) {
  43. toggles[i].addEventListener('click', toggleStepSibling);
  44. }
  45. function toggleStepSibling() {
  46. var stepSibling = this.parentNode.parentNode.parentNode.getElementsByClassName('toggle-target')[0];
  47. var klass = 'display-none';
  48. if (stepSibling.classList.contains(klass)) {
  49. stepSibling.classList.remove(klass);
  50. stepSibling.innerHTML = '▾';
  51. } else {
  52. stepSibling.classList.add(klass);
  53. stepSibling.innerHTML = '▸';
  54. }
  55. }
  56. var items = document.getElementsByClassName('toggle-sibling');
  57. for (var j = 0; j < items.length; j++) {
  58. items[j].addEventListener('click', toggleSibling);
  59. }
  60. function toggleSibling() {
  61. var stepSibling = this.parentNode.getElementsByClassName('toggle-target')[0];
  62. var icon = this.getElementsByClassName('icon')[0];
  63. var klass = 'display-none';
  64. if (stepSibling.classList.contains(klass)) {
  65. stepSibling.classList.remove(klass);
  66. icon.innerHTML = '▾';
  67. } else {
  68. stepSibling.classList.add(klass);
  69. icon.innerHTML = '▸';
  70. }
  71. }
  72. function showHashTarget(targetId) {
  73. var hashTarget = document.getElementById(targetId);
  74. // new target is hidden
  75. if (hashTarget && hashTarget.offsetHeight === 0 &&
  76. hashTarget.parentNode.parentNode.classList.contains('display-none')) {
  77. hashTarget.parentNode.parentNode.classList.remove('display-none');
  78. }
  79. }
  80. window.addEventListener('hashchange', function() {
  81. showHashTarget(location.hash.substring(1));
  82. });
  83. showHashTarget(location.hash.substring(1));
  84. var toclinks = document.getElementsByClassName('pre-open');
  85. for (var k = 0; k < toclinks.length; k++) {
  86. toclinks[k].addEventListener('mousedown', preOpen, false);
  87. }
  88. function preOpen() {
  89. showHashTarget(this.hash.substring(1));
  90. }