[goffice] Add go_pango_attrs_to_markup, partial inverse to pango_parse_markup



commit 238fbe40eccca25235d4f59453805c69f661d9bf
Author: Andreas J Guelzow <aguelzow pyrshep ca>
Date:   Sat May 12 16:54:36 2012 -0600

    Add go_pango_attrs_to_markup, partial inverse to pango_parse_markup
    
    2012-05-12 Andreas J. Guelzow <aguelzow pyrshep ca>
    
    	* utils/go-pango-extras.c (go_pango_attrs_to_markup): new
    	(go_pango_attr_as_markup_string): new
    	* utils/go-pango-extras.h (go_pango_attrs_to_markup): new

 ChangeLog                       |    6 +
 NEWS                            |    3 +
 goffice/utils/go-pango-extras.c |  260 +++++++++++++++++++++++++++++++++++++++
 goffice/utils/go-pango-extras.h |    2 +
 4 files changed, 271 insertions(+), 0 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 6e677f0..d1e0ba2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2012-05-12 Andreas J. Guelzow <aguelzow pyrshep ca>
+
+	* utils/go-pango-extras.c (go_pango_attrs_to_markup): new
+	(go_pango_attr_as_markup_string): new
+	* utils/go-pango-extras.h (go_pango_attrs_to_markup): new
+
 2012-05-12  Morten Welinder  <terra gnome org>
 
 	* goffice/graph/gog-plot-engine.c
diff --git a/NEWS b/NEWS
index b84ccac..a2e19f5 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,8 @@
 goffice 0.9.4:
 
+Andreas:
+	* Add go_pango_attrs_to_markup, partial inverse to pango_parse_markup
+
 Jean:
 	* Fixed logfit equation typo. [#675560]
 
diff --git a/goffice/utils/go-pango-extras.c b/goffice/utils/go-pango-extras.c
index 05931e5..dbf9c93 100644
--- a/goffice/utils/go-pango-extras.c
+++ b/goffice/utils/go-pango-extras.c
@@ -742,3 +742,263 @@ go_pango_attr_superscript_new (gboolean val)
 
 	return (PangoAttribute *) result;
 }
+
+static int
+go_pango_attr_as_markup_string (PangoAttribute *a, GString *gstr)
+{
+	int spans = 0;
+
+	switch (a->klass->type) {
+	case PANGO_ATTR_FONT_DESC : 
+		{
+			char *str = pango_font_description_to_string 
+				(((PangoAttrFontDesc *)a)->desc);
+			spans += 1;
+			g_string_append_printf (gstr, "<span font_desc=\"%s\">", str);
+			g_free (str);
+		}
+		break;
+	case PANGO_ATTR_FAMILY :
+		spans += 1;
+		g_string_append_printf (gstr, "<span font_family=\"%s\">", 
+					((PangoAttrString *)a)->value);
+		break;
+	case PANGO_ATTR_ABSOLUTE_SIZE :
+	case PANGO_ATTR_SIZE :
+		spans += 1;
+		g_string_append_printf (gstr, "<span font_size=\"%i\">", 
+					((PangoAttrSize *)a)->size);
+		break;
+	case PANGO_ATTR_RISE:
+		spans += 1;
+		g_string_append_printf (gstr, "<span rise=\"%i\">", 
+					((PangoAttrInt *)a)->value);
+		break;
+	case PANGO_ATTR_STYLE :
+		spans += 1;
+		switch (((PangoAttrInt *)a)->value) {
+		case PANGO_STYLE_ITALIC:
+			g_string_append (gstr, "<span font_style=\"italic\">");
+			break;
+		case PANGO_STYLE_OBLIQUE:
+			g_string_append (gstr, "<span font_style=\"oblique\">");
+			break;
+		case PANGO_STYLE_NORMAL:
+		default:
+			g_string_append (gstr, "<span font_style=\"normal\">");
+			break;
+		}		
+		break;
+	case PANGO_ATTR_WEIGHT :
+		spans += 1;
+		g_string_append_printf (gstr, "<span font_weight=\"%i\">", 
+					((PangoAttrInt *)a)->value);
+	break;
+	case PANGO_ATTR_STRIKETHROUGH :
+		spans += 1;
+		if (((PangoAttrInt *)a)->value)
+			g_string_append (gstr, "<span strikethrough=\"true\">");
+		else
+			g_string_append (gstr, "<span strikethrough=\"false\">");
+		break;
+	case PANGO_ATTR_UNDERLINE :
+		spans += 1;
+		switch (((PangoAttrInt *)a)->value) {
+		case PANGO_UNDERLINE_SINGLE:
+			g_string_append (gstr, "<span underline=\"single\">");
+			break;
+		case PANGO_UNDERLINE_DOUBLE:
+			g_string_append (gstr, "<span underline=\"double\">");
+			break;
+		case PANGO_UNDERLINE_LOW:
+			g_string_append (gstr, "<span underline=\"low\">");
+			break;
+		case PANGO_UNDERLINE_ERROR:
+			g_string_append (gstr, "<span underline=\"error\">");
+			break;
+		case PANGO_UNDERLINE_NONE:
+		default:
+			g_string_append (gstr, "<span underline=\"none\">");
+			break;
+		}		
+		break;
+	case PANGO_ATTR_LANGUAGE :
+		spans += 1;
+		g_string_append_printf (gstr, "<span lang=\"%s\">", 
+					pango_language_to_string (((PangoAttrLanguage *)a)->value));
+		break;
+	case PANGO_ATTR_VARIANT :
+		spans += 1;
+		if (((PangoAttrInt *)a)->value == PANGO_VARIANT_NORMAL)
+			g_string_append (gstr, "<span font_variant=\"normal\">");
+		else
+			g_string_append (gstr, "<span font_variant=\"smallcaps\">");
+		break;
+	case PANGO_ATTR_LETTER_SPACING :
+		spans += 1;
+		g_string_append_printf (gstr, "<span letter_spacing=\"%i\">", 
+					((PangoAttrInt *)a)->value);
+		break;
+	case PANGO_ATTR_FALLBACK :
+		spans += 1;
+		if (((PangoAttrInt *)a)->value)
+			g_string_append (gstr, "<span fallback=\"true\">");
+		else
+			g_string_append (gstr, "<span fallback=\"false\">");
+		break;
+	case PANGO_ATTR_STRETCH :
+		spans += 1;
+		switch (((PangoAttrInt *)a)->value) {
+		case PANGO_STRETCH_ULTRA_CONDENSED:
+			g_string_append (gstr, "<span font_stretch=\"ultracondensed\">");
+			break;
+		case PANGO_STRETCH_EXTRA_CONDENSED:
+			g_string_append (gstr, "<span font_stretch=\"extracondensed\">");
+			break;
+		case PANGO_STRETCH_CONDENSED:
+			g_string_append (gstr, "<span font_stretch=\"condensed\">");
+			break;
+		case PANGO_STRETCH_SEMI_CONDENSED:
+			g_string_append (gstr, "<span font_stretch=\"semicondensed\">");
+			break;
+		case PANGO_STRETCH_SEMI_EXPANDED:
+			g_string_append (gstr, "<span font_stretch=\"semiexpanded\">");
+			break;
+		case PANGO_STRETCH_EXPANDED:
+			g_string_append (gstr, "<span font_stretch=\"expanded\">");
+			break;
+		case PANGO_STRETCH_EXTRA_EXPANDED:
+			g_string_append (gstr, "<span font_stretch=\"extraexpanded\">");
+			break;
+		case PANGO_STRETCH_ULTRA_EXPANDED:
+			g_string_append (gstr, "<span font_stretch=\"ultraexpanded\">");
+			break;
+		case PANGO_STRETCH_NORMAL:
+		default:
+			g_string_append (gstr, "<span font_stretch=\"normal\">");
+			break;
+		}		
+		break;
+	case PANGO_ATTR_GRAVITY :
+		spans += 1;
+		switch (((PangoAttrInt *)a)->value) {
+		case PANGO_GRAVITY_SOUTH:
+			g_string_append (gstr, "<span gravity=\"south\">");
+			break;
+		case PANGO_GRAVITY_EAST:
+			g_string_append (gstr, "<span gravity=\"east\">");
+			break;
+		case PANGO_GRAVITY_NORTH:
+			g_string_append (gstr, "<span gravity=\"north\">");
+			break;
+		case PANGO_GRAVITY_WEST:
+			g_string_append (gstr, "<span gravity=\"west\">");
+			break;
+		case PANGO_GRAVITY_AUTO:
+		default:
+			g_string_append (gstr, "<span gravity=\"auto\">");
+			break;
+		}		
+		break;
+	case PANGO_ATTR_GRAVITY_HINT :
+		spans += 1;
+		switch (((PangoAttrInt *)a)->value) {
+		case PANGO_GRAVITY_HINT_LINE:
+			g_string_append (gstr, "<span gravity_hint=\"line\">");
+			break;
+		case PANGO_GRAVITY_HINT_STRONG:
+			g_string_append (gstr, "<span gravity_hint=\"strong\">");
+			break;
+		case PANGO_GRAVITY_HINT_NATURAL:
+		default:
+			g_string_append (gstr, "<span gravity_hint=\"natural\">");
+			break;
+		}		
+		break;
+		
+	case PANGO_ATTR_FOREGROUND :
+		{
+			PangoColor *color = &((PangoAttrColor *)a)->color;
+			spans += 1;
+			g_string_append_printf (gstr, "<span foreground=\"#%02X%02X%02X\">",
+						color->red, color->green, color->blue);
+		}
+		break;
+	case PANGO_ATTR_BACKGROUND :
+		{
+			PangoColor *color = &((PangoAttrColor *)a)->color;
+			spans += 1;
+			g_string_append_printf (gstr, "<span background=\"#%02X%02X%02X\">",
+						color->red, color->green, color->blue);
+		}
+		break;
+	case PANGO_ATTR_UNDERLINE_COLOR :
+		{
+			PangoColor *color = &((PangoAttrColor *)a)->color;
+			spans += 1;
+			g_string_append_printf (gstr, "<span underline_color=\"#%02X%02X%02X\">",
+						color->red, color->green, color->blue);
+		}
+		break;
+	case PANGO_ATTR_STRIKETHROUGH_COLOR :
+		{
+			PangoColor *color = &((PangoAttrColor *)a)->color;
+			spans += 1;
+			g_string_append_printf (gstr, "<span strikethrough_color=\"#%02X%02X%02X\">",
+						color->red, color->green, color->blue);
+		}
+		break;
+
+	case PANGO_ATTR_SCALE :
+	case PANGO_ATTR_SHAPE :
+	default :
+		break; /* ignored */
+	}
+
+	return spans;
+}
+
+char *
+go_pango_attrs_to_markup (PangoAttrList *attrs, char const *text)
+{
+	PangoAttrIterator * iter;
+	int handled = 0;
+	int from, to;
+	int len;
+	GString *gstr;
+
+	if (text == NULL)
+		return NULL;
+	if (attrs == NULL || go_pango_attr_list_is_empty (attrs))
+		return g_strdup (text);
+
+	len = strlen (text);
+	gstr = g_string_sized_new (len + 1);
+
+	iter = pango_attr_list_get_iterator (attrs);
+	do {
+		GSList *list, *l;
+		int spans = 0;
+
+		pango_attr_iterator_range (iter, &from, &to);
+		to = (to > len) ? len : to;       /* Since "to" can be really big! */
+		from = (from > len) ? len : from; /* Since "from" can also be really big! */
+		if (from > handled)
+			g_string_append_len (gstr, text + handled, from - handled);
+		list = pango_attr_iterator_get_attrs (iter);
+		for (l = list; l != NULL; l = l->next)
+			spans += go_pango_attr_as_markup_string (l->data, gstr);
+		g_slist_free (list);
+		if (to > from)
+			g_string_append_len (gstr, text + from, to - from);
+		while (spans-- > 0)
+			g_string_append (gstr, "</span>");
+		handled = to;
+	} while (pango_attr_iterator_next (iter));
+
+	pango_attr_iterator_destroy (iter);
+
+	return g_string_free (gstr, FALSE);
+}
+
+
diff --git a/goffice/utils/go-pango-extras.h b/goffice/utils/go-pango-extras.h
index f318639..6e0b3b9 100644
--- a/goffice/utils/go-pango-extras.h
+++ b/goffice/utils/go-pango-extras.h
@@ -41,6 +41,8 @@ PangoAttribute *go_pango_attr_superscript_new (gboolean val);
 PangoAttrType go_pango_attr_subscript_get_type (void);
 PangoAttrType go_pango_attr_superscript_get_type (void);
 
+char *go_pango_attrs_to_markup (PangoAttrList *attrs, char const *text);
+
 
 
 G_END_DECLS



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]