Greasy Fork

Greasy Fork is available in English.

英文大小写转换 (Title Case)

选中全大写或全小写的英文文本,自动转换为首字母大写

当前为 2025-06-01 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         英文大小写转换 (Title Case)
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  选中全大写或全小写的英文文本,自动转换为首字母大写
// @author       Saphra
// @match        *://*/*
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    function convertToTitleCase(str) {
        if (!str) {
            return '';
        }
        return str.toLowerCase().replace(/(^|\s)\S/g, function(firstChar) {
            return firstChar.toUpperCase();
        });
    }

    document.addEventListener('mouseup', function() {
        setTimeout(function() { // 使用 setTimeout 确保选择已完成
            const selectedText = window.getSelection().toString();

            if (selectedText) {
                // 检查选中的文本是否包含字母
                const containsLetters = /[a-zA-Z]/.test(selectedText);
                if (!containsLetters) {
                    return; // 如果不包含字母,则不处理
                }

                // 检查是否是全大写或全小写
                const isAllUppercase = selectedText === selectedText.toUpperCase();
                const isAllLowercase = selectedText === selectedText.toLowerCase();

                if (isAllUppercase || isAllLowercase) {
                    const convertedText = convertToTitleCase(selectedText);

                    // 尝试替换可编辑元素中的文本
                    const activeElement = document.activeElement;
                    if (activeElement && (activeElement.isContentEditable || activeElement.tagName === 'INPUT' || activeElement.tagName === 'TEXTAREA')) {
                        const start = activeElement.selectionStart;
                        const end = activeElement.selectionEnd;
                        // 确保替换只发生在选中的文本上
                        if (activeElement.value.substring(start, end) === selectedText) {
                             activeElement.value = activeElement.value.substring(0, start) + convertedText + activeElement.value.substring(end);
                            activeElement.setSelectionRange(start, start + convertedText.length); // 恢复选择或设置光标位置
                        } else if (activeElement.textContent && activeElement.isContentEditable) { // For contenteditable divs
                            const selection = window.getSelection();
                            const range = selection.getRangeAt(0);
                            range.deleteContents();
                            range.insertNode(document.createTextNode(convertedText));
                        }
                    } else {
                        // 对于不可编辑元素,使用油猴的 GM_setClipboard 复制到剪贴板
                        if (typeof GM_setClipboard !== 'undefined') {
                            GM_setClipboard(convertedText);
                            // 可以在这里添加一个小的视觉提示,例如:
                            // alert('转换后的文本已复制到剪贴板: \n\n"' + convertedText + '"');
                            console.log('转换后的文本已复制到剪贴板:', convertedText);
                        } else {
                            // 如果 GM_setClipboard 不可用 (不应该发生在油猴中),则使用原生的
                            navigator.clipboard.writeText(convertedText).then(function() {
                                console.log('转换后的文本已复制到剪贴板:', convertedText);
                            }).catch(function(err) {
                                console.error('无法复制到剪贴板:', err);
                            });
                        }
                    }
                }
            }
        }, 100);
    });
})();