| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 | /* * Set up window for Node.js */var _window = (typeof window !== 'undefined' ? window : this)/* * Parsing HTML strings */function canParseHtmlNatively () {  var Parser = _window.DOMParser  var canParse = false  // Adapted from https://gist.github.com/1129031  // Firefox/Opera/IE throw errors on unsupported types  try {    // WebKit returns null on unsupported types    if (new Parser().parseFromString('', 'text/html')) {      canParse = true    }  } catch (e) {}  return canParse}function createHtmlParser () {  var Parser = function () {}  // For Node.js environments  if (typeof document === 'undefined') {    var jsdom = require('jsdom')    Parser.prototype.parseFromString = function (string) {      return jsdom.jsdom(string, {        features: {          FetchExternalResources: [],          ProcessExternalResources: false        }      })    }  } else {    if (!shouldUseActiveX()) {      Parser.prototype.parseFromString = function (string) {        var doc = document.implementation.createHTMLDocument('')        doc.open()        doc.write(string)        doc.close()        return doc      }    } else {      Parser.prototype.parseFromString = function (string) {        var doc = new window.ActiveXObject('htmlfile')        doc.designMode = 'on' // disable on-page scripts        doc.open()        doc.write(string)        doc.close()        return doc      }    }  }  return Parser}function shouldUseActiveX () {  var useActiveX = false  try {    document.implementation.createHTMLDocument('').open()  } catch (e) {    if (window.ActiveXObject) useActiveX = true  }  return useActiveX}module.exports = canParseHtmlNatively() ? _window.DOMParser : createHtmlParser()
 |