22const clone = require ( 'gulp-clone' ) ,
33 concat = require ( 'gulp-concat' ) ,
44 connect = require ( 'gulp-connect' ) ,
5+ download = require ( 'gulp-download' ) ,
56 gulp = require ( 'gulp' ) ,
67 header = require ( 'gulp-header' ) ,
78 jasmine = require ( 'gulp-jasmine' ) ,
89 jshint = require ( 'gulp-jshint' ) ,
910 merge = require ( 'merge-stream' ) ,
1011 preprocess = require ( 'gulp-preprocess' ) ,
12+ punycode = require ( 'punycode' ) ,
1113 rename = require ( 'gulp-rename' ) ,
1214 through2 = require ( 'through2' ) ,
15+ transform = require ( 'gulp-transform' ) ,
1316 typescript = require ( 'gulp-typescript' ) ,
1417 uglify = require ( 'gulp-uglify' ) ,
1518 umd = require ( 'gulp-umd' ) ,
1619 JsDuck = require ( 'gulp-jsduck' ) ,
1720 KarmaServer = require ( 'karma' ) . Server ;
1821
1922
23+
2024// Project configuration
2125const pkg = require ( './package.json' ) ,
2226 banner = createBanner ( ) ,
@@ -36,6 +40,7 @@ gulp.task( 'test', [ 'build' ], testTask );
3640gulp . task ( 'doc' , [ 'build' , 'typescript' ] , docTask ) ;
3741gulp . task ( 'serve' , [ 'typescript' , 'doc' ] , serveTask ) ;
3842gulp . task ( 'typescript' , typescriptTask ) ; // for examples
43+ gulp . task ( 'update-tld-list' , updateTldRegex ) ;
3944
4045
4146function buildTask ( ) {
@@ -172,6 +177,7 @@ function createSrcFilesList() {
172177 'src/match/Phone.js' ,
173178 'src/match/Mention.js' ,
174179 'src/match/Url.js' ,
180+ 'src/matcher/TldRegex.js' ,
175181 'src/matcher/Matcher.js' ,
176182 'src/matcher/Email.js' ,
177183 'src/matcher/Hashtag.js' ,
@@ -184,3 +190,49 @@ function createSrcFilesList() {
184190 'src/truncate/TruncateSmart.js'
185191 ] ;
186192}
193+
194+ function dePunycodeDomain ( d ) {
195+ d = d . toLowerCase ( ) ;
196+ if ( / x n - - / . test ( d ) ) {
197+ return [ d , punycode . toUnicode ( d ) ] ;
198+ }
199+ return [ d ] ;
200+ }
201+
202+ function notCommentLine ( line ) {
203+ return ! / ^ # / . test ( line ) ;
204+ }
205+
206+ function compareLengthLongestFirst ( a , b ) {
207+ var result = b . length - a . length
208+ if ( result == 0 ) {
209+ result = a . localeCompare ( b )
210+ }
211+ return result ;
212+ }
213+
214+ function domainsToRegex ( contents ) {
215+ contents = contents
216+ . split ( '\n' )
217+ . filter ( notCommentLine )
218+ . map ( dePunycodeDomain ) ;
219+ contents = [ ] . concat . apply ( [ ] , contents ) ;
220+ contents = contents . filter ( function ( s ) { return ! ! s } ) ;
221+ contents . sort ( compareLengthLongestFirst ) ;
222+ contents = contents . join ( '|' ) ;
223+ contents = '/*global Autolinker */\nAutolinker.tldRegex = /(?:' + contents + ')/;\n' ;
224+
225+ return contents ;
226+ }
227+
228+ function updateTldRegex ( ) {
229+ return download ( 'http://data.iana.org/TLD/tlds-alpha-by-domain.txt' )
230+ . pipe ( transform ( domainsToRegex , { encoding : 'utf8' } ) )
231+ . pipe ( header ( '// NOTE: THIS IS A GENERATED FILE\n// To update with the latest TLD list, run `gulp update-tld-list`\n\n' ) )
232+ . pipe ( rename ( function ( path ) {
233+ path . basename = "TldRegex" ;
234+ path . extname = '.js' ;
235+ } ) )
236+ . pipe ( gulp . dest ( './src/matcher/' ) ) ;
237+ }
238+
0 commit comments