weblio_add_export2

Weblioの単語帳にエクスポートを追加し、単語リストだけでなく、意味、発音などをCSV形式でダウンロードできるようにする。

  1. // ==UserScript==
  2. // @name weblio_add_export2
  3. // @namespace http://catherine.v0cyc1pp.com/weblio_add_export2.user.js
  4. // @match https://uwl.weblio.jp/word-list
  5. // @run-at document-start
  6. // @version 2.0
  7. // @author greg10
  8. // @license GPL 3.0
  9. // @grant none
  10. // @description Weblioの単語帳にエクスポートを追加し、単語リストだけでなく、意味、発音などをCSV形式でダウンロードできるようにする。
  11. // ==/UserScript==
  12.  
  13. // [Details]
  14. // 「単語帳のインポート」メニューの下に「単語帳のエクスポート」メニューが追加されます。
  15. // クリックするとダウンロードフォルダにcsvファイルがエクスポートされます。
  16. // 単語、発音、品詞、意味、例文、レベルなどが保存されます。
  17.  
  18.  
  19. //console.log("weblio_add_export start");
  20. function getImportElement() {
  21. var ret = null;
  22. //$("li").each( function() {
  23. document.querySelectorAll("li").forEach(function(elem) {
  24. //var str = $(this).text();
  25. var str = elem.innerText;
  26. if (str.indexOf("単語帳のインポート") != -1) {
  27. //ret = $(this);
  28. ret = elem;
  29. }
  30. });
  31. return ret;
  32. }
  33.  
  34. function exportlist() {
  35. //alert("export() clicked!");
  36.  
  37. var alldata = '';
  38. //$("tr.tngMainTrOn").each( function() {
  39. document.querySelectorAll("tr.tngMainTrOn").forEach(function(elem) {
  40. //var kids = $(this).children("td");
  41. var kids = elem.children; // tdのリスト
  42. var line = "";
  43. var table = null;
  44. var tbody = null;
  45.  
  46. console.log("kids.length=" + kids.length);
  47. for (var i = 0; i < kids.length; i++) {
  48. var kid = kids[i]; // ひとつのtd
  49. var str = "";
  50. if (i == 0) {
  51. //str = $(kid).children("div").children("a").text();
  52. str = kid.children[0].children[1].innerText;
  53. console.log("str=" + str);
  54. } else if (i == 3) {
  55. //str = $(kid).find("tbody > tr > td > div.tngMainTIML").text();
  56. //str = document.querySelector("tbody > tr > td > div.tngMainTIML").innerText;
  57. table = kid.children[0].children[0];
  58. tbody = table.children[0];
  59. str = tbody.children[0].children[0].children[0].innerText;
  60. } else if (i == 4) {
  61. //str = $(kid).find("tbody > tr > td > div.tngMainTSRHB > p.tngMainTSRH").text();
  62. //str = document.querySelector("tbody > tr > td > div.tngMainTSRHB > p.tngMainTSRH").innerText;
  63. table = kid.children[0].children[0];
  64. tbody = table.children[0];
  65. str = tbody.children[0].children[0].children[0].innerText;
  66. } else {
  67. //str = $(kid).text();
  68. str = kid.innerText;
  69. }
  70.  
  71. if (line.length != 0) {
  72. line = line + ',';
  73. }
  74. line = line + "\"" + str + "\"";
  75. }
  76. alldata = alldata + line + '\n';
  77. });
  78.  
  79.  
  80. var a = document.createElement('a');
  81. a.href = 'data:application/csv;charset=utf-8,' + encodeURIComponent(alldata);
  82.  
  83. // 単語帳の名前を取得する
  84. //var listname = $("td.selectFolderName").children("span").text();
  85. //var listname = $("td.selectFolderName > div > div").children("span").text();
  86. var listname = document.querySelector("td.selectFolderName > div > div").children[0].innerText;
  87. if (listname == null || listname == undefined || listname == "") {
  88. listname = "単語帳";
  89. }
  90. var filename = listname + ".csv";
  91.  
  92. //supported by chrome 14+ and firefox 20+
  93. a.download = filename;
  94. //needed for firefox
  95. document.getElementsByTagName('body')[0].appendChild(a);
  96. //supported by chrome 20+ and firefox 5+
  97. a.click();
  98. }
  99.  
  100.  
  101. function main() {
  102.  
  103. var imp = getImportElement();
  104. //$(imp).after('<li class="sideCat" onclick="exportlist();"><span>単語帳のエクスポート</span></li>');
  105.  
  106. if (imp == null) {
  107. return;
  108. }
  109. //if ( $(imp).attr('mydone') == "done" ) {
  110. if (imp.getAttribute('mydone') == "done") {
  111. return;
  112. }
  113. //$(imp).attr("mydone","done");
  114. imp.setAttribute("mydone", "done");
  115. //var lielem = $("<li class=\"\"/>");
  116. var lielem = document.createElement("li");
  117. lielem.className = "";
  118.  
  119. /*
  120. $(lielem).append( $("<a/>", {
  121. text: "単語帳のエクスポート",
  122. click: function() {
  123. exportlist();
  124. }
  125. }));
  126. */
  127. var taga = document.createElement("a");
  128. taga.innerText = "単語帳のエクスポート";
  129. taga.onclick = function() {
  130. exportlist();
  131. };
  132. lielem.appendChild(taga);
  133.  
  134. //$(imp).after(lielem);
  135. imp.parentNode.insertBefore(lielem, imp.nextElementSibling);
  136. }
  137.  
  138.  
  139. var observer = new MutationObserver(function(mutations) {
  140. observer.disconnect();
  141. main();
  142. observer.observe(document, config);
  143. });
  144.  
  145. var config = {
  146. attributes: false,
  147. childList: true,
  148. characterData: false,
  149. subtree: true
  150. };
  151.  
  152. observer.observe(document, config);