skeb-request-auto-link

The auto link for requests of Skeb.

// ==UserScript==
// @name     skeb-request-auto-link
// @version  1.6
// @grant    none
// @include  https://skeb.jp/*
// @description The auto link for requests of Skeb.
// @license MIT
// @namespace https://greasyfork.org/users/114367
// ==/UserScript==

const makeLink = elm => {
  if (elm.nodeType != 3) return elm;
  if (elm.textContent.match(/([\s\S]*)(https?:\/\/[\w!?\/+\-=_~;.,*&@#$%()'[\]]+)([\s\S]*)/m)) {
    const pre = RegExp.$1;
    const url = RegExp.$2;
    const next = RegExp.$3;
    const f = document.createDocumentFragment();
    f.appendChild(makeLink(document.createTextNode(pre)));
    const link = document.createElement('A');
    link.textContent = url;
    link.href = url;
    link.target = '_blank';
    link.rel = 'noreferrer';
    link.className = 'skeb-request-auto-link';
    f.appendChild(link);
    f.appendChild(makeLink(document.createTextNode(next)));
    return f;
  } else {
    return elm;
  }
};

const execute = () => {
  for (const panel of document.getElementsByClassName('panel-block')) {
    if (panel.getAttribute('data-skebrequestautolink')) continue;
    panel.setAttribute('data-skebrequestautolink', true);
    for (const lines of panel.getElementsByClassName('pre-line')) {
      lines.replaceChild(makeLink(lines.firstChild), lines.firstChild);
    }
  }
};

let timer = setTimeout(execute, 1000);
const observer = new MutationObserver(rec => {
  clearTimeout(timer);
  timer = setTimeout(execute, 1000);
});
observer.observe(document.body, { childList: true, subtree: true });

const style = document.createElement('STYLE');
style.textContent = `
  .skeb-request-auto-link { transition: .2s; }
  .skeb-request-auto-link:hover { background: #0962; }
`;
document.head.appendChild(style);