1
1
/* jshint node: true */
2
2
var markdown = require ( 'node-markdown' ) . Markdown ;
3
+ var fs = require ( 'fs' ) ;
3
4
4
5
module . exports = function ( grunt ) {
5
6
@@ -29,6 +30,9 @@ module.exports = function(grunt) {
29
30
modules : 'angular.module("ui.bootstrap", [<%= srcModules %>]);' ,
30
31
tplmodules : 'angular.module("ui.bootstrap.tpls", [<%= tplModules %>]);' ,
31
32
all : 'angular.module("ui.bootstrap", ["ui.bootstrap.tpls", <%= srcModules %>]);' ,
33
+ cssInclude : '' ,
34
+ cssFileBanner : '/* Include this file in your html if you are using the CSP mode. */\n\n' ,
35
+ cssFileDest : '<%= dist %>/<%= filename %>-<%= pkg.version %>-csp.css' ,
32
36
banner : [ '/*' ,
33
37
' * <%= pkg.name %>' ,
34
38
' * <%= pkg.homepage %>\n' ,
@@ -54,14 +58,16 @@ module.exports = function(grunt) {
54
58
concat : {
55
59
dist : {
56
60
options : {
57
- banner : '<%= meta.banner %><%= meta.modules %>\n'
61
+ banner : '<%= meta.banner %><%= meta.modules %>\n' ,
62
+ footer : '<%= meta.cssInclude %>'
58
63
} ,
59
64
src : [ ] , //src filled in by build task
60
65
dest : '<%= dist %>/<%= filename %>-<%= pkg.version %>.js'
61
66
} ,
62
67
dist_tpls : {
63
68
options : {
64
- banner : '<%= meta.banner %><%= meta.all %>\n<%= meta.tplmodules %>\n'
69
+ banner : '<%= meta.banner %><%= meta.all %>\n<%= meta.tplmodules %>\n' ,
70
+ footer : '<%= meta.cssInclude %>'
65
71
} ,
66
72
src : [ ] , //src filled in by build task
67
73
dest : '<%= dist %>/<%= filename %>-tpls-<%= pkg.version %>.js'
@@ -245,6 +251,7 @@ module.exports = function(grunt) {
245
251
moduleName : enquote ( 'ui.bootstrap.' + name ) ,
246
252
displayName : ucwords ( breakup ( name , ' ' ) ) ,
247
253
srcFiles : grunt . file . expand ( 'src/' + name + '/*.js' ) ,
254
+ cssFiles : grunt . file . expand ( 'src/' + name + '/*.css' ) ,
248
255
tplFiles : grunt . file . expand ( 'template/' + name + '/*.html' ) ,
249
256
tpljsFiles : grunt . file . expand ( 'template/' + name + '/*.html.js' ) ,
250
257
tplModules : grunt . file . expand ( 'template/' + name + '/*.html' ) . map ( enquote ) ,
@@ -258,6 +265,17 @@ module.exports = function(grunt) {
258
265
. map ( grunt . file . read ) . join ( '\n' )
259
266
}
260
267
} ;
268
+
269
+ var styles = {
270
+ css : [ ] ,
271
+ js : [ ]
272
+ } ;
273
+ module . cssFiles . forEach ( processCSS . bind ( null , styles , true ) ) ;
274
+ if ( styles . css . length ) {
275
+ module . css = styles . css . join ( '\n' ) ;
276
+ module . cssJs = styles . js . join ( '\n' ) ;
277
+ }
278
+
261
279
module . dependencies . forEach ( findModule ) ;
262
280
grunt . config ( 'modules' , grunt . config ( 'modules' ) . concat ( module ) ) ;
263
281
}
@@ -321,6 +339,17 @@ module.exports = function(grunt) {
321
339
} )
322
340
) ;
323
341
342
+ var cssStrings = _ . flatten ( _ . compact ( _ . pluck ( modules , 'css' ) ) ) ;
343
+ var cssJsStrings = _ . flatten ( _ . compact ( _ . pluck ( modules , 'cssJs' ) ) ) ;
344
+ if ( cssStrings . length ) {
345
+ grunt . config ( 'meta.cssInclude' , cssJsStrings . join ( '\n' ) ) ;
346
+
347
+ grunt . file . write ( grunt . config ( 'meta.cssFileDest' ) , grunt . config ( 'meta.cssFileBanner' ) +
348
+ cssStrings . join ( '\n' ) ) ;
349
+
350
+ grunt . log . writeln ( 'File ' + grunt . config ( 'meta.cssFileDest' ) + ' created' ) ;
351
+ }
352
+
324
353
var moduleFileMapping = _ . clone ( modules , true ) ;
325
354
moduleFileMapping . forEach ( function ( module ) {
326
355
delete module . docs ;
@@ -373,9 +402,40 @@ module.exports = function(grunt) {
373
402
var genRawFilesJs = require ( './misc/raw-files-generator' ) ;
374
403
375
404
genRawFilesJs ( grunt , jsFilename , _ . flatten ( grunt . config ( 'concat.dist_tpls.src' ) ) ,
376
- grunt . config ( 'meta.banner' ) ) ;
405
+ grunt . config ( 'meta.banner' ) , grunt . config ( 'meta.cssFileBanner' ) ) ;
377
406
} ) ;
378
407
408
+ /**
409
+ * Logic from AngularJS
410
+ * https://github.com/angular/angular.js/blob/36831eccd1da37c089f2141a2c073a6db69f3e1d/lib/grunt/utils.js#L121-L145
411
+ */
412
+ function processCSS ( state , minify , file ) {
413
+ /* jshint quotmark: false */
414
+ var css = fs . readFileSync ( file ) . toString ( ) ,
415
+ js ;
416
+ state . css . push ( css ) ;
417
+
418
+ if ( minify ) {
419
+ css = css
420
+ . replace ( / \r ? \n / g, '' )
421
+ . replace ( / \/ \* .* ?\* \/ / g, '' )
422
+ . replace ( / : \s + / g, ':' )
423
+ . replace ( / \s * \{ \s * / g, '{' )
424
+ . replace ( / \s * \} \s * / g, '}' )
425
+ . replace ( / \s * \, \s * / g, ',' )
426
+ . replace ( / \s * \; \s * / g, ';' ) ;
427
+ }
428
+ //escape for js
429
+ css = css
430
+ . replace ( / \\ / g, '\\\\' )
431
+ . replace ( / ' / g, "\\'" )
432
+ . replace ( / \r ? \n / g, '\\n' ) ;
433
+ js = "!angular.$$csp() && angular.element(document).find('head').prepend('<style type=\"text/css\">" + css + "</style>');" ;
434
+ state . js . push ( js ) ;
435
+
436
+ return state ;
437
+ }
438
+
379
439
function setVersion ( type , suffix ) {
380
440
var file = 'package.json' ;
381
441
var VERSION_REGEX = / ( [ \' | \" ] v e r s i o n [ \' | \" ] [ ] * : [ ] * [ \' | \" ] ) ( [ \d | . ] * ) ( - \w + ) * ( [ \' | \" ] ) / ;
0 commit comments