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

Diff of /markup/html/whatpm/Whatpm/CSS/Cascade.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.6 by wakaba, Tue Jan 1 15:56:24 2008 UTC revision 1.11 by wakaba, Mon Jan 14 11:21:22 2008 UTC
# Line 10  use Scalar::Util qw/refaddr/; Line 10  use Scalar::Util qw/refaddr/;
10  sub new ($$) {  sub new ($$) {
11    my $self = bless {style_sheets => []}, shift;    my $self = bless {style_sheets => []}, shift;
12    $self->{document} = shift;    $self->{document} = shift;
13    
14      ## Device dependent font size parameters
15      my @scale = (3/5, 3/4, 8/9, 1, 6/5, 3/2, 2/1, 3/1); ## From css3-fonts
16      $self->{font_size}->[$_] = 16 * $scale[$_] for 0..$#scale;
17      ## TODO: Provide better default
18      $self->{get_smaller_font_size} = sub ($$) {
19        #my ($self, $original_px) = @_;
20        return $_[1] / 1.1;
21      };
22      ## TODO: Provide better default
23      $self->{get_larger_font_size} = sub ($$) {
24        #my ($self, $original_px) = @_;
25        return $_[1] * 1.1;
26      };
27      ## $self->{has_invert}: Should be same as
28      ##     $parser->{prop_value}->{'outline-color'}->{invert}.
29    
30    return $self;    return $self;
31  } # new  } # new
32    
# Line 58  sub ___associate_rules ($) { Line 75  sub ___associate_rules ($) {
75                  ($selector);                  ($selector);
76          for (@{$selectors_to_elements->{$selector_str}}) {          for (@{$selectors_to_elements->{$selector_str}}) {
77            my $current_specificity = $elements_to_specificity->{refaddr $_};            my $current_specificity = $elements_to_specificity->{refaddr $_};
78            if ($selector_specificity->[0] > $current_specificity->[0] or            if (not defined $current_specificity or ## "*"-only case.
79                  $selector_specificity->[0] > $current_specificity->[0] or
80                $selector_specificity->[1] > $current_specificity->[1] or                $selector_specificity->[1] > $current_specificity->[1] or
81                $selector_specificity->[2] > $current_specificity->[2] or                $selector_specificity->[2] > $current_specificity->[2] or
82                $selector_specificity->[3] > $current_specificity->[3]) {                $selector_specificity->[3] > $current_specificity->[3]) {
# Line 96  sub get_cascaded_value ($$$) { Line 114  sub get_cascaded_value ($$$) {
114    my $value;    my $value;
115    for my $sds (reverse @{$self->{element_to_sds}->{refaddr $element} or []}) {    for my $sds (reverse @{$self->{element_to_sds}->{refaddr $element} or []}) {
116      my $vp = ${$sds->[0]}->{$key};      my $vp = ${$sds->[0]}->{$key};
117      if (defined $vp->[1] and $vp->[1] eq 'important') {      if ($vp->[1] eq 'important') {
118        return $vp->[0];        return $vp->[0];
119      } else {      } else {
120        $value = $vp->[0] unless defined $value;        $value = $vp->[0] unless defined $value;
# Line 112  sub get_specified_value ($$$) { Line 130  sub get_specified_value ($$$) {
130    ## TODO: Remove {specified_value} caching, once we implement most    ## TODO: Remove {specified_value} caching, once we implement most
131    ## of CSS 2.1 properties and confirm that it makes almost non sence    ## of CSS 2.1 properties and confirm that it makes almost non sence
132    ## because of its duplication with {computed_value} caching.    ## because of its duplication with {computed_value} caching.
133      
134      ## NOTE: |top| computation refers |bottom| and vice versa.
135      ## |left| does |right| and vice versa.
136    
137    my $eid = refaddr $element;    my $eid = refaddr $element;
138    unless (exists $self->{specified_value}->{$eid}->{$prop_name}) {    unless (exists $self->{specified_value}->{$eid}->{$prop_name}) {
139      my $cascaded = $self->get_cascaded_value ($element, $prop_name);      my $cascaded = $self->get_cascaded_value ($element, $prop_name);
# Line 145  sub get_specified_value ($$$) { Line 166  sub get_specified_value ($$$) {
166    return $self->{specified_value}->{$eid}->{$prop_name};    return $self->{specified_value}->{$eid}->{$prop_name};
167  } # get_specified_value  } # get_specified_value
168    
169    sub get_specified_value_no_inherit ($$$) {
170      my ($self, $element, $prop_name) = @_;
171    
172      my $specified = $self->get_specified_value ($element, $prop_name);
173      if (defined $specified and $specified->[0] eq 'INHERIT') {
174        ## ISSUE: CSS 2.1 does not say to resolve computed value of the parent.
175        ## However, it is necessary for some cases (see
176        ## <http://suika.fam.cx/gate/2005/sw/inherit>).  In addition,
177        ## the initial value is not a computed value for some properties.
178        my $parent_element = $element->manakai_parent_element;
179        if (defined $parent_element) {
180          $specified = $self->get_computed_value ($parent_element, $prop_name);
181        } else {
182          my $prop_def = $Whatpm::CSS::Parser::Prop->{$prop_name};
183          $specified = $prop_def->{initial};
184        }
185        ## NOTE: Because of this handling, {compute} codes must be
186        ## idempotent.
187      }
188      return $specified;
189    } # get_specified_value_no_inherit
190    
191  sub get_computed_value ($$$) {  sub get_computed_value ($$$) {
192    my ($self, $element, $prop_name) = @_;    my ($self, $element, $prop_name) = @_;
193    
# Line 152  sub get_computed_value ($$$) { Line 195  sub get_computed_value ($$$) {
195    unless (exists $self->{computed_value}->{$eid}->{$prop_name}) {    unless (exists $self->{computed_value}->{$eid}->{$prop_name}) {
196      my $prop_def = $Whatpm::CSS::Parser::Prop->{$prop_name};      my $prop_def = $Whatpm::CSS::Parser::Prop->{$prop_name};
197      if (defined $prop_def) {      if (defined $prop_def) {
198        my $specified = $self->get_specified_value ($element, $prop_name);        if ($prop_def->{compute_multiple}) {
199        if (defined $specified and $specified->[0] eq 'INHERIT') {          $prop_def->{compute_multiple}->($self, $element, $eid, $prop_name);
200          ## ISSUE: CSS 2.1 does not say to resolve computed value of the parent.        } else {
201          ## However, it is necessary for some cases (see          my $specified = $self->get_specified_value_no_inherit
202          ## <http://suika.fam.cx/gate/2005/sw/inherit>).  In addition,              ($element, $prop_name);
203          ## the initial value is not a computed value for some properties.          $self->{computed_value}->{$eid}->{$prop_name}
204          my $parent_element = $element->manakai_parent_element;              = $prop_def->{compute}->($self, $element, $prop_name, $specified);
         if (defined $parent_element) {  
           $specified = $self->get_computed_value ($parent_element, $prop_name);  
         } else {  
           $specified = $prop_def->{compute}->($self, $element, $prop_name,  
                                               $prop_def->{initial});  
         }  
         ## NOTE: Because of this handling, {compute} codes must be  
         ## idempotent.  
205        }        }
         
       $self->{computed_value}->{$eid}->{$prop_name}  
           = $prop_def->{compute}->($self, $element, $prop_name, $specified);  
206      } else {      } else {
207        $self->{computed_value}->{$eid}->{$prop_name} = undef;        $self->{computed_value}->{$eid}->{$prop_name} = undef;
208      }      }

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.11

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24