2
2
// lazy require symbols table
3
3
var _symbols , removelist ;
4
4
function symbols ( code ) {
5
- if ( _symbols ) return _symbols [ code ] ;
5
+ if ( _symbols ) {
6
+ return _symbols [ code ] ;
7
+ }
6
8
_symbols = require ( 'unicode/category/So' ) ;
7
9
removelist = [ 'sign' , 'cross' , 'of' , 'symbol' , 'staff' , 'hand' , 'black' , 'white' ]
8
- . map ( function ( word ) { return new RegExp ( word , 'gi' ) } ) ;
10
+ . map ( function ( word ) { return new RegExp ( word , 'gi' ) ; } ) ;
9
11
return _symbols [ code ] ;
10
12
}
11
13
14
+ function multicharat ( index , string , multicharmap ) {
15
+ for ( var property in multicharmap ) {
16
+ if ( ! multicharmap . hasOwnProperty ( property ) ) {
17
+ continue ;
18
+ }
19
+ if ( string . indexOf ( property ) === index ) {
20
+ return property ;
21
+ }
22
+ }
23
+ }
24
+
12
25
function slug ( string , opts ) {
13
26
string = string . toString ( ) ;
14
- if ( 'string' === typeof opts )
27
+ if ( 'string' === typeof opts ) {
15
28
opts = { replacement :opts } ;
29
+ }
16
30
opts = opts || { } ;
17
31
opts . mode = opts . mode || slug . defaults . mode ;
18
32
var defaults = slug . defaults . modes [ opts . mode ] ;
19
33
var keys = [ 'replacement' , 'multicharmap' , 'charmap' , 'remove' , 'lower' ] ;
20
- for ( var key , i = 0 , l = keys . length ; i < l ; i ++ ) { key = keys [ i ] ;
34
+ keys . forEach ( function ( key ) {
21
35
opts [ key ] = ( key in opts ) ? opts [ key ] : defaults [ key ] ;
22
- }
23
- if ( 'undefined' === typeof opts . symbols )
36
+ } ) ;
37
+ if ( 'undefined' === typeof opts . symbols ) {
24
38
opts . symbols = defaults . symbols ;
25
-
26
- var lengths = [ ] ;
27
- for ( var key in opts . multicharmap ) {
28
- if ( ! opts . multicharmap . hasOwnProperty ( key ) )
29
- continue ;
30
-
31
- var len = key . length ;
32
- if ( lengths . indexOf ( len ) === - 1 )
33
- lengths . push ( len ) ;
34
39
}
35
40
36
- var code , unicode , result = "" ;
37
- for ( var char , i = 0 , l = string . length ; i < l ; i ++ ) { char = string [ i ] ;
38
- if ( ! lengths . some ( function ( len ) {
39
- var str = string . substr ( i , len ) ;
40
- if ( opts . multicharmap [ str ] ) {
41
- i += len - 1 ;
42
- char = opts . multicharmap [ str ] ;
43
- return true ;
44
- } else return false ;
45
- } ) ) {
41
+ var code , unicode , result = '' ;
42
+ for ( var char , i = 0 , l = string . length ; i < l ; i ++ ) {
43
+ char = string [ i ] ;
44
+ var multichar = multicharat ( 0 , string . substring ( i ) , opts . multicharmap ) ;
45
+
46
+ if ( multichar ) {
47
+ i += multichar . length - 1 ;
48
+ char = opts . multicharmap [ multichar ] ;
49
+ } else {
46
50
if ( opts . charmap [ char ] ) {
47
51
char = opts . charmap [ char ] ;
48
52
code = char . charCodeAt ( 0 ) ;
@@ -58,16 +62,16 @@ function slug(string, opts) {
58
62
}
59
63
}
60
64
char = char . replace ( / [ ^ \w \s \- \. \_ ~ ] / g, '' ) ; // allowed
61
- if ( opts . remove ) char = char . replace ( opts . remove , '' ) ; // add flavour
65
+ if ( opts . remove ) {
66
+ char = char . replace ( opts . remove , '' ) ; // add flavour
67
+ }
62
68
result += char ;
63
69
}
64
70
result = result . replace ( / ^ \s + | \s + $ / g, '' ) ; // trim leading/trailing spaces
65
71
result = result . replace ( / [ - \s ] + / g, opts . replacement ) ; // convert spaces
66
72
result = result . replace ( opts . replacement + "$" , '' ) ; // remove trailing separator
67
- if ( opts . lower )
68
- result = result . toLowerCase ( ) ;
69
- return result ;
70
- } ;
73
+ return opts . lower ? result . toLowerCase ( ) : result ;
74
+ }
71
75
72
76
slug . defaults = {
73
77
mode : 'pretty' ,
@@ -186,27 +190,28 @@ slug.defaults.modes = {
186
190
187
191
// Be compatible with different module systems
188
192
189
- if ( typeof define !== 'undefined' && define . amd ) { // AMD
190
- // dont load symbols table in the browser
191
- for ( var key in slug . defaults . modes ) {
192
- if ( ! slug . defaults . modes . hasOwnProperty ( key ) )
193
- continue ;
194
-
195
- slug . defaults . modes [ key ] . symbols = false ;
196
- }
197
- define ( [ ] , function ( ) { return slug } ) ;
198
- } else if ( typeof module !== 'undefined' && module . exports ) { // CommonJS
193
+ // CommonJS
194
+ if ( typeof module !== 'undefined' && module . exports ) {
199
195
symbols ( ) ; // preload symbols table
200
196
module . exports = slug ;
201
- } else { // Script tag
202
- // dont load symbols table in the browser
203
- for ( var key in slug . defaults . modes ) {
204
- if ( ! slug . defaults . modes . hasOwnProperty ( key ) )
205
- continue ;
197
+ return ;
198
+ }
206
199
207
- slug . defaults . modes [ key ] . symbols = false ;
200
+ // dont load symbols table in the browser
201
+ for ( var key in slug . defaults . modes ) {
202
+ if ( ! slug . defaults . modes . hasOwnProperty ( key ) ) {
203
+ continue ;
208
204
}
209
- root . slug = slug ;
205
+ slug . defaults . modes [ key ] . symbols = false ;
210
206
}
211
207
208
+ // AMD
209
+ if ( typeof define !== 'undefined' && define . amd ) {
210
+ define ( [ ] , function ( ) { return slug ; } ) ;
211
+ return ;
212
+ }
213
+
214
+ // Script tag
215
+ root . slug = slug ;
216
+
212
217
} ( this ) ) ;
0 commit comments