Add <br> around <code> tags on FreeCodeCamp

Adds <br> before and after <code> tags on FreeCodeCamp using Monaco Editor API

当前为 2024-01-08 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Add <br> around <code> tags on FreeCodeCamp
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.4
  5. // @description Adds <br> before and after <code> tags on FreeCodeCamp using Monaco Editor API
  6. // @author Geromet
  7. // @match https://www.freecodecamp.org/learn/*
  8. // @grant none
  9. // @license MIT
  10. // @run-at document-end
  11. // ==/UserScript==
  12.  
  13. (function() {
  14. 'use strict';
  15. readPage();
  16. var _codeElements;
  17. function addLineBreaks() {
  18. const codeElements = document.getElementsByTagName('code');
  19. for (const codeElement of codeElements) {
  20. const prevSibling = codeElement.previousSibling;
  21. const nextSibling = codeElement.nextSibling;
  22. if (prevSibling && prevSibling.tagName === 'BR' && nextSibling && nextSibling.tagName === 'BR') {
  23. continue;
  24. }
  25. const lineBreakBefore = document.createElement('br');
  26. codeElement.parentNode.insertBefore(lineBreakBefore, codeElement);
  27. const lineBreakAfter = document.createElement('br');
  28. codeElement.parentNode.insertBefore(lineBreakAfter, codeElement.nextSibling);
  29. }
  30. }
  31.  
  32. function simulateMouseDrag(element) {
  33. const event = new MouseEvent('mousedown', {
  34. bubbles: true,
  35. cancelable: true,
  36. clientX: element.getBoundingClientRect().left,
  37. clientY: element.getBoundingClientRect().top,
  38. });
  39.  
  40. element.dispatchEvent(event);
  41.  
  42. const moveEvent = new MouseEvent('mousemove', {
  43. bubbles: true,
  44. cancelable: true,
  45. clientX: element.getBoundingClientRect().left + 1,
  46. clientY: element.getBoundingClientRect().top,
  47. });
  48.  
  49. element.dispatchEvent(moveEvent);
  50.  
  51. const upEvent = new MouseEvent('mouseup', {
  52. bubbles: true,
  53. cancelable: true,
  54. });
  55.  
  56. element.dispatchEvent(upEvent);
  57. }
  58. function onSubmitButtonClick() {
  59. console.log('onSubmitButtonClick');
  60. setTimeout(function() {
  61. location.reload();
  62. }, 2000);
  63. }
  64. function oncheckButtonClick() {
  65. console.log('oncheckButtonClick');
  66. setTimeout(setSubmitButton(),1000);
  67.  
  68. }
  69. function readPage()
  70. {
  71. const intervalId = setInterval(function() {
  72. const codeElements = document.getElementsByTagName('code');
  73. if(codeElements!=_codeElements){
  74. if (codeElements.length > 0) {
  75. addLineBreaks();
  76. const checkButton = document.querySelector('button[data-playwright-test-label="lowerJaw-check-button"]');
  77. if(checkButton)
  78. {
  79. console.log('checkButton');
  80. checkButton.addEventListener('click', oncheckButtonClick);
  81. }
  82. else{
  83. console.log('no checkButton');
  84. }
  85. const reflexSplitter = document.querySelector('.reflex-splitter');
  86. if (reflexSplitter) {
  87. simulateMouseDrag(reflexSplitter);
  88. }
  89.  
  90. clearInterval(intervalId);
  91. _codeElements = codeElements;
  92. }
  93. }
  94.  
  95.  
  96. }, 100);
  97. }
  98. function setSubmitButton()
  99. {
  100. const submitButton = document.querySelector('button[data-playwright-test-label="lowerJaw-submit-button"]');
  101. if (submitButton) {
  102. submitButton.addEventListener('click', onSubmitButtonClick);
  103. }
  104. }
  105. })();