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