opencc-rust

调用 opencc-rust-wasm 转换中文

当前为 2020-10-19 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name opencc-rust
  3. // @namespace Forbidden Siren
  4. // @version 0.7.0
  5. // @description 调用 opencc-rust-wasm 转换中文
  6. // @include *
  7. // @match *://*
  8. // @grant GM_getResourceText
  9. // @grant GM_getResourceURL
  10. // @grant GM_registerMenuCommand
  11. // @run-at document-end
  12. //
  13. // @require https://greasyfork.org/scripts/413698-opencc-rust-wasm/code/opencc-rust-wasm.js?version=859508
  14. // @resource opencc_wasm https://cdn.jsdelivr.net/gh/polyproline/opencc-rust@main/opencc_gc.wasm
  15. // @resource HKVariants https://cdn.jsdelivr.net/npm/opencc-data/data/HKVariants.txt
  16. // @resource HKVariantsRev https://cdn.jsdelivr.net/npm/opencc-data/data/HKVariantsRev.txt
  17. // @resource HKVariantsRevPhrases https://cdn.jsdelivr.net/npm/opencc-data/data/HKVariantsRevPhrases.txt
  18. // @resource JPShinjitaiCharacters https://cdn.jsdelivr.net/npm/opencc-data/data/JPShinjitaiCharacters.txt
  19. // @resource JPShinjitaiPhrases https://cdn.jsdelivr.net/npm/opencc-data/data/JPShinjitaiPhrases.txt
  20. // @resource JPVariants https://cdn.jsdelivr.net/npm/opencc-data/data/JPVariants.txt
  21. // @resource JPVariantsRev https://cdn.jsdelivr.net/npm/opencc-data/data/JPVariantsRev.txt
  22. // @resource STCharacters https://cdn.jsdelivr.net/npm/opencc-data/data/STCharacters.txt
  23. // @resource STPhrases https://cdn.jsdelivr.net/npm/opencc-data/data/STPhrases.txt
  24. // @resource TSCharacters https://cdn.jsdelivr.net/npm/opencc-data/data/TSCharacters.txt
  25. // @resource TSPhrases https://cdn.jsdelivr.net/npm/opencc-data/data/TSPhrases.txt
  26. // @resource TWPhrasesIT https://cdn.jsdelivr.net/npm/opencc-data/data/TWPhrasesIT.txt
  27. // @resource TWPhrasesName https://cdn.jsdelivr.net/npm/opencc-data/data/TWPhrasesName.txt
  28. // @resource TWPhrasesOther https://cdn.jsdelivr.net/npm/opencc-data/data/TWPhrasesOther.txt
  29. // @resource TWPhrasesRev https://cdn.jsdelivr.net/npm/opencc-data/data/TWPhrasesRev.txt
  30. // @resource TWVariants https://cdn.jsdelivr.net/npm/opencc-data/data/TWVariants.txt
  31. // @resource TWVariantsRev https://cdn.jsdelivr.net/npm/opencc-data/data/TWVariantsRev.txt
  32. // @resource TWVariantsRevPhrases https://cdn.jsdelivr.net/npm/opencc-data/data/TWVariantsRevPhrases.txt
  33. // ==/UserScript==
  34. (function () {
  35. "use strict";
  36.  
  37. const ToSimple = [["HKVariantsRevPhrases", "HKVariantsRev"], ["TWPhrasesRev", "TWVariantsRevPhrases", "TWVariantsRev"], ["TSPhrases", "TSCharacters"]];// to Simple Chinese
  38. const ToTraditional = [["TWVariantsRevPhrases", "TWVariantsRev"], ["HKVariantsRevPhrases", "HKVariantsRev"], ["JPShinjitaiPhrases", "JPShinjitaiCharacters", "JPVariantsRev"], ["STPhrases", "STCharacters"]];
  39. const ToTaiwan = [["STPhrases", "STCharacters"], "TWVariants", "TWPhrases"];
  40. const ToHongKong = [["STPhrases", "STCharacters"], "HKVariants"];
  41.  
  42. const NODE_DICT = ToSimple;
  43. const excludeTag = new RegExp("SCRIPT|HR|BR|TEXTAREA|BR|META");
  44. const excludeType = new RegExp("text|search|hidden");
  45.  
  46. function convert_chinese_wasm() {
  47. function base64ToUint8Array(base64String) {
  48. const padding = "=".repeat((4 - base64String.length % 4) % 4);
  49. const base64 = (base64String + padding)
  50. .replace(/\-/g, "+")
  51. .replace(/_/g, "/");
  52. const rawData = window.atob(base64);
  53. let outputArray = new Uint8Array(rawData.length);
  54. for (let i = 0; i < rawData.length; ++i) {
  55. outputArray[i] = rawData.charCodeAt(i);
  56. }
  57. return outputArray;
  58. }
  59. const wasm = base64ToUint8Array(GM_getResourceURL("opencc_wasm").slice(24));
  60. console.log("OpenCC 正在加载");
  61. init(wasm).then(() => {
  62. let build = ConverterBuild.new();
  63. console.log("OpenCC 加载字典");
  64. NODE_DICT.forEach(item => {
  65. if (Array.isArray(item)) {
  66. item.forEach(function (item) {
  67. build.adddict(GM_getResourceText(item));
  68. });
  69. } else {
  70. console.assert(typeof item == "string");
  71. build.adddict(GM_getResourceText(item));
  72. }
  73. build.group();
  74. });
  75. console.log("OpenCC 加载字典完成");
  76. const converter = build.build();
  77. function onClose() {
  78. converter.delete();
  79. }
  80. function translate(pNode) {
  81. var childs;
  82. if (pNode) {
  83. childs = pNode.childNodes;
  84. } else {
  85. console.log("OpenCC 翻译开始");
  86. childs = document.documentElement.childNodes;
  87. }
  88. if (childs) {
  89. for (let i = 0; i < childs.length; i++) {
  90. const child = childs.item(i);
  91. if (excludeTag.test(child.tagName)) continue;
  92. if (child.title) {
  93. converter.convert(child.title).then(text => {
  94. if (child.title != text) {
  95. child.title = text;
  96. }
  97. });
  98. }
  99. if (child.alt) {
  100. converter.convert(child.alt).then(text => {
  101. if (child.alt != text) {
  102. child.alt = text;
  103. }
  104. });
  105. }
  106. if (child.tagName == "INPUT" && !excludeType.test(child.type)) {
  107. if (child.value) {
  108. converter.convert(child.value).then(text => {
  109. if (child.value != text) {
  110. child.value = text;
  111. }
  112. });
  113. }
  114. if (child.placeholder) {
  115. converter.convert(child.placeholder).then(text => {
  116. if (child.placeholder != text) {
  117. child.placeholder = text;
  118. }
  119. });
  120. }
  121. } else if (child.nodeType == 3) {
  122. if (child.data) {
  123. converter.convert(child.data).then(text => {
  124. if (child.data != text) {
  125. child.data = text;
  126. }
  127. });
  128. }
  129. } else {
  130. if (child.nodeType == 1) {
  131. translate(child);
  132. }
  133. }
  134. }
  135. }
  136. if (!pNode) {
  137. console.log("OpenCC 翻译完成");
  138. }
  139. }
  140. GM_registerMenuCommand("中文转换", translate);
  141. GM_registerMenuCommand("关闭资源", onClose);
  142. setTimeout(function () {
  143. translate();
  144. const MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
  145. let observer = new MutationObserver(function (records) {
  146. records.map(function (record) {
  147. if (record.addedNodes) {
  148. [].forEach.call(record.addedNodes, function (item) {
  149. translate(item);
  150. });
  151. }
  152. });
  153. });
  154. const option = {
  155. 'childList': true,
  156. 'subtree': true
  157. };
  158. observer.observe(document.body, option);
  159. }, 1000);
  160. });
  161. }
  162. convert_chinese_wasm();
  163. })();