Mercurial > pidgin
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. &, < & 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)) {
