{"version":3,"sources":["../src/match/url-match.ts"],"names":[],"mappings":"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","file":"url-match.js","sourcesContent":["import { Match, MatchConfig } from \"./match\";\nimport { StripPrefixConfigObj, UrlMatchTypeOptions } from \"../autolinker\";\n\n/**\n * @class Autolinker.match.Url\n * @extends Autolinker.match.Match\n *\n * Represents a Url match found in an input string which should be Autolinked.\n *\n * See this class's superclass ({@link Autolinker.match.Match}) for more details.\n */\nexport class UrlMatch extends Match {\n\n\t/**\n\t * @cfg {String} url (required)\n\t *\n\t * The url that was matched.\n\t */\n\tprivate url: string = ''; // default value just to get the above doc comment in the ES5 output and documentation generator\n\n\t/**\n\t * @cfg {\"scheme\"/\"www\"/\"tld\"} urlMatchType (required)\n\t *\n\t * The type of URL match that this class represents. This helps to determine\n\t * if the match was made in the original text with a prefixed scheme (ex:\n\t * 'http://www.google.com'), a prefixed 'www' (ex: 'www.google.com'), or\n\t * was matched by a known top-level domain (ex: 'google.com').\n\t */\n\tprivate readonly urlMatchType: UrlMatchTypeOptions = 'scheme'; // default value just to get the above doc comment in the ES5 output and documentation generator\n\n\t/**\n\t * @cfg {Boolean} protocolUrlMatch (required)\n\t *\n\t * `true` if the URL is a match which already has a protocol (i.e.\n\t * 'http://'), `false` if the match was from a 'www' or known TLD match.\n\t */\n\tprivate readonly protocolUrlMatch: boolean = false; // default value just to get the above doc comment in the ES5 output and documentation generator\n\n\t/**\n\t * @cfg {Boolean} protocolRelativeMatch (required)\n\t *\n\t * `true` if the URL is a protocol-relative match. A protocol-relative match\n\t * is a URL that starts with '//', and will be either http:// or https://\n\t * based on the protocol that the site is loaded under.\n\t */\n\tprivate readonly protocolRelativeMatch: boolean = false; // default value just to get the above doc comment in the ES5 output and documentation generator\n\n\t/**\n\t * @cfg {Object} stripPrefix (required)\n\t *\n\t * The Object form of {@link Autolinker#cfg-stripPrefix}.\n\t */\n\tprivate readonly stripPrefix: Required = { scheme: true, www: true }; // default value just to get the above doc comment in the ES5 output and documentation generator\n\n\t/**\n\t * @cfg {Boolean} stripTrailingSlash (required)\n\t * @inheritdoc Autolinker#cfg-stripTrailingSlash\n\t */\n\tprivate readonly stripTrailingSlash: boolean = true; // default value just to get the above doc comment in the ES5 output and documentation generator\n\n\t/**\n\t * @cfg {Boolean} decodePercentEncoding (required)\n\t * @inheritdoc Autolinker#cfg-decodePercentEncoding\n\t */\n\tprivate readonly decodePercentEncoding: boolean = true; // default value just to get the above doc comment in the ES5 output and documentation generator\n\n\t/**\n\t * @private\n\t * @property {RegExp} schemePrefixRegex\n\t *\n\t * A regular expression used to remove the 'http://' or 'https://' from\n\t * URLs.\n\t */\n\tschemePrefixRegex = /^(https?:\\/\\/)?/i;\n\n\t/**\n\t * @private\n\t * @property {RegExp} wwwPrefixRegex\n\t *\n\t * A regular expression used to remove the 'www.' from URLs.\n\t */\n\twwwPrefixRegex = /^(https?:\\/\\/)?(www\\.)?/i;\n\n\t/**\n\t * @private\n\t * @property {RegExp} protocolRelativeRegex\n\t *\n\t * The regular expression used to remove the protocol-relative '//' from the {@link #url} string, for purposes\n\t * of {@link #getAnchorText}. A protocol-relative URL is, for example, \"//yahoo.com\"\n\t */\n\tprotocolRelativeRegex = /^\\/\\//;\n\n\t/**\n\t * @private\n\t * @property {Boolean} protocolPrepended\n\t *\n\t * Will be set to `true` if the 'http://' protocol has been prepended to the {@link #url} (because the\n\t * {@link #url} did not have a protocol)\n\t */\n\tprotocolPrepended = false;\n\n\n\t/**\n\t * @method constructor\n\t * @param {Object} cfg The configuration properties for the Match\n\t * instance, specified in an Object (map).\n\t */\n\tconstructor( cfg: UrlMatchConfig ) {\n\t\tsuper( cfg );\n\n\t\tthis.urlMatchType = cfg.urlMatchType;\n\t\tthis.url = cfg.url;\n\t\tthis.protocolUrlMatch = cfg.protocolUrlMatch;\n\t\tthis.protocolRelativeMatch = cfg.protocolRelativeMatch;\n\t\tthis.stripPrefix = cfg.stripPrefix;\n\t\tthis.stripTrailingSlash = cfg.stripTrailingSlash;\n\t\tthis.decodePercentEncoding = cfg.decodePercentEncoding;\n\t}\n\n\n\t/**\n\t * Returns a string name for the type of match that this class represents.\n\t * For the case of UrlMatch, returns 'url'.\n\t *\n\t * @return {String}\n\t */\n\tgetType() {\n\t\treturn 'url';\n\t}\n\n\n\t/**\n\t * Returns a string name for the type of URL match that this class\n\t * represents.\n\t *\n\t * This helps to determine if the match was made in the original text with a\n\t * prefixed scheme (ex: 'http://www.google.com'), a prefixed 'www' (ex:\n\t * 'www.google.com'), or was matched by a known top-level domain (ex:\n\t * 'google.com').\n\t *\n\t * @return {\"scheme\"/\"www\"/\"tld\"}\n\t */\n\tgetUrlMatchType() {\n\t\treturn this.urlMatchType;\n\t}\n\n\n\t/**\n\t * Returns the url that was matched, assuming the protocol to be 'http://' if the original\n\t * match was missing a protocol.\n\t *\n\t * @return {String}\n\t */\n\tgetUrl() {\n\t\tlet url = this.url;\n\n\t\t// if the url string doesn't begin with a protocol, assume 'http://'\n\t\tif( !this.protocolRelativeMatch && !this.protocolUrlMatch && !this.protocolPrepended ) {\n\t\t\turl = this.url = 'http://' + url;\n\n\t\t\tthis.protocolPrepended = true;\n\t\t}\n\n\t\treturn url;\n\t}\n\n\n\t/**\n\t * Returns the anchor href that should be generated for the match.\n\t *\n\t * @return {String}\n\t */\n\tgetAnchorHref() {\n\t\tlet url = this.getUrl();\n\n\t\treturn url.replace( /&/g, '&' ); // any &'s in the URL should be converted back to '&' if they were displayed as & in the source html\n\t}\n\n\n\t/**\n\t * Returns the anchor text that should be generated for the match.\n\t *\n\t * @return {String}\n\t */\n\tgetAnchorText() {\n\t\tlet anchorText = this.getMatchedText();\n\n\t\tif( this.protocolRelativeMatch ) {\n\t\t\t// Strip off any protocol-relative '//' from the anchor text\n\t\t\tanchorText = this.stripProtocolRelativePrefix( anchorText );\n\t\t}\n\t\tif( this.stripPrefix.scheme ) {\n\t\t\tanchorText = this.stripSchemePrefix( anchorText );\n\t\t}\n\t\tif( this.stripPrefix.www ) {\n\t\t\tanchorText = this.stripWwwPrefix( anchorText );\n\t\t}\n\t\tif( this.stripTrailingSlash ) {\n\t\t\tanchorText = this.removeTrailingSlash( anchorText ); // remove trailing slash, if there is one\n\t\t}\n\t\tif( this.decodePercentEncoding ) {\n\t\t\tanchorText = this.removePercentEncoding( anchorText );\n\t\t}\n\n\t\treturn anchorText;\n\t}\n\n\n\t// ---------------------------------------\n\n\t// Utility Functionality\n\n\t/**\n\t * Strips the scheme prefix (such as \"http://\" or \"https://\") from the given\n\t * `url`.\n\t *\n\t * @private\n\t * @param {String} url The text of the anchor that is being generated, for\n\t * which to strip off the url scheme.\n\t * @return {String} The `url`, with the scheme stripped.\n\t */\n\tprivate stripSchemePrefix( url: string ) {\n\t\treturn url.replace( this.schemePrefixRegex, '' );\n\t}\n\n\n\t/**\n\t * Strips the 'www' prefix from the given `url`.\n\t *\n\t * @private\n\t * @param {String} url The text of the anchor that is being generated, for\n\t * which to strip off the 'www' if it exists.\n\t * @return {String} The `url`, with the 'www' stripped.\n\t */\n\tprivate stripWwwPrefix( url: string ) {\n\t\treturn url.replace( this.wwwPrefixRegex, '$1' ); // leave any scheme ($1), it one exists\n\t}\n\n\n\t/**\n\t * Strips any protocol-relative '//' from the anchor text.\n\t *\n\t * @private\n\t * @param {String} text The text of the anchor that is being generated, for which to strip off the\n\t * protocol-relative prefix (such as stripping off \"//\")\n\t * @return {String} The `anchorText`, with the protocol-relative prefix stripped.\n\t */\n\tprivate stripProtocolRelativePrefix( text: string ) {\n\t\treturn text.replace( this.protocolRelativeRegex, '' );\n\t}\n\n\n\t/**\n\t * Removes any trailing slash from the given `anchorText`, in preparation for the text to be displayed.\n\t *\n\t * @private\n\t * @param {String} anchorText The text of the anchor that is being generated, for which to remove any trailing\n\t * slash ('/') that may exist.\n\t * @return {String} The `anchorText`, with the trailing slash removed.\n\t */\n\tprivate removeTrailingSlash( anchorText: string ) {\n\t\tif( anchorText.charAt( anchorText.length - 1 ) === '/' ) {\n\t\t\tanchorText = anchorText.slice( 0, -1 );\n\t\t}\n\t\treturn anchorText;\n\t}\n\n\t/**\n\t * Decodes percent-encoded characters from the given `anchorText`, in \n\t * preparation for the text to be displayed.\n\t *\n\t * @private\n\t * @param {String} anchorText The text of the anchor that is being \n\t * generated, for which to decode any percent-encoded characters.\n\t * @return {String} The `anchorText`, with the percent-encoded characters \n\t * decoded.\n\t */\n\tprivate removePercentEncoding( anchorText: string ) {\n\t\t// First, convert a few of the known % encodings to the corresponding\n\t\t// HTML entities that could accidentally be interpretted as special\n\t\t// HTML characters\n\t\tconst preProcessedEntityAnchorText = anchorText\n\t\t\t.replace( /%22/gi, '"' ) // \" char\n\t\t\t.replace( /%26/gi, '&' ) // & char\n\t\t\t.replace( /%27/gi, ''') // ' char\n\t\t\t.replace( /%3C/gi, '<' ) // < char\n\t\t\t.replace( /%3E/gi, '>' ); // > char\n\n\t\ttry {\n\t\t\t// Now attempt to decode the rest of the anchor text\n\t\t\treturn decodeURIComponent( preProcessedEntityAnchorText );\n\t\t} catch( e ) { // Invalid % escape sequence in the anchor text\n\t\t\treturn preProcessedEntityAnchorText;\n\t\t}\n\t}\n\n}\n\n\nexport interface UrlMatchConfig extends MatchConfig {\n\turl: string;\n\turlMatchType: UrlMatchTypeOptions;\n\tprotocolUrlMatch: boolean;\n\tprotocolRelativeMatch: boolean;\n\tstripPrefix: Required;\n\tstripTrailingSlash: boolean;\n\tdecodePercentEncoding: boolean;\n}\n"]}