/[suikacvs]/markup/html/whatpm/Whatpm/HTML.pm.src
Suika

Diff of /markup/html/whatpm/Whatpm/HTML.pm.src

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.169 by wakaba, Sat Sep 13 11:31:09 2008 UTC revision 1.172 by wakaba, Sun Sep 14 03:07:58 2008 UTC
# Line 618  sub parse_byte_stream ($$$$;$$) { Line 618  sub parse_byte_stream ($$$$;$$) {
618  sub parse_char_string ($$$;$$) {  sub parse_char_string ($$$;$$) {
619    #my ($self, $s, $doc, $onerror, $get_wrapper) = @_;    #my ($self, $s, $doc, $onerror, $get_wrapper) = @_;
620    my $self = shift;    my $self = shift;
   require utf8;  
621    my $s = ref $_[0] ? $_[0] : \($_[0]);    my $s = ref $_[0] ? $_[0] : \($_[0]);
622    open my $input, '<' . (utf8::is_utf8 ($$s) ? ':utf8' : ''), $s;    require Whatpm::Charset::DecodeHandle;
623      my $input = Whatpm::Charset::DecodeHandle::CharString->new ($s);
624    if ($_[3]) {    if ($_[3]) {
625      $input = $_[3]->($input);      $input = $_[3]->($input);
626    }    }
# Line 669  sub parse_char_stream ($$$;$) { Line 669  sub parse_char_stream ($$$;$) {
669        $self->{column} = 0;        $self->{column} = 0;
670      } elsif ($self->{next_char} == 0x000D) { # CR      } elsif ($self->{next_char} == 0x000D) { # CR
671        !!!cp ('j2');        !!!cp ('j2');
672    ## TODO: support for abort/streaming
673        my $next = $input->getc;        my $next = $input->getc;
674        if (defined $next and $next ne "\x0A") {        if (defined $next and $next ne "\x0A") {
675          $self->{next_next_char} = $next;          $self->{next_next_char} = $next;
# Line 688  sub parse_char_stream ($$$;$) { Line 689  sub parse_char_stream ($$$;$) {
689               (0x007F <= $self->{next_char} and $self->{next_char} <= 0x009F) or               (0x007F <= $self->{next_char} and $self->{next_char} <= 0x009F) or
690               (0xD800 <= $self->{next_char} and $self->{next_char} <= 0xDFFF) or               (0xD800 <= $self->{next_char} and $self->{next_char} <= 0xDFFF) or
691               (0xFDD0 <= $self->{next_char} and $self->{next_char} <= 0xFDDF) or               (0xFDD0 <= $self->{next_char} and $self->{next_char} <= 0xFDDF) or
692    ## ISSUE: U+FDE0-U+FDEF are not excluded
693               {               {
694                0xFFFE => 1, 0xFFFF => 1, 0x1FFFE => 1, 0x1FFFF => 1,                0xFFFE => 1, 0xFFFF => 1, 0x1FFFE => 1, 0x1FFFF => 1,
695                0x2FFFE => 1, 0x2FFFF => 1, 0x3FFFE => 1, 0x3FFFF => 1,                0x2FFFE => 1, 0x2FFFF => 1, 0x3FFFE => 1, 0x3FFFF => 1,
# Line 712  sub parse_char_stream ($$$;$) { Line 714  sub parse_char_stream ($$$;$) {
714    $self->{prev_char} = [-1, -1, -1];    $self->{prev_char} = [-1, -1, -1];
715    $self->{next_char} = -1;    $self->{next_char} = -1;
716    
717      $self->{read_until} = sub {
718        #my ($scalar, $specials_range, $offset) = @_;
719        my $specials_range = $_[1];
720        return 0 if defined $self->{next_next_char};
721        my $count = $input->manakai_read_until
722           ($_[0],
723            qr/(?![$specials_range\x{FDD0}-\x{FDDF}\x{FFFE}\x{FFFF}\x{1FFFE}\x{1FFFF}\x{2FFFE}\x{2FFFF}\x{3FFFE}\x{3FFFF}\x{4FFFE}\x{4FFFF}\x{5FFFE}\x{5FFFF}\x{6FFFE}\x{6FFFF}\x{7FFFE}\x{7FFFF}\x{8FFFE}\x{8FFFF}\x{9FFFE}\x{9FFFF}\x{AFFFE}\x{AFFFF}\x{BFFFE}\x{BFFFF}\x{CFFFE}\x{CFFFF}\x{DFFFE}\x{DFFFF}\x{EFFFE}\x{EFFFF}\x{FFFFE}\x{FFFFF}])[\x20-\x7E\xA0-\x{D7FF}\x{E000}-\x{10FFFD}]/,
724            $_[2]);
725        if ($count) {
726          $self->{column} += $count;
727          $self->{column_prev} += $count;
728          $self->{prev_char} = [-1, -1, -1];
729          $self->{next_char} = -1;
730        }
731        return $count;
732      }; # $self->{read_until}
733    
734    my $onerror = $_[2] || sub {    my $onerror = $_[2] || sub {
735      my (%opt) = @_;      my (%opt) = @_;
736      my $line = $opt{token} ? $opt{token}->{line} : $opt{line};      my $line = $opt{token} ? $opt{token}->{line} : $opt{line};
# Line 1008  sub _get_next_token ($) { Line 1027  sub _get_next_token ($) {
1027                     data => chr $self->{next_char},                     data => chr $self->{next_char},
1028                     line => $self->{line}, column => $self->{column},                     line => $self->{line}, column => $self->{column},
1029                    };                    };
1030          $self->{read_until}->($token->{data}, q[-!<>&], length $token->{data});
1031    
1032        ## Stay in the data state        ## Stay in the data state
1033        !!!next-input-character;        !!!next-input-character;
1034    
# Line 2946  sub _get_next_token ($) { Line 2967  sub _get_next_token ($) {
2967          ## Return nothing.          ## Return nothing.
2968          #          #
2969        } elsif ($self->{next_char} == 0x0023) { # #        } elsif ($self->{next_char} == 0x0023) { # #
2970            !!!cp (999);
2971          $self->{state} = ENTITY_HASH_STATE;          $self->{state} = ENTITY_HASH_STATE;
2972          $self->{state_keyword} = '#';          $self->{state_keyword} = '#';
2973          !!!next-input-character;          !!!next-input-character;
# Line 2954  sub _get_next_token ($) { Line 2976  sub _get_next_token ($) {
2976                  $self->{next_char} <= 0x005A) or # A..Z                  $self->{next_char} <= 0x005A) or # A..Z
2977                 (0x0061 <= $self->{next_char} and                 (0x0061 <= $self->{next_char} and
2978                  $self->{next_char} <= 0x007A)) { # a..z                  $self->{next_char} <= 0x007A)) { # a..z
2979            !!!cp (998);
2980          require Whatpm::_NamedEntityList;          require Whatpm::_NamedEntityList;
2981          $self->{state} = ENTITY_NAME_STATE;          $self->{state} = ENTITY_NAME_STATE;
2982          $self->{state_keyword} = chr $self->{next_char};          $self->{state_keyword} = chr $self->{next_char};
# Line 2975  sub _get_next_token ($) { Line 2998  sub _get_next_token ($) {
2998        ## process of the tokenizer.        ## process of the tokenizer.
2999    
3000        if ($self->{prev_state} == DATA_STATE) {        if ($self->{prev_state} == DATA_STATE) {
3001            !!!cp (997);
3002          $self->{state} = $self->{prev_state};          $self->{state} = $self->{prev_state};
3003          ## Reconsume.          ## Reconsume.
3004          !!!emit ({type => CHARACTER_TOKEN, data => '&',          !!!emit ({type => CHARACTER_TOKEN, data => '&',
# Line 2983  sub _get_next_token ($) { Line 3007  sub _get_next_token ($) {
3007                   });                   });
3008          redo A;          redo A;
3009        } else {        } else {
3010            !!!cp (996);
3011          $self->{current_attribute}->{value} .= '&';          $self->{current_attribute}->{value} .= '&';
3012          $self->{state} = $self->{prev_state};          $self->{state} = $self->{prev_state};
3013          ## Reconsume.          ## Reconsume.
# Line 2991  sub _get_next_token ($) { Line 3016  sub _get_next_token ($) {
3016      } elsif ($self->{state} == ENTITY_HASH_STATE) {      } elsif ($self->{state} == ENTITY_HASH_STATE) {
3017        if ($self->{next_char} == 0x0078 or # x        if ($self->{next_char} == 0x0078 or # x
3018            $self->{next_char} == 0x0058) { # X            $self->{next_char} == 0x0058) { # X
3019            !!!cp (995);
3020          $self->{state} = HEXREF_X_STATE;          $self->{state} = HEXREF_X_STATE;
3021          $self->{state_keyword} .= chr $self->{next_char};          $self->{state_keyword} .= chr $self->{next_char};
3022          !!!next-input-character;          !!!next-input-character;
3023          redo A;          redo A;
3024        } elsif (0x0030 <= $self->{next_char} and        } elsif (0x0030 <= $self->{next_char} and
3025                 $self->{next_char} <= 0x0039) { # 0..9                 $self->{next_char} <= 0x0039) { # 0..9
3026            !!!cp (994);
3027          $self->{state} = NCR_NUM_STATE;          $self->{state} = NCR_NUM_STATE;
3028          $self->{state_keyword} = $self->{next_char} - 0x0030;          $self->{state_keyword} = $self->{next_char} - 0x0030;
3029          !!!next-input-character;          !!!next-input-character;
3030          redo A;          redo A;
3031        } else {        } else {
         !!!cp (1019);  
3032          !!!parse-error (type => 'bare nero',          !!!parse-error (type => 'bare nero',
3033                          line => $self->{line_prev},                          line => $self->{line_prev},
3034                          column => $self->{column_prev} - 1);                          column => $self->{column_prev} - 1);
# Line 3012  sub _get_next_token ($) { Line 3038  sub _get_next_token ($) {
3038          ## value in the later processing.          ## value in the later processing.
3039    
3040          if ($self->{prev_state} == DATA_STATE) {          if ($self->{prev_state} == DATA_STATE) {
3041              !!!cp (1019);
3042            $self->{state} = $self->{prev_state};            $self->{state} = $self->{prev_state};
3043            ## Reconsume.            ## Reconsume.
3044            !!!emit ({type => CHARACTER_TOKEN,            !!!emit ({type => CHARACTER_TOKEN,
# Line 3021  sub _get_next_token ($) { Line 3048  sub _get_next_token ($) {
3048                     });                     });
3049            redo A;            redo A;
3050          } else {          } else {
3051              !!!cp (993);
3052            $self->{current_attribute}->{value} .= '&#';            $self->{current_attribute}->{value} .= '&#';
3053            $self->{state} = $self->{prev_state};            $self->{state} = $self->{prev_state};
3054            ## Reconsume.            ## Reconsume.
# Line 3077  sub _get_next_token ($) { Line 3105  sub _get_next_token ($) {
3105        }        }
3106    
3107        if ($self->{prev_state} == DATA_STATE) {        if ($self->{prev_state} == DATA_STATE) {
3108            !!!cp (992);
3109          $self->{state} = $self->{prev_state};          $self->{state} = $self->{prev_state};
3110          ## Reconsume.          ## Reconsume.
3111          !!!emit ({type => CHARACTER_TOKEN, data => chr $code,          !!!emit ({type => CHARACTER_TOKEN, data => chr $code,
# Line 3084  sub _get_next_token ($) { Line 3113  sub _get_next_token ($) {
3113                   });                   });
3114          redo A;          redo A;
3115        } else {        } else {
3116            !!!cp (991);
3117          $self->{current_attribute}->{value} .= chr $code;          $self->{current_attribute}->{value} .= chr $code;
3118          $self->{current_attribute}->{has_reference} = 1;          $self->{current_attribute}->{has_reference} = 1;
3119          $self->{state} = $self->{prev_state};          $self->{state} = $self->{prev_state};
# Line 3095  sub _get_next_token ($) { Line 3125  sub _get_next_token ($) {
3125            (0x0041 <= $self->{next_char} and $self->{next_char} <= 0x0046) or            (0x0041 <= $self->{next_char} and $self->{next_char} <= 0x0046) or
3126            (0x0061 <= $self->{next_char} and $self->{next_char} <= 0x0066)) {            (0x0061 <= $self->{next_char} and $self->{next_char} <= 0x0066)) {
3127          # 0..9, A..F, a..f          # 0..9, A..F, a..f
3128            !!!cp (990);
3129          $self->{state} = HEXREF_HEX_STATE;          $self->{state} = HEXREF_HEX_STATE;
3130          $self->{state_keyword} = 0;          $self->{state_keyword} = 0;
3131          ## Reconsume.          ## Reconsume.
3132          redo A;          redo A;
3133        } else {        } else {
         !!!cp (1005);  
3134          !!!parse-error (type => 'bare hcro',          !!!parse-error (type => 'bare hcro',
3135                          line => $self->{line_prev},                          line => $self->{line_prev},
3136                          column => $self->{column_prev} - 2);                          column => $self->{column_prev} - 2);
# Line 3110  sub _get_next_token ($) { Line 3140  sub _get_next_token ($) {
3140          ## element or the attribute value in the later processing.          ## element or the attribute value in the later processing.
3141    
3142          if ($self->{prev_state} == DATA_STATE) {          if ($self->{prev_state} == DATA_STATE) {
3143              !!!cp (1005);
3144            $self->{state} = $self->{prev_state};            $self->{state} = $self->{prev_state};
3145            ## Reconsume.            ## Reconsume.
3146            !!!emit ({type => CHARACTER_TOKEN,            !!!emit ({type => CHARACTER_TOKEN,
# Line 3119  sub _get_next_token ($) { Line 3150  sub _get_next_token ($) {
3150                     });                     });
3151            redo A;            redo A;
3152          } else {          } else {
3153              !!!cp (989);
3154            $self->{current_attribute}->{value} .= '&' . $self->{state_keyword};            $self->{current_attribute}->{value} .= '&' . $self->{state_keyword};
3155            $self->{state} = $self->{prev_state};            $self->{state} = $self->{prev_state};
3156            ## Reconsume.            ## Reconsume.
# Line 3189  sub _get_next_token ($) { Line 3221  sub _get_next_token ($) {
3221        }        }
3222    
3223        if ($self->{prev_state} == DATA_STATE) {        if ($self->{prev_state} == DATA_STATE) {
3224            !!!cp (988);
3225          $self->{state} = $self->{prev_state};          $self->{state} = $self->{prev_state};
3226          ## Reconsume.          ## Reconsume.
3227          !!!emit ({type => CHARACTER_TOKEN, data => chr $code,          !!!emit ({type => CHARACTER_TOKEN, data => chr $code,
# Line 3196  sub _get_next_token ($) { Line 3229  sub _get_next_token ($) {
3229                   });                   });
3230          redo A;          redo A;
3231        } else {        } else {
3232            !!!cp (987);
3233          $self->{current_attribute}->{value} .= chr $code;          $self->{current_attribute}->{value} .= chr $code;
3234          $self->{current_attribute}->{has_reference} = 1;          $self->{current_attribute}->{has_reference} = 1;
3235          $self->{state} = $self->{prev_state};          $self->{state} = $self->{prev_state};
# Line 3279  sub _get_next_token ($) { Line 3313  sub _get_next_token ($) {
3313        ## appropriate attribute value state anyway.        ## appropriate attribute value state anyway.
3314    
3315        if ($self->{prev_state} == DATA_STATE) {        if ($self->{prev_state} == DATA_STATE) {
3316            !!!cp (986);
3317          $self->{state} = $self->{prev_state};          $self->{state} = $self->{prev_state};
3318          ## Reconsume.          ## Reconsume.
3319          !!!emit ({type => CHARACTER_TOKEN,          !!!emit ({type => CHARACTER_TOKEN,
# Line 3288  sub _get_next_token ($) { Line 3323  sub _get_next_token ($) {
3323                   });                   });
3324          redo A;          redo A;
3325        } else {        } else {
3326            !!!cp (985);
3327          $self->{current_attribute}->{value} .= $data;          $self->{current_attribute}->{value} .= $data;
3328          $self->{current_attribute}->{has_reference} = 1 if $has_ref;          $self->{current_attribute}->{has_reference} = 1 if $has_ref;
3329          $self->{state} = $self->{prev_state};          $self->{state} = $self->{prev_state};
# Line 7758  sub set_inner_html ($$$;$) { Line 7794  sub set_inner_html ($$$;$) {
7794      };      };
7795      $p->{prev_char} = [-1, -1, -1];      $p->{prev_char} = [-1, -1, -1];
7796      $p->{next_char} = -1;      $p->{next_char} = -1;
7797        
7798        $p->{read_until} = sub {
7799          ## TODO: ...
7800          return 0;
7801        }; # $p->{read_until};
7802    
7803      my $ponerror = $onerror || sub {      my $ponerror = $onerror || sub {
7804        my (%opt) = @_;        my (%opt) = @_;
7805        my $line = $opt{line};        my $line = $opt{line};

Legend:
Removed from v.1.169  
changed lines
  Added in v.1.172

[email protected]
ViewVC Help
Powered by ViewVC 1.1.24