diff libpurple/util.c @ 16083:f2a4b05407d7

Patch from shlomil in ticket #78. This fixes RTL text support in MSN, and lays the framework so it could be supported in other prpls as well. As added pluses, shlomil removed some duplicate code and fixed some small related bugs. committer: Richard Laager <rlaager@wiktel.com>
author Shlomi Loubaton <shlomister@gmail.com>
date Fri, 13 Apr 2007 04:13:24 +0000
parents fa8aeab4ca5a
children a5a831a5f186
line wrap: on
line diff
--- 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. &amp;, &lt; &#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)) {