code: function _parseExtension (ext, name) {
  
      name = name || null;
      // If it's a string, the extension was previously loaded
      if (showdown.helper.isString(ext)) {
        ext = showdown.helper.stdExtName(ext);
        name = ext;
  
        // LEGACY_SUPPORT CODE
        if (showdown.extensions[ext]) {
          console.warn('DEPRECATION WARNING: ' + ext + ' is an old extension that uses a deprecated loading method.' +
            'Please inform the developer that the extension should be updated!');
          legacyExtensionLoading(showdown.extensions[ext], ext);
          return;
        // END LEGACY SUPPORT CODE
  
        } else if (!showdown.helper.isUndefined(extensions[ext])) {
          ext = extensions[ext];
  
        } else {
          throw Error('Extension "' + ext + '" could not be loaded. It was either not found or is not a valid extension.');
        }
      }
  
      if (typeof ext === 'function') {
        ext = ext();
      }
  
      if (!showdown.helper.isArray(ext)) {
        ext = [ext];
      }
  
      var validExt = validate(ext, name);
      if (!validExt.valid) {
        throw Error(validExt.error);
      }
  
      for (var i = 0; i < ext.length; ++i) {
        switch (ext[i].type) {
  
          case 'lang':
            langExtensions.push(ext[i]);
            break;
  
          case 'output':
            outputModifiers.push(ext[i]);
            break;
        }
        if (ext[i].hasOwnProperty('listeners')) {
          for (var ln in ext[i].listeners) {
            if (ext[i].listeners.hasOwnProperty(ln)) {
              listen(ln, ext[i].listeners[ln]);
            }
          }
        }
      }
  
    }
docs: Parse extension
  @param {*} ext
  @param {string} [name='']
  @private