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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (show annotations) (download)
Fri Feb 8 13:37:58 2008 UTC (16 years, 8 months ago) by wakaba
Branch: MAIN
++ whatpm/t/ChangeLog	8 Feb 2008 13:37:13 -0000
2008-02-08  Wakaba  <wakaba@suika.fam.cx>

	* CSS-MediaQuery.t, mq-1.dat: New files.

++ whatpm/Whatpm/CSS/ChangeLog	8 Feb 2008 13:37:45 -0000
2008-02-08  Wakaba  <wakaba@suika.fam.cx>

	* MediaQueryParser.pm, MediaQuerySerializer.pm: New Perl modules.

1 package Whatpm::CSS::MediaQueryParser;
2 use strict;
3 our $VERSION=do{my @r=(q$Revision: 1.10 $=~/\d+/g);sprintf "%d."."%02d" x $#r,@r};
4
5 use Whatpm::CSS::Tokenizer qw(:token);
6
7 sub new ($) {
8 my $self = bless {onerror => sub { },
9 must_level => 'm', unsupported_level => 'u'}, shift;
10 #$self->{href} = \(uri in which the MQ appears);
11 return $self;
12 } # new
13
14 sub parse_char_string ($$) {
15 my $self = $_[0];
16
17 my $s = $_[1];
18 pos ($s) = 0;
19
20 my $tt = Whatpm::CSS::Tokenizer->new;
21 $tt->{onerror} = $self->{onerror};
22 $tt->{line} = 1;
23 $tt->{column} = 1;
24 $tt->{get_char} = sub {
25 if (pos $s < length $s) {
26 $tt->{column} = 1 + pos $s;
27 return ord substr $s, pos ($s)++, 1;
28 } else {
29 return -1;
30 }
31 }; # $tt->{get_char}
32 $tt->init;
33
34 my $t = $tt->get_next_token;
35 $t = $tt->get_next_token while $t->{type} == S_TOKEN;
36
37 my $r;
38 ($t, $r) = $self->_parse_mq_with_tokenizer ($t, $tt);
39 return undef unless defined $r;
40
41 if ($t->{type} != EOF_TOKEN) {
42 $self->{onerror}->(type => 'mq syntax error',
43 level => $self->{must_level},
44 uri => \$self->{href},
45 token => $t);
46 return undef;
47 }
48
49 return $r;
50 } # parse_char_string
51
52 sub _parse_mq_with_tokenizer ($$$) {
53 my ($self, $t, $tt) = @_;
54
55 my $r = [];
56
57 A: {
58 ## NOTE: Unknown media types are converted into 'unknown', since
59 ## Opera and WinIE do so and our implementation of the CSS
60 ## tokenizer currently normalizes numbers in NUMBER or DIMENSION tokens
61 ## so that the original representation cannot be preserved (e.g. '03d'
62 ## is covnerted to '3' with unit 'd').
63
64 if ($t->{type} == IDENT_TOKEN) {
65 my $type = lc $t->{value}; ## TODO: case
66 if ({
67 all => 1, braille => 1, embossed => 1, handheld => 1, print => 1,
68 projection => 1, screen => 1, tty => 1, tv => 1,
69 speech => 1, aural => 1,
70 'atsc-tv' => 1, 'dde-tv' => 1, 'dvb-tv' => 1,
71 dark => 1, emacs => 1, light => 1, xemacs => 1,
72 }->{$type}) {
73 push @$r, [['#type', $type]];
74 } else {
75 push @$r, [['#type', 'unknown']];
76 $self->{onerror}->(type => 'unknown media type',
77 level => $self->{unsupported_level},
78 uri => \$self->{href},
79 token => $t);
80 }
81 $t = $tt->get_next_token;
82 } elsif ($t->{type} == NUMBER_TOKEN or $t->{type} == DIMENSION_TOKEN) {
83 push @$r, [['#type', 'unknown']];
84 $self->{onerror}->(type => 'unknown media type',
85 level => $self->{unsupported_level},
86 uri => \$self->{href},
87 token => $t);
88 $t = $tt->get_next_token;
89 } else {
90 $self->{onerror}->(type => 'mq syntax error',
91 level => $self->{must_level},
92 uri => \$self->{href},
93 token => $t);
94 return ($t, undef);
95 }
96
97 $t = $tt->get_next_token while $t->{type} == S_TOKEN;
98 if ($t->{type} == COMMA_TOKEN) {
99 $t = $tt->get_next_token;
100 $t = $tt->get_next_token while $t->{type} == S_TOKEN;
101 redo A;
102 }
103 } # A
104
105 return ($t, $r);
106 } # _parse_mq_with_tokenizer
107
108 1;

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24