8 #ifndef INCLUDED_ORCUS_CSS_PARSER_HPP 9 #define INCLUDED_ORCUS_CSS_PARSER_HPP 11 #define ORCUS_DEBUG_CSS 0 13 #include "parser_global.hpp" 14 #include "css_parser_base.hpp" 26 template<
typename _Handler>
30 typedef _Handler handler_type;
32 css_parser(
const char* p,
size_t n, handler_type& hdl);
42 void simple_selector_name();
47 void function_value(
const char* p,
size_t len);
48 void function_rgb(
bool alpha);
49 void function_hsl(
bool alpha);
55 handler_type& m_handler;
58 template<
typename _Handler>
62 template<
typename _Handler>
68 std::cout <<
"compressed: '";
69 const char* p = mp_char;
70 for (; p != mp_end; ++p)
72 std::cout <<
"'" << std::endl;
74 m_handler.begin_parse();
77 m_handler.end_parse();
80 template<
typename _Handler>
92 simple_selector_name();
99 set_combinator(c, css::combinator_t::direct_child);
102 set_combinator(c, css::combinator_t::next_sibling);
107 simple_selector_name();
113 reset_before_block();
117 css::parse_error::throw_with(
"rule: failed to parse '", c,
"'");
122 template<
typename _Handler>
126 assert(cur_char() ==
'@');
130 throw css::parse_error(
"at_rule_name: first character of an at-rule name must be an alphabet.");
137 m_handler.at_rule_name(p, len);
139 std::string foo(p, len);
140 std::cout <<
"at-rule name: " << foo.c_str() << std::endl;
144 template<
typename _Handler>
156 if (m_simple_selector_count)
159 cout <<
"combinator: " << m_combinator << endl;
161 m_handler.combinator(m_combinator);
162 m_combinator = css::combinator_t::descendant;
164 assert(is_alpha(c) || c ==
'.' || c ==
'#');
166 const char* p = NULL;
170 cout <<
"simple_selector_name: (" << m_simple_selector_count <<
")";
173 if (c !=
'.' && c !=
'#')
178 cout <<
" type=" << s;
180 m_handler.simple_selector_type(p, n);
184 while (in_loop && has_char())
192 m_handler.simple_selector_class(p, n);
195 std::cout <<
" class=" << s;
203 m_handler.simple_selector_id(p, n);
206 std::cout <<
" id=" << s;
214 if (cur_char() ==
':')
219 css::pseudo_element_t elem = css::to_pseudo_element(p, n);
221 css::parse_error::throw_with(
222 "selector_name: unknown pseudo element '", p, n,
"'");
224 m_handler.simple_selector_pseudo_element(elem);
230 css::pseudo_class_t pc = css::to_pseudo_class(p, n);
232 css::parse_error::throw_with(
233 "selector_name: unknown pseudo class '", p, n,
"'");
235 m_handler.simple_selector_pseudo_class(pc);
244 m_handler.end_simple_selector();
245 skip_comments_and_blanks();
247 ++m_simple_selector_count;
250 std::cout << std::endl;
254 template<
typename _Handler>
261 if (!is_alpha(c) && c !=
'.')
262 css::parse_error::throw_with(
263 "property_name: first character of a name must be an alphabet or a dot, but found '", c,
"'");
268 skip_comments_and_blanks();
270 m_handler.property_name(p, len);
272 std::string foo(p, len);
273 std::cout <<
"property name: " << foo.c_str() << std::endl;
277 template<
typename _Handler>
282 m_handler.begin_property();
284 if (cur_char() !=
':')
287 skip_comments_and_blanks();
290 while (in_loop && has_char())
300 skip_comments_and_blanks();
312 skip_comments_and_blanks();
313 m_handler.end_property();
316 template<
typename _Handler>
320 const char* p = NULL;
322 literal(p, len,
'"');
326 m_handler.value(p, len);
328 std::string foo(p, len);
329 std::cout <<
"quoted value: " << foo.c_str() << std::endl;
333 template<
typename _Handler>
344 if (!is_alpha(c) && !is_numeric(c) && !is_in(c,
"-+.#"))
345 css::parse_error::throw_with(
"value:: illegal first character of a value '", c,
"'");
347 const char* p = NULL;
349 identifier(p, len,
".%");
350 if (cur_char() ==
'(')
352 function_value(p, len);
356 m_handler.value(p, len);
358 skip_comments_and_blanks();
361 std::string foo(p, len);
362 std::cout <<
"value: " << foo.c_str() << std::endl;
366 template<
typename _Handler>
369 assert(cur_char() ==
'(');
370 css::property_function_t func = css::to_property_function(p, len);
371 if (func == css::property_function_t::unknown)
372 css::parse_error::throw_with(
"function_value: unknown function '", p, len,
"'");
376 skip_comments_and_blanks();
380 case css::property_function_t::rgb:
383 case css::property_function_t::rgba:
386 case css::property_function_t::hsl:
389 case css::property_function_t::hsla:
392 case css::property_function_t::url:
396 css::parse_error::throw_with(
"function_value: unhandled function '", p, len,
"'");
401 css::parse_error::throw_with(
"function_value: ')' expected but '", c,
"' found.");
404 skip_comments_and_blanks();
407 template<
typename _Handler>
414 const uint8_t* plast = p + 2;
421 skip_comments_and_blanks();
429 css::parse_error::throw_with(
"function_rgb: ',' expected but '", c,
"' found.");
432 skip_comments_and_blanks();
439 css::parse_error::throw_with(
"function_rgb: ',' expected but '", c,
"' found.");
442 skip_comments_and_blanks();
444 double alpha_val = parse_double_or_throw();
446 alpha_val = clip(alpha_val, 0.0, 1.0);
447 m_handler.rgba(vals[0], vals[1], vals[2], alpha_val);
450 m_handler.rgb(vals[0], vals[1], vals[2]);
458 const uint8_t* pend = plast + 1;
459 for (; p != pend; ++p)
460 std::cout <<
' ' << (
int)*p;
461 std::cout <<
" )" << std::endl;
465 template<
typename _Handler>
470 double hue = parse_double_or_throw();
471 hue = clip(hue, 0.0, 360.0);
472 skip_comments_and_blanks();
476 css::parse_error::throw_with(
"function_hsl: ',' expected but '", c,
"' found.");
479 skip_comments_and_blanks();
481 double sat = parse_percent();
482 sat = clip(sat, 0.0, 100.0);
483 skip_comments_and_blanks();
487 css::parse_error::throw_with(
"function_hsl: ',' expected but '", c,
"' found.");
490 skip_comments_and_blanks();
492 double light = parse_percent();
493 light = clip(light, 0.0, 100.0);
494 skip_comments_and_blanks();
498 m_handler.hsl(hue, sat, light);
504 css::parse_error::throw_with(
"function_hsl: ',' expected but '", c,
"' found.");
507 skip_comments_and_blanks();
509 double alpha_val = parse_double_or_throw();
510 alpha_val = clip(alpha_val, 0.0, 1.0);
511 skip_comments_and_blanks();
512 m_handler.hsla(hue, sat, light, alpha_val);
515 template<
typename _Handler>
520 if (c ==
'"' || c ==
'\'')
527 skip_comments_and_blanks();
528 m_handler.url(p, len);
530 std::cout <<
"url(" << std::string(p, len) <<
")" << std::endl;
539 skip_comments_and_blanks();
540 m_handler.url(p, len);
542 std::cout <<
"url(" << std::string(p, len) <<
")" << std::endl;
546 template<
typename _Handler>
549 assert(cur_char() ==
',');
551 std::cout <<
"," << std::endl;
555 m_handler.end_selector();
558 template<
typename _Handler>
562 std::cout <<
";" << std::endl;
565 skip_comments_and_blanks();
568 template<
typename _Handler>
573 assert(cur_char() ==
'{');
575 std::cout <<
"{" << std::endl;
577 m_handler.end_selector();
578 m_handler.begin_block();
581 skip_comments_and_blanks();
587 if (cur_char() !=
';')
590 if (cur_char() ==
'}')
595 if (cur_char() !=
'}')
598 m_handler.end_block();
601 skip_comments_and_blanks();
604 std::cout <<
"}" << std::endl;
Definition: css_parser_base.hpp:30
Definition: css_parser_base.hpp:21
Definition: css_parser.hpp:27
Definition: base64.hpp:15
void skip_to_or_blank(const char *&p, size_t &len, const char *chars)