| 1 |
package Whatpm::CSS::Tokenizer; |
package Whatpm::CSS::Tokenizer; |
| 2 |
use strict; |
use strict; |
| 3 |
|
our $VERSION=do{my @r=(q$Revision$=~/\d+/g);sprintf "%d."."%02d" x $#r,@r}; |
| 4 |
|
|
| 5 |
|
require Exporter; |
| 6 |
|
push our @ISA, 'Exporter'; |
| 7 |
|
|
| 8 |
sub BEFORE_TOKEN_STATE () { 0 } |
sub BEFORE_TOKEN_STATE () { 0 } |
| 9 |
sub BEFORE_NMSTART_STATE () { 1 } |
sub BEFORE_NMSTART_STATE () { 1 } |
| 80 |
COMMENT_INVALID EOF MINUS STAR VBAR DOT COLON MATCH EXCLAMATION |
COMMENT_INVALID EOF MINUS STAR VBAR DOT COLON MATCH EXCLAMATION |
| 81 |
); |
); |
| 82 |
|
|
| 83 |
|
our @EXPORT_OK = qw( |
| 84 |
|
IDENT_TOKEN ATKEYWORD_TOKEN HASH_TOKEN FUNCTION_TOKEN URI_TOKEN |
| 85 |
|
URI_INVALID_TOKEN URI_PREFIX_TOKEN URI_PREFIX_INVALID_TOKEN |
| 86 |
|
STRING_TOKEN INVALID_TOKEN NUMBER_TOKEN DIMENSION_TOKEN PERCENTAGE_TOKEN |
| 87 |
|
UNICODE_RANGE_TOKEN DELIM_TOKEN PLUS_TOKEN GREATER_TOKEN COMMA_TOKEN |
| 88 |
|
TILDE_TOKEN DASHMATCH_TOKEN PREFIXMATCH_TOKEN SUFFIXMATCH_TOKEN |
| 89 |
|
SUBSTRINGMATCH_TOKEN INCLUDES_TOKEN SEMICOLON_TOKEN LBRACE_TOKEN |
| 90 |
|
RBRACE_TOKEN LPAREN_TOKEN RPAREN_TOKEN LBRACKET_TOKEN RBRACKET_TOKEN |
| 91 |
|
S_TOKEN CDO_TOKEN CDC_TOKEN COMMENT_TOKEN COMMENT_INVALID_TOKEN EOF_TOKEN |
| 92 |
|
MINUS_TOKEN STAR_TOKEN VBAR_TOKEN DOT_TOKEN COLON_TOKEN MATCH_TOKEN |
| 93 |
|
EXCLAMATION_TOKEN |
| 94 |
|
); |
| 95 |
|
|
| 96 |
|
our %EXPORT_TAGS = ('token' => [@EXPORT_OK]); |
| 97 |
|
|
| 98 |
sub new ($) { |
sub new ($) { |
| 99 |
my $self = bless {token => [], get_char => sub { -1 }, |
my $self = bless {token => [], get_char => sub { -1 }, |
| 100 |
onerror => sub { }}, shift; |
onerror => sub { }}, shift; |
| 855 |
redo A; |
redo A; |
| 856 |
} else { |
} else { |
| 857 |
## Note: In |nl| in ... in |string| or |ident|. |
## Note: In |nl| in ... in |string| or |ident|. |
|
$self->{t}->{value} .= chr $self->{c}; |
|
| 858 |
$self->{state} = STRING_STATE; |
$self->{state} = STRING_STATE; |
| 859 |
$self->{c} = $self->{get_char}->(); |
$self->{c} = $self->{get_char}->(); |
| 860 |
redo A; |
redo A; |
| 870 |
URI_PREFIX_TOKEN, URI_PREFIX_INVALID_TOKEN, |
URI_PREFIX_TOKEN, URI_PREFIX_INVALID_TOKEN, |
| 871 |
URI_PREFIX_INVALID_TOKEN, URI_PREFIX_INVALID_TOKEN, |
URI_PREFIX_INVALID_TOKEN, URI_PREFIX_INVALID_TOKEN, |
| 872 |
}->{$self->{t}->{type}}; |
}->{$self->{t}->{type}}; |
|
$self->{t}->{value} .= "\x0D"; |
|
| 873 |
$self->{state} = ESCAPE_BEFORE_LF_STATE; |
$self->{state} = ESCAPE_BEFORE_LF_STATE; |
| 874 |
$self->{c} = $self->{get_char}->(); |
$self->{c} = $self->{get_char}->(); |
| 875 |
redo A; |
redo A; |
| 876 |
} else { |
} else { |
| 877 |
## Note: In |nl| in ... in |string| or |ident|. |
## Note: In |nl| in ... in |string| or |ident|. |
|
$self->{t}->{value} .= "\x0D"; |
|
| 878 |
$self->{state} = ESCAPE_BEFORE_LF_STATE; |
$self->{state} = ESCAPE_BEFORE_LF_STATE; |
| 879 |
$self->{c} = $self->{get_char}->(); |
$self->{c} = $self->{get_char}->(); |
| 880 |
redo A; |
redo A; |
| 1012 |
redo A; |
redo A; |
| 1013 |
} |
} |
| 1014 |
} elsif ($self->{state} == ESCAPE_BEFORE_LF_STATE) { |
} elsif ($self->{state} == ESCAPE_BEFORE_LF_STATE) { |
| 1015 |
## NOTE: |\n| in |\r\n| in |unicode| in |escape|. |
## NOTE: |\n| in |\r\n| in |nl| in |escape|. |
| 1016 |
if ($self->{c} == 0x000A) { # \n |
if ($self->{c} == 0x000A) { # \n |
|
$self->{t}->{value} .= chr $self->{c}; |
|
| 1017 |
$self->{state} = $q == 0 ? NAME_STATE : |
$self->{state} = $q == 0 ? NAME_STATE : |
| 1018 |
$q == 1 ? URI_UNQUOTED_STATE : STRING_STATE; |
$q == 1 ? URI_UNQUOTED_STATE : STRING_STATE; |
| 1019 |
$self->{c} = $self->{get_char}->(); |
$self->{c} = $self->{get_char}->(); |
| 1133 |
} # A |
} # A |
| 1134 |
} # get_next_token |
} # get_next_token |
| 1135 |
|
|
| 1136 |
|
=head1 LICENSE |
| 1137 |
|
|
| 1138 |
|
Copyright 2007 Wakaba <w@suika.fam.cx> |
| 1139 |
|
|
| 1140 |
|
This library is free software; you can redistribute it |
| 1141 |
|
and/or modify it under the same terms as Perl itself. |
| 1142 |
|
|
| 1143 |
|
=cut |
| 1144 |
|
|
| 1145 |
1; |
1; |
| 1146 |
# $Date$ |
# $Date$ |