#include "output/pivot-table.h"
+#include <libxml/parser.h>
+#include <libxml/tree.h>
#include <math.h>
#include <stdlib.h>
return table;
}
-static char *
-xstrdup_if_nonnull (const char *s)
-{
- return s ? xstrdup (s) : NULL;
-}
-
static struct pivot_table_sizing
clone_sizing (const struct pivot_table_sizing *s)
{
: global_show);
}
+/* Appends to OUT the actual text content from the given Pango MARKUP. */
+static void
+get_text_from_markup (const char *markup, struct string *out)
+{
+ xmlParserCtxt *parser = xmlCreatePushParserCtxt (NULL, NULL, NULL, 0, NULL);
+ if (!parser)
+ {
+ ds_put_cstr (out, markup);
+ return;
+ }
+
+ xmlParseChunk (parser, "<xml>", strlen ("<xml>"), false);
+ xmlParseChunk (parser, markup, strlen (markup), false);
+ xmlParseChunk (parser, "</xml>", strlen ("</xml>"), true);
+
+ if (parser->wellFormed)
+ {
+ xmlChar *s = xmlNodeGetContent (xmlDocGetRootElement (parser->myDoc));
+ ds_put_cstr (out, CHAR_CAST (char *, s));
+ xmlFree (s);
+ }
+ else
+ ds_put_cstr (out, markup);
+ xmlFreeDoc (parser->myDoc);
+ xmlFreeParserCtxt (parser);
+}
+
/* Appends a text representation of the body of VALUE to OUT. Settings on
PT control whether variable and value labels are included.
break;
case PIVOT_VALUE_TEXT:
- ds_put_cstr (out, value->text.local);
+ if (value->font_style && value->font_style->markup)
+ get_text_from_markup (value->text.local, out);
+ else
+ ds_put_cstr (out, value->text.local);
break;
case PIVOT_VALUE_TEMPLATE:
static const struct pivot_table pt = {
.show_values = SETTINGS_VALUE_SHOW_DEFAULT,
.show_variables = SETTINGS_VALUE_SHOW_DEFAULT,
+ .settings = FMT_SETTINGS_INIT,
};
return pivot_value_to_string (value, &pt);
}
v->footnote_indexes = xrealloc (
v->footnote_indexes, (v->n_footnotes + 1) * sizeof *v->footnote_indexes);
v->footnote_indexes[v->n_footnotes++] = footnote->idx;
+ pivot_value_sort_footnotes (v);
+}
+
+static int
+compare_footnote_indexes (const void *a_, const void *b_)
+{
+ const size_t *ap = a_;
+ const size_t *bp = b_;
+ size_t a = *ap;
+ size_t b = *bp;
+ return a < b ? -1 : a > b;
+}
+
+/* Sorts the footnote references in V in the standard ascending order.
+
+ This is only necessary if code adds (plural) footnotes to a pivot_value by
+ itself, because pivot_value_add_footnote() does it automatically. */
+void
+pivot_value_sort_footnotes (struct pivot_value *v)
+{
+ if (v->n_footnotes > 1)
+ qsort (v->footnote_indexes, v->n_footnotes, sizeof *v->footnote_indexes,
+ compare_footnote_indexes);
}
/* If VALUE is a numeric value, and RC is a result class such as