extra.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. var nodemcu = nodemcu || {};
  2. (function () {
  3. 'use strict';
  4. var languageCodeToNameMap = {en: 'English', de: 'Deutsch'};
  5. var languageNames = values(languageCodeToNameMap);
  6. var defaultLanguageCode = 'en';
  7. $(document).ready(function () {
  8. hideNavigationForAllButSelectedLanguage();
  9. addLanguageSelectorToRtdFlyOutMenu();
  10. });
  11. function hideNavigationForAllButSelectedLanguage() {
  12. var selectedLanguageCode = determineSelectedLanguageCode();
  13. var selectedLanguageName = languageCodeToNameMap[selectedLanguageCode];
  14. // Finds all subnav elements and hides them if they're /language/ subnavs. Hence, all 'Modules' subnav elements
  15. // won't be hidden.
  16. // <ul class="subnav">
  17. // <li><span>Modules</span></li>
  18. // <li class="toctree-l1 ">
  19. // <a class="" href="EN/modules/node/">node</a>
  20. // </li>
  21. $('.subnav li span').not(':contains(' + selectedLanguageName + ')').each(function (index) {
  22. var spanElement = $(this);
  23. if ($.inArray(spanElement.text(), languageNames) > -1) {
  24. spanElement.parent().parent().hide();
  25. }
  26. });
  27. }
  28. /**
  29. * Adds a language selector to the RTD fly out menu found bottom left. Example
  30. * <dl>
  31. * <dt>Languages</dt>
  32. * <dd><a href="http://nodemcu.readthedocs.org/en/<branch>/de/">de</a></dd>
  33. * <strong>
  34. * <dd><a href="http://nodemcu.readthedocs.org/en/<branch>/en/">en</a></dd>
  35. * </strong>
  36. * </dl>
  37. *
  38. * UGLY. That menu is added by RTD with an AJAX call after page load. Hence, we need to react to
  39. * the subsequent DOM manipulation using a DOM4 MutationObserver.
  40. */
  41. function addLanguageSelectorToRtdFlyOutMenu() {
  42. var observer, observerConfig = {childList: true};
  43. var flyOutWrapper = $('.rst-other-versions');
  44. // Create an observer instance
  45. observer = new MutationObserver(function (mutations) {
  46. mutations.forEach(function (mutation) {
  47. debugger;
  48. var newNodes = mutation.addedNodes; // DOM NodeList
  49. if (newNodes !== null) { // If there are new nodes added
  50. var $nodes = $(newNodes); // jQuery set
  51. $nodes.each(function () {
  52. var $node = $(this);
  53. });
  54. var selectedLanguageCode = determineSelectedLanguageCode();
  55. var dl = document.createElement('dl');
  56. var dt = document.createElement('dt');
  57. dl.appendChild(dt);
  58. dt.appendChild(document.createTextNode('Languages'));
  59. for (var languageCode in languageCodeToNameMap) {
  60. dl.appendChild(createLanguageLinkFor(languageCode, selectedLanguageCode === languageCode));
  61. }
  62. flyOutWrapper.prepend(dl);
  63. // Later, you can stop observing
  64. observer.disconnect();
  65. }
  66. });
  67. });
  68. // Pass in the target node, as well as the observer options
  69. observer.observe(flyOutWrapper, config);
  70. }
  71. function createLanguageLinkFor(languageCode, isCurrentlySelected) {
  72. var strong;
  73. // split[0] is an '' because the path starts with the separator
  74. var pathSegments = window.location.pathname.split('/');
  75. var dd = document.createElement("dd");
  76. var href = document.createElement("a");
  77. href.setAttribute('href', '/' + pathSegments[1] + '/' + pathSegments[2] + '/' + languageCode);
  78. href.appendChild(document.createTextNode(languageCode));
  79. dd.appendChild(href);
  80. if (isCurrentlySelected) {
  81. strong = document.createElement("strong");
  82. strong.appendChild(dd);
  83. return strong;
  84. } else {
  85. return dd;
  86. }
  87. }
  88. function determineSelectedLanguageCode() {
  89. var selectedLanguageCode, path = window.location.pathname;
  90. if (window.location.origin.indexOf('readthedocs') > -1) {
  91. // path is like /en/<branch>/<lang>/build/ -> extract 'lang'
  92. // split[0] is an '' because the path starts with the separator
  93. selectedLanguageCode = path.split('/')[3];
  94. } else {
  95. // path is like /<lang>/build/ -> extract 'lang'
  96. selectedLanguageCode = path.substr(1, 2);
  97. }
  98. if (!selectedLanguageCode || selectedLanguageCode.length > 2) {
  99. selectedLanguageCode = defaultLanguageCode;
  100. }
  101. return selectedLanguageCode;
  102. }
  103. function values(associativeArray) {
  104. var values = [];
  105. for (var key in associativeArray) {
  106. if (associativeArray.hasOwnProperty(key)) {
  107. values.push(associativeArray[key]);
  108. }
  109. }
  110. return values;
  111. }
  112. }());