Changeset 140

Show
Ignore:
Timestamp:
2008年11月13日 08時49分04秒 (2 months ago)
Author:
rintaro
Message:

bugfixes

Location:
Nenshi/branches/gen
Files:
19 modified

Legend:

Unmodified
Added
Removed
  • Nenshi/branches/gen/MANIFEST

    r118 r140  
    11Changes 
    2 examples/bench.pl 
    3 examples/test.nenshi 
    4 examples/test.tt 
    52examples/test.xml 
    6 examples/tt.pl 
    73inc/Module/Install.pm 
    84inc/Module/Install/Base.pm 
     
    2117inc/Test/Builder/Module.pm 
    2218inc/Test/More.pm 
     19lib/Gen.pm 
    2320lib/Nenshi.pm 
     21lib/Nenshi/Attrs.pm 
    2422lib/Nenshi/Attrs.pod 
    2523lib/Nenshi/Builder.pm 
    2624lib/Nenshi/Core.pm 
     25lib/Nenshi/DocType.pm 
     26lib/Nenshi/Event.pm 
     27lib/Nenshi/Filter/EmptyTagFilter.pm 
    2728lib/Nenshi/Filter/HTMLFormFiller.pm 
    2829lib/Nenshi/Filter/HTMLSanitizer.pm 
     30lib/Nenshi/Filter/NamespaceFlattener.pm 
    2931lib/Nenshi/Filter/Transformer.pm 
     32lib/Nenshi/Filter/WhitespaceFilter.pm 
    3033lib/Nenshi/Input.pm 
     34lib/Nenshi/Markup.pm 
    3135lib/Nenshi/Markup.pod 
     36lib/Nenshi/Namespace.pm 
    3237lib/Nenshi/Namespace.pod 
    3338lib/Nenshi/Output.pm 
     
    3843lib/Nenshi/Path/Operators.pm 
    3944lib/Nenshi/Path/TypeCoercion.pm 
     45lib/Nenshi/QName.pm 
     46lib/Nenshi/Serializer/HTML.pm 
     47lib/Nenshi/Serializer/Text.pm 
     48lib/Nenshi/Serializer/XHTML.pm 
     49lib/Nenshi/Serializer/XML.pm 
     50lib/Nenshi/Stream.pm 
    4051lib/Nenshi/Stream.pod 
    4152lib/Nenshi/Template/Base.pm 
    4253lib/Nenshi/Template/Context.pm 
    4354lib/Nenshi/Template/Directives.pm 
    44 lib/Nenshi/Template/Eval.pm 
     55lib/Nenshi/Template/Expr.pm 
     56lib/Nenshi/Template/ExprGrammar.pm 
    4557lib/Nenshi/Template/Interpolate.pm 
    4658lib/Nenshi/Template/Loader.pm 
     
    5264MANIFEST                        This list of files 
    5365META.yml 
     66nytprof.out 
     67parser/ExprGrammar.skel.pm 
     68parser/ExprGrammar.yp 
     69parser/README 
     70parser/yc 
    5471README 
    5572t/00_compile.t 
     
    5875t/12_input_xml.t 
    5976t/13_output.t 
    60 t/14_builder.t 
    6177t/20_template_base.t 
    6278t/21_template_interpolation.t 
     
    6480t/22_template_text.t 
    6581t/23_template_directives.t 
     82t/24_template_eval.t 
    6683t/28_template_markup_include.t 
    6784t/29_template_loader.t 
     
    7087t/51_filter_fill.t 
    7188t/52_filter_sanitize.t 
    72 t/markup.pl 
  • Nenshi/branches/gen/lib/Gen.pm

    r139 r140  
    1818    if(ref $obj eq 'ARRAY') { 
    1919        return Gen::Generator->new(sub { 
    20             my($y) = @_; 
    21             $y->($_) for @$obj 
     20            my $y = $_[0]; 
     21            $y->($_) for @$obj; 
    2222        }); 
    2323    } 
     
    5151 
    5252sub new { 
    53     bless $_[1], $_[0]; 
     53    bless $_[1],  $_[0]; 
    5454} 
    5555 
     
    6565} 
    6666 
    67  
    6867sub __list__ { 
    6968    my @ret; 
     
    7170        push @ret, $_[0]; 
    7271    }); 
    73     return \@ret; 
     72    \@ret; 
    7473} 
    7574 
  • Nenshi/branches/gen/lib/Nenshi/Filter/EmptyTagFilter.pm

    r138 r140  
    66use Gen qw(gen); 
    77 
    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#); 
    1111 
    1212sub new { 
    13     bless { 
    14          
    15     }, shift; 
     13    bless {}, $_[0]; 
    1614} 
    1715 
     
    2220 
    2321    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) { 
    3123            $yield->(['EMPTY', $start->[1], $start->[2]]); 
    3224            undef $start; 
     
    3729                undef $start; 
    3830            } 
    39             $yield->($ev); 
     31            if($ev->[0] eq 'START_') { 
     32                $start = $ev; 
     33            } 
     34            else { 
     35                $yield->($ev); 
     36            } 
    4037        } 
    4138    } 
  • Nenshi/branches/gen/lib/Nenshi/Filter/HTMLFormFiller.pm

    r136 r140  
    77use List::Util qw(first); 
    88use Nenshi::Core qw(Attrs QName); 
     9use utf8; 
    910 
    1011use overload  
     
    3536                        my $tagname = $tag->localname; 
    3637 
    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                        })) { 
    4244                                $in_form = 1; 
    4345                        } 
     
    4951                                                if($name and exists $self->{data}{$name}) { 
    5052                                                        my $value = $self->{data}{$name}; 
    51                                                         Encode::_utf8_on($value) if not Encode::is_utf8($value); 
    5253                                                        my $declval = $attrs->get('value'); 
    5354                                                        my $checked = 0; 
    5455                                                        if(ref($value) eq 'ARRAY') { 
    55                                                                 if($declval) { 
     56                                                                if(defined $declval) { 
    5657                                                                        $checked = first { "$_" eq $declval } @$value 
    5758                                                                } 
     
    6162                                                        } 
    6263                                                        else { 
    63                                                                 if($declval) { 
     64                                                                if(defined $declval) { 
    6465                                                                        $checked = $declval eq "$value"; 
    6566                                                                } 
     
    8081                                                if($name and exists $self->{data}{$name}) { 
    8182                                                        my $value = $self->{data}{$name}; 
    82                                                         Encode::_utf8_on($value) if not Encode::is_utf8($value); 
     83                            no warnings "uninitialized"; 
    8384                                                        if(ref($value) eq 'ARRAY') { 
    8485                                                                $value = $value->[0]; 
    8586                                                        } 
    8687                                                        if(defined $value) { 
     88                                                            Encode::_utf8_on($value) if not Encode::is_utf8($value); 
    8789                                                                $attrs |= [[ QName('value'),  "$value" ]]; 
    8890                                                        } 
     
    9395                                        my $name = $attrs->get('name'); 
    9496                                        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                        } 
    97110                                                $in_select = 1; 
    98111                                        } 
     
    102115                                        if(exists $self->{data}{$name}) { 
    103116                                                $textarea_value = $self->{data}{$name}; 
    104                                                 Encode::_utf8_on($textarea_value) if not Encode::is_utf8($textarea_value); 
    105117                                                if(ref($textarea_value) eq 'ARRAY') { 
    106118                                                        $textarea_value = $textarea_value->[0] 
    107119                                                } 
     120                                                Encode::_utf8_on($textarea_value) if not Encode::is_utf8($textarea_value); 
    108121                                                $in_textarea = 1; 
    109122                                        } 
     
    133146                                return; 
    134147                        } 
    135                         $yield->([$kind, $data, $pos]); 
     148                        $yield->($ev); 
    136149                } 
    137150                elsif($in_form and $kind eq 'END_') { 
     
    151164                                } 
    152165                                else { 
    153                                         $selected  = $option_value eq "$select_value"; 
     166                                        $selected  = $option_value eq $select_value; 
    154167                                } 
    155168                                my($okind, $odata, $opos) = @$option_start; 
     
    180193                $yield->($_); 
    181194            } 
    182             $yield->([$kind, $data, $pos]); 
     195            $yield->($ev); 
    183196                } 
    184197                else { 
    185                         $yield->([$kind, $data, $pos]); 
     198                        $yield->($ev); 
    186199                } 
    187200        } 
     
    189202 
    1902031; 
     204__END__ 
  • Nenshi/branches/gen/lib/Nenshi/Filter/NamespaceFlattener.pm

    r138 r140  
    44use warnings; 
    55 
    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#); 
    99 
    1010use Gen qw(gen list); 
  • Nenshi/branches/gen/lib/Nenshi/Filter/WhitespaceFilter.pm

    r136 r140  
    44use warnings; 
    55 
    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#); 
    99 
    1010use Gen qw(gen list generator); 
     
    2727 
    2828sub process { 
    29     my($self, $stream, $ctxt) = @_; 
    30  
     29    my($self, $stream) = @_; 
    3130 
    3231    my $preserve_elems = $self->{preserve}; 
    3332    my $noescape_elems = $self->{noescape}; 
    34  
    3533 
    3634    generator { my($yield) = @_; 
  • Nenshi/branches/gen/lib/Nenshi/Input.pm

    r136 r140  
    6060                my $parser = XML::LibXML::Reader->new( 
    6161            IO => $source, 
    62             load_ext_dtd => 1, 
     62            #load_ext_dtd => 1, 
    6363            expand_entities => 1, 
    6464            no_network => 1, 
     
    151151            } 
    152152            }; 
     153 
    153154            if($@) { 
    154155                if(blessed $@ and $@->isa('Nenshi::Error')) { 
  • Nenshi/branches/gen/lib/Nenshi/Output.pm

    r138 r140  
    2020    $method ||= 'xml'; 
    2121 
    22         my $encoding = exists $options->{encoding} ? $options->{encoding} : 'utf8'; 
     22        my $encoding = exists $options->{encoding} ? $options->{encoding} : undef; 
    2323 
    2424    my $output = join('', @{list($stream)}); 
    2525        if($encoding) { 
     26        warn $encoding; 
    2627                my $errors = Encode::FB_DEFAULT; 
    2728                if($method ne 'text' and not $method->isa('Nenshi::Serializer::Text')) { 
     
    4849} 
    4950 
    50  
    51511; 
  • Nenshi/branches/gen/lib/Nenshi/Serializer/HTML.pm

    r136 r140  
    4444 
    4545    for my $filter (@{$self->{filters}}) { 
    46         $stream = $filter->($stream); 
     46        $stream = $filter->process($stream); 
    4747    } 
    4848 
  • Nenshi/branches/gen/lib/Nenshi/Serializer/XHTML.pm

    r136 r140  
    4444sub process { 
    4545    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; 
    5046 
    5147    for my $filter (@{$self->{filters}}) { 
    52         $stream = $filter->($stream); 
     48        $stream = $filter->process($stream); 
    5349    } 
    5450 
    5551    $stream = gen($stream); 
    5652    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; 
    5757        my $filter = sub { 
    5858            my($kind, $data, $pos) = @{+shift}; 
  • Nenshi/branches/gen/lib/Nenshi/Serializer/XML.pm

    r136 r140  
    1111use Nenshi::Filter::NamespaceFlattener; 
    1212 
    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#); 
    1717use constant _PRESERVE_SPACE => set(); 
    1818 
     
    4646sub process { 
    4747    my($self, $stream) = @_; 
    48     my($have_decl, $have_doctype); 
    49     my $in_cdata; 
    50      
    5148    for my $filter (@{$self->{filters}}) { 
    52         $stream = $filter->($stream); 
     49        $stream = $filter->process($stream); 
    5350    } 
    5451    $stream = gen $stream; 
    5552 
    5653    generator {my ($yield) = shift; 
     54        my($have_decl, $have_doctype); 
     55        my $in_cdata; 
     56 
    5757        my $filter = sub { 
    5858            my($kind, $data, $pos) = @{+shift}; 
  • Nenshi/branches/gen/lib/Nenshi/Stream.pm

    r136 r140  
    3333sub filter { 
    3434    my($self, $function) = @_; 
    35     ref($self)->new($function->($self), { serializer => $self->{serializer}}); 
     35    ref($self)->new($function->process($self), { serializer => $self->{serializer}}); 
    3636} 
    3737 
  • Nenshi/branches/gen/lib/Nenshi/Template/Base.pm

    r139 r140  
    88use Gen qw(generator gen list); 
    99use Encode qw(); 
     10use utf8; 
    1011 
    1112use Nenshi::Core qw(Stream Attrs _ensure); 
     
    131132#        } 
    132133#    } 
    133  
    134     $self->{filters} = [qw(_flatten _eval)]; 
     134    $self; 
     135} 
     136 
     137sub _filters { 
     138    my($self) = @_; 
     139    my @filters = qw(_flatten _eval); 
    135140    if($self->{loader}) { 
    136         push(@{$self->{filters}}, '_include'); 
    137     } 
    138     $self; 
     141        push(@filters, '_include'); 
     142    } 
     143    return @filters; 
    139144} 
    140145 
     
    215220    } 
    216221    my $stream  = $self->{stream}; 
    217     for my $filter (@{$self->{filters}}) { 
     222    for my $filter ($self->_filters) { 
    218223        $stream = $self->$filter($stream, $ctxt); 
    219224    } 
     
    258263        elsif($kind eq 'EXPR') { 
    259264            my $result = $data->evaluate($ctxt); 
     265            return if not defined $result; 
    260266 
    261267            if(not ref($result) or ref($result) eq 'Nenshi::Markup') { 
     
    270276            else { 
    271277                # stringify 
     278                undef $@; 
     279                no warnings 'uninitialized'; 
    272280                $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                } 
    274285                $yield->(['TEXT', $result, $pos]); 
    275286            } 
     
    314325                my $hrefstream = $self->_eval($href, $ctxt); 
    315326                $href = ''; 
    316                 for my $subev (@{list $hrefstream}) { 
    317                     my($kind, $data, $pos) = @$subev; 
    318                     $href .= $data if $kind eq 'TEXT'; 
    319                 } 
     327                $hrefstream->(sub { 
     328                    my($subev) = @_; 
     329                    $href .= $subev->[1] if $subev->[0] eq 'TEXT'; 
     330                }); 
    320331            } 
    321332            my $substream; 
  • Nenshi/branches/gen/lib/Nenshi/Template/Directives.pm

    r138 r140  
    4444 
    4545                eval { 
    46                         if(length($expr)) { 
    4746                                $rv =  Nenshi::Template::Expr->new( 
    4847                                        $expr, 
    4948                                        $template->filepath, $lineno, $offset, #$template->lookup 
    5049                                ); 
    51                         } 
    52                         else { 
    53                                 return; 
    54                         } 
    5550                }; 
    5651                if($@) { 
     
    227222        }; 
    228223                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(