sass-twitter-bootstrap 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +3 -0
  3. data/Gemfile.lock +14 -0
  4. data/LICENSE +176 -0
  5. data/Makefile +94 -0
  6. data/README.md +217 -0
  7. data/Rakefile +52 -0
  8. data/bootstrap-2.0.4.css +4661 -0
  9. data/bootstrap-2.0.4.min.css +9 -0
  10. data/bootstrap-responsive-2.0.4.css +932 -0
  11. data/bootstrap-responsive-2.0.4.min.css +9 -0
  12. data/docs/assets/css/bootstrap-responsive.css +932 -0
  13. data/docs/assets/css/bootstrap.css +4661 -0
  14. data/docs/assets/css/docs.css +846 -0
  15. data/docs/assets/ico/apple-touch-icon-114-precomposed.png +0 -0
  16. data/docs/assets/ico/apple-touch-icon-144-precomposed.png +0 -0
  17. data/docs/assets/ico/apple-touch-icon-57-precomposed.png +0 -0
  18. data/docs/assets/ico/apple-touch-icon-72-precomposed.png +0 -0
  19. data/docs/assets/ico/favicon.ico +0 -0
  20. data/docs/assets/img/bird.png +0 -0
  21. data/docs/assets/img/bootstrap-mdo-sfmoma-01.jpg +0 -0
  22. data/docs/assets/img/bootstrap-mdo-sfmoma-02.jpg +0 -0
  23. data/docs/assets/img/bootstrap-mdo-sfmoma-03.jpg +0 -0
  24. data/docs/assets/img/browsers.png +0 -0
  25. data/docs/assets/img/example-sites/fleetio.png +0 -0
  26. data/docs/assets/img/example-sites/jshint.png +0 -0
  27. data/docs/assets/img/example-sites/kippt.png +0 -0
  28. data/docs/assets/img/example-sites/soundready.png +0 -0
  29. data/docs/assets/img/examples/bootstrap-example-fluid.jpg +0 -0
  30. data/docs/assets/img/examples/bootstrap-example-hero.jpg +0 -0
  31. data/docs/assets/img/examples/bootstrap-example-starter.jpg +0 -0
  32. data/docs/assets/img/github-16px.png +0 -0
  33. data/docs/assets/img/glyphicons-halflings-white.png +0 -0
  34. data/docs/assets/img/glyphicons-halflings.png +0 -0
  35. data/docs/assets/img/glyphicons/glyphicons_009_magic.png +0 -0
  36. data/docs/assets/img/glyphicons/glyphicons_042_group.png +0 -0
  37. data/docs/assets/img/glyphicons/glyphicons_079_podium.png +0 -0
  38. data/docs/assets/img/glyphicons/glyphicons_082_roundabout.png +0 -0
  39. data/docs/assets/img/glyphicons/glyphicons_155_show_thumbnails.png +0 -0
  40. data/docs/assets/img/glyphicons/glyphicons_163_iphone.png +0 -0
  41. data/docs/assets/img/glyphicons/glyphicons_214_resize_small.png +0 -0
  42. data/docs/assets/img/glyphicons/glyphicons_266_book_open.png +0 -0
  43. data/docs/assets/img/grid-18px-masked.png +0 -0
  44. data/docs/assets/img/icon-css3.png +0 -0
  45. data/docs/assets/img/icon-github.png +0 -0
  46. data/docs/assets/img/icon-html5.png +0 -0
  47. data/docs/assets/img/icon-twitter.png +0 -0
  48. data/docs/assets/img/less-logo-large.png +0 -0
  49. data/docs/assets/img/less-small.png +0 -0
  50. data/docs/assets/img/responsive-illustrations.png +0 -0
  51. data/docs/assets/js/README.md +106 -0
  52. data/docs/assets/js/application.js +184 -0
  53. data/docs/assets/js/bootstrap-alert.js +90 -0
  54. data/docs/assets/js/bootstrap-button.js +96 -0
  55. data/docs/assets/js/bootstrap-carousel.js +169 -0
  56. data/docs/assets/js/bootstrap-collapse.js +157 -0
  57. data/docs/assets/js/bootstrap-dropdown.js +100 -0
  58. data/docs/assets/js/bootstrap-modal.js +218 -0
  59. data/docs/assets/js/bootstrap-popover.js +98 -0
  60. data/docs/assets/js/bootstrap-scrollspy.js +151 -0
  61. data/docs/assets/js/bootstrap-tab.js +135 -0
  62. data/docs/assets/js/bootstrap-tooltip.js +275 -0
  63. data/docs/assets/js/bootstrap-transition.js +61 -0
  64. data/docs/assets/js/bootstrap-typeahead.js +285 -0
  65. data/docs/assets/js/bootstrap.js +1825 -0
  66. data/docs/assets/js/bootstrap.min.js +6 -0
  67. data/docs/assets/js/google-code-prettify/prettify.css +30 -0
  68. data/docs/assets/js/google-code-prettify/prettify.js +28 -0
  69. data/docs/assets/js/jquery.js +9252 -0
  70. data/docs/base-css.html +1710 -0
  71. data/docs/build/index.js +44 -0
  72. data/docs/build/node_modules/.bin/hulk +93 -0
  73. data/docs/build/node_modules/hogan.js/.git_ignore +1 -0
  74. data/docs/build/node_modules/hogan.js/.gitmodules +3 -0
  75. data/docs/build/node_modules/hogan.js/LICENSE +177 -0
  76. data/docs/build/node_modules/hogan.js/Makefile +62 -0
  77. data/docs/build/node_modules/hogan.js/README.md +93 -0
  78. data/docs/build/node_modules/hogan.js/bin/hulk +93 -0
  79. data/docs/build/node_modules/hogan.js/lib/compiler.js +348 -0
  80. data/docs/build/node_modules/hogan.js/lib/hogan.js +20 -0
  81. data/docs/build/node_modules/hogan.js/lib/template.js +233 -0
  82. data/docs/build/node_modules/hogan.js/package.json +20 -0
  83. data/docs/build/node_modules/hogan.js/test/html/list.html +8 -0
  84. data/docs/build/node_modules/hogan.js/test/index.html +13 -0
  85. data/docs/build/node_modules/hogan.js/test/index.js +848 -0
  86. data/docs/build/node_modules/hogan.js/test/mustache.js +90 -0
  87. data/docs/build/node_modules/hogan.js/test/spec.js +77 -0
  88. data/docs/build/node_modules/hogan.js/test/spec/Changes +31 -0
  89. data/docs/build/node_modules/hogan.js/test/spec/README.md +65 -0
  90. data/docs/build/node_modules/hogan.js/test/spec/Rakefile +27 -0
  91. data/docs/build/node_modules/hogan.js/test/spec/TESTING.md +46 -0
  92. data/docs/build/node_modules/hogan.js/test/spec/specs/comments.json +1 -0
  93. data/docs/build/node_modules/hogan.js/test/spec/specs/comments.yml +103 -0
  94. data/docs/build/node_modules/hogan.js/test/spec/specs/delimiters.json +1 -0
  95. data/docs/build/node_modules/hogan.js/test/spec/specs/delimiters.yml +158 -0
  96. data/docs/build/node_modules/hogan.js/test/spec/specs/interpolation.json +1 -0
  97. data/docs/build/node_modules/hogan.js/test/spec/specs/interpolation.yml +230 -0
  98. data/docs/build/node_modules/hogan.js/test/spec/specs/inverted.json +1 -0
  99. data/docs/build/node_modules/hogan.js/test/spec/specs/inverted.yml +193 -0
  100. data/docs/build/node_modules/hogan.js/test/spec/specs/partials.json +1 -0
  101. data/docs/build/node_modules/hogan.js/test/spec/specs/partials.yml +109 -0
  102. data/docs/build/node_modules/hogan.js/test/spec/specs/sections.json +1 -0
  103. data/docs/build/node_modules/hogan.js/test/spec/specs/sections.yml +256 -0
  104. data/docs/build/node_modules/hogan.js/test/spec/specs/~lambdas.json +1 -0
  105. data/docs/build/node_modules/hogan.js/test/spec/specs/~lambdas.yml +149 -0
  106. data/docs/build/node_modules/hogan.js/test/templates/list.mustache +8 -0
  107. data/docs/build/node_modules/hogan.js/tools/release.js +74 -0
  108. data/docs/build/node_modules/hogan.js/tools/web_templates.js +32 -0
  109. data/docs/build/node_modules/hogan.js/web/1.0.0/hogan.js +500 -0
  110. data/docs/build/node_modules/hogan.js/web/1.0.0/hogan.min.js +14 -0
  111. data/docs/build/node_modules/hogan.js/web/builds/1.0.0/hogan.js +500 -0
  112. data/docs/build/node_modules/hogan.js/web/builds/1.0.0/hogan.min.js +14 -0
  113. data/docs/build/node_modules/hogan.js/web/builds/1.0.3/hogan.js +545 -0
  114. data/docs/build/node_modules/hogan.js/web/builds/1.0.3/hogan.min.js +5 -0
  115. data/docs/build/node_modules/hogan.js/web/builds/1.0.5/hogan-1.0.5.amd.js +576 -0
  116. data/docs/build/node_modules/hogan.js/web/builds/1.0.5/hogan-1.0.5.common.js +576 -0
  117. data/docs/build/node_modules/hogan.js/web/builds/1.0.5/hogan-1.0.5.js +572 -0
  118. data/docs/build/node_modules/hogan.js/web/builds/1.0.5/hogan-1.0.5.min.amd.js +5 -0
  119. data/docs/build/node_modules/hogan.js/web/builds/1.0.5/hogan-1.0.5.min.common.js +5 -0
  120. data/docs/build/node_modules/hogan.js/web/builds/1.0.5/hogan-1.0.5.min.js +5 -0
  121. data/docs/build/node_modules/hogan.js/web/builds/1.0.5/hogan-1.0.5.min.mustache.js +5 -0
  122. data/docs/build/node_modules/hogan.js/web/builds/1.0.5/hogan-1.0.5.mustache.js +619 -0
  123. data/docs/build/node_modules/hogan.js/web/builds/1.0.5/template-1.0.5.js +233 -0
  124. data/docs/build/node_modules/hogan.js/web/builds/1.0.5/template-1.0.5.min.js +5 -0
  125. data/docs/build/node_modules/hogan.js/web/favicon.ico +0 -0
  126. data/docs/build/node_modules/hogan.js/web/images/logo.png +0 -0
  127. data/docs/build/node_modules/hogan.js/web/images/noise.png +0 -0
  128. data/docs/build/node_modules/hogan.js/web/images/small-hogan-icon.png +0 -0
  129. data/docs/build/node_modules/hogan.js/web/images/stripes.png +0 -0
  130. data/docs/build/node_modules/hogan.js/web/index.html.mustache +139 -0
  131. data/docs/build/node_modules/hogan.js/web/stylesheets/layout.css +206 -0
  132. data/docs/build/node_modules/hogan.js/web/stylesheets/skeleton.css +236 -0
  133. data/docs/build/node_modules/hogan.js/wrappers/amd.js.mustache +21 -0
  134. data/docs/build/node_modules/hogan.js/wrappers/common.js.mustache +21 -0
  135. data/docs/build/node_modules/hogan.js/wrappers/js.mustache +17 -0
  136. data/docs/build/node_modules/hogan.js/wrappers/mustache.js.mustache +64 -0
  137. data/docs/build/package.json +6 -0
  138. data/docs/components.html +1931 -0
  139. data/docs/download.html +454 -0
  140. data/docs/examples.html +147 -0
  141. data/docs/examples/fluid.html +162 -0
  142. data/docs/examples/hero.html +109 -0
  143. data/docs/examples/starter-template.html +79 -0
  144. data/docs/index.html +259 -0
  145. data/docs/javascript.html +1520 -0
  146. data/docs/less.html +1060 -0
  147. data/docs/scaffolding.html +671 -0
  148. data/docs/templates/layout.mustache +146 -0
  149. data/docs/templates/pages/base-css.mustache +1594 -0
  150. data/docs/templates/pages/components.mustache +1815 -0
  151. data/docs/templates/pages/download.mustache +338 -0
  152. data/docs/templates/pages/examples.mustache +31 -0
  153. data/docs/templates/pages/index.mustache +144 -0
  154. data/docs/templates/pages/javascript.mustache +1405 -0
  155. data/docs/templates/pages/less.mustache +944 -0
  156. data/docs/templates/pages/scaffolding.mustache +555 -0
  157. data/docs/templates/pages/upgrading.mustache +194 -0
  158. data/docs/upgrading.html +310 -0
  159. data/js/tests/index.html +54 -0
  160. data/js/tests/phantom.js +63 -0
  161. data/js/tests/server.js +14 -0
  162. data/js/tests/unit/bootstrap-alert.js +56 -0
  163. data/js/tests/unit/bootstrap-button.js +77 -0
  164. data/js/tests/unit/bootstrap-carousel.js +28 -0
  165. data/js/tests/unit/bootstrap-collapse.js +54 -0
  166. data/js/tests/unit/bootstrap-dropdown.js +87 -0
  167. data/js/tests/unit/bootstrap-modal.js +114 -0
  168. data/js/tests/unit/bootstrap-phantom.js +21 -0
  169. data/js/tests/unit/bootstrap-popover.js +93 -0
  170. data/js/tests/unit/bootstrap-scrollspy.js +31 -0
  171. data/js/tests/unit/bootstrap-tab.js +61 -0
  172. data/js/tests/unit/bootstrap-tooltip.js +155 -0
  173. data/js/tests/unit/bootstrap-transition.js +13 -0
  174. data/js/tests/unit/bootstrap-typeahead.js +148 -0
  175. data/js/tests/vendor/jquery.js +9252 -0
  176. data/js/tests/vendor/qunit.css +232 -0
  177. data/js/tests/vendor/qunit.js +1510 -0
  178. data/lib/sass-twitter-bootstrap.rb +9 -0
  179. data/lib/sass/twitter/bootstrap/rails.rb +14 -0
  180. data/lib/sass/twitter/bootstrap/version.rb +7 -0
  181. data/package.json +25 -0
  182. data/sass-twitter-bootstrap.gemspec +19 -0
  183. data/vendor/assets/images/glyphicons-halflings-white.png +0 -0
  184. data/vendor/assets/images/glyphicons-halflings.png +0 -0
  185. data/vendor/assets/javascripts/README.md +112 -0
  186. data/vendor/assets/javascripts/twitter/bootstrap-alert.js +90 -0
  187. data/vendor/assets/javascripts/twitter/bootstrap-button.js +96 -0
  188. data/vendor/assets/javascripts/twitter/bootstrap-carousel.js +169 -0
  189. data/vendor/assets/javascripts/twitter/bootstrap-collapse.js +157 -0
  190. data/vendor/assets/javascripts/twitter/bootstrap-dropdown.js +100 -0
  191. data/vendor/assets/javascripts/twitter/bootstrap-modal.js +218 -0
  192. data/vendor/assets/javascripts/twitter/bootstrap-popover.js +98 -0
  193. data/vendor/assets/javascripts/twitter/bootstrap-scrollspy.js +151 -0
  194. data/vendor/assets/javascripts/twitter/bootstrap-tab.js +135 -0
  195. data/vendor/assets/javascripts/twitter/bootstrap-tooltip.js +275 -0
  196. data/vendor/assets/javascripts/twitter/bootstrap-transition.js +61 -0
  197. data/vendor/assets/javascripts/twitter/bootstrap-typeahead.js +285 -0
  198. data/vendor/assets/javascripts/twitter/bootstrap.js +12 -0
  199. data/vendor/assets/stylesheets/tests/css-tests.css +52 -0
  200. data/vendor/assets/stylesheets/tests/css-tests.html +917 -0
  201. data/vendor/assets/stylesheets/tests/forms.html +179 -0
  202. data/vendor/assets/stylesheets/tests/navbar.html +108 -0
  203. data/vendor/assets/stylesheets/twitter/_accordion.scss +33 -0
  204. data/vendor/assets/stylesheets/twitter/_alerts.scss +58 -0
  205. data/vendor/assets/stylesheets/twitter/_breadcrumbs.scss +24 -0
  206. data/vendor/assets/stylesheets/twitter/_button-groups.scss +191 -0
  207. data/vendor/assets/stylesheets/twitter/_buttons.scss +191 -0
  208. data/vendor/assets/stylesheets/twitter/_carousel.scss +121 -0
  209. data/vendor/assets/stylesheets/twitter/_close.scss +29 -0
  210. data/vendor/assets/stylesheets/twitter/_code.scss +57 -0
  211. data/vendor/assets/stylesheets/twitter/_component-animations.scss +20 -0
  212. data/vendor/assets/stylesheets/twitter/_dropdowns.scss +143 -0
  213. data/vendor/assets/stylesheets/twitter/_forms.scss +582 -0
  214. data/vendor/assets/stylesheets/twitter/_grid.scss +5 -0
  215. data/vendor/assets/stylesheets/twitter/_hero-unit.scss +22 -0
  216. data/vendor/assets/stylesheets/twitter/_labels-badges.scss +52 -0
  217. data/vendor/assets/stylesheets/twitter/_layouts.scss +17 -0
  218. data/vendor/assets/stylesheets/twitter/_mixins.scss +643 -0
  219. data/vendor/assets/stylesheets/twitter/_modals.scss +90 -0
  220. data/vendor/assets/stylesheets/twitter/_navbar.scss +358 -0
  221. data/vendor/assets/stylesheets/twitter/_navs.scss +363 -0
  222. data/vendor/assets/stylesheets/twitter/_pager.scss +36 -0
  223. data/vendor/assets/stylesheets/twitter/_pagination.scss +56 -0
  224. data/vendor/assets/stylesheets/twitter/_popovers.scss +49 -0
  225. data/vendor/assets/stylesheets/twitter/_progress-bars.scss +117 -0
  226. data/vendor/assets/stylesheets/twitter/_reset.scss +131 -0
  227. data/vendor/assets/stylesheets/twitter/_responsive-1200px-min.scss +26 -0
  228. data/vendor/assets/stylesheets/twitter/_responsive-767px-max.scss +149 -0
  229. data/vendor/assets/stylesheets/twitter/_responsive-768px-979px.scss +17 -0
  230. data/vendor/assets/stylesheets/twitter/_responsive-navbar.scss +153 -0
  231. data/vendor/assets/stylesheets/twitter/_responsive-utilities.scss +41 -0
  232. data/vendor/assets/stylesheets/twitter/_scaffolding.scss +29 -0
  233. data/vendor/assets/stylesheets/twitter/_sprites.scss +191 -0
  234. data/vendor/assets/stylesheets/twitter/_tables.scss +155 -0
  235. data/vendor/assets/stylesheets/twitter/_thumbnails.scss +47 -0
  236. data/vendor/assets/stylesheets/twitter/_tooltip.scss +35 -0
  237. data/vendor/assets/stylesheets/twitter/_type.scss +232 -0
  238. data/vendor/assets/stylesheets/twitter/_utilities.scss +23 -0
  239. data/vendor/assets/stylesheets/twitter/_variables.scss +204 -0
  240. data/vendor/assets/stylesheets/twitter/_wells.scss +27 -0
  241. data/vendor/assets/stylesheets/twitter/bootstrap.scss +62 -0
  242. data/vendor/assets/stylesheets/twitter/responsive.scss +48 -0
  243. metadata +304 -0
@@ -0,0 +1,90 @@
1
+ /*
2
+ * Copyright 2011 Twitter, Inc.
3
+ * Licensed under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License.
5
+ * You may obtain a copy of the License at
6
+ *
7
+ * http://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software
10
+ * distributed under the License is distributed on an "AS IS" BASIS,
11
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ * See the License for the specific language governing permissions and
13
+ * limitations under the License.
14
+ */
15
+
16
+ var doc = this['document'];
17
+ var fs = require('fs');
18
+
19
+ var passed = 0;
20
+ var failed = 0;
21
+
22
+ if (!this['output']) {
23
+ var output = function (string) {
24
+ return doc ? doc.write(string + '<br/>') : console.log(string);
25
+ };
26
+ }
27
+
28
+ var Hogan = require(__dirname + '/../lib/hogan');
29
+ var template = fs.readFileSync(__dirname + '/../lib/template.js').toString();
30
+ var compiler = fs.readFileSync(__dirname + '/../lib/compiler.js').toString();
31
+ var mustache_wrapper = fs.readFileSync(__dirname + '/../wrappers/mustache.js.mustache').toString();
32
+
33
+ // Create a Mustache.js emulator from the distribution template
34
+ var engines = (new Function(Hogan.compile(mustache_wrapper).render({template: template, compiler: compiler}) +
35
+ '; return {Hogan: Hogan, Mustache: Mustache};'))();
36
+
37
+ var Mustache = engines.Mustache;
38
+ var Hogan2 = engines.Hogan;
39
+
40
+
41
+ // sanity check
42
+ is(Mustache.hasOwnProperty('to_html'), true, 'Mustache has to_html method.');
43
+
44
+ // Check for Mustache.js partial resolution behavior.
45
+ var context = {
46
+ foo: 'bar',
47
+ mypartial: {
48
+ baz: 'qux'
49
+ }
50
+ }
51
+ var text = 'abc {{foo}} def {{>mypartial}} ghi';
52
+ var partialText = '{{baz}}';
53
+ var s = Mustache.to_html(text, context, {'mypartial': partialText});
54
+ is(s, 'abc bar def qux ghi', 'Correct emulation of Mustache.js partial-name-in-context resolution.');
55
+
56
+ // Now check to see that the Hogan resolution is unaffected.
57
+ var t = Hogan2.compile(text);
58
+ s = t.render(context, {'mypartial': partialText});
59
+ is(s, 'abc bar def ghi', 'Hogan behavior not changed by Mustache.js emulation.');
60
+
61
+ // Check for sendFun behavior
62
+ var buf = "";
63
+ function send(s) {
64
+ buf += "-FOO " + s + " FOO-";
65
+ }
66
+ var s = Mustache.to_html(text, context, {'mypartial': partialText}, send);
67
+ is(buf, '-FOO abc bar def qux ghi FOO-', 'Correct emulation of Mustache.js sendFun.');
68
+
69
+
70
+ function is(got, expected, msg) {
71
+ if (got === expected) {
72
+ output("OK: " + msg);
73
+ ++passed;
74
+ } else {
75
+ output("FAIL: " + msg);
76
+ output("Expected |" + expected + "|");
77
+ output(" Got |" + got + "|");
78
+ ++failed;
79
+ }
80
+ }
81
+
82
+ function complete() {
83
+ output("\nTests Complete");
84
+ output("--------------");
85
+ output("Passed: " + passed);
86
+ output("Failed: " + failed);
87
+ output("\n");
88
+ }
89
+
90
+ complete();
@@ -0,0 +1,77 @@
1
+ /*
2
+ * Copyright 2011 Twitter, Inc.
3
+ * Licensed under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License.
5
+ * You may obtain a copy of the License at
6
+ *
7
+ * http://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software
10
+ * distributed under the License is distributed on an "AS IS" BASIS,
11
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ * See the License for the specific language governing permissions and
13
+ * limitations under the License.
14
+ */
15
+
16
+ var Hogan = Hogan || require('../lib/hogan');
17
+ var doc = this["document"];
18
+ var fs = require('fs');
19
+
20
+ var passed = 0;
21
+ var failed = 0;
22
+
23
+ if (!this["output"]) {
24
+ var output = function (string) {
25
+ return doc ? doc.write(string + '<br/>') : console.log(string);
26
+ };
27
+ }
28
+
29
+ function runTest(tests) {
30
+ tests.forEach(function(test) {
31
+ var partials = {};
32
+ for (var i in test.partials) {
33
+ partials[i] = Hogan.compile(test.partials[i]);
34
+ }
35
+ var t = Hogan.compile(test.template);
36
+
37
+ if (test.data.lambda) {
38
+ var func = (new Function ('return ' + test.data.lambda.js)());
39
+ test.data.lambda = function() { return func; };
40
+ }
41
+
42
+ var s = t.render(test.data, partials);
43
+ is(s, test.expected, test.name + ': ' + test.desc);
44
+ });
45
+ }
46
+
47
+ var testDir = './test/spec/specs';
48
+ var files = fs.readdirSync(testDir)
49
+ .filter(function(f) { return f.indexOf('.json') > 0; })
50
+ .map(function(f) { return testDir + '/' + f});
51
+
52
+ for (var i = 0; i < files.length; i++) {
53
+ var test = JSON.parse(fs.readFileSync(files[i]).toString());
54
+ runTest(test.tests);
55
+ }
56
+
57
+ function is(got, expected, msg) {
58
+ if (got === expected) {
59
+ output("OK: " + msg);
60
+ ++passed;
61
+ } else {
62
+ output("FAIL: " + msg);
63
+ output("Expected |" + expected + "|");
64
+ output(" Got |" + got + "|");
65
+ ++failed;
66
+ }
67
+ }
68
+
69
+ function complete() {
70
+ output("\nTests Complete");
71
+ output("--------------");
72
+ output("Passed: " + passed);
73
+ output("Failed: " + failed);
74
+ output("\n");
75
+ }
76
+
77
+ complete();
@@ -0,0 +1,31 @@
1
+ 2011-03-20: v1.1.2
2
+ Added tests for standalone tags at string boundaries.
3
+ Added tests for rendering lambda returns after delimiter changes.
4
+
5
+ 2011-03-20: v1.0.3
6
+ Added tests for standalone tags at string boundaries.
7
+ Added tests for rendering lambda returns after delimiter changes.
8
+
9
+ 2011-03-05: v1.1.1
10
+ Added tests for indented inline sections.
11
+ Added tests for Windows-style newlines.
12
+
13
+ 2011-03-05: v1.0.2
14
+ Added tests for indented inline sections.
15
+ Added tests for Windows-style newlines.
16
+
17
+ 2011-03-04: v1.1.0
18
+ Implicit iterators.
19
+ A single period (`.`) may now be used as a name in Interpolation tags,
20
+ which represents the top of stack (cast as a String).
21
+ Dotted names.
22
+ Names containing one or more periods should be resolved as chained
23
+ properties; naïvely, this is like nesting section tags, but with some
24
+ built-in scoping protections.
25
+
26
+ 2011-03-02: v1.0.1
27
+ Clarifying a point in the README about version compliance.
28
+ Adding high-level documentation to each spec file.
29
+
30
+ 2011-02-28: v1.0.0
31
+ Initial Release
@@ -0,0 +1,65 @@
1
+ The repository at https://github.com/mustache/spec is the formal standard for
2
+ Mustache. It defines both normal usage and edge-case behavior for libraries
3
+ parsing the Mustache templating language (or a superset thereof).
4
+
5
+ The specification is developed as a series of YAML files, under the `specs`
6
+ directory.
7
+
8
+ Versioning
9
+ ----------
10
+ This specification is being [semantically versioned](http://semver.org).
11
+ Roughly described, major version changes will always represent backwards
12
+ incompatible changes, minor version changes will always represent new language
13
+ features and will be backwards compatible, and patch ('tiny') version changes
14
+ will always be bug fixes. For the purposes of semantic versioning, the public
15
+ API is the contents of the `specs` directory and the algorithm for testing
16
+ against it.
17
+
18
+ Mustache implementations SHOULD report the most recent version of the spec
19
+ (major and minor version numbers). If an implementation has support for any
20
+ optional modules, they SHOULD indicate so with a remark attached to the
21
+ version number (e.g. "vX.Y, including lambdas" or "v.X.Y+λ"). It is
22
+ RECOMMENDED that implementations not supporting at least v1.0.0 of this spec
23
+ refer to themselves as "Mustache-like", or "Mustache-inspired".
24
+
25
+ Alternate Formats
26
+ -----------------
27
+
28
+ Since YAML is a reasonably complex format that not every language has good
29
+ tools for working with, we also provide JSON versions of the specs on a
30
+ best-effort basis.
31
+
32
+ These should be identical to the YAML specifications, but if you find the need
33
+ to regenerate them, they can be trivially rebuilt by invoking `rake build`.
34
+
35
+ It is also worth noting that some specifications (notably, the lambda module)
36
+ rely on YAML "tags" to denote special types of data (e.g. source code). Since
37
+ JSON offers no way to denote this, a special key ("`__tag__`") is injected
38
+ with the name of the tag as its value. See `TESTING.md` for more information
39
+ about handling tagged data.
40
+
41
+ Optional Modules
42
+ ----------------
43
+
44
+ Specification files beginning with a tilde (`~`) describe optional modules.
45
+ At present, the only module being described as optional is regarding support
46
+ for lambdas. As a guideline, a module may be a candidate for optionality
47
+ when:
48
+
49
+ * It does not affect the core syntax of the language.
50
+ * It does not significantly affect the output of rendered templates.
51
+ * It concerns implementation language features or data types that are not
52
+ common to or core in every targeted language.
53
+ * The lack of support by an implementation does not diminish the usage of
54
+ Mustache in the target language.
55
+
56
+ As an example, the lambda module is primarily concerned with the handling of a
57
+ particular data type (code). This is a type of data that may be difficult to
58
+ support in some languages, and users of those languages will not see the lack
59
+ as an 'inconsistency' between implementations.
60
+
61
+ Support for specific pragmas or syntax extensions, however, are best managed
62
+ outside this core specification, as adjunct specifications.
63
+
64
+ Implementors are strongly encouraged to support any and all modules they are
65
+ reasonably capable of supporting.
@@ -0,0 +1,27 @@
1
+ require 'json'
2
+ require 'yaml'
3
+
4
+ # Our custom YAML tags must retain their magic.
5
+ %w[ code ].each do |tag|
6
+ YAML::add_builtin_type(tag) { |_,val| val.merge(:__tag__ => tag) }
7
+ end
8
+
9
+ desc 'Build all alternate versions of the specs.'
10
+ multitask :build => [ 'build:json' ]
11
+
12
+ namespace :build do
13
+ note = 'Do not edit this file; changes belong in the appropriate YAML file.'
14
+
15
+ desc 'Build JSON versions of the specs.'
16
+ task :json do
17
+ rm(Dir['specs/*.json'], :verbose => false)
18
+ Dir.glob('specs/*.yml').each do |filename|
19
+ json_file = filename.gsub('.yml', '.json')
20
+
21
+ File.open(json_file, 'w') do |file|
22
+ doc = YAML.load_file(filename)
23
+ file << doc.merge(:__ATTN__ => note).to_json()
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,46 @@
1
+ Testing your Mustache implementation against this specification should be
2
+ relatively simple. If you have a readily available testing framework on your
3
+ platform, your task may be even simpler.
4
+
5
+ In general, the process for each `.yml` file is as follows:
6
+
7
+ 1. Use a YAML parser to load the file.
8
+
9
+ 2. For each test in the 'tests' array:
10
+
11
+ 1. Ensure that each element of the 'partials' hash (if it exists) is
12
+ stored in a place where the interpreter will look for it.
13
+
14
+ 2. If your implementation will not support lambdas, feel free to skip over
15
+ the optional '~lambdas.yml' file.
16
+
17
+ 2.1. If your implementation will support lambdas, ensure that each member of
18
+ 'data' tagged with '!code' is properly processed into a language-
19
+ specific lambda reference.
20
+
21
+ * e.g. Given this YAML data hash:
22
+
23
+ `{ x: !code { ruby: 'proc { "x" }', perl: 'sub { "x" }' } }`
24
+
25
+ a Ruby-based Mustache implementation would process it such that it
26
+ was equivalent to this Ruby hash:
27
+
28
+ `{ 'x' => proc { "x" } }`
29
+
30
+ * If your implementation language does not currently have lambda
31
+ examples in the spec, feel free to implement them and send a pull
32
+ request.
33
+
34
+ * The JSON version of the spec represents these tagged values as a hash
35
+ with a '`__tag__`' key of 'code'.
36
+
37
+ 3. Render the template (stored in the 'template' key) with the given 'data'
38
+ hash.
39
+
40
+ 4. Compare the results of your rendering against the 'expected' value; any
41
+ differences should be reported, along with any useful debugging
42
+ information.
43
+
44
+ * Of note, the 'desc' key contains a rough one-line description of the
45
+ behavior being tested -- this is most useful in conjunction with the
46
+ file name and test 'name'.
@@ -0,0 +1 @@
1
+ {"__ATTN__":"Do not edit this file; changes belong in the appropriate YAML file.","overview":"Comment tags represent content that should never appear in the resulting\noutput.\n\nThe tag's content may contain any substring (including newlines) EXCEPT the\nclosing delimiter.\n\nComment tags SHOULD be treated as standalone when appropriate.\n","tests":[{"name":"Inline","data":{},"expected":"1234567890","template":"12345{{! Comment Block! }}67890","desc":"Comment blocks should be removed from the template."},{"name":"Multiline","data":{},"expected":"1234567890\n","template":"12345{{!\n This is a\n multi-line comment...\n}}67890\n","desc":"Multiline comments should be permitted."},{"name":"Standalone","data":{},"expected":"Begin.\nEnd.\n","template":"Begin.\n{{! Comment Block! }}\nEnd.\n","desc":"All standalone comment lines should be removed."},{"name":"Indented Standalone","data":{},"expected":"Begin.\nEnd.\n","template":"Begin.\n {{! Indented Comment Block! }}\nEnd.\n","desc":"All standalone comment lines should be removed."},{"name":"Standalone Line Endings","data":{},"expected":"|\r\n|","template":"|\r\n{{! Standalone Comment }}\r\n|","desc":"\"\\r\\n\" should be considered a newline for standalone tags."},{"name":"Standalone Without Previous Line","data":{},"expected":"!","template":" {{! I'm Still Standalone }}\n!","desc":"Standalone tags should not require a newline to precede them."},{"name":"Standalone Without Newline","data":{},"expected":"!\n","template":"!\n {{! I'm Still Standalone }}","desc":"Standalone tags should not require a newline to follow them."},{"name":"Multiline Standalone","data":{},"expected":"Begin.\nEnd.\n","template":"Begin.\n{{!\nSomething's going on here...\n}}\nEnd.\n","desc":"All standalone comment lines should be removed."},{"name":"Indented Multiline Standalone","data":{},"expected":"Begin.\nEnd.\n","template":"Begin.\n {{!\n Something's going on here...\n }}\nEnd.\n","desc":"All standalone comment lines should be removed."},{"name":"Indented Inline","data":{},"expected":" 12 \n","template":" 12 {{! 34 }}\n","desc":"Inline comments should not strip whitespace"},{"name":"Surrounding Whitespace","data":{},"expected":"12345 67890","template":"12345 {{! Comment Block! }} 67890","desc":"Comment removal should preserve surrounding whitespace."}]}
@@ -0,0 +1,103 @@
1
+ overview: |
2
+ Comment tags represent content that should never appear in the resulting
3
+ output.
4
+
5
+ The tag's content may contain any substring (including newlines) EXCEPT the
6
+ closing delimiter.
7
+
8
+ Comment tags SHOULD be treated as standalone when appropriate.
9
+ tests:
10
+ - name: Inline
11
+ desc: Comment blocks should be removed from the template.
12
+ data: { }
13
+ template: '12345{{! Comment Block! }}67890'
14
+ expected: '1234567890'
15
+
16
+ - name: Multiline
17
+ desc: Multiline comments should be permitted.
18
+ data: { }
19
+ template: |
20
+ 12345{{!
21
+ This is a
22
+ multi-line comment...
23
+ }}67890
24
+ expected: |
25
+ 1234567890
26
+
27
+ - name: Standalone
28
+ desc: All standalone comment lines should be removed.
29
+ data: { }
30
+ template: |
31
+ Begin.
32
+ {{! Comment Block! }}
33
+ End.
34
+ expected: |
35
+ Begin.
36
+ End.
37
+
38
+ - name: Indented Standalone
39
+ desc: All standalone comment lines should be removed.
40
+ data: { }
41
+ template: |
42
+ Begin.
43
+ {{! Indented Comment Block! }}
44
+ End.
45
+ expected: |
46
+ Begin.
47
+ End.
48
+
49
+ - name: Standalone Line Endings
50
+ desc: '"\r\n" should be considered a newline for standalone tags.'
51
+ data: { }
52
+ template: "|\r\n{{! Standalone Comment }}\r\n|"
53
+ expected: "|\r\n|"
54
+
55
+ - name: Standalone Without Previous Line
56
+ desc: Standalone tags should not require a newline to precede them.
57
+ data: { }
58
+ template: " {{! I'm Still Standalone }}\n!"
59
+ expected: "!"
60
+
61
+ - name: Standalone Without Newline
62
+ desc: Standalone tags should not require a newline to follow them.
63
+ data: { }
64
+ template: "!\n {{! I'm Still Standalone }}"
65
+ expected: "!\n"
66
+
67
+ - name: Multiline Standalone
68
+ desc: All standalone comment lines should be removed.
69
+ data: { }
70
+ template: |
71
+ Begin.
72
+ {{!
73
+ Something's going on here...
74
+ }}
75
+ End.
76
+ expected: |
77
+ Begin.
78
+ End.
79
+
80
+ - name: Indented Multiline Standalone
81
+ desc: All standalone comment lines should be removed.
82
+ data: { }
83
+ template: |
84
+ Begin.
85
+ {{!
86
+ Something's going on here...
87
+ }}
88
+ End.
89
+ expected: |
90
+ Begin.
91
+ End.
92
+
93
+ - name: Indented Inline
94
+ desc: Inline comments should not strip whitespace
95
+ data: { }
96
+ template: " 12 {{! 34 }}\n"
97
+ expected: " 12 \n"
98
+
99
+ - name: Surrounding Whitespace
100
+ desc: Comment removal should preserve surrounding whitespace.
101
+ data: { }
102
+ template: '12345 {{! Comment Block! }} 67890'
103
+ expected: '12345 67890'