Changeset 140
- Timestamp:
- 2008年11月13日 08時49分04秒 (2 months ago)
- Location:
- Nenshi/branches/gen
- Files:
-
- 19 modified
-
MANIFEST (modified) (7 diffs)
-
lib/Gen.pm (modified) (4 diffs)
-
lib/Nenshi/Filter/EmptyTagFilter.pm (modified) (3 diffs)
-
lib/Nenshi/Filter/HTMLFormFiller.pm (modified) (11 diffs)
-
lib/Nenshi/Filter/NamespaceFlattener.pm (modified) (1 diff)
-
lib/Nenshi/Filter/WhitespaceFilter.pm (modified) (2 diffs)
-
lib/Nenshi/Input.pm (modified) (2 diffs)
-
lib/Nenshi/Output.pm (modified) (2 diffs)
-
lib/Nenshi/Serializer/HTML.pm (modified) (1 diff)
-
lib/Nenshi/Serializer/XHTML.pm (modified) (1 diff)
-
lib/Nenshi/Serializer/XML.pm (modified) (2 diffs)
-
lib/Nenshi/Stream.pm (modified) (1 diff)
-
lib/Nenshi/Template/Base.pm (modified) (6 diffs)
-
lib/Nenshi/Template/Directives.pm (modified) (2 diffs)
-
lib/Nenshi/Template/Expr.pm (modified) (15 diffs)
-
lib/Nenshi/Template/ExprGrammar.pm (modified) (4 diffs)
-
lib/Nenshi/Template/Markup.pm (modified) (2 diffs)
-
parser/ExprGrammar.yp (modified) (2 diffs)
-
t/13_output.t (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
Nenshi/branches/gen/MANIFEST
r118 r140 1 1 Changes 2 examples/bench.pl3 examples/test.nenshi4 examples/test.tt5 2 examples/test.xml 6 examples/tt.pl7 3 inc/Module/Install.pm 8 4 inc/Module/Install/Base.pm … … 21 17 inc/Test/Builder/Module.pm 22 18 inc/Test/More.pm 19 lib/Gen.pm 23 20 lib/Nenshi.pm 21 lib/Nenshi/Attrs.pm 24 22 lib/Nenshi/Attrs.pod 25 23 lib/Nenshi/Builder.pm 26 24 lib/Nenshi/Core.pm 25 lib/Nenshi/DocType.pm 26 lib/Nenshi/Event.pm 27 lib/Nenshi/Filter/EmptyTagFilter.pm 27 28 lib/Nenshi/Filter/HTMLFormFiller.pm 28 29 lib/Nenshi/Filter/HTMLSanitizer.pm 30 lib/Nenshi/Filter/NamespaceFlattener.pm 29 31 lib/Nenshi/Filter/Transformer.pm 32 lib/Nenshi/Filter/WhitespaceFilter.pm 30 33 lib/Nenshi/Input.pm 34 lib/Nenshi/Markup.pm 31 35 lib/Nenshi/Markup.pod 36 lib/Nenshi/Namespace.pm 32 37 lib/Nenshi/Namespace.pod 33 38 lib/Nenshi/Output.pm … … 38 43 lib/Nenshi/Path/Operators.pm 39 44 lib/Nenshi/Path/TypeCoercion.pm 45 lib/Nenshi/QName.pm 46 lib/Nenshi/Serializer/HTML.pm 47 lib/Nenshi/Serializer/Text.pm 48 lib/Nenshi/Serializer/XHTML.pm 49 lib/Nenshi/Serializer/XML.pm 50 lib/Nenshi/Stream.pm 40 51 lib/Nenshi/Stream.pod 41 52 lib/Nenshi/Template/Base.pm 42 53 lib/Nenshi/Template/Context.pm 43 54 lib/Nenshi/Template/Directives.pm 44 lib/Nenshi/Template/Eval.pm 55 lib/Nenshi/Template/Expr.pm 56 lib/Nenshi/Template/ExprGrammar.pm 45 57 lib/Nenshi/Template/Interpolate.pm 46 58 lib/Nenshi/Template/Loader.pm … … 52 64 MANIFEST This list of files 53 65 META.yml 66 nytprof.out 67 parser/ExprGrammar.skel.pm 68 parser/ExprGrammar.yp 69 parser/README 70 parser/yc 54 71 README 55 72 t/00_compile.t … … 58 75 t/12_input_xml.t 59 76 t/13_output.t 60 t/14_builder.t61 77 t/20_template_base.t 62 78 t/21_template_interpolation.t … … 64 80 t/22_template_text.t 65 81 t/23_template_directives.t 82 t/24_template_eval.t 66 83 t/28_template_markup_include.t 67 84 t/29_template_loader.t … … 70 87 t/51_filter_fill.t 71 88 t/52_filter_sanitize.t 72 t/markup.pl -
Nenshi/branches/gen/lib/Gen.pm
r139 r140 18 18 if(ref $obj eq 'ARRAY') { 19 19 return Gen::Generator->new(sub { 20 my ($y) = @_;21 $y->($_) for @$obj 20 my $y = $_[0]; 21 $y->($_) for @$obj; 22 22 }); 23 23 } … … 51 51 52 52 sub new { 53 bless $_[1], $_[0];53 bless $_[1], $_[0]; 54 54 } 55 55 … … 65 65 } 66 66 67 68 67 sub __list__ { 69 68 my @ret; … … 71 70 push @ret, $_[0]; 72 71 }); 73 return\@ret;72 \@ret; 74 73 } 75 74 -
Nenshi/branches/gen/lib/Nenshi/Filter/EmptyTagFilter.pm
r138 r140 6 6 use Gen qw(gen); 7 7 8 use overload (9 '&{}' => sub { my $s = shift; return sub{ $s->process(@_); } },10 );8 #use overload ( 9 # '&{}' => sub { my $s = shift; return sub{ $s->process(@_); } }, 10 #); 11 11 12 12 sub new { 13 bless { 14 15 }, shift; 13 bless {}, $_[0]; 16 14 } 17 15 … … 22 20 23 21 gen($stream) | sub { my($yield, $ev) = @_; 24 if($ev->[0] eq 'START_') { 25 if($start) { 26 $yield->($start); 27 } 28 $start = $ev; 29 } 30 elsif($ev->[0] eq 'END_' and $start) { 22 if($ev->[0] eq 'END_' and $start) { 31 23 $yield->(['EMPTY', $start->[1], $start->[2]]); 32 24 undef $start; … … 37 29 undef $start; 38 30 } 39 $yield->($ev); 31 if($ev->[0] eq 'START_') { 32 $start = $ev; 33 } 34 else { 35 $yield->($ev); 36 } 40 37 } 41 38 } -
Nenshi/branches/gen/lib/Nenshi/Filter/HTMLFormFiller.pm
r136 r140 7 7 use List::Util qw(first); 8 8 use Nenshi::Core qw(Attrs QName); 9 use utf8; 9 10 10 11 use overload … … 35 36 my $tagname = $tag->localname; 36 37 37 if($tagname eq 'form' and ( 38 $self->{name} and $attrs->get('name') eq $self->{name} or 39 $self->{id} and $attrs->get('id') eq $self->{id} or 40 not($self->{id} or $self->{name})) 41 ) { 38 if($tagname eq 'form' and (do { 39 no warnings 'uninitialized'; 40 defined($self->{name}) and $attrs->get('name') eq $self->{name} or 41 defined($self->{id}) and $attrs->get('id') eq $self->{id} or 42 not(defined $self->{id} or defined $self->{name}) 43 })) { 42 44 $in_form = 1; 43 45 } … … 49 51 if($name and exists $self->{data}{$name}) { 50 52 my $value = $self->{data}{$name}; 51 Encode::_utf8_on($value) if not Encode::is_utf8($value);52 53 my $declval = $attrs->get('value'); 53 54 my $checked = 0; 54 55 if(ref($value) eq 'ARRAY') { 55 if( $declval) {56 if(defined $declval) { 56 57 $checked = first { "$_" eq $declval } @$value 57 58 } … … 61 62 } 62 63 else { 63 if( $declval) {64 if(defined $declval) { 64 65 $checked = $declval eq "$value"; 65 66 } … … 80 81 if($name and exists $self->{data}{$name}) { 81 82 my $value = $self->{data}{$name}; 82 Encode::_utf8_on($value) if not Encode::is_utf8($value);83 no warnings "uninitialized"; 83 84 if(ref($value) eq 'ARRAY') { 84 85 $value = $value->[0]; 85 86 } 86 87 if(defined $value) { 88 Encode::_utf8_on($value) if not Encode::is_utf8($value); 87 89 $attrs |= [[ QName('value'), "$value" ]]; 88 90 } … … 93 95 my $name = $attrs->get('name'); 94 96 if(exists $self->{data}{$name}) { 95 $select_value = $self->{data}{$name}, 96 Encode::_utf8_on($select_value) if not Encode::is_utf8($select_value); 97 no warnings "uninitialized"; 98 $select_value = $self->{data}{$name}; 99 if(ref($select_value) eq 'ARRAY') { 100 @$select_value = map { 101 $_ = "$_"; 102 Encode::_utf8_on($_) if not Encode::is_utf8($_); 103 $_; 104 } @$select_value; 105 } 106 else { 107 $select_value = "$select_value"; 108 Encode::_utf8_on($select_value) if not Encode::is_utf8($select_value); 109 } 97 110 $in_select = 1; 98 111 } … … 102 115 if(exists $self->{data}{$name}) { 103 116 $textarea_value = $self->{data}{$name}; 104 Encode::_utf8_on($textarea_value) if not Encode::is_utf8($textarea_value);105 117 if(ref($textarea_value) eq 'ARRAY') { 106 118 $textarea_value = $textarea_value->[0] 107 119 } 120 Encode::_utf8_on($textarea_value) if not Encode::is_utf8($textarea_value); 108 121 $in_textarea = 1; 109 122 } … … 133 146 return; 134 147 } 135 $yield->( [$kind, $data, $pos]);148 $yield->($ev); 136 149 } 137 150 elsif($in_form and $kind eq 'END_') { … … 151 164 } 152 165 else { 153 $selected = $option_value eq "$select_value";166 $selected = $option_value eq $select_value; 154 167 } 155 168 my($okind, $odata, $opos) = @$option_start; … … 180 193 $yield->($_); 181 194 } 182 $yield->( [$kind, $data, $pos]);195 $yield->($ev); 183 196 } 184 197 else { 185 $yield->( [$kind, $data, $pos]);198 $yield->($ev); 186 199 } 187 200 } … … 189 202 190 203 1; 204 __END__ -
Nenshi/branches/gen/lib/Nenshi/Filter/NamespaceFlattener.pm
r138 r140 4 4 use warnings; 5 5 6 use overload (7 '&{}' => sub { my $s = shift; return sub{ $s->process(@_); } },8 );6 #use overload ( 7 # '&{}' => sub { my $s = shift; return sub{ $s->process(@_); } }, 8 #); 9 9 10 10 use Gen qw(gen list); -
Nenshi/branches/gen/lib/Nenshi/Filter/WhitespaceFilter.pm
r136 r140 4 4 use warnings; 5 5 6 use overload (7 '&{}' => sub { my $s = shift; return sub{ $s->process(@_); } },8 );6 #use overload ( 7 # '&{}' => sub { my $s = shift; return sub{ $s->process(@_); } }, 8 #); 9 9 10 10 use Gen qw(gen list generator); … … 27 27 28 28 sub process { 29 my($self, $stream, $ctxt) = @_; 30 29 my($self, $stream) = @_; 31 30 32 31 my $preserve_elems = $self->{preserve}; 33 32 my $noescape_elems = $self->{noescape}; 34 35 33 36 34 generator { my($yield) = @_; -
Nenshi/branches/gen/lib/Nenshi/Input.pm
r136 r140 60 60 my $parser = XML::LibXML::Reader->new( 61 61 IO => $source, 62 load_ext_dtd => 1,62 #load_ext_dtd => 1, 63 63 expand_entities => 1, 64 64 no_network => 1, … … 151 151 } 152 152 }; 153 153 154 if($@) { 154 155 if(blessed $@ and $@->isa('Nenshi::Error')) { -
Nenshi/branches/gen/lib/Nenshi/Output.pm
r138 r140 20 20 $method ||= 'xml'; 21 21 22 my $encoding = exists $options->{encoding} ? $options->{encoding} : 'utf8';22 my $encoding = exists $options->{encoding} ? $options->{encoding} : undef; 23 23 24 24 my $output = join('', @{list($stream)}); 25 25 if($encoding) { 26 warn $encoding; 26 27 my $errors = Encode::FB_DEFAULT; 27 28 if($method ne 'text' and not $method->isa('Nenshi::Serializer::Text')) { … … 48 49 } 49 50 50 51 51 1; -
Nenshi/branches/gen/lib/Nenshi/Serializer/HTML.pm
r136 r140 44 44 45 45 for my $filter (@{$self->{filters}}) { 46 $stream = $filter-> ($stream);46 $stream = $filter->process($stream); 47 47 } 48 48 -
Nenshi/branches/gen/lib/Nenshi/Serializer/XHTML.pm
r136 r140 44 44 sub process { 45 45 my($self, $stream) = @_; 46 my $boolean_attrs = $self->_BOOLEAN_ATTRS;47 my $empty_elems = $self->_EMPTY_ELEMS;48 my $have_doctype;49 my $in_cdata;50 46 51 47 for my $filter (@{$self->{filters}}) { 52 $stream = $filter-> ($stream);48 $stream = $filter->process($stream); 53 49 } 54 50 55 51 $stream = gen($stream); 56 52 generator { my $yield = shift; 53 my $boolean_attrs = $self->_BOOLEAN_ATTRS; 54 my $empty_elems = $self->_EMPTY_ELEMS; 55 my $have_doctype; 56 my $in_cdata; 57 57 my $filter = sub { 58 58 my($kind, $data, $pos) = @{+shift}; -
Nenshi/branches/gen/lib/Nenshi/Serializer/XML.pm
r136 r140 11 11 use Nenshi::Filter::NamespaceFlattener; 12 12 13 use overload (14 '&{}' => sub { my $s = shift; return sub{ $s->process(@_); } },15 fallback => 1,16 );13 #use overload ( 14 # '&{}' => sub { my $s = shift; return sub{ $s->process(@_); } }, 15 # fallback => 1, 16 #); 17 17 use constant _PRESERVE_SPACE => set(); 18 18 … … 46 46 sub process { 47 47 my($self, $stream) = @_; 48 my($have_decl, $have_doctype);49 my $in_cdata;50 51 48 for my $filter (@{$self->{filters}}) { 52 $stream = $filter-> ($stream);49 $stream = $filter->process($stream); 53 50 } 54 51 $stream = gen $stream; 55 52 56 53 generator {my ($yield) = shift; 54 my($have_decl, $have_doctype); 55 my $in_cdata; 56 57 57 my $filter = sub { 58 58 my($kind, $data, $pos) = @{+shift}; -
Nenshi/branches/gen/lib/Nenshi/Stream.pm
r136 r140 33 33 sub filter { 34 34 my($self, $function) = @_; 35 ref($self)->new($function-> ($self), { serializer => $self->{serializer}});35 ref($self)->new($function->process($self), { serializer => $self->{serializer}}); 36 36 } 37 37 -
Nenshi/branches/gen/lib/Nenshi/Template/Base.pm
r139 r140 8 8 use Gen qw(generator gen list); 9 9 use Encode qw(); 10 use utf8; 10 11 11 12 use Nenshi::Core qw(Stream Attrs _ensure); … … 131 132 # } 132 133 # } 133 134 $self->{filters} = [qw(_flatten _eval)]; 134 $self; 135 } 136 137 sub _filters { 138 my($self) = @_; 139 my @filters = qw(_flatten _eval); 135 140 if($self->{loader}) { 136 push(@ {$self->{filters}}, '_include');137 } 138 $self;141 push(@filters, '_include'); 142 } 143 return @filters; 139 144 } 140 145 … … 215 220 } 216 221 my $stream = $self->{stream}; 217 for my $filter ( @{$self->{filters}}) {222 for my $filter ($self->_filters) { 218 223 $stream = $self->$filter($stream, $ctxt); 219 224 } … … 258 263 elsif($kind eq 'EXPR') { 259 264 my $result = $data->evaluate($ctxt); 265 return if not defined $result; 260 266 261 267 if(not ref($result) or ref($result) eq 'Nenshi::Markup') { … … 270 276 else { 271 277 # stringify 278 undef $@; 279 no warnings 'uninitialized'; 272 280 $result = "$result"; 273 Encode::_utf8_on($result) if not Encode::is_utf8($result); 281 return if not defined $result or $result eq ""; 282 if(not Encode::is_utf8($result)) { 283 Encode::_utf8_on($result) ; 284 } 274 285 $yield->(['TEXT', $result, $pos]); 275 286 } … … 314 325 my $hrefstream = $self->_eval($href, $ctxt); 315 326 $href = ''; 316 for my $subev (@{list $hrefstream}){317 my($ kind, $data, $pos) = @$subev;318 $href .= $ data if $kindeq 'TEXT';319 } 327 $hrefstream->(sub { 328 my($subev) = @_; 329 $href .= $subev->[1] if $subev->[0] eq 'TEXT'; 330 }); 320 331 } 321 332 my $substream; -
Nenshi/branches/gen/lib/Nenshi/Template/Directives.pm
r138 r140 44 44 45 45 eval { 46 if(length($expr)) {47 46 $rv = Nenshi::Template::Expr->new( 48 47 $expr, 49 48 $template->filepath, $lineno, $offset, #$template->lookup 50 49 ); 51 }52 else {53 return;54 }55 50 }; 56 51 if($@) { … … 227 222 }; 228 223 if($@) { 229 my $type = ref($itr) || 'SCALAR'; 230 Nenshi::TemplateRuntimeError->throw("'$type' object is not iterable", @{$stream->[0][2]}); 224 #my $type = ref($itr) || 'SCALAR'; 225 #Nenshi::TemplateRuntimeError->throw(
