[goffice] Add go_pango_attrs_to_markup, partial inverse to pango_parse_markup
- From: Andreas J. Guelzow <guelzow src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [goffice] Add go_pango_attrs_to_markup, partial inverse to pango_parse_markup
- Date: Sat, 12 May 2012 22:56:21 +0000 (UTC)
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]