import React from 'react';
import pkg from '../../package.json';
import 'highlight.js/styles/base16/solarized-light.css';
// import 'highlight.js/styles/base16/solarized-dark.css';
import './Content.css';

const hljsVersion = [...pkg.dependencies['highlight.js']].reduce(
  (memo, char) => (
    /[a-zA-Z0-9.-]/.test(char)
      ? `${memo}${char}`
      : memo
  ),
  '',
);

const externalLinkIcon = `<svg width="24px" height="24px" viewBox="0 0 76 76" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" baseProfile="full" enable-background="new 0 0 76.00 76.00" xml:space="preserve" fill="#F2F2F2" stroke="#F2F2F2"><g id="SVGRepo_bgCarrier" stroke-width="0"></g><g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"></g><g id="SVGRepo_iconCarrier"> <path fill="#000000" fill-opacity="1" stroke-width="0.2" stroke-linejoin="round" d="M 44.3333,19L 57,19L 57,31.6667L 52.25,36.4167L 52.25,27.7083L 34.8333,45.125L 30.875,41.1667L 48.2917,23.75L 39.5833,23.75L 44.3333,19 Z M 19,25.3333L 42.75,25.3333L 38,30.0833L 23.75,30.0833L 23.75,52.25L 45.9167,52.25L 45.9167,38L 50.6667,33.25L 50.6667,57L 19,57L 19,25.3333 Z "></path> </g></svg>`;

const Content = ({ html }) => {
  const onRef = (el) => {
    if (!el) {
      return;
    }
    transformExternalLinks(el);
    applySyntaxHighlighting(el);
  };

  const transformExternalLinks = (el) => {
    el.querySelectorAll('a').forEach((anchor) => {
      if (new URL(anchor).origin === location.origin) {
        return;
      }
      if (anchor.getAttribute('target') === '_blank') {
        return;
      }
      anchor.setAttribute('target', '_blank');
      return anchor.appendChild(Object.assign(
        document.createElement('span'),
        { innerHTML: externalLinkIcon },
      ));
    });
  };

  const applySyntaxHighlighting = (el) => {
    el.querySelectorAll('pre code').forEach((block) => {
      const worker = new Worker('/workers/highlighter.js');
      worker.addEventListener('error', (ev) => {
        // console.error(ev);
        // Fail silently?
        worker.terminate();
      });
      worker.addEventListener('message', (ev) => {
        block.innerHTML = ev.data;
        worker.terminate();
      });
      block.classList.add('hljs');
      worker.postMessage({
        version: hljsVersion,
        code: block.textContent,
        language: (
          [...block.classList].find(v => /^language-/.test(v)) || ''
        ).split('-')[1],
      });
    });
  };

  return (
    <div
      className="Content"
      ref={onRef}
      dangerouslySetInnerHTML={{ __html: html }}
    />
  );
};

export default Content;
