summaryrefslogtreecommitdiffstats
path: root/misc/xml-tokens
diff options
context:
space:
mode:
Diffstat (limited to 'misc/xml-tokens')
-rwxr-xr-xmisc/xml-tokens/dump-xsd-keys.py145
-rwxr-xr-xmisc/xml-tokens/gen-gnumeric-tokens.py81
-rwxr-xr-xmisc/xml-tokens/gen-odf-tokens.py192
-rwxr-xr-xmisc/xml-tokens/gen-ooxml-tokens.py84
-rwxr-xr-xmisc/xml-tokens/gen-tokens.py47
-rwxr-xr-xmisc/xml-tokens/gnumeric.xsd1296
-rw-r--r--misc/xml-tokens/ooxml-extra-tokens.txt3
-rw-r--r--misc/xml-tokens/token_util.py70
-rw-r--r--misc/xml-tokens/xls-xml-tokens.txt991
9 files changed, 2909 insertions, 0 deletions
diff --git a/misc/xml-tokens/dump-xsd-keys.py b/misc/xml-tokens/dump-xsd-keys.py
new file mode 100755
index 0000000..c1e5012
--- /dev/null
+++ b/misc/xml-tokens/dump-xsd-keys.py
@@ -0,0 +1,145 @@
+#!/usr/bin/env python
+########################################################################
+#
+# Copyright (c) 2013 Kohei Yoshida
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation
+# files (the "Software"), to deal in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+########################################################################
+
+import xml.parsers.expat, argparse, sys
+import token_util
+
+class XMLParser:
+
+ def __init__ (self, strm):
+ self.__strm = strm
+ self.__elem = None
+ self.tokens = []
+ self.ns_tokens = []
+
+ def start_element(self, name, attrs):
+ self.__elem = name
+ if name in ['xs:element', 'xs:attribute', 'xsd:element', 'xsd:attribute'] and attrs.has_key('name'):
+ token = attrs['name']
+ if len(token) > 0:
+ self.tokens.append(token)
+
+ if name.endswith(':schema'):
+ # Check for namespace entries.
+ attr_names = attrs.keys()
+ for attr_name in attr_names:
+ if attr_name == 'xmlns':
+ self.ns_tokens.append(['', attrs[attr_name]])
+ elif attr_name.startswith('xmlns:'):
+ vals = attr_name.split(':')
+ self.ns_tokens.append([vals[1], attrs[attr_name]])
+
+ def end_element(self, name):
+ pass
+
+ def character(self, data):
+ pass
+
+ def parse (self):
+ p = xml.parsers.expat.ParserCreate()
+ p.StartElementHandler = self.start_element
+ p.EndElementHandler = self.end_element
+ p.CharacterDataHandler = self.character
+ p.Parse(self.__strm, 1)
+
+
+def parse_files(filenames):
+
+ tokens = {}
+ for filename in filenames:
+ file = open(filename, 'r')
+ chars = file.read()
+ file.close()
+
+ parser = XMLParser(chars)
+ parser.parse()
+ for token in parser.tokens:
+ tokens[token] = True
+
+ keys = tokens.keys()
+ keys.sort()
+
+ return keys
+
+
+def parse_files_ns(filenames):
+
+ tokens = {}
+ for filename in filenames:
+ file = open(filename, 'r')
+ chars = file.read()
+ file.close()
+
+ parser = XMLParser(chars)
+ parser.parse()
+ for ns_token in parser.ns_tokens:
+ alias, value = ns_token # each namespace token consists of an alias and a value.
+ if not tokens.has_key(value):
+ tokens[value] = []
+ if len(alias) > 0 and not alias in tokens[value]:
+ tokens[value].append(alias)
+
+ keys = tokens.keys()
+ keys.sort()
+ ret_val = []
+ for key in keys:
+ aliases = tokens[key]
+ t = key + " ("
+ first = True
+ for alias in aliases:
+ if first:
+ first = False
+ else:
+ t += ", "
+ t += alias
+ t += ")"
+ ret_val.append(t)
+
+ return ret_val
+
+
+desc = "Given an arbitrary XML Schema file (.xsd), dump all its keys specified in the schema to stdout."
+
+def main ():
+ parser = argparse.ArgumentParser(description=desc)
+ parser.add_argument('file', nargs='*', help='XML Shema file (.xsd)')
+ parser.add_argument('--ns', dest='ns_mode', action='store_true', default=False)
+ args = parser.parse_args(sys.argv[1:])
+ ns_mode = args.ns_mode
+
+ if ns_mode:
+ keys = parse_files_ns(args.file)
+ else:
+ keys = parse_files(args.file)
+
+ for key in keys:
+ print(key)
+
+if __name__ == '__main__':
+ main()
+
diff --git a/misc/xml-tokens/gen-gnumeric-tokens.py b/misc/xml-tokens/gen-gnumeric-tokens.py
new file mode 100755
index 0000000..6212a83
--- /dev/null
+++ b/misc/xml-tokens/gen-gnumeric-tokens.py
@@ -0,0 +1,81 @@
+#!/usr/bin/env python
+#************************************************************************
+#
+# Copyright (c) 2010-2012 Kohei Yoshida
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation
+# files (the "Software"), to deal in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+#***********************************************************************
+
+import xml.parsers.expat, sys
+import token_util
+
+class XMLParser:
+
+ def __init__ (self, strm):
+ self.__strm = strm
+ self.__elem = None
+ self.tokens = []
+
+ def start_element(self, name, attrs):
+ self.__elem = name
+ if name in ['xs:element', 'xs:attribute', 'xsd:element', 'xsd:attribute'] and attrs.has_key('name'):
+ token = attrs['name']
+ if len(token) > 0:
+ self.tokens.append(token)
+
+ def end_element(self, name):
+ pass
+
+ def character(self, data):
+ pass
+
+ def parse (self):
+ p = xml.parsers.expat.ParserCreate()
+ p.StartElementHandler = self.start_element
+ p.EndElementHandler = self.end_element
+ p.CharacterDataHandler = self.character
+ p.Parse(self.__strm, 1)
+
+
+def parse_file(filename):
+ file = open(filename, 'r')
+ chars = file.read()
+ file.close()
+
+ parser = XMLParser(chars)
+ parser.parse()
+ tokens = {}
+ for token in parser.tokens:
+ tokens[token] = True
+ keys = tokens.keys()
+ keys.sort()
+ return keys
+
+
+def main ():
+ tokens = parse_file(sys.argv[1])
+ token_util.gen_token_constants(sys.argv[2], tokens)
+ token_util.gen_token_names(sys.argv[3], tokens)
+
+if __name__ == '__main__':
+ main()
diff --git a/misc/xml-tokens/gen-odf-tokens.py b/misc/xml-tokens/gen-odf-tokens.py
new file mode 100755
index 0000000..2838604
--- /dev/null
+++ b/misc/xml-tokens/gen-odf-tokens.py
@@ -0,0 +1,192 @@
+#!/usr/bin/env python
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import xml.parsers.expat
+import sys
+import argparse
+from pathlib import Path
+
+import token_util
+
+
+NS_RNG = "http://relaxng.org/ns/structure/1.0"
+
+
+class TokenParser:
+
+ def __init__ (self, strm):
+ self.__strm = strm
+ self.__elem = None
+ self.tokens = set()
+
+ def start_element(self, name, attrs):
+ self.__elem = name
+ if name in {f"{NS_RNG}:element", f"{NS_RNG}:attribute"} and "name" in attrs:
+ tokens = attrs['name'].split(':')
+ n = len(tokens)
+ if n != 2:
+ sys.stderr.write("unrecognized token type: "+attrs['name'])
+ sys.exit(1)
+
+ self.tokens.add(tokens[1])
+
+ for token in tokens:
+ self.tokens.add(token)
+
+ def character(self, data):
+ if self.__elem == f"{NS_RNG}:value":
+ s = data.strip()
+ if len(s) > 0:
+ self.tokens.add(s)
+
+ def parse(self):
+ p = xml.parsers.expat.ParserCreate(encoding="utf-8", namespace_separator=":")
+ p.StartElementHandler = self.start_element
+ p.CharacterDataHandler = self.character
+ p.Parse(self.__strm, 1)
+
+ self.tokens = sorted(self.tokens)
+
+
+class NSParser:
+
+ def __init__ (self, strm):
+ self.__strm = strm
+ self.__elem = None
+ self.ns_values = dict() # namespace values
+
+ def start_element(self, name, attrs):
+ self.__elem = name
+ if name.endswith("grammar"):
+ names = attrs.keys()
+ for name in names:
+ tokens = name.split(':')
+ if len(tokens) < 2 or tokens[0] != "xmlns":
+ continue
+
+ val = attrs[name]
+ self.ns_values[tokens[1]] = val
+
+ def parse(self):
+ p = xml.parsers.expat.ParserCreate(encoding="utf-8")
+ p.StartElementHandler = self.start_element
+ p.Parse(self.__strm, 1)
+
+ ns_values = list()
+ for k, v in self.ns_values.items():
+ if v == "http://relaxng.org/ns/structure/1.0":
+ # skip the relaxNG namespace since it is only used in the schema document.
+ continue
+ ns_values.append((k, v))
+
+ self.ns_values = sorted(ns_values, key=lambda x: x[0])
+
+
+def gen_namespace_tokens(filepath, ns_values):
+
+ # header (.hpp)
+ filepath_hpp = filepath + "_hpp.inl"
+ outfile = open(filepath_hpp, 'w')
+ outfile.write("namespace orcus {\n\n")
+ for key, _ in ns_values:
+ outfile.write("extern const xmlns_id_t NS_odf_")
+ outfile.write(key)
+ outfile.write(";\n")
+ outfile.write("\nextern const xmlns_id_t* NS_odf_all;\n")
+ outfile.write("\n}\n\n")
+ outfile.close()
+
+ # source (.cpp)
+ filepath_cpp = filepath + "_cpp.inl"
+ outfile = open(filepath_cpp, 'w')
+ outfile.write("namespace orcus {\n\n")
+ for key, value in ns_values:
+ outfile.write("const xmlns_id_t NS_odf_")
+ outfile.write(key)
+ outfile.write(" = \"")
+ outfile.write(value)
+ outfile.write("\"")
+ outfile.write(";\n")
+
+ outfile.write("\n")
+ outfile.write("namespace {\n\n")
+ outfile.write("const xmlns_id_t odf_ns[] = {\n")
+ for key, _ in ns_values:
+ outfile.write(" NS_odf_")
+ outfile.write(key)
+ outfile.write(",\n")
+ outfile.write(" nullptr\n")
+ outfile.write("};\n\n")
+ outfile.write("} // anonymous\n\n")
+
+ outfile.write("const xmlns_id_t* NS_odf_all = odf_ns;\n\n")
+
+ outfile.write("}\n\n")
+ outfile.close()
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ "--ns-file-prefix", type=str,
+ help="file name prefix for optioal namespace constant files")
+ parser.add_argument(
+ "--summary-output", type=Path,
+ help="optional output file to write collected token data summary")
+ parser.add_argument(
+ "--token-constants", type=Path,
+ help="path to C++ output file where token consants are to be written to")
+ parser.add_argument(
+ "--token-names", type=Path,
+ help="path to C++ output file where token names are to be written to")
+ parser.add_argument(
+ "odf_schema", metavar="ODF-SCHEMA", type=Path, help="path to RNG ODF schema file")
+ args = parser.parse_args()
+
+ if not args.odf_schema.is_file():
+ print(f"{args.odf_schema} is not a valid file.", file=sys.stderr)
+ sys.exit(1)
+
+ schema_content = args.odf_schema.read_text()
+ parser = TokenParser(schema_content)
+ parser.parse()
+ tokens = parser.tokens
+
+ parser = NSParser(schema_content)
+ parser.parse()
+ ns_values = parser.ns_values
+
+ if args.summary_output:
+ summary_content_buf = list()
+ summary_content_buf.append("list of tokens:")
+
+ for token in tokens:
+ summary_content_buf.append(f"- \"{token}\"")
+
+ summary_content_buf.append("list of namespaces:")
+
+ for ns, value in ns_values:
+ summary_content_buf.append(f"- {ns}: \"{value}\"")
+
+ args.summary_output.write_text("\n".join(summary_content_buf))
+
+ if args.token_constants:
+ with open(args.token_constants, "w") as f:
+ token_util.gen_token_constants(f, tokens)
+
+ if args.token_names:
+ with open(args.token_names, "w") as f:
+ token_util.gen_token_names(f, tokens)
+
+ if args.ns_file_prefix is not None:
+ gen_namespace_tokens(args.ns_file_prefix, ns_values)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/misc/xml-tokens/gen-ooxml-tokens.py b/misc/xml-tokens/gen-ooxml-tokens.py
new file mode 100755
index 0000000..cee4d6f
--- /dev/null
+++ b/misc/xml-tokens/gen-ooxml-tokens.py
@@ -0,0 +1,84 @@
+#!/usr/bin/env python3
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import xml.parsers.expat
+import zipfile
+import argparse
+import sys
+import token_util
+
+
+class XMLParser:
+
+ def __init__ (self, strm):
+ self.__strm = strm
+ self.__elem = None
+ self.tokens = []
+
+ def start_element(self, name, attrs):
+ self.__elem = name
+ if name in ['xs:element', 'xs:attribute', 'xsd:element', 'xsd:attribute'] and "name" in attrs:
+ token = attrs['name']
+ if len(token) > 0:
+ self.tokens.append(token)
+
+ def end_element(self, name):
+ pass
+
+ def character(self, data):
+ pass
+
+ def parse (self):
+ p = xml.parsers.expat.ParserCreate()
+ p.StartElementHandler = self.start_element
+ p.EndElementHandler = self.end_element
+ p.CharacterDataHandler = self.character
+ p.Parse(self.__strm, 1)
+
+
+def get_all_tokens_from_zip(fpath):
+ with zipfile.ZipFile(fpath, 'r') as zip:
+ tokens = set()
+ for item in zip.namelist():
+ fd = zip.open(item, 'r')
+ parser = XMLParser(fd.read())
+ fd.close()
+ parser.parse()
+ tokens.update(parser.tokens)
+
+ return tokens
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ "-i", "--input", required=True, type=str,
+ help="Zip file containing schemas.")
+ parser.add_argument("--extra-input", type=argparse.FileType("r"), help="Optional input file containing extra token names.")
+ parser.add_argument(
+ "constant_file", metavar="CONSTANT-FILE", nargs=1, type=argparse.FileType("w"),
+ help="Output file to store constant values.")
+ parser.add_argument(
+ "name_file", metavar="NAME-FILE", nargs=1, type=argparse.FileType("w"),
+ help="Output file to store constant string names.")
+ args = parser.parse_args()
+
+ tokens = get_all_tokens_from_zip(args.input)
+
+ if args.extra_input:
+ extra_tokens = [x.strip() for x in args.extra_input.readlines()]
+ tokens.update(extra_tokens)
+
+ tokens = sorted(list(tokens))
+ token_util.gen_token_constants(args.constant_file[0], tokens)
+ token_util.gen_token_names(args.name_file[0], tokens)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/misc/xml-tokens/gen-tokens.py b/misc/xml-tokens/gen-tokens.py
new file mode 100755
index 0000000..f344e2e
--- /dev/null
+++ b/misc/xml-tokens/gen-tokens.py
@@ -0,0 +1,47 @@
+#!/usr/bin/env python3
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import token_util
+import argparse
+import sys
+from pathlib import Path
+
+
+desc = """Generate C++ source files from a list of tokens.
+
+To generate tokens files for Excel 2003 XML (xls-xml), run
+
+ %(prog)s xls-xml-tokens.txt \\
+ ../../src/liborcus/xls_xml_token_constants.inl \\
+ ../../src/liborcus/xls_xml_tokens.inl \\
+"""
+
+def main ():
+ parser = argparse.ArgumentParser(
+ description=desc,
+ formatter_class=argparse.RawTextHelpFormatter
+ )
+ parser.add_argument("tokenlist", type=Path, help="plain-text file that contains a list of tokens.")
+ parser.add_argument("output1", type=Path, help="output file that will contain XML token values.")
+ parser.add_argument("output2", type=Path, help="output file that will contain XML token names.")
+ args = parser.parse_args()
+
+ tokens = {}
+ with open(args.tokenlist, "r") as f:
+ for line in f.readlines():
+ token = line.strip()
+ tokens[token] = True
+
+ tokens = sorted(tokens.keys())
+ token_util.gen_token_constants(args.output1, tokens)
+ token_util.gen_token_names(args.output2, tokens)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/misc/xml-tokens/gnumeric.xsd b/misc/xml-tokens/gnumeric.xsd
new file mode 100755
index 0000000..a2c79cf
--- /dev/null
+++ b/misc/xml-tokens/gnumeric.xsd
@@ -0,0 +1,1296 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:gnm="http://www.gnumeric.org/v10.dtd"
+ xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
+ targetNamespace="http://www.gnumeric.org/v10.dtd"
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified">
+
+ <xs:annotation>
+ <xs:documentation xml:lang="en">
+ Schema for gnumeric spreadsheet documents
+ Created for Gnumeric 1.2.2,
+ Based on gnumeric source code and sample gnumeric documents
+ Author: Marc Johnson (marc_johnson27591@hotmail.com)
+
+ updated for 1.4.2 in Feb 2005
+ updated for 1.6.0 in Sept 2005
+ updated for 1.7.1 in Jun 2006
+ updated for 1.7.11 in Jun 2007 jody@gnome.org
+ updated for 1.7.91 in Nov 2007 jody@gnome.org
+ partially updated for 1.10.17 in July 2011 aguelzow@pyrshep.ca
+ </xs:documentation>
+ </xs:annotation>
+
+ <xs:element name="Workbook" type="gnm:Workbook"/>
+
+ <xs:complexType name="Version">
+ <xs:attribute name="Epoch" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Major" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Minor" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Full" type="xs:string" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:complexType name="Calculation">
+ <xs:attribute name="ManualRecalc" type="xs:boolean"/>
+ <xs:attribute name="EnableIteration" type="xs:boolean"/>
+ <xs:attribute name="MaxIterations" type="xs:nonNegativeInteger"/>
+ <xs:attribute name="FloatRadix" type="xs:positiveInteger"/>
+ <xs:attribute name="FloatDigits" type="xs:nonNegativeInteger"/>
+ <xs:attribute name="IterationTolerance" type="xs:double"/>
+ <xs:attribute name="DateConvention" type="gnm:DateConvention" use="optional" default="Lotus:1900"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:group name="WorkbookContentBlockA">
+ <xs:sequence>
+ <!-- ancient files lack this, modern files require it -->
+ <xs:element name="SheetNameIndex" type="gnm:SheetNameIndex" minOccurs="0" maxOccurs="1"/>
+
+ <xs:element name="Names" type="gnm:Names" minOccurs="0" maxOccurs="1"/>
+
+ <!-- Deprecated, moved to Calculation and expanded in 1.7.11
+ Valid value == 1904, anything else == Lotus:1900 -->
+ <xs:element name="DateConvention" type="xs:int" minOccurs="0" maxOccurs="1"/>
+
+ <!-- preferred height and width -->
+ <xs:element name="Geometry">
+ <xs:complexType>
+ <xs:attribute name="Width" type="xs:nonNegativeInteger" use="optional"/>
+ <xs:attribute name="Height" type="xs:nonNegativeInteger" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Sheets" type="gnm:Sheets"/>
+ <!-- which sheet was selected when the spreadsheet was saved? -->
+ <xs:element name="UIData">
+ <xs:complexType>
+ <xs:attribute name="SelectedTab" type="xs:nonNegativeInteger" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:group>
+
+ <xs:complexType name="Workbook">
+ <xs:sequence>
+ <xs:element name="Version" type="gnm:Version" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Attributes" type="gnm:Attributes"/>
+
+ <!-- ignore office:document-meta -->
+ <xs:any minOccurs="0" maxOccurs="unbounded"
+ namespace="##other" processContents="lax"/>
+
+ <xs:choice>
+ <xs:sequence>
+ <!-- In new files the Calculation element comes first, in old files last -->
+ <xs:element name="Calculation" type="gnm:Calculation" minOccurs="0" maxOccurs="1"/>
+ <xs:group ref="gnm:WorkbookContentBlockA"/>
+ </xs:sequence>
+ <xs:sequence>
+ <xs:group ref="gnm:WorkbookContentBlockA"/>
+ <xs:element name="Calculation" type="gnm:Calculation" minOccurs="0" maxOccurs="1"/>
+ </xs:sequence>
+ </xs:choice>
+ </xs:sequence>
+ <!-- version number should be v10 - - &gt;
+ <xs:attribute name="gnm" type="gnm:namespace" use="required"/> -->
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <!-- How values are mapped to dates. All date functions are affected -->
+ <xs:simpleType name="DateConvention">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="Lotus:1900"/>
+ <xs:enumeration value="Apple:1904"/>
+
+ <!-- future values. currently treated as Lotus:1900 -->
+ <xs:enumeration value="ODF:1899"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="CellRef">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[A-Z]+\d+"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="Names">
+ <xs:sequence>
+ <xs:element name="Name" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <!-- an oversight in the sax exporter (fixed in 1.4.3)
+ leaves off the namespace. Handle both formats.
+ -->
+ <xs:choice>
+ <xs:element name="name" type="xs:string"/>
+ <xs:element name="name" type="xs:string" form="unqualified"/>
+ </xs:choice>
+ <xs:choice>
+ <xs:element name="value" type="xs:string"/>
+ <xs:element name="value" type="xs:string" form="unqualified"/>
+ </xs:choice>
+ <xs:choice>
+ <xs:element name="position" type="xs:string"/>
+ <xs:element name="position" type="xs:string" form="unqualified"/>
+ </xs:choice>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="Attributes">
+ <xs:sequence>
+ <xs:element name="Attribute" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="type" minOccurs="0" maxOccurs="1" type="gnm:AttributeType"/>
+ <!-- must be 4 -->
+ <xs:element name="name" minOccurs="1" maxOccurs="1" type="xs:string"/>
+ <xs:element name="value" minOccurs="1" maxOccurs="1" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:simpleType name="AttributeType">
+ <xs:restriction base="xs:integer">
+ <xs:minInclusive value="4"/>
+ <xs:maxInclusive value="4"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="SheetNameIndex">
+ <xs:sequence>
+ <xs:element name="SheetName" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="Cols" type="xs:positiveInteger" form="qualified"/>
+ <xs:attribute name="Rows" type="xs:positiveInteger" form="qualified"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="Sheets">
+ <xs:sequence>
+ <xs:element name="Sheet" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <!-- name of the sheet -->
+ <xs:element name="Name" type="xs:string"/>
+ <!-- maximum column used -->
+ <xs:element name="MaxCol" type="xs:integer" minOccurs="0" maxOccurs="1"/>
+ <!-- maximum row used -->
+ <xs:element name="MaxRow" type="xs:integer" minOccurs="0" maxOccurs="1"/>
+ <!-- most recently used zoom factor -->
+ <xs:element name="Zoom" type="xs:double"/>
+ <xs:element name="Names" type="gnm:Names" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="PrintInformation" type="gnm:PrintInformation"/>
+ <xs:element name="Styles" type="gnm:Styles"/>
+ <xs:element name="Cols">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ColInfo" type="gnm:Col_Row" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="DefaultSizePts" type="xs:double" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Rows">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="RowInfo" type="gnm:Col_Row" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="DefaultSizePts" type="xs:double" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Selections" type="gnm:Selections"/>
+ <xs:element name="Objects" type="gnm:Objects" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Cells" type="gnm:Cells"/>
+ <xs:element name="MergedRegions" type="gnm:MergedRegions" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="SheetLayout" type="gnm:SheetLayout" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Filters" type="gnm:Filters" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Solver" type="gnm:Solver" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Scenarios" type="gnm:Scenarios" minOccurs="0" maxOccurs="1"/>
+ </xs:sequence>
+ <!-- note: xs:boolean values can be true, false, 1, 0;
+ gnumeric, in this element, always generates 'true' or
+ 'false' for its attributes
+ -->
+ <xs:attribute name="DisplayFormulas" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="HideZero" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="HideGrid" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="HideColHeader" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="HideRowHeader" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="DisplayOutlines" type="xs:boolean" use="optional" default="true"/>
+ <xs:attribute name="OutlineSymbolsBelow" type="xs:boolean" use="optional" default="true"/>
+ <xs:attribute name="OutlineSymbolsRight" type="xs:boolean" use="optional" default="true"/>
+ <xs:attribute name="Visibility" type="gnm:SheetVisibility" use="optional" default="GNM_SHEET_VISIBILITY_VISIBLE"/>
+ <xs:attribute name="RTL_Layout" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="Protected" type="xs:boolean" use="optional" default="false"/>
+ <xs:attribute name="TabColor" type="gnm:color" use="optional"/>
+ <xs:attribute name="TabTextColor" type="gnm:color" use="optional"/>
+ <xs:attribute name="GridColor" type="gnm:color" use="optional"/>
+ <xs:attribute name="ExprConvention" type="gnm:ExprConvention" use="optional" default="gnumeric:A1"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <!-- How expressions are _displayed_ no impact on evaluation -->
+ <xs:simpleType name="ExprConvention">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="gnumeric:A1"/>
+ <xs:enumeration value="gnumeric:R1C1"/>
+
+ <!-- future values, currently displayed as gnumeric:A1 -->
+ <xs:enumeration value="ODF:A1"/>
+ <xs:enumeration value="Lotus:A1"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="PrintInformation">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element name="Margins">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="top" type="gnm:margin"/>
+ <xs:element name="bottom" type="gnm:margin"/>
+ <xs:element name="left" type="gnm:margin" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="right" type="gnm:margin" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="header" type="gnm:margin" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="footer" type="gnm:margin" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Scale">
+ <xs:complexType>
+ <xs:attribute name="type" type="xs:string" use="required"/>
+ <xs:attribute name="percentage" type="xs:double" use="optional"/>
+ <xs:attribute name="cols" type="xs:integer" />
+ <xs:attribute name="rows" type="xs:integer" />
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- center vertically -->
+ <xs:element name="vcenter">
+ <xs:complexType>
+ <xs:attribute name="value" type="xs:boolean" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- center horizontally -->
+ <xs:element name="hcenter">
+ <xs:complexType>
+ <xs:attribute name="value" type="xs:boolean" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- print grid lines -->
+ <xs:element name="grid">
+ <xs:complexType>
+ <xs:attribute name="value" type="xs:boolean" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- print even if only styles -->
+ <xs:element name="even_if_only_styles">
+ <xs:complexType>
+ <xs:attribute name="value" type="xs:boolean" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- print in monochrome -->
+ <xs:element name="monochrome">
+ <xs:complexType>
+ <xs:attribute name="value" type="xs:boolean" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- print in draft mode -->
+ <xs:element name="draft">
+ <xs:complexType>
+ <xs:attribute name="value" type="xs:boolean" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- print titles -->
+ <xs:element name="titles">
+ <xs:complexType>
+ <xs:attribute name="value" type="xs:boolean" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- repeat range -->
+ <xs:element name="repeat_top" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:attribute name="value" type="xs:string" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <!-- repeat range -->
+ <xs:element name="repeat_left" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:attribute name="value" type="xs:string" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="order" type="gnm:print_ordering"/>
+ <xs:element name="orientation" type="gnm:print_orientation"/>
+ <xs:element name="Header" type="gnm:HeaderFooter"/>
+ <xs:element name="Footer" type="gnm:HeaderFooter"/>
+ <!-- typical values are A4, US-Letter -->
+ <xs:element name="paper" type="xs:string" minOccurs="0" maxOccurs="1"/>
+ <!-- do not print this sheet when "all" is selected in the job -->
+ <xs:element name="do_not_print" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:attribute name="value" type="xs:boolean" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="print-to-uri" type="xs:string" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="vPageBreaks" type="gnm:PageBreaks" minOccurs="0" maxOccurs="1"/>
+ <!-- between rows -->
+ <xs:element name="hPageBreaks" type="gnm:PageBreaks" minOccurs="0" maxOccurs="1"/>
+ <!-- between cols -->
+ <xs:element name="print_range" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:attribute name="value" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:integer">
+ <xs:enumeration value="-1"/>
+ <!-- PRINT_SAVED_INFO -->
+ <xs:enumeration value="0"/>
+ <!-- PRINT_ACTIVE_SHEET -->
+ <xs:enumeration value="1"/>
+ <!-- PRINT_ALL_SHEETS -->
+ <xs:enumeration value="2"/>
+ <!-- PRINT_ALL_SHEETS_INCLUDING_HIDDEN -->
+ <xs:enumeration value="3"/>
+ <!-- PRINT_SHEET_RANGE -->
+ <xs:enumeration value="4"/>
+ <!-- PRINT_SHEET_SELECTION -->
+ <xs:enumeration value="5"/>
+ <!-- PRINT_IGNORE_PRINTAREA -->
+ <xs:enumeration value="6"/>
+ <!-- PRINT_SHEET_SELECTION_IGNORE_PRINTAREA -->
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ </xs:choice>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:complexType name="HeaderFooter">
+ <xs:attribute name="Left" type="xs:string" use="optional"/>
+ <xs:attribute name="Middle" type="xs:string" use="optional"/>
+ <xs:attribute name="Right" type="xs:string" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:complexType name="PageBreaks">
+ <xs:sequence>
+ <xs:element name="break" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attribute name="pos" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="type" type="gnm:PageBreakType" use="optional" default="auto"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="count" type="xs:nonNegativeInteger" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:simpleType name="PageBreakType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="auto"/>
+ <xs:enumeration value="manual"/>
+ <xs:enumeration value="data-slice"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="margin">
+ <xs:attribute name="Points" type="xs:double"/>
+ <xs:attribute name="PrefUnit" type="gnm:print_units"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:simpleType name="print_units">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="mm"/>
+ <xs:enumeration value="millimeter"/>
+ <xs:enumeration value="cm"/>
+ <xs:enumeration value="centimeter"/>
+ <xs:enumeration value="in"/>
+ <xs:enumeration value="inch"/>
+ <xs:enumeration value="inches"/>
+ <xs:enumeration value="Pt"/>
+ <xs:enumeration value="Pts"/>
+ <xs:enumeration value="points"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="print_ordering">
+ <xs:restriction base="xs:string">
+ <!-- right, then down -->
+ <xs:enumeration value="r_then_d"/>
+ <!-- down, then right -->
+ <xs:enumeration value="d_then_r"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="print_orientation">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="landscape"/>
+ <xs:enumeration value="portrait"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="Styles">
+ <xs:sequence>
+ <xs:element name="StyleRegion" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Style" type="gnm:Style" minOccurs="1" maxOccurs="1"/>
+ </xs:sequence>
+ <xs:attribute name="startCol" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="startRow" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="endCol" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="endRow" type="xs:nonNegativeInteger" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="Style">
+ <xs:sequence>
+ <xs:element name="Font" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:simpleContent>
+ <!-- Since these might be conditional styles, the atributes are
+ not required -->
+ <xs:extension base="xs:string">
+ <xs:attribute name="Unit" type="xs:double" use="optional"/>
+ <xs:attribute name="Bold" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Italic" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Underline" type="gnm:underline" use="optional"/>
+ <xs:attribute name="StrikeThrough" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Script" type="gnm:script" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="HyperLink" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:attribute name="type" type="xs:string" use="required"/>
+ <xs:attribute name="target" type="xs:string" use="optional"/>
+ <xs:attribute name="tip" type="xs:string" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="StyleBorder" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:choice minOccurs="0" maxOccurs="6">
+ <!-- The order of the last two elements appears to be
+ version dependent-->
+ <xs:element name="Top" type="gnm:StyleBorderElement" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Bottom" type="gnm:StyleBorderElement" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Left" type="gnm:StyleBorderElement" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Right" type="gnm:StyleBorderElement" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Diagonal" type="gnm:StyleBorderElement" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Rev-Diagonal" type="gnm:StyleBorderElement" minOccurs="0" maxOccurs="1"/>
+ </xs:choice>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Validation" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Expression0" type="xs:string" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Expression1" type="xs:string" minOccurs="0" maxOccurs="1"/>
+ </xs:sequence>
+ <xs:attribute name="Style" type="xs:integer" use="required"/>
+ <xs:attribute name="Type" type="xs:integer" use="required"/>
+ <xs:attribute name="Operator" type="xs:integer" use="optional"/>
+ <xs:attribute name="AllowBlank" type="xs:boolean" use="optional"/>
+ <xs:attribute name="UseDropdown" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Title" type="xs:string" use="optional"/>
+ <xs:attribute name="Message" type="xs:string" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="InputMessage" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:attribute name="Title" type="xs:string" use="optional"/>
+ <xs:attribute name="Message" type="xs:string" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Condition" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Expression0" type="xs:string" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Expression1" type="xs:string" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="Style" type="gnm:Style" minOccurs="1" maxOccurs="1"/>
+ </xs:sequence>
+ <xs:attribute name="Operator" type="gnm:CondOp" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="HAlign" type="gnm:horizontal_alignment"/>
+ <xs:attribute name="VAlign" type="gnm:vertical_alignment"/>
+ <xs:attribute name="WrapText" type="xs:boolean" />
+
+ <!-- should be bool, but some files have odd truth values -->
+ <xs:attribute name="ShrinkToFit" type="xs:integer" />
+
+ <xs:attribute name="Rotation" type="xs:integer" use="optional"/>
+ <xs:attribute name="Orient" type="xs:integer" use="optional"/>
+ <xs:attribute name="Shade" type="gnm:Stipple" use="optional"/>
+ <xs:attribute name="Indent" type="xs:integer" use="optional"/>
+ <xs:attribute name="Locked" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Hidden" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Fore" type="gnm:color" use="optional"/>
+ <xs:attribute name="Back" type="gnm:color" use="optional"/>
+ <xs:attribute name="PatternColor" type="gnm:color" use="optional"/>
+ <xs:attribute name="Format" type="xs:string" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:complexType name="StyleBorderElement">
+ <xs:attribute name="Style" type="gnm:border_style" use="required"/>
+ <!-- Color is present when Style is not 0 -->
+ <xs:attribute name="Color" type="gnm:color" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:simpleType name="border_style">
+ <xs:restriction base="xs:integer">
+ <!-- 0 = NONE
+ 1 = THIN
+ 2 = MEDIUM
+ 3 = DASHED
+ 4 = DOTTED
+ 5 = THICK
+ 6 = DOUBLE
+ 7 = HAIR
+ 8 = MEDIUM_DASH
+ 9 = DASH_DOT
+ 10 = MEDIUM_DASH_DOT
+ 11 = DASH_DOT_DOT
+ 12 = MEDIUM_DASH_DOT_DOT
+ 13 = SLANTED_DASH_DOT
+ -->
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="13"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="underline">
+ <xs:restriction base="xs:integer">
+ <!-- 0 = NONE
+ 1 = SINGLE
+ 2 = DOUBLE
+ -->
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="2"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="script">
+ <xs:restriction base="xs:integer">
+ <!-- GO_FONT_SCRIPT_SUB = -1,
+ GO_FONT_SCRIPT_STANDARD = 0,
+ GO_FONT_SCRIPT_SUPER = 1
+ -->
+ <xs:minInclusive value="-1"/>
+ <xs:maxInclusive value="1"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="horizontal_alignment">
+ <xs:restriction base="xs:integer">
+ <!-- this is a bit map as follows:
+ 1 = GENERAL
+ 2 = LEFT
+ 4 = RIGHT
+ 8 = CENTER
+ 16 = FILL
+ 32 = JUSTIFY
+ 64 = CENTER ACROSS SELECTION
+ 128 = DISTRIBUTED
+ -->
+ <xs:minInclusive value="1"/>
+ <xs:maxInclusive value="128"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="vertical_alignment">
+ <xs:restriction base="xs:integer">
+ <!-- this is a bit map as follows:
+ 1 = TOP
+ 2 = BOTTOM
+ 4 = CENTER
+ 8 = JUSTIFY
+ 16 = DISTRIBUTED
+ -->
+ <xs:minInclusive value="1"/>
+ <xs:maxInclusive value="16"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="Stipple">
+ <xs:restriction base="xs:integer">
+ <!-- the values are defined as follows:
+ 0 = NONE
+ 1 = Solid
+ 2 = 75%
+ 3 = 50%
+ 4 = 25%
+ 5 = 12.5%
+ 6 = 6.25%
+ 7 = Horizontal Stripe
+ 8 = Vertical Stripe
+ 9 = Reverse Diagonal Stripe
+ 10 = Diagonal Stripe
+ 11 = Diagonal Crosshatch
+ 12 = Thick Diagonal Crosshatch
+ 13 = Thin Horizontal Stripe
+ 14 = Thin Vertical Stripe
+ 15 = Thin Reverse Diagonal Stripe
+ 16 = Thin Diagonal Stripe
+ 17 = Thin Crosshatch
+ 18 = Thin Diagonal Crosshatch
+ 19 = Applix small circle
+ 20 = Applix semicircle
+ 21 = Applix small thatch
+ 22 = Applix round thatch
+ 23 = Applix Brick
+ 24 = 100%
+ 25 = 87.5%
+ -->
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="25"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="color">
+ <xs:restriction base="xs:string">
+ <!-- colors in hex, 16 bits red, green, then blue -->
+ <xs:pattern value="[0-9A-F]{1,4}:[0-9A-F]{1,4}:[0-9A-F]{1,4}"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="Col_Row">
+ <!-- column/row number -->
+ <xs:attribute name="No" type="xs:nonNegativeInteger" use="required"/>
+ <!-- size in points -->
+ <xs:attribute name="Unit" type="xs:double" use="required"/>
+ <!-- DEPRECATED in 1.7.1 : top/left margin (no unit it does not scale) -->
+ <xs:attribute name="MarginA" type="gnm:col_row_margin" use="optional"/>
+ <!-- DEPRECATED in 1.7.1 : botton/right margin (no unit it does not scale) -->
+ <xs:attribute name="MarginB" type="gnm:col_row_margin" use="optional"/>
+ <!-- true if size is explicitly set -->
+ <xs:attribute name="HardSize" type="xs:boolean" use="optional" default="0"/>
+ <xs:attribute name="Hidden" type="xs:boolean" use="optional" default="0"/>
+ <xs:attribute name="Collapsed" type="xs:boolean" use="optional" default="0"/>
+ <xs:attribute name="OutlineLevel" type="xs:integer" use="optional" default="0"/>
+ <!-- The number of consequitive identically sized cols/rows -->
+ <xs:attribute name="Count" type="xs:integer" use="optional" default="1"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:simpleType name="col_row_margin">
+ <xs:restriction base="xs:integer">
+ <xs:minInclusive value="0"/>
+ <xs:maxInclusive value="7"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="Selections">
+ <xs:sequence>
+ <xs:element name="Selection" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attribute name="startCol" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="startRow" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="endCol" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="endRow" type="xs:nonNegativeInteger" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="CursorCol" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="CursorRow" type="xs:nonNegativeInteger" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:attributeGroup name="ObjectAnchor">
+ <xs:attribute name="ObjectBound" type="xs:string" use="required"/>
+ <xs:attribute name="ObjectOffset" type="gnm:offsets" use="required"/>
+ <xs:attribute name="ObjectAnchorType" type="gnm:anchor_type" use="optional"/>
+ <xs:attribute name="Direction" type="gnm:direction" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:attributeGroup>
+
+ <xs:attributeGroup name="ObjectProperties">
+ <xs:attribute name="Print" type="xs:boolean" use="optional"/>
+ <xs:attribute name="Name" type="xs:string" use="optional"/>
+ </xs:attributeGroup>
+
+ <xs:attributeGroup name="ObjectAdjustmentProps">
+ <xs:attribute name="Min" type="xs:double" use="required"/>
+ <xs:attribute name="Max" type="xs:double" use="required"/>
+ <xs:attribute name="Inc" type="xs:double" use="required"/>
+ <xs:attribute name="Page" type="xs:double" use="required"/>
+ <xs:attribute name="Value" type="xs:double" use="required"/>
+ <xs:attribute name="Input" type="xs:string" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:attributeGroup>
+
+ <xs:complexType name="Objects">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element name="CellComment">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:attribute name="Author" type="xs:string" use="optional"/>
+ <xs:attribute name="Text" type="xs:string" use="required"/>
+ <xs:attribute name="TextFormat" type="xs:string" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SheetObjectFilled">
+ <xs:complexType>
+ <xs:choice minOccurs="0" maxOccurs="1">
+ <xs:any namespace="##local" processContents="lax"/>
+ </xs:choice>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:attribute name="OutlineColor" type="gnm:color" use="required"/>
+ <xs:attribute name="FillColor" type="gnm:color" use="required"/>
+ <xs:attribute name="Type" type="gnm:objectfilled" use="required"/>
+ <xs:attribute name="Width" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Label" type="xs:string" use="optional"/>
+ <xs:attribute name="LabelFormat" type="xs:string" use="optional"/>
+
+ <!-- the arrow shape attributes are only used if the type is
+ arrow (type="gnm:2")
+ -->
+ <xs:attribute name="ArrowShapeA" type="xs:double" use="optional"/>
+ <xs:attribute name="ArrowShapeB" type="xs:double" use="optional"/>
+ <xs:attribute name="ArrowShapeC" type="xs:double" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- widgets -->
+ <xs:element name="SheetWidgetButton">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:attribute name="Label" type="xs:string" use="required"/>
+ <xs:attribute name="Value" type="xs:integer" />
+ <xs:attribute name="Input" type="xs:string" />
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SheetWidgetCheckbox">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:attribute name="Label" type="xs:string" use="required"/>
+ <xs:attribute name="Value" type="xs:integer" use="required"/>
+ <xs:attribute name="Input" type="xs:string" />
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SheetWidgetToggleButton" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:attribute name="Label" type="xs:string" use="required"/>
+ <xs:attribute name="Value" type="xs:integer" use="required"/>
+ <xs:attribute name="Input" type="xs:string" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="SheetWidgetScrollbar">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectAdjustmentProps"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SheetWidgetSpinbutton">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectAdjustmentProps"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SheetWidgetSlider" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectAdjustmentProps"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="SheetObjectImage">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Content" form="unqualified">
+ <xs:complexType mixed="true">
+ <xs:attribute name="image-type" type="xs:string" use="required"/>
+ <xs:attribute name="size-bytes" type="xs:int" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:attribute name="crop-top" type="xs:double" use="required"/>
+ <xs:attribute name="crop-bottom" type="xs:double" use="required"/>
+ <xs:attribute name="crop-left" type="xs:double" use="required"/>
+ <xs:attribute name="crop-right" type="xs:double" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SheetObjectGraph">
+ <xs:complexType>
+ <xs:choice minOccurs="1" maxOccurs="1">
+ <xs:element name="GogObject" type="gnm:GogObject"/>
+ <xs:element name="GogObject" type="gnm:GogObject" form="unqualified"/>
+ </xs:choice>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SheetWidgetFrame">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SheetWidgetLabel">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SheetWidgetList">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:attribute name="Content" type="xs:string" use="required"/>
+ <xs:attribute name="Output" type="xs:string" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SheetWidgetCombo">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ <xs:attributeGroup ref="gnm:ObjectProperties"/>
+ <xs:attribute name="Content" type="xs:string" use="required"/>
+ <xs:attribute name="Output" type="xs:string" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- no longer supported -->
+ <xs:element name="SheetObjectBonobo">
+ <xs:complexType>
+ <xs:attributeGroup ref="gnm:ObjectAnchor"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:choice>
+ </xs:complexType>
+
+ <xs:complexType name="GogObject">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element name="property" type="gnm:GogProperty"/>
+ <xs:element name="property" type="gnm:GogProperty" form="unqualified"/>
+ <xs:element name="data" type="gnm:GOData"/>
+ <xs:element name="data" type="gnm:GOData" form="unqualified"/>
+ <xs:element name="GogObject" type="gnm:GogObject"/>
+ <xs:element name="GogObject" type="gnm:GogObject" form="unqualified"/>
+ </xs:choice>
+ <xs:attribute name="type" type="xs:string" use="optional"/>
+ <xs:attribute name="role" type="xs:string" use="optional"/>
+ </xs:complexType>
+
+ <xs:complexType name="GogProperty" mixed="true">
+ <xs:sequence>
+ <!-- children are unstructured -->
+ <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:string" use="required"/>
+ <xs:attribute name="type" type="xs:string" use="optional"/>
+ </xs:complexType>
+
+ <xs:complexType name="GOData">
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element name="dimension" type="gnm:GODimension"/>
+ <xs:element name="dimension" type="gnm:GODimension" form="unqualified"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="GODimension">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="id" type="xs:integer" use="required"/>
+ <xs:attribute name="type" type="xs:string" use="required"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+
+ <xs:simpleType name="offsets">
+ <xs:restriction base="xs:string">
+ <!-- if this seems hard to read, it purportedly describes 4
+ space-separated doubles
+ -->
+ <xs:pattern value="[+\-]?\d+(.\d+)?([Ee]([+\-])?\d+)? [+\-]?\d+(.\d+)?([Ee]([+\-])?\d+)? [+\-]?\d+(.\d+)?([Ee]([+\-])?\d+)? [+\-]?\d+(.\d+)?([Ee]([+\-])?\d+)?"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <!-- As of 1.7.7 this is deprecated -->
+ <xs:simpleType name="anchor_type">
+ <xs:restriction base="xs:string">
+ <!-- if this seems hard to read, it purportedly describes 4
+ space-separated positive numbers
+
+ each number needs to be one of the following:
+ 0 = UNKNOWN
+ 16 = PERCENTAGE_FROM_COLROW_START
+ 32 = PTS_FROM_COLROW_START
+ 33 = PTS_FROM_COLROW_END
+ 48 = PTS_ABSOLUTE
+ -->
+ <xs:pattern value="\d+ \d+ \d+ \d+"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="direction">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="-1"/>
+ <!-- unknown -->
+ <xs:enumeration value="0"/>
+ <!-- up right -->
+ <xs:enumeration value="1"/>
+ <!-- up left -->
+ <xs:enumeration value="16"/>
+ <!-- down right -->
+ <xs:enumeration value="17"/>
+ <!-- down left -->
+ <xs:enumeration value="255"/>
+ <!-- unknown -->
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="objectfilled">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="1"/>
+ <!-- line -->
+ <xs:enumeration value="2"/>
+ <!-- arrow -->
+ <xs:enumeration value="101"/>
+ <!-- box -->
+ <xs:enumeration value="102"/>
+ <!-- oval -->
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="Cells">
+ <xs:sequence>
+ <xs:element name="Cell" minOccurs="0" maxOccurs="unbounded">
+ <!-- expressions are stored as entered, with a leading '='.
+ Once a shared expression has been defined, subsequent
+ Cell elements using that same shared expression simply
+ use the "ExprID" attribute to indicate which shared
+ expression is used, and no Content element is included
+ -->
+ <xs:complexType mixed="true">
+ <!-- Compatibility for ancient 0.x format -->
+ <xs:sequence>
+ <xs:element name="Content" type="xs:string" minOccurs="0" maxOccurs="1"/>
+ </xs:sequence>
+
+ <!-- Col and Row are sufficient for a cell that is an element of
+ an array of cells as long as it's not the top left cell -->
+ <xs:attribute name="Col" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Row" type="xs:nonNegativeInteger" use="required"/>
+ <!-- ExprID is only used to refer to a shared expression -->
+ <xs:attribute name="ExprID" type="xs:nonNegativeInteger" use="optional"/>
+ <!-- ValueType is not used if the cell contains an expression -->
+ <xs:attribute name="ValueType" type="gnm:ValueType" use="optional"/>
+ <!-- ValueFormat is apparently used only for cell-by-cell format overrides -->
+ <xs:attribute name="ValueFormat" type="xs:string" use="optional"/>
+ <!-- Cols and Rows are used to define an array of cells -->
+ <xs:attribute name="Cols" type="xs:positiveInteger" use="optional"/>
+ <xs:attribute name="Rows" type="xs:positiveInteger" use="optional"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:simpleType name="ValueType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="10"/>
+ <!-- empty -->
+ <xs:enumeration value="20"/>
+ <!-- boolean -->
+ <xs:enumeration value="30"/>
+ <!-- integer -->
+ <xs:enumeration value="40"/>
+ <!-- float -->
+ <xs:enumeration value="50"/>
+ <!-- error -->
+ <xs:enumeration value="60"/>
+ <!-- string -->
+ <xs:enumeration value="70"/>
+ <!-- cellrange -->
+ <xs:enumeration value="80"/>
+ <!-- array -->
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="CondOp">
+ <xs:restriction base="xs:nonNegativeInteger">
+ <xs:enumeration value="0"/>
+ <!-- GNM_STYLE_COND_BETWEEN -->
+ <xs:enumeration value="1"/>
+ <!-- GNM_STYLE_COND_NOT_BETWEEN -->
+ <xs:enumeration value="2"/>
+ <!-- GNM_STYLE_COND_EQUAL -->
+ <xs:enumeration value="3"/>
+ <!-- GNM_STYLE_COND_NOT_EQUAL -->
+ <xs:enumeration value="4"/>
+ <!-- GNM_STYLE_COND_GT -->
+ <xs:enumeration value="5"/>
+ <!-- GNM_STYLE_COND_LT -->
+ <xs:enumeration value="6"/>
+ <!-- GNM_STYLE_COND_GTE -->
+ <xs:enumeration value="7"/>
+ <!-- GNM_STYLE_COND_LTE -->
+
+ <!-- Arbitrary expr evaluated at EvalPos -->
+ <xs:enumeration value="8"/>
+ <!-- GNM_STYLE_COND_CUSTOM -->
+
+ <!-- New in Gnumeric 1.8 -->
+ <xs:enumeration value="16"/>
+ <!-- GNM_STYLE_COND_CONTAINS_STR -->
+ <xs:enumeration value="17"/>
+ <!-- GNM_STYLE_COND_NOT_CONTAINS_STR -->
+ <xs:enumeration value="18"/>
+ <!-- GNM_STYLE_COND_BEGINS_WITH_STR -->
+ <xs:enumeration value="19"/>
+ <!-- GNM_STYLE_COND_NOT_BEGINS_WITH_STR -->
+ <xs:enumeration value="20"/>
+ <!-- GNM_STYLE_COND_ENDS_WITH_STR -->
+ <xs:enumeration value="21"/>
+ <!-- GNM_STYLE_COND_NOT_ENDS_WITH_STR -->
+
+ <xs:enumeration value="22"/>
+ <!-- GNM_STYLE_COND_CONTAINS_ERR -->
+ <xs:enumeration value="23"/>
+ <!-- GNM_STYLE_COND_NOT_CONTAINS_ERR -->
+
+ <xs:enumeration value="24"/>
+ <!-- GNM_STYLE_COND_CONTAINS_BLANKS -->
+ <xs:enumeration value="25"/>
+ <!-- GNM_STYLE_COND_NOT_CONTAINS_BLANK -->
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="FilterFieldType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="expr"/>
+ <xs:enumeration value="blanks"/>
+ <xs:enumeration value="nonblanks"/>
+ <xs:enumeration value="bucket"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="FilterFieldOp">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="eq"/>
+ <xs:enumeration value="gt"/>
+ <xs:enumeration value="lt"/>
+ <xs:enumeration value="gte"/>
+ <xs:enumeration value="lte"/>
+ <xs:enumeration value="ne"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="FilterField">
+ <xs:attribute name="Index" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Type" type="gnm:FilterFieldType" use="required"/>
+
+ <!-- WARNING WARNING WARNING
+ Value and ValueType have their senses
+ reversed due to an old typo -->
+ <!-- Only valid for Type=expr -->
+ <xs:attribute name="Value0" type="gnm:ValueType" use="optional"/>
+ <xs:attribute name="ValueType0" type="xs:string" use="optional"/>
+ <xs:attribute name="Op0" type="gnm:FilterFieldOp" use="optional"/>
+ <xs:attribute name="Value1" type="gnm:ValueType" use="optional"/>
+ <xs:attribute name="ValueType1" type="xs:string" use="optional"/>
+ <xs:attribute name="Op1" type="gnm:FilterFieldOp" use="optional"/>
+
+ <!-- Only valid for Type=bucket -->
+ <xs:attribute name="top" type="xs:boolean" use="optional"/>
+ <!-- top vs bottom -->
+ <xs:attribute name="items" type="xs:boolean" use="optional"/>
+ <!-- top n vs top n% -->
+ <xs:attribute name="count" type="xs:double" use="optional"/>
+ <!-- top COUNT -->
+
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:complexType name="Filters">
+ <xs:sequence>
+ <xs:element name="Filter" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Field" type="gnm:FilterField" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="Area" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="MergedRegions">
+ <xs:sequence>
+ <xs:element name="Merge" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:complexType name="Solver">
+ <xs:sequence>
+ <xs:element name="Constr" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attribute name="Lcol" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Lrow" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Rcol" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Rrow" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Cols" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Rows" type="xs:nonNegativeInteger" use="required"/>
+ <xs:attribute name="Type" type="gnm:solver_constraint_t" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="TargetCol" type="xs:integer" use="optional"/>
+ <xs:attribute name="TargetRow" type="xs:integer" use="optional"/>
+ <xs:attribute name="ProblemType" type="gnm:solver_problem_t" use="required"/>
+ <xs:attribute name="ModelType" type="gnm:model_type_t"/>
+ <xs:attribute name="Inputs" type="xs:string"/>
+ <xs:attribute name="MaxTime" type="xs:integer" use="required"/>
+ <xs:attribute name="MaxIter" type="xs:integer" use="required"/>
+ <xs:attribute name="NonNeg" type="xs:boolean" use="required"/>
+ <xs:attribute name="Discr" type="xs:boolean" use="required"/>
+ <xs:attribute name="AutoScale" type="xs:boolean" use="required"/>
+ <xs:attribute name="ShowIter" type="xs:boolean"/>
+ <xs:attribute name="AnswerR" type="xs:boolean"/>
+ <xs:attribute name="SensitivityR" type="xs:boolean"/>
+ <xs:attribute name="LimitsR" type="xs:boolean"/>
+ <xs:attribute name="PerformR" type="xs:boolean"/>
+ <xs:attribute name="ProgramR" type="xs:boolean" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+
+ <xs:simpleType name="solver_constraint_t">
+ <xs:restriction base="xs:integer">
+ <xs:enumeration value="0" />
+ <!-- none -->
+ <xs:enumeration value="1" />
+ <!-- &lt;= -->
+ <xs:enumeration value="2" />
+ <!-- &gt;= -->
+ <xs:enumeration value="4" />
+ <!-- = -->
+ <xs:enumeration value="8" />
+ <!-- Int -->
+ <xs:enumeration value="16"/>
+ <!-- boolean -->
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="solver_problem_t">
+ <xs:restriction base="xs:integer">
+ <xs:enumeration value="0" />
+ <!-- SolverMinimize -->
+ <xs:enumeration value="1" />
+ <!-- SolverMaximize -->
+ <xs:enumeration value="2" />
+ <!-- SolverEqualTo -->
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="model_type_t">
+ <xs:restriction base="xs:integer">
+ <xs:enumeration value="0" />
+ <!-- GNM_SOLVER_LP -->
+ <xs:enumeration value="1" />
+ <!-- GNM_SOLVER_QP -->
+ <xs:enumeration value="2" />
+ <!-- GNM_SOLVER_NLP -->
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="SheetVisibility">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="GNM_SHEET_VISIBILITY_VISIBLE"/>
+ <xs:enumeration value="GNM_SHEET_VISIBILITY_HIDDEN"/>
+ <xs:enumeration value="GNM_SHEET_VISIBILITY_VERY_HIDDEN"/>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:complexType name="Scenarios">
+ <xs:sequence>
+ <xs:element name="Scenario" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Name" type="xs:string"/>
+ <xs:element name="Comment" type="xs:string"/>
+ <xs:element name="CellsStr" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="SheetLayout">
+ <xs:sequence>
+ <xs:element name="FreezePanes" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:attribute name="FrozenTopLeft" type="xs:string" use="required"/>
+ <xs:attribute name="UnfrozenTopLeft" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="TopLeft" type="xs:string" use="required"/>
+ <xs:anyAttribute namespace="##other" processContents="lax"/>
+ </xs:complexType>
+</xs:schema>
diff --git a/misc/xml-tokens/ooxml-extra-tokens.txt b/misc/xml-tokens/ooxml-extra-tokens.txt
new file mode 100644
index 0000000..a39f3d0
--- /dev/null
+++ b/misc/xml-tokens/ooxml-extra-tokens.txt
@@ -0,0 +1,3 @@
+AlternateContent
+Choice
+Fallback
diff --git a/misc/xml-tokens/token_util.py b/misc/xml-tokens/token_util.py
new file mode 100644
index 0000000..19ba436
--- /dev/null
+++ b/misc/xml-tokens/token_util.py
@@ -0,0 +1,70 @@
+########################################################################
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+########################################################################
+
+import sys
+
+
+unknown_token_name = "??"
+
+
+def normalize_name(old):
+ new = ''
+ for c in old:
+ if c in '.-': # '.' nad '-' are not allowed in C++ symbols.
+ c = '_'
+ new += c
+ return new
+
+
+def gen_token_list(filepath, tokens, ns_tokens):
+ dic = {}
+ for t in tokens:
+ dic[t] = True
+ for t in ns_tokens:
+ dic[t] = True
+
+ keys = dic.keys()
+ keys.sort()
+ file = open(filepath, 'w')
+ for key in keys:
+ file.write(key + "\n")
+ file.close()
+
+
+def get_auto_gen_warning():
+ return "// This file has been auto-generated. Do not hand-edit this."
+
+
+def gen_token_constants(outfile, tokens):
+
+ with open(outfile, "w") as f:
+ print(get_auto_gen_warning(), file=f)
+ print(file=f)
+
+ for i, token in enumerate(tokens):
+ token = normalize_name(token)
+ print(f"const xml_token_t XML_{token} = {i+1};", file=f)
+
+
+def gen_token_names(outfile, tokens):
+
+ with open(outfile, "w") as f:
+ print(get_auto_gen_warning(), file=f)
+ print(file=f)
+
+ print("const char* token_names[] = {", file=f)
+ print(f" \"{unknown_token_name}\", // 0", file=f)
+
+ for i, token in enumerate(tokens):
+ s = ','
+ if i == len(tokens) - 1:
+ s = ' '
+ print(f" \"{token}\"{s} // {i+1}", file=f)
+ print("};", file=f)
+ print(file=f)
+ print(f"size_t token_name_count = {len(tokens)+1};", file=f)
diff --git a/misc/xml-tokens/xls-xml-tokens.txt b/misc/xml-tokens/xls-xml-tokens.txt
new file mode 100644
index 0000000..c7aa93c
--- /dev/null
+++ b/misc/xml-tokens/xls-xml-tokens.txt
@@ -0,0 +1,991 @@
+AcceptLabelsInFormulas
+Action
+ActiveChart
+ActiveCol
+ActiveColumn
+ActivePane
+ActiveRow
+ActiveRows
+ActiveSheet
+Aggregate
+AlertVersion
+Alignment
+AllItemName
+AllowDeleteCols
+AllowDeleteRows
+AllowFilter
+AllowFormatCells
+AllowInsertCols
+AllowInsertHyperlinks
+AllowInsertRows
+AllowPNG
+AllowSizeCols
+AllowSizeRows
+AllowSort
+AllowUsePivotTables
+AlternateMethod
+AppName
+Append
+ApplyAutomaticOutlineStyles
+Area
+ArrayRange
+Async
+Attribute
+AttributeType
+Authentication
+Author
+AutoFilter
+AutoFilterAnd
+AutoFilterColumn
+AutoFilterCondition
+AutoFilterOr
+AutoFitHeight
+AutoFitWidth
+AutoFormatAlignment
+AutoFormatBorder
+AutoFormatFont
+AutoFormatName
+AutoFormatNumber
+AutoFormatPattern
+AutoFormatWidth
+AutoRepublish
+AutoShowCount
+AutoShowField
+AutoShowRange
+AutoShowType
+AutoSortField
+AutoSortOrder
+B
+BackgroundQuery
+BaseField
+BaseItem
+Basic
+Behavior
+Binding
+BlackAndWhite
+BlankLineAfterItems
+BlockTotal
+Bold
+Boolean
+Border
+Borders
+Bottom
+BoundField
+Bytes
+CacheDetails
+CacheFile
+CacheIndex
+CachePosition
+CalculatedMember
+Calculation
+CantGetUniqueItems
+Caption
+CaptionAlignment
+CaseSensitive
+Category
+Cell
+CellRangeList
+CellsExpanded
+CellsExpandedSeqNum
+CellsNotExpanded
+CenterHorizontal
+CenterVertical
+Cf
+CharSet
+Characters
+CharactersWithSpaces
+ClientParameter
+ClientParameterBinding
+ClientParameterBindings
+ClientParameterValue
+Clipped
+CodeName
+Col1
+Col10
+Col11
+Col12
+Col13
+Col14
+Col15
+Col16
+Col17
+Col18
+Col19
+Col2
+Col20
+Col3
+Col4
+Col5
+Col6
+Col7
+Col8
+Col9
+ColBreak
+ColBreaks
+ColFirst
+ColLast
+Color
+Column
+ColumnInfo
+ColumnInputCell
+ColumnName
+ComboHide
+Comma
+CommandText
+CommandTextOrignal
+CommandType
+Comment
+CommentsLayout
+Company
+ComponentOptions
+Condition
+ConditionalFormatting
+Connection
+ConnectionInfo
+ConnectionString
+Consecutive
+ConsolidationReference
+Count
+CountOfSameItems
+CreateBackup
+Created
+Credential
+CredentialBinding
+CredentialValue
+Crn
+CubeField
+CubeSource
+CurrentPage
+Custom
+CustomDocumentProperties
+Data
+DataAxisEmpty
+DataField
+DataMember
+DataSource
+DataTable
+DataType
+DataValidation
+DataValueEditing
+Date1904
+Decimal
+DefaultColumnWidth
+DefaultItem
+DefaultRowHeight
+DefaultValue
+DefaultVersion
+DeletedTitle
+Delimiters
+Descending
+Description
+DetailFormat
+DetailMaxHeight
+DetailMaxWidth
+DetailRowHeight
+DetailSortOrder
+DetailWidth
+Dimension
+DisableDateRecognition
+DisableDrillDown
+DisableEdit
+DisableFieldDialog
+DisableRefresh
+DisableWizard
+DisplayDrawingObjects
+DisplayEmptyMembers
+DisplayErrorString
+DisplayFieldList
+DisplayFormulas
+DisplayIn
+DisplayInkNotes
+DisplayPageBreak
+DisplayRightToLeft
+DivID
+DoNotCalculateBeforeSave
+DoNotDisplayColHeaders
+DoNotDisplayGridlines
+DoNotDisplayHeadings
+DoNotDisplayOutline
+DoNotDisplayRowHeaders
+DoNotDisplayZeros
+DoNotJoinDelimiters
+DoNotPersist
+DoNotPersistSort
+DoNotPersstAF
+DoNotPromptForFile
+DoNotSaveLinkValues
+DocumentProperties
+DontShowInFieldList
+DownloadComponents
+DraftQuality
+DrawAspect
+DrilledLevel
+DrilledMember
+EditWebPage
+ElementType
+EmbedSaveSmartTags
+EnableMultiplePageItems
+EnableRedirections
+EnableSelection
+Encode
+EntirePage
+Entry
+Error
+ErrorHide
+ErrorMessage
+ErrorString
+ErrorStyle
+ErrorTitle
+ExcelName
+ExcelType
+ExcelWorkbook
+ExcelWorksheetType
+Expanded
+ExpandedColumnCount
+ExpandedRowCount
+ExternName
+ExtraLeftColumns
+ExtraRightColumns
+Face
+Family
+Family
+Field
+FieldLabelFormat
+FieldListBottom
+FieldListLeft
+FieldListRight
+FieldListTop
+FieldStart
+FieldType
+File
+FileName
+FillDown
+Filled
+FilterCaption
+FilterMember
+FilterOn
+FirstVisibleSheet
+FitHeight
+FitToPage
+FitWidth
+Font
+FontName
+Footer
+Format
+FormatSettings
+FormatType
+Formula
+FormulaIndex
+FormulaV10
+FreezePanes
+FrozenNoSplit
+FullColumns
+FullRows
+Function
+FunctionGroup
+FunctionGroupIndex
+FuturePersist
+FutureVer
+GrandTotalString
+GridlineColor
+GridlineColorIndex
+Gridlines
+GroupBy
+GroupDefinition
+GroupEnd
+GroupEndAuto
+GroupLevel
+GroupMember
+GroupNumber
+GroupStart
+GroupStartAuto
+GroupType
+GroupedWidth
+Guid
+HRef
+HRefScreenTip
+HTMLFormat
+HTMLTables
+HasNoAutoFormat
+HasNoRecords
+Header
+HeaderRange
+HeaderRow
+Height
+Hidden
+HideDetail
+HideDropDowns
+HideFormula
+HideHorizontalScrollBar
+HideInactiveListBorder
+HideOfficeLogo
+HidePivotTableFieldList
+HideTotalsAnnotation
+HideVerticalScrollBar
+HideWorkbookTabs
+Horizontal
+HorizontalResolution
+Href
+HtmlType
+HyperlinkBase
+I
+ID
+IMEMode
+Id
+IdWrapped
+If
+ImmediateItemsOnDrop
+Indent
+Index
+IndividualCellBorders
+InputHide
+InputMessage
+InputTitle
+InsertEntireRows
+InstanceShape
+Interior
+IntlMacro
+Invalid
+InvertedColumnMember
+InvertedRowMember
+IsGroupLevel
+IsMemberProperty
+IsNotFiltered
+Italic
+Item
+ItemType
+Iteration
+KeyboardShortcut
+Keywords
+Label
+LastAuthor
+LastPrinted
+LastSaved
+Layout
+LayoutForm
+LayoutPageBreak
+LayoutSubtotalLocation
+LeafColumnMember
+LeafRowMember
+Left
+LeftCell
+LeftColumnRightPane
+LeftColumnVisible
+LeftToRight
+LengthLevelUniqueName
+Level
+LineStyle
+Lines
+LoadMode
+LocalConnection
+Location
+LocationOfComponents
+Macro
+MainFile
+Maintain
+MajorVersion
+Manager
+Map
+MapChildItems
+MapID
+MapInfo
+Mapdata
+Margin
+Max
+MaxChange
+MaxHeight
+MaxIterations
+MaxWidth
+Measure
+Member
+MemberExpand
+MemberFormat
+MemberName
+MemberPropertiesOrder
+MemberProperty
+MemberPropertyParent
+MergeAcross
+MergeDown
+MergeLabels
+Min
+MinorVersion
+Missing
+MissingItemsLimit
+Moper
+MoveAfterReturn
+Name
+NamedCell
+NamedRange
+Names
+Namespace
+NewAsync
+NewItemsHidden
+NextId
+NextSheetNumber
+NoAutoFit
+NoAutoFormatWidth
+NoAutoPage
+NoAutoRecover
+NoAutofit
+NoColumnGrand
+NoDetailAutoFit
+NoDisplayNullString
+NoDragToColumn
+NoDragToData
+NoDragToHide
+NoDragToPage
+NoDragToRow
+NoInserts
+NoPreserveFormatting
+NoPrintRepeatItems
+NoPrinterInfo
+NoRefreshCache
+NoRowGrand
+NoSaveData
+NoSummaryColumnsRightDetail
+NoSummaryRowsBelowDetail
+NoTextToColumns
+NoTitles
+NoToggleDataHeader
+NoViewCalculatedMembers
+NonDefaultName
+NotInverted
+NotVisible
+NullString
+Number
+NumberFormat
+NumberOfCopies
+OLEObject
+OWCVersion
+ObjectID
+OfficeDocumentSettings
+OleLink
+Operator
+OptimizeCache
+Orientation
+Outline
+OverwriteCells
+PLCaption
+PLDataOrientation
+PLExport
+PLGroupType
+PLName
+PLPivotField
+PLPosition
+PLSubtotal
+PLTPivotItem
+PLTotal
+PTFormat
+PTFormula
+PTLineItem
+PTLineItems
+PTPivotData
+PTRule
+PTSource
+PageBreakZoom
+PageBreaks
+PageFieldOrder
+PageFieldStyle
+PageFieldWrapCount
+PageMargins
+PageSetup
+Pages
+Pane
+Panes
+PaperSizeIndex
+Paragraphs
+Parameter
+ParameterType
+ParameterValue
+Parent
+ParentField
+ParentIsOther
+ParentName
+ParentUniqueName
+ParseFormulaAsV10
+ParseRuleAsV10
+PasteFormula
+PasteRefersTo
+Path
+Pattern
+PatternColor
+PivotAxis
+PivotCache
+PivotField
+PivotItem
+PivotTable
+PivotView
+Position
+PrecisionAsDisplayed
+PresentationFormat
+Print
+PrintErrors
+PrintSetTitles
+ProgID
+PromptString
+ProtectContents
+ProtectObjects
+ProtectScenarios
+ProtectStructure
+ProtectWindows
+Protected
+Protection
+Proxy
+PublishObject
+PublishObjects
+Purpose
+QTSource
+Qualifier
+Query97
+QuerySource
+QueryTable
+QueryType
+Range
+RangeSelection
+ReadOnly
+ReadingOrder
+RefModeR1C1
+Reference
+RefersTo
+RefreshDate
+RefreshDateCopy
+RefreshInfo
+RefreshName
+RefreshOnChange
+RefreshOnFileOpen
+RefreshTimeSpan
+RefreshedInXl9
+Resource
+Revision
+Right
+RightToLeft
+RobustConnect
+RootElement
+Rotate
+Rotation
+Row
+RowBreak
+RowBreaks
+RowColHeadings
+RowInputCell
+RowLast
+RowNumbers
+Rule
+RuleType
+RuleV10
+S
+SOAPAction
+SQLType
+Scale
+Schema
+SchemaID
+SchemaRef
+Selected
+SelectedSheets
+Selection
+SelectionNamespaces
+SemiColon
+SeqNum
+Sequence
+ServerBased
+ServerSortOrder
+Set
+Shadow
+ShapeID
+SheetIndex
+SheetName
+ShowAllItems
+ShowAlways
+ShowCellBackgroundFromOLAP
+ShowImportExportValidationErrors
+ShowPageBreakZoom
+ShowPageMultipleItemLabel
+ShowTotals
+ShrinkToFit
+Size
+SmallGrid
+SmartTagType
+SmartTags
+SolveOrder
+Sort
+SortKey
+SortOrder
+Sorting
+Source
+SourceConnectionFile
+SourceConsolidation
+SourceDataFile
+SourceHierarchy
+SourceHierarchyLevel
+SourceName
+SourceType
+Space
+SpaceAbove
+SpaceBelow
+Span
+SplitHorizontal
+SplitVertical
+SpreadsheetAutoFit
+StandardWidth
+StartPageNumber
+StartRow
+StrikeThrough
+Style
+StyleID
+Styles
+Sub
+SubType
+Subject
+Subtotal
+SubtotalFormat
+SubtotalHiddenPageItems
+SubtotalName
+Sup
+SupBook
+Synchronous
+Tab
+TabColorIndex
+TabRatio
+Table
+TableStyle
+Tag
+Text
+TextQualifier
+TextWizardSettings
+ThousandSeparator
+Ticked
+Title
+Toolbar
+TooltipInfo
+Top
+TopCell
+TopRowBottomPane
+TopRowVisible
+TotalAlignment
+TotalAllMembers
+TotalCaptionAlignment
+TotalFormat
+TotalTime
+TotalWidth
+TransitionExpressionEvaluation
+TransitionFormulaEntry
+Type
+U
+URLString
+Uncalced
+Underline
+UniqueName
+Unsynced
+UseBlank
+UseLocalConnection
+UseSameSettings
+User
+VMLFrame
+VacatedStyle
+ValidPrinterInfo
+Value
+Value1
+Value2
+Version
+VersionLastEdit
+VersionLastRefresh
+VersionLastUpdate
+VersionRefreshableMin
+VersionUpdateableMin
+Vertical
+VerticalAlign
+VerticalResolution
+VerticalText
+ViewableRange
+Visible
+VisualTotals
+WantAdvise
+WantPict
+Watch
+Watches
+WebPostString
+Weight
+Width
+WindowHeight
+WindowHidden
+WindowIconic
+WindowTopX
+WindowTopY
+WindowWidth
+Windows
+Words
+Workbook
+WorkbookOptions
+Worksheet
+WorksheetOptions
+WorksheetSource
+WrapText
+XPath
+XSDType
+Xct
+ZeroHeight
+Zoom
+accentbar
+adj
+adjusthandles
+alignshape
+allowincell
+allowoverlap
+alt
+althref
+angle
+arc
+arcsize
+arrowok
+aspect
+aspectratio
+attribute
+autorotationcenter
+backdepth
+background
+bilevel
+blacklevel
+borderbottomcolor
+borderleftcolor
+borderrightcolor
+bordertopcolor
+brightness
+bullet
+button
+bwmode
+bwnormal
+bwpure
+callout
+caption
+chromakey
+class
+clip
+color
+color2
+colormenu
+colormode
+colormru
+colors
+complex
+connectangles
+connectloc
+connectlocs
+connectortype
+connecttype
+content
+control1
+control2
+coordorigin
+coordsize
+cropbottom
+cropleft
+cropping
+cropright
+croptop
+curve
+dashstyle
+data
+datatype
+detectmouseclick
+diffusity
+displaycustomheaders
+distance
+doubleclicknotify
+drop
+dropauto
+dt
+edge
+editas
+embosscolor
+end
+endAngle
+endarrow
+endarrowlength
+endarrowwidth
+endcap
+entry
+eqn
+ext
+extends
+extrusion
+extrusioncolor
+extrusionok
+f
+facet
+fill
+fillcolor
+filled
+fillok
+filltype
+fitpath
+fitshape
+focus
+focusposition
+focussize
+forcedash
+foredepth
+formulas
+from
+gain
+gamma
+gap
+gradientshapeok
+grayscale
+group
+grouping
+h
+handles
+hidden
+how
+hr
+hralign
+href
+hrheight
+hrnoshade
+hrpct
+hrstd
+hrwidth
+id
+idmap
+idref
+image
+imagealignshape
+imageaspect
+imagedata
+imagesize
+inset
+insetmode
+invx
+invy
+joinstyle
+length
+lengthspecified
+lightface
+lightharsh
+lightharsh2
+lightlevel
+lightlevel2
+lightposition
+lightposition2
+limo
+line
+linestyle
+lock
+lockrotationcenter
+map
+master
+matrix
+maxLength
+metal
+method
+minusx
+minusy
+miterlimit
+movie
+name
+namespaceuri
+new
+obscured
+offset
+offset2
+old
+ole
+oleicon
+oleid
+on
+oned
+onmouseover
+opacity
+opacity2
+orientation
+orientationangle
+origin
+oval
+password
+path
+phonetictext
+plane
+points
+polar
+polyline
+position
+preferrelative
+print
+proxy
+r
+radiusrange
+rect
+regroupid
+regrouptable
+relativeposition
+render
+rotation
+rotationangle
+rotationcenter
+roundrect
+row
+ruleinitiator
+ruleproxy
+rules
+selection
+shadow
+shadowcolor
+shadowok
+shape
+shapedefaults
+shapelayout
+shapetype
+shininess
+singleclick
+size
+skew
+skewamt
+skewangle
+specularity
+spid
+spidmax
+spt
+src
+start
+startAngle
+startarrow
+startarrowlength
+startarrowwidth
+string
+stroke
+strokecolor
+stroked
+strokeok
+strokeweight
+style
+switch
+tablelimits
+tableproperties
+target
+targetscreensize
+text
+textborder
+textbox
+textboxrect
+textpath
+textpathok
+title
+to
+trim
+type
+url
+useExplicit
+userId
+userdrawn
+userhidden
+v
+verticies
+viewpoint
+viewpointorigin
+visible
+weight
+worksheetoptions
+wrapcoords
+xrange
+xscale
+yrange