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