Parent Directory
|
Revision Log
++ whatpm/t/ChangeLog 11 Feb 2008 00:32:04 -0000 2008-02-11 Wakaba <wakaba@suika.fam.cx> * css-4.dat: New test file. * CSS-Parser-1.t: |css-4.dat| added. Support for '@charset' and '@import'. ++ whatpm/Whatpm/CSS/ChangeLog 11 Feb 2008 00:31:35 -0000 2008-02-11 Wakaba <wakaba@suika.fam.cx> * Parser.pm (parse_char_string): Precious '@charset' error reporting. 2008-02-10 Wakaba <wakaba@suika.fam.cx> * Parser.pm (parse_char_string): '@import' support.
| 1 | wakaba | 1.1 | package Whatpm::CSS::Parser; |
| 2 | use strict; | ||
| 3 | use Whatpm::CSS::Tokenizer qw(:token); | ||
| 4 | require Whatpm::CSS::SelectorsParser; | ||
| 5 | wakaba | 1.63 | require Whatpm::CSS::MediaQueryParser; |
| 6 | wakaba | 1.1 | |
| 7 | sub new ($) { | ||
| 8 | wakaba | 1.40 | my $self = bless {must_level => 'm', |
| 9 | wakaba | 1.5 | message_level => 'w', |
| 10 | wakaba | 1.65 | unsupported_level => 'u', |
| 11 | lookup_namespace_uri => sub { undef }}, shift; | ||
| 12 | wakaba | 1.11 | # $self->{base_uri} |
| 13 | wakaba | 1.18 | # $self->{unitless_px} = 1/0 |
| 14 | wakaba | 1.28 | # $self->{hashless_rgb} = 1/0 |
| 15 | |||
| 16 | wakaba | 1.40 | ## Default error handler |
| 17 | $self->{onerror} = sub { | ||
| 18 | my %opt = @_; | ||
| 19 | require Carp; | ||
| 20 | Carp::carp | ||
| 21 | (sprintf 'Document <%s>: Line %d column %d (token %s): %s%s', | ||
| 22 | defined $opt{uri} ? ${$opt{uri}} : 'thisdocument:/', | ||
| 23 | $opt{token}->{line}, | ||
| 24 | $opt{token}->{column}, | ||
| 25 | Whatpm::CSS::Tokenizer->serialize_token ($opt{token}), | ||
| 26 | $opt{type}, | ||
| 27 | defined $opt{value} ? " (value $opt{value})" : ''); | ||
| 28 | }; | ||
| 29 | |||
| 30 | wakaba | 1.28 | ## Media-dependent RGB color range clipper |
| 31 | $self->{clip_color} = sub { | ||
| 32 | shift; #my $self = shift; | ||
| 33 | my $value = shift; | ||
| 34 | if (defined $value and $value->[0] eq 'RGBA') { | ||
| 35 | my ($r, $g, $b) = @$value[1, 2, 3]; | ||
| 36 | $r = 0 if $r < 0; $r = 255 if $r > 255; | ||
| 37 | $g = 0 if $g < 0; $g = 255 if $g > 255; | ||
| 38 | $b = 0 if $b < 0; $b = 255 if $b > 255; | ||
| 39 | return ['RGBA', $r, $g, $b, $value->[4]]; | ||
| 40 | } | ||
| 41 | return $value; | ||
| 42 | }; | ||
| 43 | wakaba | 1.1 | |
| 44 | wakaba | 1.31 | ## System dependent font expander |
| 45 | $self->{get_system_font} = sub { | ||
| 46 | #my ($self, $normalized_system_font_name, $font_properties) = @_; | ||
| 47 | ## Modify $font_properties hash (except for 'font-family' property). | ||
| 48 | return $_[2]; | ||
| 49 | }; | ||
| 50 | |||
| 51 | wakaba | 1.1 | return $self; |
| 52 | } # new | ||
| 53 | |||
| 54 | sub BEFORE_STATEMENT_STATE () { 0 } | ||
| 55 | sub BEFORE_DECLARATION_STATE () { 1 } | ||
| 56 | sub IGNORED_STATEMENT_STATE () { 2 } | ||
| 57 | sub IGNORED_DECLARATION_STATE () { 3 } | ||
| 58 | |||
| 59 | wakaba | 1.5 | our $Prop; ## By CSS property name |
| 60 | our $Attr; ## By CSSOM attribute name | ||
| 61 | our $Key; ## By internal key | ||
| 62 | |||
| 63 | wakaba | 1.66 | sub init ($) { |
| 64 | my $self = shift; | ||
| 65 | delete $self->{style_sheet}; | ||
| 66 | delete $self->{unitless_px}; | ||
| 67 | delete $self->{hashless_rgb}; | ||
| 68 | delete $self->{href}; | ||
| 69 | delete $self->{base_uri}; | ||
| 70 | } # init | ||
| 71 | |||
| 72 | wakaba | 1.1 | sub parse_char_string ($$) { |
| 73 | my $self = $_[0]; | ||
| 74 | |||
| 75 | my $s = $_[1]; | ||
| 76 | pos ($s) = 0; | ||
| 77 | wakaba | 1.2 | my $line = 1; |
| 78 | my $column = 0; | ||
| 79 | wakaba | 1.1 | |
| 80 | my $tt = Whatpm::CSS::Tokenizer->new; | ||
| 81 | wakaba | 1.38 | my $onerror = $tt->{onerror} = $self->{onerror}; |
| 82 | wakaba | 1.37 | $tt->{get_char} = sub ($) { |
| 83 | wakaba |