Comparing version 0.1.4 to 0.1.9
/*! | ||
jeff-core v0.1.3 | ||
jeff v0.1.0 | ||
@@ -49,15 +49,2 @@ Copyright (C) 2013 by GetHuman LLC | ||
}); | ||
Jeff.registerPlugin("jif", function(condition, elem) { | ||
return condition ? elem : ''; | ||
}); | ||
Jeff.registerPlugin("jtrunc", function (str, len) { | ||
if (!str || str.length < len) { | ||
return str; | ||
} | ||
else { | ||
return str.substring(0, len) + '...'; | ||
} | ||
}); | ||
; | ||
@@ -118,3 +105,3 @@ // lib/jeff/utils.js | ||
isString: function(str) { | ||
return (typeof str === 'string' || str instanceof String); | ||
return (typeof str == 'string' || str instanceof String); | ||
} | ||
@@ -145,6 +132,2 @@ | ||
Jeff.getTags = function () { | ||
return Array.concat(allTags, selfClosing); | ||
}; | ||
Jeff.setOutputMode = function(mode) { | ||
@@ -167,6 +150,4 @@ if ( !isNaN(mode) && mode >= 0 && mode < 3 ) { | ||
Jeff.elem = function(tagName) { // like this: elem("div", attributes, children, text); | ||
if ( !Jeff.Utils.isString(tagName) ) { | ||
return null; | ||
} | ||
var e = { tag: tagName, render: function() { return Jeff.output(e); } }; | ||
if ( !Jeff.Utils.isString(tagName) ) return null; | ||
var e = { tag: tagName, render: function() { return output(e); } }; | ||
if ( arguments.length > 1 ) { | ||
@@ -183,3 +164,3 @@ for ( var i = 1, len = arguments.length; i < len; ++i ) { | ||
} | ||
return Jeff.output(e); | ||
return output(e); | ||
}; | ||
@@ -195,6 +176,28 @@ | ||
// actually make tag methods for each of the tags in var allTags | ||
Jeff.elems = {}; | ||
var i = allTags.length; | ||
while( i-- ) { | ||
Jeff.elems[allTags[i]] = makeElem(allTags[i]); | ||
} | ||
// PRINTING MARKUP AS HTML | ||
function output(elem, mode) { | ||
var currentMode = mode || outputMode; | ||
if ( currentMode === 0 ) { | ||
return markupToDom(elem); | ||
} else if ( currentMode === 2 ) { | ||
jtPrintIndent = " "; | ||
jtPrintNewline = "\n"; | ||
return markupToString(elem); | ||
} else { | ||
jtPrintIndent = ""; | ||
jtPrintNewline = ""; | ||
return markupToString(elem); | ||
} | ||
} | ||
// once we have converted our json to "markup", we can now "print" to DOM using document.createElement, etc | ||
function markupToDom(elem) { | ||
// todo | ||
return elem; | ||
} | ||
@@ -205,8 +208,4 @@ | ||
if ( !elem ) { | ||
return; | ||
} | ||
if ( Jeff.Utils.isString(elem) ) { | ||
return elem; | ||
} | ||
if ( !elem ) return; | ||
if ( Jeff.Utils.isString(elem) ) return elem; | ||
@@ -271,25 +270,2 @@ var indent = "", indentation = 0, i, len; | ||
// actually make tag methods for each of the tags in var allTags | ||
Jeff.elems = {}; | ||
var i = allTags.length; | ||
while( i-- ) { | ||
Jeff.elems[allTags[i]] = makeElem(allTags[i]); | ||
} | ||
// PRINTING MARKUP AS HTML | ||
Jeff.output = function(elem, mode) { | ||
var currentMode = mode || outputMode; | ||
if ( currentMode === 0 ) { | ||
return markupToDom(elem); | ||
} else if ( currentMode === 2 ) { | ||
jtPrintIndent = " "; | ||
jtPrintNewline = "\n"; | ||
return markupToString(elem); | ||
} else { | ||
jtPrintIndent = ""; | ||
jtPrintNewline = ""; | ||
return markupToString(elem); | ||
} | ||
}; | ||
Jeff.template = function(path) { | ||
@@ -296,0 +272,0 @@ var fs = require("fs"); |
/*! | ||
jeff-core v0.1.3 | ||
jeff v0.1.0 | ||
@@ -26,2 +26,2 @@ Copyright (C) 2013 by GetHuman LLC | ||
*/ | ||
(function(){var a={};a.VERSION="0.2.0",a.plugins={},a.registerPlugin=function(b,c){b&&c&&b.length>0&&(a.plugins[b]=c)},a.registerPlugin("each",function(a,b){for(var c=[],d=0,e=a.length;e>d;++d)c.push(b(a[d]));return c}),a.registerPlugin("jif",function(a,b){return a?b:""}),a.registerPlugin("jtrunc",function(a,b){return!a||a.length<b?a:a.substring(0,b)+"..."}),a.Utils={extend:function(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a},inArray:function(a,b){for(var c=a.length;c--;)if(a[c]===b)return!0;return!1},isArray:function(a){return a&&"object"==typeof a?"[object Array]"===toString.call(a):!1},isObject:function(a){return a&&"object"==typeof a?"[object Object]"===toString.call(a):!1},isEmptyObject:function(a){if(null===a)return!0;if(a.length&&a.length>0)return!1;if(0===a.length)return!0;for(var b in a)if(hasOwnProperty.call(a,b))return!1;return!0},isString:function(a){return"string"==typeof a||a instanceof String}},exports.attach=function(a){function b(b){return function(){return[].unshift.call(arguments,b),a.elem.apply(this,arguments)}}function c(a){return a}function d(b,c){if(b){if(a.Utils.isString(b))return b;var e,f,k="",l=0;if(i&&i.length>0){var m=[];for(c&&(l=c),e=l;e--;)m.push(i);k=m.join("")}var n=[];if(b.tag&&"html"===b.tag&&n.push(k,h,j),b.tag&&n.push(k,"<",b.tag),b.attributes)for(var o in b.attributes)n.push(" ",o,'="',b.attributes[o],'"');if(!b.tag||b.children||b.text){if(b.tag&&n.push(">"),b.children){for(b.tag&&n.push(j),e=0,f=b.children.length;f>e;++e)n.push(d(b.children[e],b.tag?l+1:l));b.tag&&n.push(k)}b.text&&n.push(b.text),b.tag&&n.push("</",b.tag,">",j)}else a.Utils.inArray(g,b.tag)?n.push("/>",j):n.push("></",b.tag,">",j);return n.join("")}}var e={};a.getTemplateByName=function(a){return e[a]};var f=["a","iframe","abbr","acronym","address","area","b","base","bdo","big","blockquote","body","br","button","caption","cite","code","col","colgroup","dd","del","dfn","div","dl","dt","em","fieldset","form","h1","h2","h3","h4","h5","h6","head","html","hr","i","img","input","ins","kbd","label","legend","li","link","map","meta","noscript","object","ol","optgroup","option","p","param","pre","q","samp","script","select","small","span","strong","style","sub","sup","table","tbody","td","textarea","tfoot","th","thead","title","tr","tt","ul"],g=["area","base","basefont","br","col","frame","hr","img","input","link","meta","param"],h="<!DOCTYPE html>",i="",j="",k=1,l=[];a.getTags=function(){return Array.concat(f,g)},a.setOutputMode=function(a){!isNaN(a)&&a>=0&&3>a&&(k=a)},a.setTemplateDirs=function(b){b&&a.Utils.isArray(b)&&(l=b)},a.addTemplateDir=function(a){l.push(a)},a.elem=function(b){if(!a.Utils.isString(b))return null;var c={tag:b,render:function(){return a.output(c)}};if(arguments.length>1)for(var d=1,e=arguments.length;e>d;++d)a.Utils.isArray(arguments[d])?c.children=arguments[d]:a.Utils.isObject(arguments[d])?c.attributes=arguments[d]:a.Utils.isString(arguments[d])&&(c.text=arguments[d]);return a.output(c)},a.elems={};for(var m=f.length;m--;)a.elems[f[m]]=b(f[m]);return a.output=function(a,b){var e=b||k;return 0===e?c(a):2===e?(i=" ",j="\n",d(a)):(i="",j="",d(a))},a.template=function(a){var b=require("fs");if(b&&l.length>0)for(var c=l.length;c--;){var d=l[c]+"/"+a;if(b.existsSync(d))return require(d)}return require(a)},a.extends=function(b,c,d){return d&&a.Utils.isObject(d)&&a.Utils.extend(e,d),a.template(b)(c)},a.extension=function(a){return e[a]},a.addShortcutsToScope=function(b){var c;for(c in a.elems)b[c]=a.elems[c];for(c in a.plugins)b[c]=a.plugins[c]},a.naked=function(b,c){return a.elem("",b,c)},a},"object"==typeof module&&module.exports?module.exports=a:"function"==typeof define&&define.amd?define(function(){return a}):this.Jeff=a}).call(this); | ||
(function(){var a={};a.VERSION="0.2.0",a.plugins={},a.registerPlugin=function(b,c){b&&c&&b.length>0&&(a.plugins[b]=c)},a.registerPlugin("each",function(a,b){for(var c=[],d=0,e=a.length;e>d;++d)c.push(b(a[d]));return c}),a.Utils={extend:function(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a},inArray:function(a,b){for(var c=a.length;c--;)if(a[c]===b)return!0;return!1},isArray:function(a){return a&&"object"==typeof a?"[object Array]"===toString.call(a):!1},isObject:function(a){return a&&"object"==typeof a?"[object Object]"===toString.call(a):!1},isEmptyObject:function(a){if(null===a)return!0;if(a.length&&a.length>0)return!1;if(0===a.length)return!0;for(var b in a)if(hasOwnProperty.call(a,b))return!1;return!0},isString:function(a){return"string"==typeof a||a instanceof String}},exports.attach=function(a){function b(b){return function(){return[].unshift.call(arguments,b),a.elem.apply(this,arguments)}}function c(a,b){var c=b||l;return 0===c?d(a):2===c?(j=" ",k="\n",e(a)):(j="",k="",e(a))}function d(){}function e(b,c){if(b){if(a.Utils.isString(b))return b;var d,f,g="",l=0;if(j&&j.length>0){var m=[];for(c&&(l=c),d=l;d--;)m.push(j);g=m.join("")}var n=[];if(b.tag&&"html"===b.tag&&n.push(g,i,k),b.tag&&n.push(g,"<",b.tag),b.attributes)for(var o in b.attributes)n.push(" ",o,'="',b.attributes[o],'"');if(!b.tag||b.children||b.text){if(b.tag&&n.push(">"),b.children){for(b.tag&&n.push(k),d=0,f=b.children.length;f>d;++d)n.push(e(b.children[d],b.tag?l+1:l));b.tag&&n.push(g)}b.text&&n.push(b.text),b.tag&&n.push("</",b.tag,">",k)}else a.Utils.inArray(h,b.tag)?n.push("/>",k):n.push("></",b.tag,">",k);return n.join("")}}var f={};a.getTemplateByName=function(a){return f[a]};var g=["a","iframe","abbr","acronym","address","area","b","base","bdo","big","blockquote","body","br","button","caption","cite","code","col","colgroup","dd","del","dfn","div","dl","dt","em","fieldset","form","h1","h2","h3","h4","h5","h6","head","html","hr","i","img","input","ins","kbd","label","legend","li","link","map","meta","noscript","object","ol","optgroup","option","p","param","pre","q","samp","script","select","small","span","strong","style","sub","sup","table","tbody","td","textarea","tfoot","th","thead","title","tr","tt","ul"],h=["area","base","basefont","br","col","frame","hr","img","input","link","meta","param"],i="<!DOCTYPE html>",j="",k="",l=1,m=[];a.setOutputMode=function(a){!isNaN(a)&&a>=0&&3>a&&(l=a)},a.setTemplateDirs=function(b){b&&a.Utils.isArray(b)&&(m=b)},a.addTemplateDir=function(a){m.push(a)},a.elem=function(b){if(!a.Utils.isString(b))return null;var d={tag:b,render:function(){return c(d)}};if(arguments.length>1)for(var e=1,f=arguments.length;f>e;++e)a.Utils.isArray(arguments[e])?d.children=arguments[e]:a.Utils.isObject(arguments[e])?d.attributes=arguments[e]:a.Utils.isString(arguments[e])&&(d.text=arguments[e]);return c(d)},a.elems={};for(var n=g.length;n--;)a.elems[g[n]]=b(g[n]);return a.template=function(a){var b=require("fs");if(b&&m.length>0)for(var c=m.length;c--;){var d=m[c]+"/"+a;if(b.existsSync(d))return require(d)}return require(a)},a.extends=function(b,c,d){return d&&a.Utils.isObject(d)&&a.Utils.extend(f,d),a.template(b)(c)},a.extension=function(a){return f[a]},a.addShortcutsToScope=function(b){var c;for(c in a.elems)b[c]=a.elems[c];for(c in a.plugins)b[c]=a.plugins[c]},a.naked=function(b,c){return a.elem("",b,c)},a},"object"==typeof module&&module.exports?module.exports=a:"function"==typeof define&&define.amd?define(function(){return a}):this.Jeff=a}).call(this); |
@@ -5,2 +5,3 @@ /*global Jeff: true */ | ||
utils = require("./jeff/utils"), | ||
plugins = require("./jeff/plugins"), | ||
runtime = require("./jeff/runtime"); | ||
@@ -12,2 +13,3 @@ | ||
utils.attach(j); | ||
plugins.attach(j); | ||
runtime.attach(j); | ||
@@ -14,0 +16,0 @@ |
@@ -11,32 +11,3 @@ module.exports.create = function() { | ||
Jeff.registerPlugin = function(name, obj) { | ||
if ( name && obj && name.length > 0 ) { | ||
Jeff.plugins[name] = obj; | ||
} | ||
}; | ||
Jeff.registerPlugin("each", function(items, tmpl) { | ||
var ret = []; | ||
for( var i = 0, len = items.length; i < len; ++i ) { | ||
ret.push(tmpl(items[i])); | ||
} | ||
return ret; | ||
}); | ||
Jeff.registerPlugin("jif", function(condition, elem) { | ||
return condition ? elem : ''; | ||
}); | ||
Jeff.registerPlugin("jtrunc", function (str, len) { | ||
if (!str || str.length < len) { | ||
return str; | ||
} | ||
else { | ||
return str.substring(0, len) + '...'; | ||
} | ||
}); | ||
// END(BROWSER) | ||
return Jeff; | ||
}; |
@@ -5,2 +5,3 @@ exports.attach = function(Jeff) { | ||
var fs = require("fs"); | ||
var namedTemplates = {}; // store partials in memory by name | ||
@@ -19,3 +20,3 @@ | ||
var jtPrintNewline = ""; | ||
var outputMode = 1; // 0 = toDom, 1 = toString, 2 = toStringPretty | ||
var outputMode = 1; // 0 = leaveAlone, 1 = toString, 2 = toStringPretty, 3 = toDom | ||
var templateDirs = []; | ||
@@ -47,15 +48,18 @@ | ||
} | ||
var e = { tag: tagName, render: function() { return Jeff.output(e); } }; | ||
var e = { tag: tagName, toString: function() { return Jeff.output(e); } }; | ||
if ( arguments.length > 1 ) { | ||
for ( var i = 1, len = arguments.length; i < len; ++i ) { | ||
if ( Jeff.Utils.isArray(arguments[i]) ) { | ||
e.children = arguments[i]; | ||
} else if ( Jeff.Utils.isObject(arguments[i]) ) { | ||
e.attributes = arguments[i]; | ||
} else if ( Jeff.Utils.isString(arguments[i]) ) { | ||
e.text = arguments[i]; | ||
var arg = arguments[i]; | ||
if ( Jeff.Utils.isArray(arg) ) { | ||
e.children = arg; | ||
} else if ( Jeff.Utils.isObject(arg) && arg.tag && arg.toString ) { | ||
e.children = [arg]; | ||
} else if ( Jeff.Utils.isObject(arg) ) { | ||
e.attributes = arg; | ||
} else if ( Jeff.Utils.isString(arg) ) { | ||
e.text = arg; | ||
} | ||
} | ||
} | ||
return Jeff.output(e); | ||
return e; | ||
}; | ||
@@ -79,2 +83,3 @@ | ||
function markupToString(elem, ind) { | ||
//console.log('printing: ' + JSON.stringify(elem)); | ||
@@ -109,9 +114,15 @@ if ( !elem ) { | ||
//console.log('\n\nelem is ' + JSON.stringify(elem)); | ||
if ( elem.attributes ) { | ||
//console.log('attributes are ' + JSON.stringify(elem.attributes)); | ||
for( var prop in elem.attributes ) { | ||
p.push(" ", prop, "=\"", elem.attributes[prop], "\""); | ||
if ( elem.attributes[prop] === null ) { | ||
p.push(" ", prop); | ||
} else { | ||
p.push(" ", prop, "=\"", elem.attributes[prop], "\""); | ||
} | ||
} | ||
} | ||
if ( elem.tag && !elem.children && !elem.text ) { | ||
if ( Jeff.Utils.inArray(selfClosing, elem.tag) ) { | ||
if ( selfClosing.indexOf(elem.tag) > -1 ) { | ||
p.push("/>", jtPrintNewline); | ||
@@ -170,17 +181,33 @@ } else { | ||
Jeff.template = function(path) { | ||
var fs = require("fs"); | ||
if ( fs && templateDirs.length > 0 ) { | ||
Jeff.getTemplate = function(path) { | ||
if ( namedTemplates[path] ) { | ||
return namedTemplates[path]; | ||
} else { | ||
var i = templateDirs.length; | ||
while( i-- ) { | ||
var fullpath = templateDirs[i] + "/" + path; | ||
//console.log("trying " + fullpath); | ||
if ( fs.existsSync(fullpath) ) { | ||
return require(fullpath); | ||
path = fullpath; | ||
break; | ||
} | ||
} | ||
return require(path); | ||
} | ||
return require(path); | ||
}; | ||
Jeff.templateToString = function(result) { | ||
return (Jeff.Utils.isString(result) ? result : (Jeff.Utils.isArray(result) ? Jeff.naked(result).toString() : result.toString())); | ||
}; | ||
Jeff.template = function(path) { | ||
return function(model) { | ||
var result = Jeff.getTemplate(path)(model); | ||
return Jeff.templateToString(result, model); | ||
}; | ||
}; | ||
Jeff.render = function(path, model) { | ||
return Jeff.template(path)(model); | ||
}; | ||
Jeff.extends = function(path, model, subTemplates) { | ||
@@ -190,3 +217,3 @@ if ( subTemplates && Jeff.Utils.isObject(subTemplates) ) { | ||
} | ||
return Jeff.template(path)(model); | ||
return Jeff.render(path, model); | ||
}; | ||
@@ -214,4 +241,8 @@ | ||
Jeff.init = function(overrides) { | ||
Jeff.Utils.extend(Jeff, overrides); | ||
}; | ||
return Jeff; | ||
}; |
@@ -8,19 +8,65 @@ exports.attach = function(Jeff) { | ||
Jeff.Utils = { | ||
extend: function(obj, value) { | ||
for(var key in value) { | ||
if(value.hasOwnProperty(key)) { | ||
obj[key] = value[key]; | ||
} | ||
extend: function() { | ||
var options, name, src, copy, copyIsArray, clone, | ||
target = arguments[0] || {}, | ||
i = 1, | ||
length = arguments.length, | ||
deep = false; | ||
// Handle a deep copy situation | ||
if ( typeof target === "boolean" ) { | ||
deep = target; | ||
// skip the boolean and the target | ||
target = arguments[ i ] || {}; | ||
i++; | ||
} | ||
return obj; | ||
}, | ||
inArray: function(arr, obj) { | ||
var i = arr.length; | ||
while (i--) { | ||
if (arr[i] === obj) { | ||
return true; | ||
// Handle case when target is a string or something (possible in deep copy) | ||
if ( typeof target !== "object" && !Jeff.Utils.isFunction(target) ) { | ||
target = {}; | ||
} | ||
// return clone of object if only one argument is passed | ||
if ( i === length ) { | ||
target = {}; | ||
i--; | ||
} | ||
for ( ; i < length; i++ ) { | ||
// Only deal with non-null/undefined values | ||
if ( (options = arguments[ i ]) !== null ) { | ||
// Extend the base object | ||
for ( name in options ) { | ||
src = target[ name ]; | ||
copy = options[ name ]; | ||
// Prevent never-ending loop | ||
if ( target === copy ) { | ||
continue; | ||
} | ||
// Recurse if we're merging plain objects or arrays | ||
if ( deep && copy && ( Jeff.Utils.isObject(copy) || (copyIsArray = Jeff.Utils.isArray(copy)) ) ) { | ||
if ( copyIsArray ) { | ||
copyIsArray = false; | ||
clone = src && Jeff.Utils.isArray(src) ? src : []; | ||
} else { | ||
clone = src && Jeff.Utils.isObject(src) ? src : {}; | ||
} | ||
// Never move original objects, clone them | ||
target[ name ] = Jeff.Utils.extend( deep, clone, copy ); | ||
// Don't bring in undefined values | ||
} else if ( copy !== undefined ) { | ||
target[ name ] = copy; | ||
} | ||
} | ||
} | ||
} | ||
return false; | ||
// Return the modified object | ||
return target; | ||
}, | ||
@@ -36,2 +82,6 @@ | ||
isFunction: function(obj) { | ||
return !!(obj && obj.constructor && obj.call && obj.apply); | ||
}, | ||
isEmptyObject: function(obj) { | ||
@@ -38,0 +88,0 @@ |
@@ -0,5 +1,6 @@ | ||
{ | ||
"name": "jeff-core", | ||
"description": "JSON-based HTML templating engine", | ||
"version": "0.1.4", | ||
"version": "0.1.9", | ||
"homepage": "http://jeffjs.com", | ||
@@ -26,3 +27,3 @@ "author": "Christian Allen <christian@gethuman.com>", | ||
"type": "git", | ||
"url": "git://github.com/gethuman/jeff.js.git" | ||
"url": "git://github.com/gethuman/jeff-core.git" | ||
}, | ||
@@ -29,0 +30,0 @@ "engines": { |
@@ -6,4 +6,5 @@ global.should = require('should'); | ||
var testDir = path.dirname(__dirname); | ||
var template = Jeff.template(testDir + "/" + filepath); | ||
var result = template(model); | ||
//var template = Jeff.template(testDir + "/" + filepath); | ||
//var result = template(model).toString(); | ||
var result = Jeff.render(testDir + '/' + filepath, model); | ||
result.should.equal(expected, "'" + expected + "' should === '" + result + "': " + message); | ||
@@ -10,0 +11,0 @@ }; |
@@ -43,3 +43,3 @@ describe("easy stuff", function() { | ||
} | ||
return Jeff.elem("nav", {class: "navbar"}, [Jeff.elems.ol(navItems)]) | ||
return Jeff.elem("nav", {class: "navbar"}, [Jeff.elems.ol(navItems)]); | ||
} | ||
@@ -46,0 +46,0 @@ }); |
@@ -10,3 +10,3 @@ module.exports = function(model){ | ||
p("I am a section called " + model.foo), | ||
p(require("./partial.js")(model)) | ||
p(Jeff.render("./partial.js", model)) | ||
]) | ||
@@ -13,0 +13,0 @@ ]) |
@@ -6,3 +6,3 @@ module.exports = function(model) { | ||
p("I am a section called " + model.foo), | ||
p(Jeff.template("partial.js")(model)) | ||
p(Jeff.render("partial.js", model)) | ||
]), | ||
@@ -9,0 +9,0 @@ "rightNavigation": ol([ |
module.exports = function(model) { | ||
return ol(each(model.tweets, function(model) { | ||
return ol(jeach(model.tweets, function(model) { | ||
return li([ | ||
@@ -4,0 +4,0 @@ h1(model.title), |
@@ -6,8 +6,2 @@ module.exports = function(model) { | ||
]); | ||
/* | ||
"a[href=/]": "Home", | ||
"div": bootstrap.nav(["Home","About","Contact"]) | ||
} | ||
} | ||
*/ | ||
}; |
992
10
49242
31