sass-twitter-bootstrap 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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'