/[suikacvs]/markup/html/whatpm/Whatpm/CSS/Parser.pm
Suika

Contents of /markup/html/whatpm/Whatpm/CSS/Parser.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.67 - (hide annotations) (download)
Mon Feb 11 00:32:08 2008 UTC (18 years, 5 months ago) by wakaba
Branch: MAIN
Changes since 1.66: +97 -32 lines
++ 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