Boost.org - Source Highlight

Add code highlight to boost.org pages.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

You will need to install an extension such as Tampermonkey to install this script.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name        Boost.org - Source Highlight
// @namespace   uk.jixun
// @match       https://www.boost.org/doc/*
// @grant       none
// @version     1.0
// @author      Jixun
// @description Add code highlight to boost.org pages.
// @run-at      document-start
// @license     apache-2.0
// ==/UserScript==

function main() {
  const codeBlocks = Array.from(document.querySelectorAll('pre'));
  if (codeBlocks.length === 0) return;

  const stylesheet = document.createElement('link');
  Object.assign(stylesheet, {
    rel: 'stylesheet',
    href: 'https://cdn.jsdelivr.net/gh/highlightjs/[email protected]/build/styles/default.min.css',
  });
  document.head.appendChild(stylesheet);

  const hljsScript = document.createElement('script');
  Object.assign(hljsScript, {
    src: 'https://cdn.jsdelivr.net/gh/highlightjs/[email protected]/build/highlight.min.js',
    onload: () => {
      hljs.configure({
        languages: ['cpp'],
        ignoreUnescapedHTML: true, // anchors
      });
      for(const codeBlock of codeBlocks) {
        const anchors = codeBlock.querySelectorAll('a');
        hljs.highlightElement(codeBlock);
        
        if (anchors.length === 0) continue;
        const urlMap = new Map(Array.from(anchors, anchor => [anchor.textContent, anchor.href]));
        console.info(urlMap);

        for (const strEl of codeBlock.querySelectorAll('.hljs-string')) {
          const fileName = strEl.textContent.slice(1, -1);
          console.info('searching for %s...', fileName);
          if (urlMap.has(fileName)) {
            const newAnchor = document.createElement('a');
            newAnchor.href = urlMap.get(fileName);
            newAnchor.style.borderBottom = '1px dotted';
            strEl.insertAdjacentElement('afterend', newAnchor);
            newAnchor.appendChild(strEl);
          }
        }
      }
    },
  });
  document.head.appendChild(hljsScript);
}

if (document.readyState === 'loading' && !document.head) {
  addEventListener('DOMContentLoaded', main);  
} else {
  main();
}