[Jifty-commit] r3511 - in jifty/branches/trimclient: examples/Yada/etc examples/Yada/lib/Yada examples/Yada/lib/Yada/View lib/Jifty/Plugin/TabView lib/Jifty/Web share/web/static/js

jifty-commit at lists.jifty.org jifty-commit at lists.jifty.org
Sat Jun 16 14:39:11 EDT 2007


Author: clkao
Date: Sat Jun 16 14:39:07 2007
New Revision: 3511

Added:
   jifty/branches/trimclient/lib/Jifty/View/Declare/Compile.pm
Modified:
   jifty/branches/trimclient/examples/Yada/etc/config.yml
   jifty/branches/trimclient/examples/Yada/lib/Yada/View.pm
   jifty/branches/trimclient/examples/Yada/lib/Yada/View/Todo.pm
   jifty/branches/trimclient/lib/Jifty/Plugin/TabView/View.pm
   jifty/branches/trimclient/lib/Jifty/View/Declare/BaseClass.pm
   jifty/branches/trimclient/lib/Jifty/Web/PageRegion.pm
   jifty/branches/trimclient/share/web/static/js/jifty.js

Log:
Rework the client caching to use a closure translated from td, rather than trimpath.
only static works now. client side action logic to be reimplemented in js.


Modified: jifty/branches/trimclient/examples/Yada/etc/config.yml
==============================================================================
--- jifty/branches/trimclient/examples/Yada/etc/config.yml	(original)
+++ jifty/branches/trimclient/examples/Yada/etc/config.yml	Sat Jun 16 14:39:07 2007
@@ -2,6 +2,7 @@
 application:
   OpenIDSecret: sekrit13
 framework: 
+  ConfigFileVersion: 2
   AdminMode: 1
   SkipAccessControl: 1
   ApplicationClass: Yada
@@ -34,6 +35,7 @@
     - User: {}
     - Authentication::Password: {}
     - OpenID: {}
+    - SinglePage: {}
 
   PubSub: 
     Backend: Memcached

Modified: jifty/branches/trimclient/examples/Yada/lib/Yada/View.pm
==============================================================================
--- jifty/branches/trimclient/examples/Yada/lib/Yada/View.pm	(original)
+++ jifty/branches/trimclient/examples/Yada/lib/Yada/View.pm	Sat Jun 16 14:39:07 2007
@@ -1,5 +1,6 @@
 package Yada::View;
 use Jifty::View::Declare -base;
+use strict;
 
 use Jifty::View::Declare::CRUD;
 for (qw/todo/) {
@@ -20,6 +21,11 @@
         path => '/__jifty/empty'
     );
 
+    hyperlink(label => 'FAQ',
+	      onclick => [{region => 'test_region',
+			   replace_with => '_faq',
+			  }]);
+
 
 
     form {
@@ -28,4 +34,37 @@
     }
 };
 
+template '_faq' => sub :Static {
+    div {
+        attr { id => "faq" };
+        h2 { _('Using Doxory') }
+        dl {
+            dt { 'What kinds of questions can I ask?'}
+            dd {
+                span {
+                    'The best kinds of questions to ask are existential dilemmas.'
+                }
+	    }
+	}
+    }
+};
+
+template 'signup' => page {
+    title is _('Sign up');
+    render_region(name => 'signup_widget', path => '_signup');
+};
+
+template '_signup' => sub {
+    my $action = Jifty->web->new_action( class => 'Signup');
+    my $next = undef;
+    with ( call => $next ),
+    form {
+	render_param( $action => 'name' , focus => 1);
+	render_param( $action => $_ ) for ( grep {$_ ne 'name'} $action->argument_names );
+	form_return( label => _('Sign up'), submit => $action );
+    }
+
+};
+
+
 1;

Modified: jifty/branches/trimclient/examples/Yada/lib/Yada/View/Todo.pm
==============================================================================
--- jifty/branches/trimclient/examples/Yada/lib/Yada/View/Todo.pm	(original)
+++ jifty/branches/trimclient/examples/Yada/lib/Yada/View/Todo.pm	Sat Jun 16 14:39:07 2007
@@ -6,7 +6,7 @@
 template 'view_brief' => sub {
     my $self = shift;
     my ( $object_type, $id ) = ( $self->object_type, get('id') );
-    my $record = $self->get_record($id);
+    my $record = $self->_get_record($id);
 
     div { {class is "description" };
 	  outs($record->description);

Modified: jifty/branches/trimclient/lib/Jifty/Plugin/TabView/View.pm
==============================================================================
--- jifty/branches/trimclient/lib/Jifty/Plugin/TabView/View.pm	(original)
+++ jifty/branches/trimclient/lib/Jifty/Plugin/TabView/View.pm	Sat Jun 16 14:39:07 2007
@@ -49,7 +49,7 @@
 				  $tab =~ s/_tab$// ? 
 				  (onclick =>
 				  { region       => Jifty->web->current_region->qualified_name."-$tab-tab",
-				    replace_with => $tab,#$self->fragment_for($tab),
+				    replace_with => $self->fragment_for($tab), # XXX: should have higher level function handling mount point
 				    args => { map { $_ => get($_)} @$args },
 				  }) : ()
 				 ) }

Modified: jifty/branches/trimclient/lib/Jifty/View/Declare/BaseClass.pm
==============================================================================
--- jifty/branches/trimclient/lib/Jifty/View/Declare/BaseClass.pm	(original)
+++ jifty/branches/trimclient/lib/Jifty/View/Declare/BaseClass.pm	Sat Jun 16 14:39:07 2007
@@ -54,6 +54,11 @@
     }
 }
 
+use Attribute::Handlers;
+our %Static;
+sub Static :ATTR(CODE,BEGIN) {
+    $Static{$_[2]}++;
+}
 
 =head2 show templatename arguments
 

Added: jifty/branches/trimclient/lib/Jifty/View/Declare/Compile.pm
==============================================================================
--- (empty file)
+++ jifty/branches/trimclient/lib/Jifty/View/Declare/Compile.pm	Sat Jun 16 14:39:07 2007
@@ -0,0 +1,92 @@
+# XXX: unfortunately this requires some patches to B::Deparse so it
+# won't work out of the box for you
+
+use B::Deparse;
+package B::Deparse;
+
+my $oldbinop;
+BEGIN {
+    $oldbinop = B::Deparse->can('binop');
+}
+
+# nothing yet
+sub binop {
+    my $self = shift;
+    my $ret = $oldbinop->($self, @_);
+    if ($_[2] eq '=') {
+    }
+    return $ret;
+
+}
+package Jifty::View::Declare::Compile;
+use strict;
+use base 'B::Deparse';
+use B qw(class main_root main_start main_cv svref_2object opnumber perlstring
+	 OPf_WANT OPf_WANT_VOID OPf_WANT_SCALAR OPf_WANT_LIST
+	 OPf_KIDS OPf_REF OPf_STACKED OPf_SPECIAL OPf_MOD
+	 OPpLVAL_INTRO OPpOUR_INTRO OPpENTERSUB_AMPER OPpSLICE OPpCONST_BARE
+	 OPpTRANS_SQUASH OPpTRANS_DELETE OPpTRANS_COMPLEMENT OPpTARGET_MY
+	 OPpCONST_ARYBASE OPpEXISTS_SUB OPpSORT_NUMERIC OPpSORT_INTEGER
+	 OPpSORT_REVERSE OPpSORT_INPLACE OPpSORT_DESCEND OPpITER_REVERSED
+	 SVf_IOK SVf_NOK SVf_ROK SVf_POK SVpad_OUR SVf_FAKE SVs_RMG SVs_SMG
+         CVf_METHOD CVf_LOCKED CVf_LVALUE CVf_ASSERTION
+	 PMf_KEEP PMf_GLOBAL PMf_CONTINUE PMf_EVAL PMf_ONCE PMf_SKIPWHITE
+	 PMf_MULTILINE PMf_SINGLELINE PMf_FOLD PMf_EXTENDED);
+
+use constant method_invocation => '.';
+
+sub padname {
+    my $self = shift;
+    my $targ = shift;
+    return substr($self->padname_sv($targ)->PVX, 1);
+}
+
+require CGI;
+our %TAGS = (
+    map { $_ => +{} }
+        map {@{$_||[]}} @CGI::EXPORT_TAGS{qw/:html2 :html3 :html4 :netscape :form/}
+);
+
+sub deparse {
+    my $self = shift;
+    my $ret = $self->SUPER::deparse(@_);
+    return '' if $ret =~ m/use (strict|warnings)/;
+    return $ret;
+}
+
+sub maybe_my {
+    my $self = shift;
+    my($op, $cx, $text) = @_;
+    if ($op->private & OPpLVAL_INTRO and not $self->{'avoid_local'}{$$op}) {
+	if (B::Deparse::want_scalar($op)) {
+	    return "var $text";
+	} else {
+	    return $self->maybe_parens_func("my", $text, $cx, 16);
+	}
+    } else {
+	return $text;
+    }
+}
+
+sub maybe_parens_func {
+    my $self = shift;
+    my($func, $text, $cx, $prec) = @_;
+    return "$func($text)";
+
+}
+
+
+sub _anoncode {
+    my ($self, $text) = @_;
+    return "function ()" . $text;
+}
+
+sub pp_entersub {
+    my $self = shift;
+    my $ret = $self->SUPER::pp_entersub(@_);
+    $ret =~ s/return\s*\((.*)\)/return [$1]/ if $ret =~ m/^attr/;
+
+    return $ret;
+}
+
+1;

Modified: jifty/branches/trimclient/lib/Jifty/Web/PageRegion.pm
==============================================================================
--- jifty/branches/trimclient/lib/Jifty/Web/PageRegion.pm	(original)
+++ jifty/branches/trimclient/lib/Jifty/Web/PageRegion.pm	Sat Jun 16 14:39:07 2007
@@ -384,15 +384,34 @@
     return "#region-" . $self->qualified_name . ' ' . join(' ', @_);
 }
 
+use PadWalker;
+use Jifty::View::Declare::Compile;
+
+sub _actual_td_code {
+    my $code = shift;
+
+    return PadWalker::closed_over($code)->{'$coderef'}
+	? ${ PadWalker::closed_over($code)->{'$coderef'} } : $code;
+}
+
 sub client_cacheable {
     my $self = shift;
-    return 'static' if $self->path eq '__jifty/empty';
     return 'crudview' if $self->path eq '//todo/view';
+
+    my $code = _actual_td_code(Template::Declare->resolve_template($self->path));
+
+    return 'static' if $Jifty::View::Declare::BaseClass::Static{$code};
+
+    return;
 }
 
 sub client_cache_content {
     my $self = shift;
-    my $code = Template::Declare->resolve_template($self->path);
+    my $code = _actual_td_code(Template::Declare->resolve_template($self->path));
+
+    if ($Jifty::View::Declare::BaseClass::Static{$code}) {
+	return 'function() '.Jifty::View::Declare::Compile->new->coderef2text($code);
+    }
 
     local @Evil::ISA = ('Yada::Model::Todo');
     local $HTML::Mason::Commands::m = undef;

Modified: jifty/branches/trimclient/share/web/static/js/jifty.js
==============================================================================
--- jifty/branches/trimclient/share/web/static/js/jifty.js	(original)
+++ jifty/branches/trimclient/share/web/static/js/jifty.js	Sat Jun 16 14:39:07 2007
@@ -655,6 +655,46 @@
 
 var CACHE = {};
 
+// FIXME: try not to pollute the namespace!
+var tags = ['div', 'h2', 'dl', 'dt', 'dd', 'span'];
+for (var i in tags) {
+    this[tags[i]] = _mk_tag_wrapper(tags[i]);
+}
+
+
+function _mk_tag_wrapper(name) {
+    return function() {
+	var buf = new Array;
+	var sp = this['attr'];
+	var attr = {};
+	this['attr'] = function(a) {
+	    var foo;
+	    a = a();
+	    while(foo = a.splice(0, 2)) {
+		if (foo.length == 0)
+		    break;
+		attr[foo[0]] = foo[1];
+	    }
+	};
+		
+	for (var i = 0; i < arguments.length; ++i) {
+	    buf.push(typeof(arguments[i]) == 'function' ? arguments[i]() : arguments[i]);
+	}
+	var _mk_attr = function() {
+	    var foo = ' ';
+	    for (var k in attr) {
+		if (k == 'extend') continue;
+		foo += k + '="' + attr[k] + '"';
+	    }
+	    return foo;
+	};
+	var first = buf.splice(0, 1);
+	return '<'+name+_mk_attr(attr)+'>' + first + '</'+name+'>' + buf.join('');
+    }
+};
+var _ = function(str) { return str };
+var attr = function() {};
+
 var extract_cacheable = function(fragment, f) {
     for (var fragment_bit = fragment.firstChild;
          fragment_bit != null;
@@ -667,10 +707,16 @@
             } else if (fragment_bit.firstChild) {
                 textContent = fragment_bit.firstChild.nodeValue;
             } 
-            CACHE[f['path']] = { 'type': c_type, 'content': textContent };
+            var cache_func;
+	    try { cache_func = eval(textContent) }
+	    catch(e) { 
+		//		alert(e);
+		break; }
+	    alert("got cache content");
+            CACHE[f['path']] = { 'type': c_type, 'content': cache_func };
         }
     }
-}
+};
 
 // applying updates from a fragment
 //   - fragment: the fragment from the server
@@ -815,7 +861,7 @@
         if (cached && cached['type'] == 'static') {
             var my_fragment = document.createElement('fragment');
             var content_node = document.createElement('content');
-            content_node.textContent = cached['content'];
+            content_node.textContent = cached['content']();
             my_fragment.appendChild(content_node);
             my_fragment.setAttribute('id', f['region']);
 
@@ -830,7 +876,7 @@
 	    var record = Todo.find(f['args']['id']);
             var my_fragment = document.createElement('fragment');
             var content_node = document.createElement('content');
-            content_node.textContent = cached['content'].process(record);
+            content_node.textContent = cached['content'](record);
             my_fragment.appendChild(content_node);
             my_fragment.setAttribute('id', f['region']);
             update_from_cache.push(function(){ apply_fragment_updates(my_fragment, f); } );


More information about the Jifty-commit mailing list