aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Hofmann <Johannes.Hofmann@gmx.de>2008-11-30 22:40:22 +0100
committerJohannes Hofmann <Johannes.Hofmann@gmx.de>2008-11-30 22:40:22 +0100
commitad43591f7b4f6734ba275444f0090f2f0caa0467 (patch)
treeec4e5e0d487327bc419a72e5697eb3750325c4c7
parenta39d434e6169c62624ad24ad600e1ac62d6fb2ff (diff)
factor out Css_parse_simple_selector()
-rw-r--r--src/css.cc6
-rw-r--r--src/css.hh12
-rw-r--r--src/cssparser.cc28
3 files changed, 30 insertions, 16 deletions
diff --git a/src/css.cc b/src/css.cc
index 3e20677f..f61bdae6 100644
--- a/src/css.cc
+++ b/src/css.cc
@@ -109,7 +109,7 @@ void CssSelector::print () {
}
bool CssSimpleSelector::match (const DoctreeNode *n) {
- if (element >= 0 && element != n->element)
+ if (element != ELEMENT_ANY && element != n->element)
return false;
if (klass != NULL &&
(n->klass == NULL || strcasecmp (klass, n->klass) != 0))
@@ -227,8 +227,8 @@ void CssContext::addRule (CssRule *rule, CssPrimaryOrder order) {
sheet[order]->addRule (rule);
-// fprintf(stderr, "Adding Rule (%d)\n", order);
-// rule->print ();
+ fprintf(stderr, "Adding Rule (%d)\n", order);
+ rule->print ();
}
void CssContext::buildUserAgentStyle () {
diff --git a/src/css.hh b/src/css.hh
index 11639086..688698ad 100644
--- a/src/css.hh
+++ b/src/css.hh
@@ -195,6 +195,11 @@ class CssPropertyList : public lout::misc::SimpleVector <CssProperty> {
class CssSimpleSelector {
public:
+ enum {
+ ELEMENT_NONE = -1,
+ ELEMENT_ANY = -2,
+ };
+
int element;
const char *klass, *pseudo, *id;
@@ -220,9 +225,12 @@ class CssSelector {
lout::misc::SimpleVector <Combinator> *combinator;
public:
- CssSelector (int element = -1, const char *klass = NULL,
+ CssSelector (int element = CssSimpleSelector::ELEMENT_ANY,
+ const char *klass = NULL,
const char *pseudo = NULL, const char *id = NULL);
- void addSimpleSelector (Combinator c, int element = -1, const char *klass = NULL,
+ void addSimpleSelector (Combinator c,
+ int element = CssSimpleSelector::ELEMENT_ANY,
+ const char *klass = NULL,
const char *pseudo = NULL, const char *id = NULL);
inline CssSimpleSelector *top () {
return simpleSelector->getRef (simpleSelector->size () - 1);
diff --git a/src/cssparser.cc b/src/cssparser.cc
index 2edee0c6..06fa91ad 100644
--- a/src/cssparser.cc
+++ b/src/cssparser.cc
@@ -922,15 +922,15 @@ static void Css_parse_declaration(CssParser * parser,
Css_next_token(parser);
}
-static CssSelector *Css_parse_selector(CssParser * parser) {
- CssSelector *selector = new CssSelector ();
+static void Css_parse_simple_selector(CssParser * parser,
+ CssSimpleSelector *selector) {
const char *p, **pp;
if (parser->ttype == CSS_TK_SYMBOL) {
- selector->top ()->element = a_Html_tag_index(parser->tval);
+ selector->element = a_Html_tag_index(parser->tval);
Css_next_token(parser);
} else if (parser->ttype == CSS_TK_CHAR && parser->tval[0] == '*') {
- selector->top ()->element = CssSimpleSelector::ELEMENT_ANY;
+ selector->element = CssSimpleSelector::ELEMENT_ANY;
Css_next_token(parser);
}
@@ -939,13 +939,13 @@ static CssSelector *Css_parse_selector(CssParser * parser) {
if (parser->ttype == CSS_TK_CHAR) {
switch (parser->tval[0]) {
case '#':
- pp = &selector->top ()->id;
+ pp = &selector->id;
break;
case '.':
- pp = &selector->top ()->klass;
+ pp = &selector->klass;
break;
case ':':
- pp = &selector->top ()->pseudo;
+ pp = &selector->pseudo;
break;
}
}
@@ -964,8 +964,8 @@ static CssSelector *Css_parse_selector(CssParser * parser) {
p = strchr(parser->tval, '.');
if (*pp == NULL)
*pp = dStrndup(parser->tval, p - parser->tval);
- if (selector->top ()->klass == NULL)
- selector->top ()->klass = dStrdup(p + 1);
+ if (selector->klass == NULL)
+ selector->klass = dStrdup(p + 1);
Css_next_token(parser);
}
}
@@ -978,8 +978,14 @@ static CssSelector *Css_parse_selector(CssParser * parser) {
Css_next_token(parser);
DEBUG_MSG(DEBUG_PARSE_LEVEL, "end of selector (%s, %s, %s, %d)\n",
- selector->top ()->id, selector->top ()->klass,
- selector->top ()->pseudo, selector->top ()->element);
+ selector->id, selector->klass,
+ selector->pseudo, selector->element);
+}
+
+static CssSelector *Css_parse_selector(CssParser * parser) {
+ CssSelector *selector = new CssSelector ();
+
+ Css_parse_simple_selector (parser, selector->top ());
return selector;
}