Use all Replaces from/to in each buffer
[metaproxy-moved-to-github.git] / src / html_parser.cpp
index 694df69..8c4426d 100644 (file)
@@ -42,6 +42,9 @@ namespace metaproxy_1 {
         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;
@@ -67,6 +70,12 @@ mp::HTMLParser::~HTMLParser()
 {
 }
 
+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);
@@ -88,9 +97,12 @@ static int skipName(const char *cp)
     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;
@@ -99,14 +111,13 @@ static int skipAttribute(const char *cp, int *attr_len,
     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])
@@ -114,6 +125,7 @@ static int skipAttribute(const char *cp, int *attr_len,
         }
         else
         {
+            *tr = 0;
             v0 = i;
             while (cp[i] && !strchr(SPACECHR ">", cp[i]))
                 i++;
@@ -121,8 +133,8 @@ static int skipAttribute(const char *cp, int *attr_len,
         }
         *value = cp + v0;
         *val_len = v1 - v0;
+        i += skipSpace(cp + i);
     }
-    i += skipSpace(cp + i);
     return i;
 }
 
@@ -137,19 +149,19 @@ int mp::HTMLParser::Rep::tagAttrs(HTMLParserEvent &event,
         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;
 }
@@ -203,14 +215,24 @@ int mp::HTMLParser::Rep::tagEnd(HTMLParserEvent &event,
 {
     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++;
     }