GreasyFork Code: Syntax Highlight by CodeMirror

To syntax hightlight GreasyFork Code by CodeMirror

Устаревшая версия за 30.07.2023. Перейдите к последней версии.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Userscripts.

Чтобы установить этот скрипт, сначала вы должны установить расширение браузера, например Tampermonkey.

Чтобы установить этот скрипт, вы должны установить расширение — менеджер скриптов.

(у меня уже есть менеджер скриптов, дайте мне установить скрипт!)

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

(у меня уже есть менеджер стилей, дайте мне установить скрипт!)

// ==UserScript==
// @name        GreasyFork Code: Syntax Highlight by CodeMirror
// @namespace   Violentmonkey Scripts
// @match       https://greasyfork.org/*
// @grant       none
// @version     0.1.0
// @author      CY Fung
// @description To syntax hightlight GreasyFork Code by CodeMirror
// @run-at      document-start
// @inject-into page
// @unwrap
// @license     MIT
// ==/UserScript==

(() => {
  let byPass = true;

  let documentReady = new Promise(resolve => {
    Promise.resolve().then(() => {
      if (document.readyState !== 'loading') {
        resolve();
      } else {
        window.addEventListener("DOMContentLoaded", resolve, false);
      }
    });
  });

  // Function to load CodeMirror library
  function loadCodeMirror(arr) {


    const promises = arr.map((href) => {
      return new Promise(resolve => {


        const script = document.createElement('script');
        script.src = href;
        script.onload = () => {
          resolve(script);
        };
        document.head.appendChild(script);

      });


    });

    return Promise.all(promises);
  }

  // Function to load CodeMirror CSS
  function loadCodeMirrorCSS(href) {
    const link = document.createElement('link');
    link.rel = 'stylesheet';
    link.href = href;
    document.head.appendChild(link);
  }

  async function runBlock(codeBlock){

    let textarea = document.createElement('textarea');
    textarea.value = `${codeBlock.textContent}`;
    textarea.readOnly = true;
    textarea.id = 'editor651';

    textarea.style.width = '100%';
    textarea.style.height = '400px';

    codeBlock.replaceWith(textarea);
    codeBlock.remove();

    await Promise.resolve();
    await new Promise(r=>setTimeout(r, 20));




    let editor651 = CodeMirror.fromTextArea(document.querySelector('#editor651'), {

      mode: "javascript",

      readOnly: true,
      styleActiveLine: true,
      lineNumbers: true,
    });
    editor651.save();







  }

  // Main function to apply CodeMirror syntax highlighting to pre elements
  function applyCodeMirrorSyntaxHighlighting() {
    const codeBlocks = document.querySelectorAll('pre.prettyprint.linenums.lang-js');


    // Check if CodeMirror is loaded
    if (typeof CodeMirror !== 'undefined') {

      codeBlocks.forEach(runBlock);
    } else {
      console.error('CodeMirror library is not loaded. Syntax highlighting cannot be applied.');
    }
  }

  async function doAction() {


    await new Promise(r => setTimeout(r, 0));

    if (mgg) {

      byPass = false;


      document.head.appendChild(document.createElement('style')).textContent = `

          body {

              display: flex;
              flex-direction: column;
              height: 100vh;
          }

          body  > div:last-child{
              height:0;
              flex-grow:1;
              display: flex;
              flex-direction:column;
          }

          body  > div:last-child >  #script-info:last-child{

              height:0;
              flex-grow:1;
              display: flex;
              flex-direction:column;

          }

          body  > div:last-child >  #script-info:last-child > #script-content:last-child{


              height:0;
              flex-grow:1;
              display: flex;
              flex-direction:column;
          }

          body  > div:last-child >  #script-info:last-child > #script-content:last-child > .code-container:last-child{


              height:0;
              flex-grow:1;
              display: flex;
              flex-direction:column;

          }

          body  > div:last-child >  #script-info:last-child > #script-content:last-child > .code-container:last-child > textarea:last-child{


              height:0;
              flex-grow:1;
              display: flex;
              flex-direction:column;

          }

          body  > div:last-child >  #script-info:last-child > #script-content:last-child > .code-container:last-child > .CodeMirror:last-child{


              height:0;
              flex-grow:1;
              display: flex;
              flex-direction:column;

          }

              `;

      await loadCodeMirror(['https://cdn.jsdelivr.net/npm/[email protected]/lib/codemirror.min.js']);

      await loadCodeMirror([
        'https://cdn.jsdelivr.net/npm/[email protected]/mode/javascript/javascript.min.js',
        'https://cdn.jsdelivr.net/npm/[email protected]/addon/selection/active-line.min.js']);

      loadCodeMirrorCSS('https://cdn.jsdelivr.net/npm/[email protected]/lib/codemirror.min.css');

      await new Promise(r => setTimeout(r, 0));


      applyCodeMirrorSyntaxHighlighting();




    }



  }


  let mz = HTMLElement.prototype.getElementsByTagName
  let mzd = Document.prototype.getElementsByTagName

  let mgg = 0;
  async function mTz() {
    if (mgg) return;
    mgg = 1;
    byPass = false;
    documentReady.then(doAction);
  }

  function getElementsByTagName(tag) {

    if (tag === 'pre' || tag === 'code' || tag === 'xmp') {
      if (byPass) {
        setTimeout(mTz, 10)
        return [];
      }
    }
    if (this instanceof Document) {
      return mzd.call(this, tag);
    } else {
      return mz.call(this, tag);
    }
  }


  HTMLElement.prototype.getElementsByTagName = getElementsByTagName
  Document.prototype.getElementsByTagName = getElementsByTagName

  /*
  let mz= function(evt){

    if(evt && evt.type ==='readystatechange') return;
    return EventTarget.prototype.addEventListener.apply(this,arguments)

  };
  window.addEventListener = mz
  document.addEventListener = mz;
  */



})();