int tagAttrs(HTMLParserEvent &event,
const char *name, int len,
const char *cp);
+ int skipAttribute(HTMLParserEvent &event,
+ const char *cp, int *attr_len,
+ const char **value, int *val_len, int *tr);
Rep();
~Rep();
int m_verbose;
{
}
+void mp::HTMLParser::set_verbose(int v)
+{
+ m_p->m_verbose = v;
+}
+
+
void mp::HTMLParser::parse(mp::HTMLParserEvent & event, const char *str) const
{
m_p->parse_str(event, str);
return i;
}
-static int skipAttribute(const char *cp, int *attr_len,
- const char **value, int *val_len)
+int mp::HTMLParser::Rep::skipAttribute(HTMLParserEvent &event,
+ const char *cp, int *attr_len,
+ const char **value, int *val_len,
+ int *tr)
{
+ int v0, v1;
int i = skipName(cp);
*attr_len = i;
*value = NULL;
i += skipSpace(cp + i);
if (cp[i] == '=')
{
- int v0, v1;
i++;
i += skipSpace(cp + i);
if (cp[i] == '\"' || cp[i] == '\'')
{
- char tr = cp[i];
+ *tr = cp[i];
v0 = ++i;
- while (cp[i] != tr && cp[i])
+ while (cp[i] != *tr && cp[i])
i++;
v1 = i;
if (cp[i])
}
else
{
+ *tr = 0;
v0 = i;
while (cp[i] && !strchr(SPACECHR ">", cp[i]))
i++;
}
*value = cp + v0;
*val_len = v1 - v0;
+ i += skipSpace(cp + i);
}
- i += skipSpace(cp + i);
return i;
}
int attr_len;
const char *value;
int val_len;
- int nor = skipAttribute(cp+i, &attr_len, &value, &val_len);
+ int tr;
+ char x[2];
+ int nor = skipAttribute(event, cp+i, &attr_len, &value, &val_len, &tr);
+ if (!nor)
+ break;
i += nor;
- if (nor)
- {
- if (m_verbose)
- printf ("------ attr %.*s=%.*s\n", attr_len, attr_name,
- val_len, value);
- event.attribute(name, len, attr_name, attr_len, value, val_len);
- }
- else
- {
- i++;
- }
+
+ x[0] = tr;
+ x[1] = 0;
+ if (m_verbose)
+ printf ("------ attr %.*s=%.*s\n", attr_len, attr_name,
+ val_len, value);
+ event.attribute(name, len, attr_name, attr_len, value, val_len, x);
}
return i;
}
{
int i = 0;
int close_it = 0;
- while (cp[i] && cp[i] != '>')
+ for (; cp[i] && cp[i] != '/' && cp[i] != '>'; i++)
+ ;
+ if (i > 0)
{
- if (cp[i] == '/')
- close_it = 1;
+ if (m_verbose)
+ printf("------ text %.*s\n", i, cp);
+ event.text(cp, i);
+ }
+ if (cp[i] == '/')
+ {
+ close_it = 1;
i++;
}
if (cp[i] == '>')
{
+ if (m_verbose)
+ printf("------ any tag %s %.*s\n",
+ close_it ? " close" : "end", tag_len, tag);
event.anyTagEnd(tag, tag_len, close_it);
i++;
}