翻译插件——去除换行(改)

在谷歌翻译、百度翻译、网易有道翻译、腾讯翻译君的页面上增加了一个“自动/禁止格式化”按钮,用来自动移除从PDF等复制过来的文本中包含的换行、回车;优化连字符问题

  1. // ==UserScript==
  2. // @name 翻译插件——去除换行(改)
  3. // @namespace 2240726829@qq.com
  4. // @version 1.0.5
  5. // @description 在谷歌翻译、百度翻译、网易有道翻译、腾讯翻译君的页面上增加了一个“自动/禁止格式化”按钮,用来自动移除从PDF等复制过来的文本中包含的换行、回车;优化连字符问题
  6. // @author caiguang1997
  7. // @match https://fanyi.baidu.com/*
  8. // @match http://fanyi.youdao.com/
  9. // @match https://fanyi.qq.com/*
  10. // @match https://translate.google.cn/*
  11. // @match https://translate.google.com/*
  12. // @icon https://translate.google.cn/favicon.ico
  13. // @run-at document-end
  14. // ==/UserScript==
  15.  
  16. // Convert string to web element
  17. function parseDom(arg) {
  18. var d = document.createElement('div');
  19. d.innerHTML = arg;
  20. return d.firstChild;
  21. }
  22.  
  23. const GOOGLE_TRANSLATE_CN = "translate.google.cn";
  24. const GOOGLE_TRANSLATE = "translate.google.com";
  25. const BAIDU_FANYI = "fanyi.baidu.com";
  26. const YOUDAO_FANYI = "fanyi.youdao.com";
  27. const QQ_FANYI = "fanyi.qq.com";
  28.  
  29. const FORMAT_CN = "自动格式化";
  30.  
  31. // Get source input element
  32. function getInputElement(host) {
  33. const idDict = {
  34. [GOOGLE_TRANSLATE_CN]: "source",
  35. [GOOGLE_TRANSLATE]: "source",
  36. [BAIDU_FANYI]: "baidu_translate_input",
  37. [YOUDAO_FANYI]: "inputOriginal"
  38. }
  39.  
  40. if(host===QQ_FANYI)
  41. {
  42. return document.querySelector("body > div.layout-container > div.textpanel > div.textpanel-container.clearfix > div.textpanel-source.active > div.textpanel-source-textarea > textarea");
  43. }
  44. else
  45. {
  46. const id = idDict[host];
  47. return document.getElementById(id);
  48. }
  49. }
  50.  
  51. // Format code
  52. function format(elemnt) {
  53. var txt = elemnt.value;
  54.  
  55. //第一步:连字符与换行连用表示单词拼接
  56. txt = txt.replace(/-\n/g,"");
  57.  
  58. //第二步:将(前面一个符号为非句号、问号、感叹号、分号、冒号、换行的)换行符替换为空格
  59. txt = txt.replace(/(?<![\.?!;:\n])\n/g," ");
  60.  
  61. //第三步:上一步可能会增添多余空格,因此,多空格替换为单空格
  62. txt = txt.replace(/ +/g," ");
  63.  
  64. //第四步:将(前面一个符号为句号、问号、感叹号、分号、冒号、换行的)换行符替换为双回车
  65. txt = txt.replace(/(?<=[\.?!;:])\n+/g,"\n\n");
  66.  
  67. elemnt.value = txt;
  68. }
  69.  
  70. // Create new button
  71. function createButton(host) {
  72. const elemnt = getInputElement(host);
  73. var new_button = null;
  74. switch(host) {
  75. case GOOGLE_TRANSLATE_CN:
  76. case GOOGLE_TRANSLATE:
  77. var FORMAT = "自动格式化";
  78. var buttonHtml = "<div id='my_format' class='tlid-input-button input-button header-button tlid-input-button-docs text-icon' role='tab' tabindex='-1'><div class='text'>" + FORMAT + "</div></div>"
  79. new_button = parseDom(buttonHtml);
  80. new_button.onclick = function() {
  81. if(document.getElementById('my_format').innerText==="自动格式化") {
  82. document.getElementById('my_format').innerText = "禁止格式化";
  83.  
  84. format(elemnt);
  85.  
  86. elemnt.onchange = function () {
  87. format(elemnt);
  88. }
  89. }
  90. else{
  91. document.getElementById('my_format').innerText = "自动格式化";
  92. elemnt.onchange = function () {};
  93. }
  94. };
  95. break;
  96. case BAIDU_FANYI:
  97. var baidu_fanyi_css = "text-align: center; margin-left: 14px; width: 106px; height: 30px; line-height: 30px; font-size: 14px; color: #4395ff; letter-spacing: 2px; background-color: #f9f9f9; border: 1px solid #4395ff; border-radius: 3px";
  98. new_button = parseDom(`<a id='my_format' href="javascript:" style="${baidu_fanyi_css}">${FORMAT_CN}</a>`);
  99. new_button.onclick = function() {
  100. if(document.getElementById('my_format').innerText==="自动格式化") {
  101. document.getElementById('my_format').innerText = "禁止格式化";
  102.  
  103. var translate_button = document.querySelector("#translate-button");
  104.  
  105. format(elemnt);
  106. translate_button.click();
  107.  
  108. elemnt.onchange = function () {
  109. format(elemnt);
  110. translate_button.click();
  111. }
  112. }
  113. else{
  114. document.getElementById('my_format').innerText = "自动格式化";
  115. elemnt.onchange = function () {};
  116. }
  117. };
  118. break;
  119. case YOUDAO_FANYI:
  120. new_button = parseDom(`<a id='my_format' class="fanyi__operations--man clog-js" data-clog="AT_BUTTON_CLICK" data-pos="web.i.top" id="transMan" href="javascript:;"> ${FORMAT_CN} </a>`);
  121. new_button.onclick = function() {
  122. if(document.getElementById('my_format').innerText==="自动格式化") {
  123. document.getElementById('my_format').innerText = "禁止格式化";
  124.  
  125. var translate_button = document.querySelector("#transMachine");
  126.  
  127. format(elemnt);
  128. translate_button.click();
  129.  
  130. elemnt.onchange = function () {
  131. format(elemnt);
  132. translate_button.click();
  133. }
  134. }
  135. else{
  136. document.getElementById('my_format').innerText = "自动格式化";
  137. elemnt.onchange = function () {};
  138. }
  139. };
  140. break;
  141. case QQ_FANYI:
  142. new_button = parseDom(`<div id='my_format' class="language-translate-button" node-type="translate_button">${FORMAT_CN}</div>`);
  143. new_button.onclick = function() {
  144. if(document.getElementById('my_format').innerText==="自动格式化") {
  145. document.getElementById('my_format').innerText = "禁止格式化";
  146.  
  147. var translate_button = document.querySelector("#language-button-group-translate > div");
  148.  
  149. format(elemnt);
  150. translate_button.click();
  151.  
  152. elemnt.onchange = function () {
  153. format(elemnt);
  154. translate_button.click();
  155. }
  156. }
  157. else{
  158. document.getElementById('my_format').innerText = "自动格式化";
  159. elemnt.onchange = function () {};
  160. }
  161. };
  162. break;
  163. default: break;
  164. }
  165. return new_button;
  166. }
  167.  
  168. // Get container
  169. function getContainer(host) {
  170. var container = null;
  171. switch(host) {
  172. case GOOGLE_TRANSLATE_CN:
  173. case GOOGLE_TRANSLATE:
  174. container = document.querySelector("body > div.container > div.frame > div.page.tlid-homepage.homepage.translate-text > div.input-button-container > div")
  175. break;
  176. case BAIDU_FANYI:
  177. container = document.querySelector("#main-outer > div > div > div.translate-wrap > div.trans-operation-wrapper.clearfix > div.trans-operation.clearfix");
  178. break;
  179. case YOUDAO_FANYI:
  180. container = document.querySelector("body > div.fanyi > div.fanyi__operations > div.fanyi__operations--left");
  181. break;
  182. case QQ_FANYI:
  183. container = document.querySelector("body > div.layout-container > div.language > div.language-container.clearfix");
  184. break;
  185. default: break;
  186. }
  187. return container;
  188. }
  189.  
  190. // Run from this
  191. (function() {
  192. var host = window.location.host;
  193. var new_button = createButton(host);
  194. var container = getContainer(host);
  195. container.appendChild(new_button);
  196. })();

QingJ © 2025

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