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.5
  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. function addLineBreaks() {
  17. const codeElements = document.getElementsByTagName('code');
  18. for (const codeElement of codeElements) {
  19. const prevSibling = codeElement.previousSibling;
  20. const nextSibling = codeElement.nextSibling;
  21. if (prevSibling && prevSibling.tagName === 'BR' && nextSibling && nextSibling.tagName === 'BR') {
  22. continue;
  23. }
  24. const lineBreakBefore = document.createElement('br');
  25. codeElement.parentNode.insertBefore(lineBreakBefore, codeElement);
  26. const lineBreakAfter = document.createElement('br');
  27. codeElement.parentNode.insertBefore(lineBreakAfter, codeElement.nextSibling);
  28. }
  29. }
  30.  
  31. function simulateMouseDrag(element) {
  32. const event = new MouseEvent('mousedown', {
  33. bubbles: true,
  34. cancelable: true,
  35. clientX: element.getBoundingClientRect().left,
  36. clientY: element.getBoundingClientRect().top,
  37. });
  38.  
  39. element.dispatchEvent(event);
  40.  
  41. const moveEvent = new MouseEvent('mousemove', {
  42. bubbles: true,
  43. cancelable: true,
  44. clientX: element.getBoundingClientRect().left + 1,
  45. clientY: element.getBoundingClientRect().top,
  46. });
  47.  
  48. element.dispatchEvent(moveEvent);
  49.  
  50. const upEvent = new MouseEvent('mouseup', {
  51. bubbles: true,
  52. cancelable: true,
  53. });
  54.  
  55. element.dispatchEvent(upEvent);
  56. }
  57. function onSubmitButtonClick() {
  58. setTimeout(function() {
  59. location.reload();
  60. }, 1000);
  61. }
  62. function oncheckButtonClick() {
  63. console.log('oncheckButtonClick');
  64. setTimeout(setSubmitButton(),1000);
  65.  
  66. }
  67. function readPage()
  68. {
  69. const intervalId = setInterval(function() {
  70. const codeElements = document.getElementsByTagName('code');
  71.  
  72. if (codeElements.length > 0) {
  73. addLineBreaks();
  74. const checkButton = document.querySelector('button[data-playwright-test-label="lowerJaw-check-button"]');
  75. if(checkButton)
  76. {
  77. console.log('checkButton');
  78. checkButton.addEventListener('click', oncheckButtonClick);
  79. }
  80. else{
  81. console.log('no checkButton');
  82. }
  83. const reflexSplitter = document.querySelector('.reflex-splitter');
  84. if (reflexSplitter) {
  85. simulateMouseDrag(reflexSplitter);
  86. }
  87.  
  88. clearInterval(intervalId);
  89.  
  90. }
  91.  
  92.  
  93. }, 100);
  94. }
  95. function setSubmitButton()
  96. {
  97. const submitButton = document.querySelector('button[data-playwright-test-label="lowerJaw-submit-button"]');
  98. if (submitButton) {
  99. submitButton.addEventListener('click', onSubmitButtonClick);
  100. }
  101. }
  102. })();