libpurple/util.c

changeset 16143
6393e5b11ff5
parent 16124
8e5e3e9ada60
child 16144
4e022531d1c9
--- 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. &, < &#38 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)) {

mercurial