[Bps-public-commit] r12658 - in pie/branches/named-params/pieplate/PIE-Plate: lib/PIE lib/PIE/Plate
clkao at bestpractical.com
clkao at bestpractical.com
Sat May 24 01:18:28 EDT 2008
Author: clkao
Date: Sat May 24 01:18:25 2008
New Revision: 12658
Added:
pie/branches/named-params/pieplate/PIE-Plate/share/web/static/js/jquery.superflydom.js
Modified:
pie/branches/named-params/pieplate/PIE-Plate/lib/PIE/Plate.pm
pie/branches/named-params/pieplate/PIE-Plate/lib/PIE/Plate/View.pm
pie/branches/named-params/pieplate/PIE-Plate/share/web/static/js/pieui.js
Log:
create a dom tree for the ast.
Modified: pie/branches/named-params/pieplate/PIE-Plate/lib/PIE/Plate.pm
==============================================================================
--- pie/branches/named-params/pieplate/PIE-Plate/lib/PIE/Plate.pm (original)
+++ pie/branches/named-params/pieplate/PIE-Plate/lib/PIE/Plate.pm Sat May 24 01:18:25 2008
@@ -1,7 +1,8 @@
package PIE::Plate;
Jifty->web->add_javascript(
- qw( pieui.js ));
+ qw( jquery.superflydom.js
+ pieui.js ));
1;
Modified: pie/branches/named-params/pieplate/PIE-Plate/lib/PIE/Plate/View.pm
==============================================================================
--- pie/branches/named-params/pieplate/PIE-Plate/lib/PIE/Plate/View.pm (original)
+++ pie/branches/named-params/pieplate/PIE-Plate/lib/PIE/Plate/View.pm Sat May 24 01:18:25 2008
@@ -5,6 +5,8 @@
template 'index.html' => page {'hey'};
template 'lorzy' => page {
+ div { { id is 'wrapper' } };
+
my $ops = [
{ name => 'IfThen',
args => {
@@ -34,3 +36,4 @@
1;
+
Added: pie/branches/named-params/pieplate/PIE-Plate/share/web/static/js/jquery.superflydom.js
==============================================================================
--- (empty file)
+++ pie/branches/named-params/pieplate/PIE-Plate/share/web/static/js/jquery.superflydom.js Sat May 24 01:18:25 2008
@@ -0,0 +1,163 @@
+/**
+ * jQuery Plugin SuperFlyDOM v0.9g
+ *
+ * Create DOM elements on the fly and automatically append or prepend them to another DOM object.
+ * There are also template functions (tplAppend and tplPrepend) that can take a JSON-formatted
+ * complex HTML structure, apply a dataset, and therefore add siblings way faster
+ *
+ * This plugin is built off of FlyDom 3.0.8, by dohpaz
+ * [http://dohpaz.mine.nu/jquery/jquery.flydom.html], who was inspired by "Oslow"
+ * [http://mg.to/2006/02/27/easy-dom-creation-for-jquery-and-prototype#comment-176],
+ * and since I could not get dohpaz code to work with my template (and since dohpaz
+ * could not get Oslow's code to work), and neither Michael Geary's code nor Sean's
+ * [http://www.pinkblack.org/itblog/?page_id=22] code were jQuery style and chainable,
+ * and I wanted a ton of features anyway, while retaining a small code base, I decided
+ * to rip apart, clean up (JSLint),and add features to their plugins. My hope is that
+ * this version will be easier to understand, more forgiving and flexible, and maintain
+ * with future versions of the fantastic framework which is jQuery.
+ *
+ * Note: For event attaching using the liveQuery plugin is highly recommended.
+ *
+ * Copyright (c) 2007 Charles Phillips [charles at doublerebel dot com]
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * @version $Id: jquery.superflydom-0.9g.js 9 2007-08-27 00:02:34 polyrhythmic $
+ *
+ * @author Charles Phillips [charles at doublerebel dot com]
+ * @copyright (C) 2007. All rights reserved.
+ *
+ * @license http://www.opensource.org/licenses/mit-license.php
+ * @license http://www.opensource.org/licenses/gpl-license.php
+ *
+ * @package jQuery Plugins
+ * @subpackage SuperFlyDOM
+ *
+ * @todo (dohpaz): Cache basic elements that are created, and if an already existing basic element is
+ * asked to be created an additional time, use a copy of the cached element to build from.
+ * (Charles): If dohpaz accomplishes this I will be happy to merge it with my code fork.
+ *
+ */
+
+/**
+ * Create DOM elements on the fly and automatically append them to the current DOM obejct
+ *
+ * @uses jQuery
+ *
+ * @param string element - The name of the DOM element to create (i.e., img, table, a, etc)
+ * @param object attrs - An optional object of attributes to apply to the element
+ * @param string text - An optional string for text node to prepend to element
+ * @param array content - An optional array of content (or element children) to append to element
+ *
+ * @return jQuery element - The jQuery object representing the new element
+ *
+ * @since FlyDom 1.0
+ */
+
+( function($) {
+ var el;
+ if ($.elHash === undefined) { //If there is no jQuery global hash yet defined,
+ var elArray, elHash = {}; //Define hash table of HTML 4.01 DOM Elements, excluding deprecated elements.
+ elArray = "a|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|frame|frameset|h1-h6|head|hr|html|i|iframe|img|input|ins|kbd|label|legend|li|link|map|meta|noframes|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|var".split("|"); //packed hash
+ for (var i = 0; i < elArray.length; i++) { elHash[elArray[i]] = true; } //Process hash
+ $.elHash = elHash; //Set jQuery global hash
+ }
+ if ($.browser.msie) { //From Dean Edwards IE7 fixes [http://dean.edwards.name] I can't believe I have to do this, damn you IE
+ Array.prototype.unshift = function() {
+ var a = Array.prototype.concat.call(Array.prototype.slice.apply(arguments, [0]), this), i = a.length;
+ while (i--) { this[i] = a[i]; }
+ return this.length;
+ }
+ }
+ $.fn.extend({
+ createAppend: function() {
+ if (arguments.length === 0) { return this; } //If nothing to process, move along!
+ var ie, pEl, elH = $.elHash, arg1 = arguments[0], arg2 = arguments[1], a = 1;
+ pEl = this[0] || this; //Parent element may be either jQuery Object or DOM element
+ if (typeof arg1 === "number") { arg1 = String(arg1); } //Pure numbers cannot be made into textNodes, nor can you run RegExp's or .constructor against them. I learned this the hard way.
+ if (typeof arg1 === "string") { //We should have a string by now, or the input JSON was improperly formatted.
+ if (arg1 in elH) { //If first argument is valid HTML Element
+ ie = $.browser.msie;
+ el = (ie && arg1 === 'input') ? '<input type="' + arg2.type + '" />': arg1; //Fix input for ie. REQUIRES attribute type.
+ el = document.createElement(el);
+ if (ie && pEl.nodeName.toLowerCase() === "table" && el.nodeName.toLowerCase() === "tr") { //Fix table/tbody for ie.
+ pEl = pEl.parentNode.getElementsByTagName('tbody')[0] || pEl.appendChild(document.createElement('tbody')); // Create a new tbody
+ }
+ el = pEl.appendChild(el); // Add the element directly to the parentElement
+ if (arg2.constructor === Object) { //if element's sibling is Attributes Object, process with jQuery
+ for (attr in arg2) { $.attr(el, attr, arg2[attr]); }
+ a++;
+ }
+ if (arguments.length > a) { //If element has more objects in arguments[] than we have processed
+ if (arguments[a].constructor === Array){ //and the next object is an array, it is element's children
+ el = $.fn.createAppend.apply($(el), arguments[a]); //recursively apply
+ a++;
+ }
+ }
+ } else if (arg1.match(/(<\S[^><]*>)|(&.+;)/g) !== null &&
+ arg1.tagName.toUpperCase() !== 'TEXTAREA') { //Check to see if TextNode is actually mixed HTML, but not textarea
+ pEl.innerHTML += arg1; //Append HTML
+ el = pEl; //We have no information about what could be in that HTML, so return parent
+ } else { el = pEl.appendChild(document.createTextNode(arg1)); } //Otherwise just append simple TextNode
+ } else { } //There should be no else. Todo: Add error catching with throw/catch on string instead of if - Instead of hashing?
+ if (arguments.length > a) { //If element has unprocessed siblings
+ el = $.fn.createAppend.apply($(pEl), Array.prototype.slice.call(arguments, a)); //Process siblings (sliced arguments array) and append to parent element
+ }
+ return $(el); //We like chaining
+ },
+
+ createPrepend: function() {
+ var al = arguments.length;
+ if (al === 0) { return this; } //If nothing to process, move along!
+ var elH = $.elHash, ie, pEl, hCN = this[0].hasChildNodes(), arg_l, arg = [];
+ arg_l = arg.push(arguments[al-1]); //Start stacking our queue
+ pEl = this[0] || this; //Parent element may be either jQuery Object or DOM element
+ if (arg[0].constructor === Array) { //If element to prepend has children, add to bottom of queue
+ arg_l = arg.unshift(arguments[al - 1 - arg_l]);
+ }
+ if (arg[0].constructor === Object) { //if element to prepend has attributes, add to queue
+ arg_l = arg.unshift(arguments[al - 1 - arg_l]);
+ }
+ if (typeof arg[0] === "number") { arg[0] = String(arg[0]); } //Pure numbers cannot be made into textNodes, nor can you run RegExp's or .constructor against them. I learned this the hard way.
+ if (typeof arg[0] === "string") { //We should have a string by now, or the input JSON was improperly formatted.
+ if (arg[0] in elH) { //If first argument is valid HTML Element
+ ie = $.browser.msie;
+ el = (ie && arg[0] === 'input') ? '<input type="' + arg[1].type + '" />': arg[0]; //Fix input for ie. REQUIRES attribute type.
+ arg.shift();
+ el = document.createElement(el);
+ if (ie && pEl.nodeName.toLowerCase() === "table" && el.nodeName.toLowerCase() === "tr") { //Fix table/tbody for ie.
+ pEl = pEl.parentNode.getElementsByTagName('tbody')[0] || pEl.appendChild(document.createElement('tbody')); // Create a new tbody
+ }
+ if (hCN) { el = pEl.insertBefore(el, pEl.firstChild); } //If parent already has child nodes, add new element before them
+ else { el = pEl.appendChild(el); } // Otherwise add the element directly to the parentElement
+ if (arg[0].constructor === Object) { //if element's sibling is Attributes Object, process with jQuery
+ for (attr in arg[0]) { $.attr(el, attr, arg[0][attr]); }
+ arg.shift();
+ }
+ if (arg[0] !== undefined && arg[0].constructor === Array) { //If there are still elements in the queue, and it's an array
+ el = $.fn.createPrepend.apply($(el), arg[0]); //Then recursively prepend the children
+ }
+ } else if (arg[0].match(/(<\S[^><]*>)|(&.+;)/g) !== null &&
+ arg[0].tagName.toUpperCase() !== 'TEXTAREA') { //Check to see if TextNode is actually mixed HTML, but not textarea
+ pEl.innerHTML = arg.pop() + pEl.innerHTML; //Prepend HTML
+ el = pEl; //We have no information about what could be in that HTML, so return parent
+ } else {
+ el = document.createTextNode(arg[0]); //Otherwise just create simple TextNode
+ el = (hCN) ? pEl.insertBefore(el, pEl.firstChild) : pEl.appendChild(el); //If parent already has child nodes, add new element before them
+ }
+ } else { } //There should be no else. Todo: Add error catching with throw/catch on string instead of if - Instead of hashing?
+ if (al > arg_l) { //If element has unprocessed siblings
+ el = $.fn.createPrepend.apply($(pEl), Array.prototype.slice.call(arguments, 0, -arg_l)); //Process siblings (sliced arguments array) and prepend to parent element
+ }
+ return $(el);
+ },
+
+ tplAppend: function(json, tpl) {
+ return $.fn.createAppend.apply(this, tpl.call(json)); // Return ourself for chaining
+ },
+
+ tplPrepend: function(json, tpl) {
+ return $.fn.createPrepend.apply(this, tpl.call(json)); // Return ourself for chaining
+ }
+ });
+})(jQuery);
\ No newline at end of file
Modified: pie/branches/named-params/pieplate/PIE-Plate/share/web/static/js/pieui.js
==============================================================================
--- pie/branches/named-params/pieplate/PIE-Plate/share/web/static/js/pieui.js (original)
+++ pie/branches/named-params/pieplate/PIE-Plate/share/web/static/js/pieui.js Sat May 24 01:18:25 2008
@@ -1,7 +1,35 @@
-function pieui_show(ops) {
+
+function lorzy_show_expression_str(str, parent) {
+ parent.createAppend('span', { className: 'string' }, [ str ]);
+}
+
+function lorzy_show_expression(parent) {
+
+ var ret = parent.createAppend('div', { className: this.name });
+ var that = this;
+ jQuery(ret)
+ .html(this.name+': '+this.toString() )
+ .click(function () { alert (that.name) });
+
+ jQuery.each(this.args, function(name, exp) {
+ console.log(name + ": "+exp);
+ var entry = ret.createAppend('div', { className: that.name+' '+name });
+ jQuery(entry).html(name);
+ if (typeof(exp) == 'string') {
+ lorzy_show_expression_str(exp, entry);
+ return;
+ }
+ console.log(typeof(exp));
+ lorzy_show_expression.apply(exp, [entry]);
+ });
+
+}
+
+function lorzy_show(ops) {
jQuery(ops).each(
function() {
- console.log(this);
+ lorzy_show_expression.apply(this, [jQuery('#wrapper')]);
});
};
+
More information about the Bps-public-commit
mailing list