[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