UNPKG

halvalla

Version:

Generate React elements with CoffeeScript functions

397 lines (364 loc) 12.5 kB
// Generated by CoffeeScript 1.12.7 (function() { var BagMan, Teacup, allTags, doctypes, elements, escape, fn, fn1, fn2, fn3, fn4, i, j, l, len, len1, len2, len3, len4, m, mergeElements, normalizeArray, o, quote, ref, ref1, ref2, ref3, ref4, ref5, tagName, slice = [].slice, indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; ref = require('../lib/html-tags'), doctypes = ref.doctypes, elements = ref.elements, normalizeArray = ref.normalizeArray, mergeElements = ref.mergeElements, allTags = ref.allTags, escape = ref.escape, quote = ref.quote, BagMan = ref.BagMan; module.exports = Teacup = Teacup = (function() { function Teacup(instantiator, oracle) { this.instantiator = instantiator; this.oracle = oracle; this.bagMan = new BagMan; this.keepCamelCase = false; } Teacup.prototype.march = function(bag) { var attrs, component, n, node, tagConstructor, tagName, y; while (component = bag.inspect()) { switch (n = component.constructor.name) { case 'Function': bag.reinspect(this.instantiator(component)); break; case 'String': case 'Number': bag.shipOut(component.toString()); break; case 'Array': throw new Error('invalid array from bagman'); break; default: tagName = this.oracle.getName(component); if (component.tag === '<') { bag.shipOut(this.rawMithril(component)); } else if ('function' === typeof component.tagName) { tagConstructor = component.tagName; if (component.attrs) { attrs = component.attrs; } else { attrs = component.props; } node = new tagConstructor(tagName, attrs, component.children); if (!Teacup.prototype[tagName]) { Teacup.prototype[tagName] = function() { var args, component; component = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : []; return this.view.apply(this, [component].concat(slice.call(args))); }; } bag.shipOut(this.view(node)); break; } if (this[tagName]) { bag.shipOut(this[tagName](component)); } else { if ('string' === typeof component.tag) { y = this.tag(component); } else { y = this.view(component); } bag.shipOut(y); } } } return null; }; Teacup.prototype.render = function(component) { var oldBagger, result; oldBagger = this.bagMan; this.bagMan = new BagMan; this.bagMan.context(component); this.march(this.bagMan); result = this.bagMan.harvest().join(''); this.bagMan = oldBagger; return result; }; Teacup.prototype.cede = function() { var args; args = 1 <= arguments.length ? slice.call(arguments, 0) : []; return this.render.apply(this, args); }; Teacup.prototype.renderable = function(template) { var teacup; teacup = this; return function() { var args, result; args = 1 <= arguments.length ? slice.call(arguments, 0) : []; if (teacup.htmlOut === null) { teacup.htmlOut = ''; try { template.apply(this, args); } finally { result = teacup.resetBuffer(); } return result; } else { return template.apply(this, args); } }; }; Teacup.prototype.kebabify = function(text) { if (this.keepCamelCase) { return text; } return text.replace(/([A-Z])/g, function($1) { return "-" + ($1.toLowerCase()); }); }; Teacup.prototype.renderAttr = function(name, value) { var k, v; if (value == null) { return " " + (this.kebabify(name)); } if (value === false) { return ''; } if (name === 'style' && 'object' === typeof value) { return " " + name + "=" + (quote(((function() { var results; results = []; for (k in value) { v = value[k]; results.push((this.kebabify(k)) + ':' + v); } return results; }).call(this)).join(';'))); } if (name === 'data' && typeof value === 'object') { return ((function() { var results; results = []; for (k in value) { v = value[k]; results.push(this.renderAttr("data-" + k, quote(v))); } return results; }).call(this)).join(''); } if (name === 'aria' && typeof value === 'object') { return ((function() { var results; results = []; for (k in value) { v = value[k]; results.push(this.renderAttr("aria-" + k, quote(v))); } return results; }).call(this)).join(''); } if (value === true) { value = name; } return " " + (this.kebabify(name)) + "=" + (quote(escape(value.toString()))); }; Teacup.prototype.attrOrder = ['id', 'class']; Teacup.prototype.renderAttrs = function(obj) { var className, i, len, name, ref1, result, value; if (!obj) { return ''; } if (className = obj["class"] || obj.className) { obj["class"] = className; delete obj.className; } result = ''; ref1 = this.attrOrder; for (i = 0, len = ref1.length; i < len; i++) { name = ref1[i]; if (name in obj) { if (name !== 'dangerouslySetInnerHTML') { result += this.renderAttr(name, obj[name]); } } } for (name in obj) { value = obj[name]; if (indexOf.call(this.attrOrder, name) >= 0) { continue; } result += this.renderAttr(name, value); } return result; }; Teacup.prototype.renderContents = function() { var contents, rest, result; contents = arguments[0], rest = 2 <= arguments.length ? slice.call(arguments, 1) : []; if (contents == null) { } else if (typeof contents === 'function') { result = contents.apply(this, rest); if (typeof result === 'string') { return this.textOnly(result); } } else { return this.textOnly(contents); } }; Teacup.prototype.view = function(cell) { var children, props, ref1, result, x; children = cell.children; props = this.oracle.getProp(cell); result = ''; if ((ref1 = cell.tag) != null ? ref1.view : void 0) { x = cell.tag.view(props); result += this.render(x); } return result; }; Teacup.prototype.tag = function(cell) { var child, children, i, len, props, ref1, ref2, result, tagName; children = cell.children; props = this.oracle.getProp(cell); tagName = this.oracle.getName(cell); this.keepCamelCase = tagName === 'svg'; result = ''; if (tagName !== 'text') { result += "<" + tagName + (this.renderAttrs(props)) + ">"; } if (cell.text) { result += cell.text; } else if (props != null ? props.dangerouslySetInnerHTML : void 0) { result += props.dangerouslySetInnerHTML.__html; } else { if ('String' === ((ref1 = children.constructor) != null ? ref1.name : void 0) || !children.length) { children = [children]; } for (i = 0, len = children.length; i < len; i++) { child = children[i]; if ('String' === ((ref2 = child.constructor) != null ? ref2.name : void 0) || 'string' === typeof child) { result += escape(child.toString()); } else { result += this.render(child); } } } if (tagName !== 'text') { result += "</" + tagName + ">"; } this.keepCamelCase = false; return result; }; Teacup.prototype.rawMithril = function(cell) { return cell.children || cell.text; }; Teacup.prototype.rawTag = function(cell) { var children, props, result, tagName; children = cell.children; props = this.oracle.getProp(cell); tagName = this.oracle.getName(cell); result = "<" + tagName + (this.renderAttrs(props)) + ">"; result += children; result += "</" + tagName + ">"; return result; }; Teacup.prototype.scriptTag = function(cell) { var children, props, result, script, tagName; children = cell.children; props = this.oracle.getProp(cell); tagName = this.oracle.getName(cell); script = (cell.text || cell.children).toString(); result = "<" + tagName + (this.renderAttrs(props)) + ">"; result += script.replace(/<\//g, "<\\/"); result += "</" + tagName + ">"; return result; }; Teacup.prototype.selfClosingTag = function(cell) { var children, props, tagName; children = cell.children; props = this.oracle.getProp(cell); tagName = this.oracle.getName(cell); if ((normalizeArray(children)).length !== 0) { throw new Error("Halvalla: <" + tagName + "/> must not have content. Attempted to nest " + children); } return "<" + tagName + (this.renderAttrs(props)) + " />"; }; Teacup.prototype.commentTag = function(text) { return "<!--" + (escape((text.children || text.text || text).toString())) + "-->"; }; Teacup.prototype.doctypeTag = function(type) { if (type == null) { type = 5; } return doctypes[type]; }; Teacup.prototype.ieTag = function(cell) { var props, result; props = this.oracle.getProp(cell); result = "<!--[if " + (escape(props.condition)) + "]>"; result += this.render(cell.children); result += "<![endif]-->"; return result; }; Teacup.prototype.textOnly = function(s) { return new String((s != null) && escape(s.toString()) || ''); }; return Teacup; })(); ref1 = mergeElements('regular', 'obsolete'); fn = function(tagName) { return Teacup.prototype[tagName] = function() { var args; args = 1 <= arguments.length ? slice.call(arguments, 0) : []; return this.tag.apply(this, args); }; }; for (i = 0, len = ref1.length; i < len; i++) { tagName = ref1[i]; fn(tagName); } Teacup.prototype['<'] = function() { var args; args = 1 <= arguments.length ? slice.call(arguments, 0) : []; return this.rawMithril.apply(this, args); }; Teacup.prototype['text'] = function() { var args; args = 1 <= arguments.length ? slice.call(arguments, 0) : []; return this.tag.apply(this, args); }; ref2 = mergeElements('raw'); fn1 = function(tagName) { return Teacup.prototype[tagName] = function() { var args; args = 1 <= arguments.length ? slice.call(arguments, 0) : []; return this.rawTag.apply(this, args); }; }; for (j = 0, len1 = ref2.length; j < len1; j++) { tagName = ref2[j]; fn1(tagName); } ref3 = mergeElements('script'); fn2 = function(tagName) { return Teacup.prototype[tagName] = function() { var args; args = 1 <= arguments.length ? slice.call(arguments, 0) : []; return this.scriptTag.apply(this, args); }; }; for (l = 0, len2 = ref3.length; l < len2; l++) { tagName = ref3[l]; fn2(tagName); } ref4 = ['ie']; fn3 = function(tagName) { return Teacup.prototype[tagName] = function() { var args; args = 1 <= arguments.length ? slice.call(arguments, 0) : []; return this.ieTag.apply(this, args); }; }; for (m = 0, len3 = ref4.length; m < len3; m++) { tagName = ref4[m]; fn3(tagName); } ref5 = mergeElements('void', 'obsolete_void'); fn4 = function(tagName) { return Teacup.prototype[tagName] = function() { var args; args = 1 <= arguments.length ? slice.call(arguments, 0) : []; return this.selfClosingTag.apply(this, args); }; }; for (o = 0, len4 = ref5.length; o < len4; o++) { tagName = ref5[o]; fn4(tagName); } }).call(this);