1 | var debug = require('debug')('clam:assetsTool');
|
2 | var path = require('path');
|
3 | var parser = require('./dependParser').parser;
|
4 | var Map = require('./util/map');
|
5 |
|
6 |
|
7 | var SEP = ':', CSS = 'css', JS = 'js', HEAD = 'head', FOOT = 'foot';
|
8 |
|
9 | var exCss = /\.css/gi;
|
10 | function getType(content) {
|
11 | return content.match(exCss) ? CSS : JS;
|
12 | }
|
13 |
|
14 |
|
15 | var renderer = {};
|
16 | renderer[CSS] = function (url, pos) {
|
17 | var str = '<link type="text/css" rel="stylesheet" href="' + url + '" />';
|
18 |
|
19 | return str;
|
20 | };
|
21 | renderer[JS] = function (url, pos) {
|
22 | var str = '<script src="' + url + '" ></script>';
|
23 |
|
24 | return str;
|
25 | };
|
26 |
|
27 |
|
28 | function AssetsTool() {
|
29 | this.map = new Map();
|
30 | }
|
31 | AssetsTool.prototype.use = function (content) {
|
32 |
|
33 | var cssMod = [], jsMod = [];
|
34 | var content = content || '';
|
35 |
|
36 | content.split(',').forEach(function(m) {
|
37 | var type = getType(m);
|
38 | type == CSS ? cssMod.push(m): jsMod.push(m);
|
39 | });
|
40 |
|
41 | var urls = parser.getComboUrls(cssMod).concat(parser.getComboUrls(jsMod)),
|
42 | type, ret = '';
|
43 |
|
44 | if (typeof urls == 'string') urls = new Array(urls);
|
45 |
|
46 | for (var i = 0, l = urls.length; i < l; i++) {
|
47 | type = getType(urls[i]);
|
48 | ret += renderer[type](urls[i]);
|
49 | }
|
50 | return ret;
|
51 | };
|
52 | AssetsTool.prototype.require = function (content, pos) {
|
53 | var self = this;
|
54 | content.split(',').forEach(function(m) {
|
55 | var type = getType(m);
|
56 |
|
57 | var mods = parser.getMods(m);
|
58 |
|
59 |
|
60 | if (!pos) var pos = (type == CSS) ? HEAD : FOOT;
|
61 |
|
62 | self.map.put(type + SEP + (pos || HEAD), mods);
|
63 | });
|
64 | };
|
65 | AssetsTool.prototype.injectStyle = function () {
|
66 | return this._inject(CSS, HEAD);
|
67 | };
|
68 | AssetsTool.prototype.injectScript = function (pos) {
|
69 | return this._inject(JS, pos);
|
70 | };
|
71 | AssetsTool.prototype._inject = function (type, pos) {
|
72 | var mods = this.map.get(type + SEP + pos),
|
73 | urls = parser.getComboUrls(mods), ret = '';
|
74 | for (var i = 0, l = urls.length; i < l; i++) {
|
75 | ret += renderer[type](urls[i]);
|
76 | }
|
77 | return ret;
|
78 | };
|
79 | function feLoader(data) {
|
80 | var cmd = [];
|
81 | data.forEach(function(i){
|
82 | cmd.push('{express:' + i['express'] + ', id:"'+ i['id'] + '"}');
|
83 | })
|
84 |
|
85 | cmd = 'var data = [' + cmd.join(',') + '], ret = [];'
|
86 | + 'for (var i = 0, str; i < data.length; i++) {'
|
87 | + ' str = data[i]["express"];'
|
88 | + ' if (str) {'
|
89 | + ' ret.push({'
|
90 | + ' express: str,'
|
91 | + ' id: data[i]["id"]'
|
92 | + ' });'
|
93 | + ' }'
|
94 | + '}'
|
95 | + 'return ret;';
|
96 |
|
97 | var fn = new Function('$assetsTool', cmd);
|
98 | return fn(new AssetsTool());
|
99 | }
|
100 | exports.feLoader = feLoader;
|
101 |
|
102 | exports.clearCacheMod = parser.clear;
|