Geekhub Markdown Editor

add CodeMirror Editor for comment & topic

安装此脚本
作者推荐脚本

您可能也喜欢Geekhub

安装此脚本
  1. // ==UserScript==
  2. // @name Geekhub Markdown Editor
  3. // @namespace https://geekhub.com/
  4. // @version 4
  5. // @description add CodeMirror Editor for comment & topic
  6. // @author dallaslu
  7. // @match https://geekhub.com/*
  8. // @match https://www.geekhub.com/*
  9. // @grant none
  10. // @require https://cdn.jsdelivr.net/npm/codemirror/lib/codemirror.min.js
  11. // @require https://cdn.jsdelivr.net/npm/codemirror/mode/markdown/markdown.js
  12. // @require https://cdn.jsdelivr.net/npm/codemirror/mode/gfm/gfm.js
  13. // @require https://cdn.jsdelivr.net/npm/codemirror/addon/mode/overlay.js
  14. // ==/UserScript==
  15.  
  16. (function() {
  17. 'use strict';
  18. var ghSchemeButtons = {
  19. 'light': 'dark',
  20. 'dark': 'darcula',
  21. 'solar': 'darcula',
  22. 'ocean': 'darcula',
  23. 'jade': 'default'
  24. };
  25.  
  26. function init() {
  27. var cmElement = document.querySelector('.CodeMirror');
  28. if(!cmElement){
  29. var textElement = document.getElementById('comment-box')
  30. || document.getElementById('post_content')
  31. || document.getElementById('second_hand_content')
  32. || document.getElementById('molecule_content')
  33. || document.getElementById('group_buy_content')
  34. || document.getElementById('service_content');
  35. if(textElement){
  36. var theme = '';
  37. for (var btn in ghSchemeButtons) {
  38. var schemeBtn = document.getElementById(btn);
  39. if (schemeBtn && !schemeBtn.classList.contains('hidden')) {
  40. theme = ghSchemeButtons[btn];
  41. break;
  42. }
  43. }
  44.  
  45. theme = theme || 'darcula';
  46. loadStyles('https://cdn.jsdelivr.net/npm/codemirror/lib/codemirror.css');
  47. loadStyles('https://cdn.jsdelivr.net/npm/codemirror/theme/darcula.css');
  48. var cm = CodeMirror.fromTextArea(textElement, {
  49. mode : {
  50. name : "gfm",
  51. tokenTypeOverrides : {
  52. emoji : "emoji"
  53. }
  54. },
  55. lineWrapping : true,
  56. lineNumbers : false,
  57. theme: theme
  58. });
  59. cm.on('change', function(){
  60. cm.save();
  61. });
  62. // TODO clear with textarea after submit
  63. }
  64. }
  65. }
  66. function loadStyles(url) {
  67. var link = document.createElement("link");
  68. link.type = "text/css";
  69. link.rel = "stylesheet";
  70. link.href = url;
  71. var head = document.getElementsByTagName("head")[0];
  72. head.appendChild(link);
  73. }
  74.  
  75. var observer = new MutationObserver(function(doc, observer) {
  76. init();
  77. });
  78.  
  79. observer.observe(document, {
  80. characterData: true,
  81. childList: true,
  82. attributes: true,
  83. subtree: true,
  84. attributeOldValue: true,
  85. characterDataOldValue: true
  86. });
  87.  
  88. init();
  89. })();