[gnumeric] xlsx: improve object name roundtrip.
- From: Morten Welinder <mortenw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] xlsx: improve object name roundtrip.
- Date: Sat, 9 May 2020 20:19:12 +0000 (UTC)
commit c628b05ebf0a91b5202cbd2d29443756b7e90d11
Author: Morten Welinder <terra gnome org>
Date: Sat May 9 16:18:24 2020 -0400
xlsx: improve object name roundtrip.
Different object types are handled in different parts of the xlsx grammar.
plugins/excel/ChangeLog | 5 +++++
plugins/excel/xlsx-read-drawing.c | 41 +++++++++++++++++++++-----------------
plugins/excel/xlsx-write-drawing.c | 1 +
3 files changed, 29 insertions(+), 18 deletions(-)
---
diff --git a/plugins/excel/ChangeLog b/plugins/excel/ChangeLog
index 746c3eded..c91a7e99a 100644
--- a/plugins/excel/ChangeLog
+++ b/plugins/excel/ChangeLog
@@ -1,3 +1,8 @@
+2020-05-09 Morten Welinder <terra gnome org>
+
+ * xlsx-read-drawing.c (xlsx_read_cnvpr): hook this up for more
+ instances of cNvPr.
+
2020-05-05 Morten Welinder <terra gnome org>
* xlsx-read-drawing.c (xlsx_draw_clientdata): Read sheet object
diff --git a/plugins/excel/xlsx-read-drawing.c b/plugins/excel/xlsx-read-drawing.c
index 586e62027..c033ae809 100644
--- a/plugins/excel/xlsx-read-drawing.c
+++ b/plugins/excel/xlsx-read-drawing.c
@@ -532,6 +532,19 @@ xlsx_draw_clientdata (GsfXMLIn *xin, xmlChar const **attrs)
sheet_object_set_print_flag (state->so, &print);
}
+static void
+xlsx_read_cnvpr (GsfXMLIn *xin, xmlChar const **attrs)
+{
+ XLSXReadState *state = (XLSXReadState *)xin->user_state;
+
+ for (; attrs != NULL && attrs[0] && attrs[1] ; attrs += 2) {
+ if (!strcmp (attrs[0], "name")) {
+ g_free (state->object_name);
+ state->object_name = g_strdup (attrs[1]);
+ }
+ }
+}
+
static GsfXMLInNode const xlsx_chart_drawing_dtd[] =
{
GSF_XML_IN_NODE_FULL (START, START, -1, NULL, GSF_XML_NO_CONTENT, FALSE, TRUE, NULL, NULL, 0),
@@ -545,7 +558,7 @@ GSF_XML_IN_NODE_FULL (START, USER_SHAPES, XL_NS_CHART, "userShapes", GSF_XML_NO_
GSF_XML_IN_NODE_FULL (TO, TO_Y, XL_NS_CHART_DRAW, "y", GSF_XML_CONTENT, FALSE, TRUE, NULL,
&xlsx_user_shape_pos, 3),
GSF_XML_IN_NODE (REL_SIZE_ANCHOR, SHAPE, XL_NS_CHART_DRAW, "sp", GSF_XML_NO_CONTENT, &xlsx_user_shape,
&xlsx_user_shape_end),
GSF_XML_IN_NODE (SHAPE, NV_SP_PR, XL_NS_CHART_DRAW, "nvSpPr", GSF_XML_NO_CONTENT, NULL, NULL),
- GSF_XML_IN_NODE (NV_SP_PR, C_NV_PR, XL_NS_CHART_DRAW, "cNvPr", GSF_XML_NO_CONTENT, NULL, NULL),
+ GSF_XML_IN_NODE (NV_SP_PR, C_NV_PR, XL_NS_CHART_DRAW, "cNvPr", GSF_XML_NO_CONTENT, &xlsx_read_cnvpr,
NULL),
GSF_XML_IN_NODE (NV_SP_PR, C_NV_SP_PR, XL_NS_CHART_DRAW, "cNvSpPr", GSF_XML_NO_CONTENT, NULL, NULL),
GSF_XML_IN_NODE (C_NV_SP_PR, SP_LOCKS, XL_NS_DRAW, "spLocks", GSF_XML_NO_CONTENT, NULL, NULL),
GSF_XML_IN_NODE (C_NV_SP_PR, HLINK_CLICK, XL_NS_DRAW, "hlinkClick", GSF_XML_NO_CONTENT, NULL,
NULL),
@@ -3215,18 +3228,6 @@ xlsx_read_chart (GsfXMLIn *xin, xmlChar const **attrs)
}
}
-static void
-xlsx_cnvpr (GsfXMLIn *xin, xmlChar const **attrs)
-{
- XLSXReadState *state = (XLSXReadState *)xin->user_state;
-
- for (; attrs != NULL && attrs[0] && attrs[1] ; attrs += 2) {
- if (!strcmp (attrs[0], "name")) {
- g_free (state->object_name);
- state->object_name = g_strdup (attrs[1]);
- }
- }
-}
/**************************************************************************/
@@ -3310,8 +3311,12 @@ xlsx_drawing_twoCellAnchor_end (GsfXMLIn *xin, G_GNUC_UNUSED GsfXMLBlob *blob)
state->pending_objects = g_slist_prepend (state->pending_objects, state->so);
- if (state->object_name)
- sheet_object_set_name (state->so, state->object_name);
+ // "xlsx" cannot leave out the name. Treat an
+ // empty name as a missing name
+ sheet_object_set_name (state->so,
+ state->object_name && *state->object_name
+ ? state->object_name
+ : NULL);
}
if (state->cur_style) {
@@ -3580,7 +3585,7 @@ GSF_XML_IN_NODE_FULL (START, DRAWING, XL_NS_SS_DRAW, "wsDr", GSF_XML_NO_CONTENT,
GSF_XML_IN_NODE (SHAPE_PR, CXN_SP, XL_NS_SS_DRAW, "cxnSp", GSF_XML_NO_CONTENT, NULL, NULL),
GSF_XML_IN_NODE (CXN_SP, CXN_SP_PR, XL_NS_SS_DRAW, "nvCxnSpPr", GSF_XML_NO_CONTENT, NULL, NULL),
GSF_XML_IN_NODE (CXN_SP_PR, C_NV_CXN_SP, XL_NS_SS_DRAW, "cNvCxnSpPr", GSF_XML_NO_CONTENT, NULL,
NULL),
- GSF_XML_IN_NODE (CXN_SP_PR, C_NV_PR, XL_NS_SS_DRAW, "cNvPr", GSF_XML_NO_CONTENT, NULL, NULL),
+ GSF_XML_IN_NODE (CXN_SP_PR, C_NV_PR, XL_NS_SS_DRAW, "cNvPr", GSF_XML_NO_CONTENT,
&xlsx_read_cnvpr, NULL),
GSF_XML_IN_NODE (C_NV_PR, HLINK_CLICK, XL_NS_DRAW, "hlinkClick", GSF_XML_NO_CONTENT, NULL,
NULL),
GSF_XML_IN_NODE (CXN_SP, SHAPE_PR, XL_NS_SS_DRAW, "spPr", GSF_XML_NO_CONTENT, NULL, NULL),
GSF_XML_IN_NODE (CXN_SP, SP_XFRM_STYLE, XL_NS_SS_DRAW, "style", GSF_XML_NO_CONTENT, NULL, NULL),
@@ -3594,7 +3599,7 @@ GSF_XML_IN_NODE_FULL (START, DRAWING, XL_NS_SS_DRAW, "wsDr", GSF_XML_NO_CONTENT,
GSF_XML_IN_NODE (TX_BODY, TEXT_PR_P, XL_NS_DRAW, "p", GSF_XML_2ND, NULL, NULL),
GSF_XML_IN_NODE (SHAPE, NV_SP_PR, XL_NS_SS_DRAW, "nvSpPr", GSF_XML_NO_CONTENT, NULL, NULL),
- GSF_XML_IN_NODE (NV_SP_PR, C_NV_PR, XL_NS_SS_DRAW, "cNvPr", GSF_XML_2ND, NULL, NULL),
+ GSF_XML_IN_NODE (NV_SP_PR, C_NV_PR, XL_NS_SS_DRAW, "cNvPr", GSF_XML_2ND, &xlsx_read_cnvpr, NULL),
GSF_XML_IN_NODE (NV_SP_PR, C_NV_SP_PR, XL_NS_SS_DRAW, "cNvSpPr", GSF_XML_NO_CONTENT, NULL, NULL),
GSF_XML_IN_NODE (C_NV_SP_PR, SP_LOCKS, XL_NS_DRAW, "spLocks", GSF_XML_NO_CONTENT, NULL, NULL),
@@ -3609,7 +3614,7 @@ GSF_XML_IN_NODE_FULL (START, DRAWING, XL_NS_SS_DRAW, "wsDr", GSF_XML_NO_CONTENT,
GSF_XML_IN_NODE (TWO_CELL, GRAPHIC_FRAME, XL_NS_SS_DRAW, "graphicFrame", GSF_XML_NO_CONTENT, NULL, NULL),
GSF_XML_IN_NODE (GRAPHIC_FRAME, GRAPHIC_PR, XL_NS_SS_DRAW, "nvGraphicFramePr", GSF_XML_NO_CONTENT,
NULL, NULL),
- GSF_XML_IN_NODE (GRAPHIC_PR, CNVPR, XL_NS_SS_DRAW, "cNvPr", GSF_XML_NO_CONTENT, &xlsx_cnvpr, NULL),
+ GSF_XML_IN_NODE (GRAPHIC_PR, CNVPR, XL_NS_SS_DRAW, "cNvPr", GSF_XML_NO_CONTENT, &xlsx_read_cnvpr,
NULL),
GSF_XML_IN_NODE (GRAPHIC_PR, GRAPHIC_PR_CHILD, XL_NS_SS_DRAW, "cNvGraphicFramePr",
GSF_XML_NO_CONTENT, NULL, NULL),
GSF_XML_IN_NODE (GRAPHIC_PR_CHILD, GRAPHIC_LOCKS, XL_NS_DRAW, "graphicFrameLocks",
GSF_XML_NO_CONTENT, NULL, NULL),
GSF_XML_IN_NODE (GRAPHIC_FRAME, GRAPHIC, XL_NS_DRAW, "graphic", GSF_XML_NO_CONTENT, NULL, NULL),
diff --git a/plugins/excel/xlsx-write-drawing.c b/plugins/excel/xlsx-write-drawing.c
index f063f9fa2..2320a1fbb 100644
--- a/plugins/excel/xlsx-write-drawing.c
+++ b/plugins/excel/xlsx-write-drawing.c
@@ -1441,6 +1441,7 @@ xlsx_write_nvpr (GsfXMLOut *xml, SheetObject *so, int id)
gsf_xml_out_start_element (xml, "xdr:cNvPr");
gsf_xml_out_add_int (xml, "id", id);
g_object_get (so, "name", &tmp, NULL);
+ // attribute "name" is required
gsf_xml_out_add_cstr_unchecked (xml, "name", tmp ? tmp : "");
g_free (tmp);
gsf_xml_out_end_element (xml);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]