Changeset 74

Show
Ignore:
Timestamp:
2007年07月10日 08時38分58秒 (1 year ago)
Author:
rintaro
Message:

Nenshi:

  • HTMLParser closes unclosed tags at document end
  • Tweak HTML::Parser parameters
  • HTMLSanitizer and tests
Location:
Nenshi/trunk
Files:
1 added
4 modified

Legend:

Unmodified
Added
Removed
  • Nenshi/trunk/lib/Nenshi/Filter/HTMLFormFiller.pm

    r72 r74  
    1010use overload  
    1111        '&{}' => sub { my $self = shift; sub { $self->__call__(@_) } }; 
     12 
    1213sub new { 
    1314        my $self = bless {}, shift; 
  • Nenshi/trunk/lib/Nenshi/Filter/HTMLSanitizer.pm

    r58 r74  
    44use warnings; 
    55 
     6use Iterator::Simple qw(iterator ifilter iter); 
    67use Nenshi::Core qw(Attrs QName :eventkind); 
    78use Nenshi::Util qw(set stripentities); 
     9 
     10use overload  
     11        '&{}' => sub { my $self = shift; sub { $self->__call__(@_) } }; 
    812 
    913use constant SAFE_TAGS => set( qw( 
     
    4044        $self->{uri_attrs} = $o{uri_attrs} || URI_ATTRS; 
    4145        $self->{safe_schemes} = $o{safe_schemes} || SAFE_SCHEMES; 
     46        $self; 
    4247} 
    4348 
     
    7378                                elsif($attr eq 'style') { 
    7479                                        my @decls; 
     80                                        # normalize new lines 
    7581                                        $value =~ s/\x0d\x0a/\n/g; 
    7682                                        $value =~ tr/\x0d\x0a/\n\n/; 
    77                                         $value =~ s/\\([0-9a-fA-F]{1,6})/pack('H2', $1)/eg; 
     83                                        # unicode escape 
     84                                        $value =~ s/\\([0-9a-fA-F]{1,6})\s?/pack('H*', $1)/eg; 
    7885                                        for my $decl (split ';', $value) { 
    7986                                                next if not $decl; 
    8087                                                my $is_evil = index($decl, 'expression') >= 0; 
    81                                                 while($decl =~ /url\s\(([^\)]+)/g) { 
     88                                                while($decl =~ /url\s*\(([^\)]+)/g) { 
    8289                                                        my $scheme = _get_scheme($value); 
    8390                                                        if(not $self->{safe_schemes}->contains($scheme)) { 
     
    8794                                                } 
    8895                                                if(not $is_evil) { 
    89                                                         $decl =~ s/^\s+|\s+$//g; 
     96                                                        $decl =~ s/^\s+//s; 
     97                                                        $decl =~ s/\s+$//s; 
    9098                                                        push @decls, $decl; 
    9199                                                } 
     
    105113                                        return; 
    106114                                } 
     115                                return; 
    107116                        } 
    108117                        else { 
     
    114123                        return [$kind, $data, $pos]; 
    115124                } 
     125                return; 
    116126        } 
    117127} 
     
    126136 
    1271371; 
     138 
  • Nenshi/trunk/lib/Nenshi/Input.pm

    r73 r74  
    199199 
    200200        use base qw(HTML::Parser); 
     201        use Encode qw(); 
    201202        use Iterator::Simple qw( iterator iter ); 
    202203        use Nenshi::Core qw( :eventkind Stream Attrs QName ); 
     
    219220                                declaration => ['handle_doctype', 'self,tokens,line,column'], 
    220221                                process => ['handle_process', 'self,token0,line,column'], 
     222                                start_document => [''], 
     223                                end_document => ['handle_enddoc', 'self,line,column'], 
     224                                default => ['handle_default', 'self,event,line,column'], 
    221225                        }, 
    222226                        unbroken_text => 1, 
    223227                        attr_encoded => 1, 
     228                        strict_names => 1, 
     229                        empty_element_tags => 1, 
    224230                        #utf8_mode => 1, 
    225231                ); 
     
    294300                $self->_enqueue(PI, [$target, $data], [$line, $col]); 
    295301        } 
     302         
     303        sub handle_enddoc { 
     304                my $self = shift; 
     305                my($line, $col) = @_; 
     306                while(scalar @{$self->{_open_tags}}) { 
     307                        my $tag = pop @{$self->{_open_tags}}; 
     308                        $self->_enqueue(END_, $tag, [$line, $col]); 
     309                } 
     310        } 
    296311 
    297312        sub handle_declaration { 
     
    301316        } 
    302317 
     318        sub handle_default { 
     319                my($self, $event) = @_; 
     320                warn "HANDLE DEFAULT: $event"; 
     321        } 
     322         
    303323        sub parse { 
    304324                my($self) = @_; 
     
    324344                                        next; 
    325345                                } 
    326                                  
    327346                                if($@) { 
    328347                                        Nenshi::ParseError->throw("$@",$self->{filename},$self->current_line, $self->current_column); 
  • Nenshi/trunk/lib/Nenshi/Util.pm

    r71 r74  
    1010{ 
    1111        package Nenshi::Set; 
     12 
     13        use overload ( 
     14                '|' => sub { 
     15                        my($self, $other) = @_; 
     16                        Nenshi::Set->new(keys(%$self), @$other) 
     17                }, 
     18                '@{}' => sub { 
     19                        my($self) = @_; 
     20                        [keys %$self]; 
     21                }, 
     22                fallback => 1, 
     23        ); 
    1224 
    1325        sub new { 
     
    2638        } 
    2739} 
     40 
    2841sub set { Nenshi::Set->new(@_); } 
    2942push @EXPORT_OK, qw(set);