From 018481a119efadad6d24e50c053f88398004a60a Mon Sep 17 00:00:00 2001 From: Dave Borowitz Date: Mon, 26 Mar 2018 11:03:02 -0400 Subject: [PATCH] ba-linkify.js: Update to latest commit from GitHub The author decided to remove the license notice and add some trailing whitespace, hooray. Change-Id: Ibd72fe3364f5daed1d178ace0b52b6ab18f6da90 --- lib/ba-linkify/ba-linkify.js | 189 ++++++++++++++++++++--------------- 1 file changed, 106 insertions(+), 83 deletions(-) diff --git a/lib/ba-linkify/ba-linkify.js b/lib/ba-linkify/ba-linkify.js index 26dacd6a1d..81dae5f74b 100644 --- a/lib/ba-linkify/ba-linkify.js +++ b/lib/ba-linkify/ba-linkify.js @@ -1,151 +1,174 @@ /*! * JavaScript Linkify - v0.3 - 6/27/2009 * http://benalman.com/projects/javascript-linkify/ - * + * * Copyright (c) 2009 "Cowboy" Ben Alman * Dual licensed under the MIT and GPL licenses. * http://benalman.com/about/license/ - * + * * Some regexps adapted from http://userscripts.org/scripts/review/7122 */ // Script: JavaScript Linkify: Process links in text! // // *Version: 0.3, Last updated: 6/27/2009* -// +// // Project Home - http://benalman.com/projects/javascript-linkify/ // GitHub - http://github.com/cowboy/javascript-linkify/ // Source - http://github.com/cowboy/javascript-linkify/raw/master/ba-linkify.js // (Minified) - http://github.com/cowboy/javascript-linkify/raw/master/ba-linkify.min.js (2.8kb) -// +// // About: License -// +// // Copyright (c) 2009 "Cowboy" Ben Alman, // Dual licensed under the MIT and GPL licenses. // http://benalman.com/about/license/ -// -// Permission is hereby granted, free of charge, to any person -// obtaining a copy of this software and associated documentation -// files (the "Software"), to deal in the Software without -// restriction, including without limitation the rights to use, -// copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following -// conditions: +// +// About: Examples +// +// This working example, complete with fully commented code, illustrates one way +// in which this code can be used. +// +// Linkify - http://benalman.com/code/projects/javascript-linkify/examples/linkify/ +// +// About: Support and Testing +// +// Information about what browsers this code has been tested in. +// +// Browsers Tested - Internet Explorer 6-8, Firefox 2-3.7, Safari 3-4, Chrome, Opera 9.6-10. +// +// About: Release History +// +// 0.3 - (6/27/2009) Initial release -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. - -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. +// Function: linkify +// +// Turn text into linkified html. +// +// Usage: +// +// > var html = linkify( text [, options ] ); +// +// Arguments: +// +// text - (String) Non-HTML text containing links to be parsed. +// options - (Object) An optional object containing linkify parse options. +// +// Options: +// +// callback (Function) - If specified, this will be called once for each link- +// or non-link-chunk with two arguments, text and href. If the chunk is +// non-link, href will be omitted. If unspecified, the default linkification +// callback is used. +// punct_regexp (RegExp) - A RegExp that will be used to trim trailing +// punctuation from links, instead of the default. If set to null, trailing +// punctuation will not be trimmed. +// +// Returns: +// +// (String) An HTML string containing links. window.linkify = (function(){ var - SCHEME = "[a-z\\d.-]+://", - IPV4 = "(?:(?:[0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}(?:[0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])", - HOSTNAME = "(?:(?:[^\\s!@#$%^&*()_=+[\\]{}\\\\|;:'\",.<>/?]+)\\.)+", - TLD = "(?:ac|ad|aero|ae|af|ag|ai|al|am|an|ao|aq|arpa|ar|asia|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|biz|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|cat|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|coop|com|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|info|int|in|io|iq|ir|is|it|je|jm|jobs|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mil|mk|ml|mm|mn|mobi|mo|mp|mq|mr|ms|mt|museum|mu|mv|mw|mx|my|mz|name|na|nc|net|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pro|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tel|tf|tg|th|tj|tk|tl|tm|tn|to|tp|travel|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|xn--0zwm56d|xn--11b5bs3a9aj6g|xn--80akhbyknj4f|xn--9t4b11yi5a|xn--deba0ad|xn--g6w251d|xn--hgbk6aj7f53bba|xn--hlcj6aya9esc7a|xn--jxalpdlp|xn--kgbechtv|xn--zckzah|ye|yt|yu|za|zm|zw)", - HOST_OR_IP = "(?:" + HOSTNAME + TLD + "|" + IPV4 + ")", - PATH = "(?:[;/][^#?<>\\s]*)?", - QUERY_FRAG = "(?:\\?[^#<>\\s]*)?(?:#[^<>\\s]*)?", - URI1 = "\\b" + SCHEME + "[^<>\\s]+", - URI2 = "\\b" + HOST_OR_IP + PATH + QUERY_FRAG + "(?!\\w)", - - MAILTO = "mailto:", - EMAIL = "(?:" + MAILTO + ")?[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@" + HOST_OR_IP + QUERY_FRAG + "(?!\\w)", - - URI_RE = new RegExp( "(?:" + URI1 + "|" + URI2 + "|" + EMAIL + ")", "ig" ), - SCHEME_RE = new RegExp( "^" + SCHEME, "i" ), - - quotes = { - "'": "`", - '>': '<', - ')': '(', - ']': '[', - '}': '{', - '»': '«', - '›': '‹' - }, - - default_options = { - callback: function( text, href ) { - return href ? '' + text + '' : text; + SCHEME = "[a-z\\d.-]+://", + IPV4 = "(?:(?:[0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}(?:[0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])", + HOSTNAME = "(?:(?:[^\\s!@#$%^&*()_=+[\\]{}\\\\|;:'\",.<>/?]+)\\.)+", + TLD = "(?:ac|ad|aero|ae|af|ag|ai|al|am|an|ao|aq|arpa|ar|asia|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|biz|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|cat|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|coop|com|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|info|int|in|io|iq|ir|is|it|je|jm|jobs|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mil|mk|ml|mm|mn|mobi|mo|mp|mq|mr|ms|mt|museum|mu|mv|mw|mx|my|mz|name|na|nc|net|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pro|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tel|tf|tg|th|tj|tk|tl|tm|tn|to|tp|travel|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|xn--0zwm56d|xn--11b5bs3a9aj6g|xn--80akhbyknj4f|xn--9t4b11yi5a|xn--deba0ad|xn--g6w251d|xn--hgbk6aj7f53bba|xn--hlcj6aya9esc7a|xn--jxalpdlp|xn--kgbechtv|xn--zckzah|ye|yt|yu|za|zm|zw)", + HOST_OR_IP = "(?:" + HOSTNAME + TLD + "|" + IPV4 + ")", + PATH = "(?:[;/][^#?<>\\s]*)?", + QUERY_FRAG = "(?:\\?[^#<>\\s]*)?(?:#[^<>\\s]*)?", + URI1 = "\\b" + SCHEME + "[^<>\\s]+", + URI2 = "\\b" + HOST_OR_IP + PATH + QUERY_FRAG + "(?!\\w)", + + MAILTO = "mailto:", + EMAIL = "(?:" + MAILTO + ")?[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@" + HOST_OR_IP + QUERY_FRAG + "(?!\\w)", + + URI_RE = new RegExp( "(?:" + URI1 + "|" + URI2 + "|" + EMAIL + ")", "ig" ), + SCHEME_RE = new RegExp( "^" + SCHEME, "i" ), + + quotes = { + "'": "`", + '>': '<', + ')': '(', + ']': '[', + '}': '{', + '»': '«', + '›': '‹' }, - punct_regexp: /(?:[!?.,:;'"]|(?:&|&)(?:lt|gt|quot|apos|raquo|laquo|rsaquo|lsaquo);)$/ - }; - + + default_options = { + callback: function( text, href ) { + return href ? '' + text + '' : text; + }, + punct_regexp: /(?:[!?.,:;'"]|(?:&|&)(?:lt|gt|quot|apos|raquo|laquo|rsaquo|lsaquo);)$/ + }; + return function( txt, options ) { options = options || {}; - + // Temp variables. var arr, - i, - link, - href, - + i, + link, + href, + // Output HTML. html = '', - + // Store text / link parts, in order, for re-combination. parts = [], - + // Used for keeping track of indices in the text. idx_prev, idx_last, idx, link_last, - + // Used for trimming trailing punctuation and quotes from links. matches_begin, matches_end, quote_begin, quote_end; - + // Initialize options. for ( i in default_options ) { if ( options[ i ] === undefined ) { options[ i ] = default_options[ i ]; } } - + // Find links. while ( arr = URI_RE.exec( txt ) ) { - + link = arr[0]; idx_last = URI_RE.lastIndex; idx = idx_last - link.length; - + // Not a link if preceded by certain characters. if ( /[\/:]/.test( txt.charAt( idx - 1 ) ) ) { continue; } - + // Trim trailing punctuation. do { // If no changes are made, we don't want to loop forever! link_last = link; - + quote_end = link.substr( -1 ) quote_begin = quotes[ quote_end ]; - + // Ending quote character? if ( quote_begin ) { matches_begin = link.match( new RegExp( '\\' + quote_begin + '(?!$)', 'g' ) ); matches_end = link.match( new RegExp( '\\' + quote_end, 'g' ) ); - + // If quotes are unbalanced, remove trailing quote character. if ( ( matches_begin ? matches_begin.length : 0 ) < ( matches_end ? matches_end.length : 0 ) ) { link = link.substr( 0, link.length - 1 ); idx_last--; } } - + // Ending non-quote punctuation character? if ( options.punct_regexp ) { link = link.replace( options.punct_regexp, function(a){ @@ -154,38 +177,38 @@ window.linkify = (function(){ }); } } while ( link.length && link !== link_last ); - + href = link; - + // Add appropriate protocol to naked links. if ( !SCHEME_RE.test( href ) ) { href = ( href.indexOf( '@' ) !== -1 ? ( !href.indexOf( MAILTO ) ? '' : MAILTO ) : !href.indexOf( 'irc.' ) ? 'irc://' : !href.indexOf( 'ftp.' ) ? 'ftp://' : 'http://' ) - + href; + + href; } - + // Push preceding non-link text onto the array. if ( idx_prev != idx ) { parts.push([ txt.slice( idx_prev, idx ) ]); idx_prev = idx_last; } - + // Push massaged link onto the array parts.push([ link, href ]); }; - + // Push remaining non-link text onto the array. parts.push([ txt.substr( idx_prev ) ]); - + // Process the array items. for ( i = 0; i < parts.length; i++ ) { html += options.callback.apply( window, parts[i] ); } - + // In case of catastrophic failure, return the original text; return html || txt; }; - + })(); \ No newline at end of file