Violentmonkey Scripts
// ==UserScript== // @name Google Translate English split words // @name:en Google Translate English split words // @name:zh-CN Google Translate English split words // @name:zh-TW Google Translate English split words // @name:ja Google Translate English split words // @name:ko Google Translate English split words // @name:de Google Translate English split words // @name:fr Google Translate English split words // @name:es Google Translate English split words // @name:pt Google Translate English split words // @name:ru Google Translate English split words // @name:it Google Translate English split words // @name:tr Google Translate English split words // @name:ar Google Translate English split words // @name:th Google Translate English split words // @name:vi Google Translate English split words // @name:id Google Translate English split words // @namespace Violentmonkey Scripts // @match *://translate.google.com/* // @version XiaoYing_2023.05.25.22 // @grant GM_info // @grant GM_getValue // @grant GM_setValue // @grant GM_addStyle // @grant GM_deleteValue // @grant GM_xmlhttpRequest // @grant GM_setClipboard // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // @grant GM_getResourceText // @grant GM_getResourceURL // @grant GM_openInTab // @grant unsafeWindow // @run-at document-start // @author github.com @XiaoYingYo // @require https://greasyfork.org/scripts/464929-module-jquery-xiaoying/code/module_jquery_XiaoYing.js // @require https://greasyfork.org/scripts/464780-global-module/code/global_module.js // @description Violentmonkey Scripts // @description:en Violentmonkey Scripts // @description:zh-CN Violentmonkey 脚本 // @description:zh-TW Violentmonkey 腳本 // @description:ja Violentmonkey スクリプト // @description:ko Violentmonkey 스크립트 // @description:de Violentmonkey Skripte // @description:fr Violentmonkey Scripts // @description:es Violentmonkey Scripts // @description:pt Violentmonkey Scripts // @description:ru Violentmonkey Сценарии // @description:it Violentmonkey Scripts // @description:tr Violentmonkey Scripts // @description:ar Violentmonkey Scripts // @description:th Violentmonkey Scripts // @description:vi Violentmonkey Scripts // @description:id Violentmonkey Scripts // ==/UserScript== var GlobalVariable = new Map(); var ProcessRules = new Map(); ProcessRules.set('convertToTitleCase_01', (Text) => { return convertToTitleCase(Text, '_'); }); ProcessRules.set('convertToTitleCase_02', (Text) => { return convertToTitleCase(Text, '-'); }); ProcessRules.set('UppercaseSplitWords', (Text) => { return Text.replace(/(?<!\s)([A-Z])/g, ' $1').trim(); }); function ProcessText(textarea) { if (GlobalVariable.get('InputIng') === 1) { return null; } let text = textarea.val(); if (!containsEnglishLetter(text)) { return null; } if (text == '') { return null; } GlobalVariable.set('InputIng', 1); let oldLength = text.length; let newText = text; for (const item of ProcessRules.values()) { newText = item(newText); if (newText !== text) { break; } } if (newText === text) { GlobalVariable.set('InputIng', 0); return null; } let newLength = newText.length; global_module.AnalogInput.AnalogInput(textarea[0], newText); GlobalVariable.set('InputIng', 0); let oldChanges = GlobalVariable.get('IgnoreChanges'); GlobalVariable.set('IgnoreChanges', oldChanges + 1); return newLength - oldLength; } function convertToTitleCase(Text, separator) { let regx = new RegExp(separator, 'g'); const words = Text.replace(regx, ' ').split(' '); if (words.length == 1) { return Text; } const titleCaseWords = words.map((word) => { const lowerCaseWord = word.toLowerCase(); return lowerCaseWord.charAt(0).toUpperCase() + lowerCaseWord.slice(1); }); return titleCaseWords.join(' '); } function containsEnglishLetter(str) { for (let i = 0; i < str.length; i++) { if (i > 1000) { break; } const charCode = str.charCodeAt(i); if ((charCode >= 65 && charCode <= 90) || (charCode >= 97 && charCode <= 122)) { return true; } } return false; } async function main() { let textarea = await global_module.waitForElement('textarea[class][jsname]'); let polite = await global_module.waitForElement("div[aria-live='polite']"); textarea = textarea.eq(0); GlobalVariable.set('InputIng', 0); GlobalVariable.set('IgnoreChanges', 0); let MutationObserver = unsafeWindow.MutationObserver || unsafeWindow.WebKitMutationObserver || unsafeWindow.MozMutationObserver; let observer = new MutationObserver( global_module.debounce(() => { if (GlobalVariable.get('IgnoreChanges') !== 0) { let oldChanges = GlobalVariable.get('IgnoreChanges'); GlobalVariable.set('IgnoreChanges', oldChanges - 1); return; } let selectionStart = textarea.prop('selectionStart'); let selectionEnd = textarea.prop('selectionEnd'); let index = ProcessText(textarea); if (index && index != 0) { selectionStart += index; selectionEnd += index; } textarea.prop('selectionStart', selectionStart); textarea.prop('selectionEnd', selectionEnd); textarea.focus(); }), 1000 ); observer.observe(polite[0], { childList: true, subtree: false }); } main();