-
Notifications
You must be signed in to change notification settings - Fork 2
/
Cakefile
122 lines (110 loc) · 3.17 KB
/
Cakefile
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
117
118
119
120
121
122
#
# Cakefile
#
# Compiles bunch of coffee files into one JavaScript file.
#
fs = require 'fs'
cs = require 'coffee-script'
HEADER = """
/*
* Crewracing - Better Crew List!
* http://github.com/dtinth/crewracing
*
* By Thai Pangsakulyanont (DJ THAI in TECHNIKA2)
* MIT Licensed
*/
"""
class Compiler
constructor: ->
@files = []
addFile: (fn) ->
@files.push fn
watch: (file) ->
timer = 0
for file in @files
fs.watchFile file, (curr, prev) =>
if curr.mtime > prev.mtime
clearTimeout timer
timer = setTimeout (=> @compile()), 100
@compile()
compileFile: (filename) ->
contents = fs.readFileSync filename, 'utf-8'
moduleName = filename.replace(/^.*\//, './').replace(/\.[a-z]+$/, '')
try
if /\.coffee$/.test filename
code = cs.compile contents, bare: true
else if /\.json$/.test filename
code = 'module.exports=' + contents
else
code = contents
fn = new Function(code)
console.log "... #{moduleName}: ok!"
catch e
fn = new Function("throw new Error(#{JSON.stringify e.toString()});")
console.log "... #{moduleName}: #{e.toString()}"
"{ name: #{JSON.stringify moduleName}, factory: #{fn.toString().replace(/function(\s+\w+)?\s*\(\s*\)/, 'function(require, exports, module)')} }"
compile: ->
console.log "#{new Date().toString()}"
code = """
#{HEADER}
var Crewracing = (function() {
var modules = {}, require = function(name) { return modules[name](); };
function m(factory) {
var initialized = false;
var module = { exports: {} };
return function() {
if (!initialized) {
factory(require, module.exports, module);
initialized = true;
}
return module.exports;
};
}
return function() {
for (var i = 0; i < arguments.length; i ++) {
modules[arguments[i].name] = m(arguments[i].factory);
}
require('./main');
return { require: require };
};
})()(
#{(@compileFile file for file in @files).join(',\n');}
);
"""
fs.writeFileSync 'js.js', code
console.log ""
getCompiler = ->
compiler = new Compiler
compiler.addFile 'src/main.coffee'
compiler.addFile 'src/ui.coffee'
compiler.addFile 'src/data.coffee'
compiler.addFile 'src/db.coffee'
compiler.addFile 'src/songdb.coffee'
compiler.addFile 'src/utils.coffee'
compiler.addFile 'src/hash.coffee'
compiler.addFile 'src/storage.coffee'
compiler.addFile 'src/music-db.json'
return compiler
task 'compile', 'Compile source code files to js.js once', (options) ->
compiler = getCompiler()
compiler.compile()
task 'watch', 'Watch files for changes, and compile once they have changed', (options) ->
compiler = getCompiler()
compiler.watch()
task 'music', 'Creates the music database file', (options) ->
{ jsdom } = require 'jsdom'
doc = jsdom fs.readFileSync 'music-db/music-db.xml', 'utf-8'
out = []
toobj = (node, fn) ->
obj = {}
for attr in node.attributes
obj[attr.nodeName] = attr.nodeValue
if fn
fn.call obj
return obj
for music in doc.getElementsByTagName 'music'
out.push toobj music, ->
@charts = []
for chart in music.getElementsByTagName 'chart'
@charts.push toobj chart
fs.writeFileSync 'src/music-db.json', JSON.stringify(out)