(function() {
  if (
    typeof self === 'undefined' ||
    !self.Prism ||
    !self.document ||
    !document.querySelector
  ) {
    return;
  }

  self.Prism.fileHighlight = function() {
    var Extensions = {
      js: 'javascript',
      py: 'python',
      rb: 'ruby',
      ps1: 'powershell',
      psm1: 'powershell',
      sh: 'bash',
      bat: 'batch',
      h: 'c',
      tex: 'latex',
    };

    Array.prototype.slice
      .call(document.querySelectorAll('pre[data-src]'))
      .forEach(function(pre) {
        var src = pre.getAttribute('data-src');

        var language,
          parent = pre;
        var lang = /\blang(?:uage)?-(?!\*)(\w+)\b/i;
        while (parent && !lang.test(parent.className)) {
          parent = parent.parentNode;
        }

        if (parent) {
          language = (pre.className.match(lang) || [, ''])[1];
        }

        if (!language) {
          var extension = (src.match(/\.(\w+)$/) || [, ''])[1];
          language = Extensions[extension] || extension;
        }

        var code = document.createElement('code');
        code.className = 'language-' + language;

        pre.textContent = '';

        code.textContent = 'Loading…';

        pre.appendChild(code);

        var xhr = new XMLHttpRequest();

        xhr.open('GET', src, true);

        xhr.onreadystatechange = function() {
          if (xhr.readyState == 4) {
            if (xhr.status < 400 && xhr.responseText) {
              code.textContent = xhr.responseText;

              Prism.highlightElement(code);
            } else if (xhr.status >= 400) {
              code.textContent =
                '✖ Error ' +
                xhr.status +
                ' while fetching file: ' +
                xhr.statusText;
            } else {
              code.textContent = '✖ Error: File does not exist or is empty';
            }
          }
        };

        xhr.send(null);
      });
  };

  document.addEventListener('DOMContentLoaded', self.Prism.fileHighlight);
})();
