--- a/libpurple/util.c Fri Apr 13 02:43:11 2007 +0000 +++ b/libpurple/util.c Fri Apr 13 04:13:24 2007 +0000 @@ -863,8 +863,8 @@ /* Returns a NULL-terminated string after unescaping an entity * (eg. &, < & etc.) starting at s. Returns NULL on failure.*/ -static const char * -detect_entity(const char *text, int *length) +const char * +purple_markup_detect_entity(const char *text, int *length) { const char *pln; int len, pound; @@ -909,6 +909,67 @@ return pln; } +gchar* +purple_markup_get_css_property(const gchar *style, + const gchar *opt) +{ + const gchar *css_str = style; + const gchar *css_value_start; + const gchar *css_value_end; + gchar *tmp; + gchar *ret; + + if(!css_str) + return NULL; + + /* find the CSS property */ + while(1){ + /* skip widespace characters */ + while(*css_str && g_ascii_isspace(*css_str)) + css_str++; + if(!g_ascii_isalpha(*css_str)) + return NULL; + if(g_ascii_strncasecmp(css_str, opt, strlen(opt))) + { + /* go to next css property positioned after the next ';' */ + while(*css_str && *css_str != '"' && *css_str != ';') + css_str++; + if(*css_str != ';') + return NULL; + css_str++; + } + else break; + } + + /* find the CSS value position in the string */ + css_str += strlen(opt); + while(*css_str && g_ascii_isspace(*css_str)) + css_str++; + if(*css_str != ':') + return NULL; + css_str++; + while(*css_str && g_ascii_isspace(*css_str)) + css_str++; + if(*css_str == '\0' || *css_str == '"' || *css_str == ';') + return NULL; + + /* mark the CSS value */ + css_value_start = css_str; + while(*css_str && *css_str != '"' && *css_str != ';') + css_str++; + css_value_end = css_str - 1; + + /* Removes trailing whitespace */ + while(css_value_end > css_value_start && g_ascii_isspace(*css_value_end)) + css_value_end--; + + tmp = g_strndup(css_value_start, css_value_end - css_value_start + 1); + ret = purple_unescape_html(tmp); + g_free(tmp); + + return ret; +} + gboolean purple_markup_find_tag(const char *needle, const char *haystack, const char **start, const char **end, GData **attributes) @@ -1509,7 +1570,7 @@ const char *pln; int len; - if ((pln = detect_entity(c, &len)) == NULL) { + if ((pln = purple_markup_detect_entity(c, &len)) == NULL) { len = 1; g_snprintf(buf, sizeof(buf), "%c", *c); pln = buf; @@ -1714,7 +1775,7 @@ visible = TRUE; } - if (str2[i] == '&' && (ent = detect_entity(str2 + i, &entlen)) != NULL) + if (str2[i] == '&' && (ent = purple_markup_detect_entity(str2 + i, &entlen)) != NULL) { while (*ent) str2[j++] = *ent++; @@ -2032,7 +2093,7 @@ int len; const char *ent; - if ((ent = detect_entity(c, &len)) != NULL) { + if ((ent = purple_markup_detect_entity(c, &len)) != NULL) { ret = g_string_append(ret, ent); c += len; } else if (!strncmp(c, "<br>", 4)) {