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

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

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

revision 1.68 by wakaba, Mon Feb 11 09:53:37 2008 UTC revision 1.69 by wakaba, Sat Aug 16 07:35:23 2008 UTC
# Line 5  require Whatpm::CSS::SelectorsParser; Line 5  require Whatpm::CSS::SelectorsParser;
5  require Whatpm::CSS::MediaQueryParser;  require Whatpm::CSS::MediaQueryParser;
6    
7  sub new ($) {  sub new ($) {
8    my $self = bless {must_level => 'm',    my $self = bless {
9                      message_level => 'w',      level => {
10                      unsupported_level => 'u',        must => 'm',
11                      lookup_namespace_uri => sub { undef }}, shift;        uncertain => 'u',
12        },
13        lookup_namespace_uri => sub { undef },
14      }, shift;
15    # $self->{base_uri}    # $self->{base_uri}
16    # $self->{unitless_px} = 1/0    # $self->{unitless_px} = 1/0
17    # $self->{hashless_rgb} = 1/0    # $self->{hashless_rgb} = 1/0
# Line 107  sub parse_char_string ($$) { Line 110  sub parse_char_string ($$) {
110    
111    my $sp = Whatpm::CSS::SelectorsParser->new;    my $sp = Whatpm::CSS::SelectorsParser->new;
112    $sp->{onerror} = $self->{onerror};    $sp->{onerror} = $self->{onerror};
113      $sp->{level} = $self->{level};
114    $sp->{must_level} = $self->{must_level};    $sp->{must_level} = $self->{must_level};
115    $sp->{pseudo_element} = $self->{pseudo_element};    $sp->{pseudo_element} = $self->{pseudo_element};
116    $sp->{pseudo_class} = $self->{pseudo_class};    $sp->{pseudo_class} = $self->{pseudo_class};
117    
118    my $mp = Whatpm::CSS::MediaQueryParser->new;    my $mp = Whatpm::CSS::MediaQueryParser->new;
119    $mp->{onerror} = $self->{onerror};    $mp->{onerror} = $self->{onerror};
120      $mp->{level} = $self->{level};
121    $mp->{must_level} = $self->{must_level};    $mp->{must_level} = $self->{must_level};
122    $mp->{unsupported_level} = $self->{unsupported_level};    $mp->{unsupported_level} = $self->{unsupported_level};
123    
# Line 212  sub parse_char_string ($$) { Line 217  sub parse_char_string ($$) {
217                  undef $charset_allowed;                  undef $charset_allowed;
218                  undef $import_allowed;                  undef $import_allowed;
219                } else {                } else {
220                  $onerror->(type => 'at-rule not allowed:namespace',                  $onerror->(type => 'at-rule not allowed',
221                             level => $self->{must_level},                             text => 'namespace',
222                               level => $self->{level}->{must},
223                             uri => \$self->{href},                             uri => \$self->{href},
224                             token => $t);                             token => $t);
225                }                }
# Line 228  sub parse_char_string ($$) { Line 234  sub parse_char_string ($$) {
234              #              #
235            }            }
236    
237            $onerror->(type => 'at-rule syntax error:namespace',            $onerror->(type => 'at-rule syntax error',
238                       level => $self->{must_level},                       text => 'namespace',
239                         level => $self->{level}->{must},
240                       uri => \$self->{href},                       uri => \$self->{href},
241                       token => $t);                       token => $t);
242            #            #
# Line 280  sub parse_char_string ($$) { Line 287  sub parse_char_string ($$) {
287                }                }
288              }              }
289    
290              $onerror->(type => 'at-rule syntax error:import',              $onerror->(type => 'at-rule syntax error',
291                         level => $self->{must_level},                         text => 'import',
292                           level => $self->{level}->{must},
293                         uri => \$self->{href},                         uri => \$self->{href},
294                         token => $t)                         token => $t)
295                  if defined $mq; ## NOTE: Otherwise, already raised in MQ parser                  if defined $mq; ## NOTE: Otherwise, already raised in MQ parser
296                            
297              #              #
298            } else {            } else {
299              $onerror->(type => 'at-rule not allowed:import',              $onerror->(type => 'at-rule not allowed',
300                         level => $self->{must_level},                         text => 'import',
301                           level => $self->{level}->{must},
302                         uri => \$self->{href},                         uri => \$self->{href},
303                         token => $t);                         token => $t);
304                            
# Line 317  sub parse_char_string ($$) { Line 326  sub parse_char_string ($$) {
326                  ## Stay in the state.                  ## Stay in the state.
327                  redo S;                  redo S;
328                } else {                } else {
329                  $onerror->(type => 'at-rule syntax error:media',                  $onerror->(type => 'at-rule syntax error',
330                             level => $self->{must_level},                             text => 'media',
331                               level => $self->{level}->{must},
332                             uri => \$self->{href},                             uri => \$self->{href},
333                             token => $t);                             token => $t);
334                }                }
# Line 328  sub parse_char_string ($$) { Line 338  sub parse_char_string ($$) {
338                            
339              #              #
340            } else { ## Nested @media rule            } else { ## Nested @media rule
341              $onerror->(type => 'at-rule not allowed:media',              $onerror->(type => 'at-rule not allowed',
342                         level => $self->{must_level},                         text => 'media',
343                           level => $self->{level}->{must},
344                         uri => \$self->{href},                         uri => \$self->{href},
345                         token => $t);                         token => $t);
346                            
# Line 363  sub parse_char_string ($$) { Line 374  sub parse_char_string ($$) {
374                #                #
375              }              }
376                            
377              $onerror->(type => 'at-rule syntax error:charset',              $onerror->(type => 'at-rule syntax error',
378                         level => $self->{must_level},                         text => 'charset',
379                           level => $self->{level}->{must},
380                         uri => \$self->{href},                         uri => \$self->{href},
381                         token => $t);                         token => $t);
382              #              #
383            } else {            } else {
384              $onerror->(type => 'at-rule not allowed:charset',              $onerror->(type => 'at-rule not allowed',
385                         level => $self->{must_level},                         text => 'charset',
386                           level => $self->{level}->{must},
387                         uri => \$self->{href},                         uri => \$self->{href},
388                         token => $t);                         token => $t);
389              #              #
390            }            }
391          } else {          } else {
392            $onerror->(type => 'at-rule not supported',            $onerror->(type => 'unknown at-rule',
393                       level => $self->{unsupported_level},                       level => $self->{level}->{uncertain},
394                       uri => \$self->{href},                       uri => \$self->{href},
395                       token => $t,                       token => $t,
396                       value => $t->{value});                       value => $t->{value});
# Line 397  sub parse_char_string ($$) { Line 410  sub parse_char_string ($$) {
410        } elsif ($t->{type} == EOF_TOKEN) {        } elsif ($t->{type} == EOF_TOKEN) {
411          if (@$open_rules > 1) {          if (@$open_rules > 1) {
412            $onerror->(type => 'block not closed',            $onerror->(type => 'block not closed',
413                       level => $self->{must_level},                       level => $self->{level}->{must},
414                       uri => \$self->{href},                       uri => \$self->{href},
415                       token => $t);                       token => $t);
416          }          }
# Line 425  sub parse_char_string ($$) { Line 438  sub parse_char_string ($$) {
438            redo S;            redo S;
439          } else {          } else {
440            $onerror->(type => 'no declaration block',            $onerror->(type => 'no declaration block',
441                       level => $self->{must_level},                       level => $self->{level}->{must},
442                       uri => \$self->{href},                       uri => \$self->{href},
443                       token => $t);                       token => $t);
444    
# Line 472  sub parse_char_string ($$) { Line 485  sub parse_char_string ($$) {
485                    #                    #
486                  } else {                  } else {
487                    $onerror->(type => 'priority syntax error',                    $onerror->(type => 'priority syntax error',
488                               level => $self->{must_level},                               level => $self->{level}->{must},
489                               uri => \$self->{href},                               uri => \$self->{href},
490                               token => $t);                               token => $t);
491                                        
# Line 491  sub parse_char_string ($$) { Line 504  sub parse_char_string ($$) {
504                redo S;                redo S;
505              }              }
506            } else {            } else {
507              $onerror->(type => 'property not supported',              $onerror->(type => 'unknown property',
508                         level => $self->{unsupported_level},                         level => $self->{level}->{uncertain},
509                         token => $prop_name_t, value => $prop_name,                         token => $prop_name_t, value => $prop_name,
510                         uri => \$self->{href});                         uri => \$self->{href});
511    
# Line 502  sub parse_char_string ($$) { Line 515  sub parse_char_string ($$) {
515            }            }
516          } else {          } else {
517            $onerror->(type => 'no property colon',            $onerror->(type => 'no property colon',
518                       level => $self->{must_level},                       level => $self->{level}->{must},
519                       uri => \$self->{href},                       uri => \$self->{href},
520                       token => $t);                       token => $t);
521    
# Line 522  sub parse_char_string ($$) { Line 535  sub parse_char_string ($$) {
535          #redo S;          #redo S;
536        } elsif ($t->{type} == EOF_TOKEN) {        } elsif ($t->{type} == EOF_TOKEN) {
537          $onerror->(type => 'block not closed',          $onerror->(type => 'block not closed',
538                     level => $self->{must_level},                     level => $self->{level}->{must},
539                     uri => \$self->{href},                     uri => \$self->{href},
540                     token => $t);                     token => $t);
541          ## Reprocess.          ## Reprocess.
# Line 531  sub parse_char_string ($$) { Line 544  sub parse_char_string ($$) {
544        } else {        } else {
545          if ($prop_value) {          if ($prop_value) {
546            $onerror->(type => 'no property semicolon',            $onerror->(type => 'no property semicolon',
547                       level => $self->{must_level},                       level => $self->{level}->{must},
548                       uri => \$self->{href},                       uri => \$self->{href},
549                       token => $t);                       token => $t);
550          } else {          } else {
551            $onerror->(type => 'no property name',            $onerror->(type => 'no property name',
552                       level => $self->{must_level},                       level => $self->{level}->{must},
553                       uri => \$self->{href},                       uri => \$self->{href},
554                       token => $t);                       token => $t);
555          }          }
# Line 1068  my $parse_color = sub { Line 1081  my $parse_color = sub {
1081      }      }
1082    }    }
1083        
1084    $onerror->(type => 'syntax error:color',    $onerror->(type => 'CSS syntax error', text => 'color',
1085               level => $self->{must_level},               level => $self->{level}->{must},
1086               uri => \$self->{href},               uri => \$self->{href},
1087               token => $t);               token => $t);
1088        
# Line 1438  my $one_keyword_parser = sub { Line 1451  my $one_keyword_parser = sub {
1451      }      }
1452    }    }
1453        
1454    $onerror->(type => "syntax error:'".$prop_name."'",    $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
1455               level => $self->{must_level},               level => $self->{level}->{must},
1456               uri => \$self->{href},               uri => \$self->{href},
1457               token => $t);               token => $t);
1458    return ($t, undef);    return ($t, undef);
# Line 2010  $Prop->{'z-index'} = { Line 2023  $Prop->{'z-index'} = {
2023        }        }
2024      }      }
2025            
2026      $onerror->(type => "syntax error:'$prop_name'",      $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
2027                 level => $self->{must_level},                 level => $self->{level}->{must},
2028                 uri => \$self->{href},                 uri => \$self->{href},
2029                 token => $t);                 token => $t);
2030      return ($t, undef);      return ($t, undef);
# Line 2056  $Prop->{'font-size-adjust'} = { Line 2069  $Prop->{'font-size-adjust'} = {
2069        }        }
2070      }      }
2071            
2072      $onerror->(type => "syntax error:'$prop_name'",      $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
2073                 level => $self->{must_level},                 level => $self->{level}->{must},
2074                 uri => \$self->{href},                 uri => \$self->{href},
2075                 token => $t);                 token => $t);
2076      return ($t, undef);      return ($t, undef);
# Line 2102  $Prop->{orphans} = { Line 2115  $Prop->{orphans} = {
2115        }        }
2116      }      }
2117            
2118      $onerror->(type => "syntax error:'$prop_name'",      $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
2119                 level => $self->{must_level},                 level => $self->{level}->{must},
2120                 uri => \$self->{href},                 uri => \$self->{href},
2121                 token => $t);                 token => $t);
2122      return ($t, undef);      return ($t, undef);
# Line 2159  $Prop->{opacity} = { Line 2172  $Prop->{opacity} = {
2172        }        }
2173      }      }
2174            
2175      $onerror->(type => "syntax error:'$prop_name'",      $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
2176                 level => $self->{must_level},                 level => $self->{level}->{must},
2177                 uri => \$self->{href},                 uri => \$self->{href},
2178                 token => $t);                 token => $t);
2179      return ($t, undef);      return ($t, undef);
# Line 2249  my $length_percentage_keyword_parser = s Line 2262  my $length_percentage_keyword_parser = s
2262        ## for the support of 'border-top' property (and similar ones).        ## for the support of 'border-top' property (and similar ones).
2263      }      }
2264            
2265      $onerror->(type => "syntax error:'$prop_name'",      $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
2266                 level => $self->{must_level},                 level => $self->{level}->{must},
2267                 uri => \$self->{href},                 uri => \$self->{href},
2268                 token => $t);                 token => $t);
2269      return ($t, undef);      return ($t, undef);
# Line 2296  my $length_keyword_parser = sub { Line 2309  my $length_keyword_parser = sub {
2309        }        }
2310      }      }
2311            
2312      $onerror->(type => "syntax error:'$prop_name'",      $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
2313                 level => $self->{must_level},                 level => $self->{level}->{must},
2314                 uri => \$self->{href},                 uri => \$self->{href},
2315                 token => $t);                 token => $t);
2316      return ($t, undef);      return ($t, undef);
# Line 2965  $Prop->{'line-height'} = { Line 2978  $Prop->{'line-height'} = {
2978        }        }
2979      }      }
2980            
2981      $onerror->(type => "syntax error:'$prop_name'",      $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
2982                 level => $self->{must_level},                 level => $self->{level}->{must},
2983                 uri => \$self->{href},                 uri => \$self->{href},
2984                 token => $t);                 token => $t);
2985      return ($t, undef);      return ($t, undef);
# Line 3309  $Prop->{'font-weight'} = { Line 3322  $Prop->{'font-weight'} = {
3322        }        }
3323      }      }
3324            
3325      $onerror->(type => "syntax error:'$prop_name'",      $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
3326                 level => $self->{must_level},                 level => $self->{level}->{must},
3327                 uri => \$self->{href},                 uri => \$self->{href},
3328                 token => $t);                 token => $t);
3329      return ($t, undef);      return ($t, undef);
# Line 3377  my $uri_or_none_parser = sub { Line 3390  my $uri_or_none_parser = sub {
3390      #  $t = $tt->get_next_token;      #  $t = $tt->get_next_token;
3391      #  if ($t->{type} == EOF_TOKEN) {      #  if ($t->{type} == EOF_TOKEN) {
3392      #    $onerror->(type => 'uri not closed',      #    $onerror->(type => 'uri not closed',
3393      #               level => $self->{must_level},      #               level => $self->{level}->{must},
3394      #               uri => \$self->{href},      #               uri => \$self->{href},
3395      #               token => $t);      #               token => $t);
3396      #          #    
# Line 3385  my $uri_or_none_parser = sub { Line 3398  my $uri_or_none_parser = sub {
3398      #  }      #  }
3399      }      }
3400            
3401      $onerror->(type => "syntax error:'$prop_name'",      $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
3402                 level => $self->{must_level},                 level => $self->{level}->{must},
3403                 uri => \$self->{href},                 uri => \$self->{href},
3404                 token => $t);                 token => $t);
3405      return ($t, undef);      return ($t, undef);
# Line 3732  $Prop->{'font-family'} = { Line 3745  $Prop->{'font-family'} = {
3745          } elsif (not $may_be_generic or length $font_name) {          } elsif (not $may_be_generic or length $font_name) {
3746            push @prop_value, ['STRING', $font_name];            push @prop_value, ['STRING', $font_name];
3747          } else {          } else {
3748            $onerror->(type => "syntax error:'$prop_name'",            $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
3749                       level => $self->{must_level},                       level => $self->{level}->{must},
3750                       uri => \$self->{href},                       uri => \$self->{href},
3751                       token => $t);                       token => $t);
3752            return ($t, undef);            return ($t, undef);
# Line 3782  $Prop->{cursor} = { Line 3795  $Prop->{cursor} = {
3795          } elsif ($v eq 'inherit' and @prop_value == 1) {          } elsif ($v eq 'inherit' and @prop_value == 1) {
3796            return ($t, {$prop_name => ['INHERIT']});            return ($t, {$prop_name => ['INHERIT']});
3797          } else {          } else {
3798            $onerror->(type => "syntax error:'$prop_name'",            $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
3799                       level => $self->{must_level},                       level => $self->{level}->{must},
3800                       uri => \$self->{href},                       uri => \$self->{href},
3801                       token => $t);                       token => $t);
3802            return ($t, undef);            return ($t, undef);
# Line 3792  $Prop->{cursor} = { Line 3805  $Prop->{cursor} = {
3805          push @prop_value, ['URI', $t->{value}, \($self->{base_uri})];          push @prop_value, ['URI', $t->{value}, \($self->{base_uri})];
3806          $t = $tt->get_next_token;          $t = $tt->get_next_token;
3807        } else {        } else {
3808          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
3809                     level => $self->{must_level},                     level => $self->{level}->{must},
3810                     uri => \$self->{href},                     uri => \$self->{href},
3811                     token => $t);                     token => $t);
3812          return ($t, undef);          return ($t, undef);
# Line 3868  $Prop->{'border-style'} = { Line 3881  $Prop->{'border-style'} = {
3881          $prop_value{'border-left-style'} = $prop_value{'border-right-style'};          $prop_value{'border-left-style'} = $prop_value{'border-right-style'};
3882          return ($t, \%prop_value);          return ($t, \%prop_value);
3883        } else {        } else {
3884          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
3885                     level => $self->{must_level},                     level => $self->{level}->{must},
3886                     uri => \$self->{href},                     uri => \$self->{href},
3887                     token => $t);                     token => $t);
3888          return ($t, undef);          return ($t, undef);
# Line 3878  $Prop->{'border-style'} = { Line 3891  $Prop->{'border-style'} = {
3891        $prop_value{'border-bottom-style'} = $prop_value{'border-top-style'};        $prop_value{'border-bottom-style'} = $prop_value{'border-top-style'};
3892        $prop_value{'border-left-style'} = $prop_value{'border-right-style'};        $prop_value{'border-left-style'} = $prop_value{'border-right-style'};
3893      } else {      } else {
3894        $onerror->(type => "syntax error:'$prop_name'",        $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
3895                   level => $self->{must_level},                   level => $self->{level}->{must},
3896                   uri => \$self->{href},                   uri => \$self->{href},
3897                   token => $t);                   token => $t);
3898        return ($t, undef);        return ($t, undef);
# Line 3893  $Prop->{'border-style'} = { Line 3906  $Prop->{'border-style'} = {
3906            $self->{prop_value}->{'border-right-style'}->{$prop_value}) {            $self->{prop_value}->{'border-right-style'}->{$prop_value}) {
3907          $prop_value{'border-right-style'} = ["KEYWORD", $prop_value];          $prop_value{'border-right-style'} = ["KEYWORD", $prop_value];
3908        } else {        } else {
3909          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
3910                     level => $self->{must_level},                     level => $self->{level}->{must},
3911                     uri => \$self->{href},                     uri => \$self->{href},
3912                     token => $t);                     token => $t);
3913          return ($t, undef);          return ($t, undef);
# Line 3909  $Prop->{'border-style'} = { Line 3922  $Prop->{'border-style'} = {
3922              $self->{prop_value}->{'border-bottom-style'}->{$prop_value}) {              $self->{prop_value}->{'border-bottom-style'}->{$prop_value}) {
3923            $prop_value{'border-bottom-style'} = ["KEYWORD", $prop_value];            $prop_value{'border-bottom-style'} = ["KEYWORD", $prop_value];
3924          } else {          } else {
3925            $onerror->(type => "syntax error:'$prop_name'",            $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
3926                       level => $self->{must_level},                       level => $self->{level}->{must},
3927                       uri => \$self->{href},                       uri => \$self->{href},
3928                       token => $t);                       token => $t);
3929            return ($t, undef);            return ($t, undef);
# Line 3924  $Prop->{'border-style'} = { Line 3937  $Prop->{'border-style'} = {
3937                $self->{prop_value}->{'border-left-style'}->{$prop_value}) {                $self->{prop_value}->{'border-left-style'}->{$prop_value}) {
3938              $prop_value{'border-left-style'} = ["KEYWORD", $prop_value];              $prop_value{'border-left-style'} = ["KEYWORD", $prop_value];
3939            } else {            } else {
3940              $onerror->(type => "syntax error:'$prop_name'",              $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
3941                         level => $self->{must_level},                         level => $self->{level}->{must},
3942                         uri => \$self->{href},                         uri => \$self->{href},
3943                         token => $t);                         token => $t);
3944              return ($t, undef);              return ($t, undef);
# Line 4001  $Prop->{'border-color'} = { Line 4014  $Prop->{'border-color'} = {
4014        if (not defined $pv) {        if (not defined $pv) {
4015          return ($t, undef);          return ($t, undef);
4016        } elsif ($pv->{'border-color'}->[0] eq 'INHERIT') {        } elsif ($pv->{'border-color'}->[0] eq 'INHERIT') {
4017          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4018                     level => $self->{must_level},                     level => $self->{level}->{must},
4019                     uri => \$self->{href},                     uri => \$self->{href},
4020                     token => $t);                     token => $t);
4021          return ($t, undef);          return ($t, undef);
# Line 4020  $Prop->{'border-color'} = { Line 4033  $Prop->{'border-color'} = {
4033          if (not defined $pv) {          if (not defined $pv) {
4034            return ($t, undef);            return ($t, undef);
4035          } elsif ($pv->{'border-color'}->[0] eq 'INHERIT') {          } elsif ($pv->{'border-color'}->[0] eq 'INHERIT') {
4036            $onerror->(type => "syntax error:'$prop_name'",            $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4037                       level => $self->{must_level},                       level => $self->{level}->{must},
4038                       uri => \$self->{href},                       uri => \$self->{href},
4039                       token => $t);                       token => $t);
4040            return ($t, undef);            return ($t, undef);
# Line 4038  $Prop->{'border-color'} = { Line 4051  $Prop->{'border-color'} = {
4051            if (not defined $pv) {            if (not defined $pv) {
4052              return ($t, undef);              return ($t, undef);
4053            } elsif ($pv->{'border-color'}->[0] eq 'INHERIT') {            } elsif ($pv->{'border-color'}->[0] eq 'INHERIT') {
4054              $onerror->(type => "syntax error:'$prop_name'",              $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4055                         level => $self->{must_level},                         level => $self->{level}->{must},
4056                         uri => \$self->{href},                         uri => \$self->{href},
4057                         token => $t);                         token => $t);
4058              return ($t, undef);              return ($t, undef);
# Line 4120  $Prop->{'border-top'} = { Line 4133  $Prop->{'border-top'} = {
4133          if (defined $pv) {          if (defined $pv) {
4134            $prop_value{$prop_name.'-style'} = $pv->{$prop_name.'-style'};            $prop_value{$prop_name.'-style'} = $pv->{$prop_name.'-style'};
4135          } else {          } else {
4136            $onerror->(type => "syntax error:'$prop_name'",            $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4137                       level => $self->{must_level},                       level => $self->{level}->{must},
4138                       uri => \$self->{href},                       uri => \$self->{href},
4139                       token => $t);                       token => $t);
4140            return ($t, undef);            return ($t, undef);
# Line 4157  $Prop->{'border-top'} = { Line 4170  $Prop->{'border-top'} = {
4170                }->{$t->{type}};                }->{$t->{type}};
4171        if (defined $pv) {        if (defined $pv) {
4172          if ($pv->{$prop_name.'-color'}->[0] eq 'INHERIT') {          if ($pv->{$prop_name.'-color'}->[0] eq 'INHERIT') {
4173            $onerror->(type => "syntax error:'$prop_name'",            $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4174                       level => $self->{must_level},                       level => $self->{level}->{must},
4175                       uri => \$self->{href},                       uri => \$self->{href},
4176                       token => $t);                       token => $t);
4177          } else {          } else {
# Line 4178  $Prop->{'border-top'} = { Line 4191  $Prop->{'border-top'} = {
4191                  }->{$t->{type}};                  }->{$t->{type}};
4192          if (defined $pv) {          if (defined $pv) {
4193            if ($pv->{$prop_name.'-width'}->[0] eq 'INHERIT') {            if ($pv->{$prop_name.'-width'}->[0] eq 'INHERIT') {
4194              $onerror->(type => "syntax error:'$prop_name'",              $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4195                         level => $self->{must_level},                         level => $self->{level}->{must},
4196                         uri => \$self->{href},                         uri => \$self->{href},
4197                         token => $t);                         token => $t);
4198            } else {            } else {
# Line 4388  $Prop->{margin} = { Line 4401  $Prop->{margin} = {
4401        if ($length_unit->{$unit}) {        if ($length_unit->{$unit}) {
4402          $prop_value{'margin-top'} = ['DIMENSION', $value, $unit];          $prop_value{'margin-top'} = ['DIMENSION', $value, $unit];
4403        } else {        } else {
4404          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4405                     level => $self->{must_level},                     level => $self->{level}->{must},
4406                     uri => \$self->{href},                     uri => \$self->{href},
4407                     token => $t);                     token => $t);
4408          return ($t, undef);          return ($t, undef);
# Line 4415  $Prop->{margin} = { Line 4428  $Prop->{margin} = {
4428          $prop_value{'margin-left'} = $prop_value{'margin-right'};          $prop_value{'margin-left'} = $prop_value{'margin-right'};
4429          return ($t, \%prop_value);          return ($t, \%prop_value);
4430        } else {        } else {
4431          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4432                     level => $self->{must_level},                     level => $self->{level}->{must},
4433                     uri => \$self->{href},                     uri => \$self->{href},
4434                     token => $t);                     token => $t);
4435          return ($t, undef);          return ($t, undef);
4436        }        }
4437      } else {      } else {
4438        $onerror->(type => "syntax error:'$prop_name'",        $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4439                   level => $self->{must_level},                   level => $self->{level}->{must},
4440                   uri => \$self->{href},                   uri => \$self->{href},
4441                   token => $t);                   token => $t);
4442        return ($t, undef);        return ($t, undef);
# Line 4451  $Prop->{margin} = { Line 4464  $Prop->{margin} = {
4464        if ($length_unit->{$unit}) {        if ($length_unit->{$unit}) {
4465          $prop_value{'margin-right'} = ['DIMENSION', $value, $unit];          $prop_value{'margin-right'} = ['DIMENSION', $value, $unit];
4466        } else {        } else {
4467          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4468                     level => $self->{must_level},                     level => $self->{level}->{must},
4469                     uri => \$self->{href},                     uri => \$self->{href},
4470                     token => $t);                     token => $t);
4471          return ($t, undef);          return ($t, undef);
# Line 4472  $Prop->{margin} = { Line 4485  $Prop->{margin} = {
4485        if ($prop_value eq 'auto') {        if ($prop_value eq 'auto') {
4486          $prop_value{'margin-right'} = ['KEYWORD', $prop_value];          $prop_value{'margin-right'} = ['KEYWORD', $prop_value];
4487        } else {        } else {
4488          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4489                     level => $self->{must_level},                     level => $self->{level}->{must},
4490                     uri => \$self->{href},                     uri => \$self->{href},
4491                     token => $t);                     token => $t);
4492          return ($t, undef);          return ($t, undef);
4493        }        }
4494      } else {      } else {
4495        if ($has_sign) {        if ($has_sign) {
4496          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4497                     level => $self->{must_level},                     level => $self->{level}->{must},
4498                     uri => \$self->{href},                     uri => \$self->{href},
4499                     token => $t);                     token => $t);
4500          return ($t, undef);          return ($t, undef);
# Line 4509  $Prop->{margin} = { Line 4522  $Prop->{margin} = {
4522        if ($length_unit->{$unit}) {        if ($length_unit->{$unit}) {
4523          $prop_value{'margin-bottom'} = ['DIMENSION', $value, $unit];          $prop_value{'margin-bottom'} = ['DIMENSION', $value, $unit];
4524        } else {        } else {
4525          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4526                     level => $self->{must_level},                     level => $self->{level}->{must},
4527                     uri => \$self->{href},                     uri => \$self->{href},
4528                     token => $t);                     token => $t);
4529          return ($t, undef);          return ($t, undef);
# Line 4530  $Prop->{margin} = { Line 4543  $Prop->{margin} = {
4543        if ($prop_value eq 'auto') {        if ($prop_value eq 'auto') {
4544          $prop_value{'margin-bottom'} = ['KEYWORD', $prop_value];          $prop_value{'margin-bottom'} = ['KEYWORD', $prop_value];
4545        } else {        } else {
4546          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4547                     level => $self->{must_level},                     level => $self->{level}->{must},
4548                     uri => \$self->{href},                     uri => \$self->{href},
4549                     token => $t);                     token => $t);
4550          return ($t, undef);          return ($t, undef);
4551        }        }
4552      } else {      } else {
4553        if ($has_sign) {        if ($has_sign) {
4554          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4555                     level => $self->{must_level},                     level => $self->{level}->{must},
4556                     uri => \$self->{href},                     uri => \$self->{href},
4557                     token => $t);                     token => $t);
4558          return ($t, undef);          return ($t, undef);
# Line 4566  $Prop->{margin} = { Line 4579  $Prop->{margin} = {
4579        if ($length_unit->{$unit}) {        if ($length_unit->{$unit}) {
4580          $prop_value{'margin-left'} = ['DIMENSION', $value, $unit];          $prop_value{'margin-left'} = ['DIMENSION', $value, $unit];
4581        } else {        } else {
4582          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4583                     level => $self->{must_level},                     level => $self->{level}->{must},
4584                     uri => \$self->{href},                     uri => \$self->{href},
4585                     token => $t);                     token => $t);
4586          return ($t, undef);          return ($t, undef);
# Line 4587  $Prop->{margin} = { Line 4600  $Prop->{margin} = {
4600        if ($prop_value eq 'auto') {        if ($prop_value eq 'auto') {
4601          $prop_value{'margin-left'} = ['KEYWORD', $prop_value];          $prop_value{'margin-left'} = ['KEYWORD', $prop_value];
4602        } else {        } else {
4603          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4604                     level => $self->{must_level},                     level => $self->{level}->{must},
4605                     uri => \$self->{href},                     uri => \$self->{href},
4606                     token => $t);                     token => $t);
4607          return ($t, undef);          return ($t, undef);
4608        }        }
4609      } else {      } else {
4610        if ($has_sign) {        if ($has_sign) {
4611          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4612                     level => $self->{must_level},                     level => $self->{level}->{must},
4613                     uri => \$self->{href},                     uri => \$self->{href},
4614                     token => $t);                     token => $t);
4615          return ($t, undef);          return ($t, undef);
# Line 4631  $Prop->{padding} = { Line 4644  $Prop->{padding} = {
4644        if ($length_unit->{$unit} and $value >= 0) {        if ($length_unit->{$unit} and $value >= 0) {
4645          $prop_value{'padding-top'} = ['DIMENSION', $value, $unit];          $prop_value{'padding-top'} = ['DIMENSION', $value, $unit];
4646        } else {        } else {
4647          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4648                     level => $self->{must_level},                     level => $self->{level}->{must},
4649                     uri => \$self->{href},                     uri => \$self->{href},
4650                     token => $t);                     token => $t);
4651          return ($t, undef);          return ($t, undef);
# Line 4642  $Prop->{padding} = { Line 4655  $Prop->{padding} = {
4655        $t = $tt->get_next_token;        $t = $tt->get_next_token;
4656        $prop_value{'padding-top'} = ['PERCENTAGE', $value];        $prop_value{'padding-top'} = ['PERCENTAGE', $value];
4657        unless ($value >= 0) {        unless ($value >= 0) {
4658          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4659                     level => $self->{must_level},                     level => $self->{level}->{must},
4660                     uri => \$self->{href},                     uri => \$self->{href},
4661                     token => $t);                     token => $t);
4662          return ($t, undef);          return ($t, undef);
# Line 4654  $Prop->{padding} = { Line 4667  $Prop->{padding} = {
4667        $t = $tt->get_next_token;        $t = $tt->get_next_token;
4668        $prop_value{'padding-top'} = ['DIMENSION', $value, 'px'];        $prop_value{'padding-top'} = ['DIMENSION', $value, 'px'];
4669        unless ($value >= 0) {        unless ($value >= 0) {
4670          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4671                     level => $self->{must_level},                     level => $self->{level}->{must},
4672                     uri => \$self->{href},                     uri => \$self->{href},
4673                     token => $t);                     token => $t);
4674          return ($t, undef);          return ($t, undef);
# Line 4670  $Prop->{padding} = { Line 4683  $Prop->{padding} = {
4683          $prop_value{'padding-left'} = $prop_value{'padding-right'};          $prop_value{'padding-left'} = $prop_value{'padding-right'};
4684          return ($t, \%prop_value);          return ($t, \%prop_value);
4685        } else {        } else {
4686          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4687                     level => $self->{must_level},                     level => $self->{level}->{must},
4688                     uri => \$self->{href},                     uri => \$self->{href},
4689                     token => $t);                     token => $t);
4690          return ($t, undef);          return ($t, undef);
4691        }        }
4692      } else {      } else {
4693        $onerror->(type => "syntax error:'$prop_name'",        $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4694                   level => $self->{must_level},                   level => $self->{level}->{must},
4695                   uri => \$self->{href},                   uri => \$self->{href},
4696                   token => $t);                   token => $t);
4697        return ($t, undef);        return ($t, undef);
# Line 4701  $Prop->{padding} = { Line 4714  $Prop->{padding} = {
4714        if ($length_unit->{$unit} and $value >= 0) {        if ($length_unit->{$unit} and $value >= 0) {
4715          $prop_value{'padding-right'} = ['DIMENSION', $value, $unit];          $prop_value{'padding-right'} = ['DIMENSION', $value, $unit];
4716        } else {        } else {
4717          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4718                     level => $self->{must_level},                     level => $self->{level}->{must},
4719                     uri => \$self->{href},                     uri => \$self->{href},
4720                     token => $t);                     token => $t);
4721          return ($t, undef);          return ($t, undef);
# Line 4712  $Prop->{padding} = { Line 4725  $Prop->{padding} = {
4725        $t = $tt->get_next_token;        $t = $tt->get_next_token;
4726        $prop_value{'padding-right'} = ['PERCENTAGE', $value];        $prop_value{'padding-right'} = ['PERCENTAGE', $value];
4727        unless ($value >= 0) {        unless ($value >= 0) {
4728          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4729                     level => $self->{must_level},                     level => $self->{level}->{must},
4730                     uri => \$self->{href},                     uri => \$self->{href},
4731                     token => $t);                     token => $t);
4732          return ($t, undef);          return ($t, undef);
# Line 4724  $Prop->{padding} = { Line 4737  $Prop->{padding} = {
4737        $t = $tt->get_next_token;        $t = $tt->get_next_token;
4738        $prop_value{'padding-right'} = ['DIMENSION', $value, 'px'];        $prop_value{'padding-right'} = ['DIMENSION', $value, 'px'];
4739        unless ($value >= 0) {        unless ($value >= 0) {
4740          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4741                     level => $self->{must_level},                     level => $self->{level}->{must},
4742                     uri => \$self->{href},                     uri => \$self->{href},
4743                     token => $t);                     token => $t);
4744          return ($t, undef);          return ($t, undef);
4745        }        }
4746      } else {      } else {
4747        if ($sign < 0) {        if ($sign < 0) {
4748          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4749                     level => $self->{must_level},                     level => $self->{level}->{must},
4750                     uri => \$self->{href},                     uri => \$self->{href},
4751                     token => $t);                     token => $t);
4752          return ($t, undef);          return ($t, undef);
# Line 4756  $Prop->{padding} = { Line 4769  $Prop->{padding} = {
4769        if ($length_unit->{$unit} and $value >= 0) {        if ($length_unit->{$unit} and $value >= 0) {
4770          $prop_value{'padding-bottom'} = ['DIMENSION', $value, $unit];          $prop_value{'padding-bottom'} = ['DIMENSION', $value, $unit];
4771        } else {        } else {
4772          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4773                     level => $self->{must_level},                     level => $self->{level}->{must},
4774                     uri => \$self->{href},                     uri => \$self->{href},
4775                     token => $t);                     token => $t);
4776          return ($t, undef);          return ($t, undef);
# Line 4767  $Prop->{padding} = { Line 4780  $Prop->{padding} = {
4780        $t = $tt->get_next_token;        $t = $tt->get_next_token;
4781        $prop_value{'padding-bottom'} = ['PERCENTAGE', $value];        $prop_value{'padding-bottom'} = ['PERCENTAGE', $value];
4782        unless ($value >= 0) {        unless ($value >= 0) {
4783          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4784                     level => $self->{must_level},                     level => $self->{level}->{must},
4785                     uri => \$self->{href},                     uri => \$self->{href},
4786                     token => $t);                     token => $t);
4787          return ($t, undef);          return ($t, undef);
# Line 4779  $Prop->{padding} = { Line 4792  $Prop->{padding} = {
4792        $t = $tt->get_next_token;        $t = $tt->get_next_token;
4793        $prop_value{'padding-bottom'} = ['DIMENSION', $value, 'px'];        $prop_value{'padding-bottom'} = ['DIMENSION', $value, 'px'];
4794        unless ($value >= 0) {        unless ($value >= 0) {
4795          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4796                     level => $self->{must_level},                     level => $self->{level}->{must},
4797                     uri => \$self->{href},                     uri => \$self->{href},
4798                     token => $t);                     token => $t);
4799          return ($t, undef);          return ($t, undef);
4800        }        }
4801      } else {      } else {
4802        if ($sign < 0) {        if ($sign < 0) {
4803          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4804                     level => $self->{must_level},                     level => $self->{level}->{must},
4805                     uri => \$self->{href},                     uri => \$self->{href},
4806                     token => $t);                     token => $t);
4807          return ($t, undef);          return ($t, undef);
# Line 4810  $Prop->{padding} = { Line 4823  $Prop->{padding} = {
4823        if ($length_unit->{$unit} and $value >= 0) {        if ($length_unit->{$unit} and $value >= 0) {
4824          $prop_value{'padding-left'} = ['DIMENSION', $value, $unit];          $prop_value{'padding-left'} = ['DIMENSION', $value, $unit];
4825        } else {        } else {
4826          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4827                     level => $self->{must_level},                     level => $self->{level}->{must},
4828                     uri => \$self->{href},                     uri => \$self->{href},
4829                     token => $t);                     token => $t);
4830          return ($t, undef);          return ($t, undef);
# Line 4821  $Prop->{padding} = { Line 4834  $Prop->{padding} = {
4834        $t = $tt->get_next_token;        $t = $tt->get_next_token;
4835        $prop_value{'padding-left'} = ['PERCENTAGE', $value];        $prop_value{'padding-left'} = ['PERCENTAGE', $value];
4836        unless ($value >= 0) {        unless ($value >= 0) {
4837          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4838                     level => $self->{must_level},                     level => $self->{level}->{must},
4839                     uri => \$self->{href},                     uri => \$self->{href},
4840                     token => $t);                     token => $t);
4841          return ($t, undef);          return ($t, undef);
# Line 4833  $Prop->{padding} = { Line 4846  $Prop->{padding} = {
4846        $t = $tt->get_next_token;        $t = $tt->get_next_token;
4847        $prop_value{'padding-left'} = ['DIMENSION', $value, 'px'];        $prop_value{'padding-left'} = ['DIMENSION', $value, 'px'];
4848        unless ($value >= 0) {        unless ($value >= 0) {
4849          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4850                     level => $self->{must_level},                     level => $self->{level}->{must},
4851                     uri => \$self->{href},                     uri => \$self->{href},
4852                     token => $t);                     token => $t);
4853          return ($t, undef);          return ($t, undef);
4854        }        }
4855      } else {      } else {
4856        if ($sign < 0) {        if ($sign < 0) {
4857          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4858                     level => $self->{must_level},                     level => $self->{level}->{must},
4859                     uri => \$self->{href},                     uri => \$self->{href},
4860                     token => $t);                     token => $t);
4861          return ($t, undef);          return ($t, undef);
# Line 4881  $Prop->{'border-spacing'} = { Line 4894  $Prop->{'border-spacing'} = {
4894          $t = $tt->get_next_token;          $t = $tt->get_next_token;
4895          $prop_value{'-manakai-border-spacing-x'} = ['DIMENSION', $value, $unit];          $prop_value{'-manakai-border-spacing-x'} = ['DIMENSION', $value, $unit];
4896        } else {        } else {
4897          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4898                     level => $self->{must_level},                     level => $self->{level}->{must},
4899                     uri => \$self->{href},                     uri => \$self->{href},
4900                     token => $t);                     token => $t);
4901          return ($t, undef);          return ($t, undef);
# Line 4894  $Prop->{'border-spacing'} = { Line 4907  $Prop->{'border-spacing'} = {
4907        if ($value >= 0) {        if ($value >= 0) {
4908          $t = $tt->get_next_token;          $t = $tt->get_next_token;
4909        } else {        } else {
4910          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4911                     level => $self->{must_level},                     level => $self->{level}->{must},
4912                     uri => \$self->{href},                     uri => \$self->{href},
4913                     token => $t);                     token => $t);
4914          return ($t, undef);          return ($t, undef);
# Line 4909  $Prop->{'border-spacing'} = { Line 4922  $Prop->{'border-spacing'} = {
4922              = $prop_value{'-manakai-border-spacing-x'};              = $prop_value{'-manakai-border-spacing-x'};
4923          return ($t, \%prop_value);          return ($t, \%prop_value);
4924        } else {        } else {
4925          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4926                     level => $self->{must_level},                     level => $self->{level}->{must},
4927                     uri => \$self->{href},                     uri => \$self->{href},
4928                     token => $t);                     token => $t);
4929          return ($t, undef);          return ($t, undef);
4930        }        }
4931      } else {      } else {
4932        $onerror->(type => "syntax error:'$prop_name'",        $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4933                   level => $self->{must_level},                   level => $self->{level}->{must},
4934                   uri => \$self->{href},                   uri => \$self->{href},
4935                   token => $t);                   token => $t);
4936        return ($t, undef);        return ($t, undef);
# Line 4944  $Prop->{'border-spacing'} = { Line 4957  $Prop->{'border-spacing'} = {
4957          $t = $tt->get_next_token;          $t = $tt->get_next_token;
4958          $prop_value{'-manakai-border-spacing-y'} = ['DIMENSION', $value, $unit];          $prop_value{'-manakai-border-spacing-y'} = ['DIMENSION', $value, $unit];
4959        } else {        } else {
4960          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4961                     level => $self->{must_level},                     level => $self->{level}->{must},
4962                     uri => \$self->{href},                     uri => \$self->{href},
4963                     token => $t);                     token => $t);
4964          return ($t, undef);          return ($t, undef);
# Line 4957  $Prop->{'border-spacing'} = { Line 4970  $Prop->{'border-spacing'} = {
4970        if ($value >= 0) {        if ($value >= 0) {
4971          $t = $tt->get_next_token;          $t = $tt->get_next_token;
4972        } else {        } else {
4973          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4974                     level => $self->{must_level},                     level => $self->{level}->{must},
4975                     uri => \$self->{href},                     uri => \$self->{href},
4976                     token => $t);                     token => $t);
4977          return ($t, undef);          return ($t, undef);
4978        }        }
4979      } else {      } else {
4980        if ($has_sign) {        if ($has_sign) {
4981          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
4982                     level => $self->{must_level},                     level => $self->{level}->{must},
4983                     uri => \$self->{href},                     uri => \$self->{href},
4984                     token => $t);                     token => $t);
4985          return ($t, undef);          return ($t, undef);
# Line 5010  $Prop->{'background-position'} = { Line 5023  $Prop->{'background-position'} = {
5023          $prop_value{'background-position-x'} = ['DIMENSION', $value, $unit];          $prop_value{'background-position-x'} = ['DIMENSION', $value, $unit];
5024          $prop_value{'background-position-y'} = ['PERCENTAGE', 50];          $prop_value{'background-position-y'} = ['PERCENTAGE', 50];
5025        } else {        } else {
5026          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5027                     level => $self->{must_level},                     level => $self->{level}->{must},
5028                     uri => \$self->{href},                     uri => \$self->{href},
5029                     token => $t);                     token => $t);
5030          return ($t, undef);          return ($t, undef);
# Line 5071  $Prop->{'background-position'} = { Line 5084  $Prop->{'background-position'} = {
5084          $prop_value{'background-position-y'} = ['INHERIT'];          $prop_value{'background-position-y'} = ['INHERIT'];
5085          return ($t, \%prop_value);          return ($t, \%prop_value);
5086        } else {        } else {
5087          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5088                     level => $self->{must_level},                     level => $self->{level}->{must},
5089                     uri => \$self->{href},                     uri => \$self->{href},
5090                     token => $t);                     token => $t);
5091          return ($t, undef);          return ($t, undef);
5092        }        }
5093      } else {      } else {
5094        $onerror->(type => "syntax error:'$prop_name'",        $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5095                   level => $self->{must_level},                   level => $self->{level}->{must},
5096                   uri => \$self->{href},                   uri => \$self->{href},
5097                   token => $t);                   token => $t);
5098        return ($t, undef);        return ($t, undef);
# Line 5104  $Prop->{'background-position'} = { Line 5117  $Prop->{'background-position'} = {
5117          $t = $tt->get_next_token;          $t = $tt->get_next_token;
5118          $prop_value{'background-position-y'} = ['DIMENSION', $value, $unit];          $prop_value{'background-position-y'} = ['DIMENSION', $value, $unit];
5119        } else {        } else {
5120          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5121                     level => $self->{must_level},                     level => $self->{level}->{must},
5122                     uri => \$self->{href},                     uri => \$self->{href},
5123                     token => $t);                     token => $t);
5124          return ($t, undef);          return ($t, undef);
# Line 5127  $Prop->{'background-position'} = { Line 5140  $Prop->{'background-position'} = {
5140        }        }
5141      } else {      } else {
5142        if ($has_sign) {        if ($has_sign) {
5143          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5144                     level => $self->{must_level},                     level => $self->{level}->{must},
5145                     uri => \$self->{href},                     uri => \$self->{href},
5146                     token => $t);                     token => $t);
5147          return ($t, undef);          return ($t, undef);
# Line 5254  $Prop->{background} = { Line 5267  $Prop->{background} = {
5267                $prop_value{'background-position-y'}                $prop_value{'background-position-y'}
5268                    = ['DIMENSION', $value, $unit];                    = ['DIMENSION', $value, $unit];
5269              } else {              } else {
5270                $onerror->(type => "syntax error:'$prop_name'",                $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5271                           level => $self->{must_level},                           level => $self->{level}->{must},
5272                           uri => \$self->{href},                           uri => \$self->{href},
5273                           token => $t);                           token => $t);
5274                return ($t, undef);                return ($t, undef);
# Line 5270  $Prop->{background} = { Line 5283  $Prop->{background} = {
5283              $t = $tt->get_next_token;              $t = $tt->get_next_token;
5284              $prop_value{'background-position-y'} = ['DIMENSION', $value, 'px'];              $prop_value{'background-position-y'} = ['DIMENSION', $value, 'px'];
5285            } elsif ($has_sign) {            } elsif ($has_sign) {
5286              $onerror->(type => "syntax error:'$prop_name'",              $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5287                         level => $self->{must_level},                         level => $self->{level}->{must},
5288                         uri => \$self->{href},                         uri => \$self->{href},
5289                         token => $t);                         token => $t);
5290              return ($t, undef);              return ($t, undef);
# Line 5325  $Prop->{background} = { Line 5338  $Prop->{background} = {
5338              $prop_value{'background-position-x'}              $prop_value{'background-position-x'}
5339                  = ['DIMENSION', $value, $unit];                  = ['DIMENSION', $value, $unit];
5340            } else {            } else {
5341              $onerror->(type => "syntax error:'$prop_name'",              $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5342                         level => $self->{must_level},                         level => $self->{level}->{must},
5343                         uri => \$self->{href},                         uri => \$self->{href},
5344                         token => $t);                         token => $t);
5345              return ($t, undef);              return ($t, undef);
# Line 5366  $Prop->{background} = { Line 5379  $Prop->{background} = {
5379              $prop_value{'background-position-y'}              $prop_value{'background-position-y'}
5380                  = ['DIMENSION', $value, $unit];                  = ['DIMENSION', $value, $unit];
5381            } else {            } else {
5382              $onerror->(type => "syntax error:'$prop_name'",              $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5383                         level => $self->{must_level},                         level => $self->{level}->{must},
5384                         uri => \$self->{href},                         uri => \$self->{href},
5385                         token => $t);                         token => $t);
5386              return ($t, undef);              return ($t, undef);
# Line 5392  $Prop->{background} = { Line 5405  $Prop->{background} = {
5405          } else {          } else {
5406            $prop_value{'background-position-y'} = ['PERCENTAGE', 50];            $prop_value{'background-position-y'} = ['PERCENTAGE', 50];
5407            if ($has_sign) {            if ($has_sign) {
5408              $onerror->(type => "syntax error:'$prop_name'",              $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5409                         level => $self->{must_level},                         level => $self->{level}->{must},
5410                         uri => \$self->{href},                         uri => \$self->{href},
5411                         token => $t);                         token => $t);
5412              return ($t, undef);              return ($t, undef);
# Line 5409  $Prop->{background} = { Line 5422  $Prop->{background} = {
5422          if (keys %prop_value and not $has_sign) {          if (keys %prop_value and not $has_sign) {
5423            last B;            last B;
5424          } else {          } else {
5425            $onerror->(type => "syntax error:'$prop_name'",            $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5426                       level => $self->{must_level},                       level => $self->{level}->{must},
5427                       uri => \$self->{href},                       uri => \$self->{href},
5428                       token => $t);                       token => $t);
5429            return ($t, undef);            return ($t, undef);
# Line 5488  $Prop->{font} = { Line 5501  $Prop->{font} = {
5501            if (keys %prop_value) {            if (keys %prop_value) {
5502              last A;              last A;
5503            } else {            } else {
5504              $onerror->(type => "syntax error:'$prop_name'",              $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5505                         level => $self->{must_level},                         level => $self->{level}->{must},
5506                         uri => \$self->{href},                         uri => \$self->{href},
5507                         token => $t);                         token => $t);
5508              return ($t, undef);              return ($t, undef);
# Line 5519  $Prop->{font} = { Line 5532  $Prop->{font} = {
5532            ## NOTE: <'font-size'> or invalid            ## NOTE: <'font-size'> or invalid
5533            last A;            last A;
5534          } else {          } else {
5535            $onerror->(type => "syntax error:'$prop_name'",            $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5536                       level => $self->{must_level},                       level => $self->{level}->{must},
5537                       uri => \$self->{href},                       uri => \$self->{href},
5538                       token => $t);                       token => $t);
5539            return ($t, undef);            return ($t, undef);
# Line 5540  $Prop->{font} = { Line 5553  $Prop->{font} = {
5553          ->($self, 'font', $tt, $t, $onerror);          ->($self, 'font', $tt, $t, $onerror);
5554      return ($t, undef) unless defined $pv;      return ($t, undef) unless defined $pv;
5555      if ($pv->{font}->[0] eq 'INHERIT') {      if ($pv->{font}->[0] eq 'INHERIT') {
5556        $onerror->(type => "syntax error:'$prop_name'",        $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5557                   level => $self->{must_level},                   level => $self->{level}->{must},
5558                   uri => \$self->{href},                   uri => \$self->{href},
5559                   token => $t);                   token => $t);
5560        return ($t, undef);        return ($t, undef);
# Line 5556  $Prop->{font} = { Line 5569  $Prop->{font} = {
5569            ->($self, 'font', $tt, $t, $onerror);            ->($self, 'font', $tt, $t, $onerror);
5570        return ($t, undef) unless defined $pv;        return ($t, undef) unless defined $pv;
5571        if ($pv->{font}->[0] eq 'INHERIT') {        if ($pv->{font}->[0] eq 'INHERIT') {
5572          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5573                     level => $self->{must_level},                     level => $self->{level}->{must},
5574                     uri => \$self->{href},                     uri => \$self->{href},
5575                     token => $t);                     token => $t);
5576          return ($t, undef);          return ($t, undef);
# Line 5649  $Prop->{'border-width'} = { Line 5662  $Prop->{'border-width'} = {
5662          $prop_value{'border-top-width'} = ['DIMENSION', $value, $unit];          $prop_value{'border-top-width'} = ['DIMENSION', $value, $unit];
5663          $t = $tt->get_next_token;          $t = $tt->get_next_token;
5664        } else {        } else {
5665          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5666                     level => $self->{must_level},                     level => $self->{level}->{must},
5667                     uri => \$self->{href},                     uri => \$self->{href},
5668                     token => $t);                     token => $t);
5669          return ($t, undef);          return ($t, undef);
# Line 5662  $Prop->{'border-width'} = { Line 5675  $Prop->{'border-width'} = {
5675          $prop_value{'border-top-width'} = ['DIMENSION', $value, 'px'];          $prop_value{'border-top-width'} = ['DIMENSION', $value, 'px'];
5676          $t = $tt->get_next_token;          $t = $tt->get_next_token;
5677        } else {        } else {
5678          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5679                     level => $self->{must_level},                     level => $self->{level}->{must},
5680                     uri => \$self->{href},                     uri => \$self->{href},
5681                     token => $t);                     token => $t);
5682          return ($t, undef);          return ($t, undef);
# Line 5681  $Prop->{'border-width'} = { Line 5694  $Prop->{'border-width'} = {
5694          $prop_value{'border-left-width'} = $prop_value{'border-right-width'};          $prop_value{'border-left-width'} = $prop_value{'border-right-width'};
5695          return ($t, \%prop_value);          return ($t, \%prop_value);
5696        } else {        } else {
5697          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5698                     level => $self->{must_level},                     level => $self->{level}->{must},
5699                     uri => \$self->{href},                     uri => \$self->{href},
5700                     token => $t);                     token => $t);
5701          return ($t, undef);          return ($t, undef);
5702        }        }
5703      } else {      } else {
5704        $onerror->(type => "syntax error:'$prop_name'",        $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5705                   level => $self->{must_level},                   level => $self->{level}->{must},
5706                   uri => \$self->{href},                   uri => \$self->{href},
5707                   token => $t);                   token => $t);
5708        return ($t, undef);        return ($t, undef);
# Line 5719  $Prop->{'border-width'} = { Line 5732  $Prop->{'border-width'} = {
5732          $t = $tt->get_next_token;          $t = $tt->get_next_token;
5733          $prop_value{'border-right-width'} = ['DIMENSION', $value, $unit];          $prop_value{'border-right-width'} = ['DIMENSION', $value, $unit];
5734        } else {        } else {
5735          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5736                     level => $self->{must_level},                     level => $self->{level}->{must},
5737                     uri => \$self->{href},                     uri => \$self->{href},
5738                     token => $t);                     token => $t);
5739          return ($t, undef);          return ($t, undef);
# Line 5732  $Prop->{'border-width'} = { Line 5745  $Prop->{'border-width'} = {
5745          $t = $tt->get_next_token;          $t = $tt->get_next_token;
5746          $prop_value{'border-right-width'} = ['DIMENSION', $value, 'px'];          $prop_value{'border-right-width'} = ['DIMENSION', $value, 'px'];
5747        } else {        } else {
5748          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5749                     level => $self->{must_level},                     level => $self->{level}->{must},
5750                     uri => \$self->{href},                     uri => \$self->{href},
5751                     token => $t);                     token => $t);
5752          return ($t, undef);          return ($t, undef);
# Line 5746  $Prop->{'border-width'} = { Line 5759  $Prop->{'border-width'} = {
5759        }        }
5760      } else {      } else {
5761        if ($has_sign) {        if ($has_sign) {
5762          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5763                     level => $self->{must_level},                     level => $self->{level}->{must},
5764                     uri => \$self->{href},                     uri => \$self->{href},
5765                     token => $t);                     token => $t);
5766          return ($t, undef);          return ($t, undef);
# Line 5777  $Prop->{'border-width'} = { Line 5790  $Prop->{'border-width'} = {
5790          $t = $tt->get_next_token;          $t = $tt->get_next_token;
5791          $prop_value{'border-bottom-width'} = ['DIMENSION', $value, $unit];          $prop_value{'border-bottom-width'} = ['DIMENSION', $value, $unit];
5792        } else {        } else {
5793          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5794                     level => $self->{must_level},                     level => $self->{level}->{must},
5795                     uri => \$self->{href},                     uri => \$self->{href},
5796                     token => $t);                     token => $t);
5797          return ($t, undef);          return ($t, undef);
# Line 5790  $Prop->{'border-width'} = { Line 5803  $Prop->{'border-width'} = {
5803          $t = $tt->get_next_token;          $t = $tt->get_next_token;
5804          $prop_value{'border-bottom-width'} = ['DIMENSION', $value, 'px'];          $prop_value{'border-bottom-width'} = ['DIMENSION', $value, 'px'];
5805        } else {        } else {
5806          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5807                     level => $self->{must_level},                     level => $self->{level}->{must},
5808                     uri => \$self->{href},                     uri => \$self->{href},
5809                     token => $t);                     token => $t);
5810          return ($t, undef);          return ($t, undef);
# Line 5804  $Prop->{'border-width'} = { Line 5817  $Prop->{'border-width'} = {
5817        }        }
5818      } else {      } else {
5819        if ($has_sign) {        if ($has_sign) {
5820          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5821                     level => $self->{must_level},                     level => $self->{level}->{must},
5822                     uri => \$self->{href},                     uri => \$self->{href},
5823                     token => $t);                     token => $t);
5824          return ($t, undef);          return ($t, undef);
# Line 5834  $Prop->{'border-width'} = { Line 5847  $Prop->{'border-width'} = {
5847          $t = $tt->get_next_token;          $t = $tt->get_next_token;
5848          $prop_value{'border-left-width'} = ['DIMENSION', $value, $unit];          $prop_value{'border-left-width'} = ['DIMENSION', $value, $unit];
5849        } else {        } else {
5850          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5851                     level => $self->{must_level},                     level => $self->{level}->{must},
5852                     uri => \$self->{href},                     uri => \$self->{href},
5853                     token => $t);                     token => $t);
5854          return ($t, undef);          return ($t, undef);
# Line 5847  $Prop->{'border-width'} = { Line 5860  $Prop->{'border-width'} = {
5860          $t = $tt->get_next_token;          $t = $tt->get_next_token;
5861          $prop_value{'border-left-width'} = ['DIMENSION', $value, 'px'];          $prop_value{'border-left-width'} = ['DIMENSION', $value, 'px'];
5862        } else {        } else {
5863          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5864                     level => $self->{must_level},                     level => $self->{level}->{must},
5865                     uri => \$self->{href},                     uri => \$self->{href},
5866                     token => $t);                     token => $t);
5867          return ($t, undef);          return ($t, undef);
# Line 5861  $Prop->{'border-width'} = { Line 5874  $Prop->{'border-width'} = {
5874        }        }
5875      } else {      } else {
5876        if ($has_sign) {        if ($has_sign) {
5877          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5878                     level => $self->{must_level},                     level => $self->{level}->{must},
5879                     uri => \$self->{href},                     uri => \$self->{href},
5880                     token => $t);                     token => $t);
5881          return ($t, undef);          return ($t, undef);
# Line 5926  $Prop->{'list-style'} = { Line 5939  $Prop->{'list-style'} = {
5939            $none++;            $none++;
5940          } elsif ($Prop->{'list-style-type'}->{keyword}->{$prop_value}) {          } elsif ($Prop->{'list-style-type'}->{keyword}->{$prop_value}) {
5941            if (exists $prop_value{'list-style-type'}) {            if (exists $prop_value{'list-style-type'}) {
5942              $onerror->(type => "duplication:'list-style-type'",              $onerror->(type => 'CSS duplication', text => "'list-style-type'",
5943                         level => $self->{must_level},                         level => $self->{level}->{must},
5944                         uri => \$self->{href},                         uri => \$self->{href},
5945                         token => $t);                         token => $t);
5946              return ($t, undef);              return ($t, undef);
# Line 5936  $Prop->{'list-style'} = { Line 5949  $Prop->{'list-style'} = {
5949            }            }
5950          } elsif ($Prop->{'list-style-position'}->{keyword}->{$prop_value}) {          } elsif ($Prop->{'list-style-position'}->{keyword}->{$prop_value}) {
5951            if (exists $prop_value{'list-style-position'}) {            if (exists $prop_value{'list-style-position'}) {
5952              $onerror->(type => "duplication:'list-style-position'",              $onerror->(type => 'CSS duplication',
5953                         level => $self->{must_level},                         text => "'list-style-position'",
5954                           level => $self->{level}->{must},
5955                         uri => \$self->{href},                         uri => \$self->{href},
5956                         token => $t);                         token => $t);
5957              return ($t, undef);              return ($t, undef);
# Line 5951  $Prop->{'list-style'} = { Line 5965  $Prop->{'list-style'} = {
5965            last F;            last F;
5966          } else {          } else {
5967            if ($f == 1) {            if ($f == 1) {
5968              $onerror->(type => "syntax error:'$prop_name'",              $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5969                         level => $self->{must_level},                         level => $self->{level}->{must},
5970                         uri => \$self->{href},                         uri => \$self->{href},
5971                         token => $t);                         token => $t);
5972              return ($t, undef);              return ($t, undef);
# Line 5962  $Prop->{'list-style'} = { Line 5976  $Prop->{'list-style'} = {
5976          }          }
5977        } elsif ($t->{type} == URI_TOKEN) {        } elsif ($t->{type} == URI_TOKEN) {
5978          if (exists $prop_value{'list-style-image'}) {          if (exists $prop_value{'list-style-image'}) {
5979            $onerror->(type => "duplication:'list-style-image'",            $onerror->(type => 'CSS duplication', text => "'list-style-image'",
5980                       uri => \$self->{href},                       uri => \$self->{href},
5981                       level => $self->{must_level},                       level => $self->{level}->{must},
5982                       token => $t);                       token => $t);
5983            return ($t, undef);            return ($t, undef);
5984          }          }
# Line 5974  $Prop->{'list-style'} = { Line 5988  $Prop->{'list-style'} = {
5988          $t = $tt->get_next_token;          $t = $tt->get_next_token;
5989        } else {        } else {
5990          if ($f == 1) {          if ($f == 1) {
5991            $onerror->(type => "syntax error:'$prop_name'",            $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
5992                       level => $self->{must_level},                       level => $self->{level}->{must},
5993                       uri => \$self->{href},                       uri => \$self->{href},
5994                       token => $t);                       token => $t);
5995            return ($t, undef);            return ($t, undef);
# Line 5991  $Prop->{'list-style'} = { Line 6005  $Prop->{'list-style'} = {
6005      if ($none == 1) {      if ($none == 1) {
6006        if (exists $prop_value{'list-style-type'}) {        if (exists $prop_value{'list-style-type'}) {
6007          if (exists $prop_value{'list-style-image'}) {          if (exists $prop_value{'list-style-image'}) {
6008            $onerror->(type => "duplication:'list-style-image'",            $onerror->(type => 'CSS duplication', text => "'list-style-image'",
6009                       uri => \$self->{href},                       uri => \$self->{href},
6010                       level => $self->{must_level},                       level => $self->{level}->{must},
6011                       token => $t);                       token => $t);
6012            return ($t, undef);            return ($t, undef);
6013          } else {          } else {
# Line 6006  $Prop->{'list-style'} = { Line 6020  $Prop->{'list-style'} = {
6020        }        }
6021      } elsif ($none == 2) {      } elsif ($none == 2) {
6022        if (exists $prop_value{'list-style-type'}) {        if (exists $prop_value{'list-style-type'}) {
6023          $onerror->(type => "duplication:'list-style-type'",          $onerror->(type => 'CSS duplication', text => "'list-style-type'",
6024                     uri => \$self->{href},                     uri => \$self->{href},
6025                     level => $self->{must_level},                     level => $self->{level}->{must},
6026                     token => $t);                     token => $t);
6027          return ($t, undef);          return ($t, undef);
6028        }        }
6029        if (exists $prop_value{'list-style-image'}) {        if (exists $prop_value{'list-style-image'}) {
6030          $onerror->(type => "duplication:'list-style-image'",          $onerror->(type => 'CSS duplication', text => "'list-style-image'",
6031                     uri => \$self->{href},                     uri => \$self->{href},
6032                     level => $self->{must_level},                     level => $self->{level}->{must},
6033                     token => $t);                     token => $t);
6034          return ($t, undef);          return ($t, undef);
6035        }        }
# Line 6023  $Prop->{'list-style'} = { Line 6037  $Prop->{'list-style'} = {
6037        $prop_value{'list-style-type'} = ['KEYWORD', 'none'];        $prop_value{'list-style-type'} = ['KEYWORD', 'none'];
6038        $prop_value{'list-style-image'} = ['KEYWORD', 'none'];        $prop_value{'list-style-image'} = ['KEYWORD', 'none'];
6039      } elsif ($none == 3) {      } elsif ($none == 3) {
6040        $onerror->(type => "duplication:'list-style-type'",        $onerror->(type => 'CSS duplication', text => "'list-style-type'",
6041                   uri => \$self->{href},                   uri => \$self->{href},
6042                   level => $self->{must_level},                   level => $self->{level}->{must},
6043                   token => $t);                   token => $t);
6044        return ($t, undef);        return ($t, undef);
6045      }      }
# Line 6092  $Prop->{'text-decoration'} = { Line 6106  $Prop->{'text-decoration'} = {
6106                 $self->{prop_value}->{$prop_name}->{$v}) {                 $self->{prop_value}->{$prop_name}->{$v}) {
6107          $value->[4] = 1;          $value->[4] = 1;
6108        } else {        } else {
6109          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
6110                     level => $self->{must_level},                     level => $self->{level}->{must},
6111                     uri => \$self->{href},                     uri => \$self->{href},
6112                     token => $t);                     token => $t);
6113          return ($t, undef);          return ($t, undef);
# Line 6179  $Prop->{quotes} = { Line 6193  $Prop->{quotes} = {
6193        redo A;        redo A;
6194      }      }
6195            
6196      $onerror->(type => "syntax error:'$prop_name'",      $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
6197                 level => $self->{must_level},                 level => $self->{level}->{must},
6198                 uri => \$self->{href},                 uri => \$self->{href},
6199                 token => $t);                 token => $t);
6200      return ($t, undef);      return ($t, undef);
# Line 6256  $Prop->{content} = { Line 6270  $Prop->{content} = {
6270                  my $uri = $self->{lookup_namespace_uri}->($pfx);                  my $uri = $self->{lookup_namespace_uri}->($pfx);
6271                  unless (defined $uri) {                  unless (defined $uri) {
6272                    $self->{onerror}->(type => 'namespace prefix:not declared',                    $self->{onerror}->(type => 'namespace prefix:not declared',
6273                                       level => $self->{must_level},                                       level => $self->{level}->{must},
6274                                       uri => \$self->{href},                                       uri => \$self->{href},
6275                                       token => $t_pfx,                                       token => $t_pfx,
6276                                       value => $pfx);                                       value => $pfx);
# Line 6359  $Prop->{content} = { Line 6373  $Prop->{content} = {
6373        redo A;        redo A;
6374      } # A      } # A
6375    
6376      $onerror->(type => "syntax error:'$prop_name'",      $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
6377                 level => $self->{must_level},                 level => $self->{level}->{must},
6378                 uri => \$self->{href},                 uri => \$self->{href},
6379                 token => $t);                 token => $t);
6380      return ($t, undef);      return ($t, undef);
# Line 6404  $Prop->{'counter-reset'} = { Line 6418  $Prop->{'counter-reset'} = {
6418              push @v, [$value, int $t->{number}];              push @v, [$value, int $t->{number}];
6419              $t = $tt->get_next_token;              $t = $tt->get_next_token;
6420            } else {            } else {
6421              $onerror->(type => "syntax error:'$prop_name'",              $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
6422                         level => $self->{must_level},                         level => $self->{level}->{must},
6423                         uri => \$self->{href},                         uri => \$self->{href},
6424                         token => $t);                         token => $t);
6425              return ($t, undef);              return ($t, undef);
# Line 6416  $Prop->{'counter-reset'} = { Line 6430  $Prop->{'counter-reset'} = {
6430              push @v, [$value, -int $t->{number}];              push @v, [$value, -int $t->{number}];
6431              $t = $tt->get_next_token;              $t = $tt->get_next_token;
6432            } else {            } else {
6433              $onerror->(type => "syntax error:'$prop_name'",              $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
6434                         level => $self->{must_level},                         level => $self->{level}->{must},
6435                         uri => \$self->{href},                         uri => \$self->{href},
6436                         token => $t);                         token => $t);
6437              return ($t, undef);              return ($t, undef);
# Line 6433  $Prop->{'counter-reset'} = { Line 6447  $Prop->{'counter-reset'} = {
6447          }          }
6448          $t = $tt->get_next_token while $t->{type} == S_TOKEN;          $t = $tt->get_next_token while $t->{type} == S_TOKEN;
6449        } else {        } else {
6450          $onerror->(type => "syntax error:'$prop_name'",          $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
6451                     level => $self->{must_level},                     level => $self->{level}->{must},
6452                     uri => \$self->{href},                     uri => \$self->{href},
6453                     token => $t);                     token => $t);
6454          return ($t, undef);          return ($t, undef);
# Line 6477  $Prop->{'counter-reset'} = { Line 6491  $Prop->{'counter-reset'} = {
6491        }        }
6492      } # A      } # A
6493            
6494      $onerror->(type => "syntax error:'$prop_name'",      $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
6495                 level => $self->{must_level},                 level => $self->{level}->{must},
6496                 uri => \$self->{href},                 uri => \$self->{href},
6497                 token => $t);                 token => $t);
6498      return ($t, undef);      return ($t, undef);
# Line 6536  $Prop->{clip} = { Line 6550  $Prop->{clip} = {
6550                $t = $tt->get_next_token;                $t = $tt->get_next_token;
6551                push @$prop_value, ['DIMENSION', $value, $unit];                push @$prop_value, ['DIMENSION', $value, $unit];
6552              } else {              } else {
6553                $onerror->(type => "syntax error:'$prop_name'",                $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
6554                           level => $self->{must_level},                           level => $self->{level}->{must},
6555                           uri => \$self->{href},                           uri => \$self->{href},
6556                           token => $t);                           token => $t);
6557                return ($t, undef);                return ($t, undef);
# Line 6557  $Prop->{clip} = { Line 6571  $Prop->{clip} = {
6571              }              }
6572            } else {            } else {
6573              if ($has_sign) {              if ($has_sign) {
6574                $onerror->(type => "syntax error:'$prop_name'",                $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
6575                           level => $self->{must_level},                           level => $self->{level}->{must},
6576                           uri => \$self->{href},                           uri => \$self->{href},
6577                           token => $t);                           token => $t);
6578                return ($t, undef);                return ($t, undef);
# Line 6592  $Prop->{clip} = { Line 6606  $Prop->{clip} = {
6606        }        }
6607      }      }
6608    
6609      $onerror->(type => "syntax error:'$prop_name'",      $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
6610                 level => $self->{must_level},                 level => $self->{level}->{must},
6611                 uri => \$self->{href},                 uri => \$self->{href},
6612                 token => $t);                 token => $t);
6613      return ($t, undef);      return ($t, undef);
# Line 6660  $Prop->{marks} = { Line 6674  $Prop->{marks} = {
6674        }        }
6675      }      }
6676    
6677      $onerror->(type => "syntax error:'$prop_name'",      $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
6678                 level => $self->{must_level},                 level => $self->{level}->{must},
6679                 uri => \$self->{href},                 uri => \$self->{href},
6680                 token => $t);                 token => $t);
6681      return ($t, undef);      return ($t, undef);
# Line 6713  $Prop->{size} = { Line 6727  $Prop->{size} = {
6727            $t = $tt->get_next_token;            $t = $tt->get_next_token;
6728            push @$prop_value, ['DIMENSION', $value, $unit];            push @$prop_value, ['DIMENSION', $value, $unit];
6729          } else {          } else {
6730            $onerror->(type => "syntax error:'$prop_name'",            $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
6731                       level => $self->{must_level},                       level => $self->{level}->{must},
6732                       uri => \$self->{href},                       uri => \$self->{href},
6733                       token => $t);                       token => $t);
6734            return ($t, undef);            return ($t, undef);
# Line 6741  $Prop->{size} = { Line 6755  $Prop->{size} = {
6755        }        }
6756      } # A      } # A
6757    
6758      $onerror->(type => "syntax error:'$prop_name'",      $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
6759                 level => $self->{must_level},                 level => $self->{level}->{must},
6760                 uri => \$self->{href},                 uri => \$self->{href},
6761                 token => $t);                 token => $t);
6762      return ($t, undef);      return ($t, undef);
# Line 6785  $Prop->{page} = { Line 6799  $Prop->{page} = {
6799        }        }
6800      }      }
6801    
6802      $onerror->(type => "syntax error:'$prop_name'",      $onerror->(type => 'CSS syntax error', text => qq['$prop_name'],
6803                 level => $self->{must_level},                 level => $self->{level}->{must},
6804                 uri => \$self->{href},                 uri => \$self->{href},
6805                 token => $t);                 token => $t);
6806      return ($t, undef);      return ($t, undef);

Legend:
Removed from v.1.68  
changed lines
  Added in v.1.69

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24