[gnumeric] Speed up loading of some ODF files. [#704422]



commit a8fffc087a409ccfd6f5ad283a412a0c3931c649
Author: Andreas J Guelzow <aguelzow pyrshep ca>
Date:   Fri Jul 19 19:52:12 2013 -0600

    Speed up loading of some ODF files. [#704422]
    
    2013-07-19  Andreas J. Guelzow <aguelzow pyrshep ca>
    
        * openoffice-read.c (oo_table_start): depends on a preparse
        (odf_preparse_table_start): new
        (odf_sheet_suggest_size): new
        (odf_preparse_table_end): new
        (odf_preparse_row_start): new
        (odf_preparse_row_end): new
        (odf_preparse_cell_start): new
        (odf_preparse_covered_cell_start): new
        (opendoc_content_preparse_dtd): new
        (openoffice_file_open): preparse content.xml to create sheets of the
        proper size.

 NEWS                                 |    1 +
 plugins/openoffice/ChangeLog         |   14 +
 plugins/openoffice/openoffice-read.c |  503 +++++++++++++++++++++++++++++-----
 3 files changed, 453 insertions(+), 65 deletions(-)
---
diff --git a/NEWS b/NEWS
index 5593964..7267238 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,7 @@ Andreas:
        * Export custom shapes. [#704421]
        * Fix export to ODF of empty cells with default column styles. [#704563]
        * Improve import to ODF of empty cells with default column styles. [#704563]
+       * Speed up loading of some ODF files. [#704422]
 
 Jean:
        * Fix text wrap inside sheet objects. [#704417]
diff --git a/plugins/openoffice/ChangeLog b/plugins/openoffice/ChangeLog
index 2ba843c..0e171cc 100644
--- a/plugins/openoffice/ChangeLog
+++ b/plugins/openoffice/ChangeLog
@@ -1,5 +1,19 @@
 2013-07-19  Andreas J. Guelzow <aguelzow pyrshep ca>
 
+       * openoffice-read.c (oo_table_start): depends on a preparse
+       (odf_preparse_table_start): new
+       (odf_sheet_suggest_size): new
+       (odf_preparse_table_end): new
+       (odf_preparse_row_start): new
+       (odf_preparse_row_end): new
+       (odf_preparse_cell_start): new
+       (odf_preparse_covered_cell_start): new
+       (opendoc_content_preparse_dtd): new
+       (openoffice_file_open): preparse content.xml to create sheets of the
+       proper size.
+
+2013-07-19  Andreas J. Guelzow <aguelzow pyrshep ca>
+
        * openoffice-write.c (oo_table_end): just look at the data extent to
        adjust styles
        (oo_update_style_extent): delete and remove all calls
diff --git a/plugins/openoffice/openoffice-read.c b/plugins/openoffice/openoffice-read.c
index c609dbb..6ac5d96 100644
--- a/plugins/openoffice/openoffice-read.c
+++ b/plugins/openoffice/openoffice-read.c
@@ -381,6 +381,7 @@ struct  _OOParseState {
        OOChartInfo      chart;
        GSList          *chart_list; /* object_offset_t */
        GnmParsePos      pos;
+       int              table_n;
        GnmCellPos       extent_data;
        GnmComment      *cell_comment;
        GnmCell         *curr_cell;
@@ -464,7 +465,7 @@ struct  _OOParseState {
                int               rep_cols_to;
        } print;
 
-       char const *object_name;
+       char *object_name; /* also used for table during preparsing */
        OOControl *cur_control;
 
        OOSettings settings;
@@ -2195,10 +2196,8 @@ odf_pi_parse_expressions (GsfXMLIn *xin, PrintInformation *pi)
 static void
 oo_table_start (GsfXMLIn *xin, xmlChar const **attrs)
 {
-       /* <table:table table:name="Result" table:style-name="ta1"> */
        OOParseState *state = (OOParseState *)xin->user_state;
        gchar *style_name = NULL;
-       gchar *table_name = NULL;
        gchar *print_range = NULL;
        gboolean do_not_print = FALSE, tmp_b;
 
@@ -2212,65 +2211,17 @@ oo_table_start (GsfXMLIn *xin, xmlChar const **attrs)
        state->print.rep_cols_to = -1;
 
        for (; attrs != NULL && attrs[0] && attrs[1] ; attrs += 2)
-               if (gsf_xml_in_namecmp (xin, CXML2C (attrs[0]), OO_NS_TABLE, "name")) {
-                       table_name = g_strdup (CXML2C (attrs[1]));
-               } else if (gsf_xml_in_namecmp (xin, CXML2C (attrs[0]), OO_NS_TABLE, "style-name"))  {
+               /* We need not check for the table name since we did that during pre-parsing */
+               /* if (gsf_xml_in_namecmp (xin, CXML2C (attrs[0]), OO_NS_TABLE, "name")) { */
+               if (gsf_xml_in_namecmp (xin, CXML2C (attrs[0]), OO_NS_TABLE, "style-name"))  {
                        style_name = g_strdup (CXML2C (attrs[1]));
                } else if (gsf_xml_in_namecmp (xin, CXML2C (attrs[0]), OO_NS_TABLE, "print-ranges"))  {
                        print_range = g_strdup (CXML2C (attrs[1]));
                } else if (oo_attr_bool (xin, attrs, OO_NS_TABLE, "print", &tmp_b))
                        do_not_print = !tmp_b;
 
-       if (table_name != NULL) {
-               state->pos.sheet = workbook_sheet_by_name (state->pos.wb, table_name);
-               if (NULL == state->pos.sheet) {
-                       state->pos.sheet = sheet_new (state->pos.wb, table_name, 256, 65536);
-                       workbook_sheet_attach (state->pos.wb, state->pos.sheet);
-               } else {
-                       /* We either have a corrupted file with a duplicate */
-                       /* sheet name or the sheet was created implicitly.  */
-                       if (NULL != g_slist_find (state->sheet_order, state->pos.sheet)) {
-                               /* corrupted file! */
-                               char *new_name, *base;
-
-                               base = g_strdup_printf (_("%s_IN_CORRUPTED_FILE"), table_name);
-                               new_name =  workbook_sheet_get_free_name (state->pos.wb,
-                                                          base, FALSE, FALSE);
-                               g_free (base);
-
-                               oo_warning (xin, _("This file is corrupted with a "
-                                                  "duplicate sheet name \"%s\", "
-                                                  "now renamed to \"%s\"."),
-                                           table_name, new_name);
-                               state->pos.sheet = sheet_new (state->pos.wb, new_name,
-                                                             gnm_conf_get_core_workbook_n_cols (),
-                                                             gnm_conf_get_core_workbook_n_rows ());
-                               workbook_sheet_attach (state->pos.wb, state->pos.sheet);
-                               g_free (new_name);
-                       }
-               }
-       } else {
-               table_name = workbook_sheet_get_free_name (state->pos.wb,
-                                                          _("SHEET_IN_CORRUPTED_FILE"),
-                                                          TRUE, FALSE);
-               state->pos.sheet = sheet_new (state->pos.wb, table_name,
-                                             gnm_conf_get_core_workbook_n_cols (),
-                                             gnm_conf_get_core_workbook_n_rows ());
-               workbook_sheet_attach (state->pos.wb, state->pos.sheet);
-
-               /* We are missing the table name. This is bad! */
-               oo_warning (xin, _("This file is corrupted with an "
-                                  "unnamed sheet "
-                                  "now named \"%s\"."),
-                           table_name);
-       }
-
-       g_free (table_name);
-
-       /* Store sheets in correct order in case we implicitly
-        * created one out of order */
-       state->sheet_order = g_slist_prepend
-               (state->sheet_order, state->pos.sheet);
+       state->pos.sheet = g_slist_nth_data (state->sheet_order, state->table_n);
+       ++state->table_n;
 
        if (style_name != NULL) {
                OOSheetStyle const *style = g_hash_table_lookup (state->styles.sheet, style_name);
@@ -10449,6 +10400,154 @@ oo_marker (GsfXMLIn *xin, xmlChar const **attrs)
 
 }
 
+/****************** These are the preparse functions ***********************/
+
+
+static void
+odf_preparse_table_start (GsfXMLIn *xin, xmlChar const **attrs)
+{
+       OOParseState *state = (OOParseState *)xin->user_state;
+
+       state->pos.eval.col = 0;
+       state->pos.eval.row = 0;
+       state->extent_data.col = 0;
+       state->extent_data.row = 0;
+       state->object_name = NULL;
+
+       for (; attrs != NULL && attrs[0] && attrs[1] ; attrs += 2)
+               if (gsf_xml_in_namecmp (xin, CXML2C (attrs[0]), OO_NS_TABLE, "name"))
+                       state->object_name = g_strdup (CXML2C (attrs[1]));
+}
+
+static void
+odf_sheet_suggest_size (GsfXMLIn *xin, int *cols, int *rows)
+{
+       int c = GNM_MIN_COLS;
+       int r = GNM_MIN_ROWS;
+
+       while (c < *cols && c < GNM_MAX_COLS)
+               c *= 2;
+
+       while (r < *rows && r < GNM_MAX_ROWS)
+               r *= 2;
+
+       while (!gnm_sheet_valid_size (c, r))
+               gnm_sheet_suggest_size (&c, &r);
+
+       if (*cols > c || *rows > r)
+               oo_warning (xin, _("The sheet size of %i columns and %i rows used in this file "
+                             "exceeds Gnumeric's maximum supported sheet size"), *cols, *rows);
+
+       *cols = c;
+       *rows = r;
+}
+
+
+static void
+odf_preparse_table_end (GsfXMLIn *xin, G_GNUC_UNUSED GsfXMLBlob *blob)
+{
+       OOParseState *state = (OOParseState *)xin->user_state;
+       int rows, cols;
+       char *table_name = state->object_name;
+       Sheet *sheet;
+
+       cols = state->extent_data.col + 1;
+       rows = state->extent_data.row + 1;
+       odf_sheet_suggest_size (xin, &cols, &rows);
+
+       if (table_name != NULL) {
+               sheet = workbook_sheet_by_name (state->pos.wb, table_name);
+               if (NULL == sheet) {
+                       sheet = sheet_new (state->pos.wb, table_name, cols, rows);
+                       workbook_sheet_attach (state->pos.wb, sheet);
+               } else {
+                       /* We have a corrupted file with a duplicate sheet name */
+                       char *new_name, *base;
+
+                       base = g_strdup_printf (_("%s_IN_CORRUPTED_FILE"), table_name);
+                       new_name =  workbook_sheet_get_free_name (state->pos.wb,
+                                                                 base, FALSE, FALSE);
+                       g_free (base);
+
+                       oo_warning (xin, _("This file is corrupted with a "
+                                          "duplicate sheet name \"%s\", "
+                                          "now renamed to \"%s\"."),
+                                   table_name, new_name);
+                       sheet = sheet_new (state->pos.wb, new_name, cols, rows);
+                       workbook_sheet_attach (state->pos.wb, sheet);
+                       g_free (new_name);
+               }
+       } else {
+               table_name = workbook_sheet_get_free_name (state->pos.wb,
+                                                          _("SHEET_IN_CORRUPTED_FILE"),
+                                                          TRUE, FALSE);
+               sheet = sheet_new (state->pos.wb, table_name, cols, rows);
+               workbook_sheet_attach (state->pos.wb, sheet);
+
+               /* We are missing the table name. This is bad! */
+               oo_warning (xin, _("This file is corrupted with an "
+                                  "unnamed sheet "
+                                  "now named \"%s\"."),
+                           table_name);
+       }
+       g_free (table_name);
+       state->object_name = NULL;
+
+       /* Store sheets in correct order in case we implicitly
+        * created one out of order */
+       state->sheet_order = g_slist_prepend
+               (state->sheet_order, sheet);
+}
+
+
+static void
+odf_preparse_row_start (GsfXMLIn *xin, xmlChar const **attrs)
+{
+       OOParseState *state = (OOParseState *)xin->user_state;
+
+       state->pos.eval.col = 0;
+       state->row_inc = 1;
+
+       for (; attrs != NULL && attrs[0] && attrs[1] ; attrs += 2)
+               if (oo_attr_int_range (xin, attrs, OO_NS_TABLE, "number-rows-repeated", &state->row_inc, 0, 
INT_MAX));
+}
+
+static void
+odf_preparse_row_end (GsfXMLIn *xin, G_GNUC_UNUSED GsfXMLBlob *blob)
+{
+       OOParseState *state = (OOParseState *)xin->user_state;
+       state->pos.eval.row += state->row_inc;
+}
+
+static void
+odf_preparse_cell_start (GsfXMLIn *xin, xmlChar const **attrs)
+{
+       OOParseState *state = (OOParseState *)xin->user_state;
+
+       state->col_inc = 1;
+
+       for (; attrs != NULL && attrs[0] && attrs[1] ; attrs += 2) 
+               if (oo_attr_int_range (xin, attrs, OO_NS_TABLE, "number-columns-repeated",
+                                      &state->col_inc, 0, INT_MAX));
+
+       oo_update_data_extent (state, state->col_inc, state->row_inc);
+       state->pos.eval.col += state->col_inc;
+}
+
+static void
+odf_preparse_covered_cell_start (GsfXMLIn *xin, xmlChar const **attrs)
+{
+       OOParseState *state = (OOParseState *)xin->user_state;
+
+       state->col_inc = 1;
+       for (; attrs != NULL && attrs[0] && attrs[1] ; attrs += 2)
+               if (oo_attr_int_range (xin, attrs, OO_NS_TABLE, "number-columns-repeated",
+                                      &state->col_inc, 0, INT_MAX));
+       state->pos.eval.col += state->col_inc;  
+}
+
+
+
 /**************************************************************************/
 
 static void
@@ -11010,6 +11109,272 @@ static GsfXMLInNode const opendoc_content_dtd [] =
 GSF_XML_IN_NODE_END
 };
 
+static GsfXMLInNode const opendoc_content_preparse_dtd [] =
+{
+       GSF_XML_IN_NODE_FULL (START, START, -1, NULL, GSF_XML_NO_CONTENT, FALSE, TRUE, NULL, NULL, 0),
+       GSF_XML_IN_NODE (START, OFFICE, OO_NS_OFFICE, "document-content", GSF_XML_NO_CONTENT, NULL, NULL),
+         GSF_XML_IN_NODE (OFFICE, SCRIPT, OO_NS_OFFICE, "scripts", GSF_XML_NO_CONTENT, NULL, NULL),
+         GSF_XML_IN_NODE (OFFICE, OFFICE_FONTS, OO_NS_OFFICE, "font-face-decls", GSF_XML_NO_CONTENT, NULL, 
NULL),
+           GSF_XML_IN_NODE (OFFICE_FONTS, FONT_FACE, OO_NS_STYLE, "font-face", GSF_XML_NO_CONTENT, NULL, 
NULL),
+         GSF_XML_IN_NODE (OFFICE, OFFICE_STYLES, OO_NS_OFFICE, "automatic-styles", GSF_XML_NO_CONTENT, NULL, 
NULL),
+           GSF_XML_IN_NODE (OFFICE_STYLES, STYLE, OO_NS_STYLE, "style", GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (STYLE, TABLE_CELL_PROPS, OO_NS_STYLE, "table-cell-properties", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (STYLE, TABLE_COL_PROPS, OO_NS_STYLE, "table-column-properties", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (STYLE, TABLE_ROW_PROPS, OO_NS_STYLE, "table-row-properties", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (STYLE, CHART_PROPS, OO_NS_STYLE, "chart-properties", GSF_XML_NO_CONTENT, NULL, 
NULL),
+             GSF_XML_IN_NODE (STYLE, TEXT_PROPS, OO_NS_STYLE, "text-properties", GSF_XML_NO_CONTENT, NULL, 
NULL),
+             GSF_XML_IN_NODE (STYLE, TABLE_PROPS, OO_NS_STYLE, "table-properties", GSF_XML_NO_CONTENT, NULL, 
NULL),
+             GSF_XML_IN_NODE (STYLE, PARAGRAPH_PROPS, OO_NS_STYLE, "paragraph-properties", 
GSF_XML_NO_CONTENT, NULL, NULL),
+               GSF_XML_IN_NODE (PARAGRAPH_PROPS, PARA_TABS, OO_NS_STYLE,  "tab-stops", GSF_XML_NO_CONTENT, 
NULL, NULL),
+             GSF_XML_IN_NODE (STYLE, GRAPHIC_PROPS, OO_NS_STYLE, "graphic-properties", GSF_XML_NO_CONTENT, 
NULL, NULL),
+             GSF_XML_IN_NODE (STYLE, STYLE_MAP, OO_NS_STYLE, "map", GSF_XML_NO_CONTENT, NULL, NULL),
+           GSF_XML_IN_NODE (OFFICE_STYLES, NUMBER_STYLE, OO_NS_NUMBER, "number-style", GSF_XML_NO_CONTENT, 
NULL, NULL),
+             GSF_XML_IN_NODE (NUMBER_STYLE, NUMBER_STYLE_NUMBER, OO_NS_NUMBER,   "number", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                 GSF_XML_IN_NODE (NUMBER_STYLE_NUMBER, NUMBER_EMBEDDED_TEXT, OO_NS_NUMBER, "embedded-text", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (NUMBER_STYLE, NUMBER_STYLE_TEXT, OO_NS_NUMBER,     "text", GSF_XML_NO_CONTENT, 
NULL, NULL),
+             GSF_XML_IN_NODE (NUMBER_STYLE, NUMBER_STYLE_FRACTION, OO_NS_NUMBER, "fraction", 
GSF_XML_NO_CONTENT,  NULL, NULL),
+             GSF_XML_IN_NODE (NUMBER_STYLE, NUMBER_SCI_STYLE_PROP, OO_NS_NUMBER, "scientific-number", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (NUMBER_STYLE, NUMBER_MAP, OO_NS_STYLE,             "map", GSF_XML_NO_CONTENT, 
NULL, NULL),
+              GSF_XML_IN_NODE (NUMBER_STYLE, NUMBER_TEXT_PROP, OO_NS_STYLE,    "text-properties", 
GSF_XML_NO_CONTENT, NULL, NULL),
+           GSF_XML_IN_NODE (OFFICE_STYLES, DATE_STYLE, OO_NS_NUMBER, "date-style", GSF_XML_NO_CONTENT, NULL, 
NULL),
+             GSF_XML_IN_NODE (DATE_STYLE, DATE_DAY, OO_NS_NUMBER,              "day", GSF_XML_NO_CONTENT,    
  NULL, NULL),
+             GSF_XML_IN_NODE (DATE_STYLE, DATE_MONTH, OO_NS_NUMBER,            "month", GSF_XML_NO_CONTENT,  
  NULL, NULL),
+             GSF_XML_IN_NODE (DATE_STYLE, DATE_YEAR, OO_NS_NUMBER,             "year", GSF_XML_NO_CONTENT,   
  NULL, NULL),
+             GSF_XML_IN_NODE (DATE_STYLE, DATE_ERA, OO_NS_NUMBER,              "era", GSF_XML_NO_CONTENT,    
  NULL, NULL),
+             GSF_XML_IN_NODE (DATE_STYLE, DATE_DAY_OF_WEEK, OO_NS_NUMBER,      "day-of-week", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (DATE_STYLE, DATE_WEEK_OF_YEAR, OO_NS_NUMBER,     "week-of-year", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (DATE_STYLE, DATE_QUARTER, OO_NS_NUMBER,          "quarter", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (DATE_STYLE, DATE_HOURS, OO_NS_NUMBER,            "hours", GSF_XML_NO_CONTENT,  
  NULL, NULL),
+             GSF_XML_IN_NODE (DATE_STYLE, DATE_MINUTES, OO_NS_NUMBER,          "minutes", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (DATE_STYLE, DATE_SECONDS, OO_NS_NUMBER,          "seconds", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (DATE_STYLE, DATE_AM_PM, OO_NS_NUMBER,            "am-pm", GSF_XML_NO_CONTENT,  
  NULL, NULL),
+             GSF_XML_IN_NODE (DATE_STYLE, DATE_TEXT, OO_NS_NUMBER,             "text", GSF_XML_NO_CONTENT,   
  NULL, NULL),
+             GSF_XML_IN_NODE (DATE_STYLE, DATE_TEXT_PROP, OO_NS_STYLE,         "text-properties", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (DATE_STYLE, DATE_MAP, OO_NS_STYLE,               "map", GSF_XML_NO_CONTENT, 
NULL, NULL),
+           GSF_XML_IN_NODE (OFFICE_STYLES, TIME_STYLE, OO_NS_NUMBER,   "time-style", GSF_XML_NO_CONTENT, 
NULL, NULL),
+             GSF_XML_IN_NODE (TIME_STYLE, TIME_HOURS, OO_NS_NUMBER,    "hours", GSF_XML_NO_CONTENT,    NULL, 
NULL),
+             GSF_XML_IN_NODE (TIME_STYLE, TIME_MINUTES, OO_NS_NUMBER,  "minutes", GSF_XML_NO_CONTENT, NULL, 
NULL),
+             GSF_XML_IN_NODE (TIME_STYLE, TIME_SECONDS, OO_NS_NUMBER,  "seconds", GSF_XML_NO_CONTENT, NULL, 
NULL),
+             GSF_XML_IN_NODE (TIME_STYLE, TIME_AM_PM, OO_NS_NUMBER,    "am-pm", GSF_XML_NO_CONTENT,    NULL, 
NULL),
+             GSF_XML_IN_NODE (TIME_STYLE, TIME_TEXT, OO_NS_NUMBER,     "text", GSF_XML_NO_CONTENT,     NULL, 
NULL),
+             GSF_XML_IN_NODE (TIME_STYLE, TIME_TEXT_PROP, OO_NS_STYLE, "text-properties", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (TIME_STYLE, TIME_MAP, OO_NS_STYLE,       "map", GSF_XML_NO_CONTENT, NULL, 
NULL),
+           GSF_XML_IN_NODE (OFFICE_STYLES, STYLE_BOOL, OO_NS_NUMBER,   "boolean-style", GSF_XML_NO_CONTENT, 
NULL, NULL),
+             GSF_XML_IN_NODE (STYLE_BOOL, BOOL_PROP, OO_NS_NUMBER,     "boolean", GSF_XML_NO_CONTENT, NULL, 
NULL),
+           GSF_XML_IN_NODE (OFFICE_STYLES, STYLE_CURRENCY, OO_NS_NUMBER,       "currency-style", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (STYLE_CURRENCY, CURRENCY_STYLE, OO_NS_NUMBER,    "number", GSF_XML_NO_CONTENT, 
NULL, NULL),
+             GSF_XML_IN_NODE (STYLE_CURRENCY, CURRENCY_STYLE_PROP, OO_NS_STYLE,"properties", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (STYLE_CURRENCY, CURRENCY_MAP, OO_NS_STYLE,       "map", GSF_XML_NO_CONTENT, 
NULL, NULL),
+             GSF_XML_IN_NODE (STYLE_CURRENCY, CURRENCY_SYMBOL, OO_NS_NUMBER,   "currency-symbol", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (STYLE_CURRENCY, CURRENCY_TEXT, OO_NS_NUMBER,     "text", GSF_XML_NO_CONTENT, 
NULL, NULL),
+             GSF_XML_IN_NODE (STYLE_CURRENCY, CURRENCY_TEXT_PROP, OO_NS_STYLE, "text-properties", 
GSF_XML_NO_CONTENT, NULL, NULL),
+           GSF_XML_IN_NODE (OFFICE_STYLES, STYLE_PERCENTAGE, OO_NS_NUMBER, "percentage-style", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (STYLE_PERCENTAGE, PERCENTAGE_STYLE_PROP, OO_NS_NUMBER,   "number", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (STYLE_PERCENTAGE, PERCENTAGE_TEXT, OO_NS_NUMBER,         "text", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (STYLE_PERCENTAGE, PERCENTAGE_MAP, OO_NS_STYLE,           "map", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (STYLE_PERCENTAGE, PERCENTAGE_TEXT_PROP, OO_NS_STYLE,     "text-properties", 
GSF_XML_NO_CONTENT, NULL, NULL),
+           GSF_XML_IN_NODE (OFFICE_STYLES, STYLE_TEXT, OO_NS_NUMBER,           "text-style", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (STYLE_TEXT, STYLE_TEXT_CONTENT, OO_NS_NUMBER,    "text-content", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (STYLE_TEXT, STYLE_TEXT_PROP, OO_NS_NUMBER,       "text", GSF_XML_NO_CONTENT, 
NULL, NULL),
+             GSF_XML_IN_NODE (STYLE_TEXT, STYLE_TEXT_MAP, OO_NS_STYLE,         "map", GSF_XML_NO_CONTENT, 
NULL, NULL),
+
+       GSF_XML_IN_NODE (OFFICE, OFFICE_BODY, OO_NS_OFFICE, "body", GSF_XML_NO_CONTENT, NULL, NULL),
+         GSF_XML_IN_NODE (OFFICE_BODY, SPREADSHEET, OO_NS_OFFICE, "spreadsheet", GSF_XML_NO_CONTENT, NULL, 
NULL),
+           GSF_XML_IN_NODE (SPREADSHEET, DATA_PILOT_TABLES, OO_NS_TABLE, "data-pilot-tables", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (DATA_PILOT_TABLES, DATA_PILOT_TABLE, OO_NS_TABLE, "data-pilot-table", 
GSF_XML_NO_CONTENT, NULL, NULL),
+               GSF_XML_IN_NODE (DATA_PILOT_TABLE, DPT_SOURCE_CELL_RANGE, OO_NS_TABLE, "source-cell-range", 
GSF_XML_NO_CONTENT, NULL, NULL),
+               GSF_XML_IN_NODE (DATA_PILOT_TABLE, DATA_PILOT_FIELD, OO_NS_TABLE, "data-pilot-field", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                 GSF_XML_IN_NODE (DATA_PILOT_FIELD, DATA_PILOT_LEVEL, OO_NS_TABLE, "data-pilot-level", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                   GSF_XML_IN_NODE (DATA_PILOT_LEVEL, DATA_PILOT_LAYOUT_INFO, OO_NS_TABLE, 
"data-pilot-layout-info", GSF_XML_NO_CONTENT, NULL, NULL),
+                   GSF_XML_IN_NODE (DATA_PILOT_LEVEL, DATA_PILOT_SORT_INFO, OO_NS_TABLE, 
"data-pilot-sort-info", GSF_XML_NO_CONTENT, NULL, NULL),
+                   GSF_XML_IN_NODE (DATA_PILOT_LEVEL, DATA_PILOT_DISPLAY_INFO, OO_NS_TABLE, 
"data-pilot-display-info", GSF_XML_NO_CONTENT, NULL, NULL),
+                   GSF_XML_IN_NODE (DATA_PILOT_LEVEL, DATA_PILOT_MEMBERS, OO_NS_TABLE, "data-pilot-members", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                     GSF_XML_IN_NODE (DATA_PILOT_MEMBERS, DATA_PILOT_MEMBER, OO_NS_TABLE, 
"data-pilot-member", GSF_XML_NO_CONTENT, NULL, NULL),
+                   GSF_XML_IN_NODE (DATA_PILOT_LEVEL, DATA_PILOT_SUBTOTALS, OO_NS_TABLE, 
"data-pilot-subtotals", GSF_XML_NO_CONTENT, NULL, NULL),
+                   GSF_XML_IN_NODE (DATA_PILOT_SUBTOTALS, DATA_PILOT_SUBTOTAL, OO_NS_TABLE, 
"data-pilot-subtotal", GSF_XML_NO_CONTENT, NULL, NULL),
+                 GSF_XML_IN_NODE (DATA_PILOT_FIELD, DATA_PILOT_GROUPS, OO_NS_TABLE, "data-pilot-groups", 
GSF_XML_NO_CONTENT, NULL, NULL),
+           GSF_XML_IN_NODE (SPREADSHEET, CONTENT_VALIDATIONS, OO_NS_TABLE, "content-validations", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (CONTENT_VALIDATIONS, CONTENT_VALIDATION, OO_NS_TABLE, "content-validation", 
GSF_XML_NO_CONTENT, NULL, NULL),
+               GSF_XML_IN_NODE (CONTENT_VALIDATION, ERROR_MESSAGE, OO_NS_TABLE, "error-message", 
GSF_XML_NO_CONTENT, NULL , NULL),
+                   GSF_XML_IN_NODE (ERROR_MESSAGE, TEXT_CONTENT, OO_NS_TEXT, "p", GSF_XML_NO_CONTENT, NULL, 
NULL),
+                   GSF_XML_IN_NODE (TEXT_CONTENT, TEXT_S,    OO_NS_TEXT, "s", GSF_XML_NO_CONTENT,  NULL, 
NULL),
+                   GSF_XML_IN_NODE_FULL (TEXT_CONTENT, TEXT_LINE_BREAK, OO_NS_TEXT, "line-break", 
GSF_XML_NO_CONTENT, FALSE, FALSE, NULL, NULL, .v_str = "\n"),
+                   GSF_XML_IN_NODE_FULL (TEXT_CONTENT, TEXT_TAB,  OO_NS_TEXT, "tab", GSF_XML_SHARED_CONTENT, 
FALSE, FALSE, odf_text_symbol, NULL, .v_str = "\t"),
+                   GSF_XML_IN_NODE (TEXT_CONTENT, TEXT_SPAN,      OO_NS_TEXT, "span", 
GSF_XML_SHARED_CONTENT, NULL, NULL),
+                     GSF_XML_IN_NODE (TEXT_SPAN, TEXT_SPAN, OO_NS_TEXT, "span", GSF_XML_NO_CONTENT, NULL, 
NULL),/* 2nd def */
+                     GSF_XML_IN_NODE (TEXT_SPAN, TEXT_S,    OO_NS_TEXT, "s", GSF_XML_NO_CONTENT, NULL, 
NULL),/* 2nd def */
+                     GSF_XML_IN_NODE (TEXT_SPAN, TEXT_LINE_BREAK,    OO_NS_TEXT, "line-break", 
GSF_XML_NO_CONTENT, NULL, NULL),/* 2nd def */
+                     GSF_XML_IN_NODE (TEXT_SPAN, TEXT_TAB, OO_NS_TEXT, "tab", GSF_XML_NO_CONTENT, NULL, 
NULL),/* 2nd def */
+                     GSF_XML_IN_NODE (TEXT_SPAN, TEXT_ADDR, OO_NS_TEXT, "a", GSF_XML_SHARED_CONTENT, NULL, 
NULL),
+                       GSF_XML_IN_NODE (TEXT_ADDR, TEXT_S,    OO_NS_TEXT, "s", GSF_XML_NO_CONTENT, NULL, 
NULL),/* 2nd def */
+                       GSF_XML_IN_NODE (TEXT_ADDR, TEXT_TAB, OO_NS_TEXT, "tab", GSF_XML_NO_CONTENT, NULL, 
NULL),/* 2nd def */
+                       GSF_XML_IN_NODE (TEXT_ADDR, TEXT_SPAN, OO_NS_TEXT, "span", GSF_XML_NO_CONTENT, NULL, 
NULL),/* 2nd def */
+           GSF_XML_IN_NODE (SPREADSHEET, CALC_SETTINGS, OO_NS_TABLE, "calculation-settings", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (CALC_SETTINGS, ITERATION, OO_NS_TABLE, "iteration", GSF_XML_NO_CONTENT, 
oo_iteration, NULL),
+             GSF_XML_IN_NODE (CALC_SETTINGS, DATE_CONVENTION, OO_NS_TABLE, "null-date", GSF_XML_NO_CONTENT, 
oo_date_convention, NULL),
+           GSF_XML_IN_NODE (SPREADSHEET, CHART, OO_NS_CHART, "chart", GSF_XML_NO_CONTENT, NULL, NULL),
+         GSF_XML_IN_NODE (OFFICE_BODY, OFFICE_CHART, OO_NS_OFFICE, "chart", GSF_XML_NO_CONTENT, NULL, NULL),
+           GSF_XML_IN_NODE (OFFICE_CHART, CHART_CHART, OO_NS_CHART, "chart", GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (CHART_CHART, CHART_TABLE, OO_NS_TABLE, "table", GSF_XML_NO_CONTENT, NULL, 
NULL),
+               GSF_XML_IN_NODE (CHART_TABLE, CHART_TABLE_ROWS, OO_NS_TABLE, "table-rows", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                 GSF_XML_IN_NODE (CHART_TABLE_ROWS, CHART_TABLE_ROW, OO_NS_TABLE, "table-row", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                   GSF_XML_IN_NODE (CHART_TABLE_ROW, CHART_TABLE_CELL, OO_NS_TABLE, "table-cell", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                     GSF_XML_IN_NODE (CHART_TABLE_CELL, CHART_CELL_P, OO_NS_TEXT, "p", GSF_XML_NO_CONTENT, 
NULL, NULL),
+                     GSF_XML_IN_NODE (CHART_TABLE_CELL, CHART_CELL_DRAW_G, OO_NS_DRAW, "g", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                       GSF_XML_IN_NODE (CHART_CELL_DRAW_G, CHART_CELL_SVG_DESC, OO_NS_SVG, "desc", 
GSF_XML_NO_CONTENT, NULL, NULL),
+               GSF_XML_IN_NODE (CHART_TABLE, CHART_TABLE_COLS, OO_NS_TABLE, "table-columns", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                 GSF_XML_IN_NODE (CHART_TABLE_COLS, CHART_TABLE_COL, OO_NS_TABLE, "table-column", 
GSF_XML_NO_CONTENT, NULL, NULL),
+               GSF_XML_IN_NODE (CHART_TABLE, CHART_TABLE_HROWS, OO_NS_TABLE, "table-header-rows", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                 GSF_XML_IN_NODE (CHART_TABLE_HROWS, CHART_TABLE_HROW, OO_NS_TABLE, "table-header-row", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                 GSF_XML_IN_NODE (CHART_TABLE_HROWS, CHART_TABLE_ROW, OO_NS_TABLE, "table-row", 
GSF_XML_NO_CONTENT, NULL, NULL),               /* 2nd Def */
+               GSF_XML_IN_NODE (CHART_TABLE, CHART_TABLE_HCOLS, OO_NS_TABLE, "table-header-columns", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                 GSF_XML_IN_NODE (CHART_TABLE_HCOLS, CHART_TABLE_HCOL, OO_NS_TABLE, "table-header-column", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                 GSF_XML_IN_NODE (CHART_TABLE_HCOLS, CHART_TABLE_COL, OO_NS_TABLE, "table-column", 
GSF_XML_NO_CONTENT, NULL, NULL),            /* 2nd Def */
+
+             GSF_XML_IN_NODE_FULL (CHART_CHART, CHART_TITLE, OO_NS_CHART, "title", GSF_XML_NO_CONTENT, 
FALSE, FALSE, NULL, NULL, .v_int = 0),
+               GSF_XML_IN_NODE (CHART_TITLE, TEXT_CONTENT, OO_NS_TEXT, "p", GSF_XML_NO_CONTENT, NULL, 
NULL),/* 2nd Def */
+             GSF_XML_IN_NODE_FULL (CHART_CHART, CHART_SUBTITLE, OO_NS_CHART, "subtitle", GSF_XML_NO_CONTENT, 
FALSE, FALSE, NULL, NULL, .v_int = 1),
+               GSF_XML_IN_NODE (CHART_SUBTITLE, TEXT_CONTENT, OO_NS_TEXT, "p", GSF_XML_NO_CONTENT, NULL, 
NULL),/* 2nd Def */
+             GSF_XML_IN_NODE_FULL (CHART_CHART, CHART_FOOTER, OO_NS_CHART, "footer", GSF_XML_NO_CONTENT, 
FALSE, FALSE, NULL, NULL, .v_int = 2),
+               GSF_XML_IN_NODE (CHART_FOOTER, TEXT_CONTENT, OO_NS_TEXT, "p", GSF_XML_NO_CONTENT, NULL, 
NULL),/* 2nd Def */
+             GSF_XML_IN_NODE (CHART_CHART, CHART_LEGEND, OO_NS_CHART, "legend", GSF_XML_NO_CONTENT, NULL, 
NULL),
+               GSF_XML_IN_NODE (CHART_LEGEND, CHART_LEGEND_TITLE, OO_GNUM_NS_EXT, "title", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                 GSF_XML_IN_NODE (CHART_LEGEND_TITLE, TEXT_CONTENT, OO_NS_TEXT, "p", GSF_XML_NO_CONTENT, 
NULL, NULL), /* 2nd Def */
+             GSF_XML_IN_NODE (CHART_CHART, CHART_PLOT_AREA, OO_NS_CHART, "plot-area", GSF_XML_NO_CONTENT, 
NULL, NULL),
+               GSF_XML_IN_NODE (CHART_PLOT_AREA, CHART_SERIES, OO_NS_CHART, "series", GSF_XML_NO_CONTENT, 
NULL, NULL),
+                 GSF_XML_IN_NODE (CHART_SERIES, SERIES_DOMAIN, OO_NS_CHART, "domain", GSF_XML_NO_CONTENT, 
NULL, NULL),
+                 GSF_XML_IN_NODE (CHART_SERIES, SERIES_DATA_PT, OO_NS_CHART, "data-point", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                 GSF_XML_IN_NODE (CHART_SERIES, SERIES_DATA_ERR, OO_NS_CHART, "error-indicator", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                 GSF_XML_IN_NODE (CHART_SERIES, SERIES_REGRESSION, OO_NS_CHART, "regression-curve", 
GSF_XML_NO_CONTENT,  NULL, NULL),
+                   GSF_XML_IN_NODE (SERIES_REGRESSION, SERIES_REG_EQ, OO_NS_CHART, "equation", 
GSF_XML_NO_CONTENT,  NULL, NULL),
+                   GSF_XML_IN_NODE (SERIES_REGRESSION, SERIES_REG_EQ_GNM, OO_GNUM_NS_EXT, "equation", 
GSF_XML_NO_CONTENT,  NULL, NULL),
+                 GSF_XML_IN_NODE (CHART_SERIES, SERIES_REGRESSION_MULTIPLE, OO_GNUM_NS_EXT, 
"regression-curve", GSF_XML_NO_CONTENT,  NULL, NULL),
+                   GSF_XML_IN_NODE (SERIES_REGRESSION_MULTIPLE, SERIES_REG_EQ, OO_NS_CHART, "equation", 
GSF_XML_NO_CONTENT,  NULL, NULL),/* 2nd Def */
+                   GSF_XML_IN_NODE (SERIES_REGRESSION_MULTIPLE, SERIES_REG_EQ_GNM, OO_GNUM_NS_EXT, 
"equation", GSF_XML_NO_CONTENT,  NULL, NULL), /* 2nd Def */
+                 GSF_XML_IN_NODE (CHART_SERIES, SERIES_DROPLINES, OO_GNUM_NS_EXT, "droplines", 
GSF_XML_NO_CONTENT, NULL, NULL),
+               GSF_XML_IN_NODE (CHART_PLOT_AREA, CHART_WALL, OO_NS_CHART, "wall", GSF_XML_NO_CONTENT, NULL, 
NULL),
+               GSF_XML_IN_NODE (CHART_PLOT_AREA, CHART_FLOOR, OO_NS_CHART, "floor", GSF_XML_NO_CONTENT, 
NULL, NULL),
+               GSF_XML_IN_NODE (CHART_PLOT_AREA, CHART_AXIS, OO_NS_CHART, "axis", GSF_XML_NO_CONTENT, NULL, 
NULL),
+                 GSF_XML_IN_NODE (CHART_AXIS, CHART_GRID, OO_NS_CHART, "grid", GSF_XML_NO_CONTENT, NULL, 
NULL),
+                 GSF_XML_IN_NODE (CHART_AXIS, CHART_AXIS_CAT,   OO_NS_CHART, "categories", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                 GSF_XML_IN_NODE_FULL (CHART_AXIS, CHART_AXIS_TITLE, OO_NS_CHART, "title", 
GSF_XML_NO_CONTENT, FALSE, FALSE, NULL, NULL, .v_int = 3),
+                   GSF_XML_IN_NODE (CHART_AXIS_TITLE, TEXT_CONTENT, OO_NS_TEXT, "p", GSF_XML_NO_CONTENT, 
NULL, NULL),/* 2nd Def */
+#ifdef HAVE_OO_NS_CHART_OOO
+               GSF_XML_IN_NODE (CHART_PLOT_AREA, CHART_OOO_COORDINATE_REGION, OO_NS_CHART_OOO, 
"coordinate-region", GSF_XML_NO_CONTENT, NULL, NULL),
+#endif
+           GSF_XML_IN_NODE (SPREADSHEET, TABLE, OO_NS_TABLE, "table", GSF_XML_NO_CONTENT, 
&odf_preparse_table_start, &odf_preparse_table_end),
+             GSF_XML_IN_NODE (TABLE, SHEET_SELECTIONS, OO_GNUM_NS_EXT, "selections", GSF_XML_NO_CONTENT, 
NULL, NULL),
+               GSF_XML_IN_NODE (SHEET_SELECTIONS, SELECTION, OO_GNUM_NS_EXT, "selection", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (TABLE, TABLE_SOURCE, OO_NS_TABLE, "table-source", GSF_XML_NO_CONTENT, NULL, 
NULL),
+             GSF_XML_IN_NODE (TABLE, TABLE_SHAPES, OO_NS_TABLE, "shapes", GSF_XML_NO_CONTENT, NULL, NULL),
+                 GSF_XML_IN_NODE (TABLE_SHAPES, DRAW_FRAME, OO_NS_DRAW, "frame", GSF_XML_NO_CONTENT, NULL, 
NULL),
+                 GSF_XML_IN_NODE (TABLE_SHAPES, DRAW_CAPTION, OO_NS_DRAW, "caption", GSF_XML_NO_CONTENT, 
NULL, NULL),
+                   GSF_XML_IN_NODE (DRAW_CAPTION, TEXT_CONTENT, OO_NS_TEXT, "p", GSF_XML_NO_CONTENT, NULL, 
NULL), /* 2nd def */
+                 GSF_XML_IN_NODE (TABLE_SHAPES, DRAW_CUSTOM_SHAPE, OO_NS_DRAW, "custom-shape", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                   GSF_XML_IN_NODE (DRAW_CUSTOM_SHAPE, TEXT_CONTENT, OO_NS_TEXT, "p", GSF_XML_NO_CONTENT, 
NULL, NULL), /* 2nd def */
+                   GSF_XML_IN_NODE (DRAW_CUSTOM_SHAPE, DRAW_ENHANCED_GEOMETRY, OO_NS_DRAW, 
"enhanced-geometry", GSF_XML_NO_CONTENT, NULL, NULL),
+       GSF_XML_IN_NODE (DRAW_ENHANCED_GEOMETRY, DRAW_ENHANCED_GEOMETRY_EQUATION, OO_NS_DRAW, "equation", 
GSF_XML_NO_CONTENT, odf_custom_shape_equation, NULL),
+       GSF_XML_IN_NODE (DRAW_ENHANCED_GEOMETRY, DRAW_ENHANCED_GEOMETRY_HANDLE, OO_NS_DRAW, "handle", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                 GSF_XML_IN_NODE (TABLE_SHAPES, DRAW_ELLIPSE, OO_NS_DRAW, "ellipse", GSF_XML_NO_CONTENT, 
NULL, NULL),
+                   GSF_XML_IN_NODE (DRAW_ELLIPSE, TEXT_CONTENT, OO_NS_TEXT, "p", GSF_XML_NO_CONTENT, NULL, 
NULL), /* 2nd def */
+                 GSF_XML_IN_NODE (TABLE_SHAPES, DRAW_LINE, OO_NS_DRAW, "line", GSF_XML_NO_CONTENT, NULL, 
NULL),
+                    GSF_XML_IN_NODE (DRAW_LINE, TEXT_CONTENT, OO_NS_TEXT, "p", GSF_XML_NO_CONTENT, NULL, 
NULL), /* 2nd def */
+                 GSF_XML_IN_NODE (TABLE_SHAPES, DRAW_RECT, OO_NS_DRAW, "rect", GSF_XML_NO_CONTENT, NULL, 
NULL),
+                   GSF_XML_IN_NODE (DRAW_RECT, TEXT_CONTENT, OO_NS_TEXT, "p", GSF_XML_NO_CONTENT, NULL, 
NULL), /* 2nd def */
+             GSF_XML_IN_NODE (TABLE, FORMS, OO_NS_OFFICE, "forms", GSF_XML_NO_CONTENT, NULL, NULL),
+               GSF_XML_IN_NODE (FORMS, FORM, OO_NS_FORM, "form", GSF_XML_NO_CONTENT, NULL, NULL),
+                 GSF_XML_IN_NODE (FORM, FORM_PROPERTIES, OO_NS_FORM, "properties", GSF_XML_NO_CONTENT, NULL, 
NULL),
+                   GSF_XML_IN_NODE (FORM_PROPERTIES, FORM_PROPERTY, OO_NS_FORM, "property", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                     GSF_XML_IN_NODE (FORM_PROPERTIES, FORM_LIST_PROPERTY, OO_NS_FORM, "list-property", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                 GSF_XML_IN_NODE (FORM, FORM_BUTTON, OO_NS_FORM, "button", GSF_XML_NO_CONTENT, NULL, NULL),
+                   GSF_XML_IN_NODE (FORM_BUTTON, FORM_PROPERTIES, OO_NS_FORM, "properties", 
GSF_XML_NO_CONTENT, NULL, NULL),                   /* 2nd Def */
+                   GSF_XML_IN_NODE (FORM_BUTTON, BUTTON_OFFICE_EVENT_LISTENERS, OO_NS_OFFICE, 
"event-listeners", GSF_XML_NO_CONTENT, NULL, NULL),
+                     GSF_XML_IN_NODE (BUTTON_OFFICE_EVENT_LISTENERS, BUTTON_EVENT_LISTENER, OO_NS_SCRIPT, 
"event-listener", GSF_XML_NO_CONTENT, NULL, NULL),
+                 GSF_XML_IN_NODE (FORM, FORM_VALUE_RANGE, OO_NS_FORM, "value-range", GSF_XML_NO_CONTENT, 
NULL, NULL),
+                   GSF_XML_IN_NODE (FORM_VALUE_RANGE, FORM_PROPERTIES, OO_NS_FORM, "properties", 
GSF_XML_NO_CONTENT, NULL, NULL),                      /* 2nd Def */
+                 GSF_XML_IN_NODE (FORM, FORM_CHECKBOX, OO_NS_FORM, "checkbox", GSF_XML_NO_CONTENT, NULL, 
NULL),
+                   GSF_XML_IN_NODE (FORM_CHECKBOX, FORM_PROPERTIES, OO_NS_FORM, "properties", 
GSF_XML_NO_CONTENT, NULL, NULL),                 /* 2nd Def */
+                 GSF_XML_IN_NODE (FORM, FORM_RADIO, OO_NS_FORM, "radio", GSF_XML_NO_CONTENT, NULL, NULL),
+                   GSF_XML_IN_NODE (FORM_RADIO, FORM_PROPERTIES, OO_NS_FORM, "properties", 
GSF_XML_NO_CONTENT, NULL, NULL),                    /* 2nd Def */
+                 GSF_XML_IN_NODE (FORM, FORM_LISTBOX, OO_NS_FORM, "listbox", GSF_XML_NO_CONTENT, NULL, NULL),
+                   GSF_XML_IN_NODE (FORM_LISTBOX, FORM_PROPERTIES, OO_NS_FORM, "properties", 
GSF_XML_NO_CONTENT, NULL, NULL),                  /* 2nd Def */
+                 GSF_XML_IN_NODE (FORM, FORM_COMBOBOX, OO_NS_FORM, "combobox", GSF_XML_NO_CONTENT, NULL, 
NULL),
+                   GSF_XML_IN_NODE (FORM_COMBOBOX, FORM_PROPERTIES, OO_NS_FORM, "properties", 
GSF_XML_NO_CONTENT, NULL, NULL),                 /* 2nd Def */
+                 GSF_XML_IN_NODE (FORM, FORM_GENERIC, OO_NS_FORM, "generic-control", GSF_XML_NO_CONTENT, 
NULL, NULL),
+                   GSF_XML_IN_NODE (FORM_GENERIC, FORM_PROPERTIES, OO_NS_FORM, "properties", 
GSF_XML_NO_CONTENT, NULL, NULL),                  /* 2nd Def */
+             GSF_XML_IN_NODE (TABLE, TABLE_ROWS, OO_NS_TABLE, "table-rows", GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (TABLE, TABLE_H_ROWS, OO_NS_TABLE, "table-header-rows", GSF_XML_NO_CONTENT, 
NULL, NULL),
+             GSF_XML_IN_NODE (TABLE, TABLE_COL, OO_NS_TABLE, "table-column", GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (TABLE, TABLE_COLS, OO_NS_TABLE, "table-columns", GSF_XML_NO_CONTENT, NULL, 
NULL),
+             GSF_XML_IN_NODE (TABLE, TABLE_H_COLS, OO_NS_TABLE, "table-header-columns", GSF_XML_NO_CONTENT, 
NULL, NULL),
+             GSF_XML_IN_NODE (TABLE_H_COLS, TABLE_COL, OO_NS_TABLE, "table-column", GSF_XML_NO_CONTENT, 
NULL, NULL),    /* 2nd def */
+             GSF_XML_IN_NODE (TABLE_COLS, TABLE_COL, OO_NS_TABLE, "table-column", GSF_XML_NO_CONTENT, NULL, 
NULL),      /* 2nd def */
+             GSF_XML_IN_NODE (TABLE, TABLE_ROW, OO_NS_TABLE, "table-row", GSF_XML_NO_CONTENT, 
&odf_preparse_row_start, &odf_preparse_row_end),
+             GSF_XML_IN_NODE (TABLE, SOFTPAGEBREAK, OO_NS_TEXT, "soft-page-break", GSF_XML_NO_CONTENT, NULL, 
NULL),
+             GSF_XML_IN_NODE (TABLE_ROWS, TABLE_ROW, OO_NS_TABLE, "table-row", GSF_XML_NO_CONTENT, NULL, 
NULL), /* 2nd def */
+             GSF_XML_IN_NODE (TABLE_H_ROWS, TABLE_ROW, OO_NS_TABLE, "table-row", GSF_XML_NO_CONTENT, NULL, 
NULL), /* 2nd def */
+             GSF_XML_IN_NODE (TABLE_ROWS, SOFTPAGEBREAK, OO_NS_TEXT, "soft-page-break", GSF_XML_NO_CONTENT, 
NULL, NULL), /* 2nd def */
+             GSF_XML_IN_NODE (TABLE_H_ROWS, SOFTPAGEBREAK, OO_NS_TEXT, "soft-page-break", 
GSF_XML_NO_CONTENT, NULL, NULL), /* 2nd def */
+               GSF_XML_IN_NODE (TABLE_ROW, TABLE_CELL, OO_NS_TABLE, "table-cell", GSF_XML_NO_CONTENT, 
&odf_preparse_cell_start, NULL),
+                 GSF_XML_IN_NODE (TABLE_CELL, DRAW_CUSTOM_SHAPE, OO_NS_DRAW, "custom-shape", 
GSF_XML_NO_CONTENT, NULL, NULL),/* 2nd def */
+                 GSF_XML_IN_NODE (TABLE_CELL, CELL_TEXT, OO_NS_TEXT, "p", GSF_XML_NO_CONTENT, NULL, NULL),
+                   GSF_XML_IN_NODE (CELL_TEXT, DRAW_CUSTOM_SHAPE, OO_NS_DRAW, "custom-shape", 
GSF_XML_NO_CONTENT, NULL, NULL),/* 2nd def */
+                   GSF_XML_IN_NODE (CELL_TEXT, TEXT_S,   OO_NS_TEXT, "s", GSF_XML_NO_CONTENT, NULL, NULL),/* 
2nd def */
+                   GSF_XML_IN_NODE (CELL_TEXT, TEXT_ADDR, OO_NS_TEXT, "a", GSF_XML_NO_CONTENT, NULL, NULL), 
/* 2nd def */
+                   GSF_XML_IN_NODE (CELL_TEXT, TEXT_LINE_BREAK, OO_NS_TEXT, "line-break", 
GSF_XML_NO_CONTENT, NULL, NULL),/* 2nd def */
+                   GSF_XML_IN_NODE (CELL_TEXT, TEXT_TAB,  OO_NS_TEXT, "tab", GSF_XML_NO_CONTENT,NULL, NULL 
),/* 2nd def */
+                   GSF_XML_IN_NODE (CELL_TEXT, TEXT_SPAN, OO_NS_TEXT, "span", GSF_XML_NO_CONTENT, NULL, 
NULL),/* 2nd def */
+                     GSF_XML_IN_NODE (TEXT_SPAN, TEXT_ADDR, OO_NS_TEXT, "a", GSF_XML_NO_CONTENT, NULL, 
NULL),/* 2nd def */
+                 GSF_XML_IN_NODE (TABLE_CELL, CELL_OBJECT, OO_NS_DRAW, "object", GSF_XML_NO_CONTENT, NULL, 
NULL),              /* ignore for now */
+                 GSF_XML_IN_NODE (TABLE_CELL, CELL_GRAPHIC, OO_NS_DRAW, "g", GSF_XML_NO_CONTENT, NULL, 
NULL),                  /* ignore for now */
+                   GSF_XML_IN_NODE (CELL_GRAPHIC, CELL_GRAPHIC, OO_NS_DRAW, "g", GSF_XML_NO_CONTENT, NULL, 
NULL),              /* 2nd def */
+                   GSF_XML_IN_NODE (CELL_GRAPHIC, DRAW_POLYLINE, OO_NS_DRAW, "polyline", GSF_XML_NO_CONTENT, 
NULL, NULL),      /* 2nd def */
+                 GSF_XML_IN_NODE (TABLE_CELL, DRAW_CONTROL, OO_NS_DRAW, "control", GSF_XML_NO_CONTENT, NULL, 
NULL),
+                 GSF_XML_IN_NODE (TABLE_CELL, DRAW_RECT, OO_NS_DRAW, "rect", GSF_XML_NO_CONTENT, NULL, 
NULL), /* 2nd def */
+                 GSF_XML_IN_NODE (TABLE_CELL, DRAW_LINE, OO_NS_DRAW, "line", GSF_XML_NO_CONTENT, NULL, 
NULL), /* 2nd def */
+                 GSF_XML_IN_NODE (TABLE_CELL, DRAW_ELLIPSE, OO_NS_DRAW, "ellipse", GSF_XML_NO_CONTENT, NULL, 
NULL), /* 2nd def */
+                 GSF_XML_IN_NODE (TABLE_CELL, DRAW_FRAME, OO_NS_DRAW, "frame", GSF_XML_NO_CONTENT, NULL, 
NULL),/* 2nd def */
+                   GSF_XML_IN_NODE (DRAW_FRAME, DRAW_OBJECT, OO_NS_DRAW, "object", GSF_XML_NO_CONTENT, NULL, 
NULL),
+                   GSF_XML_IN_NODE (DRAW_OBJECT, DRAW_OBJECT_TEXT, OO_NS_TEXT, "p", GSF_XML_NO_CONTENT, 
NULL, NULL),
+
+                   GSF_XML_IN_NODE (DRAW_FRAME, DRAW_IMAGE, OO_NS_DRAW, "image", GSF_XML_NO_CONTENT, NULL, 
NULL),
+                     GSF_XML_IN_NODE (DRAW_IMAGE, DRAW_IMAGE_TEXT,OO_NS_TEXT, "p", GSF_XML_NO_CONTENT, NULL, 
NULL),
+                   GSF_XML_IN_NODE (DRAW_FRAME, SVG_DESC, OO_NS_SVG, "desc", GSF_XML_NO_CONTENT, NULL, NULL),
+                   GSF_XML_IN_NODE (DRAW_FRAME, DRAW_TEXT_BOX, OO_NS_DRAW, "text-box", GSF_XML_NO_CONTENT, 
NULL, od_draw_text_frame_end),
+                   GSF_XML_IN_NODE (DRAW_TEXT_BOX, TEXT_CONTENT, OO_NS_TEXT, "p", GSF_XML_NO_CONTENT, NULL, 
NULL), /* 2nd def */
+                 GSF_XML_IN_NODE (TABLE_CELL, CELL_ANNOTATION, OO_NS_OFFICE, "annotation", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                   GSF_XML_IN_NODE (CELL_ANNOTATION, TEXT_CONTENT, OO_NS_TEXT, "p", GSF_XML_NO_CONTENT, 
NULL, NULL),/* 2nd def */
+                   GSF_XML_IN_NODE (CELL_ANNOTATION, CELL_ANNOTATION_AUTHOR, OO_NS_DC, "creator", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                   GSF_XML_IN_NODE (CELL_ANNOTATION, CELL_ANNOTATION_DATE, OO_NS_DC, "date", 
GSF_XML_NO_CONTENT, NULL, NULL),
+
+               GSF_XML_IN_NODE (TABLE_ROW, TABLE_COVERED_CELL, OO_NS_TABLE, "covered-table-cell", 
GSF_XML_NO_CONTENT, &odf_preparse_covered_cell_start, NULL),
+                 GSF_XML_IN_NODE (TABLE_COVERED_CELL, COVERED_CELL_TEXT, OO_NS_TEXT, "p", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                   GSF_XML_IN_NODE (COVERED_CELL_TEXT, COVERED_CELL_TEXT_S,    OO_NS_TEXT, "s", 
GSF_XML_NO_CONTENT, NULL, NULL),
+                 GSF_XML_IN_NODE (TABLE_COVERED_CELL, DRAW_CONTROL, OO_NS_DRAW, "control", 
GSF_XML_NO_CONTENT, NULL, NULL),
+
+             GSF_XML_IN_NODE (TABLE, TABLE_COL_GROUP, OO_NS_TABLE, "table-column-group", GSF_XML_NO_CONTENT, 
NULL, NULL),
+               GSF_XML_IN_NODE (TABLE_COL_GROUP, TABLE_COL_GROUP, OO_NS_TABLE, "table-column-group", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (TABLE_COL_GROUP, TABLE_H_COLS, OO_NS_TABLE, "table-header-columns", 
GSF_XML_NO_CONTENT, NULL, NULL),/* 2nd def */
+               GSF_XML_IN_NODE (TABLE_COL_GROUP, TABLE_COL, OO_NS_TABLE, "table-column", GSF_XML_NO_CONTENT, 
NULL, NULL), /* 2nd def */
+             GSF_XML_IN_NODE (TABLE_ROW_GROUP, TABLE_ROW_GROUP, OO_NS_TABLE, "table-row-group", 
GSF_XML_NO_CONTENT, NULL, NULL),
+           GSF_XML_IN_NODE (TABLE, TABLE_ROW_GROUP,          OO_NS_TABLE, "table-row-group", 
GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (TABLE_ROW_GROUP, TABLE_ROW,          OO_NS_TABLE, "table-row", 
GSF_XML_NO_CONTENT, NULL, NULL), /* 2nd def */
+         GSF_XML_IN_NODE (TABLE, NAMED_EXPRS, OO_NS_TABLE, "named-expressions", GSF_XML_NO_CONTENT, NULL, 
NULL),
+         GSF_XML_IN_NODE (SPREADSHEET, NAMED_EXPRS, OO_NS_TABLE, "named-expressions", GSF_XML_NO_CONTENT, 
NULL, NULL), /* 2nd def */
+           GSF_XML_IN_NODE (NAMED_EXPRS, NAMED_EXPR, OO_NS_TABLE, "named-expression", GSF_XML_NO_CONTENT, 
NULL, NULL),
+           GSF_XML_IN_NODE (NAMED_EXPRS, NAMED_RANGE, OO_NS_TABLE, "named-range", GSF_XML_NO_CONTENT, NULL, 
NULL),
+
+         GSF_XML_IN_NODE (SPREADSHEET, DB_RANGES, OO_NS_TABLE, "database-ranges", GSF_XML_NO_CONTENT, NULL, 
NULL),
+           GSF_XML_IN_NODE (DB_RANGES, DB_RANGE, OO_NS_TABLE, "database-range", GSF_XML_NO_CONTENT, NULL, 
NULL),
+             GSF_XML_IN_NODE (DB_RANGE, FILTER, OO_NS_TABLE, "filter", GSF_XML_NO_CONTENT, NULL, NULL),
+               GSF_XML_IN_NODE (FILTER, FILTER_COND, OO_NS_TABLE, "filter-condition", GSF_XML_NO_CONTENT, 
NULL, NULL),
+           GSF_XML_IN_NODE (DB_RANGE, TABLE_SORT, OO_NS_TABLE, "sort", GSF_XML_NO_CONTENT, NULL, NULL),
+             GSF_XML_IN_NODE (TABLE_SORT, SORT_BY, OO_NS_TABLE, "sort-by", GSF_XML_NO_CONTENT, NULL, NULL),
+
+GSF_XML_IN_NODE_END
+};
+
+
 static GsfXMLInNode const *get_dtd () { return opendoc_content_dtd; }
 static GsfXMLInNode const *get_styles_dtd () { return styles_dtd; }
 
@@ -12033,6 +12398,8 @@ openoffice_file_open (G_GNUC_UNUSED GOFileOpener const *fo, GOIOContext *io_cont
        state.text_p_for_cell.gstr = NULL;
        state.text_p_for_cell.attrs = NULL;
 
+       state.table_n = 0;
+
        go_io_progress_message (state.context, _("Reading file..."));
        go_io_value_progress_set (state.context, gsf_input_size (contents), 0);
 
@@ -12053,6 +12420,13 @@ openoffice_file_open (G_GNUC_UNUSED GOFileOpener const *fo, GOIOContext *io_cont
                }
        }
 
+       doc  = gsf_xml_in_doc_new (opendoc_content_preparse_dtd,
+                                  gsf_odf_get_ns ());
+       content_malformed = !gsf_xml_in_doc_parse (doc, contents, &state);
+       gsf_xml_in_doc_free (doc);
+       odf_clear_conventions (&state); /* contain references to xin */
+       state.sheet_order = g_slist_reverse (state.sheet_order);
+
        if (NULL != styles) {
                GsfXMLInDoc *doc = gsf_xml_in_doc_new (styles_dtd,
                                                       gsf_odf_get_ns ());
@@ -12062,15 +12436,14 @@ openoffice_file_open (G_GNUC_UNUSED GOFileOpener const *fo, GOIOContext *io_cont
                g_object_unref (styles);
        }
 
-       doc  = gsf_xml_in_doc_new ((state.ver == OOO_VER_1)
-                                  ? ooo1_content_dtd
-                                  : opendoc_content_dtd,
-                                  gsf_odf_get_ns ());
-       content_malformed = !gsf_xml_in_doc_parse (doc, contents, &state);
-
-       /* get the sheet in the right order (in case something was
-        * created out of order implictly) */
-       state.sheet_order = g_slist_reverse (state.sheet_order);
+       if (!content_malformed) {
+               gsf_input_seek (contents, 0, G_SEEK_SET);
+               doc  = gsf_xml_in_doc_new ((state.ver == OOO_VER_1)
+                                          ? ooo1_content_dtd
+                                          : opendoc_content_dtd,
+                                          gsf_odf_get_ns ());
+               content_malformed = !gsf_xml_in_doc_parse (doc, contents, &state);
+       }
 
        if (g_slist_length (state.sheet_order) < (guint) workbook_sheet_count (state.pos.wb)) {
                /* We have seen instances of ODF files generated by   */



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