markdown helper

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

  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. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址