haml_coffee_assets 0.0.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -23,33 +23,33 @@ require._core = {
23
23
  require.resolve = (function () {
24
24
  return function (x, cwd) {
25
25
  if (!cwd) cwd = '/';
26
-
26
+
27
27
  if (require._core[x]) return x;
28
28
  var path = require.modules.path();
29
29
  var y = cwd || '.';
30
-
30
+
31
31
  if (x.match(/^(?:\.\.?\/|\/)/)) {
32
32
  var m = loadAsFileSync(path.resolve(y, x))
33
33
  || loadAsDirectorySync(path.resolve(y, x));
34
34
  if (m) return m;
35
35
  }
36
-
36
+
37
37
  var n = loadNodeModulesSync(x, y);
38
38
  if (n) return n;
39
-
39
+
40
40
  throw new Error("Cannot find module '" + x + "'");
41
-
41
+
42
42
  function loadAsFileSync (x) {
43
43
  if (require.modules[x]) {
44
44
  return x;
45
45
  }
46
-
46
+
47
47
  for (var i = 0; i < require.extensions.length; i++) {
48
48
  var ext = require.extensions[i];
49
49
  if (require.modules[x + ext]) return x + ext;
50
50
  }
51
51
  }
52
-
52
+
53
53
  function loadAsDirectorySync (x) {
54
54
  x = x.replace(/\/+$/, '');
55
55
  var pkgfile = x + '/package.json';
@@ -69,10 +69,10 @@ require.resolve = (function () {
69
69
  if (m) return m;
70
70
  }
71
71
  }
72
-
72
+
73
73
  return loadAsFileSync(x + '/index');
74
74
  }
75
-
75
+
76
76
  function loadNodeModulesSync (x, start) {
77
77
  var dirs = nodeModulesPathsSync(start);
78
78
  for (var i = 0; i < dirs.length; i++) {
@@ -82,23 +82,23 @@ require.resolve = (function () {
82
82
  var n = loadAsDirectorySync(dir + '/' + x);
83
83
  if (n) return n;
84
84
  }
85
-
85
+
86
86
  var m = loadAsFileSync(x);
87
87
  if (m) return m;
88
88
  }
89
-
89
+
90
90
  function nodeModulesPathsSync (start) {
91
91
  var parts;
92
92
  if (start === '/') parts = [ '' ];
93
93
  else parts = path.normalize(start).split('/');
94
-
94
+
95
95
  var dirs = [];
96
96
  for (var i = parts.length - 1; i >= 0; i--) {
97
97
  if (parts[i] === 'node_modules') continue;
98
98
  var dir = parts.slice(0, i + 1).join('/') + '/node_modules';
99
99
  dirs.push(dir);
100
100
  }
101
-
101
+
102
102
  return dirs;
103
103
  }
104
104
  };
@@ -114,9 +114,9 @@ require.alias = function (from, to) {
114
114
  res = require.resolve(from, '/');
115
115
  }
116
116
  var basedir = path.dirname(res);
117
-
117
+
118
118
  var keys = Object_keys(require.modules);
119
-
119
+
120
120
  for (var i = 0; i < keys.length; i++) {
121
121
  var key = keys[i];
122
122
  if (key.slice(0, basedir.length + 1) === basedir + '/') {
@@ -134,7 +134,7 @@ require.define = function (filename, fn) {
134
134
  ? ''
135
135
  : require.modules.path().dirname(filename)
136
136
  ;
137
-
137
+
138
138
  var require_ = function (file) {
139
139
  return require(file, dirname)
140
140
  };
@@ -144,7 +144,7 @@ require.define = function (filename, fn) {
144
144
  require_.modules = require.modules;
145
145
  require_.define = require.define;
146
146
  var module_ = { exports : {} };
147
-
147
+
148
148
  require.modules[filename] = function () {
149
149
  require.modules[filename]._cached = module_.exports;
150
150
  fn.call(
@@ -272,7 +272,7 @@ path = normalizeArray(filter(path.split('/'), function(p) {
272
272
  if (path && trailingSlash) {
273
273
  path += '/';
274
274
  }
275
-
275
+
276
276
  return (isAbsolute ? '/' : '') + path;
277
277
  };
278
278
 
@@ -322,58 +322,166 @@ exports.extname = function(path) {
322
322
  require.define("/nodes/node.js", function (require, module, exports, __dirname, __filename) {
323
323
  (function() {
324
324
  var Node, e, w;
325
- e = require('../helper').escape;
325
+
326
+ e = require('../helper').escapeHTML;
327
+
326
328
  w = require('../helper').whitespace;
329
+
327
330
  module.exports = Node = (function() {
328
- function Node(expression, block_level, code_block_level) {
329
- this.expression = expression;
330
- this.block_level = block_level;
331
- this.code_block_level = code_block_level;
331
+
332
+ Node.CLEAR_WHITESPACE_LEFT = '\u0091';
333
+
334
+ Node.CLEAR_WHITESPACE_RIGHT = '\u0092';
335
+
336
+ function Node(expression, options) {
337
+ this.expression = expression != null ? expression : '';
338
+ if (options == null) options = {};
339
+ this.parentNode = options.parentNode;
332
340
  this.children = [];
333
- this.opener = this.closer = "";
334
- this.cw = w(this.code_block_level);
335
- this.hw = w(this.block_level - this.code_block_level);
341
+ this.opener = this.closer = null;
342
+ this.silent = false;
343
+ this.preserve = false;
344
+ this.wsRemoval = {
345
+ around: false,
346
+ inside: false
347
+ };
348
+ this.escapeHtml = options.escapeHtml;
349
+ this.escapeAttributes = options.escapeAttributes;
350
+ this.format = options.format;
351
+ this.codeBlockLevel = options.codeBlockLevel;
352
+ this.blockLevel = options.blockLevel;
336
353
  }
354
+
337
355
  Node.prototype.addChild = function(child) {
338
356
  this.children.push(child);
339
357
  return this;
340
358
  };
359
+
341
360
  Node.prototype.getOpener = function() {
342
- this.evaluateIfNecessary();
361
+ if (this.wsRemoval.around && this.opener.text) {
362
+ this.opener.text = Node.CLEAR_WHITESPACE_LEFT + this.opener.text;
363
+ }
364
+ if (this.wsRemoval.inside && this.opener.text) {
365
+ this.opener.text += Node.CLEAR_WHITESPACE_RIGHT;
366
+ }
343
367
  return this.opener;
344
368
  };
369
+
345
370
  Node.prototype.getCloser = function() {
346
- this.evaluateIfNecessary();
371
+ if (this.wsRemoval.inside && this.closer.text) {
372
+ this.closer.text = Node.CLEAR_WHITESPACE_LEFT + this.closer.text;
373
+ }
374
+ if (this.wsRemoval.around && this.closer.text) {
375
+ this.closer.text += Node.CLEAR_WHITESPACE_RIGHT;
376
+ }
347
377
  return this.closer;
348
378
  };
349
- Node.prototype.evaluateIfNecessary = function() {
350
- if (!this.evaluated) {
351
- this.evaluate();
379
+
380
+ Node.prototype.isPreserved = function() {
381
+ if (this.preserve) return true;
382
+ if (this.parentNode) {
383
+ return this.parentNode.isPreserved();
384
+ } else {
385
+ return false;
352
386
  }
353
- return this.evaluated = true;
354
387
  };
388
+
389
+ Node.prototype.markText = function(text, escape) {
390
+ if (escape == null) escape = false;
391
+ return {
392
+ type: 'text',
393
+ cw: this.codeBlockLevel,
394
+ hw: this.blockLevel - this.codeBlockLevel + 2,
395
+ text: escape ? e(text) : text
396
+ };
397
+ };
398
+
399
+ Node.prototype.markRunningCode = function(code) {
400
+ return {
401
+ type: 'run',
402
+ cw: this.codeBlockLevel,
403
+ code: code
404
+ };
405
+ };
406
+
407
+ Node.prototype.markInsertingCode = function(code, escape) {
408
+ if (escape == null) escape = false;
409
+ return {
410
+ type: 'insert',
411
+ cw: this.codeBlockLevel,
412
+ hw: this.blockLevel,
413
+ escape: escape,
414
+ code: code
415
+ };
416
+ };
417
+
355
418
  Node.prototype.evaluate = function() {};
419
+
356
420
  Node.prototype.render = function() {
357
- var child, output, _i, _len, _ref;
358
- output = "" + (this.getOpener()) + "\n";
359
- _ref = this.children;
360
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
361
- child = _ref[_i];
362
- output += "" + (child.render());
363
- }
364
- if (this.getCloser().length > 0) {
365
- output += "" + (this.getCloser()) + "\n";
421
+ var child, output, preserve, tag, _i, _j, _k, _l, _len, _len2, _len3, _len4, _ref, _ref2, _ref3, _ref4;
422
+ output = [];
423
+ if (this.silent) return output;
424
+ if (this.children.length === 0) {
425
+ if (this.opener && this.closer) {
426
+ tag = this.getOpener();
427
+ tag.text += this.getCloser().text;
428
+ output.push(tag);
429
+ } else {
430
+ if (!this.preserve && this.isPreserved()) {
431
+ output.push(this.getOpener());
432
+ } else {
433
+ output.push(this.getOpener());
434
+ }
435
+ }
436
+ } else {
437
+ if (this.opener && this.closer) {
438
+ if (this.preserve) {
439
+ preserve = this.getOpener().text;
440
+ _ref = this.children;
441
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
442
+ child = _ref[_i];
443
+ preserve += "" + (child.render()[0].text) + "\\n" + (w(this.blockLevel));
444
+ }
445
+ preserve = preserve.replace(/\\n\s*$/, '');
446
+ preserve += this.getCloser().text;
447
+ output.push(this.markText(preserve));
448
+ } else {
449
+ output.push(this.getOpener());
450
+ _ref2 = this.children;
451
+ for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
452
+ child = _ref2[_j];
453
+ output = output.concat(child.render());
454
+ }
455
+ output.push(this.getCloser());
456
+ }
457
+ } else if (this.opener) {
458
+ output.push(this.getOpener());
459
+ _ref3 = this.children;
460
+ for (_k = 0, _len3 = _ref3.length; _k < _len3; _k++) {
461
+ child = _ref3[_k];
462
+ output = output.concat(child.render());
463
+ }
464
+ } else {
465
+ _ref4 = this.children;
466
+ for (_l = 0, _len4 = _ref4.length; _l < _len4; _l++) {
467
+ child = _ref4[_l];
468
+ output.push(this.markText(child.render().text));
469
+ }
470
+ }
366
471
  }
367
472
  return output;
368
473
  };
474
+
369
475
  return Node;
476
+
370
477
  })();
478
+
371
479
  }).call(this);
372
480
 
373
481
  });
374
482
 
375
483
  require.define("/helper.js", function (require, module, exports, __dirname, __filename) {
376
- (function() {
484
+
377
485
  module.exports = {
378
486
  whitespace: function(n) {
379
487
  var a;
@@ -384,115 +492,161 @@ require.define("/helper.js", function (require, module, exports, __dirname, __fi
384
492
  }
385
493
  return a.join('');
386
494
  },
387
- escape: function(s) {
388
- return s.replace(/"/g, '\\"');
495
+ escapeQuotes: function(text) {
496
+ if (!text) return '';
497
+ return text.replace(/"/g, '\\"');
498
+ },
499
+ escapeHTML: function(text) {
500
+ if (!text) return '';
501
+ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');
389
502
  }
390
503
  };
391
- }).call(this);
392
504
 
393
505
  });
394
506
 
395
507
  require.define("/nodes/text.js", function (require, module, exports, __dirname, __filename) {
396
508
  (function() {
397
- var Node, Text;
398
- var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
399
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
400
- function ctor() { this.constructor = child; }
401
- ctor.prototype = parent.prototype;
402
- child.prototype = new ctor;
403
- child.__super__ = parent.prototype;
404
- return child;
405
- };
509
+ var Node, Text, eq;
510
+ var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; };
511
+
406
512
  Node = require('./node');
513
+
514
+ eq = require('../helper').escapeQuotes;
515
+
407
516
  module.exports = Text = (function() {
517
+
408
518
  __extends(Text, Node);
519
+
409
520
  function Text() {
410
521
  Text.__super__.constructor.apply(this, arguments);
411
522
  }
523
+
412
524
  Text.prototype.evaluate = function() {
413
- return this.opener = "" + this.cw + "o.push \"" + this.hw + this.expression + "\"";
525
+ return this.opener = this.markText(eq(this.expression));
414
526
  };
527
+
415
528
  return Text;
529
+
416
530
  })();
531
+
417
532
  }).call(this);
418
533
 
419
534
  });
420
535
 
421
536
  require.define("/nodes/haml.js", function (require, module, exports, __dirname, __filename) {
422
537
  (function() {
423
- var Haml, Node, qe;
424
- var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
425
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
426
- function ctor() { this.constructor = child; }
427
- ctor.prototype = parent.prototype;
428
- child.prototype = new ctor;
429
- child.__super__ = parent.prototype;
430
- return child;
431
- };
538
+ var Haml, Node, eq;
539
+ var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; };
540
+
432
541
  Node = require('./node');
433
- qe = require('../helper').escape;
542
+
543
+ eq = require('../helper').escapeQuotes;
544
+
434
545
  module.exports = Haml = (function() {
546
+
435
547
  __extends(Haml, Node);
436
- Haml.selfCloseTags = ["meta", "img", "link", "br", "hr", "input", "area", "base"];
437
- function Haml(expression, block_level, code_block_level, escape_html) {
438
- this.escape_html = escape_html;
439
- Haml.__super__.constructor.call(this, expression, block_level, code_block_level);
548
+
549
+ function Haml() {
550
+ Haml.__super__.constructor.apply(this, arguments);
440
551
  }
552
+
553
+ Haml.selfCloseTags = ['meta', 'img', 'link', 'br', 'hr', 'input', 'area', 'param', 'col', 'base'];
554
+
555
+ Haml.preserveTags = ['pre', 'textarea'];
556
+
441
557
  Haml.prototype.evaluate = function() {
442
- var htmlTagPrefix, parsedExpression;
443
- parsedExpression = this.parseExpression(this.expression);
444
- htmlTagPrefix = this.buildHtmlTag(parsedExpression);
445
- if (this.isSelfClosing(parsedExpression.tag)) {
446
- this.opener = "" + this.cw + "o.push \"" + this.hw + (qe(htmlTagPrefix)) + ">";
447
- this.closer = "" + this.cw + "o.push \"" + this.hw + "</" + parsedExpression.tag + ">\"";
558
+ var code, prefix, tokens;
559
+ tokens = this.parseExpression(this.expression);
560
+ if (tokens.doctype) {
561
+ return this.opener = this.markText("" + (eq(this.buildDocType(tokens.doctype))));
448
562
  } else {
449
- this.opener = "" + this.cw + "o.push \"" + this.hw + (qe(htmlTagPrefix)) + " />";
450
- }
451
- if (parsedExpression.assignment) {
452
- this.opener += this.escape_html ? "\#{e " + parsedExpression.assignment + "}" : "\#{" + parsedExpression.assignment + "}";
563
+ if (this.isNotSelfClosing(tokens.tag)) {
564
+ prefix = eq(this.buildHtmlTagPrefix(tokens));
565
+ if (tokens.assignment) {
566
+ code = this.escapeHtml ? "\#{e " + tokens.assignment + "}" : "\#{" + tokens.assignment + "}";
567
+ this.opener = this.markText("" + prefix + ">" + code);
568
+ return this.closer = this.markText("</" + tokens.tag + ">");
569
+ } else if (tokens.text) {
570
+ this.opener = this.markText("" + prefix + ">" + tokens.text);
571
+ return this.closer = this.markText("</" + tokens.tag + ">");
572
+ } else {
573
+ this.opener = this.markText(prefix + '>');
574
+ return this.closer = this.markText("</" + tokens.tag + ">");
575
+ }
576
+ } else {
577
+ tokens.tag = tokens.tag.replace(/\/$/, '');
578
+ prefix = eq(this.buildHtmlTagPrefix(tokens));
579
+ return this.opener = this.markText("" + prefix + (this.format === 'xhtml' ? ' /' : '') + ">");
580
+ }
453
581
  }
454
- return this.opener += '"';
455
582
  };
583
+
456
584
  Haml.prototype.parseExpression = function(exp) {
457
- var optionProperties, tagProperties;
458
- tagProperties = this.parseTag(exp);
459
- optionProperties = this.parseOptions(exp);
460
- return {
461
- tag: tagProperties.tag,
462
- ids: tagProperties.ids,
463
- classes: tagProperties.classes,
464
- pairs: optionProperties.pairs,
465
- assignment: optionProperties.assignment
466
- };
467
- };
468
- Haml.prototype.buildHtmlTag = function(parsedExpression) {
469
- var pair, tagParts, _i, _len, _ref;
470
- tagParts = ["<" + parsedExpression.tag];
471
- if (parsedExpression.ids) {
472
- tagParts.push("id=\"" + (parsedExpression.ids.join(' ')) + "\"");
473
- }
474
- if (parsedExpression.classes) {
475
- tagParts.push("class=\"" + (parsedExpression.classes.join(' ')) + "\"");
476
- }
477
- if (parsedExpression.pairs.length > 0) {
478
- _ref = parsedExpression.pairs;
479
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
480
- pair = _ref[_i];
481
- tagParts.push("" + pair.key + "=" + pair.value);
585
+ var attribute, attributes, classes, id, tag, _i, _len, _ref, _ref2;
586
+ tag = this.parseTag(exp);
587
+ if (Haml.preserveTags.indexOf(tag.tag) !== -1) this.preserve = true;
588
+ id = (_ref = tag.ids) != null ? _ref.pop() : void 0;
589
+ classes = tag.classes;
590
+ attributes = [];
591
+ if (tag.attributes) {
592
+ _ref2 = tag.attributes;
593
+ for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
594
+ attribute = _ref2[_i];
595
+ if (attribute.key === 'id') {
596
+ if (id) {
597
+ id += '_' + attribute.value;
598
+ } else {
599
+ id = attribute.value;
600
+ }
601
+ } else if (attribute.key === 'class') {
602
+ classes || (classes = []);
603
+ classes.push(attribute.value);
604
+ } else {
605
+ attributes.push(attribute);
606
+ }
482
607
  }
483
608
  }
484
- return tagParts.join(' ');
609
+ return {
610
+ doctype: tag.doctype,
611
+ tag: tag.tag,
612
+ id: id,
613
+ classes: classes,
614
+ text: tag.text,
615
+ attributes: attributes,
616
+ assignment: tag.assignment
617
+ };
485
618
  };
619
+
486
620
  Haml.prototype.parseTag = function(exp) {
487
- var classes, id, ids, klass, tag, tagExp;
621
+ var assignment, attributes, classes, doctype, haml, id, ids, klass, tag, text, tokens, whitespace, _ref, _ref2, _ref3;
488
622
  try {
489
- tagExp = exp.match(/^((?:[.#%][a-z_\-][a-z0-9_:\-]*)+)(.*)$/i)[1];
490
- tag = tagExp.match(/\%([a-z_\-][a-z0-9_:\-]*)/i);
491
- tag = tag ? tag[1] : 'div';
492
- ids = tagExp.match(/\#([a-z_\-][a-z0-9_\-]*)/gi);
493
- classes = tagExp.match(/\.([a-z_\-][a-z0-9_\-]*)/gi);
623
+ doctype = (_ref = exp.match(/^(\!{3}.*)/)) != null ? _ref[1] : void 0;
624
+ if (doctype) {
625
+ return {
626
+ doctype: doctype
627
+ };
628
+ }
629
+ tokens = exp.match(/^((?:[#%\.][a-z0-9_:\-]*[\/]?)+)(?:([\(\{].*[\)\}])?([\<\>]{0,2})(?==)|([\(\{].*[\)\}])?([\<\>]{0,2}))(.*)?/i);
630
+ haml = tokens[1];
631
+ attributes = tokens[2] || tokens[4];
632
+ whitespace = tokens[3] || tokens[5];
633
+ if (tokens[6] && !tokens[6].match(/^=/)) {
634
+ text = tokens[6].replace(/^ /, '');
635
+ } else {
636
+ assignment = (_ref2 = tokens[6]) != null ? (_ref3 = _ref2.match(/\=\s*(\S+.*)$/)) != null ? _ref3[1] : void 0 : void 0;
637
+ }
638
+ if (whitespace) {
639
+ if (whitespace.indexOf('>') !== -1) this.wsRemoval.around = true;
640
+ if (whitespace.indexOf('<') !== -1) {
641
+ this.wsRemoval.inside = true;
642
+ this.preserve = true;
643
+ }
644
+ }
645
+ tag = haml.match(/\%([a-z_\-][a-z0-9_:\-]*[\/]?)/i);
646
+ ids = haml.match(/\#([a-z_\-][a-z0-9_\-]*)/gi);
647
+ classes = haml.match(/\.([a-z0-9_\-]*)/gi);
494
648
  return {
495
- tag: tag,
649
+ tag: tag ? tag[1] : 'div',
496
650
  ids: ids ? (function() {
497
651
  var _i, _len, _results;
498
652
  _results = [];
@@ -510,241 +664,631 @@ require.define("/nodes/haml.js", function (require, module, exports, __dirname,
510
664
  _results.push(klass.substr(1));
511
665
  }
512
666
  return _results;
513
- })() : void 0
667
+ })() : void 0,
668
+ attributes: this.parseAttributes(attributes),
669
+ assignment: assignment,
670
+ text: text
514
671
  };
515
672
  } catch (error) {
516
673
  throw "Unable to parse tag from " + exp + ": " + error;
517
674
  }
518
675
  };
519
- Haml.prototype.parseOptions = function(exp) {
520
- var assignment, attributesExp, optionsExp, pairs;
521
- optionsExp = exp.match(/[\{\s=].*/i);
522
- if (optionsExp) {
523
- optionsExp = optionsExp[0];
524
- if (optionsExp[0] === "{") {
525
- attributesExp = optionsExp.match(/\{(.*)\}/);
526
- if (attributesExp) {
527
- attributesExp = attributesExp[1];
676
+
677
+ Haml.prototype.parseAttributes = function(exp) {
678
+ var attributes, datas, findAttributes, key, match, quoted, value, _ref;
679
+ attributes = [];
680
+ if (exp === void 0) return attributes;
681
+ _ref = this.getDataAttributes(exp), exp = _ref[0], datas = _ref[1];
682
+ findAttributes = /(?:(['"]?\w+[\w:-]*['"]?)\s*=\s*("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|[\w@.]+)|(['"]?\w+[\w:-]*['"]?)\s*=>\s*("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|[-\w@.()'"]+)|(['"]?\w+[\w:-]*['"]?):\s*("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|[-\w@.()'"]+))/g;
683
+ while (match = findAttributes.exec(exp)) {
684
+ key = match[1] || match[3] || match[5];
685
+ value = match[2] || match[4] || match[6];
686
+ if (['false', '"false"', "'false'", '', '""', "''"].indexOf(value) === -1) {
687
+ if (['true', '"true"', "'true'"].indexOf(value) !== -1) {
688
+ value = "'" + key + "'";
689
+ } else if (!value.match(/^("|').*\1$/)) {
690
+ if (this.escapeAttributes) {
691
+ value = '\'#{ e(' + value + ') }\'';
692
+ } else {
693
+ value = '\'#{ ' + value + ' }\'';
694
+ }
528
695
  }
529
- assignment = optionsExp.match(/\{.*\}\s*=\s*(.*)/);
530
- } else {
531
- assignment = optionsExp.match(/\.*=\s*(.*)/);
696
+ if (quoted = value.match(/^("|')(.*)\1$/)) value = quoted[2];
697
+ if (quoted = key.match(/^("|')(.*)\1$/)) key = quoted[2];
698
+ attributes.push({
699
+ key: key,
700
+ value: value
701
+ });
532
702
  }
533
- if (assignment) {
534
- assignment = assignment[1];
535
- }
536
- pairs = this.parseAttributes(attributesExp);
537
703
  }
538
- return {
539
- assignment: assignment,
540
- pairs: pairs || []
541
- };
704
+ return attributes.concat(datas);
542
705
  };
543
- Haml.prototype.parseAttributes = function(attributesExp) {
544
- var attribute, attributes, key, pair, pairs, result, value, valueIsLiteral, _i, _len;
545
- pairs = [];
546
- if (attributesExp == null) {
547
- return pairs;
548
- }
549
- attributes = attributesExp.match(/(:[^\s|=]+\s*=>\s*(("[^"]+")|('[^']+')|[^\s]+))/g);
706
+
707
+ Haml.prototype.getDataAttributes = function(exp) {
708
+ var attribute, attributes, data, _i, _len;
709
+ data = /:?data:?\s*(?:=>\s*)?\{([^}]*)\},?/gi.exec(exp);
710
+ if (!(data != null ? data[1] : void 0)) return [exp, []];
711
+ exp = exp.replace(data[0], '');
712
+ attributes = this.parseAttributes(data[1]);
550
713
  for (_i = 0, _len = attributes.length; _i < _len; _i++) {
551
714
  attribute = attributes[_i];
552
- pair = attribute.split('=>');
553
- key = pair[0].trim().substr(1);
554
- result = key.match(/^'(.+)'$/);
555
- if (result) {
556
- key = result[1];
715
+ attribute.key = "data-" + attribute.key;
716
+ }
717
+ return [exp, attributes];
718
+ };
719
+
720
+ Haml.prototype.buildHtmlTagPrefix = function(tokens) {
721
+ var attribute, classes, interpolation, klass, tagParts, _i, _j, _len, _len2, _ref, _ref2;
722
+ tagParts = ["<" + tokens.tag];
723
+ if (tokens.classes) {
724
+ classes = tokens.classes.sort().join(' ');
725
+ if (tokens.classes.length > 1 && classes.match(/#\{/)) {
726
+ classes = '#{ [';
727
+ _ref = tokens.classes;
728
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
729
+ klass = _ref[_i];
730
+ if (interpolation = klass.match(/#{(.*)}/)) {
731
+ classes += interpolation[1] + ',';
732
+ } else {
733
+ classes += "'" + klass + "',";
734
+ }
735
+ }
736
+ classes += '].sort().join(\' \') }';
737
+ }
738
+ tagParts.push("class='" + classes + "'");
739
+ }
740
+ if (tokens.id) tagParts.push("id='" + tokens.id + "'");
741
+ if (tokens.attributes) {
742
+ _ref2 = tokens.attributes;
743
+ for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
744
+ attribute = _ref2[_j];
745
+ if (attribute.key !== attribute.value || this.format !== 'html5') {
746
+ tagParts.push("" + attribute.key + "=" + (this.quoteAttributeValue(attribute.value)));
747
+ } else {
748
+ tagParts.push("" + attribute.key);
749
+ }
557
750
  }
558
- value = pair[1].trim();
559
- valueIsLiteral = value.match(/^("|').*\1$/);
560
- value = value.replace(/,$/, '');
561
- pairs.push({
562
- key: key,
563
- value: valueIsLiteral ? value : '"#{' + value + '}"'
564
- });
565
751
  }
566
- return pairs;
752
+ return tagParts.join(' ');
753
+ };
754
+
755
+ Haml.prototype.quoteAttributeValue = function(value) {
756
+ var quoted;
757
+ if (value.indexOf("'") === -1) {
758
+ quoted = "'" + value + "'";
759
+ } else {
760
+ quoted = "\"" + value + "\"";
761
+ }
762
+ return quoted;
567
763
  };
568
- Haml.prototype.isSelfClosing = function(tag) {
569
- return Haml.selfCloseTags.indexOf(tag) === -1;
764
+
765
+ Haml.prototype.buildDocType = function(doctype) {
766
+ switch ("" + this.format + " " + doctype) {
767
+ case 'xhtml !!! XML':
768
+ return '<?xml version=\'1.0\' encoding=\'utf-8\' ?>';
769
+ case 'xhtml !!!':
770
+ return '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
771
+ case 'xhtml !!! 1.1':
772
+ return '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">';
773
+ case 'xhtml !!! mobile':
774
+ return '<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">';
775
+ case 'xhtml !!! basic':
776
+ return '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">';
777
+ case 'xhtml !!! frameset':
778
+ return '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">';
779
+ case 'xhtml !!! 5':
780
+ case 'html5 !!!':
781
+ return '<!DOCTYPE html>';
782
+ case 'html5 !!! XML':
783
+ case 'html4 !!! XML':
784
+ return '';
785
+ case 'html4 !!!':
786
+ return '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';
787
+ case 'html4 !!! frameset':
788
+ return '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">';
789
+ case 'html4 !!! strict':
790
+ return '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">';
791
+ }
792
+ };
793
+
794
+ Haml.prototype.isNotSelfClosing = function(tag) {
795
+ return Haml.selfCloseTags.indexOf(tag) === -1 && !tag.match(/\/$/);
570
796
  };
797
+
571
798
  return Haml;
799
+
572
800
  })();
801
+
573
802
  }).call(this);
574
803
 
575
804
  });
576
805
 
577
806
  require.define("/nodes/code.js", function (require, module, exports, __dirname, __filename) {
578
807
  (function() {
579
- var Code, Node, e;
580
- var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
581
- for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
582
- function ctor() { this.constructor = child; }
583
- ctor.prototype = parent.prototype;
584
- child.prototype = new ctor;
585
- child.__super__ = parent.prototype;
586
- return child;
587
- };
808
+ var Code, Node;
809
+ var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; };
810
+
588
811
  Node = require('./node');
589
- e = require('../helper').escape;
812
+
590
813
  module.exports = Code = (function() {
814
+
591
815
  __extends(Code, Node);
592
- function Code(expression, block_level, code_block_level, escape_html) {
593
- this.escape_html = escape_html;
594
- Code.__super__.constructor.call(this, expression, block_level, code_block_level);
816
+
817
+ function Code() {
818
+ Code.__super__.constructor.apply(this, arguments);
595
819
  }
820
+
596
821
  Code.prototype.evaluate = function() {
597
- var code, expression, identifier, _ref;
598
- _ref = this.expression.match(/(-|!=|=)\s(.*)/), expression = _ref[0], identifier = _ref[1], code = _ref[2];
599
- return this.opener = identifier === '-' ? "" + this.cw + code : identifier === '!=' || !this.escape_html ? "" + this.cw + "o.push \"" + this.hw + "\#{" + code + "}\"" : "" + this.cw + "o.push e \"" + this.hw + "\#{" + code + "}\"";
822
+ var code, codeBlock, identifier;
823
+ codeBlock = this.expression.match(/(-|!=|\&=|=|~)\s?(.*)?/);
824
+ identifier = codeBlock[1];
825
+ code = codeBlock[2];
826
+ if (identifier === '-') {
827
+ this.opener = this.markRunningCode(code);
828
+ if (this.children.length !== 0 && this.opener.code.match(/(->|=>)/)) {
829
+ return this.closer = this.markRunningCode(" ''");
830
+ }
831
+ } else if (identifier === '~') {
832
+ return this.opener = this.markInsertingCode(this.findAndPreserve(code));
833
+ } else if (identifier === '&=' || (identifier === '=' && this.escapeHtml)) {
834
+ return this.opener = this.markInsertingCode(code, true);
835
+ } else if (identifier === '!=' || (identifier === '=' && !this.escapeHtml)) {
836
+ return this.opener = this.markInsertingCode(code);
837
+ }
600
838
  };
839
+
840
+ Code.prototype.findAndPreserve = function(code) {
841
+ return code.replace(/<(pre|textarea)>(.*?)<\/\1>/g, function(text) {
842
+ return text.replace('\\n', '\&\#x000A;');
843
+ });
844
+ };
845
+
601
846
  return Code;
847
+
848
+ })();
849
+
850
+ }).call(this);
851
+
852
+ });
853
+
854
+ require.define("/nodes/comment.js", function (require, module, exports, __dirname, __filename) {
855
+ (function() {
856
+ var Comment, Node;
857
+ var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; };
858
+
859
+ Node = require('./node');
860
+
861
+ module.exports = Comment = (function() {
862
+
863
+ __extends(Comment, Node);
864
+
865
+ function Comment() {
866
+ Comment.__super__.constructor.apply(this, arguments);
867
+ }
868
+
869
+ Comment.prototype.evaluate = function() {
870
+ var comment, expression, identifier, _ref;
871
+ _ref = this.expression.match(/(-#|\/\[|\/)\s?(.*)?/), expression = _ref[0], identifier = _ref[1], comment = _ref[2];
872
+ switch (identifier) {
873
+ case '-#':
874
+ this.silent = true;
875
+ return this.opener = this.markText('');
876
+ case '\/[':
877
+ this.opener = this.markText("<!--[" + comment + ">");
878
+ return this.closer = this.markText('<![endif]-->');
879
+ case '\/':
880
+ if (comment) {
881
+ this.opener = this.markText("<!-- " + comment);
882
+ return this.closer = this.markText(' -->');
883
+ } else {
884
+ this.opener = this.markText("<!--");
885
+ return this.closer = this.markText('-->');
886
+ }
887
+ }
888
+ };
889
+
890
+ return Comment;
891
+
892
+ })();
893
+
894
+ }).call(this);
895
+
896
+ });
897
+
898
+ require.define("/nodes/filter.js", function (require, module, exports, __dirname, __filename) {
899
+ (function() {
900
+ var Filter, Node, w;
901
+ var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; };
902
+
903
+ Node = require('./node');
904
+
905
+ w = require('../helper').whitespace;
906
+
907
+ module.exports = Filter = (function() {
908
+
909
+ __extends(Filter, Node);
910
+
911
+ function Filter() {
912
+ Filter.__super__.constructor.apply(this, arguments);
913
+ }
914
+
915
+ Filter.prototype.evaluate = function() {
916
+ var _ref;
917
+ return this.filter = (_ref = this.expression.match(/:(escaped|preserve|css|javascript|coffeescript|plain|cdata|coffeescript)(.*)?/)) != null ? _ref[1] : void 0;
918
+ };
919
+
920
+ Filter.prototype.render = function() {
921
+ var child, indent, output, preserve, _i, _j, _len, _len2, _ref, _ref2;
922
+ output = [];
923
+ switch (this.filter) {
924
+ case 'escaped':
925
+ _ref = this.children;
926
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
927
+ child = _ref[_i];
928
+ output.push(this.markText(child.render()[0].text, true));
929
+ }
930
+ break;
931
+ case 'preserve':
932
+ preserve = '';
933
+ _ref2 = this.children;
934
+ for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
935
+ child = _ref2[_j];
936
+ preserve += "" + (child.render()[0].text) + "&#x000A;";
937
+ }
938
+ preserve = preserve.replace(/\&\#x000A;$/, '');
939
+ output.push(this.markText(preserve));
940
+ break;
941
+ case 'plain':
942
+ this.renderFilterContent(0, output);
943
+ break;
944
+ case 'css':
945
+ if (this.format === 'html5') {
946
+ output.push(this.markText('<style>'));
947
+ } else {
948
+ output.push(this.markText('<style type=\'text/css\'>'));
949
+ }
950
+ if (this.format === 'xhtml') {
951
+ output.push(this.markText(' /*<![CDATA[*/'));
952
+ }
953
+ indent = this.format === 'xhtml' ? 2 : 1;
954
+ this.renderFilterContent(indent, output);
955
+ if (this.format === 'xhtml') output.push(this.markText(' /*]]>*/'));
956
+ output.push(this.markText('</style>'));
957
+ break;
958
+ case 'javascript':
959
+ if (this.format === 'html5') {
960
+ output.push(this.markText('<script>'));
961
+ } else {
962
+ output.push(this.markText('<script type=\'text/javascript\'>'));
963
+ }
964
+ if (this.format === 'xhtml') output.push(this.markText(' //<![CDATA['));
965
+ indent = this.format === 'xhtml' ? 2 : 1;
966
+ this.renderFilterContent(indent, output);
967
+ if (this.format === 'xhtml') output.push(this.markText(' //]]>'));
968
+ output.push(this.markText('</script>'));
969
+ break;
970
+ case 'cdata':
971
+ output.push(this.markText('<![CDATA['));
972
+ this.renderFilterContent(2, output);
973
+ output.push(this.markText(']]>'));
974
+ break;
975
+ case 'coffeescript':
976
+ this.renderFilterContent(0, output, 'run');
977
+ }
978
+ return output;
979
+ };
980
+
981
+ Filter.prototype.renderFilterContent = function(indent, output, type) {
982
+ var child, content, e, empty, line, _i, _j, _len, _len2, _ref, _results;
983
+ if (type == null) type = 'text';
984
+ content = [];
985
+ empty = 0;
986
+ _ref = this.children;
987
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
988
+ child = _ref[_i];
989
+ content.push(child.render()[0].text);
990
+ }
991
+ _results = [];
992
+ for (_j = 0, _len2 = content.length; _j < _len2; _j++) {
993
+ line = content[_j];
994
+ if (line === '') {
995
+ _results.push(empty += 1);
996
+ } else {
997
+ switch (type) {
998
+ case 'text':
999
+ for (e = 0; 0 <= empty ? e < empty : e > empty; 0 <= empty ? e++ : e--) {
1000
+ output.push(this.markText(""));
1001
+ }
1002
+ output.push(this.markText("" + (w(indent)) + line));
1003
+ break;
1004
+ case 'run':
1005
+ output.push(this.markRunningCode("" + line));
1006
+ }
1007
+ _results.push(empty = 0);
1008
+ }
1009
+ }
1010
+ return _results;
1011
+ };
1012
+
1013
+ return Filter;
1014
+
602
1015
  })();
1016
+
603
1017
  }).call(this);
604
1018
 
605
1019
  });
606
1020
 
607
1021
  require.define("/compiler.js", function (require, module, exports, __dirname, __filename) {
608
1022
  (function() {
609
- var Code, Compiler, Haml, Node, Text;
610
- var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
1023
+ var Code, Comment, Compiler, Filter, Haml, Node, Text, w;
1024
+
611
1025
  Node = require('./nodes/node');
1026
+
612
1027
  Text = require('./nodes/text');
1028
+
613
1029
  Haml = require('./nodes/haml');
1030
+
614
1031
  Code = require('./nodes/code');
1032
+
1033
+ Comment = require('./nodes/comment');
1034
+
1035
+ Filter = require('./nodes/filter');
1036
+
1037
+ w = require('./helper').whitespace;
1038
+
615
1039
  module.exports = Compiler = (function() {
1040
+
616
1041
  function Compiler(options) {
617
- var _base, _ref;
1042
+ var _base, _base2, _base3, _ref, _ref2, _ref3;
618
1043
  this.options = options != null ? options : {};
619
- if ((_ref = (_base = this.options).escape_html) == null) {
620
- _base.escape_html = true;
1044
+ if ((_ref = (_base = this.options).escapeHtml) == null) {
1045
+ _base.escapeHtml = true;
621
1046
  }
622
- }
623
- Compiler.prototype.node_factory = function(expression, current_block_level, current_code_block_level) {
624
- var node;
625
- if (expression.match(/^(-|=|!=)\s*(.*)/)) {
626
- node = new Code(expression, current_block_level, current_code_block_level, this.options.escape_html);
627
- } else if (expression.match(/^(%|#|\.)(.*)/)) {
628
- node = new Haml(expression, current_block_level, current_code_block_level, this.options.escape_html);
629
- } else {
630
- node = new Text(expression, current_block_level, current_code_block_level);
1047
+ if ((_ref2 = (_base2 = this.options).escapeAttributes) == null) {
1048
+ _base2.escapeAttributes = true;
631
1049
  }
632
- return node;
633
- };
634
- Compiler.prototype.update_code_block_level = function(node) {
635
- if (node instanceof Code) {
636
- return this.current_code_block_level = node.code_block_level + 1;
637
- } else {
638
- return this.current_code_block_level = node.code_block_level;
1050
+ if ((_ref3 = (_base3 = this.options).format) == null) {
1051
+ _base3.format = 'html5';
639
1052
  }
1053
+ }
1054
+
1055
+ Compiler.prototype.indentChanged = function() {
1056
+ return this.currentIndent !== this.previousIndent;
640
1057
  };
641
- Compiler.prototype.indent_changed = function() {
642
- return this.current_indent !== this.previous_indent;
1058
+
1059
+ Compiler.prototype.isIndent = function() {
1060
+ return this.currentIndent > this.previousIndent;
643
1061
  };
644
- Compiler.prototype.is_indent = function() {
645
- return this.current_indent > this.previous_indent;
1062
+
1063
+ Compiler.prototype.updateTabSize = function() {
1064
+ if (this.tabSize === 0) {
1065
+ return this.tabSize = this.currentIndent - this.previousIndent;
1066
+ }
646
1067
  };
647
- Compiler.prototype.update_tab_size = function() {
648
- if (this.tab_size === 0) {
649
- return this.tab_size = this.current_indent - this.previous_indent;
1068
+
1069
+ Compiler.prototype.updateBlockLevel = function() {
1070
+ this.currentBlockLevel = this.currentIndent / this.tabSize;
1071
+ if (this.currentBlockLevel - Math.floor(this.currentBlockLevel) > 0) {
1072
+ throw "Indentation error in line " + this.lineNumber;
650
1073
  }
1074
+ if ((this.currentIndent - this.previousIndent) / this.tabSize > 1) {
1075
+ throw "Block level too deep in line " + this.lineNumber;
1076
+ }
1077
+ return this.delta = this.previousBlockLevel - this.currentBlockLevel;
651
1078
  };
652
- Compiler.prototype.update_block_level = function() {
653
- this.current_block_level = this.current_indent / this.tab_size;
654
- if (this.current_block_level - Math.floor(this.current_block_level) > 0) {
655
- throw "Indentation error in line " + this.line_number;
1079
+
1080
+ Compiler.prototype.updateCodeBlockLevel = function(node) {
1081
+ if (node instanceof Code) {
1082
+ return this.currentCodeBlockLevel = node.codeBlockLevel + 1;
1083
+ } else {
1084
+ return this.currentCodeBlockLevel = node.codeBlockLevel;
656
1085
  }
657
- if ((this.current_indent - this.previous_indent) / this.tab_size > 1) {
658
- throw "Block level too deep in line " + this.line_number;
1086
+ };
1087
+
1088
+ Compiler.prototype.updateParent = function() {
1089
+ if (this.isIndent()) {
1090
+ return this.pushParent();
1091
+ } else {
1092
+ return this.popParent();
659
1093
  }
660
- return this.delta = this.previous_block_level - this.current_block_level;
661
1094
  };
662
- Compiler.prototype.push_parent = function() {
663
- this.stack.push(this.parent_node);
664
- return this.parent_node = this.node;
1095
+
1096
+ Compiler.prototype.pushParent = function() {
1097
+ this.stack.push(this.parentNode);
1098
+ return this.parentNode = this.node;
665
1099
  };
666
- Compiler.prototype.pop_parent = function() {
1100
+
1101
+ Compiler.prototype.popParent = function() {
667
1102
  var i, _ref, _results;
668
1103
  _results = [];
669
1104
  for (i = 0, _ref = this.delta - 1; 0 <= _ref ? i <= _ref : i >= _ref; 0 <= _ref ? i++ : i--) {
670
- _results.push(this.parent_node = this.stack.pop());
1105
+ _results.push(this.parentNode = this.stack.pop());
671
1106
  }
672
1107
  return _results;
673
1108
  };
1109
+
1110
+ Compiler.prototype.getNodeOptions = function(override) {
1111
+ if (override == null) override = {};
1112
+ return {
1113
+ parentNode: override.parentNode || this.parentNode,
1114
+ blockLevel: override.blockLevel || this.currentBlockLevel,
1115
+ codeBlockLevel: override.codeBlockLevel || this.currentCodeBlockLevel,
1116
+ escapeHtml: override.escapeHtml || this.options.escapeHtml,
1117
+ escapeAttributes: override.escapeAttributes || this.options.escapeAttributes,
1118
+ format: override.format || this.options.format
1119
+ };
1120
+ };
1121
+
1122
+ Compiler.prototype.nodeFactory = function(expression) {
1123
+ var node, options, _ref;
1124
+ if (expression == null) expression = '';
1125
+ options = this.getNodeOptions();
1126
+ if (expression.match(/^:(escaped|preserve|css|javascript|plain|cdata|coffeescript)/)) {
1127
+ node = new Filter(expression, options);
1128
+ } else if (expression.match(/^(\/|-#)(.*)/)) {
1129
+ node = new Comment(expression, options);
1130
+ } else if (expression.match(/^(-#|-|=|!=|\&=|~)\s*(.*)/)) {
1131
+ node = new Code(expression, options);
1132
+ } else if (expression.match(/^(%|#|\.|\!)(.*)/)) {
1133
+ node = new Haml(expression, options);
1134
+ } else {
1135
+ node = new Text(expression, options);
1136
+ }
1137
+ if ((_ref = options.parentNode) != null) _ref.addChild(node);
1138
+ return node;
1139
+ };
1140
+
674
1141
  Compiler.prototype.parse = function(source) {
675
- this.line_number = 0;
676
- this.previous_indent = 0;
677
- this.tab_size = 0;
678
- this.current_block_level = this.previous_block_level = 0;
679
- this.current_code_block_level = this.previous_code_block_level = 2;
680
- this.root = this.parent_node = new Node("", this.current_block_level, this.current_code_block_level);
1142
+ var attributes, expression, line, lines, result, text, whitespace, _ref;
1143
+ this.line_number = this.previousIndent = this.tabSize = this.currentBlockLevel = this.previousBlockLevel = 0;
1144
+ this.currentCodeBlockLevel = this.previousCodeBlockLevel = 2;
681
1145
  this.node = null;
682
1146
  this.stack = [];
683
- return source.split("\n").forEach(__bind(function(line) {
684
- var expression, result, whitespace;
685
- result = line.match(/^(\s*)(.*)/);
686
- whitespace = result[1];
687
- expression = result[2];
688
- if (expression.length > 0) {
689
- if (!expression.match(/^\//)) {
690
- this.current_indent = whitespace.length;
691
- if (this.indent_changed()) {
692
- this.update_tab_size();
693
- this.update_block_level();
694
- if (this.is_indent()) {
695
- this.push_parent();
696
- } else {
697
- this.pop_parent();
698
- }
699
- this.update_code_block_level(this.parent_node);
1147
+ this.root = this.parentNode = new Node('', this.getNodeOptions());
1148
+ lines = source.split("\n");
1149
+ while ((line = lines.shift()) !== void 0) {
1150
+ if ((this.node instanceof Filter) && !this.exitFilter) {
1151
+ if (line === '') {
1152
+ this.node.addChild(new Text('', this.getNodeOptions({
1153
+ parentNode: this.node
1154
+ })));
1155
+ } else {
1156
+ result = line.match(/^(\s*)(.*)/);
1157
+ whitespace = result[1];
1158
+ expression = result[2];
1159
+ if (this.node.blockLevel >= (whitespace.length / 2)) {
1160
+ this.exitFilter = true;
1161
+ lines.unshift(line);
1162
+ continue;
1163
+ }
1164
+ text = line.match(RegExp("^\\s{" + ((this.node.blockLevel * 2) + 2) + "}(.*)"));
1165
+ if (text) {
1166
+ this.node.addChild(new Text(text[1], this.getNodeOptions({
1167
+ parentNode: this.node
1168
+ })));
700
1169
  }
701
- this.node = this.node_factory(expression, this.current_block_level, this.current_code_block_level);
702
- this.parent_node.addChild(this.node);
703
- this.previous_block_level = this.current_block_level;
704
- this.previous_indent = this.current_indent;
1170
+ }
1171
+ } else {
1172
+ this.exitFilter = false;
1173
+ result = line.match(/^(\s*)(.*)/);
1174
+ whitespace = result[1];
1175
+ expression = result[2];
1176
+ if (line === '') continue;
1177
+ while (/^%.*[{(]/.test(expression) && !/^(\s*)[%<]/.test(lines[0]) && /(?:(['"]?\w+[\w:-]*['"]?)\s*=\s*("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|[\w@.]+)|(['"]?\w+[\w:-]*['"]?)\s*=>\s*("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|[-\w@.()'"]+)|(['"]?\w+[\w:-]*['"]?):\s*("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|[-\w@.()'"]+))/.test(lines[0])) {
1178
+ attributes = lines.shift();
1179
+ expression += ' ' + attributes.match(/^(\s*)(.*)/)[2];
705
1180
  this.line_number++;
706
1181
  }
1182
+ if (expression.match(/(\s)+\|$/)) {
1183
+ expression = expression.replace(/(\s)+\|$/, ' ');
1184
+ while ((_ref = lines[0]) != null ? _ref.match(/(\s)+\|$/) : void 0) {
1185
+ expression += lines.shift().match(/^(\s*)(.*)/)[2].replace(/(\s)+\|$/, '');
1186
+ this.line_number++;
1187
+ }
1188
+ }
1189
+ this.currentIndent = whitespace.length;
1190
+ if (this.indentChanged()) {
1191
+ this.updateTabSize();
1192
+ this.updateBlockLevel();
1193
+ this.updateParent();
1194
+ this.updateCodeBlockLevel(this.parentNode);
1195
+ }
1196
+ this.node = this.nodeFactory(expression);
1197
+ this.previousBlockLevel = this.currentBlockLevel;
1198
+ this.previousIndent = this.currentIndent;
707
1199
  }
708
- }, this));
709
- };
710
- Compiler.prototype.parameterize = function(s) {
711
- s = s.replace(/(\s|-)+/g, "_");
712
- return s;
1200
+ this.line_number++;
1201
+ }
1202
+ return this.evaluate(this.root);
713
1203
  };
714
- Compiler.prototype.render = function(filename, namespace) {
715
- var html_escape_function_name, name, output, segment, segments, _i, _len;
716
- if (namespace == null) {
717
- namespace = "HAML";
1204
+
1205
+ Compiler.prototype.evaluate = function(node) {
1206
+ var child, _i, _len, _ref;
1207
+ _ref = node.children;
1208
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
1209
+ child = _ref[_i];
1210
+ this.evaluate(child);
718
1211
  }
719
- output = "window." + namespace + " ?= {}\n";
720
- if (this.options.escape_html) {
721
- if (this.options.custom_html_escape) {
722
- html_escape_function_name = this.options.custom_html_escape;
723
- } else {
724
- html_escape_function_name = "window." + namespace + ".html_escape";
725
- output += html_escape_function_name + '||= (text) ->\n "#{text}"\n .replace(/&/g, "&amp;")\n .replace(/</g, "&lt;")\n .replace(/>/g, "&gt;")\n .replace(/\"/g, "&quot;")\n';
1212
+ return node.evaluate();
1213
+ };
1214
+
1215
+ Compiler.prototype.render = function(templateName, namespace) {
1216
+ var code, escapeFn, output, segment, segments, _i, _len;
1217
+ if (namespace == null) namespace = 'window.HAML';
1218
+ output = '';
1219
+ segments = ("" + namespace + "." + templateName).replace(/(\s|-)+/g, '_').split(/\./);
1220
+ templateName = segments.pop();
1221
+ namespace = segments.shift();
1222
+ if (segments.length !== 0) {
1223
+ for (_i = 0, _len = segments.length; _i < _len; _i++) {
1224
+ segment = segments[_i];
1225
+ namespace += "." + segment;
1226
+ output += "" + namespace + " ?= {}\n";
726
1227
  }
1228
+ } else {
1229
+ output += "" + namespace + " ?= {}\n";
727
1230
  }
728
- segments = this.parameterize(filename).split('/');
729
- name = segments.pop();
730
- for (_i = 0, _len = segments.length; _i < _len; _i++) {
731
- segment = segments[_i];
732
- namespace += "." + segment;
733
- output += "window." + namespace + " ?= {}\n";
1231
+ if (this.options.customHtmlEscape) {
1232
+ escapeFn = this.options.customHtmlEscape;
1233
+ } else {
1234
+ escapeFn = "" + namespace + ".htmlEscape";
1235
+ output += escapeFn + '||= (text) ->\n "#{ text }"\n .replace(/&/g, \'&amp;\')\n .replace(/</g, \'&lt;\')\n .replace(/>/g, \'&gt;\')\n .replace(/\'/g, \'&apos;\')\n .replace(/\"/g, \'&quot;\')\n';
734
1236
  }
735
- output += "window." + namespace + "." + name + " = (context) ->\n";
1237
+ output += "" + namespace + "['" + templateName + "'] = (context) ->\n";
736
1238
  output += " fn = (context) ->\n";
737
- output += " o = []";
738
- if (this.options.escape_html) {
739
- output += "\n e = " + html_escape_function_name;
740
- }
741
- output += this.root.render();
742
- output += " return o.join(\"\\n\")\n";
743
- output += " return fn.call(context)\n";
1239
+ output += " o = []\n";
1240
+ output += " e = " + escapeFn + "\n";
1241
+ code = this.createCode();
1242
+ output += "" + code + "\n";
1243
+ output += " return o.join(\"\\n\")" + (this.cleanupWhitespace(code)) + "\n";
1244
+ output += " return fn.call(context)";
744
1245
  return output;
745
1246
  };
1247
+
1248
+ Compiler.prototype.createCode = function() {
1249
+ var child, code, line, _i, _j, _len, _len2, _ref, _ref2;
1250
+ code = [];
1251
+ this.lines = [];
1252
+ _ref = this.root.children;
1253
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
1254
+ child = _ref[_i];
1255
+ this.lines = this.lines.concat(child.render());
1256
+ }
1257
+ _ref2 = this.lines;
1258
+ for (_j = 0, _len2 = _ref2.length; _j < _len2; _j++) {
1259
+ line = _ref2[_j];
1260
+ if (line !== null) {
1261
+ switch (line.type) {
1262
+ case 'text':
1263
+ code.push("" + (w(line.cw)) + "o.push \"" + (w(line.hw)) + line.text + "\"");
1264
+ break;
1265
+ case 'run':
1266
+ code.push("" + (w(line.cw)) + line.code);
1267
+ break;
1268
+ case 'insert':
1269
+ if (line.hw === 0) {
1270
+ code.push("" + (w(line.cw)) + "o.push " + (w(line.escape) ? 'e ' : '') + line.code);
1271
+ } else {
1272
+ code.push("" + (w(line.cw)) + "o.push " + (w(line.escape) ? 'e' : '') + " \"" + (w(line.hw - line.cw + 2)) + "\" + " + line.code);
1273
+ }
1274
+ }
1275
+ }
1276
+ }
1277
+ return code.join('\n');
1278
+ };
1279
+
1280
+ Compiler.prototype.cleanupWhitespace = function(code) {
1281
+ if (/\u0091|\u0092/.test(code)) {
1282
+ return ".replace(/[\\s\\n]*\\u0091/mg, '').replace(/\\u0092[\\s\\n]*/mg, '')";
1283
+ } else {
1284
+ return '';
1285
+ }
1286
+ };
1287
+
746
1288
  return Compiler;
1289
+
747
1290
  })();
1291
+
748
1292
  }).call(this);
749
1293
 
750
1294
  });