handlebars 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +1 -2
- data/README.mdown +15 -7
- data/handlebars.gemspec +2 -5
- data/lib/handlebars.rb +5 -5
- data/lib/handlebars/context.rb +3 -12
- data/lib/handlebars/version.rb +1 -1
- data/spec/handlebars_spec.rb +1 -1
- metadata +47 -58
- data/.gitmodules +0 -3
- data/vendor/handlebars/.gitignore +0 -8
- data/vendor/handlebars/.jshintrc +0 -52
- data/vendor/handlebars/.npmignore +0 -10
- data/vendor/handlebars/.rspec +0 -1
- data/vendor/handlebars/Gemfile +0 -5
- data/vendor/handlebars/LICENSE +0 -19
- data/vendor/handlebars/README.markdown +0 -317
- data/vendor/handlebars/Rakefile +0 -109
- data/vendor/handlebars/bench/benchwarmer.js +0 -149
- data/vendor/handlebars/bench/handlebars.js +0 -172
- data/vendor/handlebars/bin/handlebars +0 -193
- data/vendor/handlebars/dist/handlebars.js +0 -2201
- data/vendor/handlebars/dist/handlebars.runtime.js +0 -321
- data/vendor/handlebars/lib/handlebars.js +0 -14
- data/vendor/handlebars/lib/handlebars/base.js +0 -154
- data/vendor/handlebars/lib/handlebars/compiler/ast.js +0 -133
- data/vendor/handlebars/lib/handlebars/compiler/base.js +0 -21
- data/vendor/handlebars/lib/handlebars/compiler/compiler.js +0 -1267
- data/vendor/handlebars/lib/handlebars/compiler/index.js +0 -7
- data/vendor/handlebars/lib/handlebars/compiler/printer.js +0 -131
- data/vendor/handlebars/lib/handlebars/compiler/visitor.js +0 -13
- data/vendor/handlebars/lib/handlebars/runtime.js +0 -88
- data/vendor/handlebars/lib/handlebars/utils.js +0 -67
- data/vendor/handlebars/package.json +0 -35
- data/vendor/handlebars/spec/acceptance_spec.rb +0 -101
- data/vendor/handlebars/spec/parser_spec.rb +0 -433
- data/vendor/handlebars/spec/qunit_spec.js +0 -1370
- data/vendor/handlebars/spec/spec_helper.rb +0 -157
- data/vendor/handlebars/spec/tokenizer_spec.rb +0 -301
- data/vendor/handlebars/src/handlebars.l +0 -53
- data/vendor/handlebars/src/handlebars.yy +0 -109
- data/vendor/handlebars/src/parser-prefix.js +0 -1
- data/vendor/handlebars/src/parser-suffix.js +0 -4
data/vendor/handlebars/Rakefile
DELETED
@@ -1,109 +0,0 @@
|
|
1
|
-
require "rubygems"
|
2
|
-
require "bundler/setup"
|
3
|
-
|
4
|
-
def compile_parser
|
5
|
-
system "./node_modules/.bin/jison -m js src/handlebars.yy src/handlebars.l"
|
6
|
-
if $?.success?
|
7
|
-
File.open("lib/handlebars/compiler/parser.js", "w") do |file|
|
8
|
-
file.puts File.read("src/parser-prefix.js") + File.read("handlebars.js") + File.read("src/parser-suffix.js")
|
9
|
-
end
|
10
|
-
|
11
|
-
sh "rm handlebars.js"
|
12
|
-
else
|
13
|
-
puts "Failed to run Jison."
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
file "lib/handlebars/compiler/parser.js" => ["src/handlebars.yy","src/handlebars.l"] do
|
18
|
-
if File.exists?('./node_modules/jison')
|
19
|
-
compile_parser
|
20
|
-
else
|
21
|
-
puts "Jison is not installed. Trying `npm install jison`."
|
22
|
-
sh "npm install"
|
23
|
-
compile_parser
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
task :compile => "lib/handlebars/compiler/parser.js"
|
28
|
-
|
29
|
-
desc "run the spec suite"
|
30
|
-
task :spec => [:release] do
|
31
|
-
rc = system "rspec -cfs spec"
|
32
|
-
fail "rspec spec failed with exit code #{$?.exitstatus}" if (rc.nil? || ! rc || $?.exitstatus != 0)
|
33
|
-
end
|
34
|
-
|
35
|
-
desc "run the npm test suite"
|
36
|
-
task :npm_test => [:release] do
|
37
|
-
rc = system "npm test"
|
38
|
-
fail "npm test failed with exit code #{$?.exitstatus}" if (rc.nil? || ! rc || $?.exitstatus != 0)
|
39
|
-
end
|
40
|
-
|
41
|
-
task :default => [:compile, :spec, :npm_test]
|
42
|
-
|
43
|
-
def remove_exports(string)
|
44
|
-
match = string.match(%r{^// BEGIN\(BROWSER\)\n(.*)\n^// END\(BROWSER\)}m)
|
45
|
-
match ? match[1] : string
|
46
|
-
end
|
47
|
-
|
48
|
-
minimal_deps = %w(base compiler/parser compiler/base compiler/ast utils compiler/compiler runtime).map do |file|
|
49
|
-
"lib/handlebars/#{file}.js"
|
50
|
-
end
|
51
|
-
|
52
|
-
runtime_deps = %w(base utils runtime).map do |file|
|
53
|
-
"lib/handlebars/#{file}.js"
|
54
|
-
end
|
55
|
-
|
56
|
-
directory "dist"
|
57
|
-
|
58
|
-
minimal_deps.unshift "dist"
|
59
|
-
|
60
|
-
def build_for_task(task)
|
61
|
-
FileUtils.rm_rf("dist/*") if File.directory?("dist")
|
62
|
-
FileUtils.mkdir_p("dist")
|
63
|
-
|
64
|
-
contents = ["/*\n\n" + File.read('LICENSE') + "\n*/\n"]
|
65
|
-
task.prerequisites.each do |filename|
|
66
|
-
next if filename == "dist"
|
67
|
-
|
68
|
-
contents << "// #{filename}\n" + remove_exports(File.read(filename)) + ";"
|
69
|
-
end
|
70
|
-
|
71
|
-
File.open(task.name, "w") do |file|
|
72
|
-
file.puts contents.join("\n")
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
file "dist/handlebars.js" => minimal_deps do |task|
|
77
|
-
build_for_task(task)
|
78
|
-
end
|
79
|
-
|
80
|
-
file "dist/handlebars.runtime.js" => runtime_deps do |task|
|
81
|
-
build_for_task(task)
|
82
|
-
end
|
83
|
-
|
84
|
-
task :build => [:compile, "dist/handlebars.js"]
|
85
|
-
task :runtime => [:compile, "dist/handlebars.runtime.js"]
|
86
|
-
|
87
|
-
desc "build the build and runtime version of handlebars"
|
88
|
-
task :release => [:build, :runtime]
|
89
|
-
|
90
|
-
directory "vendor"
|
91
|
-
|
92
|
-
desc "benchmark against dust.js and mustache.js"
|
93
|
-
task :bench => "vendor" do
|
94
|
-
require "open-uri"
|
95
|
-
|
96
|
-
#if File.directory?("vendor/coffee")
|
97
|
-
#system "cd vendor/coffee && git pull"
|
98
|
-
#else
|
99
|
-
#system "git clone git://github.com/jashkenas/coffee-script.git vendor/coffee"
|
100
|
-
#end
|
101
|
-
|
102
|
-
#if File.directory?("vendor/eco")
|
103
|
-
#system "cd vendor/eco && git pull && npm update"
|
104
|
-
#else
|
105
|
-
#system "git clone git://github.com/sstephenson/eco.git vendor/eco && cd vendor/eco && npm update"
|
106
|
-
#end
|
107
|
-
|
108
|
-
system "node bench/handlebars.js"
|
109
|
-
end
|
@@ -1,149 +0,0 @@
|
|
1
|
-
|
2
|
-
var Benchmark = require("benchmark");
|
3
|
-
|
4
|
-
var BenchWarmer = function(names) {
|
5
|
-
this.benchmarks = [];
|
6
|
-
this.currentBenches = [];
|
7
|
-
this.names = [];
|
8
|
-
this.errors = {};
|
9
|
-
};
|
10
|
-
|
11
|
-
var print = require("sys").print;
|
12
|
-
|
13
|
-
BenchWarmer.prototype = {
|
14
|
-
winners: function(benches) {
|
15
|
-
var result = Benchmark.filter(benches, function(bench) { return bench.cycles; });
|
16
|
-
|
17
|
-
if (result.length > 1) {
|
18
|
-
result.sort(function(a, b) { return b.compare(a); });
|
19
|
-
first = result[0];
|
20
|
-
last = result[result.length - 1];
|
21
|
-
|
22
|
-
var winners = [];
|
23
|
-
|
24
|
-
Benchmark.each(result, function(bench) {
|
25
|
-
if (bench.compare(first) === 0) {
|
26
|
-
winners.push(bench);
|
27
|
-
}
|
28
|
-
});
|
29
|
-
|
30
|
-
return winners;
|
31
|
-
} else {
|
32
|
-
return result;
|
33
|
-
}
|
34
|
-
},
|
35
|
-
suite: function(suite, fn) {
|
36
|
-
this.suiteName = suite;
|
37
|
-
this.first = true;
|
38
|
-
|
39
|
-
var self = this;
|
40
|
-
|
41
|
-
fn(function(name, benchFn) {
|
42
|
-
self.push(name, benchFn);
|
43
|
-
});
|
44
|
-
},
|
45
|
-
push: function(name, fn) {
|
46
|
-
if(this.names.indexOf(name) == -1) {
|
47
|
-
this.names.push(name);
|
48
|
-
}
|
49
|
-
|
50
|
-
var first = this.first, suiteName = this.suiteName, self = this;
|
51
|
-
this.first = false;
|
52
|
-
|
53
|
-
var bench = new Benchmark(function() {
|
54
|
-
fn();
|
55
|
-
}, {
|
56
|
-
name: this.suiteName + ": " + name,
|
57
|
-
onComplete: function() {
|
58
|
-
if(first) { self.startLine(suiteName); }
|
59
|
-
self.writeBench(bench);
|
60
|
-
self.currentBenches.push(bench);
|
61
|
-
}, onError: function() {
|
62
|
-
self.errors[this.name] = this;
|
63
|
-
}
|
64
|
-
});
|
65
|
-
|
66
|
-
this.benchmarks.push(bench);
|
67
|
-
},
|
68
|
-
bench: function() {
|
69
|
-
var benchSize = 0, names = this.names, self = this, i, l;
|
70
|
-
|
71
|
-
for(i=0, l=names.length; i<l; i++) {
|
72
|
-
var name = names[i];
|
73
|
-
|
74
|
-
if(benchSize < name.length) { benchSize = name.length; }
|
75
|
-
}
|
76
|
-
|
77
|
-
this.nameSize = benchSize + 2;
|
78
|
-
this.benchSize = 20;
|
79
|
-
var horSize = 0;
|
80
|
-
|
81
|
-
this.startLine("ops/msec");
|
82
|
-
horSize = horSize + "ops/msec ".length;
|
83
|
-
for(i=0, l=names.length; i<l; i++) {
|
84
|
-
print(names[i] + new Array(this.benchSize - names[i].length + 1).join(" "));
|
85
|
-
horSize = horSize + this.benchSize;
|
86
|
-
}
|
87
|
-
|
88
|
-
print("WINNER(S)");
|
89
|
-
horSize = horSize + "WINNER(S)".length;
|
90
|
-
|
91
|
-
print("\n" + new Array(horSize + 1).join("-"));
|
92
|
-
|
93
|
-
Benchmark.invoke(this.benchmarks, {
|
94
|
-
name: "run",
|
95
|
-
onComplete: function() {
|
96
|
-
var errors = false, prop, bench;
|
97
|
-
for(prop in self.errors) { if(self.errors.hasOwnProperty(prop)) { errors = true; break; } }
|
98
|
-
|
99
|
-
if(errors) {
|
100
|
-
print("\n\nErrors:\n");
|
101
|
-
for(prop in self.errors) {
|
102
|
-
if(self.errors.hasOwnProperty(prop)) {
|
103
|
-
bench = self.errors[prop];
|
104
|
-
print("\n" + bench.name + ":\n");
|
105
|
-
print(bench.error.message);
|
106
|
-
if(bench.error.stack) {
|
107
|
-
print(bench.error.stack.join("\n"));
|
108
|
-
}
|
109
|
-
print("\n");
|
110
|
-
}
|
111
|
-
}
|
112
|
-
}
|
113
|
-
}
|
114
|
-
});
|
115
|
-
|
116
|
-
print("\n");
|
117
|
-
},
|
118
|
-
startLine: function(name) {
|
119
|
-
var winners = Benchmark.map(this.winners(this.currentBenches), function(bench) {
|
120
|
-
return bench.name.split(": ")[1];
|
121
|
-
});
|
122
|
-
|
123
|
-
this.currentBenches = [];
|
124
|
-
|
125
|
-
print(winners.join(", "));
|
126
|
-
print("\n");
|
127
|
-
var padding = this.nameSize - name.length + 1;
|
128
|
-
name = name + new Array(padding).join(" ");
|
129
|
-
print(name);
|
130
|
-
},
|
131
|
-
writeBench: function(bench) {
|
132
|
-
var out;
|
133
|
-
|
134
|
-
if(!bench.error) {
|
135
|
-
var count = bench.hz,
|
136
|
-
moe = count * bench.stats.rme / 100;
|
137
|
-
|
138
|
-
out = Math.round(count / 1000) + " ±" + Math.round(moe / 1000) + " (" + bench.cycles + ")";
|
139
|
-
} else {
|
140
|
-
out = "E";
|
141
|
-
}
|
142
|
-
|
143
|
-
var padding = this.benchSize - out.length + 1;
|
144
|
-
out = out + new Array(padding).join(" ");
|
145
|
-
print(out);
|
146
|
-
}
|
147
|
-
};
|
148
|
-
|
149
|
-
module.exports = BenchWarmer;
|
@@ -1,172 +0,0 @@
|
|
1
|
-
var BenchWarmer = require("./benchwarmer");
|
2
|
-
Handlebars = require("../lib/handlebars");
|
3
|
-
|
4
|
-
var dust, Mustache, eco;
|
5
|
-
|
6
|
-
try {
|
7
|
-
dust = require("dust");
|
8
|
-
} catch (err) { /* NOP */ }
|
9
|
-
|
10
|
-
try {
|
11
|
-
Mustache = require("mustache");
|
12
|
-
} catch (err) { /* NOP */ }
|
13
|
-
|
14
|
-
try {
|
15
|
-
var ecoExports = require("eco");
|
16
|
-
eco = function(str) {
|
17
|
-
return ecoExports(str);
|
18
|
-
}
|
19
|
-
} catch (err) { /* NOP */ }
|
20
|
-
|
21
|
-
var benchDetails = {
|
22
|
-
string: {
|
23
|
-
context: {},
|
24
|
-
handlebars: "Hello world",
|
25
|
-
dust: "Hello world",
|
26
|
-
mustache: "Hello world",
|
27
|
-
eco: "Hello world"
|
28
|
-
},
|
29
|
-
variables: {
|
30
|
-
context: {name: "Mick", count: 30},
|
31
|
-
handlebars: "Hello {{name}}! You have {{count}} new messages.",
|
32
|
-
dust: "Hello {name}! You have {count} new messages.",
|
33
|
-
mustache: "Hello {{name}}! You have {{count}} new messages.",
|
34
|
-
eco: "Hello <%= @name %>! You have <%= @count %> new messages."
|
35
|
-
},
|
36
|
-
object: {
|
37
|
-
context: { person: { name: "Larry", age: 45 } },
|
38
|
-
handlebars: "{{#with person}}{{name}}{{age}}{{/with}}",
|
39
|
-
dust: "{#person}{name}{age}{/person}",
|
40
|
-
mustache: "{{#person}}{{name}}{{age}}{{/person}}"
|
41
|
-
},
|
42
|
-
array: {
|
43
|
-
context: { names: [{name: "Moe"}, {name: "Larry"}, {name: "Curly"}, {name: "Shemp"}] },
|
44
|
-
handlebars: "{{#each names}}{{name}}{{/each}}",
|
45
|
-
dust: "{#names}{name}{/names}",
|
46
|
-
mustache: "{{#names}}{{name}}{{/names}}",
|
47
|
-
eco: "<% for item in @names: %><%= item.name %><% end %>"
|
48
|
-
},
|
49
|
-
partial: {
|
50
|
-
context: { peeps: [{name: "Moe", count: 15}, {name: "Larry", count: 5}, {name: "Curly", count: 1}] },
|
51
|
-
partials: {
|
52
|
-
mustache: { variables: "Hello {{name}}! You have {{count}} new messages." },
|
53
|
-
handlebars: { variables: "Hello {{name}}! You have {{count}} new messages." }
|
54
|
-
},
|
55
|
-
handlebars: "{{#each peeps}}{{>variables}}{{/each}}",
|
56
|
-
dust: "{#peeps}{>variables/}{/peeps}",
|
57
|
-
mustache: "{{#peeps}}{{>variables}}{{/peeps}}"
|
58
|
-
},
|
59
|
-
recursion: {
|
60
|
-
context: { name: '1', kids: [{ name: '1.1', kids: [{name: '1.1.1', kids: []}] }] },
|
61
|
-
partials: {
|
62
|
-
mustache: { recursion: "{{name}}{{#kids}}{{>recursion}}{{/kids}}" },
|
63
|
-
handlebars: { recursion: "{{name}}{{#each kids}}{{>recursion}}{{/each}}" }
|
64
|
-
},
|
65
|
-
handlebars: "{{name}}{{#each kids}}{{>recursion}}{{/each}}",
|
66
|
-
dust: "{name}{#kids}{>recursion:./}{/kids}",
|
67
|
-
mustache: "{{name}}{{#kids}}{{>recursion}}{{/kids}}"
|
68
|
-
},
|
69
|
-
complex: {
|
70
|
-
handlebars: "<h1>{{header}}</h1>{{#if items}}<ul>{{#each items}}{{#if current}}" +
|
71
|
-
"<li><strong>{{name}}</strong></li>{{^}}" +
|
72
|
-
"<li><a href=\"{{url}}\">{{name}}</a></li>{{/if}}" +
|
73
|
-
"{{/each}}</ul>{{^}}<p>The list is empty.</p>{{/if}}",
|
74
|
-
|
75
|
-
dust: "<h1>{header}</h1>\n" +
|
76
|
-
"{?items}\n" +
|
77
|
-
" <ul>\n" +
|
78
|
-
" {#items}\n" +
|
79
|
-
" {#current}\n" +
|
80
|
-
" <li><strong>{name}</strong></li>\n" +
|
81
|
-
" {:else}\n" +
|
82
|
-
" <li><a href=\"{url}\">{name}</a></li>\n" +
|
83
|
-
" {/current}\n" +
|
84
|
-
" {/items}\n" +
|
85
|
-
" </ul>\n" +
|
86
|
-
"{:else}\n" +
|
87
|
-
" <p>The list is empty.</p>\n" +
|
88
|
-
"{/items}",
|
89
|
-
context: {
|
90
|
-
header: function() {
|
91
|
-
return "Colors";
|
92
|
-
},
|
93
|
-
items: [
|
94
|
-
{name: "red", current: true, url: "#Red"},
|
95
|
-
{name: "green", current: false, url: "#Green"},
|
96
|
-
{name: "blue", current: false, url: "#Blue"}
|
97
|
-
]
|
98
|
-
}
|
99
|
-
}
|
100
|
-
|
101
|
-
};
|
102
|
-
|
103
|
-
handlebarsTemplates = {};
|
104
|
-
ecoTemplates = {};
|
105
|
-
|
106
|
-
var warmer = new BenchWarmer();
|
107
|
-
|
108
|
-
var makeSuite = function(name) {
|
109
|
-
warmer.suite(name, function(bench) {
|
110
|
-
var templateName = name;
|
111
|
-
var details = benchDetails[templateName];
|
112
|
-
var mustachePartials = details.partials && details.partials.mustache;
|
113
|
-
var mustacheSource = details.mustache;
|
114
|
-
var context = details.context;
|
115
|
-
|
116
|
-
var error = function() { throw new Error("EWOT"); };
|
117
|
-
|
118
|
-
if (dust) {
|
119
|
-
bench("dust", function() {
|
120
|
-
dust.render(templateName, context, function(err, out) { });
|
121
|
-
});
|
122
|
-
}
|
123
|
-
|
124
|
-
bench("handlebars", function() {
|
125
|
-
handlebarsTemplates[templateName](context);
|
126
|
-
});
|
127
|
-
|
128
|
-
if (eco) {
|
129
|
-
if(ecoTemplates[templateName]) {
|
130
|
-
bench("eco", function() {
|
131
|
-
ecoTemplates[templateName](context);
|
132
|
-
});
|
133
|
-
} else {
|
134
|
-
bench("eco", error);
|
135
|
-
}
|
136
|
-
}
|
137
|
-
|
138
|
-
if (Mustache && mustacheSource) {
|
139
|
-
bench("mustache", function() {
|
140
|
-
Mustache.to_html(mustacheSource, context, mustachePartials);
|
141
|
-
});
|
142
|
-
} else {
|
143
|
-
bench("mustache", error);
|
144
|
-
}
|
145
|
-
});
|
146
|
-
}
|
147
|
-
|
148
|
-
for(var name in benchDetails) {
|
149
|
-
if(benchDetails.hasOwnProperty(name)) {
|
150
|
-
if (dust) {
|
151
|
-
dust.loadSource(dust.compile(benchDetails[name].dust, name));
|
152
|
-
}
|
153
|
-
handlebarsTemplates[name] = Handlebars.compile(benchDetails[name].handlebars);
|
154
|
-
|
155
|
-
if (eco && benchDetails[name].eco) {
|
156
|
-
ecoTemplates[name] = eco(benchDetails[name].eco);
|
157
|
-
}
|
158
|
-
|
159
|
-
var partials = benchDetails[name].partials;
|
160
|
-
if(partials) {
|
161
|
-
for(var partialName in partials.handlebars) {
|
162
|
-
if(partials.handlebars.hasOwnProperty(partialName)) {
|
163
|
-
Handlebars.registerPartial(partialName, partials.handlebars[partialName]);
|
164
|
-
}
|
165
|
-
}
|
166
|
-
}
|
167
|
-
|
168
|
-
makeSuite(name);
|
169
|
-
}
|
170
|
-
}
|
171
|
-
|
172
|
-
warmer.bench();
|
@@ -1,193 +0,0 @@
|
|
1
|
-
#!/usr/bin/env node
|
2
|
-
|
3
|
-
var optimist = require('optimist')
|
4
|
-
.usage('Precompile handlebar templates.\nUsage: $0 template...', {
|
5
|
-
'f': {
|
6
|
-
'type': 'string',
|
7
|
-
'description': 'Output File',
|
8
|
-
'alias': 'output'
|
9
|
-
},
|
10
|
-
'a': {
|
11
|
-
'type': 'boolean',
|
12
|
-
'description': 'Exports amd style (require.js)',
|
13
|
-
'alias': 'amd'
|
14
|
-
},
|
15
|
-
'c': {
|
16
|
-
'type': 'string',
|
17
|
-
'description': 'Exports CommonJS style, path to Handlebars module',
|
18
|
-
'alias': 'commonjs',
|
19
|
-
'default': null
|
20
|
-
},
|
21
|
-
'h': {
|
22
|
-
'type': 'string',
|
23
|
-
'description': 'Path to handlebar.js (only valid for amd-style)',
|
24
|
-
'alias': 'handlebarPath',
|
25
|
-
'default': ''
|
26
|
-
},
|
27
|
-
'k': {
|
28
|
-
'type': 'string',
|
29
|
-
'description': 'Known helpers',
|
30
|
-
'alias': 'known'
|
31
|
-
},
|
32
|
-
'o': {
|
33
|
-
'type': 'boolean',
|
34
|
-
'description': 'Known helpers only',
|
35
|
-
'alias': 'knownOnly'
|
36
|
-
},
|
37
|
-
'm': {
|
38
|
-
'type': 'boolean',
|
39
|
-
'description': 'Minimize output',
|
40
|
-
'alias': 'min'
|
41
|
-
},
|
42
|
-
'n': {
|
43
|
-
'type': 'string',
|
44
|
-
'description': 'Template namespace',
|
45
|
-
'alias': 'namespace',
|
46
|
-
'default': 'Handlebars.templates'
|
47
|
-
},
|
48
|
-
's': {
|
49
|
-
'type': 'boolean',
|
50
|
-
'description': 'Output template function only.',
|
51
|
-
'alias': 'simple'
|
52
|
-
},
|
53
|
-
'r': {
|
54
|
-
'type': 'string',
|
55
|
-
'description': 'Template root. Base value that will be stripped from template names.',
|
56
|
-
'alias': 'root'
|
57
|
-
},
|
58
|
-
'p' : {
|
59
|
-
'type': 'boolean',
|
60
|
-
'description': 'Compiling a partial template',
|
61
|
-
'alias': 'partial'
|
62
|
-
},
|
63
|
-
'd' : {
|
64
|
-
'type': 'boolean',
|
65
|
-
'description': 'Include data when compiling',
|
66
|
-
'alias': 'data'
|
67
|
-
}
|
68
|
-
})
|
69
|
-
|
70
|
-
.check(function(argv) {
|
71
|
-
var template = [0];
|
72
|
-
if (!argv._.length) {
|
73
|
-
throw 'Must define at least one template or directory.';
|
74
|
-
}
|
75
|
-
|
76
|
-
argv._.forEach(function(template) {
|
77
|
-
try {
|
78
|
-
fs.statSync(template);
|
79
|
-
} catch (err) {
|
80
|
-
throw 'Unable to open template file "' + template + '"';
|
81
|
-
}
|
82
|
-
});
|
83
|
-
})
|
84
|
-
.check(function(argv) {
|
85
|
-
if (argv.simple && argv.min) {
|
86
|
-
throw 'Unable to minimze simple output';
|
87
|
-
}
|
88
|
-
if (argv.simple && (argv._.length !== 1 || fs.statSync(argv._[0]).isDirectory())) {
|
89
|
-
throw 'Unable to output multiple templates in simple mode';
|
90
|
-
}
|
91
|
-
});
|
92
|
-
|
93
|
-
var fs = require('fs'),
|
94
|
-
handlebars = require('../lib/handlebars'),
|
95
|
-
basename = require('path').basename,
|
96
|
-
uglify = require('uglify-js');
|
97
|
-
|
98
|
-
var argv = optimist.argv,
|
99
|
-
template = argv._[0];
|
100
|
-
|
101
|
-
// Convert the known list into a hash
|
102
|
-
var known = {};
|
103
|
-
if (argv.known && !Array.isArray(argv.known)) {
|
104
|
-
argv.known = [argv.known];
|
105
|
-
}
|
106
|
-
if (argv.known) {
|
107
|
-
for (var i = 0, len = argv.known.length; i < len; i++) {
|
108
|
-
known[argv.known[i]] = true;
|
109
|
-
}
|
110
|
-
}
|
111
|
-
|
112
|
-
var output = [];
|
113
|
-
if (!argv.simple) {
|
114
|
-
if (argv.amd) {
|
115
|
-
output.push('define([\'' + argv.handlebarPath + 'handlebars\'], function(Handlebars) {\n');
|
116
|
-
} else if (argv.commonjs) {
|
117
|
-
output.push('var Handlebars = require("' + argv.commonjs + '");');
|
118
|
-
} else {
|
119
|
-
output.push('(function() {\n');
|
120
|
-
}
|
121
|
-
output.push(' var template = Handlebars.template, templates = ');
|
122
|
-
output.push(argv.namespace);
|
123
|
-
output.push(' = ');
|
124
|
-
output.push(argv.namespace);
|
125
|
-
output.push(' || {};\n');
|
126
|
-
}
|
127
|
-
function processTemplate(template, root) {
|
128
|
-
var path = template,
|
129
|
-
stat = fs.statSync(path);
|
130
|
-
if (stat.isDirectory()) {
|
131
|
-
fs.readdirSync(template).map(function(file) {
|
132
|
-
var path = template + '/' + file;
|
133
|
-
|
134
|
-
if (/\.handlebars$/.test(path) || fs.statSync(path).isDirectory()) {
|
135
|
-
processTemplate(path, root || template);
|
136
|
-
}
|
137
|
-
});
|
138
|
-
} else {
|
139
|
-
var data = fs.readFileSync(path, 'utf8');
|
140
|
-
|
141
|
-
var options = {
|
142
|
-
knownHelpers: known,
|
143
|
-
knownHelpersOnly: argv.o
|
144
|
-
};
|
145
|
-
|
146
|
-
if (argv.data) {
|
147
|
-
options.data = true;
|
148
|
-
}
|
149
|
-
|
150
|
-
// Clean the template name
|
151
|
-
if (!root) {
|
152
|
-
template = basename(template);
|
153
|
-
} else if (template.indexOf(root) === 0) {
|
154
|
-
template = template.substring(root.length+1);
|
155
|
-
}
|
156
|
-
template = template.replace(/\.handlebars$/, '');
|
157
|
-
|
158
|
-
if (argv.simple) {
|
159
|
-
output.push(handlebars.precompile(data, options) + '\n');
|
160
|
-
} else if (argv.partial) {
|
161
|
-
output.push('Handlebars.partials[\'' + template + '\'] = template(' + handlebars.precompile(data, options) + ');\n');
|
162
|
-
} else {
|
163
|
-
output.push('templates[\'' + template + '\'] = template(' + handlebars.precompile(data, options) + ');\n');
|
164
|
-
}
|
165
|
-
}
|
166
|
-
}
|
167
|
-
|
168
|
-
argv._.forEach(function(template) {
|
169
|
-
processTemplate(template, argv.root);
|
170
|
-
});
|
171
|
-
|
172
|
-
// Output the content
|
173
|
-
if (!argv.simple) {
|
174
|
-
if (argv.amd) {
|
175
|
-
output.push('});');
|
176
|
-
} else if (!argv.commonjs) {
|
177
|
-
output.push('})();');
|
178
|
-
}
|
179
|
-
}
|
180
|
-
output = output.join('');
|
181
|
-
|
182
|
-
if (argv.min) {
|
183
|
-
var ast = uglify.parser.parse(output);
|
184
|
-
ast = uglify.uglify.ast_mangle(ast);
|
185
|
-
ast = uglify.uglify.ast_squeeze(ast);
|
186
|
-
output = uglify.uglify.gen_code(ast);
|
187
|
-
}
|
188
|
-
|
189
|
-
if (argv.output) {
|
190
|
-
fs.writeFileSync(argv.output, output, 'utf8');
|
191
|
-
} else {
|
192
|
-
console.log(output);
|
193
|
-
}
|