Wiktionary Language Prefs

A script for re-ordering the languages on Wiktionary.

  1. // ==UserScript==
  2. // @name Wiktionary Language Prefs
  3. // @description A script for re-ordering the languages on Wiktionary.
  4. // @version 1.0.9
  5. // @namespace https://www.mandog.com/
  6. // @match https://*.wiktionary.org/wiki/*
  7. // @match https://*.m.wiktionary.org/wiki/*
  8. // @license GNU GPLv3
  9. // @supportURL syntaxenjoyer@tutanota.com
  10. // ==/UserScript==
  11.  
  12. const d = document;
  13.  
  14. // your language preferences here
  15. const langPrefs = [];
  16.  
  17. // get anchor tag from url
  18. const anchor = window.location.toString().split('#')[1];
  19.  
  20. /*** rearrange the languages on the page ***/
  21.  
  22. const par = d.getElementsByClassName(
  23. 'mw-parser-output');
  24.  
  25. const wikiLangs = Array.from(par[0].getElementsByClassName('mw-heading2'));
  26.  
  27. // remove underscores
  28. const langNames = Array.from(wikiLangs, (i) => {
  29. let headline = i.getElementsByTagName('h2');
  30. let id = headline.length ? headline[0].id : i.id;
  31. if (id.includes('_')) {
  32. let newId = id.replaceAll('_', ' ');
  33. return newId;
  34. }
  35. else {
  36. return id;
  37. }
  38. });
  39.  
  40. const newOrder = {};
  41.  
  42. const frag = new DocumentFragment();
  43.  
  44. // rearrange the languages
  45. for (let i = 0; i <= (wikiLangs.length - 1); i++) {
  46. if (langPrefs.includes(langNames[i])) {
  47. let key = langNames[i];
  48. let r = d.createRange();
  49. r.setStartBefore(wikiLangs[i]);
  50. wikiLangs[i+ 1] && wikiLangs.length > 2 ?
  51. r.setEndBefore(wikiLangs[i + 1]) :
  52. r.setEndAfter(par[0].lastElementChild);
  53. let val = r.extractContents();
  54. newOrder[key] = val;
  55. }
  56. }
  57.  
  58. // add to document fragment
  59. langPrefs.forEach(i => {
  60. if (langNames.includes(i)) {
  61. frag.append(newOrder[i]);
  62. }
  63. });
  64.  
  65. /*** rearrange the table of contents ***/
  66.  
  67. const toc = d.getElementById('toc');
  68. const minitoc = d.getElementsByClassName('minitoc')[0];
  69.  
  70. if (minitoc) {
  71. const tocParent = minitoc.parentElement;
  72.  
  73. tocParent.id === 'mf-section-0' ? tocParent.after(frag) : minitoc.nextElementSibling.after(frag);
  74. } else if (toc) {
  75. const tocParent = toc.parentElement;
  76.  
  77. tocParent.id === 'mf-section-0' ? tocParent.after(frag) : toc.after(frag);
  78.  
  79. const contents = d.getElementsByClassName('toclevel-1');
  80.  
  81. const contentsOrder = {};
  82.  
  83. const contentsFrag = new DocumentFragment();
  84.  
  85. // get language names from toc
  86. const contentsLangNames = Array.from(contents, (i) =>
  87. i.firstElementChild.getElementsByClassName(
  88. 'toctext')[0].innerText);
  89.  
  90. // rearrange toc
  91. for (let i = contents.length - 1; i>=0; i--) {
  92. let langEntry = contentsLangNames[i];
  93. if (langPrefs.includes(langEntry)) {
  94. let key = langEntry;
  95. let r = d.createRange();
  96. r.setStartBefore(contents[i]);
  97. contents[i + 1] ?
  98. r.setEndBefore(contents[i + 1]) :
  99. r.setEndAfter(contents[i].lastElementChild);
  100. let val = r.extractContents();
  101. contentsOrder[key] = val;
  102. }
  103. }
  104.  
  105. langPrefs.forEach(i => {
  106. if (contentsLangNames.includes(i)) {
  107. contentsFrag.append(contentsOrder[i]);
  108. }
  109. });
  110.  
  111. contents[0].parentNode.insertBefore(
  112. contentsFrag, contents[0].parentNode.firstElementChild);
  113. } else {
  114. let contentDiv = d.getElementsByClassName('mw-parser-output')[0];
  115.  
  116. contentDiv.firstChild.before(frag);
  117. };
  118.  
  119. // scroll to correct anchor tag if it exists
  120. if (anchor) {
  121. d.getElementById(anchor).scrollIntoView();
  122. };

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址