--- /dev/null
-../hogan.js/bin/hulk
++#!/usr/bin/env node
++
++/*
++ * Copyright 2011 Twitter, Inc.
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++var hogan = require('../lib/hogan.js'),
++ path = require('path'),
++ fs = require('fs');
++
++var specials = ['/', '.', '*', '+', '?', '|','(', ')', '[', ']', '{', '}', '\\'],
++ specialsRegExp = new RegExp('(\\' + specials.join('|\\') + ')', 'g'),
++ templates;
++
++
++// Escape special regexp characters
++function esc(text) {
++ return text.replace(specialsRegExp, '\\$1');
++}
++
++
++// Check for dirs and correct ext (<3 for windows)
++function extractFiles(args) {
++ var usage = 'USAGE: hulk ./templates/*.mustaches\n' +
++ 'NOTE: hulk supports the "*" wildcard and allows you to target specific extensions too',
++ files = [];
++
++ if (!args.length) {
++ console.log(usage);
++ process.exit(-1);
++ }
++
++ args.forEach(function (arg) {
++
++ if (/\*/.test(arg)) {
++ arg = arg.split('*');
++ return files = files.concat(
++ fs.readdirSync(arg[0] || '.')
++ .map(function (f) {
++ return new RegExp(esc(arg[1]) + '$').test(f) && path.join(arg[0], f);
++ })
++ .filter(function (f) {
++ return f;
++ })
++ );
++ }
++
++ files.push(arg);
++
++ })
++
++ return files;
++}
++
++
++// Remove utf-8 byte order mark, http://en.wikipedia.org/wiki/Byte_order_mark
++function removeByteOrderMark(text) {
++ if (text.charCodeAt(0) === 0xfeff) {
++ return text.substring(1);
++ }
++ return text;
++}
++
++
++// Write a template foreach file that matches template extension
++templates = extractFiles(process.argv.slice(2))
++ .map(function (file) {
++ var openedFile = fs.readFileSync(file, 'utf-8'), name;
++ if (!openedFile) return;
++ name = file.replace(/\..*$/, '');
++ openedFile = removeByteOrderMark(openedFile.trim());
++ return 'templates.' + name + ' = new Hogan.Template(' + hogan.compile(openedFile, { asString: 1 }) + ');';
++ })
++ .filter(function (t) {
++ return t;
++ });
++
++
++// Output templates
++if (!templates.length) return;
++console.log('var templates = {};');
++console.log(templates.join('\n'));