markdown helper

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

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey, Greasemonkey किंवा Violentmonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey किंवा Violentmonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल..

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey किंवा Violentmonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल..

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

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला Tampermonkey यासारखे एक्स्टेंशन इंस्टॉल करावे लागेल..

ही स्क्रिप्ट इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्क्रिप्ट व्यवस्थापक एक्स्टेंशन इंस्टॉल करावे लागेल.

(माझ्याकडे आधीच युझर स्क्रिप्ट व्यवस्थापक आहे, मला इंस्टॉल करू द्या!)

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला Stylus सारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला Stylus सारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला Stylus सारखे एक्स्टेंशन इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्टाईल व्यवस्थापक इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्टाईल व्यवस्थापक इंस्टॉल करावे लागेल.

ही स्टाईल इंस्टॉल करण्यासाठी तुम्हाला एक युझर स्टाईल व्यवस्थापक इंस्टॉल करावे लागेल.

(माझ्याकडे आधीच युझर स्टाईल व्यवस्थापक आहे, मला इंस्टॉल करू द्या!)

  1. // ==UserScript==
  2. // @name markdown helper
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.6.1
  5. // @description 在中文输入法中,将·自动替换成`,》替换成>,!替换成'* '(减少按键距离)
  6. // @author 鹿之城
  7. // @match https://www.nowcoder.com/creation/write/*
  8. // @match https://maxiang.io/
  9. // @grant none
  10. // @license MIT
  11. // ==/UserScript==
  12.  
  13. (function() {
  14. 'use strict';
  15.  
  16. console.log('md专用转换脚本已加载');
  17.  
  18. function getCaretPosition(element) {
  19. let caretOffset = 0;
  20. let doc = element.ownerDocument || element.document;
  21. let win = doc.defaultView || doc.parentWindow;
  22. let sel = win.getSelection();
  23. if (sel.rangeCount > 0) {
  24. let range = sel.getRangeAt(0);
  25. let preCaretRange = range.cloneRange();
  26. preCaretRange.selectNodeContents(element);
  27. preCaretRange.setEnd(range.endContainer, range.endOffset);
  28. caretOffset = preCaretRange.toString().length;
  29. }
  30. return caretOffset;
  31. }
  32.  
  33. function setCaretPosition(element, offset) {
  34. let charIndex = 0, range = document.createRange();
  35. range.setStart(element, 0);
  36. range.collapse(true);
  37. let nodeStack = [element], node, foundStart = false, stop = false;
  38.  
  39. while (!stop && (node = nodeStack.pop())) {
  40. if (node.nodeType == 3) {
  41. let nextCharIndex = charIndex + node.length;
  42. if (!foundStart && offset >= charIndex && offset <= nextCharIndex) {
  43. range.setStart(node, offset - charIndex);
  44. range.setEnd(node, offset - charIndex);
  45. stop = true;
  46. }
  47. charIndex = nextCharIndex;
  48. } else {
  49. let i = node.childNodes.length;
  50. while (i--) {
  51. nodeStack.push(node.childNodes[i]);
  52. }
  53. }
  54. }
  55.  
  56. let sel = window.getSelection();
  57. sel.removeAllRanges();
  58. sel.addRange(range);
  59. }
  60.  
  61. document.addEventListener('compositionend', function(e) {
  62. let target = e.target;
  63. if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {
  64. let start = getCaretPosition(target);
  65. console.log('替换前 - 光标位置:', start);
  66.  
  67. let value = target.value || target.innerHTML;
  68. let lengthChange = 0;
  69.  
  70. if (value.includes('》')) {
  71. console.log('检测到"》",将其替换为">"');
  72. value = value.replace(/》/g, '> ');
  73. lengthChange = '> '.length - '》'.length;
  74. } else if (value.includes('·')) {
  75. console.log('检测到"·",将其替换为"`"');
  76. value = value.replace(/·/g, '`');
  77. lengthChange = '` '.length - '·'.length;
  78. }
  79. //else if (value.includes('~')) {
  80. // console.log('检测到"~",将其替换为"* "');
  81. // value = value.replace(/~/g, '* ');
  82. //lengthChange = '* '.length - '~'.length;
  83. // }
  84. else if (value.includes('!')) {
  85. console.log('检测到"!",将其替换为"* "');
  86. value = value.replace(/!/g, '* ');
  87. lengthChange = '* '.length - '~'.length;
  88. }
  89.  
  90.  
  91. if (lengthChange !== 0) {
  92. start += lengthChange;
  93. }
  94.  
  95. if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') {
  96. target.value = value;
  97. target.setSelectionRange(start, start);
  98. console.log('替换后 - 光标位置:', start);
  99. } else {
  100. target.innerHTML = value;
  101. setCaretPosition(target, start);
  102. console.log('替换后 - 光标位置:', start);
  103. }
  104. }
  105. });
  106.  
  107. })();