Initial check-in.
This commit is contained in:
commit
a332ceeb73
|
@ -0,0 +1,4 @@
|
||||||
|
/node_modules/
|
||||||
|
tmp
|
||||||
|
#*
|
||||||
|
*~
|
|
@ -0,0 +1,64 @@
|
||||||
|
module.exports = (grunt) ->
|
||||||
|
|
||||||
|
grunt.initConfig
|
||||||
|
pkg: grunt.file.readJSON('package.json')
|
||||||
|
|
||||||
|
jshint:
|
||||||
|
files: [ "src/**/*.js", "test/**/*.js" ]
|
||||||
|
options:
|
||||||
|
curly: true
|
||||||
|
eqeqeq: true
|
||||||
|
immed: true
|
||||||
|
latedef: true
|
||||||
|
newcap: true
|
||||||
|
noarg: true
|
||||||
|
sub: true
|
||||||
|
undef: true
|
||||||
|
boss: true
|
||||||
|
eqnull: true
|
||||||
|
node: true
|
||||||
|
es5: true
|
||||||
|
|
||||||
|
globals: {}
|
||||||
|
|
||||||
|
clean:
|
||||||
|
files: ["tmp/"]
|
||||||
|
|
||||||
|
coffee:
|
||||||
|
rubyHaml:
|
||||||
|
files:
|
||||||
|
"tasks/ruby-haml.js": "src/ruby-haml.coffee"
|
||||||
|
options:
|
||||||
|
bare: false
|
||||||
|
|
||||||
|
rubyHaml:
|
||||||
|
test_html:
|
||||||
|
files: [
|
||||||
|
{"tmp/01_straight.html": "test/fixtures/01_straight.haml"}
|
||||||
|
{"tmp/02_scored.html": "test/fixtures/02_scored.haml"}
|
||||||
|
]
|
||||||
|
test_js:
|
||||||
|
files: [
|
||||||
|
{"tmp/01_straight.js": "test/fixtures/01_straight.haml"}
|
||||||
|
{"tmp/02_scored.js": "test/fixtures/02_scored.haml"}
|
||||||
|
]
|
||||||
|
options:
|
||||||
|
templatize: true
|
||||||
|
|
||||||
|
nodeunit:
|
||||||
|
files: [ "test/*.js" ]
|
||||||
|
|
||||||
|
watch:
|
||||||
|
files: "<config:jshint.files>"
|
||||||
|
tasks: "default"
|
||||||
|
|
||||||
|
|
||||||
|
grunt.loadTasks "tasks"
|
||||||
|
|
||||||
|
grunt.loadNpmTasks('grunt-coffee')
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-watch')
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-jshint')
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-nodeunit')
|
||||||
|
grunt.loadNpmTasks('grunt-contrib-clean')
|
||||||
|
|
||||||
|
grunt.registerTask "default", ["coffee:rubyHaml", "jshint", "rubyHaml:test_html", "rubyHaml:test_js", "nodeunit", "clean"]
|
|
@ -0,0 +1,22 @@
|
||||||
|
Copyright (c) 2012 Elf M. Sternberg
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person
|
||||||
|
obtaining a copy of this software and associated documentation
|
||||||
|
files (the "Software"), to deal in the Software without
|
||||||
|
restriction, including without limitation the rights to use,
|
||||||
|
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following
|
||||||
|
conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||||
|
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
|
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -0,0 +1,73 @@
|
||||||
|
# grunt-ruby-haml
|
||||||
|
|
||||||
|
Compile your HTML templates using Ruby
|
||||||
|
|
||||||
|
## WHAT!? WHY!?!?!?
|
||||||
|
|
||||||
|
Because I like underscore, and underscore templates. They come free
|
||||||
|
with Backbone. And Ruby's HAML treats them without abusing them.
|
||||||
|
It's not a great solution, but it's better than trying to write yet
|
||||||
|
another HAML parser.
|
||||||
|
|
||||||
|
And before you get me started on Jade, or Mustache, or whatever:
|
||||||
|
forget it. Jade is a big learning curve for little reward, and the
|
||||||
|
rest are templating languages in their own right.
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
Make sure you have Ruby and Haml available in you $PATH.
|
||||||
|
|
||||||
|
Install this grunt plugin next to your project's [grunt.js
|
||||||
|
gruntfile][getting_started] with: `npm install grunt-ruby-haml`
|
||||||
|
|
||||||
|
Then add this line to your project's `grunt.js` gruntfile:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
grunt.loadNpmTasks('grunt-ruby-haml');
|
||||||
|
```
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
You'll need to install `grunt-ruby-haml`:
|
||||||
|
|
||||||
|
npm install grunt-ruby-haml
|
||||||
|
|
||||||
|
Then modify your `Gruntfile.js` file by adding the following line:
|
||||||
|
|
||||||
|
grunt.loadNpmTasks('grunt-ruby-haml');
|
||||||
|
|
||||||
|
Then add some configuration for the plugin like so:
|
||||||
|
|
||||||
|
grunt.initConfig({
|
||||||
|
...
|
||||||
|
ruby-haml: {
|
||||||
|
app: {
|
||||||
|
files: {
|
||||||
|
"public/index.html": "src/index.haml"
|
||||||
|
}
|
||||||
|
options: {
|
||||||
|
templatize: False
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
...
|
||||||
|
});
|
||||||
|
|
||||||
|
Then just run `grunt ruby-haml` and enjoy!
|
||||||
|
|
||||||
|
Ruby-HAML will, by default, generate HTML. With the 'templatize'
|
||||||
|
option set to True, it will instead spit out an underscore template
|
||||||
|
ready to be rendered, wrapped in an AMD-compliant define() call. This
|
||||||
|
may be useful to some of you who want to use the output of the HAML
|
||||||
|
engine as a pre-parsed underscore template.
|
||||||
|
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [grunt][grunt].
|
||||||
|
|
||||||
|
## Release History
|
||||||
|
0.0.1 - Just what I've always run. Don't expect miracles
|
||||||
|
|
||||||
|
## License
|
||||||
|
Copyright (c) 2013 Elf M. Sternberg
|
||||||
|
Licensed under the MIT license.
|
|
@ -0,0 +1,54 @@
|
||||||
|
{
|
||||||
|
"name": "grunt-ruby-haml",
|
||||||
|
"description": "HAML via the Ruby compiler for Grunt",
|
||||||
|
"version": "0.0.3",
|
||||||
|
"homepage": "https://github.com/elfsternberg/grunt-ruby-haml",
|
||||||
|
"author": {
|
||||||
|
"name": "Elf M. Sternberg",
|
||||||
|
"email": "elf.sternberg@gmail.com"
|
||||||
|
},
|
||||||
|
"contributors": [
|
||||||
|
{
|
||||||
|
"name": "Elf M. Sternberg",
|
||||||
|
"url": "https://github.com/elfsternberg"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/elfsternberg/grunt-ruby-haml.git"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/elfsternberg/grunt-ruby-haml/issues"
|
||||||
|
},
|
||||||
|
"licenses": [
|
||||||
|
{
|
||||||
|
"type": "MIT",
|
||||||
|
"url": "https://github.com/elfsternberg/grunt-ruby-haml/blob/master/LICENSE-MIT"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"main": "grunt.js",
|
||||||
|
"engines": {
|
||||||
|
"node": "*"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "grunt test"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"grunt": "=0.4.0a",
|
||||||
|
"coffee-script": "~1.3.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"grunt": "~0.4.x",
|
||||||
|
"coffee-script": "~1.3.1",
|
||||||
|
"grunt-contrib-watch": "~0.1.4",
|
||||||
|
"grunt-contrib-nodeunit": "~0.1.1",
|
||||||
|
"grunt-contrib-jshint": "~0.1.0",
|
||||||
|
"grunt-contrib-clean": ">=0.4.0rc6",
|
||||||
|
"async": "~0.2.2",
|
||||||
|
"underscore": "~1.4.4",
|
||||||
|
"grunt-coffee": "git://github.com/elfsternberg/grunt-coffee.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"gruntplugin"
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
#
|
||||||
|
# grunt-ruby-haml
|
||||||
|
#
|
||||||
|
# Copyright (c) 2013 Elf M. Sternberg
|
||||||
|
# Licensed under the MIT license.
|
||||||
|
#
|
||||||
|
|
||||||
|
_ = require 'underscore'
|
||||||
|
|
||||||
|
module.exports = (grunt) ->
|
||||||
|
|
||||||
|
hamlize = (src, destPath, options, done) ->
|
||||||
|
args =
|
||||||
|
cmd: "haml"
|
||||||
|
args: [ "--unix-newlines", "--no-escape-attrs", "--double-quote-attributes", src ]
|
||||||
|
|
||||||
|
grunt.util.spawn args, (err, result) ->
|
||||||
|
[ext, result] = if options.templatize
|
||||||
|
[".js", "define(function() { return " + _.template(result.stdout).source + "});"]
|
||||||
|
else
|
||||||
|
["html", result.stdout]
|
||||||
|
|
||||||
|
dest = destPath
|
||||||
|
destPath = (if dest then dest else path.dirname(src))
|
||||||
|
if destPath.indexOf(ext, destPath.length - ext.length) == -1
|
||||||
|
dest = path.join(destPath, path.basename(src, ".haml") + ext)
|
||||||
|
|
||||||
|
grunt.file.write dest, result
|
||||||
|
done(null)
|
||||||
|
|
||||||
|
grunt.registerMultiTask "rubyHaml", "Compile HAML with Ruby", ->
|
||||||
|
options = @options({templatize: false})
|
||||||
|
done = @async()
|
||||||
|
sources = _.flatten(([i, file.dest] for i in file.src for file in @files when file.src.length > 0), true)
|
||||||
|
return done() if sources.length is 0
|
||||||
|
grunt.util.async.forEachSeries sources, ((path, cb) ->
|
||||||
|
hamlize path[0], path[1], options, cb
|
||||||
|
), done
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
(function() {
|
||||||
|
var _;
|
||||||
|
|
||||||
|
_ = require('underscore');
|
||||||
|
|
||||||
|
module.exports = function(grunt) {
|
||||||
|
var hamlize;
|
||||||
|
hamlize = function(src, destPath, options, done) {
|
||||||
|
var args;
|
||||||
|
args = {
|
||||||
|
cmd: "haml",
|
||||||
|
args: ["--unix-newlines", "--no-escape-attrs", "--double-quote-attributes", src]
|
||||||
|
};
|
||||||
|
return grunt.util.spawn(args, function(err, result) {
|
||||||
|
var dest, ext, _ref;
|
||||||
|
_ref = options.templatize ? [".js", "define(function() { return " + _.template(result.stdout).source + "});"] : ["html", result.stdout], ext = _ref[0], result = _ref[1];
|
||||||
|
dest = destPath;
|
||||||
|
destPath = (dest ? dest : path.dirname(src));
|
||||||
|
if (destPath.indexOf(ext, destPath.length - ext.length) === -1) {
|
||||||
|
dest = path.join(destPath, path.basename(src, ".haml") + ext);
|
||||||
|
}
|
||||||
|
grunt.file.write(dest, result);
|
||||||
|
return done(null);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
return grunt.registerMultiTask("rubyHaml", "Compile HAML with Ruby", function() {
|
||||||
|
var done, file, i, options, sources;
|
||||||
|
options = this.options({
|
||||||
|
templatize: false
|
||||||
|
});
|
||||||
|
done = this.async();
|
||||||
|
sources = _.flatten((function() {
|
||||||
|
var _i, _len, _ref, _results;
|
||||||
|
_ref = this.files;
|
||||||
|
_results = [];
|
||||||
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||||
|
file = _ref[_i];
|
||||||
|
if (file.src.length > 0) {
|
||||||
|
_results.push((function() {
|
||||||
|
var _j, _len1, _ref1, _results1;
|
||||||
|
_ref1 = file.src;
|
||||||
|
_results1 = [];
|
||||||
|
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
|
||||||
|
i = _ref1[_j];
|
||||||
|
_results1.push([i, file.dest]);
|
||||||
|
}
|
||||||
|
return _results1;
|
||||||
|
})());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return _results;
|
||||||
|
}).call(this), true);
|
||||||
|
if (sources.length === 0) {
|
||||||
|
return done();
|
||||||
|
}
|
||||||
|
return grunt.util.async.forEachSeries(sources, (function(path, cb) {
|
||||||
|
return hamlize(path[0], path[1], options, cb);
|
||||||
|
}), done);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
}).call(this);
|
|
@ -0,0 +1,10 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
|
||||||
|
<title>TEST</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Just testing</h1>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,7 @@
|
||||||
|
define(function() { return function(obj){
|
||||||
|
var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};
|
||||||
|
with(obj||{}){
|
||||||
|
__p+='<!DOCTYPE html>\n<html xmlns="http://www.w3.org/1999/xhtml">\n <head>\n <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />\n <title>TEST</title>\n </head>\n <body>\n <h1>Just testing</h1>\n </body>\n</html>';
|
||||||
|
}
|
||||||
|
return __p;
|
||||||
|
}});
|
|
@ -0,0 +1,10 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
|
||||||
|
<title>TEST</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1><%= (2 + 2) %></h1>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,9 @@
|
||||||
|
define(function() { return function(obj){
|
||||||
|
var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};
|
||||||
|
with(obj||{}){
|
||||||
|
__p+='<!DOCTYPE html>\n<html xmlns="http://www.w3.org/1999/xhtml">\n <head>\n <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />\n <title>TEST</title>\n </head>\n <body>\n <h1>'+
|
||||||
|
((__t=( (2 + 2) ))==null?'':__t)+
|
||||||
|
'</h1>\n </body>\n</html>';
|
||||||
|
}
|
||||||
|
return __p;
|
||||||
|
}});
|
|
@ -0,0 +1,7 @@
|
||||||
|
!!! 5
|
||||||
|
%html{:xmlns => "http://www.w3.org/1999/xhtml"}
|
||||||
|
%head
|
||||||
|
%meta{:content => "text/html; charset=utf-8", "http-equiv" => "Content-Type"}/
|
||||||
|
%title TEST
|
||||||
|
%body
|
||||||
|
%h1 Just testing
|
|
@ -0,0 +1,7 @@
|
||||||
|
!!! 5
|
||||||
|
%html{:xmlns => "http://www.w3.org/1999/xhtml"}
|
||||||
|
%head
|
||||||
|
%meta{:content => "text/html; charset=utf-8", "http-equiv" => "Content-Type"}/
|
||||||
|
%title TEST
|
||||||
|
%body
|
||||||
|
%h1 <%= (2 + 2) %>
|
|
@ -0,0 +1,29 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var grunt = require('grunt'),
|
||||||
|
fs = require('fs'),
|
||||||
|
path = require('path'),
|
||||||
|
files = [
|
||||||
|
["tmp/01_straight.html", "test/expected/01_straight.html"],
|
||||||
|
["tmp/02_scored.html", "test/expected/02_scored.html"],
|
||||||
|
["tmp/01_straight.js", "test/expected/01_straight.js"],
|
||||||
|
["tmp/02_scored.js", "test/expected/02_scored.js"]
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
fs.existsSync = fs.existsSync ? fs.existsSync : path.existsSync;
|
||||||
|
|
||||||
|
exports.coffee = {
|
||||||
|
|
||||||
|
setUp: function(done) {
|
||||||
|
done();
|
||||||
|
},
|
||||||
|
|
||||||
|
'task': function(test) {
|
||||||
|
test.expect(files.length);
|
||||||
|
files.forEach(function(file) {
|
||||||
|
test.equal(grunt.file.read(file[0]), grunt.file.read(file[1]));
|
||||||
|
});
|
||||||
|
test.done();
|
||||||
|
}
|
||||||
|
};
|
Loading…
Reference in New Issue