sass-twitter-bootstrap 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +14 -0
- data/LICENSE +176 -0
- data/Makefile +94 -0
- data/README.md +217 -0
- data/Rakefile +52 -0
- data/bootstrap-2.0.4.css +4661 -0
- data/bootstrap-2.0.4.min.css +9 -0
- data/bootstrap-responsive-2.0.4.css +932 -0
- data/bootstrap-responsive-2.0.4.min.css +9 -0
- data/docs/assets/css/bootstrap-responsive.css +932 -0
- data/docs/assets/css/bootstrap.css +4661 -0
- data/docs/assets/css/docs.css +846 -0
- data/docs/assets/ico/apple-touch-icon-114-precomposed.png +0 -0
- data/docs/assets/ico/apple-touch-icon-144-precomposed.png +0 -0
- data/docs/assets/ico/apple-touch-icon-57-precomposed.png +0 -0
- data/docs/assets/ico/apple-touch-icon-72-precomposed.png +0 -0
- data/docs/assets/ico/favicon.ico +0 -0
- data/docs/assets/img/bird.png +0 -0
- data/docs/assets/img/bootstrap-mdo-sfmoma-01.jpg +0 -0
- data/docs/assets/img/bootstrap-mdo-sfmoma-02.jpg +0 -0
- data/docs/assets/img/bootstrap-mdo-sfmoma-03.jpg +0 -0
- data/docs/assets/img/browsers.png +0 -0
- data/docs/assets/img/example-sites/fleetio.png +0 -0
- data/docs/assets/img/example-sites/jshint.png +0 -0
- data/docs/assets/img/example-sites/kippt.png +0 -0
- data/docs/assets/img/example-sites/soundready.png +0 -0
- data/docs/assets/img/examples/bootstrap-example-fluid.jpg +0 -0
- data/docs/assets/img/examples/bootstrap-example-hero.jpg +0 -0
- data/docs/assets/img/examples/bootstrap-example-starter.jpg +0 -0
- data/docs/assets/img/github-16px.png +0 -0
- data/docs/assets/img/glyphicons-halflings-white.png +0 -0
- data/docs/assets/img/glyphicons-halflings.png +0 -0
- data/docs/assets/img/glyphicons/glyphicons_009_magic.png +0 -0
- data/docs/assets/img/glyphicons/glyphicons_042_group.png +0 -0
- data/docs/assets/img/glyphicons/glyphicons_079_podium.png +0 -0
- data/docs/assets/img/glyphicons/glyphicons_082_roundabout.png +0 -0
- data/docs/assets/img/glyphicons/glyphicons_155_show_thumbnails.png +0 -0
- data/docs/assets/img/glyphicons/glyphicons_163_iphone.png +0 -0
- data/docs/assets/img/glyphicons/glyphicons_214_resize_small.png +0 -0
- data/docs/assets/img/glyphicons/glyphicons_266_book_open.png +0 -0
- data/docs/assets/img/grid-18px-masked.png +0 -0
- data/docs/assets/img/icon-css3.png +0 -0
- data/docs/assets/img/icon-github.png +0 -0
- data/docs/assets/img/icon-html5.png +0 -0
- data/docs/assets/img/icon-twitter.png +0 -0
- data/docs/assets/img/less-logo-large.png +0 -0
- data/docs/assets/img/less-small.png +0 -0
- data/docs/assets/img/responsive-illustrations.png +0 -0
- data/docs/assets/js/README.md +106 -0
- data/docs/assets/js/application.js +184 -0
- data/docs/assets/js/bootstrap-alert.js +90 -0
- data/docs/assets/js/bootstrap-button.js +96 -0
- data/docs/assets/js/bootstrap-carousel.js +169 -0
- data/docs/assets/js/bootstrap-collapse.js +157 -0
- data/docs/assets/js/bootstrap-dropdown.js +100 -0
- data/docs/assets/js/bootstrap-modal.js +218 -0
- data/docs/assets/js/bootstrap-popover.js +98 -0
- data/docs/assets/js/bootstrap-scrollspy.js +151 -0
- data/docs/assets/js/bootstrap-tab.js +135 -0
- data/docs/assets/js/bootstrap-tooltip.js +275 -0
- data/docs/assets/js/bootstrap-transition.js +61 -0
- data/docs/assets/js/bootstrap-typeahead.js +285 -0
- data/docs/assets/js/bootstrap.js +1825 -0
- data/docs/assets/js/bootstrap.min.js +6 -0
- data/docs/assets/js/google-code-prettify/prettify.css +30 -0
- data/docs/assets/js/google-code-prettify/prettify.js +28 -0
- data/docs/assets/js/jquery.js +9252 -0
- data/docs/base-css.html +1710 -0
- data/docs/build/index.js +44 -0
- data/docs/build/node_modules/.bin/hulk +93 -0
- data/docs/build/node_modules/hogan.js/.git_ignore +1 -0
- data/docs/build/node_modules/hogan.js/.gitmodules +3 -0
- data/docs/build/node_modules/hogan.js/LICENSE +177 -0
- data/docs/build/node_modules/hogan.js/Makefile +62 -0
- data/docs/build/node_modules/hogan.js/README.md +93 -0
- data/docs/build/node_modules/hogan.js/bin/hulk +93 -0
- data/docs/build/node_modules/hogan.js/lib/compiler.js +348 -0
- data/docs/build/node_modules/hogan.js/lib/hogan.js +20 -0
- data/docs/build/node_modules/hogan.js/lib/template.js +233 -0
- data/docs/build/node_modules/hogan.js/package.json +20 -0
- data/docs/build/node_modules/hogan.js/test/html/list.html +8 -0
- data/docs/build/node_modules/hogan.js/test/index.html +13 -0
- data/docs/build/node_modules/hogan.js/test/index.js +848 -0
- data/docs/build/node_modules/hogan.js/test/mustache.js +90 -0
- data/docs/build/node_modules/hogan.js/test/spec.js +77 -0
- data/docs/build/node_modules/hogan.js/test/spec/Changes +31 -0
- data/docs/build/node_modules/hogan.js/test/spec/README.md +65 -0
- data/docs/build/node_modules/hogan.js/test/spec/Rakefile +27 -0
- data/docs/build/node_modules/hogan.js/test/spec/TESTING.md +46 -0
- data/docs/build/node_modules/hogan.js/test/spec/specs/comments.json +1 -0
- data/docs/build/node_modules/hogan.js/test/spec/specs/comments.yml +103 -0
- data/docs/build/node_modules/hogan.js/test/spec/specs/delimiters.json +1 -0
- data/docs/build/node_modules/hogan.js/test/spec/specs/delimiters.yml +158 -0
- data/docs/build/node_modules/hogan.js/test/spec/specs/interpolation.json +1 -0
- data/docs/build/node_modules/hogan.js/test/spec/specs/interpolation.yml +230 -0
- data/docs/build/node_modules/hogan.js/test/spec/specs/inverted.json +1 -0
- data/docs/build/node_modules/hogan.js/test/spec/specs/inverted.yml +193 -0
- data/docs/build/node_modules/hogan.js/test/spec/specs/partials.json +1 -0
- data/docs/build/node_modules/hogan.js/test/spec/specs/partials.yml +109 -0
- data/docs/build/node_modules/hogan.js/test/spec/specs/sections.json +1 -0
- data/docs/build/node_modules/hogan.js/test/spec/specs/sections.yml +256 -0
- data/docs/build/node_modules/hogan.js/test/spec/specs/~lambdas.json +1 -0
- data/docs/build/node_modules/hogan.js/test/spec/specs/~lambdas.yml +149 -0
- data/docs/build/node_modules/hogan.js/test/templates/list.mustache +8 -0
- data/docs/build/node_modules/hogan.js/tools/release.js +74 -0
- data/docs/build/node_modules/hogan.js/tools/web_templates.js +32 -0
- data/docs/build/node_modules/hogan.js/web/1.0.0/hogan.js +500 -0
- data/docs/build/node_modules/hogan.js/web/1.0.0/hogan.min.js +14 -0
- data/docs/build/node_modules/hogan.js/web/builds/1.0.0/hogan.js +500 -0
- data/docs/build/node_modules/hogan.js/web/builds/1.0.0/hogan.min.js +14 -0
- data/docs/build/node_modules/hogan.js/web/builds/1.0.3/hogan.js +545 -0
- data/docs/build/node_modules/hogan.js/web/builds/1.0.3/hogan.min.js +5 -0
- data/docs/build/node_modules/hogan.js/web/builds/1.0.5/hogan-1.0.5.amd.js +576 -0
- data/docs/build/node_modules/hogan.js/web/builds/1.0.5/hogan-1.0.5.common.js +576 -0
- data/docs/build/node_modules/hogan.js/web/builds/1.0.5/hogan-1.0.5.js +572 -0
- data/docs/build/node_modules/hogan.js/web/builds/1.0.5/hogan-1.0.5.min.amd.js +5 -0
- data/docs/build/node_modules/hogan.js/web/builds/1.0.5/hogan-1.0.5.min.common.js +5 -0
- data/docs/build/node_modules/hogan.js/web/builds/1.0.5/hogan-1.0.5.min.js +5 -0
- data/docs/build/node_modules/hogan.js/web/builds/1.0.5/hogan-1.0.5.min.mustache.js +5 -0
- data/docs/build/node_modules/hogan.js/web/builds/1.0.5/hogan-1.0.5.mustache.js +619 -0
- data/docs/build/node_modules/hogan.js/web/builds/1.0.5/template-1.0.5.js +233 -0
- data/docs/build/node_modules/hogan.js/web/builds/1.0.5/template-1.0.5.min.js +5 -0
- data/docs/build/node_modules/hogan.js/web/favicon.ico +0 -0
- data/docs/build/node_modules/hogan.js/web/images/logo.png +0 -0
- data/docs/build/node_modules/hogan.js/web/images/noise.png +0 -0
- data/docs/build/node_modules/hogan.js/web/images/small-hogan-icon.png +0 -0
- data/docs/build/node_modules/hogan.js/web/images/stripes.png +0 -0
- data/docs/build/node_modules/hogan.js/web/index.html.mustache +139 -0
- data/docs/build/node_modules/hogan.js/web/stylesheets/layout.css +206 -0
- data/docs/build/node_modules/hogan.js/web/stylesheets/skeleton.css +236 -0
- data/docs/build/node_modules/hogan.js/wrappers/amd.js.mustache +21 -0
- data/docs/build/node_modules/hogan.js/wrappers/common.js.mustache +21 -0
- data/docs/build/node_modules/hogan.js/wrappers/js.mustache +17 -0
- data/docs/build/node_modules/hogan.js/wrappers/mustache.js.mustache +64 -0
- data/docs/build/package.json +6 -0
- data/docs/components.html +1931 -0
- data/docs/download.html +454 -0
- data/docs/examples.html +147 -0
- data/docs/examples/fluid.html +162 -0
- data/docs/examples/hero.html +109 -0
- data/docs/examples/starter-template.html +79 -0
- data/docs/index.html +259 -0
- data/docs/javascript.html +1520 -0
- data/docs/less.html +1060 -0
- data/docs/scaffolding.html +671 -0
- data/docs/templates/layout.mustache +146 -0
- data/docs/templates/pages/base-css.mustache +1594 -0
- data/docs/templates/pages/components.mustache +1815 -0
- data/docs/templates/pages/download.mustache +338 -0
- data/docs/templates/pages/examples.mustache +31 -0
- data/docs/templates/pages/index.mustache +144 -0
- data/docs/templates/pages/javascript.mustache +1405 -0
- data/docs/templates/pages/less.mustache +944 -0
- data/docs/templates/pages/scaffolding.mustache +555 -0
- data/docs/templates/pages/upgrading.mustache +194 -0
- data/docs/upgrading.html +310 -0
- data/js/tests/index.html +54 -0
- data/js/tests/phantom.js +63 -0
- data/js/tests/server.js +14 -0
- data/js/tests/unit/bootstrap-alert.js +56 -0
- data/js/tests/unit/bootstrap-button.js +77 -0
- data/js/tests/unit/bootstrap-carousel.js +28 -0
- data/js/tests/unit/bootstrap-collapse.js +54 -0
- data/js/tests/unit/bootstrap-dropdown.js +87 -0
- data/js/tests/unit/bootstrap-modal.js +114 -0
- data/js/tests/unit/bootstrap-phantom.js +21 -0
- data/js/tests/unit/bootstrap-popover.js +93 -0
- data/js/tests/unit/bootstrap-scrollspy.js +31 -0
- data/js/tests/unit/bootstrap-tab.js +61 -0
- data/js/tests/unit/bootstrap-tooltip.js +155 -0
- data/js/tests/unit/bootstrap-transition.js +13 -0
- data/js/tests/unit/bootstrap-typeahead.js +148 -0
- data/js/tests/vendor/jquery.js +9252 -0
- data/js/tests/vendor/qunit.css +232 -0
- data/js/tests/vendor/qunit.js +1510 -0
- data/lib/sass-twitter-bootstrap.rb +9 -0
- data/lib/sass/twitter/bootstrap/rails.rb +14 -0
- data/lib/sass/twitter/bootstrap/version.rb +7 -0
- data/package.json +25 -0
- data/sass-twitter-bootstrap.gemspec +19 -0
- data/vendor/assets/images/glyphicons-halflings-white.png +0 -0
- data/vendor/assets/images/glyphicons-halflings.png +0 -0
- data/vendor/assets/javascripts/README.md +112 -0
- data/vendor/assets/javascripts/twitter/bootstrap-alert.js +90 -0
- data/vendor/assets/javascripts/twitter/bootstrap-button.js +96 -0
- data/vendor/assets/javascripts/twitter/bootstrap-carousel.js +169 -0
- data/vendor/assets/javascripts/twitter/bootstrap-collapse.js +157 -0
- data/vendor/assets/javascripts/twitter/bootstrap-dropdown.js +100 -0
- data/vendor/assets/javascripts/twitter/bootstrap-modal.js +218 -0
- data/vendor/assets/javascripts/twitter/bootstrap-popover.js +98 -0
- data/vendor/assets/javascripts/twitter/bootstrap-scrollspy.js +151 -0
- data/vendor/assets/javascripts/twitter/bootstrap-tab.js +135 -0
- data/vendor/assets/javascripts/twitter/bootstrap-tooltip.js +275 -0
- data/vendor/assets/javascripts/twitter/bootstrap-transition.js +61 -0
- data/vendor/assets/javascripts/twitter/bootstrap-typeahead.js +285 -0
- data/vendor/assets/javascripts/twitter/bootstrap.js +12 -0
- data/vendor/assets/stylesheets/tests/css-tests.css +52 -0
- data/vendor/assets/stylesheets/tests/css-tests.html +917 -0
- data/vendor/assets/stylesheets/tests/forms.html +179 -0
- data/vendor/assets/stylesheets/tests/navbar.html +108 -0
- data/vendor/assets/stylesheets/twitter/_accordion.scss +33 -0
- data/vendor/assets/stylesheets/twitter/_alerts.scss +58 -0
- data/vendor/assets/stylesheets/twitter/_breadcrumbs.scss +24 -0
- data/vendor/assets/stylesheets/twitter/_button-groups.scss +191 -0
- data/vendor/assets/stylesheets/twitter/_buttons.scss +191 -0
- data/vendor/assets/stylesheets/twitter/_carousel.scss +121 -0
- data/vendor/assets/stylesheets/twitter/_close.scss +29 -0
- data/vendor/assets/stylesheets/twitter/_code.scss +57 -0
- data/vendor/assets/stylesheets/twitter/_component-animations.scss +20 -0
- data/vendor/assets/stylesheets/twitter/_dropdowns.scss +143 -0
- data/vendor/assets/stylesheets/twitter/_forms.scss +582 -0
- data/vendor/assets/stylesheets/twitter/_grid.scss +5 -0
- data/vendor/assets/stylesheets/twitter/_hero-unit.scss +22 -0
- data/vendor/assets/stylesheets/twitter/_labels-badges.scss +52 -0
- data/vendor/assets/stylesheets/twitter/_layouts.scss +17 -0
- data/vendor/assets/stylesheets/twitter/_mixins.scss +643 -0
- data/vendor/assets/stylesheets/twitter/_modals.scss +90 -0
- data/vendor/assets/stylesheets/twitter/_navbar.scss +358 -0
- data/vendor/assets/stylesheets/twitter/_navs.scss +363 -0
- data/vendor/assets/stylesheets/twitter/_pager.scss +36 -0
- data/vendor/assets/stylesheets/twitter/_pagination.scss +56 -0
- data/vendor/assets/stylesheets/twitter/_popovers.scss +49 -0
- data/vendor/assets/stylesheets/twitter/_progress-bars.scss +117 -0
- data/vendor/assets/stylesheets/twitter/_reset.scss +131 -0
- data/vendor/assets/stylesheets/twitter/_responsive-1200px-min.scss +26 -0
- data/vendor/assets/stylesheets/twitter/_responsive-767px-max.scss +149 -0
- data/vendor/assets/stylesheets/twitter/_responsive-768px-979px.scss +17 -0
- data/vendor/assets/stylesheets/twitter/_responsive-navbar.scss +153 -0
- data/vendor/assets/stylesheets/twitter/_responsive-utilities.scss +41 -0
- data/vendor/assets/stylesheets/twitter/_scaffolding.scss +29 -0
- data/vendor/assets/stylesheets/twitter/_sprites.scss +191 -0
- data/vendor/assets/stylesheets/twitter/_tables.scss +155 -0
- data/vendor/assets/stylesheets/twitter/_thumbnails.scss +47 -0
- data/vendor/assets/stylesheets/twitter/_tooltip.scss +35 -0
- data/vendor/assets/stylesheets/twitter/_type.scss +232 -0
- data/vendor/assets/stylesheets/twitter/_utilities.scss +23 -0
- data/vendor/assets/stylesheets/twitter/_variables.scss +204 -0
- data/vendor/assets/stylesheets/twitter/_wells.scss +27 -0
- data/vendor/assets/stylesheets/twitter/bootstrap.scss +62 -0
- data/vendor/assets/stylesheets/twitter/responsive.scss +48 -0
- 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'
|