haml_coffee_assets 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,7 +1,8 @@
1
1
  # Haml Coffee Assets [![Build Status](https://secure.travis-ci.org/netzpirat/haml_coffee_assets.png)](http://travis-ci.org/netzpirat/haml_coffee_assets)
2
2
 
3
3
  Haml Coffee Assets compiles [Haml Coffee](https://github.com/netzpirat/haml-coffee) templates in the Rails 3.1
4
- asset pipeline, so you can use them as JavaScript templates in your JavaScript heavy Rails application. It also works as [Tilt](https://github.com/rtomayko/tilt/) template without Rails.
4
+ asset pipeline, so you can use them as JavaScript templates in your JavaScript heavy Rails application. It also works as
5
+ a pure [Sprockets](https://github.com/sstephenson/sprockets) engine without Rails.
5
6
 
6
7
  Tested on MRI Ruby 1.8.7, 1.9.2, 1.9.3, REE and the latest version of JRuby.
7
8
 
@@ -25,6 +26,8 @@ Haml Coffee allows you to write inline [CoffeeScript](http://jashkenas.github.co
25
26
  = I18n.t('js.cart.item.remove')
26
27
  ```
27
28
 
29
+ You can try Haml Coffee online by visiting [Haml Coffee Online](http://haml-coffee-online.herokuapp.com/).
30
+
28
31
  Please note that the `I18n` object in the above example is not part ot Haml Coffee Assets, the internationalization
29
32
  functions are provided by the [i18n.js](https://github.com/fnando/i18n-js) library.
30
33
 
@@ -52,6 +55,9 @@ below.
52
55
  Please have a look at the [CHANGELOG](https://github.com/netzpirat/haml_coffee_assets/blob/master/CHANGELOG.md) when
53
56
  upgrading to a newer Haml Coffee Assets version.
54
57
 
58
+ If you want to use Haml Coffee with Sinatra, please have a look at the
59
+ [Haml Coffee Sinatra](https://github.com/netzpirat/haml-coffee-sinatra) demo application.
60
+
55
61
  ## Usage
56
62
 
57
63
  Haml Coffee Assets allows two different ways of generating your JavaScript templates:
@@ -108,8 +114,8 @@ rake assets:clean
108
114
  ```
109
115
 
110
116
  For Rails, you can set the configuration options in your environment by accessing `config.hamlcoffee`, whereas
111
- if you just use the Tilt template you can access the configuration with `HamlCoffeeAssets.config`. All the following
112
- examples use the Rails way.
117
+ if you just use the plain Sprockets engine you can access the configuration with `HamlCoffeeAssets.config`. All the
118
+ following examples use the Rails way.
113
119
 
114
120
  **Please note:** When you put Haml Coffee Assets into the `:assets` group within your `Gemfile` and precompile the
115
121
  assets (the default Rails behaviour), then Haml Coffee Assets is not loaded in production and you can't set any
@@ -1,5 +1,5 @@
1
1
  # coding: UTF-8
2
2
 
3
3
  module HamlCoffeeAssets
4
- VERSION = '1.2.0' unless defined?(HamlCoffeeAssets::VERSION)
4
+ VERSION = '1.3.0' unless defined?(HamlCoffeeAssets::VERSION)
5
5
  end
@@ -363,6 +363,8 @@ require.define("/haml-coffee.js", function (require, module, exports, __dirname,
363
363
 
364
364
  module.exports = HamlCoffee = (function() {
365
365
 
366
+ HamlCoffee.VERSION = '1.3.0';
367
+
366
368
  function HamlCoffee(options) {
367
369
  var _base, _base1, _base2, _base3, _base4, _base5, _base6, _base7, _base8, _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8;
368
370
  this.options = options != null ? options : {};
@@ -534,7 +536,7 @@ require.define("/haml-coffee.js", function (require, module, exports, __dirname,
534
536
  if (/^\s*$/.test(line)) {
535
537
  continue;
536
538
  }
537
- while (/^[%.#].*[{(]/.test(expression) && !/^(\s*)[-=&!~.%#<]/.test(lines[0]) && /([-\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])) {
539
+ while (/^[%.#].*[{(]/.test(expression) && !/^(\s*)[-=&!~.%#</]/.test(lines[0]) && /([-\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])) {
538
540
  attributes = lines.shift();
539
541
  expression = expression.replace(/(\s)+\|\s*$/, '');
540
542
  expression += ' ' + attributes.match(/^\s*(.*?)(\s+\|\s*)?$/)[1];
@@ -979,7 +981,7 @@ require.define("/util/text.js", function (require, module, exports, __dirname, _
979
981
  if (!text) {
980
982
  return '';
981
983
  }
982
- return text.replace(/"/g, '\\"').replace(/\\\\\"/g, '"');
984
+ return text.replace(/"/g, '\\"').replace(/\\\\\"/g, '\\"');
983
985
  },
984
986
  unescapeQuotes: function(text) {
985
987
  if (!text) {
@@ -1255,7 +1257,7 @@ require.define("/nodes/haml.js", function (require, module, exports, __dirname,
1255
1257
  }
1256
1258
  type = exp.substring(0, 1);
1257
1259
  exp = exp.replace(/(=|:|=>)\s*('([^\\']|\\\\|\\')*'|"([^\\"]|\\\\|\\")*")/g, function(match, type, value) {
1258
- return type + (value != null ? value.replace(/(:|=|=>)/, '\u0090$1') : void 0);
1260
+ return type + (value != null ? value.replace(/(:|=|=>)/g, '\u0090$1') : void 0);
1259
1261
  });
1260
1262
  level = 0;
1261
1263
  start = 0;
@@ -1289,7 +1291,7 @@ require.define("/nodes/haml.js", function (require, module, exports, __dirname,
1289
1291
  _ref = markers.reverse();
1290
1292
  for (_j = 0, _len = _ref.length; _j < _len; _j++) {
1291
1293
  marker = _ref[_j];
1292
- exp = exp.substring(0, marker.start) + exp.substring(marker.start, marker.end).replace(/(:|=|=>)/, '\u0090$1') + exp.substring(marker.end);
1294
+ exp = exp.substring(0, marker.start) + exp.substring(marker.start, marker.end).replace(/(:|=|=>)/g, '\u0090$1') + exp.substring(marker.end);
1293
1295
  }
1294
1296
  switch (type) {
1295
1297
  case '(':
@@ -1307,7 +1309,7 @@ require.define("/nodes/haml.js", function (require, module, exports, __dirname,
1307
1309
  if (quoted = key.match(/^("|')(.*)\1$/)) {
1308
1310
  key = quoted[2];
1309
1311
  }
1310
- value = (_ref2 = keyValue[1]) != null ? _ref2.replace(/^\s+|[\s,]+$/g, '').replace(/\u0090/, '') : void 0;
1312
+ value = (_ref2 = keyValue[1]) != null ? _ref2.replace(/^\s+|[\s,]+$/g, '').replace(/\u0090/g, '') : void 0;
1311
1313
  if (key === 'data') {
1312
1314
  inDataAttribute = true;
1313
1315
  hasDataAttribute = true;
@@ -1419,7 +1421,7 @@ require.define("/nodes/haml.js", function (require, module, exports, __dirname,
1419
1421
  };
1420
1422
 
1421
1423
  Haml.prototype.quoteAndEscapeAttributeValue = function(value, code) {
1422
- var quoted, result;
1424
+ var escaped, hasDoubleQuotes, hasInterpolation, hasSingleQuotes, quoted, result, token, tokens, _i, _len;
1423
1425
  if (code == null) {
1424
1426
  code = false;
1425
1427
  }
@@ -1429,22 +1431,92 @@ require.define("/nodes/haml.js", function (require, module, exports, __dirname,
1429
1431
  if (quoted = value.match(/^("|')(.*)\1$/)) {
1430
1432
  value = quoted[2];
1431
1433
  }
1434
+ tokens = this.splitInterpolations(value);
1435
+ hasSingleQuotes = false;
1436
+ hasDoubleQuotes = false;
1437
+ hasInterpolation = false;
1438
+ for (_i = 0, _len = tokens.length; _i < _len; _i++) {
1439
+ token = tokens[_i];
1440
+ if (token.slice(0, 2) === '#{') {
1441
+ hasInterpolation = true;
1442
+ } else {
1443
+ if (!hasSingleQuotes) {
1444
+ hasSingleQuotes = token.indexOf("'") !== -1;
1445
+ }
1446
+ if (!hasDoubleQuotes) {
1447
+ hasDoubleQuotes = token.indexOf('"') !== -1;
1448
+ }
1449
+ }
1450
+ }
1432
1451
  if (code) {
1433
- if (value.indexOf('#{') === -1) {
1434
- result = "'" + value + "'";
1452
+ if (hasInterpolation) {
1453
+ result = "\"" + (tokens.join('')) + "\"";
1435
1454
  } else {
1436
- result = "\"" + value + "\"";
1455
+ result = "'" + (tokens.join('')) + "'";
1437
1456
  }
1438
1457
  } else {
1439
- if (value.indexOf('#{') === -1) {
1440
- result = "'" + (value.replace(/"/g, '\\\"').replace(/'/g, '\\\"')) + "'";
1441
- } else {
1442
- result = "'" + value + "'";
1458
+ if (!hasDoubleQuotes && !hasSingleQuotes) {
1459
+ result = "'" + (tokens.join('')) + "'";
1460
+ }
1461
+ if (hasSingleQuotes && !hasDoubleQuotes) {
1462
+ result = "\\\"" + (tokens.join('')) + "\\\"";
1463
+ }
1464
+ if (hasDoubleQuotes && !hasSingleQuotes) {
1465
+ escaped = (function() {
1466
+ var _j, _len1, _results;
1467
+ _results = [];
1468
+ for (_j = 0, _len1 = tokens.length; _j < _len1; _j++) {
1469
+ token = tokens[_j];
1470
+ _results.push(escapeQuotes(token));
1471
+ }
1472
+ return _results;
1473
+ })();
1474
+ result = "'" + (escaped.join('')) + "'";
1475
+ }
1476
+ if (hasSingleQuotes && hasDoubleQuotes) {
1477
+ escaped = (function() {
1478
+ var _j, _len1, _results;
1479
+ _results = [];
1480
+ for (_j = 0, _len1 = tokens.length; _j < _len1; _j++) {
1481
+ token = tokens[_j];
1482
+ _results.push(escapeQuotes(token).replace(/'/g, '&#39;'));
1483
+ }
1484
+ return _results;
1485
+ })();
1486
+ result = "'" + (escaped.join('')) + "'";
1443
1487
  }
1444
1488
  }
1445
1489
  return result;
1446
1490
  };
1447
1491
 
1492
+ Haml.prototype.splitInterpolations = function(value) {
1493
+ var ch, ch2, level, pos, quoted, start, tokens, _i, _ref;
1494
+ level = 0;
1495
+ start = 0;
1496
+ tokens = [];
1497
+ quoted = false;
1498
+ for (pos = _i = 0, _ref = value.length; 0 <= _ref ? _i < _ref : _i > _ref; pos = 0 <= _ref ? ++_i : --_i) {
1499
+ ch = value[pos];
1500
+ ch2 = value.slice(pos, (pos + 1) + 1 || 9e9);
1501
+ if (ch === '{') {
1502
+ level += 1;
1503
+ }
1504
+ if (ch2 === '#{' && level === 0) {
1505
+ tokens.push(value.slice(start, pos));
1506
+ start = pos;
1507
+ }
1508
+ if (ch === '}') {
1509
+ level -= 1;
1510
+ if (level === 0) {
1511
+ tokens.push(value.slice(start, pos + 1 || 9e9));
1512
+ start = pos + 1;
1513
+ }
1514
+ }
1515
+ }
1516
+ tokens.push(value.slice(start, value.length));
1517
+ return tokens.filter(Boolean);
1518
+ };
1519
+
1448
1520
  Haml.prototype.buildDocType = function(doctype) {
1449
1521
  switch ("" + this.format + " " + doctype) {
1450
1522
  case 'xhtml !!! XML':
@@ -1541,12 +1613,14 @@ require.define("/nodes/code.js", function (require, module, exports, __dirname,
1541
1613
 
1542
1614
  require.define("/nodes/comment.js", function (require, module, exports, __dirname, __filename) {
1543
1615
  (function() {
1544
- var Comment, Node,
1616
+ var Comment, Node, escapeQuotes,
1545
1617
  __hasProp = {}.hasOwnProperty,
1546
1618
  __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; };
1547
1619
 
1548
1620
  Node = require('./node');
1549
1621
 
1622
+ escapeQuotes = require('../util/text').escapeQuotes;
1623
+
1550
1624
  module.exports = Comment = (function(_super) {
1551
1625
 
1552
1626
  __extends(Comment, _super);
@@ -1567,7 +1641,7 @@ require.define("/nodes/comment.js", function (require, module, exports, __dirnam
1567
1641
  return this.closer = this.markText('<![endif]-->');
1568
1642
  case '\/':
1569
1643
  if (comment) {
1570
- this.opener = this.markText("<!-- " + comment);
1644
+ this.opener = this.markText("<!-- " + (escapeQuotes(comment)));
1571
1645
  return this.closer = this.markText(' -->');
1572
1646
  } else {
1573
1647
  this.opener = this.markText("<!--");
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: haml_coffee_assets
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-18 00:00:00.000000000 Z
12
+ date: 2012-08-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: execjs
@@ -107,6 +107,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
107
107
  - - ! '>='
108
108
  - !ruby/object:Gem::Version
109
109
  version: '0'
110
+ segments:
111
+ - 0
112
+ hash: 3865159740158855570
110
113
  required_rubygems_version: !ruby/object:Gem::Requirement
111
114
  none: false
112
115
  requirements: