hca 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: db065f6bb4ae1e9648d33dea57da291838b98c4d
4
+ data.tar.gz: dbfa2cf6bc6c37176bb0bc3115f3cbd6bdb0fca7
5
+ SHA512:
6
+ metadata.gz: 4070b9eb4626244c9a399766017105216a33e230f2c784edbb45f5fde54f187c8206523f72457fb68b78065f6f5d6a6b84cec4b98dec108f69abd0641f06eab4
7
+ data.tar.gz: 9233ce8e115a18e31286d48ae72e57f1c16a414349688f9c0c279083300230457521ac2e7dc51a1bebf5208d601ec9820bc2d71b87470873feb643629f59ad96
data/.gitignore ADDED
@@ -0,0 +1,23 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
23
+ .idea/
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Andrei Gladkyi
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,68 @@
1
+ # HCA (HAML-CoffeeScript Assets)
2
+
3
+ HCA compiles HAML templates with inline CoffeeScript code into client-side JavaScript template functions that are available in `window.JST` object.
4
+
5
+ ## Installation
6
+
7
+ Ruby on Rails 3.1+ is required.
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'hca'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ ```
18
+ $ bundle
19
+ ```
20
+
21
+ ## Configuration
22
+
23
+ You can configure HCA by adding an initializer into your `config/initializers` directory. Configuration options are:
24
+ - `templates_path` - base templates path used for generating correct template keys in `window.JST` object. Default value is `app/assets/javascripts`
25
+ - `escape_html` - escape special HTML characters. Enabled by default
26
+ - `custom_html_escape` - the name of the custom HTML escape function
27
+ - `clean_value` - render empty strings instead of NULL or undefined CoffeeScript values. Enabled by default
28
+ - `custom_clean_value` - the name of the custom function to clean CoffeeScript values
29
+
30
+ ### Example
31
+
32
+ ```ruby
33
+ Hca.configure do |config|
34
+ config.custom_html_escape = '_.escape' # using Underscore.js 'escape' function
35
+ config.custom_clean_value = '$.trim' # using jQuery.trim to clean NULL or undefined CoffeeScript values
36
+ config.templates_path = 'app/assets/javascripts/templates'
37
+ end
38
+ ```
39
+
40
+ ## Usage
41
+
42
+ * Put HAML templates to your `app/assets/javascripts/...` directory. Give them `.hca` extention.
43
+ * Add an initializer with correct path to your `.hca` templates
44
+ * Add templates to the Assets Pipeline
45
+
46
+ ### Example
47
+
48
+ HCA template
49
+
50
+ TODO: add an example here
51
+
52
+ ## Hints
53
+
54
+ * Using custom cleanup and escape functions helps reducing the size of the generated JavaScript code.
55
+
56
+ ## License
57
+
58
+ MIT
59
+
60
+ HCA internally uses [haml-coffee](https://github.com/netzpirat/haml-coffee) library.
61
+
62
+ ## Contributing
63
+
64
+ 1. Fork it (https://github.com/arg/hca/fork)
65
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
66
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
67
+ 4. Push to the branch (`git push origin my-new-feature`)
68
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
data/hca.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'hca/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'hca'
8
+ spec.version = Hca::VERSION
9
+ spec.authors = ['Andrei Gladkyi']
10
+ spec.email = ['arg@arglabs.net']
11
+ spec.summary = %q{Compiles HAML CoffeScript templates into a client-side JavaScript code}
12
+ spec.homepage = 'https://github.com/arg/hca'
13
+ spec.license = 'MIT'
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ['lib']
19
+
20
+ spec.add_dependency 'tilt'
21
+ spec.add_dependency 'execjs'
22
+ spec.add_dependency 'coffee-script'
23
+ spec.add_development_dependency 'bundler'
24
+ spec.add_development_dependency 'rails', '>= 3.1.0'
25
+ end
data/lib/hca.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'hca/version'
2
+ require 'hca/configuration'
3
+ require 'hca/template'
4
+ require 'hca/engine'
@@ -0,0 +1,24 @@
1
+ module Hca
2
+ OPTIONS = [:escape_html, :clean_value, :custom_html_escape, :custom_clean_value, :templates_path]
3
+
4
+ class << self
5
+
6
+ def configure
7
+ yield(config) if block_given?
8
+ end
9
+
10
+ def config
11
+ @config ||= get_config
12
+ end
13
+
14
+ private
15
+
16
+ def get_config
17
+ Struct.new(*OPTIONS).new.tap do |config|
18
+ config.escape_html = true
19
+ config.clean_value = true
20
+ config.templates_path = 'app/assets/javascripts'
21
+ end
22
+ end
23
+ end
24
+ end
data/lib/hca/engine.rb ADDED
@@ -0,0 +1,11 @@
1
+ module Hca
2
+ class Engine < Rails::Engine
3
+ isolate_namespace Hca
4
+
5
+ initializer 'hca.environment', after: 'sprockets.environment', group: :all do |app|
6
+ next unless app.assets
7
+ require 'hca/template'
8
+ app.assets.register_engine '.hca', Hca::Template
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,51 @@
1
+ module Hca
2
+ class Template < Tilt::Template
3
+ self.default_mime_type = 'application/javascript'
4
+
5
+ def prepare
6
+ @data = @data.gsub("'", "\\'").gsub("\n", "\\n")
7
+ end
8
+
9
+ def evaluate(scope, locals, &block)
10
+ cs_template = self.class.runtime.eval("compile('#{data}', #{config})")
11
+ js_template = CoffeeScript.compile(cs_template, no_wrap: true)
12
+ @output ||= wrap_template(js_template)
13
+ end
14
+
15
+ private
16
+
17
+ def wrap_template(template)
18
+ <<-JST
19
+ (function() {
20
+ window.JST || (window.JST = {});
21
+ window.JST['#{template_name}'] = function(context) {
22
+ return function() { #{template} }.call(context);
23
+ };
24
+ })();
25
+ JST
26
+ end
27
+
28
+ def config
29
+ Hca.config.as_json.transform_keys { |key| key.camelize(:lower) }.to_json
30
+ end
31
+
32
+ def template_name
33
+ path = Pathname.new(file).relative_path_from(Rails.root.join(Hca.config.templates_path))
34
+ path.to_s.chomp(path.extname)
35
+ rescue
36
+ file
37
+ end
38
+
39
+ class << self
40
+ def runtime
41
+ @runtime ||= load_runtime
42
+ end
43
+
44
+ def load_runtime
45
+ path = File.join(File.dirname(__FILE__), '..', '..', 'vendor', 'assets', 'javascripts', '**', '*.js')
46
+ runtime = Dir[path].map { |file| File.read(file) }
47
+ ExecJS.compile(runtime.join(' '))
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,3 @@
1
+ module Hca
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,2433 @@
1
+ /**!
2
+ * Copyright (c) 2011 9elements, 2011-2013 Michael Kessler
3
+ *
4
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this
5
+ * software and associated documentation files (the 'Software'), to deal in the Software
6
+ * without restriction, including without limitation the rights to use, copy, modify, merge,
7
+ * publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
8
+ * to whom the Software is furnished to do so, subject to the following conditions:
9
+ *
10
+ * The above copyright notice and this permission notice shall be included in all copies or
11
+ * substantial portions of the Software.
12
+ *
13
+ * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
14
+ * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
15
+ * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
16
+ * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
17
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
18
+ * DEALINGS IN THE SOFTWARE.
19
+ */
20
+
21
+ var require = function (file, cwd) {
22
+ var resolved = require.resolve(file, cwd || '/');
23
+ var mod = require.modules[resolved];
24
+ if (!mod) throw new Error(
25
+ 'Failed to resolve module ' + file + ', tried ' + resolved
26
+ );
27
+ var cached = require.cache[resolved];
28
+ var res = cached ? cached.exports : mod();
29
+ return res;
30
+ };
31
+
32
+ require.paths = [];
33
+ require.modules = {};
34
+ require.cache = {};
35
+ require.extensions = [".js", ".coffee", ".json"];
36
+
37
+ require._core = {
38
+ 'assert': true,
39
+ 'events': true,
40
+ 'fs': true,
41
+ 'path': true,
42
+ 'vm': true
43
+ };
44
+
45
+ require.resolve = (function () {
46
+ return function (x, cwd) {
47
+ if (!cwd) cwd = '/';
48
+
49
+ if (require._core[x]) return x;
50
+ var path = require.modules.path();
51
+ cwd = path.resolve('/', cwd);
52
+ var y = cwd || '/';
53
+
54
+ if (x.match(/^(?:\.\.?\/|\/)/)) {
55
+ var m = loadAsFileSync(path.resolve(y, x))
56
+ || loadAsDirectorySync(path.resolve(y, x));
57
+ if (m) return m;
58
+ }
59
+
60
+ var n = loadNodeModulesSync(x, y);
61
+ if (n) return n;
62
+
63
+ throw new Error("Cannot find module '" + x + "'");
64
+
65
+ function loadAsFileSync(x) {
66
+ x = path.normalize(x);
67
+ if (require.modules[x]) {
68
+ return x;
69
+ }
70
+
71
+ for (var i = 0; i < require.extensions.length; i++) {
72
+ var ext = require.extensions[i];
73
+ if (require.modules[x + ext]) return x + ext;
74
+ }
75
+ }
76
+
77
+ function loadAsDirectorySync(x) {
78
+ x = x.replace(/\/+$/, '');
79
+ var pkgfile = path.normalize(x + '/package.json');
80
+ if (require.modules[pkgfile]) {
81
+ var pkg = require.modules[pkgfile]();
82
+ var b = pkg.browserify;
83
+ if (typeof b === 'object' && b.main) {
84
+ var m = loadAsFileSync(path.resolve(x, b.main));
85
+ if (m) return m;
86
+ }
87
+ else if (typeof b === 'string') {
88
+ var m = loadAsFileSync(path.resolve(x, b));
89
+ if (m) return m;
90
+ }
91
+ else if (pkg.main) {
92
+ var m = loadAsFileSync(path.resolve(x, pkg.main));
93
+ if (m) return m;
94
+ }
95
+ }
96
+
97
+ return loadAsFileSync(x + '/index');
98
+ }
99
+
100
+ function loadNodeModulesSync(x, start) {
101
+ var dirs = nodeModulesPathsSync(start);
102
+ for (var i = 0; i < dirs.length; i++) {
103
+ var dir = dirs[i];
104
+ var m = loadAsFileSync(dir + '/' + x);
105
+ if (m) return m;
106
+ var n = loadAsDirectorySync(dir + '/' + x);
107
+ if (n) return n;
108
+ }
109
+
110
+ var m = loadAsFileSync(x);
111
+ if (m) return m;
112
+ }
113
+
114
+ function nodeModulesPathsSync(start) {
115
+ var parts;
116
+ if (start === '/') parts = [ '' ];
117
+ else parts = path.normalize(start).split('/');
118
+
119
+ var dirs = [];
120
+ for (var i = parts.length - 1; i >= 0; i--) {
121
+ if (parts[i] === 'node_modules') continue;
122
+ var dir = parts.slice(0, i + 1).join('/') + '/node_modules';
123
+ dirs.push(dir);
124
+ }
125
+
126
+ return dirs;
127
+ }
128
+ };
129
+ })();
130
+
131
+ require.alias = function (from, to) {
132
+ var path = require.modules.path();
133
+ var res = null;
134
+ try {
135
+ res = require.resolve(from + '/package.json', '/');
136
+ }
137
+ catch (err) {
138
+ res = require.resolve(from, '/');
139
+ }
140
+ var basedir = path.dirname(res);
141
+
142
+ var keys = (Object.keys || function (obj) {
143
+ var res = [];
144
+ for (var key in obj) res.push(key);
145
+ return res;
146
+ })(require.modules);
147
+
148
+ for (var i = 0; i < keys.length; i++) {
149
+ var key = keys[i];
150
+ if (key.slice(0, basedir.length + 1) === basedir + '/') {
151
+ var f = key.slice(basedir.length);
152
+ require.modules[to + f] = require.modules[basedir + f];
153
+ }
154
+ else if (key === basedir) {
155
+ require.modules[to] = require.modules[basedir];
156
+ }
157
+ }
158
+ };
159
+
160
+ (function () {
161
+ var process = {};
162
+ var global = typeof window !== 'undefined' ? window : {};
163
+ var definedProcess = false;
164
+
165
+ require.define = function (filename, fn) {
166
+ if (!definedProcess && require.modules.__browserify_process) {
167
+ process = require.modules.__browserify_process();
168
+ definedProcess = true;
169
+ }
170
+
171
+ var dirname = require._core[filename]
172
+ ? ''
173
+ : require.modules.path().dirname(filename)
174
+ ;
175
+
176
+ var require_ = function (file) {
177
+ var requiredModule = require(file, dirname);
178
+ var cached = require.cache[require.resolve(file, dirname)];
179
+
180
+ if (cached && cached.parent === null) {
181
+ cached.parent = module_;
182
+ }
183
+
184
+ return requiredModule;
185
+ };
186
+ require_.resolve = function (name) {
187
+ return require.resolve(name, dirname);
188
+ };
189
+ require_.modules = require.modules;
190
+ require_.define = require.define;
191
+ require_.cache = require.cache;
192
+ var module_ = {
193
+ id: filename,
194
+ filename: filename,
195
+ exports: {},
196
+ loaded: false,
197
+ parent: null
198
+ };
199
+
200
+ require.modules[filename] = function () {
201
+ require.cache[filename] = module_;
202
+ fn.call(
203
+ module_.exports,
204
+ require_,
205
+ module_,
206
+ module_.exports,
207
+ dirname,
208
+ filename,
209
+ process,
210
+ global
211
+ );
212
+ module_.loaded = true;
213
+ return module_.exports;
214
+ };
215
+ };
216
+ })();
217
+
218
+ require.define("path", function (require, module, exports, __dirname, __filename, process, global) {
219
+ function filter(xs, fn) {
220
+ var res = [];
221
+ for (var i = 0; i < xs.length; i++) {
222
+ if (fn(xs[i], i, xs)) res.push(xs[i]);
223
+ }
224
+ return res;
225
+ }
226
+
227
+ // resolves . and .. elements in a path array with directory names there
228
+ // must be no slashes, empty elements, or device names (c:\) in the array
229
+ // (so also no leading and trailing slashes - it does not distinguish
230
+ // relative and absolute paths)
231
+ function normalizeArray(parts, allowAboveRoot) {
232
+ // if the path tries to go above the root, `up` ends up > 0
233
+ var up = 0;
234
+ for (var i = parts.length; i >= 0; i--) {
235
+ var last = parts[i];
236
+ if (last == '.') {
237
+ parts.splice(i, 1);
238
+ } else if (last === '..') {
239
+ parts.splice(i, 1);
240
+ up++;
241
+ } else if (up) {
242
+ parts.splice(i, 1);
243
+ up--;
244
+ }
245
+ }
246
+
247
+ // if the path is allowed to go above the root, restore leading ..s
248
+ if (allowAboveRoot) {
249
+ for (; up--; up) {
250
+ parts.unshift('..');
251
+ }
252
+ }
253
+
254
+ return parts;
255
+ }
256
+
257
+ // Regex to split a filename into [*, dir, basename, ext]
258
+ // posix version
259
+ var splitPathRe = /^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/;
260
+
261
+ // path.resolve([from ...], to)
262
+ // posix version
263
+ exports.resolve = function () {
264
+ var resolvedPath = '',
265
+ resolvedAbsolute = false;
266
+
267
+ for (var i = arguments.length; i >= -1 && !resolvedAbsolute; i--) {
268
+ var path = (i >= 0)
269
+ ? arguments[i]
270
+ : process.cwd();
271
+
272
+ // Skip empty and invalid entries
273
+ if (typeof path !== 'string' || !path) {
274
+ continue;
275
+ }
276
+
277
+ resolvedPath = path + '/' + resolvedPath;
278
+ resolvedAbsolute = path.charAt(0) === '/';
279
+ }
280
+
281
+ // At this point the path should be resolved to a full absolute path, but
282
+ // handle relative paths to be safe (might happen when process.cwd() fails)
283
+
284
+ // Normalize the path
285
+ resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function (p) {
286
+ return !!p;
287
+ }), !resolvedAbsolute).join('/');
288
+
289
+ return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
290
+ };
291
+
292
+ // path.normalize(path)
293
+ // posix version
294
+ exports.normalize = function (path) {
295
+ var isAbsolute = path.charAt(0) === '/',
296
+ trailingSlash = path.slice(-1) === '/';
297
+
298
+ // Normalize the path
299
+ path = normalizeArray(filter(path.split('/'), function (p) {
300
+ return !!p;
301
+ }), !isAbsolute).join('/');
302
+
303
+ if (!path && !isAbsolute) {
304
+ path = '.';
305
+ }
306
+ if (path && trailingSlash) {
307
+ path += '/';
308
+ }
309
+
310
+ return (isAbsolute ? '/' : '') + path;
311
+ };
312
+
313
+ // posix version
314
+ exports.join = function () {
315
+ var paths = Array.prototype.slice.call(arguments, 0);
316
+ return exports.normalize(filter(paths, function (p, index) {
317
+ return p && typeof p === 'string';
318
+ }).join('/'));
319
+ };
320
+
321
+ exports.dirname = function (path) {
322
+ var dir = splitPathRe.exec(path)[1] || '';
323
+ var isWindows = false;
324
+ if (!dir) {
325
+ // No dirname
326
+ return '.';
327
+ } else if (dir.length === 1 ||
328
+ (isWindows && dir.length <= 3 && dir.charAt(1) === ':')) {
329
+ // It is just a slash or a drive letter with a slash
330
+ return dir;
331
+ } else {
332
+ // It is a full dirname, strip trailing slash
333
+ return dir.substring(0, dir.length - 1);
334
+ }
335
+ };
336
+
337
+ exports.basename = function (path, ext) {
338
+ var f = splitPathRe.exec(path)[2] || '';
339
+ // TODO: make this comparison case-insensitive on windows?
340
+ if (ext && f.substr(-1 * ext.length) === ext) {
341
+ f = f.substr(0, f.length - ext.length);
342
+ }
343
+ return f;
344
+ };
345
+
346
+ exports.extname = function (path) {
347
+ return splitPathRe.exec(path)[3] || '';
348
+ };
349
+
350
+ exports.relative = function (from, to) {
351
+ from = exports.resolve(from).substr(1);
352
+ to = exports.resolve(to).substr(1);
353
+
354
+ function trim(arr) {
355
+ var start = 0;
356
+ for (; start < arr.length; start++) {
357
+ if (arr[start] !== '') break;
358
+ }
359
+
360
+ var end = arr.length - 1;
361
+ for (; end >= 0; end--) {
362
+ if (arr[end] !== '') break;
363
+ }
364
+
365
+ if (start > end) return [];
366
+ return arr.slice(start, end - start + 1);
367
+ }
368
+
369
+ var fromParts = trim(from.split('/'));
370
+ var toParts = trim(to.split('/'));
371
+
372
+ var length = Math.min(fromParts.length, toParts.length);
373
+ var samePartsLength = length;
374
+ for (var i = 0; i < length; i++) {
375
+ if (fromParts[i] !== toParts[i]) {
376
+ samePartsLength = i;
377
+ break;
378
+ }
379
+ }
380
+
381
+ var outputParts = [];
382
+ for (var i = samePartsLength; i < fromParts.length; i++) {
383
+ outputParts.push('..');
384
+ }
385
+
386
+ outputParts = outputParts.concat(toParts.slice(samePartsLength));
387
+
388
+ return outputParts.join('/');
389
+ };
390
+
391
+ });
392
+
393
+ require.define("__browserify_process", function (require, module, exports, __dirname, __filename, process, global) {
394
+ var process = module.exports = {};
395
+
396
+ process.nextTick = (function () {
397
+ var canSetImmediate = typeof window !== 'undefined'
398
+ && window.setImmediate;
399
+ var canPost = typeof window !== 'undefined'
400
+ && window.postMessage && window.addEventListener
401
+ ;
402
+
403
+ if (canSetImmediate) {
404
+ return function (f) {
405
+ return window.setImmediate(f)
406
+ };
407
+ }
408
+
409
+ if (canPost) {
410
+ var queue = [];
411
+ window.addEventListener('message', function (ev) {
412
+ if (ev.source === window && ev.data === 'browserify-tick') {
413
+ ev.stopPropagation();
414
+ if (queue.length > 0) {
415
+ var fn = queue.shift();
416
+ fn();
417
+ }
418
+ }
419
+ }, true);
420
+
421
+ return function nextTick(fn) {
422
+ queue.push(fn);
423
+ window.postMessage('browserify-tick', '*');
424
+ };
425
+ }
426
+
427
+ return function nextTick(fn) {
428
+ setTimeout(fn, 0);
429
+ };
430
+ })();
431
+
432
+ process.title = 'browser';
433
+ process.browser = true;
434
+ process.env = {};
435
+ process.argv = [];
436
+
437
+ process.binding = function (name) {
438
+ if (name === 'evals') return (require)('vm')
439
+ else throw new Error('No such module. (Possibly not yet loaded)')
440
+ };
441
+
442
+ (function () {
443
+ var cwd = '/';
444
+ var path;
445
+ process.cwd = function () {
446
+ return cwd
447
+ };
448
+ process.chdir = function (dir) {
449
+ if (!path) path = require('path');
450
+ cwd = path.resolve(dir, cwd);
451
+ };
452
+ })();
453
+
454
+ });
455
+
456
+ require.define("/haml-coffee.coffee", function (require, module, exports, __dirname, __filename, process, global) {
457
+ (function () {
458
+ var Code, Comment, Directive, Filter, Haml, HamlCoffee, Node, Text, indent, whitespace;
459
+
460
+ Node = require('./nodes/node');
461
+
462
+ Text = require('./nodes/text');
463
+
464
+ Haml = require('./nodes/haml');
465
+
466
+ Code = require('./nodes/code');
467
+
468
+ Comment = require('./nodes/comment');
469
+
470
+ Filter = require('./nodes/filter');
471
+
472
+ Directive = require('./nodes/directive');
473
+
474
+ whitespace = require('./util/text').whitespace;
475
+
476
+ indent = require('./util/text').indent;
477
+
478
+ module.exports = HamlCoffee = (function () {
479
+ HamlCoffee.VERSION = '1.14.1';
480
+
481
+ function HamlCoffee(options) {
482
+ var segment, segments, _base, _base1, _base10, _base11, _base12, _base13, _base2, _base3, _base4, _base5, _base6, _base7, _base8, _base9, _i, _len;
483
+ this.options = options != null ? options : {};
484
+ if ((_base = this.options).placement == null) {
485
+ _base.placement = 'global';
486
+ }
487
+ if ((_base1 = this.options).dependencies == null) {
488
+ _base1.dependencies = {
489
+ hc: 'hamlcoffee'
490
+ };
491
+ }
492
+ if ((_base2 = this.options).escapeHtml == null) {
493
+ _base2.escapeHtml = true;
494
+ }
495
+ if ((_base3 = this.options).escapeAttributes == null) {
496
+ _base3.escapeAttributes = true;
497
+ }
498
+ if ((_base4 = this.options).cleanValue == null) {
499
+ _base4.cleanValue = true;
500
+ }
501
+ if ((_base5 = this.options).uglify == null) {
502
+ _base5.uglify = false;
503
+ }
504
+ if ((_base6 = this.options).basename == null) {
505
+ _base6.basename = false;
506
+ }
507
+ if ((_base7 = this.options).extendScope == null) {
508
+ _base7.extendScope = false;
509
+ }
510
+ if ((_base8 = this.options).format == null) {
511
+ _base8.format = 'html5';
512
+ }
513
+ if ((_base9 = this.options).hyphenateDataAttrs == null) {
514
+ _base9.hyphenateDataAttrs = true;
515
+ }
516
+ if ((_base10 = this.options).preserveTags == null) {
517
+ _base10.preserveTags = 'pre,textarea';
518
+ }
519
+ if ((_base11 = this.options).selfCloseTags == null) {
520
+ _base11.selfCloseTags = 'meta,img,link,br,hr,input,area,param,col,base';
521
+ }
522
+ if (this.options.placement === 'global') {
523
+ if ((_base12 = this.options).name == null) {
524
+ _base12.name = 'test';
525
+ }
526
+ if ((_base13 = this.options).namespace == null) {
527
+ _base13.namespace = 'window.HAML';
528
+ }
529
+ segments =
530
+ ("" + this.options.namespace + "." + this.options.name).replace(/(\s|-)+/g, '_').split(/\./);
531
+ this.options.name = this.options.basename ? segments.pop().split(/\/|\\/).pop() : segments.pop();
532
+ this.options.namespace = segments.shift();
533
+ this.intro = '';
534
+ if (segments.length !== 0) {
535
+ for (_i = 0, _len = segments.length; _i < _len; _i++) {
536
+ segment = segments[_i];
537
+ this.options.namespace += "." + segment;
538
+ this.intro += "" + this.options.namespace + " ?= {}\n";
539
+ }
540
+ } else {
541
+ this.intro += "" + this.options.namespace + " ?= {}\n";
542
+ }
543
+ }
544
+ }
545
+
546
+ HamlCoffee.prototype.indentChanged = function () {
547
+ return this.currentIndent !== this.previousIndent;
548
+ };
549
+
550
+ HamlCoffee.prototype.isIndent = function () {
551
+ return this.currentIndent > this.previousIndent;
552
+ };
553
+
554
+ HamlCoffee.prototype.updateTabSize = function () {
555
+ if (this.tabSize === 0) {
556
+ return this.tabSize = this.currentIndent - this.previousIndent;
557
+ }
558
+ };
559
+
560
+ HamlCoffee.prototype.updateBlockLevel = function () {
561
+ this.currentBlockLevel = this.currentIndent / this.tabSize;
562
+ if (!this.node.isCommented()) {
563
+ if (this.currentBlockLevel - Math.floor(this.currentBlockLevel) > 0) {
564
+ throw "Indentation error in line " + this.lineNumber;
565
+ }
566
+ if ((this.currentIndent - this.previousIndent) / this.tabSize > 1) {
567
+ throw "Block level too deep in line " + this.lineNumber;
568
+ }
569
+ }
570
+ return this.delta = this.previousBlockLevel - this.currentBlockLevel;
571
+ };
572
+
573
+ HamlCoffee.prototype.updateCodeBlockLevel = function (node) {
574
+ if (node instanceof Code) {
575
+ return this.currentCodeBlockLevel = node.codeBlockLevel + 1;
576
+ } else {
577
+ return this.currentCodeBlockLevel = node.codeBlockLevel;
578
+ }
579
+ };
580
+
581
+ HamlCoffee.prototype.updateParent = function () {
582
+ if (this.isIndent()) {
583
+ return this.pushParent();
584
+ } else {
585
+ return this.popParent();
586
+ }
587
+ };
588
+
589
+ HamlCoffee.prototype.pushParent = function () {
590
+ this.stack.push(this.parentNode);
591
+ return this.parentNode = this.node;
592
+ };
593
+
594
+ HamlCoffee.prototype.popParent = function () {
595
+ var i, _i, _ref, _results;
596
+ _results = [];
597
+ for (i = _i = 0, _ref = this.delta - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i =
598
+ 0 <= _ref ? ++_i : --_i) {
599
+ _results.push(this.parentNode = this.stack.pop());
600
+ }
601
+ return _results;
602
+ };
603
+
604
+ HamlCoffee.prototype.getNodeOptions = function (override) {
605
+ if (override == null) {
606
+ override = {};
607
+ }
608
+ return {
609
+ parentNode: override.parentNode || this.parentNode,
610
+ blockLevel: override.blockLevel || this.currentBlockLevel,
611
+ codeBlockLevel: override.codeBlockLevel || this.currentCodeBlockLevel,
612
+ escapeHtml: override.escapeHtml || this.options.escapeHtml,
613
+ escapeAttributes: override.escapeAttributes || this.options.escapeAttributes,
614
+ cleanValue: override.cleanValue || this.options.cleanValue,
615
+ format: override.format || this.options.format,
616
+ hyphenateDataAttrs: override.hyphenateDataAttrs || this.options.format,
617
+ preserveTags: override.preserveTags || this.options.preserveTags,
618
+ selfCloseTags: override.selfCloseTags || this.options.selfCloseTags,
619
+ uglify: override.uglify || this.options.uglify,
620
+ placement: override.placement || this.options.placement,
621
+ namespace: override.namespace || this.options.namespace,
622
+ name: override.name || this.options.name
623
+ };
624
+ };
625
+
626
+ HamlCoffee.prototype.nodeFactory = function (expression) {
627
+ var node, options, _ref;
628
+ if (expression == null) {
629
+ expression = '';
630
+ }
631
+ options = this.getNodeOptions();
632
+ if (expression.match(/^:(escaped|preserve|css|javascript|plain|cdata|coffeescript)/)) {
633
+ node = new Filter(expression, options);
634
+ } else if (expression.match(/^(\/|-#)(.*)/)) {
635
+ node = new Comment(expression, options);
636
+ } else if (expression.match(/^(-#|-|=|!=|\&=|~)\s*(.*)/)) {
637
+ node = new Code(expression, options);
638
+ } else if (expression.match(/^(%|#[^{]|\.|\!)(.*)/)) {
639
+ node = new Haml(expression, options);
640
+ } else if (expression.match(/^\+(.*)/)) {
641
+ node = new Directive(expression, options);
642
+ } else {
643
+ node = new Text(expression, options);
644
+ }
645
+ if ((_ref = options.parentNode) != null) {
646
+ _ref.addChild(node);
647
+ }
648
+ return node;
649
+ };
650
+
651
+ HamlCoffee.prototype.parse = function (source) {
652
+ var attributes, expression, line, lines, range, result, tabsize, text, ws, _i, _j, _len, _ref, _ref1, _results;
653
+ if (source == null) {
654
+ source = '';
655
+ }
656
+ this.lineNumber =
657
+ this.previousIndent = this.tabSize = this.currentBlockLevel = this.previousBlockLevel = 0;
658
+ this.currentCodeBlockLevel = this.previousCodeBlockLevel = 0;
659
+ this.node = null;
660
+ this.stack = [];
661
+ this.root = this.parentNode = new Node('', this.getNodeOptions());
662
+ lines = source.replace(/\r/g, '').split("\n");
663
+ while ((line = lines.shift()) !== void 0) {
664
+ if ((this.node instanceof Filter) && !this.exitFilter) {
665
+ if (/^(\s)*$/.test(line)) {
666
+ this.node.addChild(new Text('', this.getNodeOptions({
667
+ parentNode: this.node
668
+ })));
669
+ } else {
670
+ result = line.match(/^(\s*)(.*)/);
671
+ ws = result[1];
672
+ expression = result[2];
673
+ if (this.node.blockLevel >= (ws.length / 2)) {
674
+ this.exitFilter = true;
675
+ lines.unshift(line);
676
+ continue;
677
+ }
678
+ range = this.tabSize > 2 ? (function () {
679
+ _results = [];
680
+ for (var _i = _ref = this.tabSize; _ref <= 1 ? _i <= 1 : _i >= 1; _ref <= 1 ? _i++ :
681
+ _i--) {
682
+ _results.push(_i);
683
+ }
684
+ return _results;
685
+ }).apply(this) : [2, 1];
686
+ for (_j = 0, _len = range.length; _j < _len; _j++) {
687
+ tabsize = range[_j];
688
+ text = line.match(RegExp("^\\s{" + ((this.node.blockLevel * tabsize) + tabsize) +
689
+ "}(.*)"));
690
+ if (text) {
691
+ this.node.addChild(new Text(text[1], this.getNodeOptions({
692
+ parentNode: this.node
693
+ })));
694
+ break;
695
+ }
696
+ }
697
+ }
698
+ } else {
699
+ this.exitFilter = false;
700
+ result = line.match(/^(\s*)(.*)/);
701
+ ws = result[1];
702
+ expression = result[2];
703
+ this.currentIndent = ws.length;
704
+ if (/^\s*$/.test(line)) {
705
+ continue;
706
+ }
707
+ while (/^[%.#].*[{(]/.test(expression) &&
708
+ RegExp("^\\s{" + (this.previousIndent + (this.tabSize || 2)) + "}").test(lines[0]) &&
709
+ !/^(\s*)[-=&!~.%#</]/.test(lines[0]) &&
710
+ /([-\w]+[\w:-]*\w?)\s*=|('\w+[\w:-]*\w?')\s*=|("\w+[\w:-]*\w?")\s*=|(\w+[\w:-]*\w?):|('[-\w]+[\w:-]*\w?'):|("[-\w]+[\w:-]*\w?"):|:(\w+[\w:-]*\w?)\s*=>|:?'([-\w]+[\w:-]*\w?)'\s*=>|:?"([-\w]+[\w:-]*\w?)"\s*=>/.test(lines[0]) &&
711
+ !/;\s*$/.test(lines[0])) {
712
+ attributes = lines.shift();
713
+ expression = expression.replace(/(\s)+\|\s*$/, '');
714
+ expression += ' ' + attributes.match(/^\s*(.*?)(\s+\|\s*)?$/)[1];
715
+ this.lineNumber++;
716
+ }
717
+ while (/^-#/.test(expression) &&
718
+ RegExp("^\\s{" + (this.currentIndent + (this.tabSize || 2)) + "}").test(lines[0]) &&
719
+ lines.length > 0) {
720
+ lines.shift();
721
+ this.lineNumber++;
722
+ }
723
+ if (expression.match(/(\s)+\|\s*$/)) {
724
+ expression = expression.replace(/(\s)+\|\s*$/, ' ');
725
+ while ((_ref1 = lines[0]) != null ? _ref1.match(/(\s)+\|$/) : void 0) {
726
+ expression += lines.shift().match(/^(\s*)(.*)/)[2].replace(/(\s)+\|\s*$/, '');
727
+ this.lineNumber++;
728
+ }
729
+ }
730
+ if (this.indentChanged()) {
731
+ this.updateTabSize();
732
+ this.updateBlockLevel();
733
+ this.updateParent();
734
+ this.updateCodeBlockLevel(this.parentNode);
735
+ }
736
+ this.node = this.nodeFactory(expression);
737
+ this.previousBlockLevel = this.currentBlockLevel;
738
+ this.previousIndent = this.currentIndent;
739
+ }
740
+ this.lineNumber++;
741
+ }
742
+ return this.evaluate(this.root);
743
+ };
744
+
745
+ HamlCoffee.prototype.evaluate = function (node) {
746
+ var child, _i, _len, _ref;
747
+ _ref = node.children;
748
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
749
+ child = _ref[_i];
750
+ this.evaluate(child);
751
+ }
752
+ return node.evaluate();
753
+ };
754
+
755
+ HamlCoffee.prototype.render = function () {
756
+ switch (this.options.placement) {
757
+ case 'amd':
758
+ return this.renderAmd();
759
+ case 'standalone':
760
+ return this.renderStandalone();
761
+ default:
762
+ return this.renderGlobal();
763
+ }
764
+ };
765
+
766
+ HamlCoffee.prototype.renderStandalone = function () {
767
+ var template;
768
+ return template =
769
+ "return (context) ->\n (->\n" + (indent(this.precompile(), 2)) + "\n ).call(context)";
770
+ };
771
+
772
+ HamlCoffee.prototype.renderAmd = function () {
773
+ var m, module, modules, param, params, template, _ref, _ref1;
774
+ if (/^hamlcoffee/.test(this.options.dependencies['hc'])) {
775
+ this.options.customHtmlEscape = 'hc.escape';
776
+ this.options.customCleanValue = 'hc.cleanValue';
777
+ this.options.customPreserve = 'hc.preserve';
778
+ this.options.customFindAndPreserve = 'hc.findAndPreserve';
779
+ this.options.customSurround = 'hc.surround';
780
+ this.options.customSucceed = 'hc.succeed';
781
+ this.options.customPrecede = 'hc.precede';
782
+ this.options.customReference = 'hc.reference';
783
+ }
784
+ modules = [];
785
+ params = [];
786
+ _ref = this.options.dependencies;
787
+ for (param in _ref) {
788
+ module = _ref[param];
789
+ modules.push(module);
790
+ params.push(param);
791
+ }
792
+ if (this.options.extendScope) {
793
+ template = " `with (context || {}) {`\n" + (indent(this.precompile(), 1)) + "\n`}`";
794
+ } else {
795
+ template = this.precompile();
796
+ }
797
+ _ref1 = this.findDependencies(template);
798
+ for (param in _ref1) {
799
+ module = _ref1[param];
800
+ modules.push(module);
801
+ params.push(param);
802
+ }
803
+ if (modules.length !== 0) {
804
+ modules = (function () {
805
+ var _i, _len, _results;
806
+ _results = [];
807
+ for (_i = 0, _len = modules.length; _i < _len; _i++) {
808
+ m = modules[_i];
809
+ _results.push("'" + m + "'");
810
+ }
811
+ return _results;
812
+ })();
813
+ modules = "[" + modules + "], (" + (params.join(', ')) + ")";
814
+ } else {
815
+ modules = '';
816
+ }
817
+ return "define " + modules + " ->\n (context) ->\n render = ->\n \n" + (indent(template, 4)) +
818
+ "\n render.call(context)";
819
+ };
820
+
821
+ HamlCoffee.prototype.renderGlobal = function () {
822
+ var template;
823
+ template = this.intro;
824
+ if (this.options.extendScope) {
825
+ template += "" + this.options.namespace + "['" + this.options.name + "'] = (context) -> ( ->\n";
826
+ template += " `with (context || {}) {`\n";
827
+ template += "" + (indent(this.precompile(), 1));
828
+ template += "`}`\n";
829
+ template += ").call(context)";
830
+ } else {
831
+ template += "" + this.options.namespace + "['" + this.options.name + "'] = (context) -> ( ->\n";
832
+ template += "" + (indent(this.precompile(), 1));
833
+ template += ").call(context)";
834
+ }
835
+ return template;
836
+ };
837
+
838
+ HamlCoffee.prototype.precompile = function () {
839
+ var code, fn;
840
+ fn = '';
841
+ code = this.createCode();
842
+ if (code.indexOf('$e') !== -1) {
843
+ if (this.options.customHtmlEscape) {
844
+ fn += "$e = " + this.options.customHtmlEscape + "\n";
845
+ } else {
846
+ fn +=
847
+ "$e = (text, escape) ->\n \"\#{ text }\"\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\'/g, '&#39;')\n .replace(/\\//g, '&#47;')\n .replace(/\"/g, '&quot;')\n";
848
+ }
849
+ }
850
+ if (code.indexOf('$c') !== -1) {
851
+ if (this.options.customCleanValue) {
852
+ fn += "$c = " + this.options.customCleanValue + "\n";
853
+ } else {
854
+ fn += "$c = (text) ->\n";
855
+ fn += " switch text\n";
856
+ fn += " when null, undefined then ''\n";
857
+ fn += " when true, false then '\u0093' + text\n";
858
+ fn += " else text\n";
859
+ }
860
+ }
861
+ if (code.indexOf('$p') !== -1 || code.indexOf('$fp') !== -1) {
862
+ if (this.options.customPreserve) {
863
+ fn += "$p = " + this.options.customPreserve + "\n";
864
+ } else {
865
+ fn += "$p = (text) -> text.replace /\\n/g, '&#x000A;'\n";
866
+ }
867
+ }
868
+ if (code.indexOf('$fp') !== -1) {
869
+ if (this.options.customFindAndPreserve) {
870
+ fn += "$fp = " + this.options.customFindAndPreserve + "\n";
871
+ } else {
872
+ fn += "$fp = (text) ->\n text.replace /<(" + (this.options.preserveTags.split(',').join('|')) +
873
+ ")>([^]*?)<\\/\\1>/g, (str, tag, content) ->\n \"<\#{ tag }>\#{ $p content }</\#{ tag }>\"\n";
874
+ }
875
+ }
876
+ if (code.indexOf('surround') !== -1) {
877
+ if (this.options.customSurround) {
878
+ fn += "surround = (start, end, fn) => " + this.options.customSurround +
879
+ ".call(@, start, end, fn)\n";
880
+ } else {
881
+ fn += "surround = (start, end, fn) => start + fn.call(@)?.replace(/^\\s+|\\s+$/g, '') + end\n";
882
+ }
883
+ }
884
+ if (code.indexOf('succeed') !== -1) {
885
+ if (this.options.customSucceed) {
886
+ fn += "succeed = (start, end, fn) => " + this.options.customSucceed +
887
+ ".call(@, start, end, fn)\n";
888
+ } else {
889
+ fn += "succeed = (end, fn) => fn.call(@)?.replace(/\s+$/g, '') + end\n";
890
+ }
891
+ }
892
+ if (code.indexOf('precede') !== -1) {
893
+ if (this.options.customPrecede) {
894
+ fn += "precede = (start, end, fn) => " + this.options.customPrecede +
895
+ ".call(@, start, end, fn)\n";
896
+ } else {
897
+ fn += "precede = (start, fn) => start + fn.call(@)?.replace(/^\s+/g, '')\n";
898
+ }
899
+ }
900
+ if (code.indexOf('$r') !== -1) {
901
+ if (this.options.customReference) {
902
+ fn += "$r = " + this.options.customReference + "\n";
903
+ } else {
904
+ fn +=
905
+ "$r = (object, prefix) ->\n name = if prefix then prefix + '_' else ''\n\n if typeof(object.hamlObjectRef) is 'function'\n name += object.hamlObjectRef()\n else\n name += (object.constructor?.name || 'object').replace(/\W+/g, '_').replace(/([a-z\d])([A-Z])/g, '$1_$2').toLowerCase()\n\n id = if typeof(object.to_key) is 'function'\n object.to_key()\n else if typeof(object.id) is 'function'\n object.id()\n else if object.id\n object.id\n else\n object\n\n result = \"class='\#{ name }'\"\n result += \" id='\#{ name }_\#{ id }'\" if id\n";
906
+ }
907
+ }
908
+ fn += "$o = []\n";
909
+ fn += "" + code + "\n";
910
+ return fn +=
911
+ "return $o.join(\"\\n\")" + (this.convertBooleans(code)) + (this.removeEmptyIDAndClass(code)) +
912
+ (this.cleanupWhitespace(code)) + "\n";
913
+ };
914
+
915
+ HamlCoffee.prototype.createCode = function () {
916
+ var child, code, line, processors, _i, _j, _len, _len1, _ref, _ref1;
917
+ code = [];
918
+ this.lines = [];
919
+ _ref = this.root.children;
920
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
921
+ child = _ref[_i];
922
+ this.lines = this.lines.concat(child.render());
923
+ }
924
+ this.lines = this.combineText(this.lines);
925
+ this.blockLevel = 0;
926
+ _ref1 = this.lines;
927
+ for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
928
+ line = _ref1[_j];
929
+ if (line !== null) {
930
+ switch (line.type) {
931
+ case 'text':
932
+ code.push("" + (whitespace(line.cw)) + (this.getBuffer(this.blockLevel)) + ".push \"" +
933
+ (whitespace(line.hw)) + line.text + "\"");
934
+ break;
935
+ case 'run':
936
+ if (line.block !== 'end') {
937
+ code.push("" + (whitespace(line.cw)) + line.code);
938
+ } else {
939
+ code.push("" + (whitespace(line.cw)) +
940
+ (line.code.replace('$buffer', this.getBuffer(this.blockLevel))));
941
+ this.blockLevel -= 1;
942
+ }
943
+ break;
944
+ case 'insert':
945
+ processors = '';
946
+ if (line.findAndPreserve) {
947
+ processors += '$fp ';
948
+ }
949
+ if (line.preserve) {
950
+ processors += '$p ';
951
+ }
952
+ if (line.escape) {
953
+ processors += '$e ';
954
+ }
955
+ if (this.options.cleanValue) {
956
+ processors += '$c ';
957
+ }
958
+ code.push("" + (whitespace(line.cw)) + (this.getBuffer(this.blockLevel)) + ".push \"" +
959
+ (whitespace(line.hw)) + "\" + " + processors + line.code);
960
+ if (line.block === 'start') {
961
+ this.blockLevel += 1;
962
+ code.push("" + (whitespace(line.cw + 1)) + (this.getBuffer(this.blockLevel)) +
963
+ " = []");
964
+ }
965
+ }
966
+ }
967
+ }
968
+ return code.join('\n');
969
+ };
970
+
971
+ HamlCoffee.prototype.getBuffer = function (level) {
972
+ if (level > 0) {
973
+ return "$o" + level;
974
+ } else {
975
+ return '$o';
976
+ }
977
+ };
978
+
979
+ HamlCoffee.prototype.combineText = function (lines) {
980
+ var combined, line, nextLine;
981
+ combined = [];
982
+ while ((line = lines.shift()) !== void 0) {
983
+ if (line.type === 'text') {
984
+ while (lines[0] && lines[0].type === 'text' && line.cw === lines[0].cw) {
985
+ nextLine = lines.shift();
986
+ line.text += "\\n" + (whitespace(nextLine.hw)) + nextLine.text;
987
+ }
988
+ }
989
+ combined.push(line);
990
+ }
991
+ return combined;
992
+ };
993
+
994
+ HamlCoffee.prototype.convertBooleans = function (code) {
995
+ if (code.indexOf('$c') !== -1 && !this.options.customCleanValue) {
996
+ if (this.options.format === 'xhtml') {
997
+ return '.replace(/\\s([\\w-]+)=\'\u0093true\'/mg, " $1=\'$1\'").replace(/\\s([\\w-]+)=\'\u0093false\'/mg, \'\')';
998
+ } else {
999
+ return '.replace(/\\s([\\w-]+)=\'\u0093true\'/mg, \' $1\').replace(/\\s([\\w-]+)=\'\u0093false\'/mg, \'\')';
1000
+ }
1001
+ } else {
1002
+ return '';
1003
+ }
1004
+ };
1005
+
1006
+ HamlCoffee.prototype.removeEmptyIDAndClass = function (code) {
1007
+ if (code.indexOf('id=') !== -1 || code.indexOf('class=') !== -1) {
1008
+ return '.replace(/\\s(?:id|class)=([\'"])(\\1)/mg, "")';
1009
+ } else {
1010
+ return '';
1011
+ }
1012
+ };
1013
+
1014
+ HamlCoffee.prototype.cleanupWhitespace = function (code) {
1015
+ if (/\u0091|\u0092/.test(code)) {
1016
+ return ".replace(/[\\s\\n]*\\u0091/mg, '').replace(/\\u0092[\\s\\n]*/mg, '')";
1017
+ } else {
1018
+ return '';
1019
+ }
1020
+ };
1021
+
1022
+ HamlCoffee.prototype.findDependencies = function (code) {
1023
+ var dependencies, match, module, name, requireRegexp;
1024
+ requireRegexp = /require(?:\s+|\()(['"])(.+?)(\1)\)?/gm;
1025
+ dependencies = {};
1026
+ while (match = requireRegexp.exec(code)) {
1027
+ module = match[2];
1028
+ name = module.split('/').pop();
1029
+ dependencies[name] = module;
1030
+ }
1031
+ return dependencies;
1032
+ };
1033
+
1034
+ return HamlCoffee;
1035
+
1036
+ })();
1037
+
1038
+ }).call(this);
1039
+
1040
+ });
1041
+
1042
+ require.define("/nodes/node.coffee", function (require, module, exports, __dirname, __filename, process, global) {
1043
+ (function () {
1044
+ var Node, escapeHTML;
1045
+
1046
+ escapeHTML = require('../util/text').escapeHTML;
1047
+
1048
+ module.exports = Node = (function () {
1049
+ Node.CLEAR_WHITESPACE_LEFT = '\u0091';
1050
+
1051
+ Node.CLEAR_WHITESPACE_RIGHT = '\u0092';
1052
+
1053
+ function Node(expression, options) {
1054
+ this.expression = expression != null ? expression : '';
1055
+ if (options == null) {
1056
+ options = {};
1057
+ }
1058
+ this.parentNode = options.parentNode;
1059
+ this.children = [];
1060
+ this.opener = this.closer = null;
1061
+ this.silent = false;
1062
+ this.preserveTags = options.preserveTags.split(',');
1063
+ this.preserve = false;
1064
+ this.wsRemoval = {
1065
+ around: false,
1066
+ inside: false
1067
+ };
1068
+ this.escapeHtml = options.escapeHtml;
1069
+ this.escapeAttributes = options.escapeAttributes;
1070
+ this.cleanValue = options.cleanValue;
1071
+ this.format = options.format;
1072
+ this.hyphenateDataAttrs = options.hyphenateDataAttrs;
1073
+ this.selfCloseTags = options.selfCloseTags.split(',');
1074
+ this.uglify = options.uglify;
1075
+ this.codeBlockLevel = options.codeBlockLevel;
1076
+ this.blockLevel = options.blockLevel;
1077
+ this.placement = options.placement;
1078
+ this.namespace = options.namespace;
1079
+ this.name = options.name;
1080
+ }
1081
+
1082
+ Node.prototype.addChild = function (child) {
1083
+ this.children.push(child);
1084
+ return this;
1085
+ };
1086
+
1087
+ Node.prototype.getOpener = function () {
1088
+ if (this.wsRemoval.around && this.opener.text) {
1089
+ this.opener.text = Node.CLEAR_WHITESPACE_LEFT + this.opener.text;
1090
+ }
1091
+ if (this.wsRemoval.inside && this.opener.text) {
1092
+ this.opener.text += Node.CLEAR_WHITESPACE_RIGHT;
1093
+ }
1094
+ return this.opener;
1095
+ };
1096
+
1097
+ Node.prototype.getCloser = function () {
1098
+ if (this.wsRemoval.inside && this.closer.text) {
1099
+ this.closer.text = Node.CLEAR_WHITESPACE_LEFT + this.closer.text;
1100
+ }
1101
+ if (this.wsRemoval.around && this.closer.text) {
1102
+ this.closer.text += Node.CLEAR_WHITESPACE_RIGHT;
1103
+ }
1104
+ return this.closer;
1105
+ };
1106
+
1107
+ Node.prototype.isPreserved = function () {
1108
+ if (this.preserve) {
1109
+ return true;
1110
+ }
1111
+ if (this.parentNode) {
1112
+ return this.parentNode.isPreserved();
1113
+ } else {
1114
+ return false;
1115
+ }
1116
+ };
1117
+
1118
+ Node.prototype.isCommented = function () {
1119
+ if (this.constructor.name === 'Comment') {
1120
+ return true;
1121
+ }
1122
+ if (this.parentNode) {
1123
+ return this.parentNode.isCommented();
1124
+ } else {
1125
+ return false;
1126
+ }
1127
+ };
1128
+
1129
+ Node.prototype.markText = function (text, escape) {
1130
+ if (escape == null) {
1131
+ escape = false;
1132
+ }
1133
+ return {
1134
+ type: 'text',
1135
+ cw: this.codeBlockLevel,
1136
+ hw: this.uglify ? 0 : this.blockLevel - this.codeBlockLevel,
1137
+ text: escape ? escapeHTML(text) : text
1138
+ };
1139
+ };
1140
+
1141
+ Node.prototype.markRunningCode = function (code) {
1142
+ return {
1143
+ type: 'run',
1144
+ cw: this.codeBlockLevel,
1145
+ code: code
1146
+ };
1147
+ };
1148
+
1149
+ Node.prototype.markInsertingCode = function (code, escape, preserve, findAndPreserve) {
1150
+ if (escape == null) {
1151
+ escape = false;
1152
+ }
1153
+ if (preserve == null) {
1154
+ preserve = false;
1155
+ }
1156
+ if (findAndPreserve == null) {
1157
+ findAndPreserve = false;
1158
+ }
1159
+ return {
1160
+ type: 'insert',
1161
+ cw: this.codeBlockLevel,
1162
+ hw: this.uglify ? 0 : this.blockLevel - this.codeBlockLevel,
1163
+ escape: escape,
1164
+ preserve: preserve,
1165
+ findAndPreserve: findAndPreserve,
1166
+ code: code
1167
+ };
1168
+ };
1169
+
1170
+ Node.prototype.evaluate = function () {
1171
+ };
1172
+
1173
+ Node.prototype.render = function () {
1174
+ var child, output, rendered, tag, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref, _ref1, _ref2, _ref3, _ref4;
1175
+ output = [];
1176
+ if (this.silent) {
1177
+ return output;
1178
+ }
1179
+ if (this.children.length === 0) {
1180
+ if (this.opener && this.closer) {
1181
+ tag = this.getOpener();
1182
+ tag.text += this.getCloser().text;
1183
+ output.push(tag);
1184
+ } else {
1185
+ if (!this.preserve && this.isPreserved()) {
1186
+ output.push(this.getOpener());
1187
+ } else {
1188
+ output.push(this.getOpener());
1189
+ }
1190
+ }
1191
+ } else {
1192
+ if (this.opener && this.closer) {
1193
+ if (this.preserve) {
1194
+ this.wsRemoval.inside = true;
1195
+ output.push(this.getOpener());
1196
+ _ref = this.children;
1197
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
1198
+ child = _ref[_i];
1199
+ _ref1 = child.render();
1200
+ for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
1201
+ rendered = _ref1[_j];
1202
+ rendered.hw = this.blockLevel;
1203
+ output.push(rendered);
1204
+ }
1205
+ }
1206
+ output.push(this.getCloser());
1207
+ } else {
1208
+ output.push(this.getOpener());
1209
+ _ref2 = this.children;
1210
+ for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
1211
+ child = _ref2[_k];
1212
+ output = output.concat(child.render());
1213
+ }
1214
+ output.push(this.getCloser());
1215
+ }
1216
+ } else if (this.opener) {
1217
+ output.push(this.getOpener());
1218
+ _ref3 = this.children;
1219
+ for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) {
1220
+ child = _ref3[_l];
1221
+ output = output.concat(child.render());
1222
+ }
1223
+ } else {
1224
+ _ref4 = this.children;
1225
+ for (_m = 0, _len4 = _ref4.length; _m < _len4; _m++) {
1226
+ child = _ref4[_m];
1227
+ output.push(this.markText(child.render().text));
1228
+ }
1229
+ }
1230
+ }
1231
+ return output;
1232
+ };
1233
+
1234
+ return Node;
1235
+
1236
+ })();
1237
+
1238
+ }).call(this);
1239
+
1240
+ });
1241
+
1242
+ require.define("/util/text.coffee", function (require, module, exports, __dirname, __filename, process, global) {
1243
+ (function () {
1244
+ module.exports = {
1245
+ whitespace: function (n) {
1246
+ var a;
1247
+ n = n * 2;
1248
+ a = [];
1249
+ while (a.length < n) {
1250
+ a.push(' ');
1251
+ }
1252
+ return a.join('');
1253
+ },
1254
+ escapeQuotes: function (text) {
1255
+ if (!text) {
1256
+ return '';
1257
+ }
1258
+ return text.replace(/"/g, '\\"').replace(/\\\\\"/g, '\\"');
1259
+ },
1260
+ unescapeQuotes: function (text) {
1261
+ if (!text) {
1262
+ return '';
1263
+ }
1264
+ return text.replace(/\\"/g, '"');
1265
+ },
1266
+ escapeHTML: function (text) {
1267
+ if (!text) {
1268
+ return '';
1269
+ }
1270
+ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');
1271
+ },
1272
+ preserve: function (code) {
1273
+ if (code) {
1274
+ code.replace(/\r/g, '');
1275
+ return code.replace(/<(pre|textarea)>(.*?)<\/\1>/g, function (text) {
1276
+ return text.replace('\\n', '\&\#x000A;');
1277
+ });
1278
+ }
1279
+ },
1280
+ indent: function (text, spaces) {
1281
+ return text.replace(/^(.*)$/mg, module.exports.whitespace(spaces) + '$1');
1282
+ }
1283
+ };
1284
+
1285
+ }).call(this);
1286
+
1287
+ });
1288
+
1289
+ require.define("/nodes/text.coffee", function (require, module, exports, __dirname, __filename, process, global) {
1290
+ (function () {
1291
+ var Node, Text, escapeQuotes, _ref,
1292
+ __hasProp = {}.hasOwnProperty,
1293
+ __extends = function (child, parent) {
1294
+ for (var key in parent) {
1295
+ if (__hasProp.call(parent, key)) child[key] = parent[key];
1296
+ }
1297
+ function ctor() {
1298
+ this.constructor = child;
1299
+ }
1300
+
1301
+ ctor.prototype = parent.prototype;
1302
+ child.prototype = new ctor();
1303
+ child.__super__ = parent.prototype;
1304
+ return child;
1305
+ };
1306
+
1307
+ Node = require('./node');
1308
+
1309
+ escapeQuotes = require('../util/text').escapeQuotes;
1310
+
1311
+ module.exports = Text = (function (_super) {
1312
+ __extends(Text, _super);
1313
+
1314
+ function Text() {
1315
+ _ref = Text.__super__.constructor.apply(this, arguments);
1316
+ return _ref;
1317
+ }
1318
+
1319
+ Text.prototype.evaluate = function () {
1320
+ return this.opener = this.markText(escapeQuotes(this.expression));
1321
+ };
1322
+
1323
+ return Text;
1324
+
1325
+ })(Node);
1326
+
1327
+ }).call(this);
1328
+
1329
+ });
1330
+
1331
+ require.define("/nodes/haml.coffee", function (require, module, exports, __dirname, __filename, process, global) {
1332
+ (function () {
1333
+ var Haml, Node, escapeQuotes, _ref,
1334
+ __hasProp = {}.hasOwnProperty,
1335
+ __extends = function (child, parent) {
1336
+ for (var key in parent) {
1337
+ if (__hasProp.call(parent, key)) child[key] = parent[key];
1338
+ }
1339
+ function ctor() {
1340
+ this.constructor = child;
1341
+ }
1342
+
1343
+ ctor.prototype = parent.prototype;
1344
+ child.prototype = new ctor();
1345
+ child.__super__ = parent.prototype;
1346
+ return child;
1347
+ };
1348
+
1349
+ Node = require('./node');
1350
+
1351
+ escapeQuotes = require('../util/text').escapeQuotes;
1352
+
1353
+ module.exports = Haml = (function (_super) {
1354
+ __extends(Haml, _super);
1355
+
1356
+ function Haml() {
1357
+ _ref = Haml.__super__.constructor.apply(this, arguments);
1358
+ return _ref;
1359
+ }
1360
+
1361
+ Haml.prototype.evaluate = function () {
1362
+ var assignment, code, identifier, match, prefix, tokens;
1363
+ tokens = this.parseExpression(this.expression);
1364
+ if (tokens.doctype) {
1365
+ return this.opener = this.markText("" + (escapeQuotes(this.buildDocType(tokens.doctype))));
1366
+ } else {
1367
+ if (this.isNotSelfClosing(tokens.tag)) {
1368
+ prefix = this.buildHtmlTagPrefix(tokens);
1369
+ if (tokens.assignment) {
1370
+ match = tokens.assignment.match(/^(=|!=|&=|~)\s*(.*)$/);
1371
+ identifier = match[1];
1372
+ assignment = match[2];
1373
+ if (identifier === '~') {
1374
+ code = "\#{$fp " + assignment + " }";
1375
+ } else if (identifier === '&=' || (identifier === '=' && this.escapeHtml)) {
1376
+ if (this.preserve) {
1377
+ if (this.cleanValue) {
1378
+ code = "\#{ $p($e($c(" + assignment + "))) }";
1379
+ } else {
1380
+ code = "\#{ $p($e(" + assignment + ")) }";
1381
+ }
1382
+ } else {
1383
+ if (this.cleanValue) {
1384
+ code = "\#{ $e($c(" + assignment + ")) }";
1385
+ } else {
1386
+ code = "\#{ $e(" + assignment + ") }";
1387
+ }
1388
+ }
1389
+ } else if (identifier === '!=' || (identifier === '=' && !this.escapeHtml)) {
1390
+ if (this.preserve) {
1391
+ if (this.cleanValue) {
1392
+ code = "\#{ $p($c(" + assignment + ")) }";
1393
+ } else {
1394
+ code = "\#{ $p(" + assignment + ") }";
1395
+ }
1396
+ } else {
1397
+ if (this.cleanValue) {
1398
+ code = "\#{ $c(" + assignment + ") }";
1399
+ } else {
1400
+ code = "\#{ " + assignment + " }";
1401
+ }
1402
+ }
1403
+ }
1404
+ this.opener = this.markText("" + prefix + ">" + code);
1405
+ return this.closer = this.markText("</" + tokens.tag + ">");
1406
+ } else if (tokens.text) {
1407
+ this.opener = this.markText("" + prefix + ">" + tokens.text);
1408
+ return this.closer = this.markText("</" + tokens.tag + ">");
1409
+ } else {
1410
+ this.opener = this.markText(prefix + '>');
1411
+ return this.closer = this.markText("</" + tokens.tag + ">");
1412
+ }
1413
+ } else {
1414
+ tokens.tag = tokens.tag.replace(/\/$/, '');
1415
+ prefix = this.buildHtmlTagPrefix(tokens);
1416
+ if (tokens.text) {
1417
+ this.opener = this.markText("" + prefix + ">" + tokens.text);
1418
+ return this.closer = this.markText("</" + tokens.tag + ">");
1419
+ } else {
1420
+ return this.opener =
1421
+ this.markText("" + prefix + (this.format === 'xhtml' ? ' /' : '') + ">" + tokens.text);
1422
+ }
1423
+ }
1424
+ }
1425
+ };
1426
+
1427
+ Haml.prototype.parseExpression = function (exp) {
1428
+ var attributes, classes, id, key, tag, value, _ref1, _ref2;
1429
+ tag = this.parseTag(exp);
1430
+ if (this.preserveTags.indexOf(tag.tag) !== -1) {
1431
+ this.preserve = true;
1432
+ }
1433
+ id = this.interpolateCodeAttribute((_ref1 = tag.ids) != null ? _ref1.pop() : void 0, true);
1434
+ classes = tag.classes;
1435
+ attributes = {};
1436
+ if (tag.attributes) {
1437
+ _ref2 = tag.attributes;
1438
+ for (key in _ref2) {
1439
+ value = _ref2[key];
1440
+ if (key === 'id') {
1441
+ if (id) {
1442
+ id += '_' + this.interpolateCodeAttribute(value, true);
1443
+ } else {
1444
+ id = this.interpolateCodeAttribute(value, true);
1445
+ }
1446
+ } else if (key === 'class') {
1447
+ classes || (classes = []);
1448
+ classes.push(value);
1449
+ } else {
1450
+ attributes[key] = value;
1451
+ }
1452
+ }
1453
+ }
1454
+ return {
1455
+ doctype: tag.doctype,
1456
+ tag: tag.tag,
1457
+ id: id,
1458
+ classes: classes,
1459
+ text: escapeQuotes(tag.text),
1460
+ attributes: attributes,
1461
+ assignment: tag.assignment,
1462
+ reference: tag.reference
1463
+ };
1464
+ };
1465
+
1466
+ Haml.prototype.parseTag = function (exp) {
1467
+ var assignment, attr, attributes, ch, classes, doctype, end, error, haml, htmlAttributes, id, ids, key, klass, level, pos, reference, rest, rubyAttributes, start, tag, text, val, whitespace, _i, _j, _k, _len, _len1, _ref1, _ref2, _ref3, _ref4, _ref5;
1468
+ try {
1469
+ doctype = (_ref1 = exp.match(/^(\!{3}.*)/)) != null ? _ref1[1] : void 0;
1470
+ if (doctype) {
1471
+ return {
1472
+ doctype: doctype
1473
+ };
1474
+ }
1475
+ haml = exp.match(/^((?:[#%\.][a-z0-9_:\-]*[\/]?)+)/i)[0];
1476
+ rest = exp.substring(haml.length);
1477
+ if (rest.match(/^[{([]/)) {
1478
+ reference = '';
1479
+ htmlAttributes = '';
1480
+ rubyAttributes = '';
1481
+ _ref2 = ['[', '{', '(', '[', '{', '('];
1482
+ for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
1483
+ start = _ref2[_i];
1484
+ if (start === rest[0]) {
1485
+ end = (function () {
1486
+ switch (start) {
1487
+ case '{':
1488
+ return '}';
1489
+ case '(':
1490
+ return ')';
1491
+ case '[':
1492
+ return ']';
1493
+ }
1494
+ })();
1495
+ level = 0;
1496
+ for (pos = _j = 0, _ref3 = rest.length; 0 <= _ref3 ? _j <= _ref3 : _j >= _ref3; pos =
1497
+ 0 <= _ref3 ? ++_j : --_j) {
1498
+ ch = rest[pos];
1499
+ if (ch === start) {
1500
+ level += 1;
1501
+ }
1502
+ if (ch === end) {
1503
+ if (level === 1) {
1504
+ break;
1505
+ } else {
1506
+ level -= 1;
1507
+ }
1508
+ }
1509
+ }
1510
+ switch (start) {
1511
+ case '{':
1512
+ rubyAttributes += rest.substring(0, pos + 1);
1513
+ rest = rest.substring(pos + 1);
1514
+ break;
1515
+ case '(':
1516
+ htmlAttributes += rest.substring(0, pos + 1);
1517
+ rest = rest.substring(pos + 1);
1518
+ break;
1519
+ case '[':
1520
+ reference = rest.substring(1, pos);
1521
+ rest = rest.substring(pos + 1);
1522
+ }
1523
+ }
1524
+ }
1525
+ assignment = rest || '';
1526
+ } else {
1527
+ reference = '';
1528
+ htmlAttributes = '';
1529
+ rubyAttributes = '';
1530
+ assignment = rest;
1531
+ }
1532
+ attributes = {};
1533
+ _ref4 = [this.parseAttributes(htmlAttributes), this.parseAttributes(rubyAttributes)];
1534
+ for (_k = 0, _len1 = _ref4.length; _k < _len1; _k++) {
1535
+ attr = _ref4[_k];
1536
+ for (key in attr) {
1537
+ val = attr[key];
1538
+ attributes[key] = val;
1539
+ }
1540
+ }
1541
+ if (whitespace = (_ref5 = assignment.match(/^[<>]{0,2}/)) != null ? _ref5[0] : void 0) {
1542
+ assignment = assignment.substring(whitespace.length);
1543
+ }
1544
+ if (assignment[0] === ' ') {
1545
+ assignment = assignment.substring(1);
1546
+ }
1547
+ if (assignment && !assignment.match(/^(=|!=|&=|~)/)) {
1548
+ text = assignment.replace(/^ /, '');
1549
+ assignment = void 0;
1550
+ }
1551
+ if (whitespace) {
1552
+ if (whitespace.indexOf('>') !== -1) {
1553
+ this.wsRemoval.around = true;
1554
+ }
1555
+ if (whitespace.indexOf('<') !== -1) {
1556
+ this.wsRemoval.inside = true;
1557
+ this.preserve = true;
1558
+ }
1559
+ }
1560
+ tag = haml.match(/\%([a-z_\-][a-z0-9_:\-]*[\/]?)/i);
1561
+ ids = haml.match(/\#([a-z_\-][a-z0-9_\-]*)/gi);
1562
+ classes = haml.match(/\.([a-z0-9_\-]*)/gi);
1563
+ return {
1564
+ tag: tag ? tag[1] : 'div',
1565
+ ids: ids ? (function () {
1566
+ var _l, _len2, _results;
1567
+ _results = [];
1568
+ for (_l = 0, _len2 = ids.length; _l < _len2; _l++) {
1569
+ id = ids[_l];
1570
+ _results.push("'" + (id.substr(1)) + "'");
1571
+ }
1572
+ return _results;
1573
+ })() : void 0,
1574
+ classes: classes ? (function () {
1575
+ var _l, _len2, _results;
1576
+ _results = [];
1577
+ for (_l = 0, _len2 = classes.length; _l < _len2; _l++) {
1578
+ klass = classes[_l];
1579
+ _results.push("'" + (klass.substr(1)) + "'");
1580
+ }
1581
+ return _results;
1582
+ })() : void 0,
1583
+ attributes: attributes,
1584
+ assignment: assignment,
1585
+ reference: reference,
1586
+ text: text
1587
+ };
1588
+ } catch (_error) {
1589
+ error = _error;
1590
+ throw new Error("Unable to parse tag from " + exp + ": " + error);
1591
+ }
1592
+ };
1593
+
1594
+ Haml.prototype.parseAttributes = function (exp) {
1595
+ var attr, attributes, ch, endPos, hasDataAttribute, inDataAttribute, key, keyValue, keys, level, marker, markers, pairs, pos, quote, quoted, start, startPos, type, value, _i, _j, _k, _len, _len1, _ref1, _ref2, _ref3, _ref4, _ref5;
1596
+ attributes = {};
1597
+ if (exp === void 0) {
1598
+ return attributes;
1599
+ }
1600
+ type = exp.substring(0, 1);
1601
+ exp =
1602
+ exp.replace(/(=|:|=>)\s*('([^\\']|\\\\|\\')*'|"([^\\"]|\\\\|\\")*")/g, function (match, type, value) {
1603
+ return type + (value != null ? value.replace(/(:|=|=>)/g, '\u0090$1') : void 0);
1604
+ });
1605
+ level = 0;
1606
+ start = 0;
1607
+ markers = [];
1608
+ if (type === '(') {
1609
+ startPos = 1;
1610
+ endPos = exp.length - 1;
1611
+ } else {
1612
+ startPos = 0;
1613
+ endPos = exp.length;
1614
+ }
1615
+ for (pos = _i = startPos; startPos <= endPos ? _i < endPos : _i > endPos; pos =
1616
+ startPos <= endPos ? ++_i : --_i) {
1617
+ ch = exp[pos];
1618
+ if (ch === '(') {
1619
+ level += 1;
1620
+ if (level === 1) {
1621
+ start = pos;
1622
+ }
1623
+ }
1624
+ if (ch === ')') {
1625
+ if (level === 1) {
1626
+ if (start !== 0 && pos - start !== 1) {
1627
+ markers.push({
1628
+ start: start,
1629
+ end: pos
1630
+ });
1631
+ }
1632
+ } else {
1633
+ level -= 1;
1634
+ }
1635
+ }
1636
+ }
1637
+ _ref1 = markers.reverse();
1638
+ for (_j = 0, _len = _ref1.length; _j < _len; _j++) {
1639
+ marker = _ref1[_j];
1640
+ exp = exp.substring(0, marker.start) +
1641
+ exp.substring(marker.start, marker.end).replace(/(:|=|=>)/g, '\u0090$1') +
1642
+ exp.substring(marker.end);
1643
+ }
1644
+ switch (type) {
1645
+ case '(':
1646
+ keys =
1647
+ /\(\s*([-\w]+[\w:-]*\w?)\s*=|\s+([-\w]+[\w:-]*\w?)\s*=|\(\s*('\w+[\w:-]*\w?')\s*=|\s+('\w+[\w:-]*\w?')\s*=|\(\s*("\w+[\w:-]*\w?")\s*=|\s+("\w+[\w:-]*\w?")\s*=/g;
1648
+ break;
1649
+ case '{':
1650
+ keys =
1651
+ /[{,]\s*(\w+[\w:-]*\w?)\s*:|[{,]\s*('[-\w]+[\w:-]*\w?')\s*:|[{,]\s*("[-\w]+[\w:-]*\w?")\s*:|[{,]\s*:(\w+[\w:-]*\w?)\s*=>|[{,]\s*:?'([-\w]+[\w:-]*\w?)'\s*=>|[{,]\s*:?"([-\w]+[\w:-]*\w?)"\s*=>/g;
1652
+ }
1653
+ pairs = exp.split(keys).filter(Boolean);
1654
+ inDataAttribute = false;
1655
+ hasDataAttribute = false;
1656
+ while (pairs.length) {
1657
+ keyValue = pairs.splice(0, 2);
1658
+ if (keyValue.length === 1) {
1659
+ attr = keyValue[0].replace(/^[\s({]+|[\s)}]+$/g, '');
1660
+ attributes[attr] = 'true';
1661
+ } else {
1662
+ key = (_ref2 = keyValue[0]) != null ? _ref2.replace(/^\s+|\s+$/g, '').replace(/^:/, '') :
1663
+ void 0;
1664
+ if (quoted = key.match(/^("|')(.*)\1$/)) {
1665
+ key = quoted[2];
1666
+ }
1667
+ value = (_ref3 = keyValue[1]) != null ?
1668
+ _ref3.replace(/^\s+|[\s,]+$/g, '').replace(/\u0090/g, '') : void 0;
1669
+ if (key === 'data' && !value) {
1670
+ inDataAttribute = true;
1671
+ hasDataAttribute = true;
1672
+ } else if (key && value) {
1673
+ if (inDataAttribute) {
1674
+ key = this.hyphenateDataAttrs ? "data-" + (key.replace('_', '-')) : "data-" + key;
1675
+ if (/}\s*$/.test(value)) {
1676
+ inDataAttribute = false;
1677
+ }
1678
+ }
1679
+ }
1680
+ switch (type) {
1681
+ case '(':
1682
+ value = value.replace(/^\s+|[\s)]+$/g, '');
1683
+ quote = (_ref4 = /^(['"])/.exec(value)) != null ? _ref4[1] : void 0;
1684
+ pos = value.lastIndexOf(quote);
1685
+ if (pos > 1) {
1686
+ _ref5 = value.substring(pos + 1).split(' ');
1687
+ for (_k = 0, _len1 = _ref5.length; _k < _len1; _k++) {
1688
+ attr = _ref5[_k];
1689
+ if (attr) {
1690
+ attributes[attr] = 'true';
1691
+ }
1692
+ }
1693
+ value = value.substring(0, pos + 1);
1694
+ }
1695
+ attributes[key] = value;
1696
+ break;
1697
+ case '{':
1698
+ attributes[key] = value.replace(/^\s+|[\s}]+$/g, '');
1699
+ }
1700
+ }
1701
+ }
1702
+ if (hasDataAttribute) {
1703
+ delete attributes['data'];
1704
+ }
1705
+ return attributes;
1706
+ };
1707
+
1708
+ Haml.prototype.buildHtmlTagPrefix = function (tokens) {
1709
+ var classList, classes, hasDynamicClass, key, klass, name, tagParts, value, _i, _len, _ref1;
1710
+ tagParts = ["<" + tokens.tag];
1711
+ if (tokens.classes) {
1712
+ hasDynamicClass = false;
1713
+ classList = (function () {
1714
+ var _i, _len, _ref1, _results;
1715
+ _ref1 = tokens.classes;
1716
+ _results = [];
1717
+ for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
1718
+ name = _ref1[_i];
1719
+ name = this.interpolateCodeAttribute(name, true);
1720
+ if (name.indexOf('#{') !== -1) {
1721
+ hasDynamicClass = true;
1722
+ }
1723
+ _results.push(name);
1724
+ }
1725
+ return _results;
1726
+ }).call(this);
1727
+ if (hasDynamicClass && classList.length > 1) {
1728
+ classes = '#{ [';
1729
+ for (_i = 0, _len = classList.length; _i < _len; _i++) {
1730
+ klass = classList[_i];
1731
+ classes += "" + (this.quoteAndEscapeAttributeValue(klass, true)) + ",";
1732
+ }
1733
+ classes = classes.substring(0, classes.length - 1) +
1734
+ '].sort().join(\' \').replace(/^\\s+|\\s+$/g, \'\') }';
1735
+ } else {
1736
+ classes = classList.sort().join(' ');
1737
+ }
1738
+ tagParts.push("class='" + classes + "'");
1739
+ }
1740
+ if (tokens.id) {
1741
+ tagParts.push("id='" + tokens.id + "'");
1742
+ }
1743
+ if (tokens.reference) {
1744
+ if (tokens.attributes) {
1745
+ delete tokens.attributes['class'];
1746
+ delete tokens.attributes['id'];
1747
+ }
1748
+ tagParts.push("\#{$r(" + tokens.reference + ")}");
1749
+ }
1750
+ if (tokens.attributes) {
1751
+ _ref1 = tokens.attributes;
1752
+ for (key in _ref1) {
1753
+ value = _ref1[key];
1754
+ if (value === 'true' || value === 'false') {
1755
+ if (value === 'true') {
1756
+ if (this.format === 'html5') {
1757
+ tagParts.push("" + key);
1758
+ } else {
1759
+ tagParts.push("" + key + "=" + (this.quoteAndEscapeAttributeValue(key)));
1760
+ }
1761
+ }
1762
+ } else {
1763
+ tagParts.push("" + key + "=" +
1764
+ (this.quoteAndEscapeAttributeValue(this.interpolateCodeAttribute(value))));
1765
+ }
1766
+ }
1767
+ }
1768
+ return tagParts.join(' ');
1769
+ };
1770
+
1771
+ Haml.prototype.interpolateCodeAttribute = function (text, unwrap) {
1772
+ var quoted;
1773
+ if (unwrap == null) {
1774
+ unwrap = false;
1775
+ }
1776
+ if (!text) {
1777
+ return;
1778
+ }
1779
+ if (!text.match(/^("|').*\1$/)) {
1780
+ if (this.escapeAttributes) {
1781
+ if (this.cleanValue) {
1782
+ text = '#{ $e($c(' + text + ')) }';
1783
+ } else {
1784
+ text = '#{ $e(' + text + ') }';
1785
+ }
1786
+ } else {
1787
+ if (this.cleanValue) {
1788
+ text = '#{ $c(' + text + ') }';
1789
+ } else {
1790
+ text = '#{ (' + text + ') }';
1791
+ }
1792
+ }
1793
+ }
1794
+ if (unwrap) {
1795
+ if (quoted = text.match(/^("|')(.*)\1$/)) {
1796
+ text = quoted[2];
1797
+ }
1798
+ }
1799
+ return text;
1800
+ };
1801
+
1802
+ Haml.prototype.quoteAndEscapeAttributeValue = function (value, code) {
1803
+ var escaped, hasDoubleQuotes, hasInterpolation, hasSingleQuotes, quoted, result, token, tokens;
1804
+ if (code == null) {
1805
+ code = false;
1806
+ }
1807
+ if (!value) {
1808
+ return;
1809
+ }
1810
+ if (quoted = value.match(/^("|')(.*)\1$/)) {
1811
+ value = quoted[2];
1812
+ }
1813
+ tokens = this.splitInterpolations(value);
1814
+ hasSingleQuotes = false;
1815
+ hasDoubleQuotes = false;
1816
+ hasInterpolation = false;
1817
+ tokens = (function () {
1818
+ var _i, _len, _results;
1819
+ _results = [];
1820
+ for (_i = 0, _len = tokens.length; _i < _len; _i++) {
1821
+ token = tokens[_i];
1822
+ if (token.slice(0, 2) === '#{') {
1823
+ if (token.indexOf('$e') === -1 && token.indexOf('$c') === -1) {
1824
+ if (this.escapeAttributes) {
1825
+ if (this.cleanValue) {
1826
+ token = '#{ $e($c(' + token.slice(2, -1) + ')) }';
1827
+ } else {
1828
+ token = '#{ $e(' + token.slice(2, -1) + ') }';
1829
+ }
1830
+ } else {
1831
+ if (this.cleanValue) {
1832
+ token = '#{ $c(' + token.slice(2, -1) + ') }';
1833
+ }
1834
+ }
1835
+ }
1836
+ hasInterpolation = true;
1837
+ } else {
1838
+ if (!hasSingleQuotes) {
1839
+ hasSingleQuotes = token.indexOf("'") !== -1;
1840
+ }
1841
+ if (!hasDoubleQuotes) {
1842
+ hasDoubleQuotes = token.indexOf('"') !== -1;
1843
+ }
1844
+ }
1845
+ _results.push(token);
1846
+ }
1847
+ return _results;
1848
+ }).call(this);
1849
+ if (code) {
1850
+ if (hasInterpolation) {
1851
+ result = "\"" + (tokens.join('')) + "\"";
1852
+ } else {
1853
+ result = "'" + (tokens.join('')) + "'";
1854
+ }
1855
+ } else {
1856
+ if (!hasDoubleQuotes && !hasSingleQuotes) {
1857
+ result = "'" + (tokens.join('')) + "'";
1858
+ }
1859
+ if (hasSingleQuotes && !hasDoubleQuotes) {
1860
+ result = "\\\"" + (tokens.join('')) + "\\\"";
1861
+ }
1862
+ if (hasDoubleQuotes && !hasSingleQuotes) {
1863
+ escaped = (function () {
1864
+ var _i, _len, _results;
1865
+ _results = [];
1866
+ for (_i = 0, _len = tokens.length; _i < _len; _i++) {
1867
+ token = tokens[_i];
1868
+ _results.push(escapeQuotes(token));
1869
+ }
1870
+ return _results;
1871
+ })();
1872
+ result = "'" + (escaped.join('')) + "'";
1873
+ }
1874
+ if (hasSingleQuotes && hasDoubleQuotes) {
1875
+ escaped = (function () {
1876
+ var _i, _len, _results;
1877
+ _results = [];
1878
+ for (_i = 0, _len = tokens.length; _i < _len; _i++) {
1879
+ token = tokens[_i];
1880
+ _results.push(escapeQuotes(token).replace(/'/g, '&#39;'));
1881
+ }
1882
+ return _results;
1883
+ })();
1884
+ result = "'" + (escaped.join('')) + "'";
1885
+ }
1886
+ }
1887
+ return result;
1888
+ };
1889
+
1890
+ Haml.prototype.splitInterpolations = function (value) {
1891
+ var ch, ch2, level, pos, start, tokens, _i, _ref1;
1892
+ level = 0;
1893
+ start = 0;
1894
+ tokens = [];
1895
+ for (pos = _i = 0, _ref1 = value.length; 0 <= _ref1 ? _i < _ref1 : _i > _ref1; pos =
1896
+ 0 <= _ref1 ? ++_i : --_i) {
1897
+ ch = value[pos];
1898
+ ch2 = value.slice(pos, +(pos + 1) + 1 || 9e9);
1899
+ if (ch === '{') {
1900
+ level += 1;
1901
+ }
1902
+ if (ch2 === '#{' && level === 0) {
1903
+ tokens.push(value.slice(start, pos));
1904
+ start = pos;
1905
+ }
1906
+ if (ch === '}') {
1907
+ level -= 1;
1908
+ if (level === 0) {
1909
+ tokens.push(value.slice(start, +pos + 1 || 9e9));
1910
+ start = pos + 1;
1911
+ }
1912
+ }
1913
+ }
1914
+ tokens.push(value.slice(start, value.length));
1915
+ return tokens.filter(Boolean);
1916
+ };
1917
+
1918
+ Haml.prototype.buildDocType = function (doctype) {
1919
+ switch ("" + this.format + " " + doctype) {
1920
+ case 'xhtml !!! XML':
1921
+ return '<?xml version=\'1.0\' encoding=\'utf-8\' ?>';
1922
+ case 'xhtml !!!':
1923
+ return '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
1924
+ case 'xhtml !!! 1.1':
1925
+ return '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">';
1926
+ case 'xhtml !!! mobile':
1927
+ return '<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">';
1928
+ case 'xhtml !!! basic':
1929
+ return '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">';
1930
+ case 'xhtml !!! frameset':
1931
+ return '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">';
1932
+ case 'xhtml !!! 5':
1933
+ case 'html5 !!!':
1934
+ return '<!DOCTYPE html>';
1935
+ case 'html5 !!! XML':
1936
+ case 'html4 !!! XML':
1937
+ return '';
1938
+ case 'html4 !!!':
1939
+ return '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';
1940
+ case 'html4 !!! frameset':
1941
+ return '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">';
1942
+ case 'html4 !!! strict':
1943
+ return '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">';
1944
+ }
1945
+ };
1946
+
1947
+ Haml.prototype.isNotSelfClosing = function (tag) {
1948
+ return this.selfCloseTags.indexOf(tag) === -1 && !tag.match(/\/$/);
1949
+ };
1950
+
1951
+ return Haml;
1952
+
1953
+ })(Node);
1954
+
1955
+ }).call(this);
1956
+
1957
+ });
1958
+
1959
+ require.define("/nodes/code.coffee", function (require, module, exports, __dirname, __filename, process, global) {
1960
+ (function () {
1961
+ var Code, Node, _ref,
1962
+ __hasProp = {}.hasOwnProperty,
1963
+ __extends = function (child, parent) {
1964
+ for (var key in parent) {
1965
+ if (__hasProp.call(parent, key)) child[key] = parent[key];
1966
+ }
1967
+ function ctor() {
1968
+ this.constructor = child;
1969
+ }
1970
+
1971
+ ctor.prototype = parent.prototype;
1972
+ child.prototype = new ctor();
1973
+ child.__super__ = parent.prototype;
1974
+ return child;
1975
+ };
1976
+
1977
+ Node = require('./node');
1978
+
1979
+ module.exports = Code = (function (_super) {
1980
+ __extends(Code, _super);
1981
+
1982
+ function Code() {
1983
+ _ref = Code.__super__.constructor.apply(this, arguments);
1984
+ return _ref;
1985
+ }
1986
+
1987
+ Code.prototype.evaluate = function () {
1988
+ var code, codeBlock, escape, identifier;
1989
+ codeBlock = this.expression.match(/(-|!=|\&=|=|~)\s?(.*)?/);
1990
+ identifier = codeBlock[1];
1991
+ code = codeBlock[2];
1992
+ if (identifier === '-') {
1993
+ this.opener = this.markRunningCode(code);
1994
+ if (this.children.length !== 0 && this.opener.code.match(/(->|=>)/)) {
1995
+ return this.closer = this.markRunningCode(" ''");
1996
+ }
1997
+ } else if (identifier === '~') {
1998
+ if (this.escapeHtml) {
1999
+ return this.opener = this.markInsertingCode(code, true, false, true);
2000
+ } else {
2001
+ return this.opener = this.markInsertingCode(code, false, false, true);
2002
+ }
2003
+ } else {
2004
+ escape = identifier === '&=' || (identifier === '=' && this.escapeHtml);
2005
+ if (this.children.length !== 0 && code.match(/(->|=>)$/)) {
2006
+ this.opener = this.markInsertingCode(code, escape, false, false);
2007
+ this.opener.block = 'start';
2008
+ this.closer = this.markRunningCode(" $buffer.join \"\\n\"");
2009
+ return this.closer.block = 'end';
2010
+ } else {
2011
+ return this.opener = this.markInsertingCode(code, escape);
2012
+ }
2013
+ }
2014
+ };
2015
+
2016
+ return Code;
2017
+
2018
+ })(Node);
2019
+
2020
+ }).call(this);
2021
+
2022
+ });
2023
+
2024
+ require.define("/nodes/comment.coffee", function (require, module, exports, __dirname, __filename, process, global) {
2025
+ (function () {
2026
+ var Comment, Node, escapeQuotes, _ref,
2027
+ __hasProp = {}.hasOwnProperty,
2028
+ __extends = function (child, parent) {
2029
+ for (var key in parent) {
2030
+ if (__hasProp.call(parent, key)) child[key] = parent[key];
2031
+ }
2032
+ function ctor() {
2033
+ this.constructor = child;
2034
+ }
2035
+
2036
+ ctor.prototype = parent.prototype;
2037
+ child.prototype = new ctor();
2038
+ child.__super__ = parent.prototype;
2039
+ return child;
2040
+ };
2041
+
2042
+ Node = require('./node');
2043
+
2044
+ escapeQuotes = require('../util/text').escapeQuotes;
2045
+
2046
+ module.exports = Comment = (function (_super) {
2047
+ __extends(Comment, _super);
2048
+
2049
+ function Comment() {
2050
+ _ref = Comment.__super__.constructor.apply(this, arguments);
2051
+ return _ref;
2052
+ }
2053
+
2054
+ Comment.prototype.evaluate = function () {
2055
+ var comment, expression, identifier, _ref1;
2056
+ _ref1 = this.expression.match(/(-#|\/\[|\/)\s?(.*)?/), expression = _ref1[0], identifier =
2057
+ _ref1[1], comment = _ref1[2];
2058
+ switch (identifier) {
2059
+ case '-#':
2060
+ this.silent = true;
2061
+ return this.opener = this.markText('');
2062
+ case '\/[':
2063
+ this.opener = this.markText("<!--[" + comment + ">");
2064
+ return this.closer = this.markText('<![endif]-->');
2065
+ case '\/':
2066
+ if (comment) {
2067
+ this.opener = this.markText("<!-- " + (escapeQuotes(comment)));
2068
+ return this.closer = this.markText(' -->');
2069
+ } else {
2070
+ this.opener = this.markText("<!--");
2071
+ return this.closer = this.markText('-->');
2072
+ }
2073
+ }
2074
+ };
2075
+
2076
+ return Comment;
2077
+
2078
+ })(Node);
2079
+
2080
+ }).call(this);
2081
+
2082
+ });
2083
+
2084
+ require.define("/nodes/filter.coffee", function (require, module, exports, __dirname, __filename, process, global) {
2085
+ (function () {
2086
+ var Filter, Node, unescapeQuotes, whitespace, _ref,
2087
+ __hasProp = {}.hasOwnProperty,
2088
+ __extends = function (child, parent) {
2089
+ for (var key in parent) {
2090
+ if (__hasProp.call(parent, key)) child[key] = parent[key];
2091
+ }
2092
+ function ctor() {
2093
+ this.constructor = child;
2094
+ }
2095
+
2096
+ ctor.prototype = parent.prototype;
2097
+ child.prototype = new ctor();
2098
+ child.__super__ = parent.prototype;
2099
+ return child;
2100
+ };
2101
+
2102
+ Node = require('./node');
2103
+
2104
+ whitespace = require('../util/text').whitespace;
2105
+
2106
+ unescapeQuotes = require('../util/text').unescapeQuotes;
2107
+
2108
+ module.exports = Filter = (function (_super) {
2109
+ __extends(Filter, _super);
2110
+
2111
+ function Filter() {
2112
+ _ref = Filter.__super__.constructor.apply(this, arguments);
2113
+ return _ref;
2114
+ }
2115
+
2116
+ Filter.prototype.evaluate = function () {
2117
+ var _ref1;
2118
+ return this.filter = (_ref1 =
2119
+ this.expression.match(/:(escaped|preserve|css|javascript|coffeescript|plain|cdata|coffeescript)(.*)?/)) !=
2120
+ null ? _ref1[1] : void 0;
2121
+ };
2122
+
2123
+ Filter.prototype.render = function () {
2124
+ var child, indent, output, preserve, _i, _j, _len, _len1, _ref1, _ref2;
2125
+ output = [];
2126
+ switch (this.filter) {
2127
+ case 'escaped':
2128
+ _ref1 = this.children;
2129
+ for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
2130
+ child = _ref1[_i];
2131
+ output.push(this.markText(child.render()[0].text, true));
2132
+ }
2133
+ break;
2134
+ case 'preserve':
2135
+ preserve = '';
2136
+ _ref2 = this.children;
2137
+ for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
2138
+ child = _ref2[_j];
2139
+ preserve += "" + (child.render()[0].text) + "&#x000A;";
2140
+ }
2141
+ preserve = preserve.replace(/\&\#x000A;$/, '');
2142
+ output.push(this.markText(preserve));
2143
+ break;
2144
+ case 'plain':
2145
+ this.renderFilterContent(0, output);
2146
+ break;
2147
+ case 'css':
2148
+ if (this.format === 'html5') {
2149
+ output.push(this.markText('<style>'));
2150
+ } else {
2151
+ output.push(this.markText('<style type=\'text/css\'>'));
2152
+ }
2153
+ if (this.format === 'xhtml') {
2154
+ output.push(this.markText(' /*<![CDATA[*/'));
2155
+ }
2156
+ indent = this.format === 'xhtml' ? 2 : 1;
2157
+ this.renderFilterContent(indent, output);
2158
+ if (this.format === 'xhtml') {
2159
+ output.push(this.markText(' /*]]>*/'));
2160
+ }
2161
+ output.push(this.markText('</style>'));
2162
+ break;
2163
+ case 'javascript':
2164
+ if (this.format === 'html5') {
2165
+ output.push(this.markText('<script>'));
2166
+ } else {
2167
+ output.push(this.markText('<script type=\'text/javascript\'>'));
2168
+ }
2169
+ if (this.format === 'xhtml') {
2170
+ output.push(this.markText(' //<![CDATA['));
2171
+ }
2172
+ indent = this.format === 'xhtml' ? 2 : 1;
2173
+ this.renderFilterContent(indent, output);
2174
+ if (this.format === 'xhtml') {
2175
+ output.push(this.markText(' //]]>'));
2176
+ }
2177
+ output.push(this.markText('</script>'));
2178
+ break;
2179
+ case 'cdata':
2180
+ output.push(this.markText('<![CDATA['));
2181
+ this.renderFilterContent(2, output);
2182
+ output.push(this.markText(']]>'));
2183
+ break;
2184
+ case 'coffeescript':
2185
+ this.renderFilterContent(0, output, 'run');
2186
+ }
2187
+ return output;
2188
+ };
2189
+
2190
+ Filter.prototype.renderFilterContent = function (indent, output, type) {
2191
+ var child, content, e, empty, line, _i, _j, _k, _len, _len1, _ref1, _results;
2192
+ if (type == null) {
2193
+ type = 'text';
2194
+ }
2195
+ content = [];
2196
+ empty = 0;
2197
+ _ref1 = this.children;
2198
+ for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
2199
+ child = _ref1[_i];
2200
+ content.push(child.render()[0].text);
2201
+ }
2202
+ _results = [];
2203
+ for (_j = 0, _len1 = content.length; _j < _len1; _j++) {
2204
+ line = content[_j];
2205
+ if (line === '') {
2206
+ _results.push(empty += 1);
2207
+ } else {
2208
+ switch (type) {
2209
+ case 'text':
2210
+ for (e = _k = 0; 0 <= empty ? _k < empty : _k > empty; e = 0 <= empty ? ++_k : --_k) {
2211
+ output.push(this.markText(""));
2212
+ }
2213
+ output.push(this.markText("" + (whitespace(indent)) + line));
2214
+ break;
2215
+ case 'run':
2216
+ output.push(this.markRunningCode("" + (unescapeQuotes(line))));
2217
+ }
2218
+ _results.push(empty = 0);
2219
+ }
2220
+ }
2221
+ return _results;
2222
+ };
2223
+
2224
+ return Filter;
2225
+
2226
+ })(Node);
2227
+
2228
+ }).call(this);
2229
+
2230
+ });
2231
+
2232
+ require.define("/nodes/directive.coffee", function (require, module, exports, __dirname, __filename, process, global) {
2233
+ (function () {
2234
+ var CoffeeScript, Directive, Node, fs, path, _ref,
2235
+ __hasProp = {}.hasOwnProperty,
2236
+ __extends = function (child, parent) {
2237
+ for (var key in parent) {
2238
+ if (__hasProp.call(parent, key)) child[key] = parent[key];
2239
+ }
2240
+ function ctor() {
2241
+ this.constructor = child;
2242
+ }
2243
+
2244
+ ctor.prototype = parent.prototype;
2245
+ child.prototype = new ctor();
2246
+ child.__super__ = parent.prototype;
2247
+ return child;
2248
+ };
2249
+
2250
+ path = require('path');
2251
+
2252
+ Node = require('./node');
2253
+
2254
+ if (!process.browser) {
2255
+ fs = require('fs');
2256
+ CoffeeScript = require('coffee-script');
2257
+ }
2258
+
2259
+ module.exports = Directive = (function (_super) {
2260
+ __extends(Directive, _super);
2261
+
2262
+ function Directive() {
2263
+ _ref = Directive.__super__.constructor.apply(this, arguments);
2264
+ return _ref;
2265
+ }
2266
+
2267
+ Directive.prototype.directives = {
2268
+ include: function (expression) {
2269
+ var Compiler, code, compiler, context, e, error, name, source, statement, _ref1;
2270
+ try {
2271
+ _ref1 = expression.match(/\s*['"](.*?)['"](?:,\s*(.*))?\s*/), _ref1[0], name =
2272
+ _ref1[1], context = _ref1[2];
2273
+ } catch (_error) {
2274
+ e = _error;
2275
+ throw new Error("Failed to parse the include directive from " + expression);
2276
+ }
2277
+ if (!context) {
2278
+ context = 'this';
2279
+ }
2280
+ statement = (function () {
2281
+ switch (this.placement) {
2282
+ case 'global':
2283
+ return "" + this.namespace + "['" + name + "'](" + context + ")";
2284
+ case 'amd':
2285
+ return "require('" + name + "')(" + context + ")";
2286
+ case 'standalone':
2287
+ if (typeof browser !== "undefined" && browser !== null ? browser.process : void 0) {
2288
+ throw new Error("Include directive not available in the Browser when placement is standalone.");
2289
+ } else {
2290
+ try {
2291
+ source = fs.readFileSync(name).toString();
2292
+ } catch (_error) {
2293
+ error = _error;
2294
+ console.error(" Error opening file: %s", error);
2295
+ console.error(error);
2296
+ }
2297
+ Compiler = require('../haml-coffee');
2298
+ compiler = new Compiler(this.options);
2299
+ compiler.parse(source);
2300
+ code = CoffeeScript.compile(compiler.precompile(), {
2301
+ bare: true
2302
+ });
2303
+ return statement = "`(function(){" + code + "}).apply(" + context + ")`";
2304
+ }
2305
+ break;
2306
+ default:
2307
+ throw new Error("Include directive not available when placement is " + this.placement);
2308
+ }
2309
+ }).call(this);
2310
+ return this.opener = this.markInsertingCode(statement, false);
2311
+ }
2312
+ };
2313
+
2314
+ Directive.prototype.evaluate = function () {
2315
+ var directives, e, name, rest, _ref1;
2316
+ directives = Object.keys(this.directives).join('|');
2317
+ try {
2318
+ _ref1 = this.expression.match(RegExp("\\+(" + directives + ")(.*)")), _ref1[0], name =
2319
+ _ref1[1], rest = _ref1[2];
2320
+ } catch (_error) {
2321
+ e = _error;
2322
+ throw new Error("Unable to recognize directive from " + this.expression);
2323
+ }
2324
+ return this.directives[name].call(this, rest);
2325
+ };
2326
+
2327
+ return Directive;
2328
+
2329
+ })(Node);
2330
+
2331
+ }).call(this);
2332
+
2333
+ });
2334
+
2335
+ require.define("fs", function (require, module, exports, __dirname, __filename, process, global) {// nothing to see here... no file methods for the browser
2336
+
2337
+ });
2338
+
2339
+ require.define("/hamlc.coffee", function (require, module, exports, __dirname, __filename, process, global) {
2340
+ (function () {
2341
+ var CoffeeScript, Compiler, fs, __expressCache;
2342
+
2343
+ fs = require('fs');
2344
+
2345
+ Compiler = require('./haml-coffee');
2346
+
2347
+ if (process.browser) {
2348
+ CoffeeScript = window.CoffeeScript;
2349
+ } else {
2350
+ CoffeeScript = require('coffee-script');
2351
+ }
2352
+
2353
+ __expressCache = {};
2354
+
2355
+ module.exports = {
2356
+ render: function (source, context, options) {
2357
+ var compiler, template;
2358
+ if (context == null) {
2359
+ context = {};
2360
+ }
2361
+ if (options == null) {
2362
+ options = {};
2363
+ }
2364
+ options.placement = 'standalone';
2365
+ compiler = new Compiler(options);
2366
+ compiler.parse(source);
2367
+ template = new Function(CoffeeScript.compile(compiler.precompile(), {
2368
+ bare: true
2369
+ }));
2370
+ return template.call(context);
2371
+ },
2372
+ compile: function (source, options) {
2373
+ var compiler, template;
2374
+ if (options == null) {
2375
+ options = {};
2376
+ }
2377
+ compiler = new Compiler(options);
2378
+ compiler.parse(source);
2379
+ template = new Function(CoffeeScript.compile(compiler.precompile(), {
2380
+ bare: true
2381
+ }));
2382
+ return function (params) {
2383
+ return template.call(params);
2384
+ };
2385
+ },
2386
+ template: function (source, name, namespace, options) {
2387
+ var compiler;
2388
+ if (options == null) {
2389
+ options = {};
2390
+ }
2391
+ options.namespace = namespace;
2392
+ options.name = name;
2393
+ compiler = new Compiler(options);
2394
+ compiler.parse(source);
2395
+ return CoffeeScript.compile(compiler.render());
2396
+ },
2397
+ __express: function (filename, options, callback) {
2398
+ var err, source;
2399
+ if (!!(options && options.constructor && options.call && options.apply)) {
2400
+ callback = options;
2401
+ options = {};
2402
+ }
2403
+ try {
2404
+ if (options.cache && __expressCache[filename]) {
2405
+ return callback(null, __expressCache[filename](options));
2406
+ } else {
2407
+ options.filename = filename;
2408
+ source = fs.readFileSync(filename, 'utf8');
2409
+ if (options.cache) {
2410
+ __expressCache[filename] = module.exports.compile(source, options);
2411
+ return callback(null, __expressCache[filename](options));
2412
+ } else {
2413
+ return callback(null, module.exports.compile(source, options)(options));
2414
+ }
2415
+ }
2416
+ } catch (_error) {
2417
+ err = _error;
2418
+ return callback(err);
2419
+ }
2420
+ }
2421
+ };
2422
+
2423
+ }).call(this);
2424
+
2425
+ });
2426
+
2427
+ HamlCoffeeCompiler = require('./haml-coffee');
2428
+
2429
+ function compile(source, options) {
2430
+ var compiler = new HamlCoffeeCompiler(options);
2431
+ compiler.parse(source);
2432
+ return compiler.precompile();
2433
+ }