Greasy Fork 支持简体中文。

markdown helper

在中文输入法中,将·自动替换成`,》替换成>,!替换成'* '(减少按键距离)

// ==UserScript==
// @name         markdown helper
// @namespace    http://tampermonkey.net/
// @version      0.6.1
// @description  在中文输入法中,将·自动替换成`,》替换成>,!替换成'* '(减少按键距离)
// @author       鹿之城
// @match        https://www.nowcoder.com/creation/write/*
// @match        https://maxiang.io/
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    console.log('md专用转换脚本已加载');

    function getCaretPosition(element) {
        let caretOffset = 0;
        let doc = element.ownerDocument || element.document;
        let win = doc.defaultView || doc.parentWindow;
        let sel = win.getSelection();
        if (sel.rangeCount > 0) {
            let range = sel.getRangeAt(0);
            let preCaretRange = range.cloneRange();
            preCaretRange.selectNodeContents(element);
            preCaretRange.setEnd(range.endContainer, range.endOffset);
            caretOffset = preCaretRange.toString().length;
        }
        return caretOffset;
    }

    function setCaretPosition(element, offset) {
        let charIndex = 0, range = document.createRange();
        range.setStart(element, 0);
        range.collapse(true);
        let nodeStack = [element], node, foundStart = false, stop = false;

        while (!stop && (node = nodeStack.pop())) {
            if (node.nodeType == 3) {
                let nextCharIndex = charIndex + node.length;
                if (!foundStart && offset >= charIndex && offset <= nextCharIndex) {
                    range.setStart(node, offset - charIndex);
                    range.setEnd(node, offset - charIndex);
                    stop = true;
                }
                charIndex = nextCharIndex;
            } else {
                let i = node.childNodes.length;
                while (i--) {
                    nodeStack.push(node.childNodes[i]);
                }
            }
        }

        let sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(range);
    }

    document.addEventListener('compositionend', function(e) {
        let target = e.target;
        if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {
            let start = getCaretPosition(target);
            console.log('替换前 - 光标位置:', start);

            let value = target.value || target.innerHTML;
            let lengthChange = 0;

            if (value.includes('》')) {
                console.log('检测到"》",将其替换为">"');
                value = value.replace(/》/g, '> ');
                lengthChange = '> '.length - '》'.length;
            } else if (value.includes('·')) {
                console.log('检测到"·",将其替换为"`"');
                value = value.replace(/·/g, '`');
                lengthChange = '` '.length - '·'.length;
            }
            //else if (value.includes('~')) {
              //  console.log('检测到"~",将其替换为"* "');
               // value = value.replace(/~/g, '*  ');
                //lengthChange = '*  '.length - '~'.length;
        //    }
            else if (value.includes('!')) {
                console.log('检测到"!",将其替换为"* "');
                value = value.replace(/!/g, '*  ');
                lengthChange = '*  '.length - '~'.length;
            }


            if (lengthChange !== 0) {
                start += lengthChange;
            }

            if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') {
                target.value = value;
                target.setSelectionRange(start, start);
                console.log('替换后 - 光标位置:', start);
            } else {
                target.innerHTML = value;
                setCaretPosition(target, start);
                console.log('替换后 - 光标位置:', start);
            }
        }
    });

})();