-
Notifications
You must be signed in to change notification settings - Fork 2
/
require-stylus.coffee
87 lines (77 loc) · 2.47 KB
/
require-stylus.coffee
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
define ['stylus'], ->
env = if process?.versions?.node
"node"
else if (window?.navigator and window?.document) or typeof importScripts isnt "undefined"
"browser"
else
throw new Error 'Environment unsupported.'
fetchText = switch env
when 'node'
(path, cb) ->
cb fs.readFileSync path, 'utf8'
when 'browser'
getXhr = ->
if typeof XMLHttpRequest isnt "undefined"
return new XMLHttpRequest
else
for progId in ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0']
try
xhr = new ActiveXObject progId
return xhr
catch e
throw new Error "getXhr(): XMLHttpRequest not available"
(url, callback) ->
xhr = getXhr()
xhr.open 'GET', url, yes
xhr.onreadystatechange = (evt) ->
if xhr.readyState is 4
callback xhr.responseText
xhr.send null
stylusCompiler = switch env
when 'node' then require.nodeRequire 'stylus'
when 'browser' then stylus
buildMap = {}
version: '1.0.1'
load: (name, parentRequire, load, config) ->
path = parentRequire.toUrl "#{name}.styl"
fetchText path, (data) ->
data = data.replace(///\t///g, " ").replace(///^\s+///, "").replace(///\s+$///, "")
stylusCompiler(data).render (err, css) ->
throw err if err
cssInsertString = """
define(function(){
var css = #{JSON.stringify css},
head = document.getElementsByTagName('head')[0],
style = document.createElement('style');
var imports = css.match(new RegExp('@import\\\\s+url\\\\(.*\\\\);?', 'g'));
if (imports) {
imports.forEach(function(i){
css = css.replace(i, '');
var url = i.match(new RegExp('url\\\\((.*)\\\\)'))[1];
var linkElement = document.createElement('link');
linkElement.rel = 'stylesheet';
linkElement.type = 'text/css';
linkElement.href = JSON.parse(url);
head.appendChild(linkElement);
});
}
style.type = 'text/css';
if (style.styleSheet){
style.styleSheet.cssText = css;
} else {
style.appendChild(document.createTextNode(css));
}
head.appendChild(style);
});
"""
if config.isBuild
buildMap[name] = cssInsertString;
load.fromText name, cssInsertString
parentRequire [name], (value) ->
load value
write: (pluginName, name, write) ->
if buildMap.hasOwnProperty name
cssInsertString = buildMap[name]
write.asModule "#{pluginName}!#{name}", cssInsertString
else
throw new Error "buildMap has no #{name}"