Google Translate English split words

Violentmonkey Scripts

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey, το Greasemonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

You will need to install an extension such as Tampermonkey to install this script.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Userscripts για να εγκαταστήσετε αυτόν τον κώδικα.

You will need to install an extension such as Tampermonkey to install this script.

Θα χρειαστεί να εγκαταστήσετε μια επέκταση διαχείρισης κώδικα χρήστη για να εγκαταστήσετε αυτόν τον κώδικα.

(Έχω ήδη έναν διαχειριστή κώδικα χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Έχω ήδη έναν διαχειριστή στυλ χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

// ==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();