(function () {
  const SELECTORS =
    '.lesson-list .link.title, ' +
    '.lesson-list .description, ' +
    '.stream-title, ' +
    '.stream-title td a > div, ' +
    '.page-header h1' +
    '.lesson-header-block h2.lesson-title-value';

  function typograf(text) {
    return text
      .replace(/"([^"]*)"/g, '«$1»')
      .replace(/\s-\s/g, ' — ')
      .replace(/(\d)-(\d)/g, '$1–$2')
      .replace(/(^|\s)(и|в|на|с|к|по|о|у|за|до|не|но|а|от) /gi, '$1$2\u00A0')
      .replace(/(\d+)\s(кг|г|м|см|мм|л|%)\b/gi, '$1\u00A0$2')
      .replace(/ {2,}/g, ' ');
  }

  function processTextNodes(node) {
    if (node.nodeType === Node.TEXT_NODE) {
      if (node._typografDone) return;
      node.nodeValue = typograf(node.nodeValue);
      node._typografDone = true;
      return;
    }
    if (node.nodeType === Node.ELEMENT_NODE) {
      if (node.tagName === 'SCRIPT' || node.tagName === 'STYLE') return;
      Array.from(node.childNodes).forEach(processTextNodes);
    }
  }

  let observer;

  function run() {
    if (observer) observer.disconnect();
    document.querySelectorAll(SELECTORS).forEach(processTextNodes);
    if (observer) {
      observer.observe(document.body, { childList: true, subtree: true });
    }
  }

  function init() {
    observer = new MutationObserver(run);
    run();
  }

  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', init);
  } else {
    init();
  }
})();