1 | var fs = require('vinyl-fs');
|
2 | var path =require('path');
|
3 | var through = require('through-gulp');
|
4 | var gutil = require('gulp-util');
|
5 |
|
6 | var startReg = /<!--\s+build:\w+\s+\/?[^\s]+\s+-->/gim;
|
7 | var startMirrorReg = /<!--\s+build:\w+\s+\/?[^\s]+\s+-->/i;
|
8 | var endReg = /<!--\s*endbuild\s*-->/gim;
|
9 | var splitReg = /<!--\s+split\s+-->/gim;
|
10 | var jsReg = /<\s*script\s+.*?src\s*=\s*("|')([^"']+?)\1.*?><\s*\/\s*script\s*>/i;
|
11 | var cssReg = /<\s*link\s+.*?href\s*=\s*("|')([^"']+)\1.*?>/i;
|
12 | var spaceReg = /^\s*$/;
|
13 | var typeReg = /<!--\s+build:(\w+)\s+\/?[^\s]+\s+-->/i;
|
14 | var pathReg = /<!--\s+build:\w+\s+(\/?[^\s]+)\s+-->/i;
|
15 | var utils = {};
|
16 |
|
17 | utils.getSplitBlock = function(string) {
|
18 | return string.split(splitReg);
|
19 | };
|
20 |
|
21 | utils.getBlockType = function(block) {
|
22 | return typeReg.exec(block)[1];
|
23 | };
|
24 |
|
25 | utils.getBlockPath = function(block) {
|
26 | return pathReg.exec(block)[1];
|
27 | };
|
28 |
|
29 | utils.getFilePath = function(block) {
|
30 | return block
|
31 | .replace(startReg, '')
|
32 | .replace(endReg, '')
|
33 | .split('\n')
|
34 | .filter(function(value) {
|
35 | return !spaceReg.test(value);
|
36 | })
|
37 | .map(function(value) {
|
38 | if (utils.getBlockType(block) === 'js') return jsReg.exec(value.replace(/^\s*/, ''))[2];
|
39 | if (utils.getBlockType(block) === 'css') return cssReg.exec(value.replace(/^\s*/, ''))[2];
|
40 | });
|
41 | };
|
42 |
|
43 | utils.getFileSource = function(blocks) {
|
44 | return blocks
|
45 | .filter(function(block) {
|
46 | return startMirrorReg.test(block);
|
47 | })
|
48 | .map(function(block) {
|
49 | return {
|
50 | type: utils.getBlockType(block),
|
51 | destiny: utils.getBlockPath(block),
|
52 | files: utils.getFilePath(block)
|
53 | }
|
54 | });
|
55 | };
|
56 |
|
57 | utils.resolveFileSource = function(sources, options) {
|
58 | if (!sources || !options) return false;
|
59 |
|
60 | for (var i = 0; i < sources.length; i++) {
|
61 | var files = sources[i].files;
|
62 | var destiny = path.join('./', path.dirname(sources[i].destiny));
|
63 | var fileName = path.basename(sources[i].destiny);
|
64 | var parser = options[sources[i].type];
|
65 |
|
66 | if (files.length === 0 || !destiny || !fileName) return false;
|
67 | if (parser && parser.length !== 0) {
|
68 | utils.pathTraverse(files, parser, options.debug).pipe(utils.concat(fileName)).pipe(fs.dest(destiny));
|
69 | }
|
70 | }
|
71 | };
|
72 |
|
73 | utils.pathTraverse = function(originPath, flow, debug) {
|
74 | var targetPath = originPath.map(function(value) {
|
75 | if (!debug) return path.join('./', value);
|
76 | return path.join('./', '/test/fixture', value);
|
77 | });
|
78 | var stream = fs.src(targetPath);
|
79 | for (var i = 0; i < flow.length; i++) {
|
80 | stream = stream.pipe(flow[i].generator.call(null, flow[i].config));
|
81 | }
|
82 | return stream;
|
83 | };
|
84 |
|
85 | utils.resolveSourceToDestiny = function(blocks) {
|
86 | var result = blocks.map(function(block) {
|
87 | if (!startMirrorReg.test(block)) return block;
|
88 | if (utils.getBlockType(block) === 'js') return '<script src="' + utils.getBlockPath(block) + '"></script>';
|
89 | if (utils.getBlockType(block) === 'css') return '<link rel="stylesheet" href="' + utils.getBlockPath(block) + '"/>';
|
90 | if (utils.getBlockType(block) === 'remove') return null;
|
91 | });
|
92 |
|
93 | return result.join('\n');
|
94 | };
|
95 |
|
96 | utils.concat = function(fileName) {
|
97 | var assetStorage = new Buffer(0);
|
98 | var separator = new Buffer('\n');
|
99 | return through(function(file, enc, callback) {
|
100 | assetStorage = Buffer.concat([assetStorage, file.contents, separator]);
|
101 | callback();
|
102 | }, function(callback) {
|
103 | this.push(new gutil.File({
|
104 | path: fileName,
|
105 | contents: assetStorage
|
106 | }));
|
107 | callback();
|
108 | })
|
109 | };
|
110 |
|
111 | utils._escape = function(string) {
|
112 | return string.replace(/[\n\s]*/gi, '');
|
113 | };
|
114 |
|
115 | module.exports = utils; |
\ | No newline at end of file |