-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathlessc.js
116 lines (95 loc) · 3.74 KB
/
lessc.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
define('lessc', ['text', 'require', './less-rhino'], function (text, require) {
'use strict';
var lessr = require('./less-rhino'),
buildMap = {},
dirMap = {};
/**
* Convenience function for compiling LESS code.
*/
var compileLess = function (lessSrc, parentRequire, config, callback) {
require(['./less'], function (less) {
var lessParser = new less.Parser({
paths: ['']
});
lessParser.parse(lessSrc, function (e, css) {
callback(e, css.toCSS({ compress: true }).trim());
});
});
};
/**
* Convenience function for injecting stylesheet into the DOM.
*/
var outputStylesheet = function (css) {
var styleTag = document.createElement('style');
styleTag.type = 'text/css';
if (styleTag.styleSheet) {
styleTag.styleSheet.cssText = css();
} else {
styleTag.appendChild(document.createTextNode(css));
}
document.getElementsByTagName('head')[0].appendChild(styleTag);
};
var loadFile = function (name, parentRequire, callback) {
// Instead of re-inventing the wheel, let's just conveniently use
// RequireJS' `text` plugin.
text.get(parentRequire.toUrl(name), function(text) {
callback(text);
});
};
var jsEscape = function (content) {
return content.replace(/(['\\])/g, '\\$1')
.replace(/[\f]/g, "\\f")
.replace(/[\b]/g, "\\b")
.replace(/[\n]/g, "\\n")
.replace(/[\t]/g, "\\t")
.replace(/[\r]/g, "\\r");
};
return {
write: function (pluginName, moduleName, writeBuild) {
if (moduleName in buildMap) {
var dirBaseUrl = dirMap[moduleName];
var lessParser = new lessr.Parser({
paths: ['']
});
lessParser.parse(buildMap[moduleName], function (e, css) {
var result = css.toCSS({ compress: true }).trim();
var text = jsEscape(result);
writeBuild(
";(function () {" +
"var theStyle = '" + text + "';" +
"var styleTag = document.createElement('style');" +
"styleTag.type = 'text/css';" +
"if (styleTag.styleSheet) {" +
"styleTag.styleSheet.cssText = theStyle;" +
"} else {" +
"styleTag.appendChild(document.createTextNode(theStyle));" +
"}" +
"document.getElementsByTagName('head')[0].appendChild(styleTag);" +
"define('" + pluginName + "!" + moduleName + "', function () {" +
"return theStyle;" +
"});" +
"}());"
);
});
}
},
load: function (name, parentRequire, onLoad, config) {
loadFile(name, parentRequire, function (text) {
if (config.isBuild) {
buildMap[name] = text;
dirMap[name] = config.baseUrl;
return onLoad(text);
}
compileLess(text, parentRequire, config, function (e, css) {
if (e) {
onLoad.error(e);
return;
} else {
outputStylesheet(css);
onLoad();
}
});
});
}
};
});