/[suikacvs]/messaging/manakai/lib/Message/DOM/CSSRule.pm
Suika

Contents of /messaging/manakai/lib/Message/DOM/CSSRule.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.7 - (show annotations) (download)
Mon Jan 14 05:53:44 2008 UTC (16 years, 10 months ago) by wakaba
Branch: MAIN
Changes since 1.6: +8 -10 lines
++ manakai/lib/Message/DOM/ChangeLog	14 Jan 2008 05:53:34 -0000
	* CSSRule.pm (css_text): Trailing newline character is removed
	to avoid double empty lines in CSSStyleSheet->css_text.
	(selector_text): Namespace support is fixed.

	* CSSStyleSheet.pm (___new): Now it accepts |_nsmap| option.

2008-01-14  Wakaba  <wakaba@suika.fam.cx>

1 package Message::DOM::CSSRule;
2 use strict;
3 our $VERSION=do{my @r=(q$Revision: 1.6 $=~/\d+/g);sprintf "%d."."%02d" x $#r,@r};
4 push our @ISA, 'Message::IF::CSSRule';
5 require Scalar::Util;
6
7 ## |CSSRule| constants
8
9 sub STYLE_RULE () { 1 }
10 sub CHARSET_RULE () { 2 }
11 sub IMPORT_RULE () { 3 }
12 sub MEDIA_RULE () { 4 }
13 sub FONT_FACE_RULE () { 5 }
14 sub PAGE_RULE () { 6 }
15 sub NAMESPACE_RULE () { 7 }
16
17 ## |CSSRule| attributes
18
19 sub css_text ($) {
20 die "$0: ".(ref $_[0])."->css_text: Not implemented";
21 } # css_text
22
23 sub parent_rule ($) {
24 return ${$_[0]}->{parent_rule};
25 } # parent_rule
26
27 sub parent_style_sheet ($) {
28 if (${$_[0]}->{parent_style_sheet}) {
29 return ${$_[0]}->{parent_style_sheet};
30 } elsif (${$_[0]}->{parent_rule}) {
31 local $Error::Depth = $Error::Depth + 1;
32 return ${$_[0]}->{parent_rule}->parent_style_sheet;
33 } else {
34 ## NOTE: Not in the CSSOM ED: If the |CSSRule| object is not
35 ## yet associated to any CSS style sheet. Such object should not be
36 ## returned to applications - that is, the intention is that only
37 ## modules belonging to manakai may get |undef| from the
38 ## |parent_style_sheet| attribute during the construction of CSSOM.
39 ## Therefore, this is not counted as a manakai extension to CSSOM spec.
40 return undef;
41 }
42 } # parent_style_sheet
43
44 sub type ($) {
45 die "$0: ".(ref $_[0])."->type: Not implemented";
46 } # type
47
48 package Message::DOM::CSSStyleRule;
49 push our @ISA, 'Message::DOM::CSSRule', 'Message::IF::CSSStyleRule';
50
51 sub ____new ($$$) {
52 my $self = bless \{_selectors => $_[1], style => $_[2]}, $_[0];
53 ${$_[2]}->{parent_rule} = $self;
54 Scalar::Util::weaken (${$_[2]}->{parent_rule});
55 return $self;
56 } # ____new
57
58 ## |CSSRule| attributes
59
60 sub css_text ($;$) {
61 ## TODO: setter
62
63 ## NOTE: Where and how white space characters are inserted are
64 ## intentionally changed from those in browsers so that properties are
65 ## more prettily printed.
66 ## See <http://suika.fam.cx/gate/2005/sw/cssText> for what browsers do.
67 local $Error::Depth = $Error::Depth + 1;
68 return $_[0]->selector_text . " {\n" . $_[0]->style->css_text . '}';
69 } # css_text
70
71 sub type ($) { Message::DOM::CSSRule::STYLE_RULE }
72
73 ## |CSSStyleRule| attributes
74
75 sub selector_text ($;$) {
76 ## TODO: setter
77
78 ## TODO: Browser-compatible serializer
79 ## TODO: This code does not work for cases where default namespace
80 ## has no namespace prefix declared.
81 my $self = $_[0];
82 require Whatpm::CSS::SelectorsSerializer;
83 return Whatpm::CSS::SelectorsSerializer->serialize_selector_text
84 ($$self->{_selectors}, ${$self->parent_style_sheet}->{_nsmap});
85 } # selector_text
86
87 sub style ($) {
88 return ${$_[0]}->{style};
89 } # style
90
91 package Message::DOM::CSSCharsetRule;
92 push our @ISA, 'Message::DOM::CSSRule', 'Message::IF::CSSCharsetRule';
93
94 sub ____new ($$) {
95 return bless \{encoding => $_[1]}, $_[0];
96 } # ____new
97
98 ## |CSSRule| attributes
99
100 sub css_text ($;$) {
101 ## TODO: setter
102
103 ## NOTE: It will be broken if |encoding| contains |"| or |\|, but this
104 ## is what browsers do.
105 return '@charset "'.${$_[0]}->{encoding}.'";';
106 } # css_text
107
108 sub type ($) { Message::DOM::CSSRule::CHARSET_RULE }
109
110 ## |CSSCharsetRule| attribute
111
112 sub encoding ($) {
113 return ${$_[0]}->{encoding};
114 } # encoding
115
116 package Message::DOM::CSSImportRule;
117 push our @ISA, 'Message::DOM::CSSRule', 'Message::IF::CSSImportRule';
118
119 sub ____new ($$$$) {
120 my $self = bless \{href => $_[1], media => $_[2], style_sheet => $_[3]}, $_[0];
121 ${$_[3]}->{owner_rule} = $self;
122 Scalar::Util::weaken (${$_[3]}->{owner_rule});
123 return $self;
124 } # ____new
125
126 ## |CSSRule| attributes
127
128 ## TODO: |css_text|
129
130 sub type ($) { Message::DOM::CSSRule::IMPORT_RULE }
131
132 ## |CSSImportRule| attributes
133
134 sub href ($) {
135 return ${$_[0]}->{href};
136 } # href
137
138 sub media ($) {
139 return ${$_[0]}->{media};
140 } # media
141
142 sub style_sheet ($) {
143 return ${$_[0]}->{style_sheet};
144 } # style_sheet
145
146 package Message::DOM::CSSMediaRule;
147 push our @ISA, 'Message::DOM::CSSRule', 'Message::IF::CSSMediaRule';
148
149 sub ____new ($$$) {
150 my $self = bless \{media => $_[1], css_rules => $_[2]}, $_[0];
151 for (@{$_[2]}) {
152 ${$_}->{parent_rule} = $self;
153 Scalar::Util::weaken (${$_}->{parent_rule});
154 }
155 return $self;
156 } # ____new
157
158 ## |CSSRule| attributes
159
160 ## TODO: |css_text|
161
162 sub type ($) { Message::DOM::CSSRule::MEDIA_RULE }
163
164 ## |CSSMediaRule| attributes
165
166 sub css_rules ($) {
167 require Message::DOM::CSSRuleList;
168 return bless \\($_[0]), 'Message::DOM::CSSRuleList';
169 } # css_rules
170
171 sub media ($) {
172 return ${$_[0]}->{media};
173 } # media
174
175 package Message::DOM::CSSFontFaceRule;
176 push our @ISA, 'Message::DOM::CSSRule', 'Message::IF::CSSFontFaceRule';
177
178 sub ____new ($$) {
179 my $self = bless \{style => $_[1]}, $_[0];
180 ${$_[2]}->{parent_rule} = $self;
181 Scalar::Util::weaken (${$_[2]}->{parent_rule});
182 return $self;
183 } # ____new
184
185 ## |CSSRule| attributes
186
187 ## TODO: |css_text|
188
189 sub type ($) { Message::DOM::CSSRule::FONT_FACE_RULE }
190
191 ## |CSSFontFaceRule| attribute
192
193 sub style ($) {
194 return ${$_[0]}->{style};
195 } # style
196
197 package Message::DOM::CSSPageRule;
198 push our @ISA, 'Message::DOM::CSSRule', 'Message::IF::CSSPageRule';
199
200 sub ____new ($$$) {
201 my $self = bless \{_selectors => $_[1], style => $_[2]}, $_[0];
202 ${$_[2]}->{parent_rule} = $self;
203 Scalar::Util::weaken (${$_[2]}->{parent_rule});
204 return $self;
205 } # ____new
206
207 ## |CSSRule| attributes
208
209 ## TODO: |css_text|
210
211 sub type ($) { Message::DOM::CSSRule::PAGE_RULE }
212
213 ## |CSSPageRule| attributes
214
215 sub selector_text ($;$) {
216 ## TODO: setter
217
218 ## TODO: Browser-compatible serializer
219 require Whatpm::CSS::SelectorsSerializer;
220 return Whatpm::CSS::SelectorsSerializer->serialize_test (${$_[0]}->{_selectors});
221 } # selector_text
222
223 sub style ($) {
224 return ${$_[0]}->{style};
225 } # style
226
227 package Message::DOM::CSSNamespaceRule;
228 push our @ISA, 'Message::DOM::CSSRule', 'Message::IF::CSSNamespaceRule';
229
230 sub ____new ($$$) {
231 return bless \{namespace_uri => $_[2], prefix => $_[1]}, $_[0];
232 } # ___new
233
234 ## |CSSRule| attributes
235
236 sub css_text ($;$) {
237 ## TODO: Setter
238
239 ## NOTE: Sometimes ugly, but this is what Firefox does.
240 my $prefix = ${$_[0]}->{prefix};
241 return '@namespace '.($prefix ne '' ? $prefix.' ' : '').
242 'url('.${$_[0]}->{namespace_uri}.');';
243 } # css_text
244
245 sub type ($) { Message::DOM::CSSRule::NAMESPACE_RULE }
246
247 ## |CSSNamespaceRule| attributes
248
249 sub namespace_uri ($) {
250 return ${$_[0]}->{namespace_uri};
251 } # namespace_uri
252
253 sub prefix ($) {
254 return ${$_[0]}->{prefix};
255 } # prefix
256
257 package Message::IF::CSSRule;
258 package Message::IF::CSSStyleRule;
259 package Message::IF::CSSCharsetRule;
260 package Message::IF::CSSImportRule;
261 package Message::IF::CSSMediaRule;
262 package Message::IF::CSSFontFaceRule;
263 package Message::IF::CSSPageRule;
264
265 1;
266 ## $Date: 2008/01/14 03:55:23 $

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24