From 6a70b84166c3fc26ad63a9ed82238ed29685ec17 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Fri, 13 May 2011 01:34:24 -0400 Subject: [PATCH 01/32] docs on xlsx --- tablib/core.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tablib/core.py b/tablib/core.py index 03547ff..f464b55 100644 --- a/tablib/core.py +++ b/tablib/core.py @@ -377,7 +377,11 @@ class Dataset(object): @property def xls(): - """An Excel Spreadsheet representation of the :class:`Dataset` object, with :ref:`separators`. Cannot be set. + """A Legacy Excel Spreadsheet representation of the :class:`Dataset` object, with :ref:`separators`. Cannot be set. + + .. note:: + + XLS files are limited to a maximum of 65,000 rows. Use :class:`Dataset.xlsx` to avoid this limitation. .. admonition:: Binary Warning @@ -390,7 +394,7 @@ class Dataset(object): @property def xlsx(): - """An Excel Spreadsheet representation of the :class:`Dataset` object, with :ref:`separators`. Cannot be set. + """An Excel '07+ Spreadsheet representation of the :class:`Dataset` object, with :ref:`separators`. Cannot be set. .. admonition:: Binary Warning From 06a7b4cd4e448ef69a4023a5a5bc4372026a7313 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Fri, 13 May 2011 01:42:42 -0400 Subject: [PATCH 02/32] new roadmap --- README.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.rst b/README.rst index a412ec9..f57ef08 100644 --- a/README.rst +++ b/README.rst @@ -145,9 +145,8 @@ Roadmap ------- v1.0.0: - - Add hooks system + - Hooks system - Tablib.ext namespace - - Better 2.x/3.x handling (currently internal codebase fork) - Width detection on XLS out From 2e03046a071573f8ff42430dac51e0e94c8845b5 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Fri, 13 May 2011 01:46:37 -0400 Subject: [PATCH 03/32] docs fix --- docs/tutorial.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial.rst b/docs/tutorial.rst index 07939c2..6d50db5 100644 --- a/docs/tutorial.rst +++ b/docs/tutorial.rst @@ -259,7 +259,7 @@ Let's tag some students. :: Now that we have extra meta-data on our rows, we can use easily filter our :class:`Dataset`. Let's just see Male students. :: - >>> data.filter(['male']).yaml + >>> students.filter(['male']).yaml - {first: Kenneth, Last: Reitz} It's that simple. The original :class:`Dataset` is untouched. From a4e77f22c4989ee6fd87971cc9dadd395a00fda1 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Fri, 13 May 2011 01:47:16 -0400 Subject: [PATCH 04/32] .orig? geeze.. --- test_tablib.py.orig | 522 -------------------------------------------- 1 file changed, 522 deletions(-) delete mode 100755 test_tablib.py.orig diff --git a/test_tablib.py.orig b/test_tablib.py.orig deleted file mode 100755 index 21131bb..0000000 --- a/test_tablib.py.orig +++ /dev/null @@ -1,522 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -"""Tests for Tablib.""" - -import unittest -import sys - -if sys.version_info[0] > 2: - from tablib.packages import markup3 as markup -else: - from tablib.packages import markup - - - -import tablib - - - -class TablibTestCase(unittest.TestCase): - """Tablib test cases.""" - - def setUp(self): - """Create simple data set with headers.""" - - global data, book - - data = tablib.Dataset() - book = tablib.Databook() - - self.headers = ('first_name', 'last_name', 'gpa') - self.john = ('John', 'Adams', 90) - self.george = ('George', 'Washington', 67) - self.tom = ('Thomas', 'Jefferson', 50) - - self.founders = tablib.Dataset(headers=self.headers) - self.founders.append(self.john) - self.founders.append(self.george) - self.founders.append(self.tom) - - - def tearDown(self): - """Teardown.""" - pass - - - def test_empty_append(self): - """Verify append() correctly adds tuple with no headers.""" - new_row = (1, 2, 3) - data.append(new_row) - - # Verify width/data - self.assertTrue(data.width == len(new_row)) - self.assertTrue(data[0] == new_row) - - - def test_empty_append_with_headers(self): - """Verify append() correctly detects mismatch of number of - headers and data. - """ - data.headers = ['first', 'second'] - new_row = (1, 2, 3, 4) - - self.assertRaises(tablib.InvalidDimensions, data.append, new_row) - - - def test_add_column(self): - """Verify adding column works with/without headers.""" - - data.append(['kenneth']) - data.append(['bessie']) - - new_col = ['reitz', 'monke'] - - data.append(col=new_col) - - self.assertEquals(data[0], ('kenneth', 'reitz')) - self.assertEquals(data.width, 2) - - # With Headers - data.headers = ('fname', 'lname') - new_col = [21, 22] - data.append(col=new_col, header='age') - - self.assertEquals(data['age'], new_col) - - - def test_add_column_no_data_no_headers(self): - """Verify adding new column with no headers.""" - - new_col = ('reitz', 'monke') - - data.append(col=new_col) - - self.assertEquals(data[0], tuple([new_col[0]])) - self.assertEquals(data.width, 1) - self.assertEquals(data.height, len(new_col)) - - - def test_add_callable_column(self): - """Verify adding column with values specified as callable.""" - new_col = [lambda x: x[0]] - self.founders.append(col=new_col, header='first_again') -# -# self.assertTrue(map(lambda x: x[0] == x[-1], self.founders)) - - - def test_header_slicing(self): - """Verify slicing by headers.""" - - self.assertEqual(self.founders['first_name'], - [self.john[0], self.george[0], self.tom[0]]) - self.assertEqual(self.founders['last_name'], - [self.john[1], self.george[1], self.tom[1]]) - self.assertEqual(self.founders['gpa'], - [self.john[2], self.george[2], self.tom[2]]) - - - def test_data_slicing(self): - """Verify slicing by data.""" - - # Slice individual rows - self.assertEqual(self.founders[0], self.john) - self.assertEqual(self.founders[:1], [self.john]) - self.assertEqual(self.founders[1:2], [self.george]) - self.assertEqual(self.founders[-1], self.tom) - self.assertEqual(self.founders[3:], []) - - # Slice multiple rows - self.assertEqual(self.founders[:], [self.john, self.george, self.tom]) - self.assertEqual(self.founders[0:2], [self.john, self.george]) - self.assertEqual(self.founders[1:3], [self.george, self.tom]) - self.assertEqual(self.founders[2:], [self.tom]) - - - def test_delete(self): - """Verify deleting from dataset works.""" - - # Delete from front of object - del self.founders[0] - self.assertEqual(self.founders[:], [self.george, self.tom]) - - # Verify dimensions, width should NOT change - self.assertEqual(self.founders.height, 2) - self.assertEqual(self.founders.width, 3) - - # Delete from back of object - del self.founders[1] - self.assertEqual(self.founders[:], [self.george]) - - # Verify dimensions, width should NOT change - self.assertEqual(self.founders.height, 1) - self.assertEqual(self.founders.width, 3) - - # Delete from invalid index - self.assertRaises(IndexError, self.founders.__delitem__, 3) - - - def test_csv_export(self): - """Verify exporting dataset object as CSV.""" - - # Build up the csv string with headers first, followed by each row - csv = '' - for col in self.headers: - csv += col + ',' - - csv = csv.strip(',') + '\r\n' - - for founder in self.founders: - for col in founder: - csv += str(col) + ',' - csv = csv.strip(',') + '\r\n' - - self.assertEqual(csv, self.founders.csv) - - def test_tsv_export(self): - """Verify exporting dataset object as CSV.""" - - # Build up the csv string with headers first, followed by each row - tsv = '' - for col in self.headers: - tsv += col + '\t' - - tsv = tsv.strip('\t') + '\r\n' - - for founder in self.founders: - for col in founder: - tsv += str(col) + '\t' - tsv = tsv.strip('\t') + '\r\n' - - self.assertEqual(tsv, self.founders.tsv) - - def test_html_export(self): - - """HTML export""" - - html = markup.page() - html.table.open() - html.thead.open() - - html.tr(markup.oneliner.th(self.founders.headers)) - html.thead.close() - - for founder in self.founders: - - html.tr(markup.oneliner.td(founder)) - - html.table.close() - html = str(html) - - self.assertEqual(html, self.founders.html) - - - def test_unicode_append(self): - """Passes in a single unicode charecter and exports.""" - - new_row = ('å', 'é') - data.append(new_row) - - data.json - data.yaml - data.csv - data.tsv - data.xls -<<<<<<< HEAD - data.html -======= - data.xlsx ->>>>>>> 5350355fbe0aefe053d40fda03c0688a7b7eae3d - - - def test_book_export_no_exceptions(self): - """Test that varoius exports don't error out.""" - - book = tablib.Databook() - book.add_sheet(data) - - book.json - book.yaml - book.xls - book.xlsx - - - def test_json_import_set(self): - """Generate and import JSON set serialization.""" - data.append(self.john) - data.append(self.george) - data.headers = self.headers - - _json = data.json - - data.json = _json - - self.assertEqual(_json, data.json) - - - def test_json_import_book(self): - """Generate and import JSON book serialization.""" - data.append(self.john) - data.append(self.george) - data.headers = self.headers - - book.add_sheet(data) - _json = book.json - - book.json = _json - - self.assertEqual(_json, book.json) - - - def test_yaml_import_set(self): - """Generate and import YAML set serialization.""" - data.append(self.john) - data.append(self.george) - data.headers = self.headers - - _yaml = data.yaml - - data.yaml = _yaml - - self.assertEqual(_yaml, data.yaml) - - - def test_yaml_import_book(self): - """Generate and import YAML book serialization.""" - data.append(self.john) - data.append(self.george) - data.headers = self.headers - - book.add_sheet(data) - _yaml = book.yaml - - book.yaml = _yaml - - self.assertEqual(_yaml, book.yaml) - - - def test_csv_import_set(self): - """Generate and import CSV set serialization.""" - data.append(self.john) - data.append(self.george) - data.headers = self.headers - - _csv = data.csv - - data.csv = _csv - - self.assertEqual(_csv, data.csv) - - - def test_csv_import_set_with_spaces(self): - """Generate and import CSV set serialization when row values have - spaces.""" - data.append(('Bill Gates', 'Microsoft')) - data.append(('Steve Jobs', 'Apple')) - data.headers = ('Name', 'Company') - - _csv = data.csv - - data.csv = _csv - - self.assertEqual(_csv, data.csv) - - - def test_tsv_import_set(self): - """Generate and import TSV set serialization.""" - data.append(self.john) - data.append(self.george) - data.headers = self.headers - - _tsv = data.tsv - - data.tsv = _tsv - - self.assertEqual(_tsv, data.tsv) - - - def test_csv_format_detect(self): - """Test CSV format detection.""" - - _csv = ( - '1,2,3\n' - '4,5,6\n' - '7,8,9\n' - ) - _bunk = ( - '¡¡¡¡¡¡¡¡£™∞¢£§∞§¶•¶ª∞¶•ªº••ª–º§•†•§º¶•†¥ª–º•§ƒø¥¨©πƒø†ˆ¥ç©¨√øˆ¥≈†ƒ¥ç©ø¨çˆ¥ƒçø¶' - ) - - self.assertTrue(tablib.formats.csv.detect(_csv)) - self.assertFalse(tablib.formats.csv.detect(_bunk)) - - - def test_tsv_format_detect(self): - """Test TSV format detection.""" - - _tsv = ( - '1\t2\t3\n' - '4\t5\t6\n' - '7\t8\t9\n' - ) - _bunk = ( - '¡¡¡¡¡¡¡¡£™∞¢£§∞§¶•¶ª∞¶•ªº••ª–º§•†•§º¶•†¥ª–º•§ƒø¥¨©πƒø†ˆ¥ç©¨√øˆ¥≈†ƒ¥ç©ø¨çˆ¥ƒçø¶' - ) - - self.assertTrue(tablib.formats.tsv.detect(_tsv)) - self.assertFalse(tablib.formats.tsv.detect(_bunk)) - - - def test_json_format_detect(self): - """Test JSON format detection.""" - - _json = '[{"last_name": "Adams","age": 90,"first_name": "John"}]' - _bunk = ( - '¡¡¡¡¡¡¡¡£™∞¢£§∞§¶•¶ª∞¶•ªº••ª–º§•†•§º¶•†¥ª–º•§ƒø¥¨©πƒø†ˆ¥ç©¨√øˆ¥≈†ƒ¥ç©ø¨çˆ¥ƒçø¶' - ) - - self.assertTrue(tablib.formats.json.detect(_json)) - self.assertFalse(tablib.formats.json.detect(_bunk)) - - - def test_yaml_format_detect(self): - """Test YAML format detection.""" - - _yaml = '- {age: 90, first_name: John, last_name: Adams}' - _bunk = ( - '¡¡¡¡¡¡---///\n\n\n¡¡£™∞¢£§∞§¶•¶ª∞¶•ªº••ª–º§•†•§º¶•†¥ª–º•§ƒø¥¨©πƒø†ˆ¥ç©¨√øˆ¥≈†ƒ¥ç©ø¨çˆ¥ƒçø¶' - ) - - self.assertTrue(tablib.formats.yaml.detect(_yaml)) - self.assertFalse(tablib.formats.yaml.detect(_bunk)) - - - def test_auto_format_detect(self): - """Test auto format detection.""" - - _yaml = '- {age: 90, first_name: John, last_name: Adams}' - _json = '[{"last_name": "Adams","age": 90,"first_name": "John"}]' - _csv = '1,2,3\n4,5,6\n7,8,9\n' - _bunk = '¡¡¡¡¡¡---///\n\n\n¡¡£™∞¢£§∞§¶•¶ª∞¶•ªº••ª–º§•†•§º¶•†¥ª–º•§ƒø¥¨©πƒø†ˆ¥ç©¨√øˆ¥≈†ƒ¥ç©ø¨çˆ¥ƒçø¶' - - self.assertEqual(tablib.detect(_yaml)[0], tablib.formats.yaml) - self.assertEqual(tablib.detect(_csv)[0], tablib.formats.csv) - self.assertEqual(tablib.detect(_json)[0], tablib.formats.json) - self.assertEqual(tablib.detect(_bunk)[0], None) - - - def test_transpose(self): - """Transpose a dataset.""" - - transposed_founders = self.founders.transpose() - first_row = transposed_founders[0] - second_row = transposed_founders[1] - - self.assertEqual(transposed_founders.headers, - ["first_name","John", "George", "Thomas"]) - self.assertEqual(first_row, - ("last_name","Adams", "Washington", "Jefferson")) - self.assertEqual(second_row, - ("gpa",90, 67, 50)) - - - def test_row_stacking(self): - - """Row stacking.""" - - to_join = tablib.Dataset(headers=self.founders.headers) - - for row in self.founders: - to_join.append(row=row) - - row_stacked = self.founders.stack_rows(to_join) - - for column in row_stacked.headers: - - original_data = self.founders[column] - expected_data = original_data + original_data - self.assertEqual(row_stacked[column], expected_data) - - - def test_column_stacking(self): - - """Column stacking""" - - to_join = tablib.Dataset(headers=self.founders.headers) - - for row in self.founders: - to_join.append(row=row) - - column_stacked = self.founders.stack_columns(to_join) - - for index, row in enumerate(column_stacked): - - original_data = self.founders[index] - expected_data = original_data + original_data - self.assertEqual(row, expected_data) - - self.assertEqual(column_stacked[0], - ("John", "Adams", 90, "John", "Adams", 90)) - - - def test_sorting(self): - - """Sort columns.""" - - sorted_data = self.founders.sort(col="first_name") - - first_row = sorted_data[0] - second_row = sorted_data[2] - third_row = sorted_data[1] - expected_first = self.founders[1] - expected_second = self.founders[2] - expected_third = self.founders[0] - - self.assertEqual(first_row, expected_first) - self.assertEqual(second_row, expected_second) - self.assertEqual(third_row, expected_third) - - - def test_wipe(self): - """Purge a dataset.""" - - new_row = (1, 2, 3) - data.append(new_row) - - # Verify width/data - self.assertTrue(data.width == len(new_row)) - self.assertTrue(data[0] == new_row) - - data.wipe() - new_row = (1, 2, 3, 4) - data.append(new_row) - self.assertTrue(data.width == len(new_row)) - self.assertTrue(data[0] == new_row) - - - def test_formatters(self): - """Confirm formatters are being triggered.""" - - def _formatter(cell_value): - return str(cell_value).upper() - - self.founders.add_formatter('last_name', _formatter) - - for name in [r['last_name'] for r in self.founders.dict]: - self.assertTrue(name.isupper()) - - def test_unicode_csv(self): - """Check if unicode in csv export doesn't raise.""" - - data = tablib.Dataset() - - if sys.version_info[0] > 2: - data.append(['\xfc', '\xfd']) - else: - exec("data.append([u'\xfc', u'\xfd'])") - - - data.csv - -if __name__ == '__main__': - unittest.main() From 74c64d66a95bf25107dd5d5cd2395850f99e3bda Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Fri, 13 May 2011 20:51:54 -0400 Subject: [PATCH 05/32] pypy-1.5 --- docs/intro.rst | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/intro.rst b/docs/intro.rst index 719133d..66b7f28 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -3,7 +3,7 @@ Introduction ============ -This part of the documentation covers all the interfaces of Tablib. +This part of the documentation covers all the interfaces of Tablib. Tablib is a format-agnostic tabular dataset library, written in Python. It allows you to Pythonically import, export, and manipulate tabular data sets. Advanced features include, segregation, dynamic columns, tags / filtering, and seamless format import/export. @@ -26,9 +26,9 @@ All contributions to Tablib should keep these important rules in mind. MIT License ----------- -A large number of open source projects you find today are `GPL Licensed`_. While the GPL has its time and place, it should most certainly not be your go-to license for your next open source project. +A large number of open source projects you find today are `GPL Licensed`_. While the GPL has its time and place, it should most certainly not be your go-to license for your next open source project. -A project that is released as GPL cannot be used in any commercial product without the product itself also being offered as open source. The MIT and BSD licenses are great alternatives to the GPL that allow your open-source software to be used in proprietary, closed-source software. +A project that is released as GPL cannot be used in any commercial product without the product itself also being offered as open source. The MIT and BSD licenses are great alternatives to the GPL that allow your open-source software to be used in proprietary, closed-source software. Tablib is released under terms of `The MIT License`_. @@ -67,7 +67,7 @@ THE SOFTWARE. Pythons Supported ----------------- -At this time, the following Python platforms are officially supported: +At this time, the following Python platforms are officially supported: * cPython 2.5 * cPython 2.6 @@ -75,6 +75,7 @@ At this time, the following Python platforms are officially supported: * cPython 3.1 * cPython 3.2 * PyPy-c 1.4 +* PyPy-c 1.5 Support for other Pythons will be rolled out soon. From 2128473938274083aa4416f76c1b8ce09561c068 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Fri, 13 May 2011 21:15:09 -0400 Subject: [PATCH 06/32] license/support update --- docs/intro.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/intro.rst b/docs/intro.rst index 66b7f28..971afbd 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -28,13 +28,15 @@ MIT License A large number of open source projects you find today are `GPL Licensed`_. While the GPL has its time and place, it should most certainly not be your go-to license for your next open source project. -A project that is released as GPL cannot be used in any commercial product without the product itself also being offered as open source. The MIT and BSD licenses are great alternatives to the GPL that allow your open-source software to be used in proprietary, closed-source software. +A project that is released as GPL cannot be used in any commercial product without the product itself also being offered as open source. The MIT, BSD, and ISC licenses are great alternatives to the GPL that allow your open-source software to be used in proprietary, closed-source software. Tablib is released under terms of `The MIT License`_. .. _`GPL Licensed`: http://www.opensource.org/licenses/gpl-license.php .. _`The MIT License`: http://www.opensource.org/licenses/mit-license.php +.. note:: + Tablib will be moved to the `Apache 2 License `_ upon the release of v1.0.0. .. _license: From 03086052eddeaf4d1b7521d87c3ac850dcc8e821 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Sat, 14 May 2011 10:01:48 -0400 Subject: [PATCH 07/32] Merge pull request #11 from cswegger/tablib --- This change applies the same unicode CSV fix for TSV files, since all its done in the exporter is changing a few parameters of the CSV module. All unit tests are still passing after this change. --- HISTORY.rst | 6 ++++++ tablib/formats/_tsv.py | 23 ++++++++++++++++++----- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 2f04060..7212cdb 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,6 +1,12 @@ History ------- +0.9.8 ++++++ + +* Full Unicode TSV support + + 0.9.7 (2011-05-12) ++++++++++++++++++ diff --git a/tablib/formats/_tsv.py b/tablib/formats/_tsv.py index acf28da..e2ca25e 100644 --- a/tablib/formats/_tsv.py +++ b/tablib/formats/_tsv.py @@ -5,11 +5,15 @@ import sys if sys.version_info[0] > 2: + is_py3 = True from io import StringIO + import csv else: + is_py3 = False from cStringIO import StringIO - -import csv + import tablib.packages.unicodecsv as csv + + import os import tablib @@ -18,12 +22,16 @@ import tablib title = 'tsv' extentions = ('tsv',) - +DEFAULT_ENCODING = 'utf-8' def export_set(dataset): """Returns a TSV representation of Dataset.""" stream = StringIO() - _tsv = csv.writer(stream, delimiter='\t') + + if is_py3: + _tsv = csv.writer(stream, delimiter="\t") + else: + _tsv = csv.writer(stream, encoding=DEFAULT_ENCODING, delimiter="\t") for row in dataset._package(dicts=False): _tsv.writerow(row) @@ -35,7 +43,12 @@ def import_set(dset, in_stream, headers=True): """Returns dataset from TSV stream.""" dset.wipe() - rows = csv.reader(in_stream.split('\r\n'), delimiter='\t') + if is_py3: + rows = csv.reader(in_stream.split('\r\n'), delimiter='\t') + else: + rows = csv.reader(in_stream.split('\r\n'), delimiter='\t', + encoding=DEFAULT_ENCODING) + for i, row in enumerate(rows): # Skip empty rows if not row: From bf4fdea1876a86087566eb593f8c30f0a60caf7f Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Sat, 14 May 2011 10:06:54 -0400 Subject: [PATCH 08/32] fewer 2/3 mappings --- tablib/compat.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/tablib/compat.py b/tablib/compat.py index 48e0081..de03cd7 100644 --- a/tablib/compat.py +++ b/tablib/compat.py @@ -27,8 +27,7 @@ if is_py3: from tablib.packages import openpyxl3 as openpyxl # py3 mappings - ifilter = filter - xrange = range + unicode = str bytes = bytes basestring = str @@ -40,10 +39,4 @@ else: from itertools import ifilter from tablib.packages import openpyxl - # py2 mappings - xrange = xrange - unicode = unicode - bytes = str - basestring = basestring - From 239e33aaedafe3e55c92c80f67e4e595449bdc4a Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Sat, 14 May 2011 10:10:02 -0400 Subject: [PATCH 09/32] subtle format cleanups --- tablib/compat.py | 6 +++++- tablib/formats/_csv.py | 13 +------------ tablib/formats/_tsv.py | 13 ++----------- 3 files changed, 8 insertions(+), 24 deletions(-) diff --git a/tablib/compat.py b/tablib/compat.py index de03cd7..1175aaa 100644 --- a/tablib/compat.py +++ b/tablib/compat.py @@ -22,9 +22,11 @@ except ImportError: if is_py3: from io import BytesIO + from io import StringIO import tablib.packages.xlwt3 as xlwt from tablib.packages import markup3 as markup from tablib.packages import openpyxl3 as openpyxl + import csv # py3 mappings @@ -34,9 +36,11 @@ if is_py3: else: from cStringIO import StringIO as BytesIO + from cStringIO import StringIO import tablib.packages.xlwt as xlwt from tablib.packages import markup from itertools import ifilter from tablib.packages import openpyxl + import tablib.packages.unicodecsv as csv - + unicode = unicode \ No newline at end of file diff --git a/tablib/formats/_csv.py b/tablib/formats/_csv.py index bfe8b0f..2c0bfc2 100644 --- a/tablib/formats/_csv.py +++ b/tablib/formats/_csv.py @@ -3,22 +3,11 @@ """ Tablib - CSV Support. """ -import sys -if sys.version_info[0] > 2: - is_py3 = True - - from io import StringIO - import csv -else: - is_py3 = False - from cStringIO import StringIO - import tablib.packages.unicodecsv as csv - - import os import tablib +from tablib.compat import is_py3, StringIO, csv title = 'csv' diff --git a/tablib/formats/_tsv.py b/tablib/formats/_tsv.py index e2ca25e..54838b1 100644 --- a/tablib/formats/_tsv.py +++ b/tablib/formats/_tsv.py @@ -3,20 +3,11 @@ """ Tablib - TSV (Tab Separated Values) Support. """ -import sys -if sys.version_info[0] > 2: - is_py3 = True - from io import StringIO - import csv -else: - is_py3 = False - from cStringIO import StringIO - import tablib.packages.unicodecsv as csv - - import os import tablib +from tablib.compat import is_py3, csv, StringIO + title = 'tsv' From 8e055f1c57e82d51bf0320b04c49763a7257b486 Mon Sep 17 00:00:00 2001 From: Mark Rogers Date: Sat, 14 May 2011 14:32:03 -0500 Subject: [PATCH 10/32] adding odfpy to packages --- tablib/packages/odf/__init__.py | 0 tablib/packages/odf/anim.py | 61 + tablib/packages/odf/attrconverters.py | 1484 +++++ tablib/packages/odf/chart.py | 87 + tablib/packages/odf/config.py | 39 + tablib/packages/odf/dc.py | 72 + tablib/packages/odf/dr3d.py | 43 + tablib/packages/odf/draw.py | 182 + tablib/packages/odf/easyliststyle.py | 103 + tablib/packages/odf/element.py | 513 ++ tablib/packages/odf/elementtypes.py | 325 + tablib/packages/odf/form.py | 115 + tablib/packages/odf/grammar.py | 8426 +++++++++++++++++++++++++ tablib/packages/odf/load.py | 112 + tablib/packages/odf/manifest.py | 41 + tablib/packages/odf/math.py | 30 + tablib/packages/odf/meta.py | 66 + tablib/packages/odf/namespaces.py | 97 + tablib/packages/odf/number.py | 104 + tablib/packages/odf/odf2moinmoin.py | 579 ++ tablib/packages/odf/odf2xhtml.py | 1582 +++++ tablib/packages/odf/odfmanifest.py | 115 + tablib/packages/odf/office.py | 104 + tablib/packages/odf/opendocument.py | 654 ++ tablib/packages/odf/presentation.py | 85 + tablib/packages/odf/script.py | 30 + tablib/packages/odf/style.py | 148 + tablib/packages/odf/svg.py | 54 + tablib/packages/odf/table.py | 307 + tablib/packages/odf/teletype.py | 137 + tablib/packages/odf/text.py | 562 ++ tablib/packages/odf/thumbnail.py | 427 ++ tablib/packages/odf/userfield.py | 169 + tablib/packages/odf/xforms.py | 34 + 34 files changed, 16887 insertions(+) create mode 100644 tablib/packages/odf/__init__.py create mode 100644 tablib/packages/odf/anim.py create mode 100644 tablib/packages/odf/attrconverters.py create mode 100644 tablib/packages/odf/chart.py create mode 100644 tablib/packages/odf/config.py create mode 100644 tablib/packages/odf/dc.py create mode 100644 tablib/packages/odf/dr3d.py create mode 100644 tablib/packages/odf/draw.py create mode 100644 tablib/packages/odf/easyliststyle.py create mode 100644 tablib/packages/odf/element.py create mode 100644 tablib/packages/odf/elementtypes.py create mode 100644 tablib/packages/odf/form.py create mode 100644 tablib/packages/odf/grammar.py create mode 100644 tablib/packages/odf/load.py create mode 100644 tablib/packages/odf/manifest.py create mode 100644 tablib/packages/odf/math.py create mode 100644 tablib/packages/odf/meta.py create mode 100644 tablib/packages/odf/namespaces.py create mode 100644 tablib/packages/odf/number.py create mode 100644 tablib/packages/odf/odf2moinmoin.py create mode 100644 tablib/packages/odf/odf2xhtml.py create mode 100644 tablib/packages/odf/odfmanifest.py create mode 100644 tablib/packages/odf/office.py create mode 100644 tablib/packages/odf/opendocument.py create mode 100644 tablib/packages/odf/presentation.py create mode 100644 tablib/packages/odf/script.py create mode 100644 tablib/packages/odf/style.py create mode 100644 tablib/packages/odf/svg.py create mode 100644 tablib/packages/odf/table.py create mode 100644 tablib/packages/odf/teletype.py create mode 100644 tablib/packages/odf/text.py create mode 100644 tablib/packages/odf/thumbnail.py create mode 100644 tablib/packages/odf/userfield.py create mode 100644 tablib/packages/odf/xforms.py diff --git a/tablib/packages/odf/__init__.py b/tablib/packages/odf/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tablib/packages/odf/anim.py b/tablib/packages/odf/anim.py new file mode 100644 index 0000000..27dca36 --- /dev/null +++ b/tablib/packages/odf/anim.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from namespaces import ANIMNS +from element import Element + + +# Autogenerated +def Animate(**args): + return Element(qname = (ANIMNS,'animate'), **args) + +def Animatecolor(**args): + return Element(qname = (ANIMNS,'animateColor'), **args) + +def Animatemotion(**args): + return Element(qname = (ANIMNS,'animateMotion'), **args) + +def Animatetransform(**args): + return Element(qname = (ANIMNS,'animateTransform'), **args) + +def Audio(**args): + return Element(qname = (ANIMNS,'audio'), **args) + +def Command(**args): + return Element(qname = (ANIMNS,'command'), **args) + +def Iterate(**args): + return Element(qname = (ANIMNS,'iterate'), **args) + +def Par(**args): + return Element(qname = (ANIMNS,'par'), **args) + +def Param(**args): + return Element(qname = (ANIMNS,'param'), **args) + +def Seq(**args): + return Element(qname = (ANIMNS,'seq'), **args) + +def Set(**args): + return Element(qname = (ANIMNS,'set'), **args) + +def Transitionfilter(**args): + return Element(qname = (ANIMNS,'transitionFilter'), **args) + diff --git a/tablib/packages/odf/attrconverters.py b/tablib/packages/odf/attrconverters.py new file mode 100644 index 0000000..b75f80a --- /dev/null +++ b/tablib/packages/odf/attrconverters.py @@ -0,0 +1,1484 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2010 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# +from namespaces import * +import re, types + +pattern_color = re.compile(r'#[0-9a-fA-F]{6}') +pattern_vector3D = re.compile(r'\([ ]*-?([0-9]+(\.[0-9]*)?|\.[0-9]+)([ ]+-?([0-9]+(\.[0-9]*)?|\.[0-9]+)){2}[ ]*\)') + +def make_NCName(arg): + for c in (':',' '): + arg = arg.replace(c,"_%x_" % ord(c)) + return arg + +def cnv_anyURI(attribute, arg, element): + return unicode(arg) + +def cnv_boolean(attribute, arg, element): + if arg.lower() in ("false","no"): + return "false" + if arg: + return "true" + return "false" + +# Potentially accept color values +def cnv_color(attribute, arg, element): + """ A RGB color in conformance with §5.9.11 of [XSL], that is a RGB color in notation “#rrggbb”, where + rr, gg and bb are 8-bit hexadecimal digits. + """ + return str(arg) + +def cnv_configtype(attribute, arg, element): + if str(arg) not in ("boolean", "short", "int", "long", + "double", "string", "datetime", "base64Binary"): + raise ValueError, "'%s' not allowed" % str(arg) + return str(arg) + +def cnv_data_source_has_labels(attribute, arg, element): + if str(arg) not in ("none","row","column","both"): + raise ValueError, "'%s' not allowed" % str(arg) + return str(arg) + +# Understand different date formats +def cnv_date(attribute, arg, element): + """ A dateOrDateTime value is either an [xmlschema-2] date value or an [xmlschema-2] dateTime + value. + """ + return str(arg) + +def cnv_dateTime(attribute, arg, element): + """ A dateOrDateTime value is either an [xmlschema-2] date value or an [xmlschema-2] dateTime + value. + """ + return str(arg) + +def cnv_double(attribute, arg, element): + return str(arg) + +def cnv_duration(attribute, arg, element): + return str(arg) + +def cnv_family(attribute, arg, element): + """ A style family """ + if str(arg) not in ("text", "paragraph", "section", "ruby", "table", "table-column", "table-row", "table-cell", + "graphic", "presentation", "drawing-page", "chart"): + raise ValueError, "'%s' not allowed" % str(arg) + return str(arg) + +def __save_prefix(attribute, arg, element): + prefix = arg.split(':',1)[0] + if prefix == arg: + return unicode(arg) + namespace = element.get_knownns(prefix) + if namespace is None: + #raise ValueError, "'%s' is an unknown prefix" % str(prefix) + return unicode(arg) + p = element.get_nsprefix(namespace) + return unicode(arg) + +def cnv_formula(attribute, arg, element): + """ A string containing a formula. Formulas do not have a predefined syntax, but the string should + begin with a namespace prefix, followed by a “:” (COLON, U+003A) separator, followed by the text + of the formula. The namespace bound to the prefix determines the syntax and semantics of the + formula. + """ + return __save_prefix(attribute, arg, element) + +def cnv_ID(attribute, arg, element): + return str(arg) + +def cnv_IDREF(attribute, arg, element): + return str(arg) + +def cnv_integer(attribute, arg, element): + return str(arg) + +def cnv_legend_position(attribute, arg, element): + if str(arg) not in ("start", "end", "top", "bottom", "top-start", "bottom-start", "top-end", "bottom-end"): + raise ValueError, "'%s' not allowed" % str(arg) + return str(arg) + +pattern_length = re.compile(r'-?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px))') + +def cnv_length(attribute, arg, element): + """ A (positive or negative) physical length, consisting of magnitude and unit, in conformance with the + Units of Measure defined in §5.9.13 of [XSL]. + """ + global pattern_length + if not pattern_length.match(arg): + raise ValueError, "'%s' is not a valid length" % arg + return arg + +def cnv_lengthorpercent(attribute, arg, element): + failed = False + try: return cnv_length(attribute, arg, element) + except: failed = True + try: return cnv_percent(attribute, arg, element) + except: failed = True + if failed: + raise ValueError, "'%s' is not a valid length or percent" % arg + return arg + +def cnv_metavaluetype(attribute, arg, element): + if str(arg) not in ("float", "date", "time", "boolean", "string"): + raise ValueError, "'%s' not allowed" % str(arg) + return str(arg) + +def cnv_major_minor(attribute, arg, element): + if arg not in ('major','minor'): + raise ValueError, "'%s' is not either 'minor' or 'major'" % arg + +pattern_namespacedToken = re.compile(r'[0-9a-zA-Z_]+:[0-9a-zA-Z._\-]+') + +def cnv_namespacedToken(attribute, arg, element): + global pattern_namespacedToken + + if not pattern_namespacedToken.match(arg): + raise ValueError, "'%s' is not a valid namespaced token" % arg + return __save_prefix(attribute, arg, element) + +def cnv_NCName(attribute, arg, element): + """ NCName is defined in http://www.w3.org/TR/REC-xml-names/#NT-NCName + Essentially an XML name minus ':' + """ + if type(arg) in types.StringTypes: + return make_NCName(arg) + else: + return arg.getAttrNS(STYLENS, 'name') + +# This function takes either an instance of a style (preferred) +# or a text string naming the style. If it is a text string, then it must +# already have been converted to an NCName +# The text-string argument is mainly for when we build a structure from XML +def cnv_StyleNameRef(attribute, arg, element): + try: + return arg.getAttrNS(STYLENS, 'name') + except: + return arg + +# This function takes either an instance of a style (preferred) +# or a text string naming the style. If it is a text string, then it must +# already have been converted to an NCName +# The text-string argument is mainly for when we build a structure from XML +def cnv_DrawNameRef(attribute, arg, element): + try: + return arg.getAttrNS(DRAWNS, 'name') + except: + return arg + +# Must accept list of Style objects +def cnv_NCNames(attribute, arg, element): + return ' '.join(arg) + +def cnv_nonNegativeInteger(attribute, arg, element): + return str(arg) + +pattern_percent = re.compile(r'-?([0-9]+(\.[0-9]*)?|\.[0-9]+)%') + +def cnv_percent(attribute, arg, element): + global pattern_percent + if not pattern_percent.match(arg): + raise ValueError, "'%s' is not a valid length" % arg + return arg + +# Real one doesn't allow floating point values +pattern_points = re.compile(r'-?[0-9]+,-?[0-9]+([ ]+-?[0-9]+,-?[0-9]+)*') +#pattern_points = re.compile(r'-?[0-9.]+,-?[0-9.]+([ ]+-?[0-9.]+,-?[0-9.]+)*') +def cnv_points(attribute, arg, element): + global pattern_points + if type(arg) in types.StringTypes: + if not pattern_points.match(arg): + raise ValueError, "x,y are separated by a comma and the points are separated by white spaces" + return arg + else: + try: + strarg = ' '.join([ "%d,%d" % p for p in arg]) + except: + raise ValueError, "Points must be string or [(0,0),(1,1)] - not %s" % arg + return strarg + +def cnv_positiveInteger(attribute, arg, element): + return str(arg) + +def cnv_string(attribute, arg, element): + return unicode(arg) + +def cnv_textnoteclass(attribute, arg, element): + if str(arg) not in ("footnote", "endnote"): + raise ValueError, "'%s' not allowed" % str(arg) + return str(arg) + +# Understand different time formats +def cnv_time(attribute, arg, element): + return str(arg) + +def cnv_token(attribute, arg, element): + return str(arg) + +pattern_viewbox = re.compile(r'-?[0-9]+([ ]+-?[0-9]+){3}$') + +def cnv_viewbox(attribute, arg, element): + global pattern_viewbox + if not pattern_viewbox.match(arg): + raise ValueError, "viewBox must be four integers separated by whitespaces" + return arg + +def cnv_xlinkshow(attribute, arg, element): + if str(arg) not in ("new", "replace", "embed"): + raise ValueError, "'%s' not allowed" % str(arg) + return str(arg) + + +attrconverters = { + ((ANIMNS,u'audio-level'), None): cnv_double, + ((ANIMNS,u'color-interpolation'), None): cnv_string, + ((ANIMNS,u'color-interpolation-direction'), None): cnv_string, + ((ANIMNS,u'command'), None): cnv_string, + ((ANIMNS,u'formula'), None): cnv_string, + ((ANIMNS,u'id'), None): cnv_ID, + ((ANIMNS,u'iterate-interval'), None): cnv_duration, + ((ANIMNS,u'iterate-type'), None): cnv_string, + ((ANIMNS,u'name'), None): cnv_string, + ((ANIMNS,u'sub-item'), None): cnv_string, + ((ANIMNS,u'value'), None): cnv_string, +# ((DBNS,u'type'), None): cnv_namespacedToken, + ((CHARTNS,u'attached-axis'), None): cnv_string, + ((CHARTNS,u'class'), (CHARTNS,u'grid')): cnv_major_minor, + ((CHARTNS,u'class'), None): cnv_namespacedToken, + ((CHARTNS,u'column-mapping'), None): cnv_string, + ((CHARTNS,u'connect-bars'), None): cnv_boolean, + ((CHARTNS,u'data-label-number'), None): cnv_string, + ((CHARTNS,u'data-label-symbol'), None): cnv_boolean, + ((CHARTNS,u'data-label-text'), None): cnv_boolean, + ((CHARTNS,u'data-source-has-labels'), None): cnv_data_source_has_labels, + ((CHARTNS,u'deep'), None): cnv_boolean, + ((CHARTNS,u'dimension'), None): cnv_string, + ((CHARTNS,u'display-label'), None): cnv_boolean, + ((CHARTNS,u'error-category'), None): cnv_string, + ((CHARTNS,u'error-lower-indicator'), None): cnv_boolean, + ((CHARTNS,u'error-lower-limit'), None): cnv_string, + ((CHARTNS,u'error-margin'), None): cnv_string, + ((CHARTNS,u'error-percentage'), None): cnv_string, + ((CHARTNS,u'error-upper-indicator'), None): cnv_boolean, + ((CHARTNS,u'error-upper-limit'), None): cnv_string, + ((CHARTNS,u'gap-width'), None): cnv_string, + ((CHARTNS,u'interpolation'), None): cnv_string, + ((CHARTNS,u'interval-major'), None): cnv_string, + ((CHARTNS,u'interval-minor-divisor'), None): cnv_string, + ((CHARTNS,u'japanese-candle-stick'), None): cnv_boolean, + ((CHARTNS,u'label-arrangement'), None): cnv_string, + ((CHARTNS,u'label-cell-address'), None): cnv_string, + ((CHARTNS,u'legend-align'), None): cnv_string, + ((CHARTNS,u'legend-position'), None): cnv_legend_position, + ((CHARTNS,u'lines'), None): cnv_boolean, + ((CHARTNS,u'link-data-style-to-source'), None): cnv_boolean, + ((CHARTNS,u'logarithmic'), None): cnv_boolean, + ((CHARTNS,u'maximum'), None): cnv_string, + ((CHARTNS,u'mean-value'), None): cnv_boolean, + ((CHARTNS,u'minimum'), None): cnv_string, + ((CHARTNS,u'name'), None): cnv_string, + ((CHARTNS,u'origin'), None): cnv_string, + ((CHARTNS,u'overlap'), None): cnv_string, + ((CHARTNS,u'percentage'), None): cnv_boolean, + ((CHARTNS,u'pie-offset'), None): cnv_string, + ((CHARTNS,u'regression-type'), None): cnv_string, + ((CHARTNS,u'repeated'), None): cnv_nonNegativeInteger, + ((CHARTNS,u'row-mapping'), None): cnv_string, + ((CHARTNS,u'scale-text'), None): cnv_boolean, + ((CHARTNS,u'series-source'), None): cnv_string, + ((CHARTNS,u'solid-type'), None): cnv_string, + ((CHARTNS,u'spline-order'), None): cnv_string, + ((CHARTNS,u'spline-resolution'), None): cnv_string, + ((CHARTNS,u'stacked'), None): cnv_boolean, + ((CHARTNS,u'style-name'), None): cnv_StyleNameRef, + ((CHARTNS,u'symbol-height'), None): cnv_string, + ((CHARTNS,u'symbol-name'), None): cnv_string, + ((CHARTNS,u'symbol-type'), None): cnv_string, + ((CHARTNS,u'symbol-width'), None): cnv_string, + ((CHARTNS,u'text-overlap'), None): cnv_boolean, + ((CHARTNS,u'three-dimensional'), None): cnv_boolean, + ((CHARTNS,u'tick-marks-major-inner'), None): cnv_boolean, + ((CHARTNS,u'tick-marks-major-outer'), None): cnv_boolean, + ((CHARTNS,u'tick-marks-minor-inner'), None): cnv_boolean, + ((CHARTNS,u'tick-marks-minor-outer'), None): cnv_boolean, + ((CHARTNS,u'values-cell-range-address'), None): cnv_string, + ((CHARTNS,u'vertical'), None): cnv_boolean, + ((CHARTNS,u'visible'), None): cnv_boolean, + ((CONFIGNS,u'name'), None): cnv_formula, + ((CONFIGNS,u'type'), None): cnv_configtype, + ((DR3DNS,u'ambient-color'), None): cnv_string, + ((DR3DNS,u'back-scale'), None): cnv_string, + ((DR3DNS,u'backface-culling'), None): cnv_string, + ((DR3DNS,u'center'), None): cnv_string, + ((DR3DNS,u'close-back'), None): cnv_boolean, + ((DR3DNS,u'close-front'), None): cnv_boolean, + ((DR3DNS,u'depth'), None): cnv_length, + ((DR3DNS,u'diffuse-color'), None): cnv_string, + ((DR3DNS,u'direction'), None): cnv_string, + ((DR3DNS,u'distance'), None): cnv_length, + ((DR3DNS,u'edge-rounding'), None): cnv_string, + ((DR3DNS,u'edge-rounding-mode'), None): cnv_string, + ((DR3DNS,u'emissive-color'), None): cnv_string, + ((DR3DNS,u'enabled'), None): cnv_boolean, + ((DR3DNS,u'end-angle'), None): cnv_string, + ((DR3DNS,u'focal-length'), None): cnv_length, + ((DR3DNS,u'horizontal-segments'), None): cnv_string, + ((DR3DNS,u'lighting-mode'), None): cnv_boolean, + ((DR3DNS,u'max-edge'), None): cnv_string, + ((DR3DNS,u'min-edge'), None): cnv_string, + ((DR3DNS,u'normals-direction'), None): cnv_string, + ((DR3DNS,u'normals-kind'), None): cnv_string, + ((DR3DNS,u'projection'), None): cnv_string, + ((DR3DNS,u'shade-mode'), None): cnv_string, + ((DR3DNS,u'shadow'), None): cnv_string, + ((DR3DNS,u'shadow-slant'), None): cnv_nonNegativeInteger, + ((DR3DNS,u'shininess'), None): cnv_string, + ((DR3DNS,u'size'), None): cnv_string, + ((DR3DNS,u'specular'), None): cnv_boolean, + ((DR3DNS,u'specular-color'), None): cnv_string, + ((DR3DNS,u'texture-filter'), None): cnv_string, + ((DR3DNS,u'texture-generation-mode-x'), None): cnv_string, + ((DR3DNS,u'texture-generation-mode-y'), None): cnv_string, + ((DR3DNS,u'texture-kind'), None): cnv_string, + ((DR3DNS,u'texture-mode'), None): cnv_string, + ((DR3DNS,u'transform'), None): cnv_string, + ((DR3DNS,u'vertical-segments'), None): cnv_string, + ((DR3DNS,u'vpn'), None): cnv_string, + ((DR3DNS,u'vrp'), None): cnv_string, + ((DR3DNS,u'vup'), None): cnv_string, + ((DRAWNS,u'align'), None): cnv_string, + ((DRAWNS,u'angle'), None): cnv_integer, + ((DRAWNS,u'archive'), None): cnv_string, + ((DRAWNS,u'auto-grow-height'), None): cnv_boolean, + ((DRAWNS,u'auto-grow-width'), None): cnv_boolean, + ((DRAWNS,u'background-size'), None): cnv_string, + ((DRAWNS,u'blue'), None): cnv_string, + ((DRAWNS,u'border'), None): cnv_string, + ((DRAWNS,u'caption-angle'), None): cnv_string, + ((DRAWNS,u'caption-angle-type'), None): cnv_string, + ((DRAWNS,u'caption-escape'), None): cnv_string, + ((DRAWNS,u'caption-escape-direction'), None): cnv_string, + ((DRAWNS,u'caption-fit-line-length'), None): cnv_boolean, + ((DRAWNS,u'caption-gap'), None): cnv_string, + ((DRAWNS,u'caption-line-length'), None): cnv_length, + ((DRAWNS,u'caption-point-x'), None): cnv_string, + ((DRAWNS,u'caption-point-y'), None): cnv_string, + ((DRAWNS,u'caption-id'), None): cnv_IDREF, + ((DRAWNS,u'caption-type'), None): cnv_string, + ((DRAWNS,u'chain-next-name'), None): cnv_string, + ((DRAWNS,u'class-id'), None): cnv_string, + ((DRAWNS,u'class-names'), None): cnv_NCNames, + ((DRAWNS,u'code'), None): cnv_string, + ((DRAWNS,u'color'), None): cnv_string, + ((DRAWNS,u'color-inversion'), None): cnv_boolean, + ((DRAWNS,u'color-mode'), None): cnv_string, + ((DRAWNS,u'concave'), None): cnv_string, + ((DRAWNS,u'concentric-gradient-fill-allowed'), None): cnv_boolean, + ((DRAWNS,u'contrast'), None): cnv_string, + ((DRAWNS,u'control'), None): cnv_IDREF, + ((DRAWNS,u'copy-of'), None): cnv_string, + ((DRAWNS,u'corner-radius'), None): cnv_length, + ((DRAWNS,u'corners'), None): cnv_positiveInteger, + ((DRAWNS,u'cx'), None): cnv_string, + ((DRAWNS,u'cy'), None): cnv_string, + ((DRAWNS,u'data'), None): cnv_string, + ((DRAWNS,u'decimal-places'), None): cnv_string, + ((DRAWNS,u'display'), None): cnv_string, + ((DRAWNS,u'display-name'), None): cnv_string, + ((DRAWNS,u'distance'), None): cnv_lengthorpercent, + ((DRAWNS,u'dots1'), None): cnv_integer, + ((DRAWNS,u'dots1-length'), None): cnv_lengthorpercent, + ((DRAWNS,u'dots2'), None): cnv_integer, + ((DRAWNS,u'dots2-length'), None): cnv_lengthorpercent, + ((DRAWNS,u'end-angle'), None): cnv_double, + ((DRAWNS,u'end'), None): cnv_string, + ((DRAWNS,u'end-color'), None): cnv_string, + ((DRAWNS,u'end-glue-point'), None): cnv_nonNegativeInteger, + ((DRAWNS,u'end-guide'), None): cnv_length, + ((DRAWNS,u'end-intensity'), None): cnv_string, + ((DRAWNS,u'end-line-spacing-horizontal'), None): cnv_string, + ((DRAWNS,u'end-line-spacing-vertical'), None): cnv_string, + ((DRAWNS,u'end-shape'), None): cnv_IDREF, + ((DRAWNS,u'engine'), None): cnv_namespacedToken, + ((DRAWNS,u'enhanced-path'), None): cnv_string, + ((DRAWNS,u'escape-direction'), None): cnv_string, + ((DRAWNS,u'extrusion-allowed'), None): cnv_boolean, + ((DRAWNS,u'extrusion-brightness'), None): cnv_string, + ((DRAWNS,u'extrusion'), None): cnv_boolean, + ((DRAWNS,u'extrusion-color'), None): cnv_boolean, + ((DRAWNS,u'extrusion-depth'), None): cnv_double, + ((DRAWNS,u'extrusion-diffusion'), None): cnv_string, + ((DRAWNS,u'extrusion-first-light-direction'), None): cnv_string, + ((DRAWNS,u'extrusion-first-light-harsh'), None): cnv_boolean, + ((DRAWNS,u'extrusion-first-light-level'), None): cnv_string, + ((DRAWNS,u'extrusion-light-face'), None): cnv_boolean, + ((DRAWNS,u'extrusion-metal'), None): cnv_boolean, + ((DRAWNS,u'extrusion-number-of-line-segments'), None): cnv_integer, + ((DRAWNS,u'extrusion-origin'), None): cnv_double, + ((DRAWNS,u'extrusion-rotation-angle'), None): cnv_double, + ((DRAWNS,u'extrusion-rotation-center'), None): cnv_string, + ((DRAWNS,u'extrusion-second-light-direction'), None): cnv_string, + ((DRAWNS,u'extrusion-second-light-harsh'), None): cnv_boolean, + ((DRAWNS,u'extrusion-second-light-level'), None): cnv_string, + ((DRAWNS,u'extrusion-shininess'), None): cnv_string, + ((DRAWNS,u'extrusion-skew'), None): cnv_double, + ((DRAWNS,u'extrusion-specularity'), None): cnv_string, + ((DRAWNS,u'extrusion-viewpoint'), None): cnv_string, + ((DRAWNS,u'fill'), None): cnv_string, + ((DRAWNS,u'fill-color'), None): cnv_string, + ((DRAWNS,u'fill-gradient-name'), None): cnv_string, + ((DRAWNS,u'fill-hatch-name'), None): cnv_string, + ((DRAWNS,u'fill-hatch-solid'), None): cnv_boolean, + ((DRAWNS,u'fill-image-height'), None): cnv_lengthorpercent, + ((DRAWNS,u'fill-image-name'), None): cnv_DrawNameRef, + ((DRAWNS,u'fill-image-ref-point'), None): cnv_string, + ((DRAWNS,u'fill-image-ref-point-x'), None): cnv_string, + ((DRAWNS,u'fill-image-ref-point-y'), None): cnv_string, + ((DRAWNS,u'fill-image-width'), None): cnv_lengthorpercent, + ((DRAWNS,u'filter-name'), None): cnv_string, + ((DRAWNS,u'fit-to-contour'), None): cnv_boolean, + ((DRAWNS,u'fit-to-size'), None): cnv_boolean, + ((DRAWNS,u'formula'), None): cnv_string, + ((DRAWNS,u'frame-display-border'), None): cnv_boolean, + ((DRAWNS,u'frame-display-scrollbar'), None): cnv_boolean, + ((DRAWNS,u'frame-margin-horizontal'), None): cnv_string, + ((DRAWNS,u'frame-margin-vertical'), None): cnv_string, + ((DRAWNS,u'frame-name'), None): cnv_string, + ((DRAWNS,u'gamma'), None): cnv_string, + ((DRAWNS,u'glue-point-leaving-directions'), None): cnv_string, + ((DRAWNS,u'glue-point-type'), None): cnv_string, + ((DRAWNS,u'glue-points'), None): cnv_string, + ((DRAWNS,u'gradient-step-count'), None): cnv_string, + ((DRAWNS,u'green'), None): cnv_string, + ((DRAWNS,u'guide-distance'), None): cnv_string, + ((DRAWNS,u'guide-overhang'), None): cnv_length, + ((DRAWNS,u'handle-mirror-horizontal'), None): cnv_boolean, + ((DRAWNS,u'handle-mirror-vertical'), None): cnv_boolean, + ((DRAWNS,u'handle-polar'), None): cnv_string, + ((DRAWNS,u'handle-position'), None): cnv_string, + ((DRAWNS,u'handle-radius-range-maximum'), None): cnv_string, + ((DRAWNS,u'handle-radius-range-minimum'), None): cnv_string, + ((DRAWNS,u'handle-range-x-maximum'), None): cnv_string, + ((DRAWNS,u'handle-range-x-minimum'), None): cnv_string, + ((DRAWNS,u'handle-range-y-maximum'), None): cnv_string, + ((DRAWNS,u'handle-range-y-minimum'), None): cnv_string, + ((DRAWNS,u'handle-switched'), None): cnv_boolean, +# ((DRAWNS,u'id'), None): cnv_ID, +# ((DRAWNS,u'id'), None): cnv_nonNegativeInteger, # ?? line 6581 in RNG + ((DRAWNS,u'id'), None): cnv_string, + ((DRAWNS,u'image-opacity'), None): cnv_string, + ((DRAWNS,u'kind'), None): cnv_string, + ((DRAWNS,u'layer'), None): cnv_string, + ((DRAWNS,u'line-distance'), None): cnv_string, + ((DRAWNS,u'line-skew'), None): cnv_string, + ((DRAWNS,u'luminance'), None): cnv_string, + ((DRAWNS,u'marker-end-center'), None): cnv_boolean, + ((DRAWNS,u'marker-end'), None): cnv_string, + ((DRAWNS,u'marker-end-width'), None): cnv_length, + ((DRAWNS,u'marker-start-center'), None): cnv_boolean, + ((DRAWNS,u'marker-start'), None): cnv_string, + ((DRAWNS,u'marker-start-width'), None): cnv_length, + ((DRAWNS,u'master-page-name'), None): cnv_StyleNameRef, + ((DRAWNS,u'may-script'), None): cnv_boolean, + ((DRAWNS,u'measure-align'), None): cnv_string, + ((DRAWNS,u'measure-vertical-align'), None): cnv_string, + ((DRAWNS,u'mime-type'), None): cnv_string, + ((DRAWNS,u'mirror-horizontal'), None): cnv_boolean, + ((DRAWNS,u'mirror-vertical'), None): cnv_boolean, + ((DRAWNS,u'modifiers'), None): cnv_string, + ((DRAWNS,u'name'), None): cnv_NCName, +# ((DRAWNS,u'name'), None): cnv_string, + ((DRAWNS,u'nav-order'), None): cnv_IDREF, + ((DRAWNS,u'nohref'), None): cnv_string, + ((DRAWNS,u'notify-on-update-of-ranges'), None): cnv_string, + ((DRAWNS,u'object'), None): cnv_string, + ((DRAWNS,u'ole-draw-aspect'), None): cnv_string, + ((DRAWNS,u'opacity'), None): cnv_string, + ((DRAWNS,u'opacity-name'), None): cnv_string, + ((DRAWNS,u'page-number'), None): cnv_positiveInteger, + ((DRAWNS,u'parallel'), None): cnv_boolean, + ((DRAWNS,u'path-stretchpoint-x'), None): cnv_double, + ((DRAWNS,u'path-stretchpoint-y'), None): cnv_double, + ((DRAWNS,u'placing'), None): cnv_string, + ((DRAWNS,u'points'), None): cnv_points, + ((DRAWNS,u'protected'), None): cnv_boolean, + ((DRAWNS,u'recreate-on-edit'), None): cnv_boolean, + ((DRAWNS,u'red'), None): cnv_string, + ((DRAWNS,u'rotation'), None): cnv_integer, + ((DRAWNS,u'secondary-fill-color'), None): cnv_string, + ((DRAWNS,u'shadow'), None): cnv_string, + ((DRAWNS,u'shadow-color'), None): cnv_string, + ((DRAWNS,u'shadow-offset-x'), None): cnv_length, + ((DRAWNS,u'shadow-offset-y'), None): cnv_length, + ((DRAWNS,u'shadow-opacity'), None): cnv_string, + ((DRAWNS,u'shape-id'), None): cnv_IDREF, + ((DRAWNS,u'sharpness'), None): cnv_string, + ((DRAWNS,u'show-unit'), None): cnv_boolean, + ((DRAWNS,u'start-angle'), None): cnv_double, + ((DRAWNS,u'start'), None): cnv_string, + ((DRAWNS,u'start-color'), None): cnv_string, + ((DRAWNS,u'start-glue-point'), None): cnv_nonNegativeInteger, + ((DRAWNS,u'start-guide'), None): cnv_length, + ((DRAWNS,u'start-intensity'), None): cnv_string, + ((DRAWNS,u'start-line-spacing-horizontal'), None): cnv_string, + ((DRAWNS,u'start-line-spacing-vertical'), None): cnv_string, + ((DRAWNS,u'start-shape'), None): cnv_IDREF, + ((DRAWNS,u'stroke'), None): cnv_string, + ((DRAWNS,u'stroke-dash'), None): cnv_string, + ((DRAWNS,u'stroke-dash-names'), None): cnv_string, + ((DRAWNS,u'stroke-linejoin'), None): cnv_string, + ((DRAWNS,u'style'), None): cnv_string, + ((DRAWNS,u'style-name'), None): cnv_StyleNameRef, + ((DRAWNS,u'symbol-color'), None): cnv_string, + ((DRAWNS,u'text-areas'), None): cnv_string, + ((DRAWNS,u'text-path-allowed'), None): cnv_boolean, + ((DRAWNS,u'text-path'), None): cnv_boolean, + ((DRAWNS,u'text-path-mode'), None): cnv_string, + ((DRAWNS,u'text-path-same-letter-heights'), None): cnv_boolean, + ((DRAWNS,u'text-path-scale'), None): cnv_string, + ((DRAWNS,u'text-rotate-angle'), None): cnv_double, + ((DRAWNS,u'text-style-name'), None): cnv_StyleNameRef, + ((DRAWNS,u'textarea-horizontal-align'), None): cnv_string, + ((DRAWNS,u'textarea-vertical-align'), None): cnv_string, + ((DRAWNS,u'tile-repeat-offset'), None): cnv_string, + ((DRAWNS,u'transform'), None): cnv_string, + ((DRAWNS,u'type'), None): cnv_string, + ((DRAWNS,u'unit'), None): cnv_string, + ((DRAWNS,u'value'), None): cnv_string, + ((DRAWNS,u'visible-area-height'), None): cnv_string, + ((DRAWNS,u'visible-area-left'), None): cnv_string, + ((DRAWNS,u'visible-area-top'), None): cnv_string, + ((DRAWNS,u'visible-area-width'), None): cnv_string, + ((DRAWNS,u'wrap-influence-on-position'), None): cnv_string, + ((DRAWNS,u'z-index'), None): cnv_nonNegativeInteger, + ((FONS,u'background-color'), None): cnv_string, + ((FONS,u'border-bottom'), None): cnv_string, + ((FONS,u'border'), None): cnv_string, + ((FONS,u'border-left'), None): cnv_string, + ((FONS,u'border-right'), None): cnv_string, + ((FONS,u'border-top'), None): cnv_string, + ((FONS,u'break-after'), None): cnv_string, + ((FONS,u'break-before'), None): cnv_string, + ((FONS,u'clip'), None): cnv_string, + ((FONS,u'color'), None): cnv_string, + ((FONS,u'column-count'), None): cnv_positiveInteger, + ((FONS,u'column-gap'), None): cnv_length, + ((FONS,u'country'), None): cnv_token, + ((FONS,u'end-indent'), None): cnv_length, + ((FONS,u'font-family'), None): cnv_string, + ((FONS,u'font-size'), None): cnv_string, + ((FONS,u'font-style'), None): cnv_string, + ((FONS,u'font-variant'), None): cnv_string, + ((FONS,u'font-weight'), None): cnv_string, + ((FONS,u'height'), None): cnv_string, + ((FONS,u'hyphenate'), None): cnv_boolean, + ((FONS,u'hyphenation-keep'), None): cnv_string, + ((FONS,u'hyphenation-ladder-count'), None): cnv_string, + ((FONS,u'hyphenation-push-char-count'), None): cnv_string, + ((FONS,u'hyphenation-remain-char-count'), None): cnv_string, + ((FONS,u'keep-together'), None): cnv_string, + ((FONS,u'keep-with-next'), None): cnv_string, + ((FONS,u'language'), None): cnv_token, + ((FONS,u'letter-spacing'), None): cnv_string, + ((FONS,u'line-height'), None): cnv_string, + ((FONS,u'margin-bottom'), None): cnv_string, + ((FONS,u'margin'), None): cnv_string, + ((FONS,u'margin-left'), None): cnv_string, + ((FONS,u'margin-right'), None): cnv_string, + ((FONS,u'margin-top'), None): cnv_string, + ((FONS,u'max-height'), None): cnv_string, + ((FONS,u'max-width'), None): cnv_string, + ((FONS,u'min-height'), None): cnv_length, + ((FONS,u'min-width'), None): cnv_string, + ((FONS,u'orphans'), None): cnv_string, + ((FONS,u'padding-bottom'), None): cnv_string, + ((FONS,u'padding'), None): cnv_string, + ((FONS,u'padding-left'), None): cnv_string, + ((FONS,u'padding-right'), None): cnv_string, + ((FONS,u'padding-top'), None): cnv_string, + ((FONS,u'page-height'), None): cnv_length, + ((FONS,u'page-width'), None): cnv_length, + ((FONS,u'space-after'), None): cnv_length, + ((FONS,u'space-before'), None): cnv_length, + ((FONS,u'start-indent'), None): cnv_length, + ((FONS,u'text-align'), None): cnv_string, + ((FONS,u'text-align-last'), None): cnv_string, + ((FONS,u'text-indent'), None): cnv_string, + ((FONS,u'text-shadow'), None): cnv_string, + ((FONS,u'text-transform'), None): cnv_string, + ((FONS,u'widows'), None): cnv_string, + ((FONS,u'width'), None): cnv_string, + ((FONS,u'wrap-option'), None): cnv_string, + ((FORMNS,u'allow-deletes'), None): cnv_boolean, + ((FORMNS,u'allow-inserts'), None): cnv_boolean, + ((FORMNS,u'allow-updates'), None): cnv_boolean, + ((FORMNS,u'apply-design-mode'), None): cnv_boolean, + ((FORMNS,u'apply-filter'), None): cnv_boolean, + ((FORMNS,u'auto-complete'), None): cnv_boolean, + ((FORMNS,u'automatic-focus'), None): cnv_boolean, + ((FORMNS,u'bound-column'), None): cnv_string, + ((FORMNS,u'button-type'), None): cnv_string, + ((FORMNS,u'command'), None): cnv_string, + ((FORMNS,u'command-type'), None): cnv_string, + ((FORMNS,u'control-implementation'), None): cnv_namespacedToken, + ((FORMNS,u'convert-empty-to-null'), None): cnv_boolean, + ((FORMNS,u'current-selected'), None): cnv_boolean, + ((FORMNS,u'current-state'), None): cnv_string, +# ((FORMNS,u'current-value'), None): cnv_date, +# ((FORMNS,u'current-value'), None): cnv_double, + ((FORMNS,u'current-value'), None): cnv_string, +# ((FORMNS,u'current-value'), None): cnv_time, + ((FORMNS,u'data-field'), None): cnv_string, + ((FORMNS,u'datasource'), None): cnv_string, + ((FORMNS,u'default-button'), None): cnv_boolean, + ((FORMNS,u'delay-for-repeat'), None): cnv_duration, + ((FORMNS,u'detail-fields'), None): cnv_string, + ((FORMNS,u'disabled'), None): cnv_boolean, + ((FORMNS,u'dropdown'), None): cnv_boolean, + ((FORMNS,u'echo-char'), None): cnv_string, + ((FORMNS,u'enctype'), None): cnv_string, + ((FORMNS,u'escape-processing'), None): cnv_boolean, + ((FORMNS,u'filter'), None): cnv_string, + ((FORMNS,u'focus-on-click'), None): cnv_boolean, + ((FORMNS,u'for'), None): cnv_string, + ((FORMNS,u'id'), None): cnv_ID, + ((FORMNS,u'ignore-result'), None): cnv_boolean, + ((FORMNS,u'image-align'), None): cnv_string, + ((FORMNS,u'image-data'), None): cnv_anyURI, + ((FORMNS,u'image-position'), None): cnv_string, + ((FORMNS,u'is-tristate'), None): cnv_boolean, + ((FORMNS,u'label'), None): cnv_string, + ((FORMNS,u'list-source'), None): cnv_string, + ((FORMNS,u'list-source-type'), None): cnv_string, + ((FORMNS,u'master-fields'), None): cnv_string, + ((FORMNS,u'max-length'), None): cnv_nonNegativeInteger, +# ((FORMNS,u'max-value'), None): cnv_date, +# ((FORMNS,u'max-value'), None): cnv_double, + ((FORMNS,u'max-value'), None): cnv_string, +# ((FORMNS,u'max-value'), None): cnv_time, + ((FORMNS,u'method'), None): cnv_string, +# ((FORMNS,u'min-value'), None): cnv_date, +# ((FORMNS,u'min-value'), None): cnv_double, + ((FORMNS,u'min-value'), None): cnv_string, +# ((FORMNS,u'min-value'), None): cnv_time, + ((FORMNS,u'multi-line'), None): cnv_boolean, + ((FORMNS,u'multiple'), None): cnv_boolean, + ((FORMNS,u'name'), None): cnv_string, + ((FORMNS,u'navigation-mode'), None): cnv_string, + ((FORMNS,u'order'), None): cnv_string, + ((FORMNS,u'orientation'), None): cnv_string, + ((FORMNS,u'page-step-size'), None): cnv_positiveInteger, + ((FORMNS,u'printable'), None): cnv_boolean, + ((FORMNS,u'property-name'), None): cnv_string, + ((FORMNS,u'readonly'), None): cnv_boolean, + ((FORMNS,u'selected'), None): cnv_boolean, + ((FORMNS,u'size'), None): cnv_nonNegativeInteger, + ((FORMNS,u'state'), None): cnv_string, + ((FORMNS,u'step-size'), None): cnv_positiveInteger, + ((FORMNS,u'tab-cycle'), None): cnv_string, + ((FORMNS,u'tab-index'), None): cnv_nonNegativeInteger, + ((FORMNS,u'tab-stop'), None): cnv_boolean, + ((FORMNS,u'text-style-name'), None): cnv_StyleNameRef, + ((FORMNS,u'title'), None): cnv_string, + ((FORMNS,u'toggle'), None): cnv_boolean, + ((FORMNS,u'validation'), None): cnv_boolean, +# ((FORMNS,u'value'), None): cnv_date, +# ((FORMNS,u'value'), None): cnv_double, + ((FORMNS,u'value'), None): cnv_string, +# ((FORMNS,u'value'), None): cnv_time, + ((FORMNS,u'visual-effect'), None): cnv_string, + ((FORMNS,u'xforms-list-source'), None): cnv_string, + ((FORMNS,u'xforms-submission'), None): cnv_string, + ((MANIFESTNS,'algorithm-name'), None): cnv_string, + ((MANIFESTNS,'checksum'), None): cnv_string, + ((MANIFESTNS,'checksum-type'), None): cnv_string, + ((MANIFESTNS,'full-path'), None): cnv_string, + ((MANIFESTNS,'initialisation-vector'), None): cnv_string, + ((MANIFESTNS,'iteration-count'), None): cnv_nonNegativeInteger, + ((MANIFESTNS,'key-derivation-name'), None): cnv_string, + ((MANIFESTNS,'media-type'), None): cnv_string, + ((MANIFESTNS,'salt'), None): cnv_string, + ((MANIFESTNS,'size'), None): cnv_nonNegativeInteger, + ((METANS,u'cell-count'), None): cnv_nonNegativeInteger, + ((METANS,u'character-count'), None): cnv_nonNegativeInteger, + ((METANS,u'date'), None): cnv_dateTime, + ((METANS,u'delay'), None): cnv_duration, + ((METANS,u'draw-count'), None): cnv_nonNegativeInteger, + ((METANS,u'frame-count'), None): cnv_nonNegativeInteger, + ((METANS,u'image-count'), None): cnv_nonNegativeInteger, + ((METANS,u'name'), None): cnv_string, + ((METANS,u'non-whitespace-character-count'), None): cnv_nonNegativeInteger, + ((METANS,u'object-count'), None): cnv_nonNegativeInteger, + ((METANS,u'ole-object-count'), None): cnv_nonNegativeInteger, + ((METANS,u'page-count'), None): cnv_nonNegativeInteger, + ((METANS,u'paragraph-count'), None): cnv_nonNegativeInteger, + ((METANS,u'row-count'), None): cnv_nonNegativeInteger, + ((METANS,u'sentence-count'), None): cnv_nonNegativeInteger, + ((METANS,u'syllable-count'), None): cnv_nonNegativeInteger, + ((METANS,u'table-count'), None): cnv_nonNegativeInteger, + ((METANS,u'value-type'), None): cnv_metavaluetype, + ((METANS,u'word-count'), None): cnv_nonNegativeInteger, + ((NUMBERNS,u'automatic-order'), None): cnv_boolean, + ((NUMBERNS,u'calendar'), None): cnv_string, + ((NUMBERNS,u'country'), None): cnv_token, + ((NUMBERNS,u'decimal-places'), None): cnv_integer, + ((NUMBERNS,u'decimal-replacement'), None): cnv_string, + ((NUMBERNS,u'denominator-value'), None): cnv_integer, + ((NUMBERNS,u'display-factor'), None): cnv_double, + ((NUMBERNS,u'format-source'), None): cnv_string, + ((NUMBERNS,u'grouping'), None): cnv_boolean, + ((NUMBERNS,u'language'), None): cnv_token, + ((NUMBERNS,u'min-denominator-digits'), None): cnv_integer, + ((NUMBERNS,u'min-exponent-digits'), None): cnv_integer, + ((NUMBERNS,u'min-integer-digits'), None): cnv_integer, + ((NUMBERNS,u'min-numerator-digits'), None): cnv_integer, + ((NUMBERNS,u'position'), None): cnv_integer, + ((NUMBERNS,u'possessive-form'), None): cnv_boolean, + ((NUMBERNS,u'style'), None): cnv_string, + ((NUMBERNS,u'textual'), None): cnv_boolean, + ((NUMBERNS,u'title'), None): cnv_string, + ((NUMBERNS,u'transliteration-country'), None): cnv_token, + ((NUMBERNS,u'transliteration-format'), None): cnv_string, + ((NUMBERNS,u'transliteration-language'), None): cnv_token, + ((NUMBERNS,u'transliteration-style'), None): cnv_string, + ((NUMBERNS,u'truncate-on-overflow'), None): cnv_boolean, + ((OFFICENS,u'automatic-update'), None): cnv_boolean, + ((OFFICENS,u'boolean-value'), None): cnv_boolean, + ((OFFICENS,u'conversion-mode'), None): cnv_string, + ((OFFICENS,u'currency'), None): cnv_string, + ((OFFICENS,u'date-value'), None): cnv_dateTime, + ((OFFICENS,u'dde-application'), None): cnv_string, + ((OFFICENS,u'dde-item'), None): cnv_string, + ((OFFICENS,u'dde-topic'), None): cnv_string, + ((OFFICENS,u'display'), None): cnv_boolean, + ((OFFICENS,u'mimetype'), None): cnv_string, + ((OFFICENS,u'name'), None): cnv_string, + ((OFFICENS,u'process-content'), None): cnv_boolean, + ((OFFICENS,u'server-map'), None): cnv_boolean, + ((OFFICENS,u'string-value'), None): cnv_string, + ((OFFICENS,u'target-frame'), None): cnv_string, + ((OFFICENS,u'target-frame-name'), None): cnv_string, + ((OFFICENS,u'time-value'), None): cnv_duration, + ((OFFICENS,u'title'), None): cnv_string, + ((OFFICENS,u'value'), None): cnv_double, + ((OFFICENS,u'value-type'), None): cnv_string, + ((OFFICENS,u'version'), None): cnv_string, + ((PRESENTATIONNS,u'action'), None): cnv_string, + ((PRESENTATIONNS,u'animations'), None): cnv_string, + ((PRESENTATIONNS,u'background-objects-visible'), None): cnv_boolean, + ((PRESENTATIONNS,u'background-visible'), None): cnv_boolean, + ((PRESENTATIONNS,u'class'), None): cnv_string, + ((PRESENTATIONNS,u'class-names'), None): cnv_NCNames, + ((PRESENTATIONNS,u'delay'), None): cnv_duration, + ((PRESENTATIONNS,u'direction'), None): cnv_string, + ((PRESENTATIONNS,u'display-date-time'), None): cnv_boolean, + ((PRESENTATIONNS,u'display-footer'), None): cnv_boolean, + ((PRESENTATIONNS,u'display-header'), None): cnv_boolean, + ((PRESENTATIONNS,u'display-page-number'), None): cnv_boolean, + ((PRESENTATIONNS,u'duration'), None): cnv_string, + ((PRESENTATIONNS,u'effect'), None): cnv_string, + ((PRESENTATIONNS,u'endless'), None): cnv_boolean, + ((PRESENTATIONNS,u'force-manual'), None): cnv_boolean, + ((PRESENTATIONNS,u'full-screen'), None): cnv_boolean, + ((PRESENTATIONNS,u'group-id'), None): cnv_string, + ((PRESENTATIONNS,u'master-element'), None): cnv_IDREF, + ((PRESENTATIONNS,u'mouse-as-pen'), None): cnv_boolean, + ((PRESENTATIONNS,u'mouse-visible'), None): cnv_boolean, + ((PRESENTATIONNS,u'name'), None): cnv_string, + ((PRESENTATIONNS,u'node-type'), None): cnv_string, + ((PRESENTATIONNS,u'object'), None): cnv_string, + ((PRESENTATIONNS,u'pages'), None): cnv_string, + ((PRESENTATIONNS,u'path-id'), None): cnv_string, + ((PRESENTATIONNS,u'pause'), None): cnv_duration, + ((PRESENTATIONNS,u'placeholder'), None): cnv_boolean, + ((PRESENTATIONNS,u'play-full'), None): cnv_boolean, + ((PRESENTATIONNS,u'presentation-page-layout-name'), None): cnv_StyleNameRef, + ((PRESENTATIONNS,u'preset-class'), None): cnv_string, + ((PRESENTATIONNS,u'preset-id'), None): cnv_string, + ((PRESENTATIONNS,u'preset-sub-type'), None): cnv_string, + ((PRESENTATIONNS,u'show'), None): cnv_string, + ((PRESENTATIONNS,u'show-end-of-presentation-slide'), None): cnv_boolean, + ((PRESENTATIONNS,u'show-logo'), None): cnv_boolean, + ((PRESENTATIONNS,u'source'), None): cnv_string, + ((PRESENTATIONNS,u'speed'), None): cnv_string, + ((PRESENTATIONNS,u'start-page'), None): cnv_string, + ((PRESENTATIONNS,u'start-scale'), None): cnv_string, + ((PRESENTATIONNS,u'start-with-navigator'), None): cnv_boolean, + ((PRESENTATIONNS,u'stay-on-top'), None): cnv_boolean, + ((PRESENTATIONNS,u'style-name'), None): cnv_StyleNameRef, + ((PRESENTATIONNS,u'transition-on-click'), None): cnv_string, + ((PRESENTATIONNS,u'transition-speed'), None): cnv_string, + ((PRESENTATIONNS,u'transition-style'), None): cnv_string, + ((PRESENTATIONNS,u'transition-type'), None): cnv_string, + ((PRESENTATIONNS,u'use-date-time-name'), None): cnv_string, + ((PRESENTATIONNS,u'use-footer-name'), None): cnv_string, + ((PRESENTATIONNS,u'use-header-name'), None): cnv_string, + ((PRESENTATIONNS,u'user-transformed'), None): cnv_boolean, + ((PRESENTATIONNS,u'verb'), None): cnv_nonNegativeInteger, + ((PRESENTATIONNS,u'visibility'), None): cnv_string, + ((SCRIPTNS,u'event-name'), None): cnv_formula, + ((SCRIPTNS,u'language'), None): cnv_formula, + ((SCRIPTNS,u'macro-name'), None): cnv_string, + ((SMILNS,u'accelerate'), None): cnv_double, + ((SMILNS,u'accumulate'), None): cnv_string, + ((SMILNS,u'additive'), None): cnv_string, + ((SMILNS,u'attributeName'), None): cnv_string, + ((SMILNS,u'autoReverse'), None): cnv_boolean, + ((SMILNS,u'begin'), None): cnv_string, + ((SMILNS,u'by'), None): cnv_string, + ((SMILNS,u'calcMode'), None): cnv_string, + ((SMILNS,u'decelerate'), None): cnv_double, + ((SMILNS,u'direction'), None): cnv_string, + ((SMILNS,u'dur'), None): cnv_string, + ((SMILNS,u'end'), None): cnv_string, + ((SMILNS,u'endsync'), None): cnv_string, + ((SMILNS,u'fadeColor'), None): cnv_string, + ((SMILNS,u'fill'), None): cnv_string, + ((SMILNS,u'fillDefault'), None): cnv_string, + ((SMILNS,u'from'), None): cnv_string, + ((SMILNS,u'keySplines'), None): cnv_string, + ((SMILNS,u'keyTimes'), None): cnv_string, + ((SMILNS,u'mode'), None): cnv_string, + ((SMILNS,u'repeatCount'), None): cnv_nonNegativeInteger, + ((SMILNS,u'repeatDur'), None): cnv_string, + ((SMILNS,u'restart'), None): cnv_string, + ((SMILNS,u'restartDefault'), None): cnv_string, + ((SMILNS,u'subtype'), None): cnv_string, + ((SMILNS,u'targetElement'), None): cnv_IDREF, + ((SMILNS,u'to'), None): cnv_string, + ((SMILNS,u'type'), None): cnv_string, + ((SMILNS,u'values'), None): cnv_string, + ((STYLENS,u'adjustment'), None): cnv_string, + ((STYLENS,u'apply-style-name'), None): cnv_StyleNameRef, + ((STYLENS,u'auto-text-indent'), None): cnv_boolean, + ((STYLENS,u'auto-update'), None): cnv_boolean, + ((STYLENS,u'background-transparency'), None): cnv_string, + ((STYLENS,u'base-cell-address'), None): cnv_string, + ((STYLENS,u'border-line-width-bottom'), None): cnv_string, + ((STYLENS,u'border-line-width'), None): cnv_string, + ((STYLENS,u'border-line-width-left'), None): cnv_string, + ((STYLENS,u'border-line-width-right'), None): cnv_string, + ((STYLENS,u'border-line-width-top'), None): cnv_string, + ((STYLENS,u'cell-protect'), None): cnv_string, + ((STYLENS,u'char'), None): cnv_string, + ((STYLENS,u'class'), None): cnv_string, + ((STYLENS,u'color'), None): cnv_string, + ((STYLENS,u'column-width'), None): cnv_string, + ((STYLENS,u'condition'), None): cnv_string, + ((STYLENS,u'country-asian'), None): cnv_string, + ((STYLENS,u'country-complex'), None): cnv_string, + ((STYLENS,u'data-style-name'), None): cnv_StyleNameRef, + ((STYLENS,u'decimal-places'), None): cnv_string, + ((STYLENS,u'default-outline-level'), None): cnv_positiveInteger, + ((STYLENS,u'diagonal-bl-tr'), None): cnv_string, + ((STYLENS,u'diagonal-bl-tr-widths'), None): cnv_string, + ((STYLENS,u'diagonal-tl-br'), None): cnv_string, + ((STYLENS,u'diagonal-tl-br-widths'), None): cnv_string, + ((STYLENS,u'direction'), None): cnv_string, + ((STYLENS,u'display'), None): cnv_boolean, + ((STYLENS,u'display-name'), None): cnv_string, + ((STYLENS,u'distance-after-sep'), None): cnv_length, + ((STYLENS,u'distance-before-sep'), None): cnv_length, + ((STYLENS,u'distance'), None): cnv_length, + ((STYLENS,u'dynamic-spacing'), None): cnv_boolean, + ((STYLENS,u'editable'), None): cnv_boolean, + ((STYLENS,u'family'), None): cnv_family, + ((STYLENS,u'filter-name'), None): cnv_string, + ((STYLENS,u'first-page-number'), None): cnv_string, + ((STYLENS,u'flow-with-text'), None): cnv_boolean, + ((STYLENS,u'font-adornments'), None): cnv_string, + ((STYLENS,u'font-charset'), None): cnv_string, + ((STYLENS,u'font-charset-asian'), None): cnv_string, + ((STYLENS,u'font-charset-complex'), None): cnv_string, + ((STYLENS,u'font-family-asian'), None): cnv_string, + ((STYLENS,u'font-family-complex'), None): cnv_string, + ((STYLENS,u'font-family-generic-asian'), None): cnv_string, + ((STYLENS,u'font-family-generic'), None): cnv_string, + ((STYLENS,u'font-family-generic-complex'), None): cnv_string, + ((STYLENS,u'font-independent-line-spacing'), None): cnv_boolean, + ((STYLENS,u'font-name-asian'), None): cnv_string, + ((STYLENS,u'font-name'), None): cnv_string, + ((STYLENS,u'font-name-complex'), None): cnv_string, + ((STYLENS,u'font-pitch-asian'), None): cnv_string, + ((STYLENS,u'font-pitch'), None): cnv_string, + ((STYLENS,u'font-pitch-complex'), None): cnv_string, + ((STYLENS,u'font-relief'), None): cnv_string, + ((STYLENS,u'font-size-asian'), None): cnv_string, + ((STYLENS,u'font-size-complex'), None): cnv_string, + ((STYLENS,u'font-size-rel-asian'), None): cnv_length, + ((STYLENS,u'font-size-rel'), None): cnv_length, + ((STYLENS,u'font-size-rel-complex'), None): cnv_length, + ((STYLENS,u'font-style-asian'), None): cnv_string, + ((STYLENS,u'font-style-complex'), None): cnv_string, + ((STYLENS,u'font-style-name-asian'), None): cnv_string, + ((STYLENS,u'font-style-name'), None): cnv_string, + ((STYLENS,u'font-style-name-complex'), None): cnv_string, + ((STYLENS,u'font-weight-asian'), None): cnv_string, + ((STYLENS,u'font-weight-complex'), None): cnv_string, + ((STYLENS,u'footnote-max-height'), None): cnv_length, + ((STYLENS,u'glyph-orientation-vertical'), None): cnv_string, + ((STYLENS,u'height'), None): cnv_string, + ((STYLENS,u'horizontal-pos'), None): cnv_string, + ((STYLENS,u'horizontal-rel'), None): cnv_string, + ((STYLENS,u'justify-single-word'), None): cnv_boolean, + ((STYLENS,u'language-asian'), None): cnv_string, + ((STYLENS,u'language-complex'), None): cnv_string, + ((STYLENS,u'layout-grid-base-height'), None): cnv_length, + ((STYLENS,u'layout-grid-color'), None): cnv_string, + ((STYLENS,u'layout-grid-display'), None): cnv_boolean, + ((STYLENS,u'layout-grid-lines'), None): cnv_string, + ((STYLENS,u'layout-grid-mode'), None): cnv_string, + ((STYLENS,u'layout-grid-print'), None): cnv_boolean, + ((STYLENS,u'layout-grid-ruby-below'), None): cnv_boolean, + ((STYLENS,u'layout-grid-ruby-height'), None): cnv_length, + ((STYLENS,u'leader-char'), None): cnv_string, + ((STYLENS,u'leader-color'), None): cnv_string, + ((STYLENS,u'leader-style'), None): cnv_string, + ((STYLENS,u'leader-text'), None): cnv_string, + ((STYLENS,u'leader-text-style'), None): cnv_StyleNameRef, + ((STYLENS,u'leader-type'), None): cnv_string, + ((STYLENS,u'leader-width'), None): cnv_string, + ((STYLENS,u'legend-expansion-aspect-ratio'), None): cnv_double, + ((STYLENS,u'legend-expansion'), None): cnv_string, + ((STYLENS,u'length'), None): cnv_positiveInteger, + ((STYLENS,u'letter-kerning'), None): cnv_boolean, + ((STYLENS,u'line-break'), None): cnv_string, + ((STYLENS,u'line-height-at-least'), None): cnv_string, + ((STYLENS,u'line-spacing'), None): cnv_length, + ((STYLENS,u'line-style'), None): cnv_string, + ((STYLENS,u'lines'), None): cnv_positiveInteger, + ((STYLENS,u'list-style-name'), None): cnv_StyleNameRef, + ((STYLENS,u'master-page-name'), None): cnv_StyleNameRef, + ((STYLENS,u'may-break-between-rows'), None): cnv_boolean, + ((STYLENS,u'min-row-height'), None): cnv_string, + ((STYLENS,u'mirror'), None): cnv_string, + ((STYLENS,u'name'), None): cnv_NCName, + ((STYLENS,u'name'), (STYLENS,u'font-face')): cnv_string, + ((STYLENS,u'next-style-name'), None): cnv_StyleNameRef, + ((STYLENS,u'num-format'), None): cnv_string, + ((STYLENS,u'num-letter-sync'), None): cnv_boolean, + ((STYLENS,u'num-prefix'), None): cnv_string, + ((STYLENS,u'num-suffix'), None): cnv_string, + ((STYLENS,u'number-wrapped-paragraphs'), None): cnv_string, + ((STYLENS,u'overflow-behavior'), None): cnv_string, + ((STYLENS,u'page-layout-name'), None): cnv_StyleNameRef, + ((STYLENS,u'page-number'), None): cnv_string, + ((STYLENS,u'page-usage'), None): cnv_string, + ((STYLENS,u'paper-tray-name'), None): cnv_string, + ((STYLENS,u'parent-style-name'), None): cnv_StyleNameRef, + ((STYLENS,u'position'), (STYLENS,u'tab-stop')): cnv_length, + ((STYLENS,u'position'), None): cnv_string, + ((STYLENS,u'print'), None): cnv_string, + ((STYLENS,u'print-content'), None): cnv_boolean, + ((STYLENS,u'print-orientation'), None): cnv_string, + ((STYLENS,u'print-page-order'), None): cnv_string, + ((STYLENS,u'protect'), None): cnv_boolean, + ((STYLENS,u'punctuation-wrap'), None): cnv_string, + ((STYLENS,u'register-true'), None): cnv_boolean, + ((STYLENS,u'register-truth-ref-style-name'), None): cnv_string, + ((STYLENS,u'rel-column-width'), None): cnv_string, + ((STYLENS,u'rel-height'), None): cnv_string, + ((STYLENS,u'rel-width'), None): cnv_string, + ((STYLENS,u'repeat'), None): cnv_string, + ((STYLENS,u'repeat-content'), None): cnv_boolean, + ((STYLENS,u'rotation-align'), None): cnv_string, + ((STYLENS,u'rotation-angle'), None): cnv_string, + ((STYLENS,u'row-height'), None): cnv_string, + ((STYLENS,u'ruby-align'), None): cnv_string, + ((STYLENS,u'ruby-position'), None): cnv_string, + ((STYLENS,u'run-through'), None): cnv_string, + ((STYLENS,u'scale-to'), None): cnv_string, + ((STYLENS,u'scale-to-pages'), None): cnv_string, + ((STYLENS,u'script-type'), None): cnv_string, + ((STYLENS,u'shadow'), None): cnv_string, + ((STYLENS,u'shrink-to-fit'), None): cnv_boolean, + ((STYLENS,u'snap-to-layout-grid'), None): cnv_boolean, + ((STYLENS,u'style'), None): cnv_string, + ((STYLENS,u'style-name'), None): cnv_StyleNameRef, + ((STYLENS,u'tab-stop-distance'), None): cnv_string, + ((STYLENS,u'table-centering'), None): cnv_string, + ((STYLENS,u'text-align-source'), None): cnv_string, + ((STYLENS,u'text-autospace'), None): cnv_string, + ((STYLENS,u'text-blinking'), None): cnv_boolean, + ((STYLENS,u'text-combine'), None): cnv_string, + ((STYLENS,u'text-combine-end-char'), None): cnv_string, + ((STYLENS,u'text-combine-start-char'), None): cnv_string, + ((STYLENS,u'text-emphasize'), None): cnv_string, + ((STYLENS,u'text-line-through-color'), None): cnv_string, + ((STYLENS,u'text-line-through-mode'), None): cnv_string, + ((STYLENS,u'text-line-through-style'), None): cnv_string, + ((STYLENS,u'text-line-through-text'), None): cnv_string, + ((STYLENS,u'text-line-through-text-style'), None): cnv_string, + ((STYLENS,u'text-line-through-type'), None): cnv_string, + ((STYLENS,u'text-line-through-width'), None): cnv_string, + ((STYLENS,u'text-outline'), None): cnv_boolean, + ((STYLENS,u'text-position'), None): cnv_string, + ((STYLENS,u'text-rotation-angle'), None): cnv_string, + ((STYLENS,u'text-rotation-scale'), None): cnv_string, + ((STYLENS,u'text-scale'), None): cnv_string, + ((STYLENS,u'text-underline-color'), None): cnv_string, + ((STYLENS,u'text-underline-mode'), None): cnv_string, + ((STYLENS,u'text-underline-style'), None): cnv_string, + ((STYLENS,u'text-underline-type'), None): cnv_string, + ((STYLENS,u'text-underline-width'), None): cnv_string, + ((STYLENS,u'type'), None): cnv_string, + ((STYLENS,u'use-optimal-column-width'), None): cnv_boolean, + ((STYLENS,u'use-optimal-row-height'), None): cnv_boolean, + ((STYLENS,u'use-window-font-color'), None): cnv_boolean, + ((STYLENS,u'vertical-align'), None): cnv_string, + ((STYLENS,u'vertical-pos'), None): cnv_string, + ((STYLENS,u'vertical-rel'), None): cnv_string, + ((STYLENS,u'volatile'), None): cnv_boolean, + ((STYLENS,u'width'), None): cnv_string, + ((STYLENS,u'wrap'), None): cnv_string, + ((STYLENS,u'wrap-contour'), None): cnv_boolean, + ((STYLENS,u'wrap-contour-mode'), None): cnv_string, + ((STYLENS,u'wrap-dynamic-threshold'), None): cnv_length, + ((STYLENS,u'writing-mode-automatic'), None): cnv_boolean, + ((STYLENS,u'writing-mode'), None): cnv_string, + ((SVGNS,u'accent-height'), None): cnv_integer, + ((SVGNS,u'alphabetic'), None): cnv_integer, + ((SVGNS,u'ascent'), None): cnv_integer, + ((SVGNS,u'bbox'), None): cnv_string, + ((SVGNS,u'cap-height'), None): cnv_integer, + ((SVGNS,u'cx'), None): cnv_string, + ((SVGNS,u'cy'), None): cnv_string, + ((SVGNS,u'd'), None): cnv_string, + ((SVGNS,u'descent'), None): cnv_integer, + ((SVGNS,u'fill-rule'), None): cnv_string, + ((SVGNS,u'font-family'), None): cnv_string, + ((SVGNS,u'font-size'), None): cnv_string, + ((SVGNS,u'font-stretch'), None): cnv_string, + ((SVGNS,u'font-style'), None): cnv_string, + ((SVGNS,u'font-variant'), None): cnv_string, + ((SVGNS,u'font-weight'), None): cnv_string, + ((SVGNS,u'fx'), None): cnv_string, + ((SVGNS,u'fy'), None): cnv_string, + ((SVGNS,u'gradientTransform'), None): cnv_string, + ((SVGNS,u'gradientUnits'), None): cnv_string, + ((SVGNS,u'hanging'), None): cnv_integer, + ((SVGNS,u'height'), None): cnv_length, + ((SVGNS,u'ideographic'), None): cnv_integer, + ((SVGNS,u'mathematical'), None): cnv_integer, + ((SVGNS,u'name'), None): cnv_string, + ((SVGNS,u'offset'), None): cnv_string, + ((SVGNS,u'origin'), None): cnv_string, + ((SVGNS,u'overline-position'), None): cnv_integer, + ((SVGNS,u'overline-thickness'), None): cnv_integer, + ((SVGNS,u'panose-1'), None): cnv_string, + ((SVGNS,u'path'), None): cnv_string, + ((SVGNS,u'r'), None): cnv_length, + ((SVGNS,u'rx'), None): cnv_length, + ((SVGNS,u'ry'), None): cnv_length, + ((SVGNS,u'slope'), None): cnv_integer, + ((SVGNS,u'spreadMethod'), None): cnv_string, + ((SVGNS,u'stemh'), None): cnv_integer, + ((SVGNS,u'stemv'), None): cnv_integer, + ((SVGNS,u'stop-color'), None): cnv_string, + ((SVGNS,u'stop-opacity'), None): cnv_double, + ((SVGNS,u'strikethrough-position'), None): cnv_integer, + ((SVGNS,u'strikethrough-thickness'), None): cnv_integer, + ((SVGNS,u'string'), None): cnv_string, + ((SVGNS,u'stroke-color'), None): cnv_string, + ((SVGNS,u'stroke-opacity'), None): cnv_string, + ((SVGNS,u'stroke-width'), None): cnv_length, + ((SVGNS,u'type'), None): cnv_string, + ((SVGNS,u'underline-position'), None): cnv_integer, + ((SVGNS,u'underline-thickness'), None): cnv_integer, + ((SVGNS,u'unicode-range'), None): cnv_string, + ((SVGNS,u'units-per-em'), None): cnv_integer, + ((SVGNS,u'v-alphabetic'), None): cnv_integer, + ((SVGNS,u'v-hanging'), None): cnv_integer, + ((SVGNS,u'v-ideographic'), None): cnv_integer, + ((SVGNS,u'v-mathematical'), None): cnv_integer, + ((SVGNS,u'viewBox'), None): cnv_viewbox, + ((SVGNS,u'width'), None): cnv_length, + ((SVGNS,u'widths'), None): cnv_string, + ((SVGNS,u'x'), None): cnv_length, + ((SVGNS,u'x-height'), None): cnv_integer, + ((SVGNS,u'x1'), None): cnv_lengthorpercent, + ((SVGNS,u'x2'), None): cnv_lengthorpercent, + ((SVGNS,u'y'), None): cnv_length, + ((SVGNS,u'y1'), None): cnv_lengthorpercent, + ((SVGNS,u'y2'), None): cnv_lengthorpercent, + ((TABLENS,u'acceptance-state'), None): cnv_string, + ((TABLENS,u'add-empty-lines'), None): cnv_boolean, + ((TABLENS,u'algorithm'), None): cnv_formula, + ((TABLENS,u'align'), None): cnv_string, + ((TABLENS,u'allow-empty-cell'), None): cnv_boolean, + ((TABLENS,u'application-data'), None): cnv_string, + ((TABLENS,u'automatic-find-labels'), None): cnv_boolean, + ((TABLENS,u'base-cell-address'), None): cnv_string, + ((TABLENS,u'bind-styles-to-content'), None): cnv_boolean, + ((TABLENS,u'border-color'), None): cnv_string, + ((TABLENS,u'border-model'), None): cnv_string, + ((TABLENS,u'buttons'), None): cnv_string, + ((TABLENS,u'buttons'), None): cnv_string, + ((TABLENS,u'case-sensitive'), None): cnv_boolean, + ((TABLENS,u'case-sensitive'), None): cnv_string, + ((TABLENS,u'cell-address'), None): cnv_string, + ((TABLENS,u'cell-range-address'), None): cnv_string, + ((TABLENS,u'cell-range-address'), None): cnv_string, + ((TABLENS,u'cell-range'), None): cnv_string, + ((TABLENS,u'column'), None): cnv_integer, + ((TABLENS,u'comment'), None): cnv_string, + ((TABLENS,u'condition'), None): cnv_formula, + ((TABLENS,u'condition-source'), None): cnv_string, + ((TABLENS,u'condition-source-range-address'), None): cnv_string, + ((TABLENS,u'contains-error'), None): cnv_boolean, + ((TABLENS,u'contains-header'), None): cnv_boolean, + ((TABLENS,u'content-validation-name'), None): cnv_string, + ((TABLENS,u'copy-back'), None): cnv_boolean, + ((TABLENS,u'copy-formulas'), None): cnv_boolean, + ((TABLENS,u'copy-styles'), None): cnv_boolean, + ((TABLENS,u'count'), None): cnv_positiveInteger, + ((TABLENS,u'country'), None): cnv_token, + ((TABLENS,u'data-cell-range-address'), None): cnv_string, + ((TABLENS,u'data-field'), None): cnv_string, + ((TABLENS,u'data-type'), None): cnv_string, + ((TABLENS,u'database-name'), None): cnv_string, + ((TABLENS,u'database-table-name'), None): cnv_string, + ((TABLENS,u'date-end'), None): cnv_string, + ((TABLENS,u'date-start'), None): cnv_string, + ((TABLENS,u'date-value'), None): cnv_date, + ((TABLENS,u'default-cell-style-name'), None): cnv_StyleNameRef, + ((TABLENS,u'direction'), None): cnv_string, + ((TABLENS,u'display-border'), None): cnv_boolean, + ((TABLENS,u'display'), None): cnv_boolean, + ((TABLENS,u'display-duplicates'), None): cnv_boolean, + ((TABLENS,u'display-filter-buttons'), None): cnv_boolean, + ((TABLENS,u'display-list'), None): cnv_string, + ((TABLENS,u'display-member-mode'), None): cnv_string, + ((TABLENS,u'drill-down-on-double-click'), None): cnv_boolean, + ((TABLENS,u'enabled'), None): cnv_boolean, + ((TABLENS,u'end-cell-address'), None): cnv_string, + ((TABLENS,u'end'), None): cnv_string, + ((TABLENS,u'end-column'), None): cnv_integer, + ((TABLENS,u'end-position'), None): cnv_integer, + ((TABLENS,u'end-row'), None): cnv_integer, + ((TABLENS,u'end-table'), None): cnv_integer, + ((TABLENS,u'end-x'), None): cnv_length, + ((TABLENS,u'end-y'), None): cnv_length, + ((TABLENS,u'execute'), None): cnv_boolean, + ((TABLENS,u'expression'), None): cnv_formula, + ((TABLENS,u'field-name'), None): cnv_string, + ((TABLENS,u'field-number'), None): cnv_nonNegativeInteger, + ((TABLENS,u'field-number'), None): cnv_string, + ((TABLENS,u'filter-name'), None): cnv_string, + ((TABLENS,u'filter-options'), None): cnv_string, + ((TABLENS,u'formula'), None): cnv_formula, + ((TABLENS,u'function'), None): cnv_string, + ((TABLENS,u'function'), None): cnv_string, + ((TABLENS,u'grand-total'), None): cnv_string, + ((TABLENS,u'group-by-field-number'), None): cnv_nonNegativeInteger, + ((TABLENS,u'grouped-by'), None): cnv_string, + ((TABLENS,u'has-persistent-data'), None): cnv_boolean, + ((TABLENS,u'id'), None): cnv_string, + ((TABLENS,u'identify-categories'), None): cnv_boolean, + ((TABLENS,u'ignore-empty-rows'), None): cnv_boolean, + ((TABLENS,u'index'), None): cnv_nonNegativeInteger, + ((TABLENS,u'is-active'), None): cnv_boolean, + ((TABLENS,u'is-data-layout-field'), None): cnv_string, + ((TABLENS,u'is-selection'), None): cnv_boolean, + ((TABLENS,u'is-sub-table'), None): cnv_boolean, + ((TABLENS,u'label-cell-range-address'), None): cnv_string, + ((TABLENS,u'language'), None): cnv_token, + ((TABLENS,u'language'), None): cnv_token, + ((TABLENS,u'last-column-spanned'), None): cnv_positiveInteger, + ((TABLENS,u'last-row-spanned'), None): cnv_positiveInteger, + ((TABLENS,u'layout-mode'), None): cnv_string, + ((TABLENS,u'link-to-source-data'), None): cnv_boolean, + ((TABLENS,u'marked-invalid'), None): cnv_boolean, + ((TABLENS,u'matrix-covered'), None): cnv_boolean, + ((TABLENS,u'maximum-difference'), None): cnv_double, + ((TABLENS,u'member-count'), None): cnv_nonNegativeInteger, + ((TABLENS,u'member-name'), None): cnv_string, + ((TABLENS,u'member-type'), None): cnv_string, + ((TABLENS,u'message-type'), None): cnv_string, + ((TABLENS,u'mode'), None): cnv_string, + ((TABLENS,u'multi-deletion-spanned'), None): cnv_integer, + ((TABLENS,u'name'), None): cnv_string, + ((TABLENS,u'name'), None): cnv_string, + ((TABLENS,u'null-year'), None): cnv_positiveInteger, + ((TABLENS,u'number-columns-repeated'), None): cnv_positiveInteger, + ((TABLENS,u'number-columns-spanned'), None): cnv_positiveInteger, + ((TABLENS,u'number-matrix-columns-spanned'), None): cnv_positiveInteger, + ((TABLENS,u'number-matrix-rows-spanned'), None): cnv_positiveInteger, + ((TABLENS,u'number-rows-repeated'), None): cnv_positiveInteger, + ((TABLENS,u'number-rows-spanned'), None): cnv_positiveInteger, + ((TABLENS,u'object-name'), None): cnv_string, + ((TABLENS,u'on-update-keep-size'), None): cnv_boolean, + ((TABLENS,u'on-update-keep-styles'), None): cnv_boolean, + ((TABLENS,u'operator'), None): cnv_string, + ((TABLENS,u'operator'), None): cnv_string, + ((TABLENS,u'order'), None): cnv_string, + ((TABLENS,u'orientation'), None): cnv_string, + ((TABLENS,u'orientation'), None): cnv_string, + ((TABLENS,u'page-breaks-on-group-change'), None): cnv_boolean, + ((TABLENS,u'parse-sql-statement'), None): cnv_boolean, + ((TABLENS,u'password'), None): cnv_string, + ((TABLENS,u'position'), None): cnv_integer, + ((TABLENS,u'precision-as-shown'), None): cnv_boolean, + ((TABLENS,u'print'), None): cnv_boolean, + ((TABLENS,u'print-ranges'), None): cnv_string, + ((TABLENS,u'protect'), None): cnv_boolean, + ((TABLENS,u'protected'), None): cnv_boolean, + ((TABLENS,u'protection-key'), None): cnv_string, + ((TABLENS,u'query-name'), None): cnv_string, + ((TABLENS,u'range-usable-as'), None): cnv_string, + ((TABLENS,u'refresh-delay'), None): cnv_boolean, + ((TABLENS,u'refresh-delay'), None): cnv_duration, + ((TABLENS,u'rejecting-change-id'), None): cnv_string, + ((TABLENS,u'row'), None): cnv_integer, + ((TABLENS,u'scenario-ranges'), None): cnv_string, + ((TABLENS,u'search-criteria-must-apply-to-whole-cell'), None): cnv_boolean, + ((TABLENS,u'selected-page'), None): cnv_string, + ((TABLENS,u'show-details'), None): cnv_boolean, + ((TABLENS,u'show-empty'), None): cnv_boolean, + ((TABLENS,u'show-empty'), None): cnv_string, + ((TABLENS,u'show-filter-button'), None): cnv_boolean, + ((TABLENS,u'sort-mode'), None): cnv_string, + ((TABLENS,u'source-cell-range-addresses'), None): cnv_string, + ((TABLENS,u'source-cell-range-addresses'), None): cnv_string, + ((TABLENS,u'source-field-name'), None): cnv_string, + ((TABLENS,u'source-field-name'), None): cnv_string, + ((TABLENS,u'source-name'), None): cnv_string, + ((TABLENS,u'sql-statement'), None): cnv_string, + ((TABLENS,u'start'), None): cnv_string, + ((TABLENS,u'start-column'), None): cnv_integer, + ((TABLENS,u'start-position'), None): cnv_integer, + ((TABLENS,u'start-row'), None): cnv_integer, + ((TABLENS,u'start-table'), None): cnv_integer, + ((TABLENS,u'status'), None): cnv_string, + ((TABLENS,u'step'), None): cnv_double, + ((TABLENS,u'steps'), None): cnv_positiveInteger, + ((TABLENS,u'structure-protected'), None): cnv_boolean, + ((TABLENS,u'style-name'), None): cnv_StyleNameRef, + ((TABLENS,u'table-background'), None): cnv_boolean, + ((TABLENS,u'table'), None): cnv_integer, + ((TABLENS,u'table-name'), None): cnv_string, + ((TABLENS,u'target-cell-address'), None): cnv_string, + ((TABLENS,u'target-cell-address'), None): cnv_string, + ((TABLENS,u'target-range-address'), None): cnv_string, + ((TABLENS,u'target-range-address'), None): cnv_string, + ((TABLENS,u'title'), None): cnv_string, + ((TABLENS,u'track-changes'), None): cnv_boolean, + ((TABLENS,u'type'), None): cnv_string, + ((TABLENS,u'use-labels'), None): cnv_string, + ((TABLENS,u'use-regular-expressions'), None): cnv_boolean, + ((TABLENS,u'used-hierarchy'), None): cnv_integer, + ((TABLENS,u'user-name'), None): cnv_string, + ((TABLENS,u'value'), None): cnv_string, + ((TABLENS,u'value'), None): cnv_string, + ((TABLENS,u'value-type'), None): cnv_string, + ((TABLENS,u'visibility'), None): cnv_string, + ((TEXTNS,u'active'), None): cnv_boolean, + ((TEXTNS,u'address'), None): cnv_string, + ((TEXTNS,u'alphabetical-separators'), None): cnv_boolean, + ((TEXTNS,u'anchor-page-number'), None): cnv_positiveInteger, + ((TEXTNS,u'anchor-type'), None): cnv_string, + ((TEXTNS,u'animation'), None): cnv_string, + ((TEXTNS,u'animation-delay'), None): cnv_string, + ((TEXTNS,u'animation-direction'), None): cnv_string, + ((TEXTNS,u'animation-repeat'), None): cnv_string, + ((TEXTNS,u'animation-start-inside'), None): cnv_boolean, + ((TEXTNS,u'animation-steps'), None): cnv_length, + ((TEXTNS,u'animation-stop-inside'), None): cnv_boolean, + ((TEXTNS,u'annote'), None): cnv_string, + ((TEXTNS,u'author'), None): cnv_string, + ((TEXTNS,u'bibliography-data-field'), None): cnv_string, + ((TEXTNS,u'bibliography-type'), None): cnv_string, + ((TEXTNS,u'booktitle'), None): cnv_string, + ((TEXTNS,u'bullet-char'), None): cnv_string, + ((TEXTNS,u'bullet-relative-size'), None): cnv_string, + ((TEXTNS,u'c'), None): cnv_nonNegativeInteger, + ((TEXTNS,u'capitalize-entries'), None): cnv_boolean, + ((TEXTNS,u'caption-sequence-format'), None): cnv_string, + ((TEXTNS,u'caption-sequence-name'), None): cnv_string, + ((TEXTNS,u'change-id'), None): cnv_IDREF, + ((TEXTNS,u'chapter'), None): cnv_string, + ((TEXTNS,u'citation-body-style-name'), None): cnv_StyleNameRef, + ((TEXTNS,u'citation-style-name'), None): cnv_StyleNameRef, + ((TEXTNS,u'class-names'), None): cnv_NCNames, + ((TEXTNS,u'column-name'), None): cnv_string, + ((TEXTNS,u'combine-entries'), None): cnv_boolean, + ((TEXTNS,u'combine-entries-with-dash'), None): cnv_boolean, + ((TEXTNS,u'combine-entries-with-pp'), None): cnv_boolean, + ((TEXTNS,u'comma-separated'), None): cnv_boolean, + ((TEXTNS,u'cond-style-name'), None): cnv_StyleNameRef, + ((TEXTNS,u'condition'), None): cnv_formula, + ((TEXTNS,u'connection-name'), None): cnv_string, + ((TEXTNS,u'consecutive-numbering'), None): cnv_boolean, + ((TEXTNS,u'continue-numbering'), None): cnv_boolean, + ((TEXTNS,u'copy-outline-levels'), None): cnv_boolean, + ((TEXTNS,u'count-empty-lines'), None): cnv_boolean, + ((TEXTNS,u'count-in-text-boxes'), None): cnv_boolean, + ((TEXTNS,u'current-value'), None): cnv_boolean, + ((TEXTNS,u'custom1'), None): cnv_string, + ((TEXTNS,u'custom2'), None): cnv_string, + ((TEXTNS,u'custom3'), None): cnv_string, + ((TEXTNS,u'custom4'), None): cnv_string, + ((TEXTNS,u'custom5'), None): cnv_string, + ((TEXTNS,u'database-name'), None): cnv_string, + ((TEXTNS,u'date-adjust'), None): cnv_duration, + ((TEXTNS,u'date-value'), None): cnv_date, +# ((TEXTNS,u'date-value'), None): cnv_dateTime, + ((TEXTNS,u'default-style-name'), None): cnv_StyleNameRef, + ((TEXTNS,u'description'), None): cnv_string, + ((TEXTNS,u'display'), None): cnv_string, + ((TEXTNS,u'display-levels'), None): cnv_positiveInteger, + ((TEXTNS,u'display-outline-level'), None): cnv_nonNegativeInteger, + ((TEXTNS,u'dont-balance-text-columns'), None): cnv_boolean, + ((TEXTNS,u'duration'), None): cnv_duration, + ((TEXTNS,u'edition'), None): cnv_string, + ((TEXTNS,u'editor'), None): cnv_string, + ((TEXTNS,u'filter-name'), None): cnv_string, + ((TEXTNS,u'first-row-end-column'), None): cnv_string, + ((TEXTNS,u'first-row-start-column'), None): cnv_string, + ((TEXTNS,u'fixed'), None): cnv_boolean, + ((TEXTNS,u'footnotes-position'), None): cnv_string, + ((TEXTNS,u'formula'), None): cnv_formula, + ((TEXTNS,u'global'), None): cnv_boolean, + ((TEXTNS,u'howpublished'), None): cnv_string, + ((TEXTNS,u'id'), None): cnv_ID, +# ((TEXTNS,u'id'), None): cnv_string, + ((TEXTNS,u'identifier'), None): cnv_string, + ((TEXTNS,u'ignore-case'), None): cnv_boolean, + ((TEXTNS,u'increment'), None): cnv_nonNegativeInteger, + ((TEXTNS,u'index-name'), None): cnv_string, + ((TEXTNS,u'index-scope'), None): cnv_string, + ((TEXTNS,u'institution'), None): cnv_string, + ((TEXTNS,u'is-hidden'), None): cnv_boolean, + ((TEXTNS,u'is-list-header'), None): cnv_boolean, + ((TEXTNS,u'isbn'), None): cnv_string, + ((TEXTNS,u'issn'), None): cnv_string, + ((TEXTNS,u'issn'), None): cnv_string, + ((TEXTNS,u'journal'), None): cnv_string, + ((TEXTNS,u'key'), None): cnv_string, + ((TEXTNS,u'key1'), None): cnv_string, + ((TEXTNS,u'key1-phonetic'), None): cnv_string, + ((TEXTNS,u'key2'), None): cnv_string, + ((TEXTNS,u'key2-phonetic'), None): cnv_string, + ((TEXTNS,u'kind'), None): cnv_string, + ((TEXTNS,u'label'), None): cnv_string, + ((TEXTNS,u'last-row-end-column'), None): cnv_string, + ((TEXTNS,u'last-row-start-column'), None): cnv_string, + ((TEXTNS,u'level'), None): cnv_positiveInteger, + ((TEXTNS,u'line-break'), None): cnv_boolean, + ((TEXTNS,u'line-number'), None): cnv_string, + ((TEXTNS,u'main-entry'), None): cnv_boolean, + ((TEXTNS,u'main-entry-style-name'), None): cnv_StyleNameRef, + ((TEXTNS,u'master-page-name'), None): cnv_StyleNameRef, + ((TEXTNS,u'min-label-distance'), None): cnv_string, + ((TEXTNS,u'min-label-width'), None): cnv_string, + ((TEXTNS,u'month'), None): cnv_string, + ((TEXTNS,u'name'), None): cnv_string, + ((TEXTNS,u'note-class'), None): cnv_textnoteclass, + ((TEXTNS,u'note'), None): cnv_string, + ((TEXTNS,u'number'), None): cnv_string, + ((TEXTNS,u'number-lines'), None): cnv_boolean, + ((TEXTNS,u'number-position'), None): cnv_string, + ((TEXTNS,u'numbered-entries'), None): cnv_boolean, + ((TEXTNS,u'offset'), None): cnv_string, + ((TEXTNS,u'organizations'), None): cnv_string, + ((TEXTNS,u'outline-level'), None): cnv_string, + ((TEXTNS,u'page-adjust'), None): cnv_integer, + ((TEXTNS,u'pages'), None): cnv_string, + ((TEXTNS,u'paragraph-style-name'), None): cnv_StyleNameRef, + ((TEXTNS,u'placeholder-type'), None): cnv_string, + ((TEXTNS,u'prefix'), None): cnv_string, + ((TEXTNS,u'protected'), None): cnv_boolean, + ((TEXTNS,u'protection-key'), None): cnv_string, + ((TEXTNS,u'publisher'), None): cnv_string, + ((TEXTNS,u'ref-name'), None): cnv_string, + ((TEXTNS,u'reference-format'), None): cnv_string, + ((TEXTNS,u'relative-tab-stop-position'), None): cnv_boolean, + ((TEXTNS,u'report-type'), None): cnv_string, + ((TEXTNS,u'restart-numbering'), None): cnv_boolean, + ((TEXTNS,u'restart-on-page'), None): cnv_boolean, + ((TEXTNS,u'row-number'), None): cnv_nonNegativeInteger, + ((TEXTNS,u'school'), None): cnv_string, + ((TEXTNS,u'section-name'), None): cnv_string, + ((TEXTNS,u'select-page'), None): cnv_string, + ((TEXTNS,u'separation-character'), None): cnv_string, + ((TEXTNS,u'series'), None): cnv_string, + ((TEXTNS,u'sort-algorithm'), None): cnv_string, + ((TEXTNS,u'sort-ascending'), None): cnv_boolean, + ((TEXTNS,u'sort-by-position'), None): cnv_boolean, + ((TEXTNS,u'space-before'), None): cnv_string, + ((TEXTNS,u'start-numbering-at'), None): cnv_string, + ((TEXTNS,u'start-value'), None): cnv_nonNegativeInteger, + ((TEXTNS,u'start-value'), None): cnv_positiveInteger, + ((TEXTNS,u'string-value'), None): cnv_string, + ((TEXTNS,u'string-value-if-false'), None): cnv_string, + ((TEXTNS,u'string-value-if-true'), None): cnv_string, + ((TEXTNS,u'string-value-phonetic'), None): cnv_string, + ((TEXTNS,u'style-name'), None): cnv_StyleNameRef, + ((TEXTNS,u'suffix'), None): cnv_string, + ((TEXTNS,u'tab-ref'), None): cnv_nonNegativeInteger, + ((TEXTNS,u'table-name'), None): cnv_string, + ((TEXTNS,u'table-type'), None): cnv_string, + ((TEXTNS,u'time-adjust'), None): cnv_duration, + ((TEXTNS,u'time-value'), None): cnv_dateTime, + ((TEXTNS,u'time-value'), None): cnv_time, + ((TEXTNS,u'title'), None): cnv_string, + ((TEXTNS,u'track-changes'), None): cnv_boolean, + ((TEXTNS,u'url'), None): cnv_string, + ((TEXTNS,u'use-caption'), None): cnv_boolean, + ((TEXTNS,u'use-chart-objects'), None): cnv_boolean, + ((TEXTNS,u'use-draw-objects'), None): cnv_boolean, + ((TEXTNS,u'use-floating-frames'), None): cnv_boolean, + ((TEXTNS,u'use-graphics'), None): cnv_boolean, + ((TEXTNS,u'use-index-marks'), None): cnv_boolean, + ((TEXTNS,u'use-index-source-styles'), None): cnv_boolean, + ((TEXTNS,u'use-keys-as-entries'), None): cnv_boolean, + ((TEXTNS,u'use-math-objects'), None): cnv_boolean, + ((TEXTNS,u'use-objects'), None): cnv_boolean, + ((TEXTNS,u'use-other-objects'), None): cnv_boolean, + ((TEXTNS,u'use-outline-level'), None): cnv_boolean, + ((TEXTNS,u'use-soft-page-breaks'), None): cnv_boolean, + ((TEXTNS,u'use-spreadsheet-objects'), None): cnv_boolean, + ((TEXTNS,u'use-tables'), None): cnv_boolean, + ((TEXTNS,u'value'), None): cnv_nonNegativeInteger, + ((TEXTNS,u'visited-style-name'), None): cnv_StyleNameRef, + ((TEXTNS,u'volume'), None): cnv_string, + ((TEXTNS,u'year'), None): cnv_string, + ((XFORMSNS,u'bind'), None): cnv_string, + ((XLINKNS,u'actuate'), None): cnv_string, + ((XLINKNS,u'href'), None): cnv_anyURI, + ((XLINKNS,u'show'), None): cnv_xlinkshow, + ((XLINKNS,u'title'), None): cnv_string, + ((XLINKNS,u'type'), None): cnv_string, +} + +class AttrConverters: + def convert(self, attribute, value, element): + """ Based on the element, figures out how to check/convert the attribute value + All values are converted to string + """ + conversion = attrconverters.get((attribute, element.qname), None) + if conversion is not None: + return conversion(attribute, value, element) + else: + conversion = attrconverters.get((attribute, None), None) + if conversion is not None: + return conversion(attribute, value, element) + return unicode(value) + diff --git a/tablib/packages/odf/chart.py b/tablib/packages/odf/chart.py new file mode 100644 index 0000000..cca8396 --- /dev/null +++ b/tablib/packages/odf/chart.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from namespaces import CHARTNS +from element import Element + +# Autogenerated +def Axis(**args): + return Element(qname = (CHARTNS,'axis'), **args) + +def Categories(**args): + return Element(qname = (CHARTNS,'categories'), **args) + +def Chart(**args): + return Element(qname = (CHARTNS,'chart'), **args) + +def DataPoint(**args): + return Element(qname = (CHARTNS,'data-point'), **args) + +def Domain(**args): + return Element(qname = (CHARTNS,'domain'), **args) + +def ErrorIndicator(**args): + return Element(qname = (CHARTNS,'error-indicator'), **args) + +def Floor(**args): + return Element(qname = (CHARTNS,'floor'), **args) + +def Footer(**args): + return Element(qname = (CHARTNS,'footer'), **args) + +def Grid(**args): + return Element(qname = (CHARTNS,'grid'), **args) + +def Legend(**args): + return Element(qname = (CHARTNS,'legend'), **args) + +def MeanValue(**args): + return Element(qname = (CHARTNS,'mean-value'), **args) + +def PlotArea(**args): + return Element(qname = (CHARTNS,'plot-area'), **args) + +def RegressionCurve(**args): + return Element(qname = (CHARTNS,'regression-curve'), **args) + +def Series(**args): + return Element(qname = (CHARTNS,'series'), **args) + +def StockGainMarker(**args): + return Element(qname = (CHARTNS,'stock-gain-marker'), **args) + +def StockLossMarker(**args): + return Element(qname = (CHARTNS,'stock-loss-marker'), **args) + +def StockRangeLine(**args): + return Element(qname = (CHARTNS,'stock-range-line'), **args) + +def Subtitle(**args): + return Element(qname = (CHARTNS,'subtitle'), **args) + +def SymbolImage(**args): + return Element(qname = (CHARTNS,'symbol-image'), **args) + +def Title(**args): + return Element(qname = (CHARTNS,'title'), **args) + +def Wall(**args): + return Element(qname = (CHARTNS,'wall'), **args) + diff --git a/tablib/packages/odf/config.py b/tablib/packages/odf/config.py new file mode 100644 index 0000000..f33f361 --- /dev/null +++ b/tablib/packages/odf/config.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from namespaces import CONFIGNS +from element import Element + +# Autogenerated +def ConfigItem(**args): + return Element(qname = (CONFIGNS, 'config-item'), **args) + +def ConfigItemMapEntry(**args): + return Element(qname = (CONFIGNS,'config-item-map-entry'), **args) + +def ConfigItemMapIndexed(**args): + return Element(qname = (CONFIGNS,'config-item-map-indexed'), **args) + +def ConfigItemMapNamed(**args): + return Element(qname = (CONFIGNS,'config-item-map-named'), **args) + +def ConfigItemSet(**args): + return Element(qname = (CONFIGNS, 'config-item-set'), **args) + diff --git a/tablib/packages/odf/dc.py b/tablib/packages/odf/dc.py new file mode 100644 index 0000000..7c96776 --- /dev/null +++ b/tablib/packages/odf/dc.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from namespaces import DCNS +from element import Element + +# Autogenerated +def Creator(**args): + return Element(qname = (DCNS,'creator'), **args) + +def Date(**args): + return Element(qname = (DCNS,'date'), **args) + +def Description(**args): + return Element(qname = (DCNS,'description'), **args) + +def Language(**args): + return Element(qname = (DCNS,'language'), **args) + +def Subject(**args): + return Element(qname = (DCNS,'subject'), **args) + +def Title(**args): + return Element(qname = (DCNS,'title'), **args) + +# The following complete the Dublin Core elements, but there is no +# guarantee a compliant implementation of OpenDocument will preserve +# these elements + +#def Contributor(**args): +# return Element(qname = (DCNS,'contributor'), **args) + +#def Coverage(**args): +# return Element(qname = (DCNS,'coverage'), **args) + +#def Format(**args): +# return Element(qname = (DCNS,'format'), **args) + +#def Identifier(**args): +# return Element(qname = (DCNS,'identifier'), **args) + +#def Publisher(**args): +# return Element(qname = (DCNS,'publisher'), **args) + +#def Relation(**args): +# return Element(qname = (DCNS,'relation'), **args) + +#def Rights(**args): +# return Element(qname = (DCNS,'rights'), **args) + +#def Source(**args): +# return Element(qname = (DCNS,'source'), **args) + +#def Type(**args): +# return Element(qname = (DCNS,'type'), **args) diff --git a/tablib/packages/odf/dr3d.py b/tablib/packages/odf/dr3d.py new file mode 100644 index 0000000..324ae1c --- /dev/null +++ b/tablib/packages/odf/dr3d.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from namespaces import DR3DNS +from element import Element +from draw import StyleRefElement + +# Autogenerated +def Cube(**args): + return StyleRefElement(qname = (DR3DNS,'cube'), **args) + +def Extrude(**args): + return StyleRefElement(qname = (DR3DNS,'extrude'), **args) + +def Light(Element): + return StyleRefElement(qname = (DR3DNS,'light'), **args) + +def Rotate(**args): + return StyleRefElement(qname = (DR3DNS,'rotate'), **args) + +def Scene(**args): + return StyleRefElement(qname = (DR3DNS,'scene'), **args) + +def Sphere(**args): + return StyleRefElement(qname = (DR3DNS,'sphere'), **args) + diff --git a/tablib/packages/odf/draw.py b/tablib/packages/odf/draw.py new file mode 100644 index 0000000..7692e5a --- /dev/null +++ b/tablib/packages/odf/draw.py @@ -0,0 +1,182 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from namespaces import DRAWNS, STYLENS, PRESENTATIONNS +from element import Element + +def StyleRefElement(stylename=None, classnames=None, **args): + qattrs = {} + if stylename is not None: + f = stylename.getAttrNS(STYLENS, 'family') + if f == 'graphic': + qattrs[(DRAWNS,u'style-name')]= stylename + elif f == 'presentation': + qattrs[(PRESENTATIONNS,u'style-name')]= stylename + else: + raise ValueError, "Style's family must be either 'graphic' or 'presentation'" + if classnames is not None: + f = classnames[0].getAttrNS(STYLENS, 'family') + if f == 'graphic': + qattrs[(DRAWNS,u'class-names')]= classnames + elif f == 'presentation': + qattrs[(PRESENTATIONNS,u'class-names')]= classnames + else: + raise ValueError, "Style's family must be either 'graphic' or 'presentation'" + return Element(qattributes=qattrs, **args) + +def DrawElement(name=None, **args): + e = Element(name=name, **args) + if not args.has_key('displayname'): + e.setAttrNS(DRAWNS,'display-name', name) + return e + +# Autogenerated +def A(**args): + return Element(qname = (DRAWNS,'a'), **args) + +def Applet(**args): + return Element(qname = (DRAWNS,'applet'), **args) + +def AreaCircle(**args): + return Element(qname = (DRAWNS,'area-circle'), **args) + +def AreaPolygon(**args): + return Element(qname = (DRAWNS,'area-polygon'), **args) + +def AreaRectangle(**args): + return Element(qname = (DRAWNS,'area-rectangle'), **args) + +def Caption(**args): + return StyleRefElement(qname = (DRAWNS,'caption'), **args) + +def Circle(**args): + return StyleRefElement(qname = (DRAWNS,'circle'), **args) + +def Connector(**args): + return StyleRefElement(qname = (DRAWNS,'connector'), **args) + +def ContourPath(**args): + return Element(qname = (DRAWNS,'contour-path'), **args) + +def ContourPolygon(**args): + return Element(qname = (DRAWNS,'contour-polygon'), **args) + +def Control(**args): + return StyleRefElement(qname = (DRAWNS,'control'), **args) + +def CustomShape(**args): + return StyleRefElement(qname = (DRAWNS,'custom-shape'), **args) + +def Ellipse(**args): + return StyleRefElement(qname = (DRAWNS,'ellipse'), **args) + +def EnhancedGeometry(**args): + return Element(qname = (DRAWNS,'enhanced-geometry'), **args) + +def Equation(**args): + return Element(qname = (DRAWNS,'equation'), **args) + +def FillImage(**args): + return DrawElement(qname = (DRAWNS,'fill-image'), **args) + +def FloatingFrame(**args): + return Element(qname = (DRAWNS,'floating-frame'), **args) + +def Frame(**args): + return StyleRefElement(qname = (DRAWNS,'frame'), **args) + +def G(**args): + return StyleRefElement(qname = (DRAWNS,'g'), **args) + +def GluePoint(**args): + return Element(qname = (DRAWNS,'glue-point'), **args) + +def Gradient(**args): + return DrawElement(qname = (DRAWNS,'gradient'), **args) + +def Handle(**args): + return Element(qname = (DRAWNS,'handle'), **args) + +def Hatch(**args): + return DrawElement(qname = (DRAWNS,'hatch'), **args) + +def Image(**args): + return Element(qname = (DRAWNS,'image'), **args) + +def ImageMap(**args): + return Element(qname = (DRAWNS,'image-map'), **args) + +def Layer(**args): + return Element(qname = (DRAWNS,'layer'), **args) + +def LayerSet(**args): + return Element(qname = (DRAWNS,'layer-set'), **args) + +def Line(**args): + return StyleRefElement(qname = (DRAWNS,'line'), **args) + +def Marker(**args): + return DrawElement(qname = (DRAWNS,'marker'), **args) + +def Measure(**args): + return StyleRefElement(qname = (DRAWNS,'measure'), **args) + +def Object(**args): + return Element(qname = (DRAWNS,'object'), **args) + +def ObjectOle(**args): + return Element(qname = (DRAWNS,'object-ole'), **args) + +def Opacity(**args): + return DrawElement(qname = (DRAWNS,'opacity'), **args) + +def Page(**args): + return Element(qname = (DRAWNS,'page'), **args) + +def PageThumbnail(**args): + return StyleRefElement(qname = (DRAWNS,'page-thumbnail'), **args) + +def Param(**args): + return Element(qname = (DRAWNS,'param'), **args) + +def Path(**args): + return StyleRefElement(qname = (DRAWNS,'path'), **args) + +def Plugin(**args): + return Element(qname = (DRAWNS,'plugin'), **args) + +def Polygon(**args): + return StyleRefElement(qname = (DRAWNS,'polygon'), **args) + +def Polyline(**args): + return StyleRefElement(qname = (DRAWNS,'polyline'), **args) + +def Rect(**args): + return StyleRefElement(qname = (DRAWNS,'rect'), **args) + +def RegularPolygon(**args): + return StyleRefElement(qname = (DRAWNS,'regular-polygon'), **args) + +def StrokeDash(**args): + return DrawElement(qname = (DRAWNS,'stroke-dash'), **args) + +def TextBox(**args): + return Element(qname = (DRAWNS,'text-box'), **args) + diff --git a/tablib/packages/odf/easyliststyle.py b/tablib/packages/odf/easyliststyle.py new file mode 100644 index 0000000..b2a54c2 --- /dev/null +++ b/tablib/packages/odf/easyliststyle.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- +# Create a element from a text string. +# Copyright (C) 2008 J. David Eisenberg +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Contributor(s): +# + +import re +from style import Style, TextProperties, ListLevelProperties +from text import ListStyle,ListLevelStyleNumber,ListLevelStyleBullet + +""" +Create a element from a string or array. + +List styles require a lot of code to create one level at a time. +These routines take a string and delimiter, or a list of +strings, and creates a element for you. +Each item in the string (or array) represents a list level + * style for levels 1-10.

+ * + *

If an item contains 1, I, + * i, A, or a, then it is presumed + * to be a numbering style; otherwise it is a bulleted style.

+""" + +_MAX_LIST_LEVEL = 10 +SHOW_ALL_LEVELS = True +SHOW_ONE_LEVEL = False + +def styleFromString(name, specifiers, delim, spacing, showAllLevels): + specArray = specifiers.split(delim) + return styleFromList( name, specArray, spacing, showAllLevels ) + +def styleFromList( styleName, specArray, spacing, showAllLevels): + bullet = "" + numPrefix = "" + numSuffix = "" + numberFormat = "" + cssLengthNum = 0 + cssLengthUnits = "" + numbered = False + displayLevels = 0 + listStyle = ListStyle(name=styleName) + numFormatPattern = re.compile("([1IiAa])") + cssLengthPattern = re.compile("([^a-z]+)\\s*([a-z]+)?") + m = cssLengthPattern.search( spacing ) + if (m != None): + cssLengthNum = float(m.group(1)) + if (m.lastindex == 2): + cssLengthUnits = m.group(2) + i = 0 + while i < len(specArray): + specification = specArray[i] + m = numFormatPattern.search(specification) + if (m != None): + numberFormat = m.group(1) + numPrefix = specification[0:m.start(1)] + numSuffix = specification[m.end(1):] + bullet = "" + numbered = True + if (showAllLevels): + displayLevels = i + 1 + else: + displayLevels = 1 + else: # it's a bullet style + bullet = specification + numPrefix = "" + numSuffix = "" + numberFormat = "" + displayLevels = 1 + numbered = False + if (numbered): + lls = ListLevelStyleNumber(level=(i+1)) + if (numPrefix != ''): + lls.setAttribute('numprefix', numPrefix) + if (numSuffix != ''): + lls.setAttribute('numsuffix', numSuffix) + lls.setAttribute('displaylevels', displayLevels) + else: + lls = ListLevelStyleBullet(level=(i+1),bulletchar=bullet[0]) + llp = ListLevelProperties() + llp.setAttribute('spacebefore', str(cssLengthNum * (i+1)) + cssLengthUnits) + llp.setAttribute('minlabelwidth', str(cssLengthNum) + cssLengthUnits) + lls.addElement( llp ) + listStyle.addElement(lls) + i += 1 + return listStyle + +# vim: set expandtab sw=4 : diff --git a/tablib/packages/odf/element.py b/tablib/packages/odf/element.py new file mode 100644 index 0000000..aad6980 --- /dev/null +++ b/tablib/packages/odf/element.py @@ -0,0 +1,513 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2010 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +# Note: This script has copied a lot of text from xml.dom.minidom. +# Whatever license applies to that file also applies to this file. +# +import xml.dom +from xml.dom.minicompat import * +from namespaces import nsdict +import grammar +from attrconverters import AttrConverters + +# The following code is pasted form xml.sax.saxutils +# Tt makes it possible to run the code without the xml sax package installed +# To make it possible to have in your text elements, it is necessary to escape the texts +def _escape(data, entities={}): + """ Escape &, <, and > in a string of data. + + You can escape other strings of data by passing a dictionary as + the optional entities parameter. The keys and values must all be + strings; each key will be replaced with its corresponding value. + """ + data = data.replace("&", "&") + data = data.replace("<", "<") + data = data.replace(">", ">") + for chars, entity in entities.items(): + data = data.replace(chars, entity) + return data + +def _quoteattr(data, entities={}): + """ Escape and quote an attribute value. + + Escape &, <, and > in a string of data, then quote it for use as + an attribute value. The \" character will be escaped as well, if + necessary. + + You can escape other strings of data by passing a dictionary as + the optional entities parameter. The keys and values must all be + strings; each key will be replaced with its corresponding value. + """ + entities['\n']=' ' + entities['\r']=' ' + data = _escape(data, entities) + if '"' in data: + if "'" in data: + data = '"%s"' % data.replace('"', """) + else: + data = "'%s'" % data + else: + data = '"%s"' % data + return data + +def _nssplit(qualifiedName): + """ Split a qualified name into namespace part and local part. """ + fields = qualifiedName.split(':', 1) + if len(fields) == 2: + return fields + else: + return (None, fields[0]) + +def _nsassign(namespace): + return nsdict.setdefault(namespace,"ns" + str(len(nsdict))) + +# Exceptions +class IllegalChild(StandardError): + """ Complains if you add an element to a parent where it is not allowed """ +class IllegalText(StandardError): + """ Complains if you add text or cdata to an element where it is not allowed """ + +class Node(xml.dom.Node): + """ super class for more specific nodes """ + parentNode = None + nextSibling = None + previousSibling = None + + def hasChildNodes(self): + """ Tells whether this element has any children; text nodes, + subelements, whatever. + """ + if self.childNodes: + return True + else: + return False + + def _get_childNodes(self): + return self.childNodes + + def _get_firstChild(self): + if self.childNodes: + return self.childNodes[0] + + def _get_lastChild(self): + if self.childNodes: + return self.childNodes[-1] + + def insertBefore(self, newChild, refChild): + """ Inserts the node newChild before the existing child node refChild. + If refChild is null, insert newChild at the end of the list of children. + """ + if newChild.nodeType not in self._child_node_types: + raise IllegalChild, "%s cannot be child of %s" % (newChild.tagName, self.tagName) + if newChild.parentNode is not None: + newChild.parentNode.removeChild(newChild) + if refChild is None: + self.appendChild(newChild) + else: + try: + index = self.childNodes.index(refChild) + except ValueError: + raise xml.dom.NotFoundErr() + self.childNodes.insert(index, newChild) + newChild.nextSibling = refChild + refChild.previousSibling = newChild + if index: + node = self.childNodes[index-1] + node.nextSibling = newChild + newChild.previousSibling = node + else: + newChild.previousSibling = None + newChild.parentNode = self + return newChild + + def appendChild(self, newChild): + """ Adds the node newChild to the end of the list of children of this node. + If the newChild is already in the tree, it is first removed. + """ + if newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE: + for c in tuple(newChild.childNodes): + self.appendChild(c) + ### The DOM does not clearly specify what to return in this case + return newChild + if newChild.nodeType not in self._child_node_types: + raise IllegalChild, "<%s> is not allowed in %s" % ( newChild.tagName, self.tagName) + if newChild.parentNode is not None: + newChild.parentNode.removeChild(newChild) + _append_child(self, newChild) + newChild.nextSibling = None + return newChild + + def removeChild(self, oldChild): + """ Removes the child node indicated by oldChild from the list of children, and returns it. + """ + #FIXME: update ownerDocument.element_dict or find other solution + try: + self.childNodes.remove(oldChild) + except ValueError: + raise xml.dom.NotFoundErr() + if oldChild.nextSibling is not None: + oldChild.nextSibling.previousSibling = oldChild.previousSibling + if oldChild.previousSibling is not None: + oldChild.previousSibling.nextSibling = oldChild.nextSibling + oldChild.nextSibling = oldChild.previousSibling = None + if self.ownerDocument: + self.ownerDocument.clear_caches() + oldChild.parentNode = None + return oldChild + + def __str__(self): + val = [] + for c in self.childNodes: + val.append(str(c)) + return ''.join(val) + + def __unicode__(self): + val = [] + for c in self.childNodes: + val.append(unicode(c)) + return u''.join(val) + +defproperty(Node, "firstChild", doc="First child node, or None.") +defproperty(Node, "lastChild", doc="Last child node, or None.") + +def _append_child(self, node): + # fast path with less checks; usable by DOM builders if careful + childNodes = self.childNodes + if childNodes: + last = childNodes[-1] + node.__dict__["previousSibling"] = last + last.__dict__["nextSibling"] = node + childNodes.append(node) + node.__dict__["parentNode"] = self + +class Childless: + """ Mixin that makes childless-ness easy to implement and avoids + the complexity of the Node methods that deal with children. + """ + + attributes = None + childNodes = EmptyNodeList() + firstChild = None + lastChild = None + + def _get_firstChild(self): + return None + + def _get_lastChild(self): + return None + + def appendChild(self, node): + """ Raises an error """ + raise xml.dom.HierarchyRequestErr( + self.tagName + " nodes cannot have children") + + def hasChildNodes(self): + return False + + def insertBefore(self, newChild, refChild): + """ Raises an error """ + raise xml.dom.HierarchyRequestErr( + self.tagName + " nodes do not have children") + + def removeChild(self, oldChild): + """ Raises an error """ + raise xml.dom.NotFoundErr( + self.tagName + " nodes do not have children") + + def replaceChild(self, newChild, oldChild): + """ Raises an error """ + raise xml.dom.HierarchyRequestErr( + self.tagName + " nodes do not have children") + +class Text(Childless, Node): + nodeType = Node.TEXT_NODE + tagName = "Text" + + def __init__(self, data): + self.data = data + + def __str__(self): + return self.data.encode() + + def __unicode__(self): + return self.data + + def toXml(self,level,f): + """ Write XML in UTF-8 """ + if self.data: + f.write(_escape(unicode(self.data).encode('utf-8'))) + +class CDATASection(Childless, Text): + nodeType = Node.CDATA_SECTION_NODE + + def toXml(self,level,f): + """ Generate XML output of the node. If the text contains "]]>", then + escape it by going out of CDATA mode (]]>), then write the string + and then go into CDATA mode again. (' % self.data.replace(']]>',']]>]]>" % (r[1].lower().replace('-',''), self.tagName) + + def get_knownns(self, prefix): + """ Odfpy maintains a list of known namespaces. In some cases a prefix is used, and + we need to know which namespace it resolves to. + """ + global nsdict + for ns,p in nsdict.items(): + if p == prefix: return ns + return None + + def get_nsprefix(self, namespace): + """ Odfpy maintains a list of known namespaces. In some cases we have a namespace URL, + and needs to look up or assign the prefix for it. + """ + if namespace is None: namespace = "" + prefix = _nsassign(namespace) + if not self.namespaces.has_key(namespace): + self.namespaces[namespace] = prefix + return prefix + + def allowed_attributes(self): + return grammar.allowed_attributes.get(self.qname) + + def _setOwnerDoc(self, element): + element.ownerDocument = self.ownerDocument + for child in element.childNodes: + self._setOwnerDoc(child) + + def addElement(self, element, check_grammar=True): + """ adds an element to an Element + + Element.addElement(Element) + """ + if check_grammar and self.allowed_children is not None: + if element.qname not in self.allowed_children: + raise IllegalChild, "<%s> is not allowed in <%s>" % ( element.tagName, self.tagName) + self.appendChild(element) + self._setOwnerDoc(element) + if self.ownerDocument: + self.ownerDocument.rebuild_caches(element) + + def addText(self, text, check_grammar=True): + """ Adds text to an element + Setting check_grammar=False turns off grammar checking + """ + if check_grammar and self.qname not in grammar.allows_text: + raise IllegalText, "The <%s> element does not allow text" % self.tagName + else: + if text != '': + self.appendChild(Text(text)) + + def addCDATA(self, cdata, check_grammar=True): + """ Adds CDATA to an element + Setting check_grammar=False turns off grammar checking + """ + if check_grammar and self.qname not in grammar.allows_text: + raise IllegalText, "The <%s> element does not allow text" % self.tagName + else: + self.appendChild(CDATASection(cdata)) + + def removeAttribute(self, attr, check_grammar=True): + """ Removes an attribute by name. """ + allowed_attrs = self.allowed_attributes() + if allowed_attrs is None: + if type(attr) == type(()): + prefix, localname = attr + self.removeAttrNS(prefix, localname) + else: + raise AttributeError, "Unable to add simple attribute - use (namespace, localpart)" + else: + # Construct a list of allowed arguments + allowed_args = [ a[1].lower().replace('-','') for a in allowed_attrs] + if check_grammar and attr not in allowed_args: + raise AttributeError, "Attribute %s is not allowed in <%s>" % ( attr, self.tagName) + i = allowed_args.index(attr) + self.removeAttrNS(allowed_attrs[i][0], allowed_attrs[i][1]) + + def setAttribute(self, attr, value, check_grammar=True): + """ Add an attribute to the element + This is sort of a convenience method. All attributes in ODF have + namespaces. The library knows what attributes are legal and then allows + the user to provide the attribute as a keyword argument and the + library will add the correct namespace. + Must overwrite, If attribute already exists. + """ + allowed_attrs = self.allowed_attributes() + if allowed_attrs is None: + if type(attr) == type(()): + prefix, localname = attr + self.setAttrNS(prefix, localname, value) + else: + raise AttributeError, "Unable to add simple attribute - use (namespace, localpart)" + else: + # Construct a list of allowed arguments + allowed_args = [ a[1].lower().replace('-','') for a in allowed_attrs] + if check_grammar and attr not in allowed_args: + raise AttributeError, "Attribute %s is not allowed in <%s>" % ( attr, self.tagName) + i = allowed_args.index(attr) + self.setAttrNS(allowed_attrs[i][0], allowed_attrs[i][1], value) + + def setAttrNS(self, namespace, localpart, value): + """ Add an attribute to the element + In case you need to add an attribute the library doesn't know about + then you must provide the full qualified name + It will not check that the attribute is legal according to the schema. + Must overwrite, If attribute already exists. + """ + allowed_attrs = self.allowed_attributes() + prefix = self.get_nsprefix(namespace) +# if allowed_attrs and (namespace, localpart) not in allowed_attrs: +# raise AttributeError, "Attribute %s:%s is not allowed in element <%s>" % ( prefix, localpart, self.tagName) + c = AttrConverters() + self.attributes[(namespace, localpart)] = c.convert((namespace, localpart), value, self) + + def getAttrNS(self, namespace, localpart): + prefix = self.get_nsprefix(namespace) + return self.attributes.get((namespace, localpart)) + + def removeAttrNS(self, namespace, localpart): + del self.attributes[(namespace, localpart)] + + def getAttribute(self, attr): + """ Get an attribute value. The method knows which namespace the attribute is in + """ + allowed_attrs = self.allowed_attributes() + if allowed_attrs is None: + if type(attr) == type(()): + prefix, localname = attr + return self.getAttrNS(prefix, localname) + else: + raise AttributeError, "Unable to get simple attribute - use (namespace, localpart)" + else: + # Construct a list of allowed arguments + allowed_args = [ a[1].lower().replace('-','') for a in allowed_attrs] + i = allowed_args.index(attr) + return self.getAttrNS(allowed_attrs[i][0], allowed_attrs[i][1]) + + def write_open_tag(self, level, f): + f.write('<'+self.tagName) + if level == 0: + for namespace, prefix in self.namespaces.items(): + f.write(' xmlns:' + prefix + '="'+ _escape(str(namespace))+'"') + for qname in self.attributes.keys(): + prefix = self.get_nsprefix(qname[0]) + f.write(' '+_escape(str(prefix+':'+qname[1]))+'='+_quoteattr(unicode(self.attributes[qname]).encode('utf-8'))) + f.write('>') + + def write_close_tag(self, level, f): + f.write('') + + def toXml(self, level, f): + """ Generate XML stream out of the tree structure """ + f.write('<'+self.tagName) + if level == 0: + for namespace, prefix in self.namespaces.items(): + f.write(' xmlns:' + prefix + '="'+ _escape(str(namespace))+'"') + for qname in self.attributes.keys(): + prefix = self.get_nsprefix(qname[0]) + f.write(' '+_escape(str(prefix+':'+qname[1]))+'='+_quoteattr(unicode(self.attributes[qname]).encode('utf-8'))) + if self.childNodes: + f.write('>') + for element in self.childNodes: + element.toXml(level+1,f) + f.write('') + else: + f.write('/>') + + def _getElementsByObj(self, obj, accumulator): + if self.qname == obj.qname: + accumulator.append(self) + for e in self.childNodes: + if e.nodeType == Node.ELEMENT_NODE: + accumulator = e._getElementsByObj(obj, accumulator) + return accumulator + + def getElementsByType(self, element): + """ Gets elements based on the type, which is function from text.py, draw.py etc. """ + obj = element(check_grammar=False) + return self._getElementsByObj(obj,[]) + + def isInstanceOf(self, element): + """ This is a check to see if the object is an instance of a type """ + obj = element(check_grammar=False) + return self.qname == obj.qname + + diff --git a/tablib/packages/odf/elementtypes.py b/tablib/packages/odf/elementtypes.py new file mode 100644 index 0000000..7c19412 --- /dev/null +++ b/tablib/packages/odf/elementtypes.py @@ -0,0 +1,325 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright (C) 2008 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from namespaces import * + +# Inline element don't cause a box +# They are analogous to the HTML elements SPAN, B, I etc. +inline_elements = ( + (TEXTNS,u'a'), + (TEXTNS,u'author-initials'), + (TEXTNS,u'author-name'), + (TEXTNS,u'bibliography-mark'), + (TEXTNS,u'bookmark-ref'), + (TEXTNS,u'chapter'), + (TEXTNS,u'character-count'), + (TEXTNS,u'conditional-text'), + (TEXTNS,u'creation-date'), + (TEXTNS,u'creation-time'), + (TEXTNS,u'creator'), + (TEXTNS,u'database-display'), + (TEXTNS,u'database-name'), + (TEXTNS,u'database-next'), + (TEXTNS,u'database-row-number'), + (TEXTNS,u'database-row-select'), + (TEXTNS,u'date'), + (TEXTNS,u'dde-connection'), + (TEXTNS,u'description'), + (TEXTNS,u'editing-cycles'), + (TEXTNS,u'editing-duration'), + (TEXTNS,u'execute-macro'), + (TEXTNS,u'expression'), + (TEXTNS,u'file-name'), + (TEXTNS,u'hidden-paragraph'), + (TEXTNS,u'hidden-text'), + (TEXTNS,u'image-count'), + (TEXTNS,u'initial-creator'), + (TEXTNS,u'keywords'), + (TEXTNS,u'measure'), + (TEXTNS,u'modification-date'), + (TEXTNS,u'modification-time'), + (TEXTNS,u'note-ref'), + (TEXTNS,u'object-count'), + (TEXTNS,u'page-continuation'), + (TEXTNS,u'page-count'), + (TEXTNS,u'page-number'), + (TEXTNS,u'page-variable-get'), + (TEXTNS,u'page-variable-set'), + (TEXTNS,u'paragraph-count'), + (TEXTNS,u'placeholder'), + (TEXTNS,u'print-date'), + (TEXTNS,u'printed-by'), + (TEXTNS,u'print-time'), + (TEXTNS,u'reference-ref'), + (TEXTNS,u'ruby'), + (TEXTNS,u'ruby-base'), + (TEXTNS,u'ruby-text'), + (TEXTNS,u'script'), + (TEXTNS,u'sender-city'), + (TEXTNS,u'sender-company'), + (TEXTNS,u'sender-country'), + (TEXTNS,u'sender-email'), + (TEXTNS,u'sender-fax'), + (TEXTNS,u'sender-firstname'), + (TEXTNS,u'sender-initials'), + (TEXTNS,u'sender-lastname'), + (TEXTNS,u'sender-phone-private'), + (TEXTNS,u'sender-phone-work'), + (TEXTNS,u'sender-position'), + (TEXTNS,u'sender-postal-code'), + (TEXTNS,u'sender-state-or-province'), + (TEXTNS,u'sender-street'), + (TEXTNS,u'sender-title'), + (TEXTNS,u'sequence'), + (TEXTNS,u'sequence-ref'), + (TEXTNS,u'sheet-name'), + (TEXTNS,u'span'), + (TEXTNS,u'subject'), + (TEXTNS,u'table-count'), + (TEXTNS,u'table-formula'), + (TEXTNS,u'template-name'), + (TEXTNS,u'text-input'), + (TEXTNS,u'time'), + (TEXTNS,u'title'), + (TEXTNS,u'user-defined'), + (TEXTNS,u'user-field-get'), + (TEXTNS,u'user-field-input'), + (TEXTNS,u'variable-get'), + (TEXTNS,u'variable-input'), + (TEXTNS,u'variable-set'), + (TEXTNS,u'word-count'), +) + + +# It is almost impossible to determine what elements are block elements. +# There are so many that don't fit the form +block_elements = ( + (TEXTNS,u'h'), + (TEXTNS,u'p'), + (TEXTNS,u'list'), + (TEXTNS,u'list-item'), + (TEXTNS,u'section'), +) + +declarative_elements = ( + (OFFICENS,u'font-face-decls'), + (PRESENTATIONNS,u'date-time-decl'), + (PRESENTATIONNS,u'footer-decl'), + (PRESENTATIONNS,u'header-decl'), + (TABLENS,u'table-template'), + (TEXTNS,u'alphabetical-index-entry-template'), + (TEXTNS,u'alphabetical-index-source'), + (TEXTNS,u'bibliography-entry-template'), + (TEXTNS,u'bibliography-source'), + (TEXTNS,u'dde-connection-decls'), + (TEXTNS,u'illustration-index-entry-template'), + (TEXTNS,u'illustration-index-source'), + (TEXTNS,u'index-source-styles'), + (TEXTNS,u'index-title-template'), + (TEXTNS,u'note-continuation-notice-backward'), + (TEXTNS,u'note-continuation-notice-forward'), + (TEXTNS,u'notes-configuration'), + (TEXTNS,u'object-index-entry-template'), + (TEXTNS,u'object-index-source'), + (TEXTNS,u'sequence-decls'), + (TEXTNS,u'table-index-entry-template'), + (TEXTNS,u'table-index-source'), + (TEXTNS,u'table-of-content-entry-template'), + (TEXTNS,u'table-of-content-source'), + (TEXTNS,u'user-field-decls'), + (TEXTNS,u'user-index-entry-template'), + (TEXTNS,u'user-index-source'), + (TEXTNS,u'variable-decls'), +) + +empty_elements = ( + (ANIMNS,u'animate'), + (ANIMNS,u'animateColor'), + (ANIMNS,u'animateMotion'), + (ANIMNS,u'animateTransform'), + (ANIMNS,u'audio'), + (ANIMNS,u'param'), + (ANIMNS,u'set'), + (ANIMNS,u'transitionFilter'), + (CHARTNS,u'categories'), + (CHARTNS,u'data-point'), + (CHARTNS,u'domain'), + (CHARTNS,u'error-indicator'), + (CHARTNS,u'floor'), + (CHARTNS,u'grid'), + (CHARTNS,u'legend'), + (CHARTNS,u'mean-value'), + (CHARTNS,u'regression-curve'), + (CHARTNS,u'stock-gain-marker'), + (CHARTNS,u'stock-loss-marker'), + (CHARTNS,u'stock-range-line'), + (CHARTNS,u'symbol-image'), + (CHARTNS,u'wall'), + (DR3DNS,u'cube'), + (DR3DNS,u'extrude'), + (DR3DNS,u'light'), + (DR3DNS,u'rotate'), + (DR3DNS,u'sphere'), + (DRAWNS,u'contour-path'), + (DRAWNS,u'contour-polygon'), + (DRAWNS,u'equation'), + (DRAWNS,u'fill-image'), + (DRAWNS,u'floating-frame'), + (DRAWNS,u'glue-point'), + (DRAWNS,u'gradient'), + (DRAWNS,u'handle'), + (DRAWNS,u'hatch'), + (DRAWNS,u'layer'), + (DRAWNS,u'marker'), + (DRAWNS,u'opacity'), + (DRAWNS,u'page-thumbnail'), + (DRAWNS,u'param'), + (DRAWNS,u'stroke-dash'), + (FORMNS,u'connection-resource'), + (FORMNS,u'list-value'), + (FORMNS,u'property'), + (MANIFESTNS,u'algorithm'), + (MANIFESTNS,u'key-derivation'), + (METANS,u'auto-reload'), + (METANS,u'document-statistic'), + (METANS,u'hyperlink-behaviour'), + (METANS,u'template'), + (NUMBERNS,u'am-pm'), + (NUMBERNS,u'boolean'), + (NUMBERNS,u'day'), + (NUMBERNS,u'day-of-week'), + (NUMBERNS,u'era'), + (NUMBERNS,u'fraction'), + (NUMBERNS,u'hours'), + (NUMBERNS,u'minutes'), + (NUMBERNS,u'month'), + (NUMBERNS,u'quarter'), + (NUMBERNS,u'scientific-number'), + (NUMBERNS,u'seconds'), + (NUMBERNS,u'text-content'), + (NUMBERNS,u'week-of-year'), + (NUMBERNS,u'year'), + (OFFICENS,u'dde-source'), + (PRESENTATIONNS,u'date-time'), + (PRESENTATIONNS,u'footer'), + (PRESENTATIONNS,u'header'), + (PRESENTATIONNS,u'placeholder'), + (PRESENTATIONNS,u'play'), + (PRESENTATIONNS,u'show'), + (PRESENTATIONNS,u'sound'), + (SCRIPTNS,u'event-listener'), + (STYLENS,u'column'), + (STYLENS,u'column-sep'), + (STYLENS,u'drop-cap'), + (STYLENS,u'footnote-sep'), + (STYLENS,u'list-level-properties'), + (STYLENS,u'map'), + (STYLENS,u'ruby-properties'), + (STYLENS,u'table-column-properties'), + (STYLENS,u'tab-stop'), + (STYLENS,u'text-properties'), + (SVGNS,u'definition-src'), + (SVGNS,u'font-face-format'), + (SVGNS,u'font-face-name'), + (SVGNS,u'stop'), + (TABLENS,u'body'), + (TABLENS,u'cell-address'), + (TABLENS,u'cell-range-source'), + (TABLENS,u'change-deletion'), + (TABLENS,u'consolidation'), + (TABLENS,u'database-source-query'), + (TABLENS,u'database-source-sql'), + (TABLENS,u'database-source-table'), + (TABLENS,u'data-pilot-display-info'), + (TABLENS,u'data-pilot-field-reference'), + (TABLENS,u'data-pilot-group-member'), + (TABLENS,u'data-pilot-layout-info'), + (TABLENS,u'data-pilot-member'), + (TABLENS,u'data-pilot-sort-info'), + (TABLENS,u'data-pilot-subtotal'), + (TABLENS,u'dependency'), + (TABLENS,u'error-macro'), + (TABLENS,u'even-columns'), + (TABLENS,u'even-rows'), + (TABLENS,u'filter-condition'), + (TABLENS,u'first-column'), + (TABLENS,u'first-row'), + (TABLENS,u'highlighted-range'), + (TABLENS,u'insertion-cut-off'), + (TABLENS,u'iteration'), + (TABLENS,u'label-range'), + (TABLENS,u'last-column'), + (TABLENS,u'last-row'), + (TABLENS,u'movement-cut-off'), + (TABLENS,u'named-expression'), + (TABLENS,u'named-range'), + (TABLENS,u'null-date'), + (TABLENS,u'odd-columns'), + (TABLENS,u'odd-rows'), + (TABLENS,u'operation'), + (TABLENS,u'scenario'), + (TABLENS,u'sort-by'), + (TABLENS,u'sort-groups'), + (TABLENS,u'source-range-address'), + (TABLENS,u'source-service'), + (TABLENS,u'subtotal-field'), + (TABLENS,u'table-column'), + (TABLENS,u'table-source'), + (TABLENS,u'target-range-address'), + (TEXTNS,u'alphabetical-index-auto-mark-file'), + (TEXTNS,u'alphabetical-index-mark'), + (TEXTNS,u'alphabetical-index-mark-end'), + (TEXTNS,u'alphabetical-index-mark-start'), + (TEXTNS,u'bookmark'), + (TEXTNS,u'bookmark-end'), + (TEXTNS,u'bookmark-start'), + (TEXTNS,u'change'), + (TEXTNS,u'change-end'), + (TEXTNS,u'change-start'), + (TEXTNS,u'dde-connection-decl'), + (TEXTNS,u'index-entry-bibliography'), + (TEXTNS,u'index-entry-chapter'), + (TEXTNS,u'index-entry-link-end'), + (TEXTNS,u'index-entry-link-start'), + (TEXTNS,u'index-entry-page-number'), + (TEXTNS,u'index-entry-tab-stop'), + (TEXTNS,u'index-entry-text'), + (TEXTNS,u'index-source-style'), + (TEXTNS,u'line-break'), + (TEXTNS,u'page'), + (TEXTNS,u'reference-mark'), + (TEXTNS,u'reference-mark-end'), + (TEXTNS,u'reference-mark-start'), + (TEXTNS,u's'), + (TEXTNS,u'section-source'), + (TEXTNS,u'sequence-decl'), + (TEXTNS,u'soft-page-break'), + (TEXTNS,u'sort-key'), + (TEXTNS,u'tab'), + (TEXTNS,u'toc-mark'), + (TEXTNS,u'toc-mark-end'), + (TEXTNS,u'toc-mark-start'), + (TEXTNS,u'user-field-decl'), + (TEXTNS,u'user-index-mark'), + (TEXTNS,u'user-index-mark-end'), + (TEXTNS,u'user-index-mark-start'), + (TEXTNS,u'variable-decl') +) diff --git a/tablib/packages/odf/form.py b/tablib/packages/odf/form.py new file mode 100644 index 0000000..7969b84 --- /dev/null +++ b/tablib/packages/odf/form.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from namespaces import FORMNS +from element import Element + + +# Autogenerated +def Button(**args): + return Element(qname = (FORMNS,'button'), **args) + +def Checkbox(**args): + return Element(qname = (FORMNS,'checkbox'), **args) + +def Column(**args): + return Element(qname = (FORMNS,'column'), **args) + +def Combobox(**args): + return Element(qname = (FORMNS,'combobox'), **args) + +def ConnectionResource(**args): + return Element(qname = (FORMNS,'connection-resource'), **args) + +def Date(**args): + return Element(qname = (FORMNS,'date'), **args) + +def File(**args): + return Element(qname = (FORMNS,'file'), **args) + +def FixedText(**args): + return Element(qname = (FORMNS,'fixed-text'), **args) + +def Form(**args): + return Element(qname = (FORMNS,'form'), **args) + +def FormattedText(**args): + return Element(qname = (FORMNS,'formatted-text'), **args) + +def Frame(**args): + return Element(qname = (FORMNS,'frame'), **args) + +def GenericControl(**args): + return Element(qname = (FORMNS,'generic-control'), **args) + +def Grid(**args): + return Element(qname = (FORMNS,'grid'), **args) + +def Hidden(**args): + return Element(qname = (FORMNS,'hidden'), **args) + +def Image(**args): + return Element(qname = (FORMNS,'image'), **args) + +def ImageFrame(**args): + return Element(qname = (FORMNS,'image-frame'), **args) + +def Item(**args): + return Element(qname = (FORMNS,'item'), **args) + +def ListProperty(**args): + return Element(qname = (FORMNS,'list-property'), **args) + +def ListValue(**args): + return Element(qname = (FORMNS,'list-value'), **args) + +def Listbox(**args): + return Element(qname = (FORMNS,'listbox'), **args) + +def Number(**args): + return Element(qname = (FORMNS,'number'), **args) + +def Option(**args): + return Element(qname = (FORMNS,'option'), **args) + +def Password(**args): + return Element(qname = (FORMNS,'password'), **args) + +def Properties(**args): + return Element(qname = (FORMNS,'properties'), **args) + +def Property(**args): + return Element(qname = (FORMNS,'property'), **args) + +def Radio(**args): + return Element(qname = (FORMNS,'radio'), **args) + +def Text(**args): + return Element(qname = (FORMNS,'text'), **args) + +def Textarea(**args): + return Element(qname = (FORMNS,'textarea'), **args) + +def Time(**args): + return Element(qname = (FORMNS,'time'), **args) + +def ValueRange(**args): + return Element(qname = (FORMNS,'value-range'), **args) + diff --git a/tablib/packages/odf/grammar.py b/tablib/packages/odf/grammar.py new file mode 100644 index 0000000..d5d8d59 --- /dev/null +++ b/tablib/packages/odf/grammar.py @@ -0,0 +1,8426 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2010 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +__doc__=""" In principle the OpenDocument schema converted to python structures. +Currently it contains the legal child elements of a given element. +To be used for validation check in the API +""" + +from namespaces import * + +# The following code is generated from the RelaxNG schema with this notice: + +# OASIS OpenDocument v1.1 +# OASIS Standard, 1 Feb 2007 +# Relax-NG Schema + +# $Id$ + +# © 2002-2007 OASIS Open +# © 1999-2007 Sun Microsystems, Inc. + +# This document and translations of it may be copied and furnished +# to others, and derivative works that comment on or otherwise explain +# it or assist in its implementation may be prepared, copied, +# published and distributed, in whole or in part, without restriction +# of any kind, provided that the above copyright notice and this +# paragraph are included on all such copies and derivative works. +# However, this document itself does not be modified in any way, such +# as by removing the copyright notice or references to OASIS, except +# as needed for the purpose of developing OASIS specifications, in +# which case the procedures for copyrights defined in the OASIS +# Intellectual Property Rights document must be followed, or as +# required to translate it into languages other than English. +# + +allowed_children = { + (DCNS,u'creator') : ( + ), + (DCNS,u'date') : ( + ), + (DCNS,u'description') : ( + ), + (DCNS,u'language') : ( + ), + (DCNS,u'subject') : ( + ), + (DCNS,u'title') : ( + ), +# Completes Dublin Core start +# (DCNS,'contributor') : ( +# ), +# (DCNS,'coverage') : ( +# ), +# (DCNS,'format') : ( +# ), +# (DCNS,'identifier') : ( +# ), +# (DCNS,'publisher') : ( +# ), +# (DCNS,'relation') : ( +# ), +# (DCNS,'rights') : ( +# ), +# (DCNS,'source') : ( +# ), +# (DCNS,'type') : ( +# ), +# Completes Dublin Core end + (MATHNS,u'math') : None, + + (XFORMSNS,u'model') : None, + + (ANIMNS,u'animate') : ( + ), + (ANIMNS,u'animateColor') : ( + ), + (ANIMNS,u'animateMotion') : ( + ), + (ANIMNS,u'animateTransform') : ( + ), + (ANIMNS,u'audio') : ( + ), + (ANIMNS,u'command') : ( + (ANIMNS,u'param'), + ), +# allowed_children + (ANIMNS,u'iterate') : ( + (ANIMNS,u'animate'), + (ANIMNS,u'animateColor'), + (ANIMNS,u'animateMotion'), + (ANIMNS,u'animateTransform'), + (ANIMNS,u'audio'), + (ANIMNS,u'command'), + (ANIMNS,u'iterate'), + (ANIMNS,u'par'), + (ANIMNS,u'seq'), + (ANIMNS,u'set'), + (ANIMNS,u'transitionFilter'), + ), + (ANIMNS,u'par') : ( + (ANIMNS,u'animate'), + (ANIMNS,u'animateColor'), + (ANIMNS,u'animateMotion'), + (ANIMNS,u'animateTransform'), + (ANIMNS,u'audio'), + (ANIMNS,u'command'), + (ANIMNS,u'iterate'), + (ANIMNS,u'par'), + (ANIMNS,u'seq'), + (ANIMNS,u'set'), + (ANIMNS,u'transitionFilter'), + ), +# allowed_children + (ANIMNS,u'param') : ( + ), + (ANIMNS,u'seq') : ( + (ANIMNS,u'animate'), + (ANIMNS,u'animateColor'), + (ANIMNS,u'animateMotion'), + (ANIMNS,u'animateTransform'), + (ANIMNS,u'audio'), + (ANIMNS,u'command'), + (ANIMNS,u'iterate'), + (ANIMNS,u'par'), + (ANIMNS,u'seq'), + (ANIMNS,u'set'), + (ANIMNS,u'transitionFilter'), + ), + (ANIMNS,u'set') : ( + ), + (ANIMNS,u'transitionFilter') : ( + ), + (CHARTNS,u'axis') : ( + (CHARTNS,u'categories'), + (CHARTNS,u'grid'), + (CHARTNS,u'title'), + ), +# allowed_children + (CHARTNS,u'categories') : ( + ), + (CHARTNS,u'chart') : ( + (CHARTNS,u'footer'), + (CHARTNS,u'legend'), + (CHARTNS,u'plot-area'), + (CHARTNS,u'subtitle'), + (CHARTNS,u'title'), + (TABLENS,u'table'), + ), + (CHARTNS,u'data-point') : ( + ), + (CHARTNS,u'domain') : ( + ), + (CHARTNS,u'error-indicator') : ( + ), + (CHARTNS,u'floor') : ( + ), + (CHARTNS,u'footer') : ( + (TEXTNS,u'p'), + ), + (CHARTNS,u'grid') : ( + ), + (CHARTNS,u'legend') : ( + ), +# allowed_children + (CHARTNS,u'mean-value') : ( + ), + (CHARTNS,u'plot-area') : ( + (CHARTNS,u'axis'), + (CHARTNS,u'floor'), + (CHARTNS,u'series'), + (CHARTNS,u'stock-gain-marker'), + (CHARTNS,u'stock-loss-marker'), + (CHARTNS,u'stock-range-line'), + (CHARTNS,u'wall'), + (DR3DNS,u'light'), + ), + (CHARTNS,u'regression-curve') : ( + ), + (CHARTNS,u'series') : ( + (CHARTNS,u'data-point'), + (CHARTNS,u'domain'), + (CHARTNS,u'error-indicator'), + (CHARTNS,u'mean-value'), + (CHARTNS,u'regression-curve'), + ), + (CHARTNS,u'stock-gain-marker') : ( + ), + (CHARTNS,u'stock-loss-marker') : ( + ), +# allowed_children + (CHARTNS,u'stock-range-line') : ( + ), + (CHARTNS,u'subtitle') : ( + (TEXTNS,u'p'), + ), + (CHARTNS,u'symbol-image') : ( + ), + (CHARTNS,u'title') : ( + (TEXTNS,u'p'), + ), + (CHARTNS,u'wall') : ( + ), + (CONFIGNS,u'config-item') : ( + ), + (CONFIGNS,u'config-item-map-entry') : ( + (CONFIGNS,u'config-item'), + (CONFIGNS,u'config-item-map-indexed'), + (CONFIGNS,u'config-item-map-named'), + (CONFIGNS,u'config-item-set'), + ), + (CONFIGNS,u'config-item-map-indexed') : ( + (CONFIGNS,u'config-item-map-entry'), + ), + (CONFIGNS,u'config-item-map-named') : ( + (CONFIGNS,u'config-item-map-entry'), + ), +# allowed_children + (CONFIGNS,u'config-item-set') : ( + (CONFIGNS,u'config-item'), + (CONFIGNS,u'config-item-map-indexed'), + (CONFIGNS,u'config-item-map-named'), + (CONFIGNS,u'config-item-set'), + ), + (MANIFESTNS,u'algorithm') : ( + ), + (MANIFESTNS,u'encryption-data') : ( + (MANIFESTNS,u'algorithm'), + (MANIFESTNS,u'key-derivation'), + ), + (MANIFESTNS,u'file-entry') : ( + (MANIFESTNS,u'encryption-data'), + ), + (MANIFESTNS,u'key-derivation') : ( + ), + (MANIFESTNS,u'manifest') : ( + (MANIFESTNS,u'file-entry'), + ), + (NUMBERNS,u'am-pm') : ( + ), + (NUMBERNS,u'boolean') : ( + ), +# allowed_children + (NUMBERNS,u'boolean-style') : ( + (NUMBERNS,u'boolean'), + (NUMBERNS,u'text'), + (STYLENS,u'map'), + (STYLENS,u'text-properties'), + ), + (NUMBERNS,u'currency-style') : ( + (NUMBERNS,u'currency-symbol'), + (NUMBERNS,u'number'), + (NUMBERNS,u'text'), + (STYLENS,u'map'), + (STYLENS,u'text-properties'), + ), + (NUMBERNS,u'currency-symbol') : ( + ), + (NUMBERNS,u'date-style') : ( + (NUMBERNS,u'am-pm'), + (NUMBERNS,u'day'), + (NUMBERNS,u'day-of-week'), + (NUMBERNS,u'era'), + (NUMBERNS,u'hours'), + (NUMBERNS,u'minutes'), + (NUMBERNS,u'month'), + (NUMBERNS,u'quarter'), + (NUMBERNS,u'seconds'), + (NUMBERNS,u'text'), + (NUMBERNS,u'week-of-year'), + (NUMBERNS,u'year'), + (STYLENS,u'map'), + (STYLENS,u'text-properties'), + ), +# allowed_children + (NUMBERNS,u'day') : ( + ), + (NUMBERNS,u'day-of-week') : ( + ), + (NUMBERNS,u'embedded-text') : ( + ), + (NUMBERNS,u'era') : ( + ), + (NUMBERNS,u'fraction') : ( + ), + (NUMBERNS,u'hours') : ( + ), + (NUMBERNS,u'minutes') : ( + ), + (NUMBERNS,u'month') : ( + ), + (NUMBERNS,u'number') : ( + (NUMBERNS,u'embedded-text'), + ), + (NUMBERNS,u'number-style') : ( + (NUMBERNS,u'fraction'), + (NUMBERNS,u'number'), + (NUMBERNS,u'scientific-number'), + (NUMBERNS,u'text'), + (STYLENS,u'map'), + (STYLENS,u'text-properties'), + ), +# allowed_children + (NUMBERNS,u'percentage-style') : ( + (NUMBERNS,u'number'), + (NUMBERNS,u'text'), + (STYLENS,u'map'), + (STYLENS,u'text-properties'), + ), + (NUMBERNS,u'quarter') : ( + ), + (NUMBERNS,u'scientific-number') : ( + ), + (NUMBERNS,u'seconds') : ( + ), + (NUMBERNS,u'text') : ( + ), + (NUMBERNS,u'text-content') : ( + ), + (NUMBERNS,u'text-style') : ( + (NUMBERNS,u'text'), + (NUMBERNS,u'text-content'), + (STYLENS,u'map'), + (STYLENS,u'text-properties'), + ), +# allowed_children + (NUMBERNS,u'time-style') : ( + (NUMBERNS,u'am-pm'), + (NUMBERNS,u'hours'), + (NUMBERNS,u'minutes'), + (NUMBERNS,u'seconds'), + (NUMBERNS,u'text'), + (STYLENS,u'map'), + (STYLENS,u'text-properties'), + ), +# allowed_children + (NUMBERNS,u'week-of-year') : ( + ), + (NUMBERNS,u'year') : ( + ), + (DR3DNS,u'cube') : ( + ), + (DR3DNS,u'extrude') : ( + ), + (DR3DNS,u'light') : ( + ), + (DR3DNS,u'rotate') : ( + ), + (DR3DNS,u'scene') : ( + (DR3DNS,u'cube'), + (DR3DNS,u'extrude'), + (DR3DNS,u'light'), + (DR3DNS,u'rotate'), + (DR3DNS,u'scene'), + (DR3DNS,u'sphere'), + (SVGNS,u'title'), + (SVGNS,u'desc'), + ), + (DR3DNS,u'sphere') : ( + ), + (DRAWNS,u'a') : ( + (DRAWNS,u'frame'), + ), +# allowed_children + (DRAWNS,u'applet') : ( + (DRAWNS,u'param'), + ), + (DRAWNS,u'area-circle') : ( + (OFFICENS,u'event-listeners'), + (SVGNS,u'desc'), + (SVGNS,u'title'), + ), + (DRAWNS,u'area-polygon') : ( + (OFFICENS,u'event-listeners'), + (SVGNS,u'desc'), + (SVGNS,u'title'), + ), + (DRAWNS,u'area-rectangle') : ( + (OFFICENS,u'event-listeners'), + (SVGNS,u'desc'), + (SVGNS,u'title'), + ), + (DRAWNS,u'caption') : ( + (DRAWNS,u'glue-point'), + (OFFICENS,u'event-listeners'), + (SVGNS,u'desc'), + (SVGNS,u'title'), + (TEXTNS,u'list'), + (TEXTNS,u'p'), + ), + (DRAWNS,u'circle') : ( + (DRAWNS,u'glue-point'), + (OFFICENS,u'event-listeners'), + (SVGNS,u'desc'), + (SVGNS,u'title'), + (TEXTNS,u'list'), + (TEXTNS,u'p'), + ), +# allowed_children + (DRAWNS,u'connector') : ( + (DRAWNS,u'glue-point'), + (OFFICENS,u'event-listeners'), + (SVGNS,u'desc'), + (SVGNS,u'title'), + (TEXTNS,u'list'), + (TEXTNS,u'p'), + ), + (DRAWNS,u'contour-path') : ( + ), + (DRAWNS,u'contour-polygon') : ( + ), + (DRAWNS,u'control') : ( + (DRAWNS,u'glue-point'), + (SVGNS,u'desc'), + (SVGNS,u'title'), + ), + (DRAWNS,u'custom-shape') : ( + (DRAWNS,u'enhanced-geometry'), + (DRAWNS,u'glue-point'), + (OFFICENS,u'event-listeners'), + (SVGNS,u'desc'), + (SVGNS,u'title'), + (TEXTNS,u'list'), + (TEXTNS,u'p'), + ), +# allowed_children + (DRAWNS,u'ellipse') : ( + (DRAWNS,u'glue-point'), + (OFFICENS,u'event-listeners'), + (SVGNS,u'desc'), + (SVGNS,u'title'), + (TEXTNS,u'list'), + (TEXTNS,u'p'), + ), + (DRAWNS,u'enhanced-geometry') : ( + (DRAWNS,u'equation'), + (DRAWNS,u'handle'), + ), + (DRAWNS,u'equation') : ( + ), +# allowed_children + (DRAWNS,u'fill-image') : ( + ), + (DRAWNS,u'floating-frame') : ( + ), + (DRAWNS,u'frame') : ( + (DRAWNS,u'applet'), + (DRAWNS,u'contour-path'), + (DRAWNS,u'contour-polygon'), + (DRAWNS,u'floating-frame'), + (DRAWNS,u'glue-point'), + (DRAWNS,u'image'), + (DRAWNS,u'image-map'), + (DRAWNS,u'object'), + (DRAWNS,u'object-ole'), + (DRAWNS,u'plugin'), + (DRAWNS,u'text-box'), + (OFFICENS,u'event-listeners'), + (SVGNS,u'desc'), + (SVGNS,u'title'), + ), +# allowed_children + (DRAWNS,u'g') : ( + (DR3DNS,u'scene'), + (DRAWNS,u'caption'), + (DRAWNS,u'circle'), + (DRAWNS,u'connector'), + (DRAWNS,u'control'), + (DRAWNS,u'custom-shape'), + (DRAWNS,u'ellipse'), + (DRAWNS,u'frame'), + (DRAWNS,u'g'), + (DRAWNS,u'glue-point'), + (DRAWNS,u'line'), + (DRAWNS,u'measure'), + (DRAWNS,u'page-thumbnail'), + (DRAWNS,u'path'), + (DRAWNS,u'polygon'), + (DRAWNS,u'polyline'), + (DRAWNS,u'rect'), + (DRAWNS,u'regular-polygon'), + (SVGNS,u'desc'), + (SVGNS,u'title'), + (OFFICENS,u'event-listeners'), + ), + (DRAWNS,u'glue-point') : ( + ), + (DRAWNS,u'gradient') : ( + ), + (DRAWNS,u'handle') : ( + ), + (DRAWNS,u'hatch') : ( + ), +# allowed_children + (DRAWNS,u'image') : ( + (OFFICENS,u'binary-data'), + (TEXTNS,u'list'), + (TEXTNS,u'p'), + ), + (DRAWNS,u'image-map') : ( + (DRAWNS,u'area-circle'), + (DRAWNS,u'area-polygon'), + (DRAWNS,u'area-rectangle'), + ), + (DRAWNS,u'layer') : ( + (SVGNS,u'desc'), + (SVGNS,u'title'), + ), + (DRAWNS,u'layer-set') : ( + (DRAWNS,u'layer'), + ), + (DRAWNS,u'line') : ( + (DRAWNS,u'glue-point'), + (OFFICENS,u'event-listeners'), + (SVGNS,u'desc'), + (SVGNS,u'title'), + (TEXTNS,u'list'), + (TEXTNS,u'p'), + ), + (DRAWNS,u'marker') : ( + ), + (DRAWNS,u'measure') : ( + (DRAWNS,u'glue-point'), + (OFFICENS,u'event-listeners'), + (TEXTNS,u'list'), + (TEXTNS,u'p'), + (SVGNS,u'title'), + (SVGNS,u'desc'), + ), + (DRAWNS,u'object') : ( + (MATHNS,u'math'), + (OFFICENS,u'document'), + ), +# allowed_children + (DRAWNS,u'object-ole') : ( + (OFFICENS,u'binary-data'), + ), + (DRAWNS,u'opacity') : ( + ), + (DRAWNS,u'page') : ( + (ANIMNS,u'animate'), + (ANIMNS,u'animateColor'), + (ANIMNS,u'animateMotion'), + (ANIMNS,u'animateTransform'), + (ANIMNS,u'audio'), + (ANIMNS,u'command'), + (ANIMNS,u'iterate'), + (ANIMNS,u'par'), + (ANIMNS,u'seq'), + (ANIMNS,u'set'), + (ANIMNS,u'transitionFilter'), + (DR3DNS,u'scene'), + (DRAWNS,u'caption'), + (DRAWNS,u'circle'), + (DRAWNS,u'connector'), + (DRAWNS,u'control'), + (DRAWNS,u'custom-shape'), + (DRAWNS,u'ellipse'), + (DRAWNS,u'frame'), + (DRAWNS,u'g'), + (DRAWNS,u'line'), + (DRAWNS,u'measure'), + (DRAWNS,u'page-thumbnail'), + (DRAWNS,u'path'), + (DRAWNS,u'polygon'), + (DRAWNS,u'polyline'), + (DRAWNS,u'rect'), + (DRAWNS,u'regular-polygon'), + (OFFICENS,u'forms'), + (PRESENTATIONNS,u'animations'), + (PRESENTATIONNS,u'notes'), + ), +# allowed_children + (DRAWNS,u'page-thumbnail') : ( + (SVGNS,u'desc'), + (SVGNS,u'title'), + ), + (DRAWNS,u'param') : ( + ), + (DRAWNS,u'path') : ( + (DRAWNS,u'glue-point'), + (OFFICENS,u'event-listeners'), + (SVGNS,u'desc'), + (SVGNS,u'title'), + (TEXTNS,u'list'), + (TEXTNS,u'p'), + ), + (DRAWNS,u'plugin') : ( + (DRAWNS,u'param'), + ), + (DRAWNS,u'polygon') : ( + (DRAWNS,u'glue-point'), + (OFFICENS,u'event-listeners'), + (SVGNS,u'title'), + (SVGNS,u'desc'), + (TEXTNS,u'list'), + (TEXTNS,u'p'), + ), + (DRAWNS,u'polyline') : ( + (DRAWNS,u'glue-point'), + (OFFICENS,u'event-listeners'), + (SVGNS,u'desc'), + (SVGNS,u'title'), + (TEXTNS,u'list'), + (TEXTNS,u'p'), + ), +# allowed_children + (DRAWNS,u'rect') : ( + (DRAWNS,u'glue-point'), + (OFFICENS,u'event-listeners'), + (SVGNS,u'desc'), + (SVGNS,u'title'), + (TEXTNS,u'list'), + (TEXTNS,u'p'), + ), + (DRAWNS,u'regular-polygon') : ( + (DRAWNS,u'glue-point'), + (OFFICENS,u'event-listeners'), + (SVGNS,u'desc'), + (SVGNS,u'title'), + (TEXTNS,u'list'), + (TEXTNS,u'p'), + ), + (DRAWNS,u'stroke-dash') : ( + ), + (DRAWNS,u'text-box') : ( + (DR3DNS,u'scene'), + (DRAWNS,u'a'), + (DRAWNS,u'caption'), + (DRAWNS,u'circle'), + (DRAWNS,u'connector'), + (DRAWNS,u'control'), + (DRAWNS,u'custom-shape'), + (DRAWNS,u'ellipse'), + (DRAWNS,u'frame'), + (DRAWNS,u'g'), + (DRAWNS,u'line'), + (DRAWNS,u'measure'), + (DRAWNS,u'page-thumbnail'), + (DRAWNS,u'path'), + (DRAWNS,u'polygon'), + (DRAWNS,u'polyline'), + (DRAWNS,u'rect'), + (DRAWNS,u'regular-polygon'), + (TABLENS,u'table'), + (TEXTNS,u'alphabetical-index'), + (TEXTNS,u'bibliography'), + (TEXTNS,u'change'), + (TEXTNS,u'change-end'), + (TEXTNS,u'change-start'), + (TEXTNS,u'h'), + (TEXTNS,u'illustration-index'), + (TEXTNS,u'list'), + (TEXTNS,u'numbered-paragraph'), + (TEXTNS,u'object-index'), + (TEXTNS,u'p'), + (TEXTNS,u'section'), + (TEXTNS,u'soft-page-break'), + (TEXTNS,u'table-index'), + (TEXTNS,u'table-of-content'), + (TEXTNS,u'user-index'), + ), +# allowed_children + (FORMNS,u'button') : ( + (FORMNS,u'properties'), + (OFFICENS,u'event-listeners'), + ), + (FORMNS,u'checkbox') : ( + (FORMNS,u'properties'), + (OFFICENS,u'event-listeners'), + ), + (FORMNS,u'column') : ( + (FORMNS,u'checkbox'), + (FORMNS,u'combobox'), + (FORMNS,u'date'), + (FORMNS,u'formatted-text'), + (FORMNS,u'listbox'), + (FORMNS,u'number'), + (FORMNS,u'text'), + (FORMNS,u'textarea'), + ), + (FORMNS,u'combobox') : ( + (FORMNS,u'item'), + (FORMNS,u'properties'), + (OFFICENS,u'event-listeners'), + ), + (FORMNS,u'connection-resource') : ( + ), + (FORMNS,u'date') : ( + (FORMNS,u'properties'), + (OFFICENS,u'event-listeners'), + ), + (FORMNS,u'file') : ( + (FORMNS,u'properties'), + (OFFICENS,u'event-listeners'), + ), + (FORMNS,u'fixed-text') : ( + (FORMNS,u'properties'), + (OFFICENS,u'event-listeners'), + ), +# allowed_children + (FORMNS,u'form') : ( + (FORMNS,u'button'), + (FORMNS,u'checkbox'), + (FORMNS,u'combobox'), + (FORMNS,u'connection-resource'), + (FORMNS,u'date'), + (FORMNS,u'file'), + (FORMNS,u'fixed-text'), + (FORMNS,u'form'), + (FORMNS,u'formatted-text'), + (FORMNS,u'frame'), + (FORMNS,u'generic-control'), + (FORMNS,u'grid'), + (FORMNS,u'hidden'), + (FORMNS,u'image'), + (FORMNS,u'image-frame'), + (FORMNS,u'listbox'), + (FORMNS,u'number'), + (FORMNS,u'password'), + (FORMNS,u'properties'), + (FORMNS,u'radio'), + (FORMNS,u'text'), + (FORMNS,u'textarea'), + (FORMNS,u'time'), + (FORMNS,u'value-range'), + (OFFICENS,u'event-listeners'), + ), + (FORMNS,u'formatted-text') : ( + (FORMNS,u'properties'), + (OFFICENS,u'event-listeners'), + ), + (FORMNS,u'frame') : ( + (FORMNS,u'properties'), + (OFFICENS,u'event-listeners'), + ), + (FORMNS,u'generic-control') : ( + (FORMNS,u'properties'), + (OFFICENS,u'event-listeners'), + ), + (FORMNS,u'grid') : ( + (FORMNS,u'column'), + (FORMNS,u'properties'), + (OFFICENS,u'event-listeners'), + ), + (FORMNS,u'hidden') : ( + (FORMNS,u'properties'), + (OFFICENS,u'event-listeners'), + ), + (FORMNS,u'image') : ( + (FORMNS,u'properties'), + (OFFICENS,u'event-listeners'), + ), +# allowed_children + (FORMNS,u'image-frame') : ( + (FORMNS,u'properties'), + (OFFICENS,u'event-listeners'), + ), + (FORMNS,u'item') : ( + ), + (FORMNS,u'list-property') : ( + (FORMNS,u'list-value'), + (FORMNS,u'list-value'), + (FORMNS,u'list-value'), + (FORMNS,u'list-value'), + (FORMNS,u'list-value'), + (FORMNS,u'list-value'), + (FORMNS,u'list-value'), + ), + (FORMNS,u'list-value') : ( + ), + (FORMNS,u'listbox') : ( + (FORMNS,u'option'), + (FORMNS,u'properties'), + (OFFICENS,u'event-listeners'), + ), + (FORMNS,u'number') : ( + (FORMNS,u'properties'), + (OFFICENS,u'event-listeners'), + ), + (FORMNS,u'option') : ( + ), + (FORMNS,u'password') : ( + (FORMNS,u'properties'), + (OFFICENS,u'event-listeners'), + ), + (FORMNS,u'properties') : ( + (FORMNS,u'list-property'), + (FORMNS,u'property'), + ), + (FORMNS,u'property') : ( + ), + (FORMNS,u'radio') : ( + (FORMNS,u'properties'), + (OFFICENS,u'event-listeners'), + ), + (FORMNS,u'text') : ( + (FORMNS,u'properties'), + (OFFICENS,u'event-listeners'), + ), + (FORMNS,u'textarea') : ( + (FORMNS,u'properties'), + (OFFICENS,u'event-listeners'), + (TEXTNS,u'p'), + ), + (FORMNS,u'time') : ( + (FORMNS,u'properties'), + (OFFICENS,u'event-listeners'), + ), + (FORMNS,u'value-range') : ( + (FORMNS,u'properties'), + (OFFICENS,u'event-listeners'), + ), + (METANS,u'auto-reload') : ( + ), + (METANS,u'creation-date') : ( + ), + (METANS,u'date-string') : ( + ), + (METANS,u'document-statistic') : ( + ), + (METANS,u'editing-cycles') : ( + ), + (METANS,u'editing-duration') : ( + ), + (METANS,u'generator') : ( + ), + (METANS,u'hyperlink-behaviour') : ( + ), + (METANS,u'initial-creator') : ( + ), + (METANS,u'keyword') : ( + ), + (METANS,u'print-date') : ( + ), + (METANS,u'printed-by') : ( + ), + (METANS,u'template') : ( + ), + (METANS,u'user-defined') : ( + ), +# allowed_children + (OFFICENS,u'annotation') : ( + (DCNS,u'creator'), + (DCNS,u'date'), + (METANS,u'date-string'), + (TEXTNS,u'list'), + (TEXTNS,u'p'), + ), + (OFFICENS,u'automatic-styles') : ( + (NUMBERNS,u'boolean-style'), + (NUMBERNS,u'currency-style'), + (NUMBERNS,u'date-style'), + (NUMBERNS,u'number-style'), + (NUMBERNS,u'percentage-style'), + (NUMBERNS,u'text-style'), + (NUMBERNS,u'time-style'), + (STYLENS,u'page-layout'), + (STYLENS,u'style'), + (TEXTNS,u'list-style'), + ), + (OFFICENS,u'binary-data') : ( + ), + (OFFICENS,u'body') : ( + (OFFICENS,u'chart'), + (OFFICENS,u'drawing'), + (OFFICENS,u'image'), + (OFFICENS,u'presentation'), + (OFFICENS,u'spreadsheet'), + (OFFICENS,u'text'), + ), + (OFFICENS,u'change-info') : ( + (DCNS,u'creator'), + (DCNS,u'date'), + (TEXTNS,u'p'), + ), + (OFFICENS,u'chart') : ( + (CHARTNS,u'chart'), + (TABLENS,u'calculation-settings'), + (TABLENS,u'consolidation'), + (TABLENS,u'content-validations'), + (TABLENS,u'data-pilot-tables'), + (TABLENS,u'database-ranges'), + (TABLENS,u'dde-links'), + (TABLENS,u'label-ranges'), + (TABLENS,u'named-expressions'), + (TEXTNS,u'alphabetical-index-auto-mark-file'), + (TEXTNS,u'dde-connection-decls'), + (TEXTNS,u'sequence-decls'), + (TEXTNS,u'user-field-decls'), + (TEXTNS,u'variable-decls'), + ), + (OFFICENS,u'dde-source') : ( + ), + (OFFICENS,u'document') : ( + (OFFICENS,u'automatic-styles'), + (OFFICENS,u'body'), + (OFFICENS,u'font-face-decls'), + (OFFICENS,u'master-styles'), + (OFFICENS,u'meta'), + (OFFICENS,u'scripts'), + (OFFICENS,u'settings'), + (OFFICENS,u'styles'), + ), + (OFFICENS,u'document-content') : ( + (OFFICENS,u'automatic-styles'), + (OFFICENS,u'body'), + (OFFICENS,u'font-face-decls'), + (OFFICENS,u'scripts'), + ), + (OFFICENS,u'document-meta') : ( + (OFFICENS,u'meta'), + ), + (OFFICENS,u'document-settings') : ( + (OFFICENS,u'settings'), + ), + (OFFICENS,u'document-styles') : ( + (OFFICENS,u'automatic-styles'), + (OFFICENS,u'font-face-decls'), + (OFFICENS,u'master-styles'), + (OFFICENS,u'styles'), + ), + (OFFICENS,u'drawing') : ( + (DRAWNS,u'page'), + (TABLENS,u'calculation-settings'), + (TABLENS,u'consolidation'), + (TABLENS,u'content-validations'), + (TABLENS,u'data-pilot-tables'), + (TABLENS,u'database-ranges'), + (TABLENS,u'dde-links'), + (TABLENS,u'label-ranges'), + (TABLENS,u'named-expressions'), + (TEXTNS,u'alphabetical-index-auto-mark-file'), + (TEXTNS,u'dde-connection-decls'), + (TEXTNS,u'sequence-decls'), + (TEXTNS,u'user-field-decls'), + (TEXTNS,u'variable-decls'), + ), + (OFFICENS,u'event-listeners') : ( + (PRESENTATIONNS,u'event-listener'), + (SCRIPTNS,u'event-listener'), + ), + (OFFICENS,u'font-face-decls') : ( + (STYLENS,u'font-face'), + ), +# allowed_children + (OFFICENS,u'forms') : ( + (XFORMSNS,u'model'), + (FORMNS,u'form'), + ), + (OFFICENS,u'image') : ( + (DRAWNS,u'frame'), + ), + (OFFICENS,u'master-styles') : ( + (DRAWNS,u'layer-set'), + (STYLENS,u'handout-master'), + (STYLENS,u'master-page'), + (TABLENS,u'table-template'), + ), + (OFFICENS,u'meta') : ( + (DCNS,u'creator'), + (DCNS,u'date'), + (DCNS,u'description'), + (DCNS,u'language'), + (DCNS,u'subject'), + (DCNS,u'title'), +# Completes Dublin Core start +# (DCNS,'contributor'), +# (DCNS,'coverage'), +# (DCNS,'format'), +# (DCNS,'identifier'), +# (DCNS,'publisher'), +# (DCNS,'relation'), +# (DCNS,'rights'), +# (DCNS,'source'), +# (DCNS,'type'), +# Completes Dublin Core end + (METANS,u'auto-reload'), + (METANS,u'creation-date'), + (METANS,u'document-statistic'), + (METANS,u'editing-cycles'), + (METANS,u'editing-duration'), + (METANS,u'generator'), + (METANS,u'hyperlink-behaviour'), + (METANS,u'initial-creator'), + (METANS,u'keyword'), + (METANS,u'print-date'), + (METANS,u'printed-by'), + (METANS,u'template'), + (METANS,u'user-defined'), + ), + (OFFICENS,u'presentation') : ( + (DRAWNS,u'page'), + (PRESENTATIONNS,u'date-time-decl'), + (PRESENTATIONNS,u'footer-decl'), + (PRESENTATIONNS,u'header-decl'), + (PRESENTATIONNS,u'settings'), + (TABLENS,u'calculation-settings'), + (TABLENS,u'consolidation'), + (TABLENS,u'content-validations'), + (TABLENS,u'data-pilot-tables'), + (TABLENS,u'database-ranges'), + (TABLENS,u'dde-links'), + (TABLENS,u'label-ranges'), + (TABLENS,u'named-expressions'), + (TEXTNS,u'alphabetical-index-auto-mark-file'), + (TEXTNS,u'dde-connection-decls'), + (TEXTNS,u'sequence-decls'), + (TEXTNS,u'user-field-decls'), + (TEXTNS,u'variable-decls'), + ), +# allowed_children + (OFFICENS,u'script') : None, + + (OFFICENS,u'scripts') : ( + (OFFICENS,u'event-listeners'), + (OFFICENS,u'script'), + ), + (OFFICENS,u'settings') : ( + (CONFIGNS,u'config-item-set'), + ), + (OFFICENS,u'spreadsheet') : ( + (TABLENS,u'calculation-settings'), + (TABLENS,u'consolidation'), + (TABLENS,u'content-validations'), + (TABLENS,u'data-pilot-tables'), + (TABLENS,u'database-ranges'), + (TABLENS,u'dde-links'), + (TABLENS,u'label-ranges'), + (TABLENS,u'named-expressions'), + (TABLENS,u'table'), + (TABLENS,u'tracked-changes'), + (TEXTNS,u'alphabetical-index-auto-mark-file'), + (TEXTNS,u'dde-connection-decls'), + (TEXTNS,u'sequence-decls'), + (TEXTNS,u'user-field-decls'), + (TEXTNS,u'variable-decls'), + ), + (OFFICENS,u'styles') : ( + (NUMBERNS,u'boolean-style'), + (NUMBERNS,u'currency-style'), + (NUMBERNS,u'date-style'), + (NUMBERNS,u'number-style'), + (NUMBERNS,u'percentage-style'), + (NUMBERNS,u'text-style'), + (NUMBERNS,u'time-style'), + (DRAWNS,u'fill-image'), + (DRAWNS,u'gradient'), + (DRAWNS,u'hatch'), + (DRAWNS,u'marker'), + (DRAWNS,u'opacity'), + (DRAWNS,u'stroke-dash'), + (STYLENS,u'default-style'), + (STYLENS,u'presentation-page-layout'), + (STYLENS,u'style'), + (SVGNS,u'linearGradient'), + (SVGNS,u'radialGradient'), + (TEXTNS,u'bibliography-configuration'), + (TEXTNS,u'linenumbering-configuration'), + (TEXTNS,u'list-style'), + (TEXTNS,u'notes-configuration'), + (TEXTNS,u'outline-style'), + ), + (OFFICENS,u'text') : ( + (DR3DNS,u'scene'), + (DRAWNS,u'a'), + (DRAWNS,u'caption'), + (DRAWNS,u'circle'), + (DRAWNS,u'connector'), + (DRAWNS,u'control'), + (DRAWNS,u'custom-shape'), + (DRAWNS,u'ellipse'), + (DRAWNS,u'frame'), + (DRAWNS,u'g'), + (DRAWNS,u'line'), + (DRAWNS,u'measure'), + (DRAWNS,u'page-thumbnail'), + (DRAWNS,u'path'), + (DRAWNS,u'polygon'), + (DRAWNS,u'polyline'), + (DRAWNS,u'rect'), + (DRAWNS,u'regular-polygon'), + (OFFICENS,u'forms'), + (TABLENS,u'calculation-settings'), + (TABLENS,u'consolidation'), + (TABLENS,u'content-validations'), + (TABLENS,u'data-pilot-tables'), + (TABLENS,u'database-ranges'), + (TABLENS,u'dde-links'), + (TABLENS,u'label-ranges'), + (TABLENS,u'named-expressions'), + (TABLENS,u'table'), + (TEXTNS,u'alphabetical-index'), + (TEXTNS,u'alphabetical-index-auto-mark-file'), + (TEXTNS,u'bibliography'), + (TEXTNS,u'change'), + (TEXTNS,u'change-end'), + (TEXTNS,u'change-start'), + (TEXTNS,u'dde-connection-decls'), + (TEXTNS,u'h'), + (TEXTNS,u'illustration-index'), + (TEXTNS,u'list'), + (TEXTNS,u'numbered-paragraph'), + (TEXTNS,u'object-index'), + (TEXTNS,u'p'), + (TEXTNS,u'page-sequence'), + (TEXTNS,u'section'), + (TEXTNS,u'sequence-decls'), + (TEXTNS,u'soft-page-break'), + (TEXTNS,u'table-index'), + (TEXTNS,u'table-of-content'), + (TEXTNS,u'tracked-changes'), + (TEXTNS,u'user-field-decls'), + (TEXTNS,u'user-index'), + (TEXTNS,u'variable-decls'), + ), + (PRESENTATIONNS,u'animation-group') : ( + (PRESENTATIONNS,u'dim'), + (PRESENTATIONNS,u'hide-shape'), + (PRESENTATIONNS,u'hide-text'), + (PRESENTATIONNS,u'play'), + (PRESENTATIONNS,u'show-shape'), + (PRESENTATIONNS,u'show-text'), + ), + (PRESENTATIONNS,u'animations') : ( + (PRESENTATIONNS,u'animation-group'), + (PRESENTATIONNS,u'dim'), + (PRESENTATIONNS,u'hide-shape'), + (PRESENTATIONNS,u'hide-text'), + (PRESENTATIONNS,u'play'), + (PRESENTATIONNS,u'show-shape'), + (PRESENTATIONNS,u'show-text'), + ), + (PRESENTATIONNS,u'date-time') : ( + ), + (PRESENTATIONNS,u'date-time-decl') : ( + ), + (PRESENTATIONNS,u'dim') : ( + (PRESENTATIONNS,u'sound'), + ), + (PRESENTATIONNS,u'event-listener') : ( + (PRESENTATIONNS,u'sound'), + ), + (PRESENTATIONNS,u'footer') : ( + ), + (PRESENTATIONNS,u'footer-decl') : ( + ), + (PRESENTATIONNS,u'header') : ( + ), + (PRESENTATIONNS,u'header-decl') : ( + ), + (PRESENTATIONNS,u'hide-shape') : ( + (PRESENTATIONNS,u'sound'), + ), + (PRESENTATIONNS,u'hide-text') : ( + (PRESENTATIONNS,u'sound'), + ), +# allowed_children + (PRESENTATIONNS,u'notes') : ( + (DR3DNS,u'scene'), + (DRAWNS,u'caption'), + (DRAWNS,u'circle'), + (DRAWNS,u'connector'), + (DRAWNS,u'control'), + (DRAWNS,u'custom-shape'), + (DRAWNS,u'ellipse'), + (DRAWNS,u'frame'), + (DRAWNS,u'g'), + (DRAWNS,u'line'), + (DRAWNS,u'measure'), + (DRAWNS,u'page-thumbnail'), + (DRAWNS,u'path'), + (DRAWNS,u'polygon'), + (DRAWNS,u'polyline'), + (DRAWNS,u'rect'), + (DRAWNS,u'regular-polygon'), + (OFFICENS,u'forms'), + ), + (PRESENTATIONNS,u'placeholder') : ( + ), + (PRESENTATIONNS,u'play') : ( + ), + (PRESENTATIONNS,u'settings') : ( + (PRESENTATIONNS,u'show'), + ), + (PRESENTATIONNS,u'show') : ( + ), + (PRESENTATIONNS,u'show-shape') : ( + (PRESENTATIONNS,u'sound'), + ), + (PRESENTATIONNS,u'show-text') : ( + (PRESENTATIONNS,u'sound'), + ), + (PRESENTATIONNS,u'sound') : ( + ), + (SCRIPTNS,u'event-listener') : ( + ), + (STYLENS,u'background-image') : ( + (OFFICENS,u'binary-data'), + ), + (STYLENS,u'chart-properties') : ( + (CHARTNS,u'symbol-image'), + ), + (STYLENS,u'column') : ( + ), + (STYLENS,u'column-sep') : ( + ), + (STYLENS,u'columns') : ( + (STYLENS,u'column'), + (STYLENS,u'column-sep'), + ), + (STYLENS,u'default-style') : ( + (STYLENS,u'chart-properties'), + (STYLENS,u'drawing-page-properties'), + (STYLENS,u'graphic-properties'), + (STYLENS,u'paragraph-properties'), + (STYLENS,u'ruby-properties'), + (STYLENS,u'section-properties'), + (STYLENS,u'table-cell-properties'), + (STYLENS,u'table-column-properties'), + (STYLENS,u'table-properties'), + (STYLENS,u'table-row-properties'), + (STYLENS,u'text-properties'), + ), + (STYLENS,u'drawing-page-properties') : ( + (PRESENTATIONNS,u'sound'), + ), + (STYLENS,u'drop-cap') : ( + ), + (STYLENS,u'font-face') : ( + (SVGNS,u'definition-src'), + (SVGNS,u'font-face-src'), + ), + (STYLENS,u'footer') : ( + (STYLENS,u'region-center'), + (STYLENS,u'region-left'), + (STYLENS,u'region-right'), + (TABLENS,u'table'), + (TEXTNS,u'alphabetical-index'), + (TEXTNS,u'alphabetical-index-auto-mark-file'), + (TEXTNS,u'bibliography'), + (TEXTNS,u'change'), + (TEXTNS,u'change-end'), + (TEXTNS,u'change-start'), + (TEXTNS,u'dde-connection-decls'), + (TEXTNS,u'h'), + (TEXTNS,u'illustration-index'), + (TEXTNS,u'index-title'), + (TEXTNS,u'list'), + (TEXTNS,u'object-index'), + (TEXTNS,u'p'), + (TEXTNS,u'section'), + (TEXTNS,u'sequence-decls'), + (TEXTNS,u'table-index'), + (TEXTNS,u'table-of-content'), + (TEXTNS,u'tracked-changes'), + (TEXTNS,u'user-field-decls'), + (TEXTNS,u'user-index'), + (TEXTNS,u'variable-decls'), + ), +# allowed_children + (STYLENS,u'footer-left') : ( + (STYLENS,u'region-center'), + (STYLENS,u'region-left'), + (STYLENS,u'region-right'), + (TABLENS,u'table'), + (TEXTNS,u'alphabetical-index'), + (TEXTNS,u'alphabetical-index-auto-mark-file'), + (TEXTNS,u'bibliography'), + (TEXTNS,u'change'), + (TEXTNS,u'change-end'), + (TEXTNS,u'change-start'), + (TEXTNS,u'dde-connection-decls'), + (TEXTNS,u'h'), + (TEXTNS,u'illustration-index'), + (TEXTNS,u'index-title'), + (TEXTNS,u'list'), + (TEXTNS,u'object-index'), + (TEXTNS,u'p'), + (TEXTNS,u'section'), + (TEXTNS,u'sequence-decls'), + (TEXTNS,u'table-index'), + (TEXTNS,u'table-of-content'), + (TEXTNS,u'tracked-changes'), + (TEXTNS,u'user-field-decls'), + (TEXTNS,u'user-index'), + (TEXTNS,u'variable-decls'), + ), + (STYLENS,u'footer-style') : ( + (STYLENS,u'header-footer-properties'), + ), + (STYLENS,u'footnote-sep') : ( + ), + (STYLENS,u'graphic-properties') : ( + (STYLENS,u'background-image'), + (STYLENS,u'columns'), + (TEXTNS,u'list-style'), + ), +# allowed_children + (STYLENS,u'handout-master') : ( + (DR3DNS,u'scene'), + (DRAWNS,u'caption'), + (DRAWNS,u'circle'), + (DRAWNS,u'connector'), + (DRAWNS,u'control'), + (DRAWNS,u'custom-shape'), + (DRAWNS,u'ellipse'), + (DRAWNS,u'frame'), + (DRAWNS,u'g'), + (DRAWNS,u'line'), + (DRAWNS,u'measure'), + (DRAWNS,u'page-thumbnail'), + (DRAWNS,u'path'), + (DRAWNS,u'polygon'), + (DRAWNS,u'polyline'), + (DRAWNS,u'rect'), + (DRAWNS,u'regular-polygon'), + ), + (STYLENS,u'header') : ( + (STYLENS,u'region-center'), + (STYLENS,u'region-left'), + (STYLENS,u'region-right'), + (TABLENS,u'table'), + (TEXTNS,u'alphabetical-index'), + (TEXTNS,u'alphabetical-index-auto-mark-file'), + (TEXTNS,u'bibliography'), + (TEXTNS,u'change'), + (TEXTNS,u'change-end'), + (TEXTNS,u'change-start'), + (TEXTNS,u'dde-connection-decls'), + (TEXTNS,u'h'), + (TEXTNS,u'illustration-index'), + (TEXTNS,u'index-title'), + (TEXTNS,u'list'), + (TEXTNS,u'object-index'), + (TEXTNS,u'p'), + (TEXTNS,u'section'), + (TEXTNS,u'sequence-decls'), + (TEXTNS,u'table-index'), + (TEXTNS,u'table-of-content'), + (TEXTNS,u'tracked-changes'), + (TEXTNS,u'user-field-decls'), + (TEXTNS,u'user-index'), + (TEXTNS,u'variable-decls'), + ), +# allowed_children + (STYLENS,u'header-footer-properties') : ( + (STYLENS,u'background-image'), + ), + (STYLENS,u'header-left') : ( + (STYLENS,u'region-center'), + (STYLENS,u'region-left'), + (STYLENS,u'region-right'), + (TABLENS,u'table'), + (TEXTNS,u'alphabetical-index'), + (TEXTNS,u'alphabetical-index-auto-mark-file'), + (TEXTNS,u'bibliography'), + (TEXTNS,u'change'), + (TEXTNS,u'change-end'), + (TEXTNS,u'change-start'), + (TEXTNS,u'dde-connection-decls'), + (TEXTNS,u'h'), + (TEXTNS,u'illustration-index'), + (TEXTNS,u'index-title'), + (TEXTNS,u'list'), + (TEXTNS,u'object-index'), + (TEXTNS,u'p'), + (TEXTNS,u'section'), + (TEXTNS,u'sequence-decls'), + (TEXTNS,u'table-index'), + (TEXTNS,u'table-of-content'), + (TEXTNS,u'tracked-changes'), + (TEXTNS,u'user-field-decls'), + (TEXTNS,u'user-index'), + (TEXTNS,u'variable-decls'), + ), + (STYLENS,u'header-style') : ( + (STYLENS,u'header-footer-properties'), + ), + (STYLENS,u'list-level-properties') : ( + ), + (STYLENS,u'map') : ( + ), + (STYLENS,u'master-page') : ( + (DR3DNS,u'scene'), + (DRAWNS,u'caption'), + (DRAWNS,u'circle'), + (DRAWNS,u'connector'), + (DRAWNS,u'control'), + (DRAWNS,u'custom-shape'), + (DRAWNS,u'ellipse'), + (DRAWNS,u'frame'), + (DRAWNS,u'g'), + (DRAWNS,u'line'), + (DRAWNS,u'measure'), + (DRAWNS,u'page-thumbnail'), + (DRAWNS,u'path'), + (DRAWNS,u'polygon'), + (DRAWNS,u'polyline'), + (DRAWNS,u'rect'), + (DRAWNS,u'regular-polygon'), + (OFFICENS,u'forms'), + (PRESENTATIONNS,u'notes'), + (STYLENS,u'footer'), + (STYLENS,u'footer-left'), + (STYLENS,u'header'), + (STYLENS,u'header-left'), + (STYLENS,u'style'), + ), + (STYLENS,u'page-layout') : ( + (STYLENS,u'footer-style'), + (STYLENS,u'header-style'), + (STYLENS,u'page-layout-properties'), + ), + (STYLENS,u'page-layout-properties') : ( + (STYLENS,u'background-image'), + (STYLENS,u'columns'), + (STYLENS,u'footnote-sep'), + ), +# allowed_children + (STYLENS,u'paragraph-properties') : ( + (STYLENS,u'background-image'), + (STYLENS,u'drop-cap'), + (STYLENS,u'tab-stops'), + ), + (STYLENS,u'presentation-page-layout') : ( + (PRESENTATIONNS,u'placeholder'), + ), + (STYLENS,u'region-center') : ( + (TEXTNS,u'p'), + ), + (STYLENS,u'region-left') : ( + (TEXTNS,u'p'), + ), + (STYLENS,u'region-right') : ( + (TEXTNS,u'p'), + ), + (STYLENS,u'ruby-properties') : ( + ), + (STYLENS,u'section-properties') : ( + (STYLENS,u'background-image'), + (STYLENS,u'columns'), + (TEXTNS,u'notes-configuration'), + ), + (STYLENS,u'style') : ( + (STYLENS,u'chart-properties'), + (STYLENS,u'drawing-page-properties'), + (STYLENS,u'graphic-properties'), + (STYLENS,u'map'), + (STYLENS,u'paragraph-properties'), + (STYLENS,u'ruby-properties'), + (STYLENS,u'section-properties'), + (STYLENS,u'table-cell-properties'), + (STYLENS,u'table-column-properties'), + (STYLENS,u'table-properties'), + (STYLENS,u'table-row-properties'), + (STYLENS,u'text-properties'), + ), + (STYLENS,u'tab-stop') : ( + ), + (STYLENS,u'tab-stops') : ( + (STYLENS,u'tab-stop'), + ), +# allowed_children + (STYLENS,u'table-cell-properties') : ( + (STYLENS,u'background-image'), + ), + (STYLENS,u'table-column-properties') : ( + ), + (STYLENS,u'table-properties') : ( + (STYLENS,u'background-image'), + ), + (STYLENS,u'table-row-properties') : ( + (STYLENS,u'background-image'), + ), + (STYLENS,u'text-properties') : ( + ), + (SVGNS,u'definition-src') : ( + ), + (SVGNS,u'desc') : ( + ), + (SVGNS,u'font-face-format') : ( + ), + (SVGNS,u'font-face-name') : ( + ), + (SVGNS,u'font-face-src') : ( + (SVGNS,u'font-face-name'), + (SVGNS,u'font-face-uri'), + ), + (SVGNS,u'font-face-uri') : ( + (SVGNS,u'font-face-format'), + ), + (SVGNS,u'linearGradient') : ( + (SVGNS,u'stop'), + ), + (SVGNS,u'radialGradient') : ( + (SVGNS,u'stop'), + ), + (SVGNS,u'stop') : ( + ), + (SVGNS,u'title') : ( + ), + (TABLENS,u'body') : ( + ), + (TABLENS,u'calculation-settings') : ( + (TABLENS,u'iteration'), + (TABLENS,u'null-date'), + ), +# allowed_children + (TABLENS,u'cell-address') : ( + ), + (TABLENS,u'cell-content-change') : ( + (OFFICENS,u'change-info'), + (TABLENS,u'cell-address'), + (TABLENS,u'deletions'), + (TABLENS,u'dependencies'), + (TABLENS,u'previous'), + ), + (TABLENS,u'cell-content-deletion') : ( + (TABLENS,u'cell-address'), + (TABLENS,u'change-track-table-cell'), + ), + (TABLENS,u'cell-range-source') : ( + ), + (TABLENS,u'change-deletion') : ( + ), + (TABLENS,u'change-track-table-cell') : ( + (TEXTNS,u'p'), + ), + (TABLENS,u'consolidation') : ( + ), + (TABLENS,u'content-validation') : ( + (OFFICENS,u'event-listeners'), + (TABLENS,u'error-macro'), + (TABLENS,u'error-message'), + (TABLENS,u'help-message'), + ), +# allowed_children + (TABLENS,u'content-validations') : ( + (TABLENS,u'content-validation'), + ), + (TABLENS,u'covered-table-cell') : ( + (DR3DNS,u'scene'), + (DRAWNS,u'a'), + (DRAWNS,u'caption'), + (DRAWNS,u'circle'), + (DRAWNS,u'connector'), + (DRAWNS,u'control'), + (DRAWNS,u'custom-shape'), + (DRAWNS,u'ellipse'), + (DRAWNS,u'frame'), + (DRAWNS,u'g'), + (DRAWNS,u'line'), + (DRAWNS,u'measure'), + (DRAWNS,u'page-thumbnail'), + (DRAWNS,u'path'), + (DRAWNS,u'polygon'), + (DRAWNS,u'polyline'), + (DRAWNS,u'rect'), + (DRAWNS,u'regular-polygon'), + (OFFICENS,u'annotation'), + (TABLENS,u'cell-range-source'), + (TABLENS,u'detective'), + (TABLENS,u'table'), + (TEXTNS,u'alphabetical-index'), + (TEXTNS,u'bibliography'), + (TEXTNS,u'change'), + (TEXTNS,u'change-end'), + (TEXTNS,u'change-start'), + (TEXTNS,u'h'), + (TEXTNS,u'illustration-index'), + (TEXTNS,u'list'), + (TEXTNS,u'numbered-paragraph'), + (TEXTNS,u'object-index'), + (TEXTNS,u'p'), + (TEXTNS,u'section'), + (TEXTNS,u'soft-page-break'), + (TEXTNS,u'table-index'), + (TEXTNS,u'table-of-content'), + (TEXTNS,u'user-index'), + ), +# allowed_children + (TABLENS,u'cut-offs') : ( + (TABLENS,u'insertion-cut-off'), + (TABLENS,u'movement-cut-off'), + ), + (TABLENS,u'data-pilot-display-info') : ( + ), + (TABLENS,u'data-pilot-field') : ( + (TABLENS,u'data-pilot-field-reference'), + (TABLENS,u'data-pilot-groups'), + (TABLENS,u'data-pilot-level'), + ), + (TABLENS,u'data-pilot-field-reference') : ( + ), + (TABLENS,u'data-pilot-group') : ( + (TABLENS,u'data-pilot-group-member'), + ), + (TABLENS,u'data-pilot-group-member') : ( + ), + (TABLENS,u'data-pilot-groups') : ( + (TABLENS,u'data-pilot-group'), + ), + (TABLENS,u'data-pilot-layout-info') : ( + ), + (TABLENS,u'data-pilot-level') : ( + (TABLENS,u'data-pilot-display-info'), + (TABLENS,u'data-pilot-layout-info'), + (TABLENS,u'data-pilot-members'), + (TABLENS,u'data-pilot-sort-info'), + (TABLENS,u'data-pilot-subtotals'), + ), + (TABLENS,u'data-pilot-member') : ( + ), + (TABLENS,u'data-pilot-members') : ( + (TABLENS,u'data-pilot-member'), + ), + (TABLENS,u'data-pilot-sort-info') : ( + ), + (TABLENS,u'data-pilot-subtotal') : ( + ), + (TABLENS,u'data-pilot-subtotals') : ( + (TABLENS,u'data-pilot-subtotal'), + ), +# allowed_children + (TABLENS,u'data-pilot-table') : ( + (TABLENS,u'data-pilot-field'), + (TABLENS,u'database-source-query'), + (TABLENS,u'database-source-sql'), + (TABLENS,u'database-source-table'), + (TABLENS,u'source-cell-range'), + (TABLENS,u'source-service'), + ), + (TABLENS,u'data-pilot-tables') : ( + (TABLENS,u'data-pilot-table'), + ), + (TABLENS,u'database-range') : ( + (TABLENS,u'database-source-query'), + (TABLENS,u'database-source-sql'), + (TABLENS,u'database-source-table'), + (TABLENS,u'filter'), + (TABLENS,u'sort'), + (TABLENS,u'subtotal-rules'), + ), + (TABLENS,u'database-ranges') : ( + (TABLENS,u'database-range'), + ), + (TABLENS,u'database-source-query') : ( + ), + (TABLENS,u'database-source-sql') : ( + ), + (TABLENS,u'database-source-table') : ( + ), +# allowed_children + (TABLENS,u'dde-link') : ( + (OFFICENS,u'dde-source'), + (TABLENS,u'table'), + ), + (TABLENS,u'dde-links') : ( + (TABLENS,u'dde-link'), + ), + (TABLENS,u'deletion') : ( + (OFFICENS,u'change-info'), + (TABLENS,u'cut-offs'), + (TABLENS,u'deletions'), + (TABLENS,u'dependencies'), + ), + (TABLENS,u'deletions') : ( + (TABLENS,u'cell-content-deletion'), + (TABLENS,u'change-deletion'), + ), + (TABLENS,u'dependencies') : ( + (TABLENS,u'dependency'), + ), + (TABLENS,u'dependency') : ( + ), + (TABLENS,u'detective') : ( + (TABLENS,u'highlighted-range'), + (TABLENS,u'operation'), + ), +# allowed_children + (TABLENS,u'error-macro') : ( + ), + (TABLENS,u'error-message') : ( + (TEXTNS,u'p'), + ), + (TABLENS,u'even-columns') : ( + ), + (TABLENS,u'even-rows') : ( + ), + (TABLENS,u'filter') : ( + (TABLENS,u'filter-and'), + (TABLENS,u'filter-condition'), + (TABLENS,u'filter-or'), + ), + (TABLENS,u'filter-and') : ( + (TABLENS,u'filter-condition'), + (TABLENS,u'filter-or'), + ), + (TABLENS,u'filter-condition') : ( + ), + (TABLENS,u'filter-or') : ( + (TABLENS,u'filter-and'), + (TABLENS,u'filter-condition'), + ), +# allowed_children + (TABLENS,u'first-column') : ( + ), + (TABLENS,u'first-row') : ( + ), + (TABLENS,u'help-message') : ( + (TEXTNS,u'p'), + ), + (TABLENS,u'highlighted-range') : ( + ), + (TABLENS,u'insertion') : ( + (OFFICENS,u'change-info'), + (TABLENS,u'deletions'), + (TABLENS,u'dependencies'), + ), + (TABLENS,u'insertion-cut-off') : ( + ), + (TABLENS,u'iteration') : ( + ), + (TABLENS,u'label-range') : ( + ), + (TABLENS,u'label-ranges') : ( + (TABLENS,u'label-range'), + ), + (TABLENS,u'last-column') : ( + ), + (TABLENS,u'last-row') : ( + ), + (TABLENS,u'movement') : ( + (OFFICENS,u'change-info'), + (TABLENS,u'deletions'), + (TABLENS,u'dependencies'), + (TABLENS,u'source-range-address'), + (TABLENS,u'target-range-address'), + ), + (TABLENS,u'movement-cut-off') : ( + ), + (TABLENS,u'named-expression') : ( + ), + (TABLENS,u'named-expressions') : ( + (TABLENS,u'named-expression'), + (TABLENS,u'named-range'), + ), +# allowed_children + (TABLENS,u'named-range') : ( + ), + (TABLENS,u'null-date') : ( + ), + (TABLENS,u'odd-columns') : ( + ), + (TABLENS,u'odd-rows') : ( + ), + (TABLENS,u'operation') : ( + ), + (TABLENS,u'previous') : ( + (TABLENS,u'change-track-table-cell'), + ), + (TABLENS,u'scenario') : ( + ), + (TABLENS,u'shapes') : ( + (DR3DNS,u'scene'), + (DRAWNS,u'caption'), + (DRAWNS,u'circle'), + (DRAWNS,u'connector'), + (DRAWNS,u'control'), + (DRAWNS,u'custom-shape'), + (DRAWNS,u'ellipse'), + (DRAWNS,u'frame'), + (DRAWNS,u'g'), + (DRAWNS,u'line'), + (DRAWNS,u'measure'), + (DRAWNS,u'page-thumbnail'), + (DRAWNS,u'path'), + (DRAWNS,u'polygon'), + (DRAWNS,u'polyline'), + (DRAWNS,u'rect'), + (DRAWNS,u'regular-polygon'), + ), +# allowed_children + (TABLENS,u'sort') : ( + (TABLENS,u'sort-by'), + ), + (TABLENS,u'sort-by') : ( + ), + (TABLENS,u'sort-groups') : ( + ), + (TABLENS,u'source-cell-range') : ( + (TABLENS,u'filter'), + ), + (TABLENS,u'source-range-address') : ( + ), + (TABLENS,u'source-service') : ( + ), + (TABLENS,u'subtotal-field') : ( + ), + (TABLENS,u'subtotal-rule') : ( + (TABLENS,u'subtotal-field'), + ), + (TABLENS,u'subtotal-rules') : ( + (TABLENS,u'sort-groups'), + (TABLENS,u'subtotal-rule'), + ), +# allowed_children + (TABLENS,u'table') : ( + (OFFICENS,u'dde-source'), + (OFFICENS,u'forms'), + (TEXTNS,u'soft-page-break'), + (TABLENS,u'scenario'), + (TABLENS,u'shapes'), + (TABLENS,u'table-column'), + (TABLENS,u'table-column-group'), + (TABLENS,u'table-columns'), + (TABLENS,u'table-header-columns'), + (TABLENS,u'table-header-rows'), + (TABLENS,u'table-row'), + (TABLENS,u'table-row-group'), + (TABLENS,u'table-rows'), + (TABLENS,u'table-source'), + ), + (TABLENS,u'table-cell') : ( + (DR3DNS,u'scene'), + (DRAWNS,u'a'), + (DRAWNS,u'caption'), + (DRAWNS,u'circle'), + (DRAWNS,u'connector'), + (DRAWNS,u'control'), + (DRAWNS,u'custom-shape'), + (DRAWNS,u'ellipse'), + (DRAWNS,u'frame'), + (DRAWNS,u'g'), + (DRAWNS,u'line'), + (DRAWNS,u'measure'), + (DRAWNS,u'page-thumbnail'), + (DRAWNS,u'path'), + (DRAWNS,u'polygon'), + (DRAWNS,u'polyline'), + (DRAWNS,u'rect'), + (DRAWNS,u'regular-polygon'), + (OFFICENS,u'annotation'), + (TABLENS,u'cell-range-source'), + (TABLENS,u'detective'), + (TABLENS,u'table'), + (TEXTNS,u'alphabetical-index'), + (TEXTNS,u'bibliography'), + (TEXTNS,u'change'), + (TEXTNS,u'change-end'), + (TEXTNS,u'change-start'), + (TEXTNS,u'h'), + (TEXTNS,u'illustration-index'), + (TEXTNS,u'list'), + (TEXTNS,u'numbered-paragraph'), + (TEXTNS,u'object-index'), + (TEXTNS,u'p'), + (TEXTNS,u'section'), + (TEXTNS,u'soft-page-break'), + (TEXTNS,u'table-index'), + (TEXTNS,u'table-of-content'), + (TEXTNS,u'user-index'), + ), +# allowed_children + (TABLENS,u'table-column') : ( + ), + (TABLENS,u'table-column-group') : ( + (TABLENS,u'table-column'), + (TABLENS,u'table-column-group'), + (TABLENS,u'table-columns'), + (TABLENS,u'table-header-columns'), + ), + (TABLENS,u'table-columns') : ( + (TABLENS,u'table-column'), + ), + (TABLENS,u'table-header-columns') : ( + (TABLENS,u'table-column'), + ), + (TABLENS,u'table-header-rows') : ( + (TABLENS,u'table-row'), + (TEXTNS,u'soft-page-break'), + ), + (TABLENS,u'table-row') : ( + (TABLENS,u'covered-table-cell'), + (TABLENS,u'table-cell'), + ), + (TABLENS,u'table-row-group') : ( + (TABLENS,u'table-header-rows'), + (TABLENS,u'table-row'), + (TABLENS,u'table-row-group'), + (TABLENS,u'table-rows'), + (TEXTNS,u'soft-page-break'), + ), + (TABLENS,u'table-rows') : ( + (TABLENS,u'table-row'), + (TEXTNS,u'soft-page-break'), + ), +# allowed_children + (TABLENS,u'table-source') : ( + ), + (TABLENS,u'table-template') : ( + (TABLENS,u'body'), + (TABLENS,u'even-columns'), + (TABLENS,u'even-rows'), + (TABLENS,u'first-column'), + (TABLENS,u'first-row'), + (TABLENS,u'last-column'), + (TABLENS,u'last-row'), + (TABLENS,u'odd-columns'), + (TABLENS,u'odd-rows'), + ), + (TABLENS,u'target-range-address') : ( + ), + (TABLENS,u'tracked-changes') : ( + (TABLENS,u'cell-content-change'), + (TABLENS,u'deletion'), + (TABLENS,u'insertion'), + (TABLENS,u'movement'), + ), +# allowed_children + (TEXTNS,u'a') : ( + (DR3DNS,u'scene'), + (DRAWNS,u'a'), + (DRAWNS,u'caption'), + (DRAWNS,u'circle'), + (DRAWNS,u'connector'), + (DRAWNS,u'control'), + (DRAWNS,u'custom-shape'), + (DRAWNS,u'ellipse'), + (DRAWNS,u'frame'), + (DRAWNS,u'g'), + (DRAWNS,u'line'), + (DRAWNS,u'measure'), + (DRAWNS,u'page-thumbnail'), + (DRAWNS,u'path'), + (DRAWNS,u'polygon'), + (DRAWNS,u'polyline'), + (DRAWNS,u'rect'), + (DRAWNS,u'regular-polygon'), + (OFFICENS,u'annotation'), + (OFFICENS,u'event-listeners'), + (PRESENTATIONNS,u'date-time'), + (PRESENTATIONNS,u'footer'), + (PRESENTATIONNS,u'header'), + (TEXTNS,u'a'), + (TEXTNS,u'alphabetical-index-mark'), + (TEXTNS,u'alphabetical-index-mark-end'), + (TEXTNS,u'alphabetical-index-mark-start'), + (TEXTNS,u'author-initials'), + (TEXTNS,u'author-name'), + (TEXTNS,u'bibliography-mark'), + (TEXTNS,u'bookmark'), + (TEXTNS,u'bookmark-end'), + (TEXTNS,u'bookmark-ref'), + (TEXTNS,u'bookmark-start'), + (TEXTNS,u'change'), + (TEXTNS,u'change-end'), + (TEXTNS,u'change-start'), + (TEXTNS,u'chapter'), + (TEXTNS,u'conditional-text'), + (TEXTNS,u'creation-date'), + (TEXTNS,u'creation-time'), + (TEXTNS,u'creator'), + (TEXTNS,u'database-display'), + (TEXTNS,u'database-name'), + (TEXTNS,u'database-next'), + (TEXTNS,u'database-row-number'), + (TEXTNS,u'database-row-select'), + (TEXTNS,u'date'), + (TEXTNS,u'dde-connection'), + (TEXTNS,u'description'), + (TEXTNS,u'editing-cycles'), + (TEXTNS,u'editing-duration'), + (TEXTNS,u'execute-macro'), + (TEXTNS,u'expression'), + (TEXTNS,u'file-name'), + (TEXTNS,u'hidden-paragraph'), + (TEXTNS,u'hidden-text'), + (TEXTNS,u'initial-creator'), + (TEXTNS,u'keywords'), + (TEXTNS,u'line-break'), + (TEXTNS,u'measure'), + (TEXTNS,u'modification-date'), + (TEXTNS,u'modification-time'), + (TEXTNS,u'note'), + (TEXTNS,u'note-ref'), + (TEXTNS,u'page-count'), + (TEXTNS,u'paragraph-count'), + (TEXTNS,u'word-count'), + (TEXTNS,u'character-count'), + (TEXTNS,u'table-count'), + (TEXTNS,u'image-count'), + (TEXTNS,u'object-count'), + (TEXTNS,u'page-continuation'), + (TEXTNS,u'page-number'), + (TEXTNS,u'page-variable-get'), + (TEXTNS,u'page-variable-set'), + (TEXTNS,u'placeholder'), + (TEXTNS,u'print-date'), + (TEXTNS,u'print-time'), + (TEXTNS,u'printed-by'), + (TEXTNS,u'reference-mark'), + (TEXTNS,u'reference-mark-end'), + (TEXTNS,u'reference-mark-start'), + (TEXTNS,u'reference-ref'), + (TEXTNS,u'ruby'), + (TEXTNS,u's'), + (TEXTNS,u'script'), + (TEXTNS,u'sender-city'), + (TEXTNS,u'sender-company'), + (TEXTNS,u'sender-country'), + (TEXTNS,u'sender-email'), + (TEXTNS,u'sender-fax'), + (TEXTNS,u'sender-firstname'), + (TEXTNS,u'sender-initials'), + (TEXTNS,u'sender-lastname'), + (TEXTNS,u'sender-phone-private'), + (TEXTNS,u'sender-phone-work'), + (TEXTNS,u'sender-position'), + (TEXTNS,u'sender-postal-code'), + (TEXTNS,u'sender-state-or-province'), + (TEXTNS,u'sender-street'), + (TEXTNS,u'sender-title'), + (TEXTNS,u'sequence'), + (TEXTNS,u'sequence-ref'), + (TEXTNS,u'sheet-name'), + (TEXTNS,u'soft-page-break'), + (TEXTNS,u'span'), + (TEXTNS,u'subject'), + (TEXTNS,u'tab'), + (TEXTNS,u'table-formula'), + (TEXTNS,u'template-name'), + (TEXTNS,u'text-input'), + (TEXTNS,u'time'), + (TEXTNS,u'title'), + (TEXTNS,u'toc-mark'), + (TEXTNS,u'toc-mark-end'), + (TEXTNS,u'toc-mark-start'), + (TEXTNS,u'user-defined'), + (TEXTNS,u'user-field-get'), + (TEXTNS,u'user-field-input'), + (TEXTNS,u'user-index-mark'), + (TEXTNS,u'user-index-mark-end'), + (TEXTNS,u'user-index-mark-start'), + (TEXTNS,u'variable-get'), + (TEXTNS,u'variable-input'), + (TEXTNS,u'variable-set'), + ), +# allowed_children + (TEXTNS,u'alphabetical-index') : ( + (TEXTNS,u'alphabetical-index-source'), + (TEXTNS,u'index-body'), + ), + (TEXTNS,u'alphabetical-index-auto-mark-file') : ( + ), + (TEXTNS,u'alphabetical-index-entry-template') : ( + (TEXTNS,u'index-entry-chapter'), + (TEXTNS,u'index-entry-page-number'), + (TEXTNS,u'index-entry-span'), + (TEXTNS,u'index-entry-tab-stop'), + (TEXTNS,u'index-entry-text'), + ), + (TEXTNS,u'alphabetical-index-mark') : ( + ), + (TEXTNS,u'alphabetical-index-mark-end') : ( + ), + (TEXTNS,u'alphabetical-index-mark-start') : ( + ), + (TEXTNS,u'alphabetical-index-source') : ( + (TEXTNS,u'alphabetical-index-entry-template'), + (TEXTNS,u'index-title-template'), + ), + (TEXTNS,u'author-initials') : ( + ), + (TEXTNS,u'author-name') : ( + ), + (TEXTNS,u'bibliography') : ( + (TEXTNS,u'bibliography-source'), + (TEXTNS,u'index-body'), + ), + (TEXTNS,u'bibliography-configuration') : ( + (TEXTNS,u'sort-key'), + ), + (TEXTNS,u'bibliography-entry-template') : ( + (TEXTNS,u'index-entry-bibliography'), + (TEXTNS,u'index-entry-span'), + (TEXTNS,u'index-entry-tab-stop'), + ), +# allowed_children + (TEXTNS,u'bibliography-mark') : ( + ), + (TEXTNS,u'bibliography-source') : ( + (TEXTNS,u'bibliography-entry-template'), + (TEXTNS,u'index-title-template'), + ), + (TEXTNS,u'bookmark') : ( + ), + (TEXTNS,u'bookmark-end') : ( + ), + (TEXTNS,u'bookmark-ref') : ( + ), + (TEXTNS,u'bookmark-start') : ( + ), + (TEXTNS,u'change') : ( + ), + (TEXTNS,u'change-end') : ( + ), + (TEXTNS,u'change-start') : ( + ), + (TEXTNS,u'changed-region') : ( + (TEXTNS,u'deletion'), + (TEXTNS,u'format-change'), + (TEXTNS,u'insertion'), + ), + (TEXTNS,u'chapter') : ( + ), + (TEXTNS,u'character-count') : ( + ), + (TEXTNS,u'conditional-text') : ( + ), + (TEXTNS,u'creation-date') : ( + ), + (TEXTNS,u'creation-time') : ( + ), + (TEXTNS,u'creator') : ( + ), + (TEXTNS,u'database-display') : ( + (FORMNS,u'connection-resource'), + ), + (TEXTNS,u'database-name') : ( + (FORMNS,u'connection-resource'), + ), + (TEXTNS,u'database-next') : ( + (FORMNS,u'connection-resource'), + ), + (TEXTNS,u'database-row-number') : ( + (FORMNS,u'connection-resource'), + ), + (TEXTNS,u'database-row-select') : ( + (FORMNS,u'connection-resource'), + ), + (TEXTNS,u'date') : ( + ), + (TEXTNS,u'dde-connection') : ( + ), + (TEXTNS,u'dde-connection-decl') : ( + ), + (TEXTNS,u'dde-connection-decls') : ( + (TEXTNS,u'dde-connection-decl'), + ), +# allowed_children + (TEXTNS,u'deletion') : ( + (DR3DNS,u'scene'), + (DRAWNS,u'a'), + (DRAWNS,u'caption'), + (DRAWNS,u'circle'), + (DRAWNS,u'connector'), + (DRAWNS,u'control'), + (DRAWNS,u'custom-shape'), + (DRAWNS,u'ellipse'), + (DRAWNS,u'frame'), + (DRAWNS,u'g'), + (DRAWNS,u'line'), + (DRAWNS,u'measure'), + (DRAWNS,u'page-thumbnail'), + (DRAWNS,u'path'), + (DRAWNS,u'polygon'), + (DRAWNS,u'polyline'), + (DRAWNS,u'rect'), + (DRAWNS,u'regular-polygon'), + (OFFICENS,u'change-info'), + (TABLENS,u'table'), + (TEXTNS,u'alphabetical-index'), + (TEXTNS,u'bibliography'), + (TEXTNS,u'change'), + (TEXTNS,u'change-end'), + (TEXTNS,u'change-start'), + (TEXTNS,u'h'), + (TEXTNS,u'illustration-index'), + (TEXTNS,u'list'), + (TEXTNS,u'numbered-paragraph'), + (TEXTNS,u'object-index'), + (TEXTNS,u'p'), + (TEXTNS,u'section'), + (TEXTNS,u'soft-page-break'), + (TEXTNS,u'table-index'), + (TEXTNS,u'table-of-content'), + (TEXTNS,u'user-index'), + ), + (TEXTNS,u'description') : ( + ), + (TEXTNS,u'editing-cycles') : ( + ), + (TEXTNS,u'editing-duration') : ( + ), + (TEXTNS,u'execute-macro') : ( + (OFFICENS,u'event-listeners'), + ), + (TEXTNS,u'expression') : ( + ), + (TEXTNS,u'file-name') : ( + ), + (TEXTNS,u'format-change') : ( + (OFFICENS,u'change-info'), + ), +# allowed_children + (TEXTNS,u'h') : ( + (DR3DNS,u'scene'), + (DRAWNS,u'a'), + (DRAWNS,u'caption'), + (DRAWNS,u'circle'), + (DRAWNS,u'connector'), + (DRAWNS,u'control'), + (DRAWNS,u'custom-shape'), + (DRAWNS,u'ellipse'), + (DRAWNS,u'frame'), + (DRAWNS,u'g'), + (DRAWNS,u'line'), + (DRAWNS,u'measure'), + (DRAWNS,u'page-thumbnail'), + (DRAWNS,u'path'), + (DRAWNS,u'polygon'), + (DRAWNS,u'polyline'), + (DRAWNS,u'rect'), + (DRAWNS,u'regular-polygon'), + (OFFICENS,u'annotation'), + (PRESENTATIONNS,u'date-time'), + (PRESENTATIONNS,u'footer'), + (PRESENTATIONNS,u'header'), + (TEXTNS,u'a'), + (TEXTNS,u'alphabetical-index-mark'), + (TEXTNS,u'alphabetical-index-mark-end'), + (TEXTNS,u'alphabetical-index-mark-start'), + (TEXTNS,u'author-initials'), + (TEXTNS,u'author-name'), + (TEXTNS,u'bibliography-mark'), + (TEXTNS,u'bookmark'), + (TEXTNS,u'bookmark-end'), + (TEXTNS,u'bookmark-ref'), + (TEXTNS,u'bookmark-start'), + (TEXTNS,u'change'), + (TEXTNS,u'change-end'), + (TEXTNS,u'change-start'), + (TEXTNS,u'chapter'), + (TEXTNS,u'conditional-text'), + (TEXTNS,u'creation-date'), + (TEXTNS,u'creation-time'), + (TEXTNS,u'creator'), + (TEXTNS,u'database-display'), + (TEXTNS,u'database-name'), + (TEXTNS,u'database-next'), + (TEXTNS,u'database-row-number'), + (TEXTNS,u'database-row-select'), + (TEXTNS,u'date'), + (TEXTNS,u'dde-connection'), + (TEXTNS,u'description'), + (TEXTNS,u'editing-cycles'), + (TEXTNS,u'editing-duration'), + (TEXTNS,u'execute-macro'), + (TEXTNS,u'expression'), + (TEXTNS,u'file-name'), + (TEXTNS,u'hidden-paragraph'), + (TEXTNS,u'hidden-text'), + (TEXTNS,u'initial-creator'), + (TEXTNS,u'keywords'), + (TEXTNS,u'line-break'), + (TEXTNS,u'measure'), + (TEXTNS,u'modification-date'), + (TEXTNS,u'modification-time'), + (TEXTNS,u'note'), + (TEXTNS,u'note-ref'), + (TEXTNS,u'number'), + (TEXTNS,u'page-count'), + (TEXTNS,u'paragraph-count'), + (TEXTNS,u'word-count'), + (TEXTNS,u'character-count'), + (TEXTNS,u'table-count'), + (TEXTNS,u'image-count'), + (TEXTNS,u'object-count'), + (TEXTNS,u'page-continuation'), + (TEXTNS,u'page-number'), + (TEXTNS,u'page-variable-get'), + (TEXTNS,u'page-variable-set'), + (TEXTNS,u'placeholder'), + (TEXTNS,u'print-date'), + (TEXTNS,u'print-time'), + (TEXTNS,u'printed-by'), + (TEXTNS,u'reference-mark'), + (TEXTNS,u'reference-mark-end'), + (TEXTNS,u'reference-mark-start'), + (TEXTNS,u'reference-ref'), + (TEXTNS,u'ruby'), + (TEXTNS,u's'), + (TEXTNS,u'script'), + (TEXTNS,u'sender-city'), + (TEXTNS,u'sender-company'), + (TEXTNS,u'sender-country'), + (TEXTNS,u'sender-email'), + (TEXTNS,u'sender-fax'), + (TEXTNS,u'sender-firstname'), + (TEXTNS,u'sender-initials'), + (TEXTNS,u'sender-lastname'), + (TEXTNS,u'sender-phone-private'), + (TEXTNS,u'sender-phone-work'), + (TEXTNS,u'sender-position'), + (TEXTNS,u'sender-postal-code'), + (TEXTNS,u'sender-state-or-province'), + (TEXTNS,u'sender-street'), + (TEXTNS,u'sender-title'), + (TEXTNS,u'sequence'), + (TEXTNS,u'sequence-ref'), + (TEXTNS,u'sheet-name'), + (TEXTNS,u'soft-page-break'), + (TEXTNS,u'span'), + (TEXTNS,u'subject'), + (TEXTNS,u'tab'), + (TEXTNS,u'table-formula'), + (TEXTNS,u'template-name'), + (TEXTNS,u'text-input'), + (TEXTNS,u'time'), + (TEXTNS,u'title'), + (TEXTNS,u'toc-mark'), + (TEXTNS,u'toc-mark-end'), + (TEXTNS,u'toc-mark-start'), + (TEXTNS,u'user-defined'), + (TEXTNS,u'user-field-get'), + (TEXTNS,u'user-field-input'), + (TEXTNS,u'user-index-mark'), + (TEXTNS,u'user-index-mark-end'), + (TEXTNS,u'user-index-mark-start'), + (TEXTNS,u'variable-get'), + (TEXTNS,u'variable-input'), + (TEXTNS,u'variable-set'), + ), +# allowed_children + (TEXTNS,u'hidden-paragraph') : ( + ), + (TEXTNS,u'hidden-text') : ( + ), + (TEXTNS,u'illustration-index') : ( + (TEXTNS,u'illustration-index-source'), + (TEXTNS,u'index-body'), + ), + (TEXTNS,u'illustration-index-entry-template') : ( + (TEXTNS,u'index-entry-page-number'), + (TEXTNS,u'index-entry-span'), + (TEXTNS,u'index-entry-tab-stop'), + (TEXTNS,u'index-entry-text'), + ), + (TEXTNS,u'illustration-index-source') : ( + (TEXTNS,u'illustration-index-entry-template'), + (TEXTNS,u'index-title-template'), + ), + (TEXTNS,u'image-count') : ( + ), +# allowed_children + (TEXTNS,u'index-body') : ( + (DR3DNS,u'scene'), + (DRAWNS,u'a'), + (DRAWNS,u'caption'), + (DRAWNS,u'circle'), + (DRAWNS,u'connector'), + (DRAWNS,u'control'), + (DRAWNS,u'custom-shape'), + (DRAWNS,u'ellipse'), + (DRAWNS,u'frame'), + (DRAWNS,u'g'), + (DRAWNS,u'line'), + (DRAWNS,u'measure'), + (DRAWNS,u'page-thumbnail'), + (DRAWNS,u'path'), + (DRAWNS,u'polygon'), + (DRAWNS,u'polyline'), + (DRAWNS,u'rect'), + (DRAWNS,u'regular-polygon'), + (TABLENS,u'table'), + (TEXTNS,u'alphabetical-index'), + (TEXTNS,u'bibliography'), + (TEXTNS,u'change'), + (TEXTNS,u'change-end'), + (TEXTNS,u'change-start'), + (TEXTNS,u'h'), + (TEXTNS,u'illustration-index'), + (TEXTNS,u'index-title'), + (TEXTNS,u'list'), + (TEXTNS,u'numbered-paragraph'), + (TEXTNS,u'object-index'), + (TEXTNS,u'p'), + (TEXTNS,u'section'), + (TEXTNS,u'soft-page-break'), + (TEXTNS,u'table-index'), + (TEXTNS,u'table-of-content'), + (TEXTNS,u'user-index'), + ), + (TEXTNS,u'index-entry-bibliography') : ( + ), + (TEXTNS,u'index-entry-chapter') : ( + ), + (TEXTNS,u'index-entry-link-end') : ( + ), + (TEXTNS,u'index-entry-link-start') : ( + ), + (TEXTNS,u'index-entry-page-number') : ( + ), + (TEXTNS,u'index-entry-span') : ( + ), + (TEXTNS,u'index-entry-tab-stop') : ( + ), + (TEXTNS,u'index-entry-text') : ( + ), + (TEXTNS,u'index-source-style') : ( + ), + (TEXTNS,u'index-source-styles') : ( + (TEXTNS,u'index-source-style'), + ), +# allowed_children + (TEXTNS,u'index-title') : ( + (DR3DNS,u'scene'), + (DRAWNS,u'a'), + (DRAWNS,u'caption'), + (DRAWNS,u'circle'), + (DRAWNS,u'connector'), + (DRAWNS,u'control'), + (DRAWNS,u'custom-shape'), + (DRAWNS,u'ellipse'), + (DRAWNS,u'frame'), + (DRAWNS,u'g'), + (DRAWNS,u'line'), + (DRAWNS,u'measure'), + (DRAWNS,u'page-thumbnail'), + (DRAWNS,u'path'), + (DRAWNS,u'polygon'), + (DRAWNS,u'polyline'), + (DRAWNS,u'rect'), + (DRAWNS,u'regular-polygon'), + (TABLENS,u'table'), + (TEXTNS,u'alphabetical-index'), + (TEXTNS,u'bibliography'), + (TEXTNS,u'change'), + (TEXTNS,u'change-end'), + (TEXTNS,u'change-start'), + (TEXTNS,u'h'), + (TEXTNS,u'illustration-index'), + (TEXTNS,u'index-title'), + (TEXTNS,u'list'), + (TEXTNS,u'numbered-paragraph'), + (TEXTNS,u'object-index'), + (TEXTNS,u'p'), + (TEXTNS,u'section'), + (TEXTNS,u'soft-page-break'), + (TEXTNS,u'table-index'), + (TEXTNS,u'table-of-content'), + (TEXTNS,u'user-index'), + ), + (TEXTNS,u'index-title-template') : ( + ), + (TEXTNS,u'initial-creator') : ( + ), + (TEXTNS,u'insertion') : ( + (OFFICENS,u'change-info'), + ), + (TEXTNS,u'keywords') : ( + ), + (TEXTNS,u'line-break') : ( + ), + (TEXTNS,u'linenumbering-configuration') : ( + (TEXTNS,u'linenumbering-separator'), + ), + (TEXTNS,u'linenumbering-separator') : ( + ), + (TEXTNS,u'list') : ( + (TEXTNS,u'list-header'), + (TEXTNS,u'list-item'), + ), + (TEXTNS,u'list-header') : ( + (TEXTNS,u'h'), + (TEXTNS,u'list'), + (TEXTNS,u'number'), + (TEXTNS,u'p'), + (TEXTNS,u'soft-page-break'), + ), + (TEXTNS,u'list-item') : ( + (TEXTNS,u'h'), + (TEXTNS,u'list'), + (TEXTNS,u'number'), + (TEXTNS,u'p'), + (TEXTNS,u'soft-page-break'), + ), + (TEXTNS,u'list-level-style-bullet') : ( + (STYLENS,u'list-level-properties'), + (STYLENS,u'text-properties'), + ), + (TEXTNS,u'list-level-style-image') : ( + (OFFICENS,u'binary-data'), + (STYLENS,u'list-level-properties'), + ), + (TEXTNS,u'list-level-style-number') : ( + (STYLENS,u'list-level-properties'), + (STYLENS,u'text-properties'), + ), + (TEXTNS,u'list-style') : ( + (TEXTNS,u'list-level-style-bullet'), + (TEXTNS,u'list-level-style-image'), + (TEXTNS,u'list-level-style-number'), + ), + (TEXTNS,u'measure') : ( + ), + (TEXTNS,u'modification-date') : ( + ), + (TEXTNS,u'modification-time') : ( + ), + (TEXTNS,u'note') : ( + (TEXTNS,u'note-body'), + (TEXTNS,u'note-citation'), + ), +# allowed_children + (TEXTNS,u'note-body') : ( + (DR3DNS,u'scene'), + (DRAWNS,u'a'), + (DRAWNS,u'caption'), + (DRAWNS,u'circle'), + (DRAWNS,u'connector'), + (DRAWNS,u'control'), + (DRAWNS,u'custom-shape'), + (DRAWNS,u'ellipse'), + (DRAWNS,u'frame'), + (DRAWNS,u'g'), + (DRAWNS,u'line'), + (DRAWNS,u'measure'), + (DRAWNS,u'page-thumbnail'), + (DRAWNS,u'path'), + (DRAWNS,u'polygon'), + (DRAWNS,u'polyline'), + (DRAWNS,u'rect'), + (DRAWNS,u'regular-polygon'), + (TABLENS,u'table'), + (TEXTNS,u'alphabetical-index'), + (TEXTNS,u'bibliography'), + (TEXTNS,u'change'), + (TEXTNS,u'change-end'), + (TEXTNS,u'change-start'), + (TEXTNS,u'h'), + (TEXTNS,u'illustration-index'), + (TEXTNS,u'list'), + (TEXTNS,u'numbered-paragraph'), + (TEXTNS,u'object-index'), + (TEXTNS,u'p'), + (TEXTNS,u'section'), + (TEXTNS,u'soft-page-break'), + (TEXTNS,u'table-index'), + (TEXTNS,u'table-of-content'), + (TEXTNS,u'user-index'), + ), + (TEXTNS,u'note-citation') : ( + ), + (TEXTNS,u'note-continuation-notice-backward') : ( + ), + (TEXTNS,u'note-continuation-notice-forward') : ( + ), + (TEXTNS,u'note-ref') : ( + ), + (TEXTNS,u'notes-configuration') : ( + (TEXTNS,u'note-continuation-notice-backward'), + (TEXTNS,u'note-continuation-notice-forward'), + ), + (TEXTNS,u'number') : ( + ), + (TEXTNS,u'numbered-paragraph') : ( + (TEXTNS,u'h'), + (TEXTNS,u'number'), + (TEXTNS,u'p'), + ), + (TEXTNS,u'object-count') : ( + ), + (TEXTNS,u'object-index') : ( + (TEXTNS,u'index-body'), + (TEXTNS,u'object-index-source'), + ), + (TEXTNS,u'object-index-entry-template') : ( + (TEXTNS,u'index-entry-page-number'), + (TEXTNS,u'index-entry-span'), + (TEXTNS,u'index-entry-tab-stop'), + (TEXTNS,u'index-entry-text'), + ), + (TEXTNS,u'object-index-source') : ( + (TEXTNS,u'index-title-template'), + (TEXTNS,u'object-index-entry-template'), + ), + (TEXTNS,u'outline-level-style') : ( + (STYLENS,u'list-level-properties'), + (STYLENS,u'text-properties'), + ), + (TEXTNS,u'outline-style') : ( + (TEXTNS,u'outline-level-style'), + ), +# allowed_children + (TEXTNS,u'p') : ( + (DR3DNS,u'scene'), + (DRAWNS,u'a'), + (DRAWNS,u'caption'), + (DRAWNS,u'circle'), + (DRAWNS,u'connector'), + (DRAWNS,u'control'), + (DRAWNS,u'custom-shape'), + (DRAWNS,u'ellipse'), + (DRAWNS,u'frame'), + (DRAWNS,u'g'), + (DRAWNS,u'line'), + (DRAWNS,u'measure'), + (DRAWNS,u'page-thumbnail'), + (DRAWNS,u'path'), + (DRAWNS,u'polygon'), + (DRAWNS,u'polyline'), + (DRAWNS,u'rect'), + (DRAWNS,u'regular-polygon'), + (OFFICENS,u'annotation'), + (PRESENTATIONNS,u'date-time'), + (PRESENTATIONNS,u'footer'), + (PRESENTATIONNS,u'header'), + (TEXTNS,u'a'), + (TEXTNS,u'alphabetical-index-mark'), + (TEXTNS,u'alphabetical-index-mark-end'), + (TEXTNS,u'alphabetical-index-mark-start'), + (TEXTNS,u'author-initials'), + (TEXTNS,u'author-name'), + (TEXTNS,u'bibliography-mark'), + (TEXTNS,u'bookmark'), + (TEXTNS,u'bookmark-end'), + (TEXTNS,u'bookmark-ref'), + (TEXTNS,u'bookmark-start'), + (TEXTNS,u'change'), + (TEXTNS,u'change-end'), + (TEXTNS,u'change-start'), + (TEXTNS,u'chapter'), + (TEXTNS,u'character-count'), + (TEXTNS,u'conditional-text'), + (TEXTNS,u'creation-date'), + (TEXTNS,u'creation-time'), + (TEXTNS,u'creator'), + (TEXTNS,u'database-display'), + (TEXTNS,u'database-name'), + (TEXTNS,u'database-next'), + (TEXTNS,u'database-row-number'), + (TEXTNS,u'database-row-select'), + (TEXTNS,u'date'), + (TEXTNS,u'dde-connection'), + (TEXTNS,u'description'), + (TEXTNS,u'editing-cycles'), + (TEXTNS,u'editing-duration'), + (TEXTNS,u'execute-macro'), + (TEXTNS,u'expression'), + (TEXTNS,u'file-name'), + (TEXTNS,u'hidden-paragraph'), + (TEXTNS,u'hidden-text'), + (TEXTNS,u'image-count'), + (TEXTNS,u'initial-creator'), + (TEXTNS,u'keywords'), + (TEXTNS,u'line-break'), + (TEXTNS,u'measure'), + (TEXTNS,u'modification-date'), + (TEXTNS,u'modification-time'), + (TEXTNS,u'note'), + (TEXTNS,u'note-ref'), + (TEXTNS,u'object-count'), + (TEXTNS,u'page-continuation'), + (TEXTNS,u'page-count'), + (TEXTNS,u'page-number'), + (TEXTNS,u'page-variable-get'), + (TEXTNS,u'page-variable-set'), + (TEXTNS,u'paragraph-count'), + (TEXTNS,u'placeholder'), + (TEXTNS,u'print-date'), + (TEXTNS,u'printed-by'), + (TEXTNS,u'print-time'), + (TEXTNS,u'reference-mark'), + (TEXTNS,u'reference-mark-end'), + (TEXTNS,u'reference-mark-start'), + (TEXTNS,u'reference-ref'), + (TEXTNS,u'ruby'), + (TEXTNS,u's'), + (TEXTNS,u'script'), + (TEXTNS,u'sender-city'), + (TEXTNS,u'sender-company'), + (TEXTNS,u'sender-country'), + (TEXTNS,u'sender-email'), + (TEXTNS,u'sender-fax'), + (TEXTNS,u'sender-firstname'), + (TEXTNS,u'sender-initials'), + (TEXTNS,u'sender-lastname'), + (TEXTNS,u'sender-phone-private'), + (TEXTNS,u'sender-phone-work'), + (TEXTNS,u'sender-position'), + (TEXTNS,u'sender-postal-code'), + (TEXTNS,u'sender-state-or-province'), + (TEXTNS,u'sender-street'), + (TEXTNS,u'sender-title'), + (TEXTNS,u'sequence'), + (TEXTNS,u'sequence-ref'), + (TEXTNS,u'sheet-name'), + (TEXTNS,u'soft-page-break'), + (TEXTNS,u'span'), + (TEXTNS,u'subject'), + (TEXTNS,u'tab'), + (TEXTNS,u'table-count'), + (TEXTNS,u'table-formula'), + (TEXTNS,u'template-name'), + (TEXTNS,u'text-input'), + (TEXTNS,u'time'), + (TEXTNS,u'title'), + (TEXTNS,u'toc-mark'), + (TEXTNS,u'toc-mark-end'), + (TEXTNS,u'toc-mark-start'), + (TEXTNS,u'user-defined'), + (TEXTNS,u'user-field-get'), + (TEXTNS,u'user-field-input'), + (TEXTNS,u'user-index-mark'), + (TEXTNS,u'user-index-mark-end'), + (TEXTNS,u'user-index-mark-start'), + (TEXTNS,u'variable-get'), + (TEXTNS,u'variable-input'), + (TEXTNS,u'variable-set'), + (TEXTNS,u'word-count'), + ), + (TEXTNS,u'page') : ( + ), + (TEXTNS,u'page-count') : ( + ), + (TEXTNS,u'page-continuation') : ( + ), + (TEXTNS,u'page-number') : ( + ), + (TEXTNS,u'page-sequence') : ( + (TEXTNS,u'page'), + ), + (TEXTNS,u'page-variable-get') : ( + ), + (TEXTNS,u'page-variable-set') : ( + ), + (TEXTNS,u'paragraph-count') : ( + ), + (TEXTNS,u'placeholder') : ( + ), + (TEXTNS,u'print-date') : ( + ), + (TEXTNS,u'print-time') : ( + ), + (TEXTNS,u'printed-by') : ( + ), + (TEXTNS,u'reference-mark') : ( + ), + (TEXTNS,u'reference-mark-end') : ( + ), +# allowed_children + (TEXTNS,u'reference-mark-start') : ( + ), + (TEXTNS,u'reference-ref') : ( + ), + (TEXTNS,u'ruby') : ( + (TEXTNS,u'ruby-base'), + (TEXTNS,u'ruby-text'), + ), + (TEXTNS,u'ruby-base') : ( + (DR3DNS,u'scene'), + (DRAWNS,u'a'), + (DRAWNS,u'caption'), + (DRAWNS,u'circle'), + (DRAWNS,u'connector'), + (DRAWNS,u'control'), + (DRAWNS,u'custom-shape'), + (DRAWNS,u'ellipse'), + (DRAWNS,u'frame'), + (DRAWNS,u'g'), + (DRAWNS,u'line'), + (DRAWNS,u'measure'), + (DRAWNS,u'page-thumbnail'), + (DRAWNS,u'path'), + (DRAWNS,u'polygon'), + (DRAWNS,u'polyline'), + (DRAWNS,u'rect'), + (DRAWNS,u'regular-polygon'), + (OFFICENS,u'annotation'), + (PRESENTATIONNS,u'date-time'), + (PRESENTATIONNS,u'footer'), + (PRESENTATIONNS,u'header'), + (TEXTNS,u'a'), + (TEXTNS,u'alphabetical-index-mark'), + (TEXTNS,u'alphabetical-index-mark-end'), + (TEXTNS,u'alphabetical-index-mark-start'), + (TEXTNS,u'author-initials'), + (TEXTNS,u'author-name'), + (TEXTNS,u'bibliography-mark'), + (TEXTNS,u'bookmark'), + (TEXTNS,u'bookmark-end'), + (TEXTNS,u'bookmark-ref'), + (TEXTNS,u'bookmark-start'), + (TEXTNS,u'change'), + (TEXTNS,u'change-end'), + (TEXTNS,u'change-start'), + (TEXTNS,u'chapter'), + (TEXTNS,u'conditional-text'), + (TEXTNS,u'creation-date'), + (TEXTNS,u'creation-time'), + (TEXTNS,u'creator'), + (TEXTNS,u'database-display'), + (TEXTNS,u'database-name'), + (TEXTNS,u'database-next'), + (TEXTNS,u'database-row-number'), + (TEXTNS,u'database-row-select'), + (TEXTNS,u'date'), + (TEXTNS,u'dde-connection'), + (TEXTNS,u'description'), + (TEXTNS,u'editing-cycles'), + (TEXTNS,u'editing-duration'), + (TEXTNS,u'execute-macro'), + (TEXTNS,u'expression'), + (TEXTNS,u'file-name'), + (TEXTNS,u'hidden-paragraph'), + (TEXTNS,u'hidden-text'), + (TEXTNS,u'initial-creator'), + (TEXTNS,u'keywords'), + (TEXTNS,u'line-break'), + (TEXTNS,u'measure'), + (TEXTNS,u'modification-date'), + (TEXTNS,u'modification-time'), + (TEXTNS,u'note'), + (TEXTNS,u'note-ref'), + (TEXTNS,u'page-count'), + (TEXTNS,u'paragraph-count'), + (TEXTNS,u'word-count'), + (TEXTNS,u'character-count'), + (TEXTNS,u'table-count'), + (TEXTNS,u'image-count'), + (TEXTNS,u'object-count'), + (TEXTNS,u'page-continuation'), + (TEXTNS,u'page-number'), + (TEXTNS,u'page-variable-get'), + (TEXTNS,u'page-variable-set'), + (TEXTNS,u'placeholder'), + (TEXTNS,u'print-date'), + (TEXTNS,u'print-time'), + (TEXTNS,u'printed-by'), + (TEXTNS,u'reference-mark'), + (TEXTNS,u'reference-mark-end'), + (TEXTNS,u'reference-mark-start'), + (TEXTNS,u'reference-ref'), + (TEXTNS,u'ruby'), + (TEXTNS,u's'), + (TEXTNS,u'script'), + (TEXTNS,u'sender-city'), + (TEXTNS,u'sender-company'), + (TEXTNS,u'sender-country'), + (TEXTNS,u'sender-email'), + (TEXTNS,u'sender-fax'), + (TEXTNS,u'sender-firstname'), + (TEXTNS,u'sender-initials'), + (TEXTNS,u'sender-lastname'), + (TEXTNS,u'sender-phone-private'), + (TEXTNS,u'sender-phone-work'), + (TEXTNS,u'sender-position'), + (TEXTNS,u'sender-postal-code'), + (TEXTNS,u'sender-state-or-province'), + (TEXTNS,u'sender-street'), + (TEXTNS,u'sender-title'), + (TEXTNS,u'sequence'), + (TEXTNS,u'sequence-ref'), + (TEXTNS,u'sheet-name'), + (TEXTNS,u'soft-page-break'), + (TEXTNS,u'span'), + (TEXTNS,u'subject'), + (TEXTNS,u'tab'), + (TEXTNS,u'table-formula'), + (TEXTNS,u'template-name'), + (TEXTNS,u'text-input'), + (TEXTNS,u'time'), + (TEXTNS,u'title'), + (TEXTNS,u'toc-mark'), + (TEXTNS,u'toc-mark-end'), + (TEXTNS,u'toc-mark-start'), + (TEXTNS,u'user-defined'), + (TEXTNS,u'user-field-get'), + (TEXTNS,u'user-field-input'), + (TEXTNS,u'user-index-mark'), + (TEXTNS,u'user-index-mark-end'), + (TEXTNS,u'user-index-mark-start'), + (TEXTNS,u'variable-get'), + (TEXTNS,u'variable-input'), + (TEXTNS,u'variable-set'), + ), +# allowed_children + (TEXTNS,u'ruby-text') : ( + ), + (TEXTNS,u's') : ( + ), + (TEXTNS,u'script') : ( + ), + (TEXTNS,u'section') : ( + (DR3DNS,u'scene'), + (DRAWNS,u'a'), + (DRAWNS,u'caption'), + (DRAWNS,u'circle'), + (DRAWNS,u'connector'), + (DRAWNS,u'control'), + (DRAWNS,u'custom-shape'), + (DRAWNS,u'ellipse'), + (DRAWNS,u'frame'), + (DRAWNS,u'g'), + (DRAWNS,u'line'), + (DRAWNS,u'measure'), + (DRAWNS,u'page-thumbnail'), + (DRAWNS,u'path'), + (DRAWNS,u'polygon'), + (DRAWNS,u'polyline'), + (DRAWNS,u'rect'), + (DRAWNS,u'regular-polygon'), + (OFFICENS,u'dde-source'), + (TABLENS,u'table'), + (TEXTNS,u'alphabetical-index'), + (TEXTNS,u'bibliography'), + (TEXTNS,u'change'), + (TEXTNS,u'change-end'), + (TEXTNS,u'change-start'), + (TEXTNS,u'h'), + (TEXTNS,u'illustration-index'), + (TEXTNS,u'list'), + (TEXTNS,u'numbered-paragraph'), + (TEXTNS,u'object-index'), + (TEXTNS,u'p'), + (TEXTNS,u'section'), + (TEXTNS,u'section-source'), + (TEXTNS,u'soft-page-break'), + (TEXTNS,u'table-index'), + (TEXTNS,u'table-of-content'), + (TEXTNS,u'user-index'), + ), + (TEXTNS,u'section-source') : ( + ), + (TEXTNS,u'sender-city') : ( + ), + (TEXTNS,u'sender-company') : ( + ), + (TEXTNS,u'sender-country') : ( + ), +# allowed_children + (TEXTNS,u'sender-email') : ( + ), + (TEXTNS,u'sender-fax') : ( + ), + (TEXTNS,u'sender-firstname') : ( + ), + (TEXTNS,u'sender-initials') : ( + ), + (TEXTNS,u'sender-lastname') : ( + ), + (TEXTNS,u'sender-phone-private') : ( + ), + (TEXTNS,u'sender-phone-work') : ( + ), + (TEXTNS,u'sender-position') : ( + ), + (TEXTNS,u'sender-postal-code') : ( + ), + (TEXTNS,u'sender-state-or-province') : ( + ), + (TEXTNS,u'sender-street') : ( + ), + (TEXTNS,u'sender-title') : ( + ), + (TEXTNS,u'sequence') : ( + ), + (TEXTNS,u'sequence-decl') : ( + ), + (TEXTNS,u'sequence-decls') : ( + (TEXTNS,u'sequence-decl'), + ), + (TEXTNS,u'sequence-ref') : ( + ), + (TEXTNS,u'sheet-name') : ( + ), + (TEXTNS,u'soft-page-break') : ( + ), + (TEXTNS,u'sort-key') : ( + ), +# allowed_children + (TEXTNS,u'span') : ( + (DR3DNS,u'scene'), + (DRAWNS,u'a'), + (DRAWNS,u'caption'), + (DRAWNS,u'circle'), + (DRAWNS,u'connector'), + (DRAWNS,u'control'), + (DRAWNS,u'custom-shape'), + (DRAWNS,u'ellipse'), + (DRAWNS,u'frame'), + (DRAWNS,u'g'), + (DRAWNS,u'line'), + (DRAWNS,u'measure'), + (DRAWNS,u'page-thumbnail'), + (DRAWNS,u'path'), + (DRAWNS,u'polygon'), + (DRAWNS,u'polyline'), + (DRAWNS,u'rect'), + (DRAWNS,u'regular-polygon'), + (OFFICENS,u'annotation'), + (PRESENTATIONNS,u'date-time'), + (PRESENTATIONNS,u'footer'), + (PRESENTATIONNS,u'header'), + (TEXTNS,u'a'), + (TEXTNS,u'alphabetical-index-mark'), + (TEXTNS,u'alphabetical-index-mark-end'), + (TEXTNS,u'alphabetical-index-mark-start'), + (TEXTNS,u'author-initials'), + (TEXTNS,u'author-name'), + (TEXTNS,u'bibliography-mark'), + (TEXTNS,u'bookmark'), + (TEXTNS,u'bookmark-end'), + (TEXTNS,u'bookmark-ref'), + (TEXTNS,u'bookmark-start'), + (TEXTNS,u'change'), + (TEXTNS,u'change-end'), + (TEXTNS,u'change-start'), + (TEXTNS,u'chapter'), + (TEXTNS,u'conditional-text'), + (TEXTNS,u'creation-date'), + (TEXTNS,u'creation-time'), + (TEXTNS,u'creator'), + (TEXTNS,u'database-display'), + (TEXTNS,u'database-name'), + (TEXTNS,u'database-next'), + (TEXTNS,u'database-row-number'), + (TEXTNS,u'database-row-select'), + (TEXTNS,u'date'), + (TEXTNS,u'dde-connection'), + (TEXTNS,u'description'), + (TEXTNS,u'editing-cycles'), + (TEXTNS,u'editing-duration'), + (TEXTNS,u'execute-macro'), + (TEXTNS,u'expression'), + (TEXTNS,u'file-name'), + (TEXTNS,u'hidden-paragraph'), + (TEXTNS,u'hidden-text'), + (TEXTNS,u'initial-creator'), + (TEXTNS,u'keywords'), + (TEXTNS,u'line-break'), + (TEXTNS,u'measure'), + (TEXTNS,u'modification-date'), + (TEXTNS,u'modification-time'), + (TEXTNS,u'note'), + (TEXTNS,u'note-ref'), + (TEXTNS,u'page-count'), + (TEXTNS,u'paragraph-count'), + (TEXTNS,u'word-count'), + (TEXTNS,u'character-count'), + (TEXTNS,u'table-count'), + (TEXTNS,u'image-count'), + (TEXTNS,u'object-count'), + (TEXTNS,u'page-continuation'), + (TEXTNS,u'page-number'), + (TEXTNS,u'page-variable-get'), + (TEXTNS,u'page-variable-set'), + (TEXTNS,u'placeholder'), + (TEXTNS,u'print-date'), + (TEXTNS,u'print-time'), + (TEXTNS,u'printed-by'), + (TEXTNS,u'reference-mark'), + (TEXTNS,u'reference-mark-end'), + (TEXTNS,u'reference-mark-start'), + (TEXTNS,u'reference-ref'), + (TEXTNS,u'ruby'), + (TEXTNS,u's'), + (TEXTNS,u'script'), + (TEXTNS,u'sender-city'), + (TEXTNS,u'sender-company'), + (TEXTNS,u'sender-country'), + (TEXTNS,u'sender-email'), + (TEXTNS,u'sender-fax'), + (TEXTNS,u'sender-firstname'), + (TEXTNS,u'sender-initials'), + (TEXTNS,u'sender-lastname'), + (TEXTNS,u'sender-phone-private'), + (TEXTNS,u'sender-phone-work'), + (TEXTNS,u'sender-position'), + (TEXTNS,u'sender-postal-code'), + (TEXTNS,u'sender-state-or-province'), + (TEXTNS,u'sender-street'), + (TEXTNS,u'sender-title'), + (TEXTNS,u'sequence'), + (TEXTNS,u'sequence-ref'), + (TEXTNS,u'sheet-name'), + (TEXTNS,u'soft-page-break'), + (TEXTNS,u'span'), + (TEXTNS,u'subject'), + (TEXTNS,u'tab'), + (TEXTNS,u'table-formula'), + (TEXTNS,u'template-name'), + (TEXTNS,u'text-input'), + (TEXTNS,u'time'), + (TEXTNS,u'title'), + (TEXTNS,u'toc-mark'), + (TEXTNS,u'toc-mark-end'), + (TEXTNS,u'toc-mark-start'), + (TEXTNS,u'user-defined'), + (TEXTNS,u'user-field-get'), + (TEXTNS,u'user-field-input'), + (TEXTNS,u'user-index-mark'), + (TEXTNS,u'user-index-mark-end'), + (TEXTNS,u'user-index-mark-start'), + (TEXTNS,u'variable-get'), + (TEXTNS,u'variable-input'), + (TEXTNS,u'variable-set'), + ), +# allowed_children + (TEXTNS,u'subject') : ( + ), + (TEXTNS,u'tab') : ( + ), + (TEXTNS,u'table-count') : ( + ), + (TEXTNS,u'table-formula') : ( + ), + (TEXTNS,u'table-index') : ( + (TEXTNS,u'index-body'), + (TEXTNS,u'table-index-source'), + ), + (TEXTNS,u'table-index-entry-template') : ( + (TEXTNS,u'index-entry-page-number'), + (TEXTNS,u'index-entry-span'), + (TEXTNS,u'index-entry-tab-stop'), + (TEXTNS,u'index-entry-text'), + ), + (TEXTNS,u'table-index-source') : ( + (TEXTNS,u'index-title-template'), + (TEXTNS,u'table-index-entry-template'), + ), + (TEXTNS,u'table-of-content') : ( + (TEXTNS,u'index-body'), + (TEXTNS,u'table-of-content-source'), + ), + (TEXTNS,u'table-of-content-entry-template') : ( + (TEXTNS,u'index-entry-chapter'), + (TEXTNS,u'index-entry-link-end'), + (TEXTNS,u'index-entry-link-start'), + (TEXTNS,u'index-entry-page-number'), + (TEXTNS,u'index-entry-span'), + (TEXTNS,u'index-entry-tab-stop'), + (TEXTNS,u'index-entry-text'), + ), + (TEXTNS,u'table-of-content-source') : ( + (TEXTNS,u'index-source-styles'), + (TEXTNS,u'index-title-template'), + (TEXTNS,u'table-of-content-entry-template'), + ), + (TEXTNS,u'template-name') : ( + ), + (TEXTNS,u'text-input') : ( + ), + (TEXTNS,u'time') : ( + ), + (TEXTNS,u'title') : ( + ), + (TEXTNS,u'toc-mark') : ( + ), + (TEXTNS,u'toc-mark-end') : ( + ), + (TEXTNS,u'toc-mark-start') : ( + ), +# allowed_children + (TEXTNS,u'tracked-changes') : ( + (TEXTNS,u'changed-region'), + ), + (TEXTNS,u'user-defined') : ( + ), + (TEXTNS,u'user-field-decl') : ( + ), + (TEXTNS,u'user-field-decls') : ( + (TEXTNS,u'user-field-decl'), + ), + (TEXTNS,u'user-field-get') : ( + ), + (TEXTNS,u'user-field-input') : ( + ), + (TEXTNS,u'user-index') : ( + (TEXTNS,u'index-body'), + (TEXTNS,u'user-index-source'), + ), + (TEXTNS,u'user-index-entry-template') : ( + (TEXTNS,u'index-entry-chapter'), + (TEXTNS,u'index-entry-page-number'), + (TEXTNS,u'index-entry-span'), + (TEXTNS,u'index-entry-tab-stop'), + (TEXTNS,u'index-entry-text'), + ), +# allowed_children + (TEXTNS,u'user-index-mark') : ( + ), + (TEXTNS,u'user-index-mark-end') : ( + ), + (TEXTNS,u'user-index-mark-start') : ( + ), + (TEXTNS,u'user-index-source') : ( + (TEXTNS,u'index-source-styles'), + (TEXTNS,u'index-title-template'), + (TEXTNS,u'user-index-entry-template'), + ), + (TEXTNS,u'variable-decl') : ( + ), + (TEXTNS,u'variable-decls') : ( + (TEXTNS,u'variable-decl'), + ), + (TEXTNS,u'variable-get') : ( + ), + (TEXTNS,u'variable-input') : ( + ), + (TEXTNS,u'variable-set') : ( + ), + (TEXTNS,u'word-count') : ( + ), +} + +# +# List of elements that allows text nodes +# +allows_text = ( + (CONFIGNS,u'config-item'), + (DCNS,u'creator'), + (DCNS,u'date'), + (DCNS,u'description'), + (DCNS,u'language'), + (DCNS,u'subject'), + (DCNS,u'title'), +# Completes Dublin Core start +# (DCNS,'contributor'), +# (DCNS,'coverage'), +# (DCNS,'format'), +# (DCNS,'identifier'), +# (DCNS,'publisher'), +# (DCNS,'relation'), +# (DCNS,'rights'), +# (DCNS,'source'), +# (DCNS,'type'), +# Completes Dublin Core end + (FORMNS,u'item'), + (FORMNS,u'option'), + (MATHNS,u'math'), + (METANS,u'creation-date'), + (METANS,u'date-string'), + (METANS,u'editing-cycles'), + (METANS,u'editing-duration'), +# allows_text + (METANS,u'generator'), + (METANS,u'initial-creator'), + (METANS,u'keyword'), + (METANS,u'print-date'), + (METANS,u'printed-by'), + (METANS,u'user-defined'), + (NUMBERNS,u'currency-symbol'), + (NUMBERNS,u'embedded-text'), + (NUMBERNS,u'text'), + (OFFICENS,u'binary-data'), + (OFFICENS,u'script'), + (PRESENTATIONNS,u'date-time-decl'), + (PRESENTATIONNS,u'footer-decl'), + (PRESENTATIONNS,u'header-decl'), + (SVGNS,u'desc'), + (SVGNS,u'title'), + (TEXTNS,u'a'), + (TEXTNS,u'author-initials'), + (TEXTNS,u'author-name'), + (TEXTNS,u'bibliography-mark'), + (TEXTNS,u'bookmark-ref'), + (TEXTNS,u'chapter'), + (TEXTNS,u'character-count'), + (TEXTNS,u'conditional-text'), + (TEXTNS,u'creation-date'), + (TEXTNS,u'creation-time'), + (TEXTNS,u'creator'), + (TEXTNS,u'database-display'), + (TEXTNS,u'database-name'), + (TEXTNS,u'database-row-number'), + (TEXTNS,u'date'), + (TEXTNS,u'dde-connection'), + (TEXTNS,u'description'), + (TEXTNS,u'editing-cycles'), + (TEXTNS,u'editing-duration'), + (TEXTNS,u'execute-macro'), + (TEXTNS,u'expression'), + (TEXTNS,u'file-name'), + (TEXTNS,u'h'), + (TEXTNS,u'hidden-paragraph'), + (TEXTNS,u'hidden-text'), + (TEXTNS,u'image-count'), +# allowed_children + (TEXTNS,u'index-entry-span'), + (TEXTNS,u'index-title-template'), + (TEXTNS,u'initial-creator'), + (TEXTNS,u'keywords'), + (TEXTNS,u'linenumbering-separator'), + (TEXTNS,u'measure'), + (TEXTNS,u'modification-date'), + (TEXTNS,u'modification-time'), + (TEXTNS,u'note-citation'), + (TEXTNS,u'note-continuation-notice-backward'), + (TEXTNS,u'note-continuation-notice-forward'), + (TEXTNS,u'note-ref'), + (TEXTNS,u'number'), + (TEXTNS,u'object-count'), + (TEXTNS,u'p'), + (TEXTNS,u'page-continuation'), + (TEXTNS,u'page-count'), + (TEXTNS,u'page-number'), + (TEXTNS,u'page-variable-get'), + (TEXTNS,u'page-variable-set'), + (TEXTNS,u'paragraph-count'), + (TEXTNS,u'placeholder'), + (TEXTNS,u'print-date'), + (TEXTNS,u'print-time'), + (TEXTNS,u'printed-by'), + (TEXTNS,u'reference-ref'), + (TEXTNS,u'ruby-base'), + (TEXTNS,u'ruby-text'), + (TEXTNS,u'script'), + (TEXTNS,u'sender-city'), + (TEXTNS,u'sender-company'), + (TEXTNS,u'sender-country'), + (TEXTNS,u'sender-email'), + (TEXTNS,u'sender-fax'), + (TEXTNS,u'sender-firstname'), + (TEXTNS,u'sender-initials'), + (TEXTNS,u'sender-lastname'), + (TEXTNS,u'sender-phone-private'), + (TEXTNS,u'sender-phone-work'), + (TEXTNS,u'sender-position'), + (TEXTNS,u'sender-postal-code'), + (TEXTNS,u'sender-state-or-province'), + (TEXTNS,u'sender-street'), + (TEXTNS,u'sender-title'), + (TEXTNS,u'sequence'), + (TEXTNS,u'sequence-ref'), + (TEXTNS,u'sheet-name'), +# allowed_children + (TEXTNS,u'span'), + (TEXTNS,u'subject'), + (TEXTNS,u'table-count'), + (TEXTNS,u'table-formula'), + (TEXTNS,u'template-name'), + (TEXTNS,u'text-input'), + (TEXTNS,u'time'), + (TEXTNS,u'title'), + (TEXTNS,u'user-defined'), + (TEXTNS,u'user-field-get'), + (TEXTNS,u'user-field-input'), + (TEXTNS,u'variable-get'), + (TEXTNS,u'variable-input'), + (TEXTNS,u'variable-set'), + (TEXTNS,u'word-count'), +) + +# Only the elements with at least one required attribute is listed + +required_attributes = { + (ANIMNS,u'animate'): ( + (SMILNS,u'attributeName'), + ), + (ANIMNS,u'animateColor'): ( + (SMILNS,u'attributeName'), + ), + (ANIMNS,u'animateMotion'): ( + (SMILNS,u'attributeName'), + ), + (ANIMNS,u'animateTransform'): ( + (SVGNS,u'type'), + (SMILNS,u'attributeName'), + ), + (ANIMNS,u'command'): ( + (ANIMNS,u'command'), + ), + (ANIMNS,u'param'): ( + (ANIMNS,u'name'), + (ANIMNS,u'value'), + ), + (ANIMNS,u'set'): ( + (SMILNS,u'attributeName'), + ), +# required_attributes + (ANIMNS,u'transitionFilter'): ( + (SMILNS,u'type'), + ), + (CHARTNS,u'axis'): ( + (CHARTNS,u'dimension'), + ), + (CHARTNS,u'chart'): ( + (CHARTNS,u'class'), + ), + (CHARTNS,u'symbol-image'): ( + (XLINKNS,u'href'), + ), + (CONFIGNS,u'config-item'): ( + (CONFIGNS,u'type'), + (CONFIGNS,u'name'), + ), + (CONFIGNS,u'config-item-map-indexed'): ( + (CONFIGNS,u'name'), + ), + (CONFIGNS,u'config-item-map-named'): ( + (CONFIGNS,u'name'), + ), + (CONFIGNS,u'config-item-set'): ( + (CONFIGNS,u'name'), + ), +# required_attributes + (NUMBERNS,u'boolean-style'): ( + (STYLENS,u'name'), + ), + (NUMBERNS,u'currency-style'): ( + (STYLENS,u'name'), + ), + (NUMBERNS,u'date-style'): ( + (STYLENS,u'name'), + ), + (NUMBERNS,u'embedded-text'): ( + (NUMBERNS,u'position'), + ), + (NUMBERNS,u'number-style'): ( + (STYLENS,u'name'), + ), + (NUMBERNS,u'percentage-style'): ( + (STYLENS,u'name'), + ), + (NUMBERNS,u'text-style'): ( + (STYLENS,u'name'), + ), + (NUMBERNS,u'time-style'): ( + (STYLENS,u'name'), + ), + (DR3DNS,u'extrude'): ( + (SVGNS,u'd'), + (SVGNS,u'viewBox'), + ), + (DR3DNS,u'light'): ( + (DR3DNS,u'direction'), + ), + (DR3DNS,u'rotate'): ( + (SVGNS,u'viewBox'), + (SVGNS,u'd'), + ), +# required_attributes + (DRAWNS,u'a'): ( + (XLINKNS,u'href'), + ), + (DRAWNS,u'area-circle'): ( + (SVGNS,u'cy'), + (SVGNS,u'cx'), + (SVGNS,u'r'), + ), + (DRAWNS,u'area-polygon'): ( + (SVGNS,u'height'), + (SVGNS,u'width'), + (DRAWNS,u'points'), + (SVGNS,u'y'), + (SVGNS,u'x'), + (SVGNS,u'viewBox'), + ), + (DRAWNS,u'area-rectangle'): ( + (SVGNS,u'y'), + (SVGNS,u'x'), + (SVGNS,u'height'), + (SVGNS,u'width'), + ), + (DRAWNS,u'contour-path'): ( + (DRAWNS,u'recreate-on-edit'), + (SVGNS,u'viewBox'), + (SVGNS,u'd'), + ), + (DRAWNS,u'contour-polygon'): ( + (DRAWNS,u'points'), + (DRAWNS,u'recreate-on-edit'), + (SVGNS,u'viewBox'), + ), + (DRAWNS,u'control'): ( + (DRAWNS,u'control'), + ), + (DRAWNS,u'fill-image'): ( + (XLINKNS,u'href'), + (DRAWNS,u'name'), + ), + (DRAWNS,u'floating-frame'): ( + (XLINKNS,u'href'), + ), + (DRAWNS,u'glue-point'): ( + (SVGNS,u'y'), + (SVGNS,u'x'), + (DRAWNS,u'id'), + (DRAWNS,u'escape-direction'), + ), +# required_attributes + (DRAWNS,u'gradient'): ( + (DRAWNS,u'style'), + ), + (DRAWNS,u'handle'): ( + (DRAWNS,u'handle-position'), + ), + (DRAWNS,u'hatch'): ( + (DRAWNS,u'style'), + (DRAWNS,u'name'), + ), + (DRAWNS,u'layer'): ( + (DRAWNS,u'name'), + ), + (DRAWNS,u'line'): ( + (SVGNS,u'y1'), + (SVGNS,u'x2'), + (SVGNS,u'x1'), + (SVGNS,u'y2'), + ), + (DRAWNS,u'marker'): ( + (SVGNS,u'd'), + (DRAWNS,u'name'), + (SVGNS,u'viewBox'), + ), + (DRAWNS,u'measure'): ( + (SVGNS,u'y1'), + (SVGNS,u'x2'), + (SVGNS,u'x1'), + (SVGNS,u'y2'), + ), + (DRAWNS,u'opacity'): ( + (DRAWNS,u'style'), + ), + (DRAWNS,u'page'): ( + (DRAWNS,u'master-page-name'), + ), + (DRAWNS,u'path'): ( + (SVGNS,u'd'), + (SVGNS,u'viewBox'), + ), + (DRAWNS,u'plugin'): ( + (XLINKNS,u'href'), + ), + (DRAWNS,u'polygon'): ( + (DRAWNS,u'points'), + (SVGNS,u'viewBox'), + ), +# required_attributes + (DRAWNS,u'polyline'): ( + (DRAWNS,u'points'), + (SVGNS,u'viewBox'), + ), + (DRAWNS,u'regular-polygon'): ( + (DRAWNS,u'corners'), + ), + (DRAWNS,u'stroke-dash'): ( + (DRAWNS,u'name'), + ), + (FORMNS,u'button'): ( + (FORMNS,u'id'), + ), + (FORMNS,u'checkbox'): ( + (FORMNS,u'id'), + ), + (FORMNS,u'combobox'): ( + (FORMNS,u'id'), + ), + (FORMNS,u'connection-resource'): ( + (XLINKNS,u'href'), + ), + (FORMNS,u'date'): ( + (FORMNS,u'id'), + ), + (FORMNS,u'file'): ( + (FORMNS,u'id'), + ), + (FORMNS,u'fixed-text'): ( + (FORMNS,u'id'), + ), + (FORMNS,u'formatted-text'): ( + (FORMNS,u'id'), + ), + (FORMNS,u'frame'): ( + (FORMNS,u'id'), + ), + (FORMNS,u'generic-control'): ( + (FORMNS,u'id'), + ), + (FORMNS,u'grid'): ( + (FORMNS,u'id'), + ), + (FORMNS,u'hidden'): ( + (FORMNS,u'id'), + ), +# required_attributes + (FORMNS,u'image'): ( + (FORMNS,u'id'), + ), + (FORMNS,u'image-frame'): ( + (FORMNS,u'id'), + ), + (FORMNS,u'list-property'): ( + (FORMNS,u'property-name'), + ), + (FORMNS,u'list-value'): ( + (OFFICENS,u'string-value'), + ), + (FORMNS,u'listbox'): ( + (FORMNS,u'id'), + ), + (FORMNS,u'number'): ( + (FORMNS,u'id'), + ), + (FORMNS,u'password'): ( + (FORMNS,u'id'), + ), + (FORMNS,u'property'): ( + (FORMNS,u'property-name'), + ), + (FORMNS,u'radio'): ( + (FORMNS,u'id'), + ), + (FORMNS,u'text'): ( + (FORMNS,u'id'), + ), + (FORMNS,u'textarea'): ( + (FORMNS,u'id'), + ), + (FORMNS,u'time'): ( + (FORMNS,u'id'), + ), + (FORMNS,u'value-range'): ( + (FORMNS,u'id'), + ), + (MANIFESTNS,u'algorithm') : ( + (MANIFESTNS,u'algorithm-name'), + (MANIFESTNS,u'initialisation-vector'), + ), + (MANIFESTNS,u'encryption-data') : ( + (MANIFESTNS,u'checksum-type'), + (MANIFESTNS,u'checksum'), + ), + (MANIFESTNS,u'file-entry') : ( + (MANIFESTNS,u'full-path'), + (MANIFESTNS,u'media-type'), + ), + (MANIFESTNS,u'key-derivation') : ( + (MANIFESTNS,u'key-derivation-name'), + (MANIFESTNS,u'salt'), + (MANIFESTNS,u'iteration-count'), + ), +# required_attributes + (METANS,u'template'): ( + (XLINKNS,u'href'), + ), + (METANS,u'user-defined'): ( + (METANS,u'name'), + ), + (OFFICENS,u'dde-source'): ( + (OFFICENS,u'dde-topic'), + (OFFICENS,u'dde-application'), + (OFFICENS,u'dde-item'), + ), + (OFFICENS,u'document'): ( + (OFFICENS,u'mimetype'), + ), + (OFFICENS,u'script'): ( + (SCRIPTNS,u'language'), + ), + (PRESENTATIONNS,u'date-time-decl'): ( + (PRESENTATIONNS,u'source'), + (PRESENTATIONNS,u'name'), + ), + (PRESENTATIONNS,u'dim'): ( + (DRAWNS,u'color'), + (DRAWNS,u'shape-id'), + ), +# required_attributes + (PRESENTATIONNS,u'event-listener'): ( + (PRESENTATIONNS,u'action'), + (SCRIPTNS,u'event-name'), + ), + (PRESENTATIONNS,u'footer-decl'): ( + (PRESENTATIONNS,u'name'), + ), + (PRESENTATIONNS,u'header-decl'): ( + (PRESENTATIONNS,u'name'), + ), + (PRESENTATIONNS,u'hide-shape'): ( + (DRAWNS,u'shape-id'), + ), + (PRESENTATIONNS,u'hide-text'): ( + (DRAWNS,u'shape-id'), + ), + (PRESENTATIONNS,u'placeholder'): ( + (SVGNS,u'y'), + (SVGNS,u'x'), + (SVGNS,u'height'), + (PRESENTATIONNS,u'object'), + (SVGNS,u'width'), + ), + (PRESENTATIONNS,u'play'): ( + (DRAWNS,u'shape-id'), + ), + (PRESENTATIONNS,u'show'): ( + (PRESENTATIONNS,u'name'), + (PRESENTATIONNS,u'pages'), + ), + (PRESENTATIONNS,u'show-shape'): ( + (DRAWNS,u'shape-id'), + ), + (PRESENTATIONNS,u'show-text'): ( + (DRAWNS,u'shape-id'), + ), + (PRESENTATIONNS,u'sound'): ( + (XLINKNS,u'href'), + ), + (SCRIPTNS,u'event-listener'): ( + (SCRIPTNS,u'language'), + (SCRIPTNS,u'event-name'), + ), + (STYLENS,u'column'): ( + (STYLENS,u'rel-width'), + ), +# required_attributes + (STYLENS,u'column-sep'): ( + (STYLENS,u'width'), + ), + (STYLENS,u'columns'): ( + (FONS,u'column-count'), + ), + (STYLENS,u'font-face'): ( + (STYLENS,u'name'), + ), + (STYLENS,u'handout-master'): ( + (STYLENS,u'page-layout-name'), + ), + (STYLENS,u'map'): ( + (STYLENS,u'apply-style-name'), + (STYLENS,u'condition'), + ), + (STYLENS,u'master-page'): ( + (STYLENS,u'page-layout-name'), + (STYLENS,u'name'), + ), + (STYLENS,u'page-layout'): ( + (STYLENS,u'name'), + ), + (STYLENS,u'presentation-page-layout'): ( + (STYLENS,u'name'), + ), + (STYLENS,u'style'): ( + (STYLENS,u'name'), + ), + (STYLENS,u'tab-stop'): ( + (STYLENS,u'position'), + ), + (SVGNS,u'definition-src'): ( + (XLINKNS,u'href'), + ), + (SVGNS,u'font-face-uri'): ( + (XLINKNS,u'href'), + ), + (SVGNS,u'linearGradient'): ( + (DRAWNS,u'name'), + ), + (SVGNS,u'radialGradient'): ( + (DRAWNS,u'name'), + ), + (SVGNS,u'stop'): ( + (SVGNS,u'offset'), + ), +# required_attributes + (TABLENS,u'body'): ( + (TEXTNS,u'style-name'), + ), + (TABLENS,u'cell-address'): ( + (TABLENS,u'column'), + (TABLENS,u'table'), + (TABLENS,u'row'), + ), + (TABLENS,u'cell-content-change'): ( + (TABLENS,u'id'), + ), + (TABLENS,u'cell-range-source'): ( + (TABLENS,u'last-row-spanned'), + (TABLENS,u'last-column-spanned'), + (XLINKNS,u'href'), + (TABLENS,u'name'), + ), + (TABLENS,u'consolidation'): ( + (TABLENS,u'function'), + (TABLENS,u'source-cell-range-addresses'), + (TABLENS,u'target-cell-address'), + ), + (TABLENS,u'content-validation'): ( + (TABLENS,u'name'), + ), + (TABLENS,u'data-pilot-display-info'): ( + (TABLENS,u'member-count'), + (TABLENS,u'data-field'), + (TABLENS,u'enabled'), + (TABLENS,u'display-member-mode'), + ), +# required_attributes + (TABLENS,u'data-pilot-field'): ( + (TABLENS,u'source-field-name'), + ), + (TABLENS,u'data-pilot-field-reference'): ( + (TABLENS,u'field-name'), + (TABLENS,u'type'), + ), + (TABLENS,u'data-pilot-group'): ( + (TABLENS,u'name'), + ), + (TABLENS,u'data-pilot-group-member'): ( + (TABLENS,u'name'), + ), + (TABLENS,u'data-pilot-groups'): ( + (TABLENS,u'source-field-name'), + (TABLENS,u'step'), + (TABLENS,u'grouped-by'), + ), + (TABLENS,u'data-pilot-layout-info'): ( + (TABLENS,u'add-empty-lines'), + (TABLENS,u'layout-mode'), + ), + (TABLENS,u'data-pilot-member'): ( + (TABLENS,u'name'), + ), + (TABLENS,u'data-pilot-sort-info'): ( + (TABLENS,u'order'), + ), + (TABLENS,u'data-pilot-subtotal'): ( + (TABLENS,u'function'), + ), + (TABLENS,u'data-pilot-table'): ( + (TABLENS,u'target-range-address'), + (TABLENS,u'name'), + ), + (TABLENS,u'database-range'): ( + (TABLENS,u'target-range-address'), + ), +# required_attributes + (TABLENS,u'database-source-query'): ( + (TABLENS,u'query-name'), + (TABLENS,u'database-name'), + ), + (TABLENS,u'database-source-sql'): ( + (TABLENS,u'database-name'), + (TABLENS,u'sql-statement'), + ), + (TABLENS,u'database-source-table'): ( + (TABLENS,u'database-table-name'), + (TABLENS,u'database-name'), + ), + (TABLENS,u'deletion'): ( + (TABLENS,u'position'), + (TABLENS,u'type'), + (TABLENS,u'id'), + ), + (TABLENS,u'dependency'): ( + (TABLENS,u'id'), + ), + (TABLENS,u'even-columns'): ( + (TEXTNS,u'style-name'), + ), + (TABLENS,u'even-rows'): ( + (TEXTNS,u'style-name'), + ), + (TABLENS,u'filter-condition'): ( + (TABLENS,u'operator'), + (TABLENS,u'field-number'), + (TABLENS,u'value'), + ), + (TABLENS,u'first-column'): ( + (TEXTNS,u'style-name'), + ), + (TABLENS,u'first-row'): ( + (TEXTNS,u'style-name'), + ), + (TABLENS,u'insertion'): ( + (TABLENS,u'position'), + (TABLENS,u'type'), + (TABLENS,u'id'), + ), + (TABLENS,u'insertion-cut-off'): ( + (TABLENS,u'position'), + (TABLENS,u'id'), + ), +# required_attributes + (TABLENS,u'label-range'): ( + (TABLENS,u'label-cell-range-address'), + (TABLENS,u'data-cell-range-address'), + (TABLENS,u'orientation'), + ), + (TABLENS,u'last-column'): ( + (TEXTNS,u'style-name'), + ), + (TABLENS,u'last-row'): ( + (TEXTNS,u'style-name'), + ), + (TABLENS,u'movement'): ( + (TABLENS,u'id'), + ), + (TABLENS,u'named-expression'): ( + (TABLENS,u'expression'), + (TABLENS,u'name'), + ), + (TABLENS,u'named-range'): ( + (TABLENS,u'name'), + (TABLENS,u'cell-range-address'), + ), + (TABLENS,u'odd-columns'): ( + (TEXTNS,u'style-name'), + ), + (TABLENS,u'odd-rows'): ( + (TEXTNS,u'style-name'), + ), + (TABLENS,u'operation'): ( + (TABLENS,u'index'), + (TABLENS,u'name'), + ), +# required_attributes + (TABLENS,u'scenario'): ( + (TABLENS,u'is-active'), + (TABLENS,u'scenario-ranges'), + ), + (TABLENS,u'sort-by'): ( + (TABLENS,u'field-number'), + ), + (TABLENS,u'source-cell-range'): ( + (TABLENS,u'cell-range-address'), + ), + (TABLENS,u'source-service'): ( + (TABLENS,u'source-name'), + (TABLENS,u'object-name'), + (TABLENS,u'name'), + ), + (TABLENS,u'subtotal-field'): ( + (TABLENS,u'function'), + (TABLENS,u'field-number'), + ), + (TABLENS,u'subtotal-rule'): ( + (TABLENS,u'group-by-field-number'), + ), + (TABLENS,u'table-source'): ( + (XLINKNS,u'href'), + ), + (TABLENS,u'table-template'): ( + (TEXTNS,u'last-row-end-column'), + (TEXTNS,u'first-row-end-column'), + (TEXTNS,u'name'), + (TEXTNS,u'last-row-start-column'), + (TEXTNS,u'first-row-start-column'), + ), + (TEXTNS,u'a'): ( + (XLINKNS,u'href'), + ), +# required_attributes + (TEXTNS,u'alphabetical-index'): ( + (TEXTNS,u'name'), + ), + (TEXTNS,u'alphabetical-index-auto-mark-file'): ( + (XLINKNS,u'href'), + ), + (TEXTNS,u'alphabetical-index-entry-template'): ( + (TEXTNS,u'style-name'), + (TEXTNS,u'outline-level'), + ), + (TEXTNS,u'alphabetical-index-mark'): ( + (TEXTNS,u'string-value'), + ), + (TEXTNS,u'alphabetical-index-mark-end'): ( + (TEXTNS,u'id'), + ), + (TEXTNS,u'alphabetical-index-mark-start'): ( + (TEXTNS,u'id'), + ), + (TEXTNS,u'bibliography'): ( + (TEXTNS,u'name'), + ), + (TEXTNS,u'bibliography-entry-template'): ( + (TEXTNS,u'style-name'), + (TEXTNS,u'bibliography-type'), + ), + (TEXTNS,u'bibliography-mark'): ( + (TEXTNS,u'bibliography-type'), + ), + (TEXTNS,u'bookmark'): ( + (TEXTNS,u'name'), + ), +# required_attributes + (TEXTNS,u'bookmark-end'): ( + (TEXTNS,u'name'), + ), + (TEXTNS,u'bookmark-start'): ( + (TEXTNS,u'name'), + ), + (TEXTNS,u'change'): ( + (TEXTNS,u'change-id'), + ), + (TEXTNS,u'change-end'): ( + (TEXTNS,u'change-id'), + ), + (TEXTNS,u'change-start'): ( + (TEXTNS,u'change-id'), + ), + (TEXTNS,u'changed-region'): ( + (TEXTNS,u'id'), + ), + (TEXTNS,u'chapter'): ( + (TEXTNS,u'display'), + (TEXTNS,u'outline-level'), + ), + (TEXTNS,u'conditional-text'): ( + (TEXTNS,u'string-value-if-true'), + (TEXTNS,u'string-value-if-false'), + (TEXTNS,u'condition'), + ), + (TEXTNS,u'database-display'): ( + (TEXTNS,u'column-name'), + (TEXTNS,u'table-name'), + ), + (TEXTNS,u'database-name'): ( + (TEXTNS,u'table-name'), + ), + (TEXTNS,u'database-next'): ( + (TEXTNS,u'table-name'), + ), + (TEXTNS,u'database-row-number'): ( + (TEXTNS,u'table-name'), + ), + (TEXTNS,u'database-row-select'): ( + (TEXTNS,u'table-name'), + ), + (TEXTNS,u'dde-connection'): ( + (TEXTNS,u'connection-name'), + ), +# required_attributes + (TEXTNS,u'dde-connection-decl'): ( + (OFFICENS,u'dde-topic'), + (OFFICENS,u'dde-application'), + (OFFICENS,u'name'), + (OFFICENS,u'dde-item'), + ), + (TEXTNS,u'h'): ( + (TEXTNS,u'outline-level'), + ), + (TEXTNS,u'hidden-paragraph'): ( + (TEXTNS,u'condition'), + ), + (TEXTNS,u'hidden-text'): ( + (TEXTNS,u'string-value'), + (TEXTNS,u'condition'), + ), + (TEXTNS,u'illustration-index'): ( + (TEXTNS,u'name'), + ), + (TEXTNS,u'illustration-index-entry-template'): ( + (TEXTNS,u'style-name'), + ), + (TEXTNS,u'index-entry-bibliography'): ( + (TEXTNS,u'bibliography-data-field'), + ), + (TEXTNS,u'index-source-style'): ( + (TEXTNS,u'style-name'), + ), + (TEXTNS,u'index-source-styles'): ( + (TEXTNS,u'outline-level'), + ), + (TEXTNS,u'index-title'): ( + (TEXTNS,u'name'), + ), + (TEXTNS,u'list-level-style-bullet'): ( + (TEXTNS,u'bullet-char'), + (TEXTNS,u'level'), + ), + (TEXTNS,u'list-level-style-image'): ( + (TEXTNS,u'level'), + ), + (TEXTNS,u'list-level-style-number'): ( + (TEXTNS,u'level'), + ), + (TEXTNS,u'list-style'): ( + (STYLENS,u'name'), + ), +# required_attributes + (TEXTNS,u'measure'): ( + (TEXTNS,u'kind'), + ), + (TEXTNS,u'note'): ( + (TEXTNS,u'note-class'), + ), + (TEXTNS,u'note-ref'): ( + (TEXTNS,u'note-class'), + ), + (TEXTNS,u'notes-configuration'): ( + (TEXTNS,u'note-class'), + ), + (TEXTNS,u'object-index'): ( + (TEXTNS,u'name'), + ), + (TEXTNS,u'object-index-entry-template'): ( + (TEXTNS,u'style-name'), + ), + (TEXTNS,u'outline-level-style'): ( + (TEXTNS,u'level'), + ), + (TEXTNS,u'page'): ( + (TEXTNS,u'master-page-name'), + ), + (TEXTNS,u'page-continuation'): ( + (TEXTNS,u'select-page'), + ), + (TEXTNS,u'placeholder'): ( + (TEXTNS,u'placeholder-type'), + ), + (TEXTNS,u'reference-mark'): ( + (TEXTNS,u'name'), + ), + (TEXTNS,u'reference-mark-end'): ( + (TEXTNS,u'name'), + ), + (TEXTNS,u'reference-mark-start'): ( + (TEXTNS,u'name'), + ), + (TEXTNS,u'section'): ( + (TEXTNS,u'name'), + ), + (TEXTNS,u'sequence'): ( + (TEXTNS,u'name'), + ), + (TEXTNS,u'sequence-decl'): ( + (TEXTNS,u'display-outline-level'), + (TEXTNS,u'name'), + ), +# required_attributes + (TEXTNS,u'sort-key'): ( + (TEXTNS,u'key'), + ), + (TEXTNS,u'table-index'): ( + (TEXTNS,u'name'), + ), + (TEXTNS,u'table-index-entry-template'): ( + (TEXTNS,u'style-name'), + ), + (TEXTNS,u'table-of-content'): ( + (TEXTNS,u'name'), + ), + (TEXTNS,u'table-of-content-entry-template'): ( + (TEXTNS,u'style-name'), + (TEXTNS,u'outline-level'), + ), + (TEXTNS,u'toc-mark'): ( + (TEXTNS,u'string-value'), + ), + (TEXTNS,u'toc-mark-end'): ( + (TEXTNS,u'id'), + ), + (TEXTNS,u'toc-mark-start'): ( + (TEXTNS,u'id'), + ), + (TEXTNS,u'user-defined'): ( + (TEXTNS,u'name'), + ), + (TEXTNS,u'user-field-decl'): ( + (TEXTNS,u'name'), + ), + (TEXTNS,u'user-field-get'): ( + (TEXTNS,u'name'), + ), + (TEXTNS,u'user-field-input'): ( + (TEXTNS,u'name'), + ), + (TEXTNS,u'user-index'): ( + (TEXTNS,u'name'), + ), + (TEXTNS,u'user-index-entry-template'): ( + (TEXTNS,u'style-name'), + (TEXTNS,u'outline-level'), + ), +# required_attributes + (TEXTNS,u'user-index-mark'): ( + (TEXTNS,u'index-name'), + (TEXTNS,u'string-value'), + ), + (TEXTNS,u'user-index-mark-end'): ( + (TEXTNS,u'id'), + ), + (TEXTNS,u'user-index-mark-start'): ( + (TEXTNS,u'index-name'), + (TEXTNS,u'id'), + ), + (TEXTNS,u'user-index-source'): ( + (TEXTNS,u'index-name'), + ), + (TEXTNS,u'variable-decl'): ( + (TEXTNS,u'name'), + (OFFICENS,u'value-type'), + ), + (TEXTNS,u'variable-get'): ( + (TEXTNS,u'name'), + ), + (TEXTNS,u'variable-input'): ( + (TEXTNS,u'name'), + (OFFICENS,u'value-type'), + ), + (TEXTNS,u'variable-set'): ( + (TEXTNS,u'name'), + ), +} + +# Empty list means the element has no allowed attributes +# None means anything goes + +allowed_attributes = { + (DCNS,u'creator'):( + ), + (DCNS,u'date'):( + ), + (DCNS,u'description'):( + ), + (DCNS,u'language'):( + ), + (DCNS,u'subject'):( + ), + (DCNS,u'title'):( + ), +# Completes Dublin Core start +# (DCNS,'contributor') : ( +# ), +# (DCNS,'coverage') : ( +# ), +# (DCNS,'format') : ( +# ), +# (DCNS,'identifier') : ( +# ), +# (DCNS,'publisher') : ( +# ), +# (DCNS,'relation') : ( +# ), +# (DCNS,'rights') : ( +# ), +# (DCNS,'source') : ( +# ), +# (DCNS,'type') : ( +# ), +# Completes Dublin Core end + (MATHNS,u'math'): None, + (XFORMSNS,u'model'): None, +# allowed_attributes + (ANIMNS,u'animate'):( + (ANIMNS,u'formula'), + (ANIMNS,u'sub-item'), + (SMILNS,u'accelerate'), + (SMILNS,u'accumulate'), + (SMILNS,u'additive'), + (SMILNS,u'attributeName'), + (SMILNS,u'autoReverse'), + (SMILNS,u'begin'), + (SMILNS,u'by'), + (SMILNS,u'calcMode'), + (SMILNS,u'decelerate'), + (SMILNS,u'dur'), + (SMILNS,u'end'), + (SMILNS,u'fill'), + (SMILNS,u'fillDefault'), + (SMILNS,u'from'), + (SMILNS,u'keySplines'), + (SMILNS,u'keyTimes'), + (SMILNS,u'repeatCount'), + (SMILNS,u'repeatDur'), + (SMILNS,u'restart'), + (SMILNS,u'restartDefault'), + (SMILNS,u'targetElement'), + (SMILNS,u'to'), + (SMILNS,u'values'), + ), +# allowed_attributes + (ANIMNS,u'animateColor'):( + (ANIMNS,u'color-interpolation'), + (ANIMNS,u'color-interpolation-direction'), + (ANIMNS,u'formula'), + (ANIMNS,u'sub-item'), + (SMILNS,u'accelerate'), + (SMILNS,u'accumulate'), + (SMILNS,u'additive'), + (SMILNS,u'attributeName'), + (SMILNS,u'autoReverse'), + (SMILNS,u'begin'), + (SMILNS,u'by'), + (SMILNS,u'calcMode'), + (SMILNS,u'decelerate'), + (SMILNS,u'dur'), + (SMILNS,u'end'), + (SMILNS,u'fill'), + (SMILNS,u'fillDefault'), + (SMILNS,u'from'), + (SMILNS,u'keySplines'), + (SMILNS,u'keyTimes'), + (SMILNS,u'repeatCount'), + (SMILNS,u'repeatDur'), + (SMILNS,u'restart'), + (SMILNS,u'restartDefault'), + (SMILNS,u'targetElement'), + (SMILNS,u'to'), + (SMILNS,u'values'), + ), +# allowed_attributes + (ANIMNS,u'animateMotion'):( + (ANIMNS,u'formula'), + (ANIMNS,u'sub-item'), + (SMILNS,u'accelerate'), + (SMILNS,u'accumulate'), + (SMILNS,u'additive'), + (SMILNS,u'attributeName'), + (SMILNS,u'autoReverse'), + (SMILNS,u'begin'), + (SMILNS,u'by'), + (SMILNS,u'calcMode'), + (SMILNS,u'decelerate'), + (SMILNS,u'dur'), + (SMILNS,u'end'), + (SMILNS,u'fill'), + (SMILNS,u'fillDefault'), + (SMILNS,u'from'), + (SMILNS,u'keySplines'), + (SMILNS,u'keyTimes'), + (SMILNS,u'repeatCount'), + (SMILNS,u'repeatDur'), + (SMILNS,u'restart'), + (SMILNS,u'restartDefault'), + (SMILNS,u'targetElement'), + (SMILNS,u'to'), + (SMILNS,u'values'), + (SVGNS,u'origin'), + (SVGNS,u'path'), + ), +# allowed_attributes + (ANIMNS,u'animateTransform'):( + (ANIMNS,u'formula'), + (ANIMNS,u'sub-item'), + (SMILNS,u'accelerate'), + (SMILNS,u'accumulate'), + (SMILNS,u'additive'), + (SMILNS,u'attributeName'), + (SMILNS,u'autoReverse'), + (SMILNS,u'begin'), + (SMILNS,u'by'), + (SMILNS,u'decelerate'), + (SMILNS,u'dur'), + (SMILNS,u'end'), + (SMILNS,u'fill'), + (SMILNS,u'fillDefault'), + (SMILNS,u'from'), + (SMILNS,u'repeatCount'), + (SMILNS,u'repeatDur'), + (SMILNS,u'restart'), + (SMILNS,u'restartDefault'), + (SMILNS,u'targetElement'), + (SMILNS,u'to'), + (SMILNS,u'values'), + (SVGNS,u'type'), + ), +# allowed_attributes + (ANIMNS,u'audio'):( + (ANIMNS,u'audio-level'), + (ANIMNS,u'id'), + (PRESENTATIONNS,u'group-id'), + (PRESENTATIONNS,u'master-element'), + (PRESENTATIONNS,u'node-type'), + (PRESENTATIONNS,u'preset-class'), + (PRESENTATIONNS,u'preset-id'), + (PRESENTATIONNS,u'preset-sub-type'), + (SMILNS,u'begin'), + (SMILNS,u'dur'), + (SMILNS,u'end'), + (SMILNS,u'repeatCount'), + (SMILNS,u'repeatDur'), + (XLINKNS,u'href'), + ), + (ANIMNS,u'command'):( + (PRESENTATIONNS,u'node-type'), + (SMILNS,u'begin'), + (SMILNS,u'end'), + (PRESENTATIONNS,u'group-id'), + (PRESENTATIONNS,u'preset-class'), + (PRESENTATIONNS,u'preset-id'), + (ANIMNS,u'sub-item'), + (ANIMNS,u'command'), + (PRESENTATIONNS,u'preset-sub-type'), + (SMILNS,u'targetElement'), + (ANIMNS,u'id'), + (PRESENTATIONNS,u'master-element'), + ), +# allowed_attributes + (ANIMNS,u'iterate'):( + (ANIMNS,u'id'), + (ANIMNS,u'iterate-interval'), + (ANIMNS,u'iterate-type'), + (ANIMNS,u'sub-item'), + (PRESENTATIONNS,u'group-id'), + (PRESENTATIONNS,u'master-element'), + (PRESENTATIONNS,u'node-type'), + (PRESENTATIONNS,u'preset-class'), + (PRESENTATIONNS,u'preset-id'), + (PRESENTATIONNS,u'preset-sub-type'), + (SMILNS,u'accelerate'), + (SMILNS,u'autoReverse'), + (SMILNS,u'begin'), + (SMILNS,u'decelerate'), + (SMILNS,u'dur'), + (SMILNS,u'end'), + (SMILNS,u'endsync'), + (SMILNS,u'fill'), + (SMILNS,u'fillDefault'), + (SMILNS,u'repeatCount'), + (SMILNS,u'repeatDur'), + (SMILNS,u'restart'), + (SMILNS,u'restartDefault'), + (SMILNS,u'targetElement'), + ), + (ANIMNS,u'par'):( + (PRESENTATIONNS,u'node-type'), + (SMILNS,u'decelerate'), + (SMILNS,u'begin'), + (SMILNS,u'end'), + (PRESENTATIONNS,u'group-id'), + (SMILNS,u'accelerate'), + (SMILNS,u'repeatDur'), + (SMILNS,u'repeatCount'), + (SMILNS,u'autoReverse'), + (PRESENTATIONNS,u'preset-class'), + (SMILNS,u'fillDefault'), + (PRESENTATIONNS,u'preset-id'), + (PRESENTATIONNS,u'preset-sub-type'), + (SMILNS,u'restartDefault'), + (SMILNS,u'endsync'), + (SMILNS,u'dur'), + (SMILNS,u'fill'), + (ANIMNS,u'id'), + (SMILNS,u'restart'), + (PRESENTATIONNS,u'master-element'), + ), +# allowed_attributes + (ANIMNS,u'param'):( + (ANIMNS,u'name'), + (ANIMNS,u'value'), + ), + (ANIMNS,u'seq'):( + (ANIMNS,u'id'), + (PRESENTATIONNS,u'group-id'), + (PRESENTATIONNS,u'master-element'), + (PRESENTATIONNS,u'node-type'), + (PRESENTATIONNS,u'preset-class'), + (PRESENTATIONNS,u'preset-id'), + (PRESENTATIONNS,u'preset-sub-type'), + (SMILNS,u'accelerate'), + (SMILNS,u'autoReverse'), + (SMILNS,u'begin'), + (SMILNS,u'decelerate'), + (SMILNS,u'dur'), + (SMILNS,u'end'), + (SMILNS,u'endsync'), + (SMILNS,u'fill'), + (SMILNS,u'fillDefault'), + (SMILNS,u'repeatCount'), + (SMILNS,u'repeatDur'), + (SMILNS,u'restart'), + (SMILNS,u'restartDefault'), + ), + (ANIMNS,u'set'):( + (ANIMNS,u'sub-item'), + (SMILNS,u'accelerate'), + (SMILNS,u'accumulate'), + (SMILNS,u'autoReverse'), + (SMILNS,u'additive'), + (SMILNS,u'attributeName'), + (SMILNS,u'begin'), + (SMILNS,u'decelerate'), + (SMILNS,u'dur'), + (SMILNS,u'end'), + (SMILNS,u'fill'), + (SMILNS,u'fillDefault'), + (SMILNS,u'repeatCount'), + (SMILNS,u'repeatDur'), + (SMILNS,u'restart'), + (SMILNS,u'restartDefault'), + (SMILNS,u'targetElement'), + (SMILNS,u'to'), + + ), +# allowed_attributes + (ANIMNS,u'transitionFilter'):( + (ANIMNS,u'formula'), + (ANIMNS,u'sub-item'), + (SMILNS,u'accelerate'), + (SMILNS,u'accumulate'), + (SMILNS,u'additive'), + (SMILNS,u'autoReverse'), + (SMILNS,u'begin'), + (SMILNS,u'by'), + (SMILNS,u'calcMode'), + (SMILNS,u'decelerate'), + (SMILNS,u'direction'), + (SMILNS,u'dur'), + (SMILNS,u'end'), + (SMILNS,u'fadeColor'), + (SMILNS,u'fill'), + (SMILNS,u'fillDefault'), + (SMILNS,u'from'), + (SMILNS,u'mode'), + (SMILNS,u'repeatCount'), + (SMILNS,u'repeatDur'), + (SMILNS,u'restart'), + (SMILNS,u'restartDefault'), + (SMILNS,u'subtype'), + (SMILNS,u'targetElement'), + (SMILNS,u'to'), + (SMILNS,u'type'), + (SMILNS,u'values'), + + ), +# allowed_attributes + (CHARTNS,u'axis'):( + (CHARTNS,u'style-name'), + (CHARTNS,u'dimension'), + (CHARTNS,u'name'), + ), + (CHARTNS,u'categories'):( + (TABLENS,u'cell-range-address'), + ), + (CHARTNS,u'chart'):( + (CHARTNS,u'column-mapping'), + (CHARTNS,u'row-mapping'), + (SVGNS,u'height'), + (SVGNS,u'width'), + (CHARTNS,u'style-name'), + (CHARTNS,u'class'), + ), + (CHARTNS,u'data-point'):( + (CHARTNS,u'repeated'), + (CHARTNS,u'style-name'), + ), + (CHARTNS,u'domain'):( + (TABLENS,u'cell-range-address'), + ), + (CHARTNS,u'error-indicator'):( + (CHARTNS,u'style-name'), + ), + (CHARTNS,u'floor'):( + (SVGNS,u'width'), + (CHARTNS,u'style-name'), + ), +# allowed_attributes + (CHARTNS,u'footer'):( + (SVGNS,u'y'), + (SVGNS,u'x'), + (TABLENS,u'cell-range'), + (CHARTNS,u'style-name'), + ), + (CHARTNS,u'grid'):( + (CHARTNS,u'style-name'), + (CHARTNS,u'class'), + ), + (CHARTNS,u'legend'):( + (CHARTNS,u'legend-align'), + (STYLENS,u'legend-expansion-aspect-ratio'), + (STYLENS,u'legend-expansion'), + (CHARTNS,u'legend-position'), + (CHARTNS,u'style-name'), + (SVGNS,u'y'), + (SVGNS,u'x'), + ), + (CHARTNS,u'mean-value'):( + (CHARTNS,u'style-name'), + ), + (CHARTNS,u'plot-area'):( + (DR3DNS,u'ambient-color'), + (DR3DNS,u'distance'), + (DR3DNS,u'vrp'), + (DR3DNS,u'focal-length'), + (CHARTNS,u'data-source-has-labels'), + (DR3DNS,u'lighting-mode'), + (DR3DNS,u'shade-mode'), + (DR3DNS,u'transform'), + (DR3DNS,u'shadow-slant'), + (SVGNS,u'height'), + (SVGNS,u'width'), + (CHARTNS,u'style-name'), + (DR3DNS,u'vup'), + (SVGNS,u'y'), + (SVGNS,u'x'), + (DR3DNS,u'vpn'), + (TABLENS,u'cell-range-address'), + (DR3DNS,u'projection'), + ), + (CHARTNS,u'regression-curve'):( + (CHARTNS,u'style-name'), + ), + (CHARTNS,u'series'):( + (CHARTNS,u'style-name'), + (CHARTNS,u'attached-axis'), + (CHARTNS,u'values-cell-range-address'), + (CHARTNS,u'label-cell-address'), + (CHARTNS,u'class'), + ), + (CHARTNS,u'stock-gain-marker'):( + (CHARTNS,u'style-name'), + ), +# allowed_attributes + (CHARTNS,u'stock-loss-marker'):( + (CHARTNS,u'style-name'), + ), + (CHARTNS,u'stock-range-line'):( + (CHARTNS,u'style-name'), + ), + (CHARTNS,u'subtitle'):( + (SVGNS,u'y'), + (SVGNS,u'x'), + (TABLENS,u'cell-range'), + (CHARTNS,u'style-name'), + ), + (CHARTNS,u'symbol-image'):( + (XLINKNS,u'href'), + ), + (CHARTNS,u'title'):( + (SVGNS,u'y'), + (SVGNS,u'x'), + (TABLENS,u'cell-range'), + (CHARTNS,u'style-name'), + ), + (CHARTNS,u'wall'):( + (SVGNS,u'width'), + (CHARTNS,u'style-name'), + ), + (CONFIGNS,u'config-item'):( + (CONFIGNS,u'type'), + (CONFIGNS,u'name'), + ), + (CONFIGNS,u'config-item-map-entry'):( + (CONFIGNS,u'name'), + ), + (CONFIGNS,u'config-item-map-indexed'):( + (CONFIGNS,u'name'), + ), + (CONFIGNS,u'config-item-map-named'):( + (CONFIGNS,u'name'), + ), + (CONFIGNS,u'config-item-set'):( + (CONFIGNS,u'name'), + ), +# allowed_attributes + (NUMBERNS,u'am-pm'):( + ), + (NUMBERNS,u'boolean'):( + ), + (NUMBERNS,u'boolean-style'):( + (NUMBERNS,u'transliteration-language'), + (STYLENS,u'name'), + (STYLENS,u'display-name'), + (NUMBERNS,u'language'), + (NUMBERNS,u'title'), + (NUMBERNS,u'country'), + (NUMBERNS,u'transliteration-format'), + (NUMBERNS,u'transliteration-style'), + (STYLENS,u'volatile'), + (NUMBERNS,u'transliteration-country'), + ), + (NUMBERNS,u'currency-style'):( + (NUMBERNS,u'transliteration-language'), + (STYLENS,u'name'), + (STYLENS,u'display-name'), + (NUMBERNS,u'language'), + (NUMBERNS,u'title'), + (NUMBERNS,u'country'), + (NUMBERNS,u'transliteration-format'), + (NUMBERNS,u'transliteration-style'), + (STYLENS,u'volatile'), + (NUMBERNS,u'transliteration-country'), + (NUMBERNS,u'automatic-order'), + ), + (NUMBERNS,u'currency-symbol'):( + (NUMBERNS,u'country'), + (NUMBERNS,u'language'), + ), +# allowed_attributes + (NUMBERNS,u'date-style'):( + (NUMBERNS,u'transliteration-language'), + (STYLENS,u'name'), + (STYLENS,u'display-name'), + (NUMBERNS,u'language'), + (NUMBERNS,u'title'), + (NUMBERNS,u'country'), + (NUMBERNS,u'transliteration-format'), + (NUMBERNS,u'transliteration-style'), + (NUMBERNS,u'format-source'), + (STYLENS,u'volatile'), + (NUMBERNS,u'transliteration-country'), + (NUMBERNS,u'automatic-order'), + ), + (NUMBERNS,u'day'):( + (NUMBERNS,u'style'), + (NUMBERNS,u'calendar'), + ), + (NUMBERNS,u'day-of-week'):( + (NUMBERNS,u'style'), + (NUMBERNS,u'calendar'), + ), + (NUMBERNS,u'embedded-text'):( + (NUMBERNS,u'position'), + ), + (NUMBERNS,u'era'):( + (NUMBERNS,u'style'), + (NUMBERNS,u'calendar'), + ), + (NUMBERNS,u'fraction'):( + (NUMBERNS,u'grouping'), + (NUMBERNS,u'min-denominator-digits'), + (NUMBERNS,u'min-numerator-digits'), + (NUMBERNS,u'min-integer-digits'), + (NUMBERNS,u'denominator-value'), + ), + (NUMBERNS,u'hours'):( + (NUMBERNS,u'style'), + ), +# allowed_attributes + (NUMBERNS,u'minutes'):( + (NUMBERNS,u'style'), + ), + (NUMBERNS,u'month'):( + (NUMBERNS,u'style'), + (NUMBERNS,u'calendar'), + (NUMBERNS,u'possessive-form'), + (NUMBERNS,u'textual'), + ), + (NUMBERNS,u'number'):( + (NUMBERNS,u'display-factor'), + (NUMBERNS,u'decimal-places'), + (NUMBERNS,u'decimal-replacement'), + (NUMBERNS,u'min-integer-digits'), + (NUMBERNS,u'grouping'), + ), + (NUMBERNS,u'number-style'):( + (NUMBERNS,u'transliteration-language'), + (STYLENS,u'name'), + (STYLENS,u'display-name'), + (NUMBERNS,u'language'), + (NUMBERNS,u'title'), + (NUMBERNS,u'country'), + (NUMBERNS,u'transliteration-format'), + (NUMBERNS,u'transliteration-style'), + (STYLENS,u'volatile'), + (NUMBERNS,u'transliteration-country'), + ), +# allowed_attributes + (NUMBERNS,u'percentage-style'):( + (NUMBERNS,u'transliteration-language'), + (STYLENS,u'name'), + (STYLENS,u'display-name'), + (NUMBERNS,u'language'), + (NUMBERNS,u'title'), + (NUMBERNS,u'country'), + (NUMBERNS,u'transliteration-format'), + (NUMBERNS,u'transliteration-style'), + (STYLENS,u'volatile'), + (NUMBERNS,u'transliteration-country'), + ), + (NUMBERNS,u'quarter'):( + (NUMBERNS,u'style'), + (NUMBERNS,u'calendar'), + ), + (NUMBERNS,u'scientific-number'):( + (NUMBERNS,u'min-exponent-digits'), + (NUMBERNS,u'decimal-places'), + (NUMBERNS,u'min-integer-digits'), + (NUMBERNS,u'grouping'), + ), + (NUMBERNS,u'seconds'):( + (NUMBERNS,u'style'), + (NUMBERNS,u'decimal-places'), + ), + (NUMBERNS,u'text'):( + ), + (NUMBERNS,u'text-content'):( + ), + (NUMBERNS,u'text-style'):( + (NUMBERNS,u'transliteration-language'), + (STYLENS,u'name'), + (STYLENS,u'display-name'), + (NUMBERNS,u'language'), + (NUMBERNS,u'title'), + (NUMBERNS,u'country'), + (NUMBERNS,u'transliteration-format'), + (NUMBERNS,u'transliteration-style'), + (STYLENS,u'volatile'), + (NUMBERNS,u'transliteration-country'), + ), + (NUMBERNS,u'time-style'):( + (NUMBERNS,u'transliteration-language'), + (NUMBERNS,u'transliteration-format'), + (STYLENS,u'name'), + (STYLENS,u'display-name'), + (NUMBERNS,u'language'), + (NUMBERNS,u'title'), + (NUMBERNS,u'country'), + (NUMBERNS,u'truncate-on-overflow'), + (NUMBERNS,u'transliteration-style'), + (NUMBERNS,u'format-source'), + (STYLENS,u'volatile'), + (NUMBERNS,u'transliteration-country'), + ), + (NUMBERNS,u'week-of-year'):( + (NUMBERNS,u'calendar'), + ), + (NUMBERNS,u'year'):( + (NUMBERNS,u'style'), + (NUMBERNS,u'calendar'), + ), + (DR3DNS,u'cube'):( + (DR3DNS,u'min-edge'), + (DR3DNS,u'max-edge'), + (DRAWNS,u'layer'), + (DR3DNS,u'transform'), + (DRAWNS,u'z-index'), + (DRAWNS,u'class-names'), + (DRAWNS,u'style-name'), + (PRESENTATIONNS,u'style-name'), + (PRESENTATIONNS,u'class-names'), + (DRAWNS,u'id'), + ), + (DR3DNS,u'extrude'):( + (DRAWNS,u'layer'), + (SVGNS,u'd'), + (DR3DNS,u'transform'), + (SVGNS,u'viewBox'), + (DRAWNS,u'z-index'), + (DRAWNS,u'class-names'), + (DRAWNS,u'style-name'), + (PRESENTATIONNS,u'style-name'), + (PRESENTATIONNS,u'class-names'), + (DRAWNS,u'id'), + ), + (DR3DNS,u'light'):( + (DR3DNS,u'diffuse-color'), + (DR3DNS,u'direction'), + (DR3DNS,u'specular'), + (DR3DNS,u'enabled'), + ), + (DR3DNS,u'rotate'):( + (DRAWNS,u'layer'), + (SVGNS,u'd'), + (DR3DNS,u'transform'), + (SVGNS,u'viewBox'), + (DRAWNS,u'z-index'), + (DRAWNS,u'class-names'), + (DRAWNS,u'style-name'), + (PRESENTATIONNS,u'style-name'), + (PRESENTATIONNS,u'class-names'), + (DRAWNS,u'id'), + ), +# allowed_attributes + (DR3DNS,u'scene'):( + (DR3DNS,u'ambient-color'), + (DR3DNS,u'distance'), + (DR3DNS,u'focal-length'), + (DR3DNS,u'lighting-mode'), + (DR3DNS,u'projection'), + (DR3DNS,u'shade-mode'), + (DR3DNS,u'shadow-slant'), + (DR3DNS,u'transform'), + (DR3DNS,u'vpn'), + (DR3DNS,u'vrp'), + (DR3DNS,u'vup'), + (DRAWNS,u'id'), + (DRAWNS,u'caption-id'), + (DRAWNS,u'layer'), + (DRAWNS,u'z-index'), + (DRAWNS,u'class-names'), + (DRAWNS,u'style-name'), + (PRESENTATIONNS,u'class-names'), + (PRESENTATIONNS,u'style-name'), + (SVGNS,u'height'), + (SVGNS,u'width'), + (SVGNS,u'x'), + (SVGNS,u'y'), + (TABLENS,u'end-cell-address'), + (TABLENS,u'end-x'), + (TABLENS,u'end-y'), + (TABLENS,u'table-background'), + (TEXTNS,u'anchor-page-number'), + (TEXTNS,u'anchor-type'), + ), + (DR3DNS,u'sphere'):( + (DRAWNS,u'layer'), + (DR3DNS,u'center'), + (DR3DNS,u'transform'), + (DRAWNS,u'z-index'), + (DRAWNS,u'class-names'), + (DRAWNS,u'style-name'), + (PRESENTATIONNS,u'style-name'), + (PRESENTATIONNS,u'class-names'), + (DRAWNS,u'id'), + (DR3DNS,u'size'), + ), + (DRAWNS,u'a'):( + (OFFICENS,u'name'), + (OFFICENS,u'title'), + (XLINKNS,u'show'), + (OFFICENS,u'target-frame-name'), + (XLINKNS,u'actuate'), + (XLINKNS,u'href'), + (XLINKNS,u'type'), + (OFFICENS,u'server-map'), + ), + (DRAWNS,u'applet'):( + (DRAWNS,u'code'), + (XLINKNS,u'show'), + (DRAWNS,u'object'), + (XLINKNS,u'actuate'), + (XLINKNS,u'href'), + (XLINKNS,u'type'), + (DRAWNS,u'archive'), + (DRAWNS,u'may-script'), + ), + (DRAWNS,u'area-circle'):( + (OFFICENS,u'name'), + (XLINKNS,u'show'), + (SVGNS,u'cx'), + (XLINKNS,u'type'), + (DRAWNS,u'nohref'), + (SVGNS,u'cy'), + (XLINKNS,u'href'), + (SVGNS,u'r'), + (OFFICENS,u'target-frame-name'), + ), + (DRAWNS,u'area-polygon'):( + (OFFICENS,u'name'), + (XLINKNS,u'show'), + (XLINKNS,u'type'), + (SVGNS,u'height'), + (DRAWNS,u'nohref'), + (SVGNS,u'width'), + (XLINKNS,u'href'), + (SVGNS,u'y'), + (SVGNS,u'x'), + (OFFICENS,u'target-frame-name'), + (SVGNS,u'viewBox'), + (DRAWNS,u'points'), + ), + (DRAWNS,u'area-rectangle'):( + (OFFICENS,u'name'), + (XLINKNS,u'show'), + (XLINKNS,u'type'), + (SVGNS,u'height'), + (DRAWNS,u'nohref'), + (SVGNS,u'width'), + (XLINKNS,u'href'), + (SVGNS,u'y'), + (SVGNS,u'x'), + (OFFICENS,u'target-frame-name'), + ), + (DRAWNS,u'caption'):( + (TABLENS,u'table-background'), + (DRAWNS,u'layer'), + (DRAWNS,u'caption-id'), + (TABLENS,u'end-cell-address'), + (DRAWNS,u'name'), + (DRAWNS,u'text-style-name'), + (DRAWNS,u'caption-point-y'), + (DRAWNS,u'caption-point-x'), + (DRAWNS,u'transform'), + (TABLENS,u'end-y'), + (DRAWNS,u'corner-radius'), + (SVGNS,u'width'), + (DRAWNS,u'z-index'), + (DRAWNS,u'class-names'), + (DRAWNS,u'style-name'), + (PRESENTATIONNS,u'style-name'), + (PRESENTATIONNS,u'class-names'), + (TABLENS,u'end-x'), + (TEXTNS,u'anchor-page-number'), + (SVGNS,u'y'), + (SVGNS,u'x'), + (SVGNS,u'height'), + (DRAWNS,u'id'), + (TEXTNS,u'anchor-type'), + ), + (DRAWNS,u'circle'):( + (DRAWNS,u'end-angle'), + (DRAWNS,u'id'), + (DRAWNS,u'kind'), + (DRAWNS,u'layer'), + (DRAWNS,u'name'), + (DRAWNS,u'start-angle'), + (DRAWNS,u'class-names'), + (DRAWNS,u'style-name'), + (DRAWNS,u'caption-id'), + (DRAWNS,u'text-style-name'), + (DRAWNS,u'transform'), + (DRAWNS,u'z-index'), + (PRESENTATIONNS,u'class-names'), + (PRESENTATIONNS,u'style-name'), + (SVGNS,u'cx'), + (SVGNS,u'cy'), + (SVGNS,u'height'), + (SVGNS,u'r'), + (SVGNS,u'width'), + (SVGNS,u'x'), + (SVGNS,u'y'), + (TABLENS,u'end-cell-address'), + (TABLENS,u'end-x'), + (TABLENS,u'end-y'), + (TABLENS,u'table-background'), + (TEXTNS,u'anchor-page-number'), + (TEXTNS,u'anchor-type'), + ), + (DRAWNS,u'connector'):( + (DRAWNS,u'layer'), + (DRAWNS,u'end-shape'), + (TEXTNS,u'anchor-page-number'), + (SVGNS,u'y1'), + (SVGNS,u'y2'), + (TABLENS,u'table-background'), + (TABLENS,u'end-cell-address'), + (DRAWNS,u'transform'), + (DRAWNS,u'id'), + (TABLENS,u'end-y'), + (TABLENS,u'end-x'), + (DRAWNS,u'class-names'), + (DRAWNS,u'style-name'), + (PRESENTATIONNS,u'class-names'), + (DRAWNS,u'caption-id'), + (DRAWNS,u'type'), + (DRAWNS,u'start-shape'), + (DRAWNS,u'z-index'), + (PRESENTATIONNS,u'style-name'), + (DRAWNS,u'start-glue-point'), + (SVGNS,u'x2'), + (SVGNS,u'x1'), + (TEXTNS,u'anchor-type'), + (DRAWNS,u'line-skew'), + (DRAWNS,u'name'), + (DRAWNS,u'end-glue-point'), + (DRAWNS,u'text-style-name'), + ), + (DRAWNS,u'contour-path'):( + (SVGNS,u'd'), + (SVGNS,u'width'), + (DRAWNS,u'recreate-on-edit'), + (SVGNS,u'viewBox'), + (SVGNS,u'height'), + ), + (DRAWNS,u'contour-polygon'):( + (SVGNS,u'width'), + (DRAWNS,u'points'), + (DRAWNS,u'recreate-on-edit'), + (SVGNS,u'viewBox'), + (SVGNS,u'height'), + ), + (DRAWNS,u'control'):( + (DRAWNS,u'control'), + (DRAWNS,u'layer'), + (DRAWNS,u'caption-id'), + (TABLENS,u'end-cell-address'), + (DRAWNS,u'name'), + (DRAWNS,u'text-style-name'), + (TABLENS,u'table-background'), + (DRAWNS,u'transform'), + (SVGNS,u'height'), + (SVGNS,u'width'), + (DRAWNS,u'z-index'), + (DRAWNS,u'class-names'), + (DRAWNS,u'style-name'), + (PRESENTATIONNS,u'style-name'), + (PRESENTATIONNS,u'class-names'), + (TABLENS,u'end-x'), + (TEXTNS,u'anchor-page-number'), + (SVGNS,u'y'), + (SVGNS,u'x'), + (TABLENS,u'end-y'), + (DRAWNS,u'id'), + (TEXTNS,u'anchor-type'), + ), + (DRAWNS,u'custom-shape'):( + (DRAWNS,u'engine'), + (DRAWNS,u'caption-id'), + (DRAWNS,u'layer'), + (TABLENS,u'end-cell-address'), + (DRAWNS,u'name'), + (DRAWNS,u'text-style-name'), + (TABLENS,u'table-background'), + (DRAWNS,u'transform'), + (SVGNS,u'height'), + (SVGNS,u'width'), + (DRAWNS,u'z-index'), + (DRAWNS,u'class-names'), + (DRAWNS,u'style-name'), + (PRESENTATIONNS,u'style-name'), + (PRESENTATIONNS,u'class-names'), + (TABLENS,u'end-x'), + (TEXTNS,u'anchor-page-number'), + (SVGNS,u'y'), + (SVGNS,u'x'), + (TABLENS,u'end-y'), + (DRAWNS,u'data'), + (DRAWNS,u'id'), + (TEXTNS,u'anchor-type'), + ), +# allowed_attributes + (DRAWNS,u'ellipse'):( + (DRAWNS,u'layer'), + (DRAWNS,u'start-angle'), + (SVGNS,u'cy'), + (SVGNS,u'cx'), + (TABLENS,u'table-background'), + (TABLENS,u'end-cell-address'), + (SVGNS,u'rx'), + (DRAWNS,u'transform'), + (DRAWNS,u'id'), + (SVGNS,u'width'), + (TABLENS,u'end-y'), + (TABLENS,u'end-x'), + (DRAWNS,u'class-names'), + (DRAWNS,u'style-name'), + (PRESENTATIONNS,u'class-names'), + (DRAWNS,u'end-angle'), + (DRAWNS,u'z-index'), + (DRAWNS,u'caption-id'), + (PRESENTATIONNS,u'style-name'), + (SVGNS,u'height'), + (TEXTNS,u'anchor-type'), + (SVGNS,u'ry'), + (DRAWNS,u'kind'), + (DRAWNS,u'name'), + (TEXTNS,u'anchor-page-number'), + (SVGNS,u'y'), + (SVGNS,u'x'), + (DRAWNS,u'text-style-name'), + ), +# allowed_attributes + (DRAWNS,u'enhanced-geometry'):( + (DRAWNS,u'extrusion-rotation-center'), + (DRAWNS,u'extrusion-shininess'), + (DRAWNS,u'extrusion-rotation-angle'), + (DRAWNS,u'extrusion-allowed'), + (DRAWNS,u'extrusion-first-light-level'), + (DRAWNS,u'extrusion-specularity'), + (DRAWNS,u'extrusion-viewpoint'), + (DRAWNS,u'extrusion-second-light-level'), + (DRAWNS,u'extrusion-origin'), + (DRAWNS,u'extrusion-color'), + (SVGNS,u'viewBox'), + (DR3DNS,u'projection'), + (DRAWNS,u'extrusion-metal'), + (DRAWNS,u'extrusion-number-of-line-segments'), + (DRAWNS,u'text-path-same-letter-heights'), + (DRAWNS,u'extrusion-first-light-harsh'), + (DRAWNS,u'enhanced-path'), + (DRAWNS,u'text-rotate-angle'), + (DRAWNS,u'type'), + (DRAWNS,u'glue-point-leaving-directions'), + (DRAWNS,u'concentric-gradient-fill-allowed'), + (DRAWNS,u'text-path-scale'), + (DRAWNS,u'extrusion-brightness'), + (DRAWNS,u'extrusion-first-light-direction'), + (DRAWNS,u'extrusion-light-face'), + (DRAWNS,u'text-path-allowed'), + (DRAWNS,u'glue-points'), + (DRAWNS,u'mirror-vertical'), + (DRAWNS,u'extrusion-depth'), + (DRAWNS,u'extrusion-diffusion'), + (DRAWNS,u'extrusion-second-light-direction'), + (DRAWNS,u'extrusion-skew'), + (DR3DNS,u'shade-mode'), + (DRAWNS,u'path-stretchpoint-y'), + (DRAWNS,u'modifiers'), + (DRAWNS,u'extrusion'), + (DRAWNS,u'path-stretchpoint-x'), + (DRAWNS,u'text-areas'), + (DRAWNS,u'mirror-horizontal'), + (DRAWNS,u'text-path-mode'), + (DRAWNS,u'extrusion-second-light-harsh'), + (DRAWNS,u'glue-point-type'), + (DRAWNS,u'text-path'), + ), +# allowed_attributes + (DRAWNS,u'equation'):( + (DRAWNS,u'formula'), + (DRAWNS,u'name'), + ), + (DRAWNS,u'fill-image'):( + (DRAWNS,u'name'), + (XLINKNS,u'show'), + (XLINKNS,u'actuate'), + (SVGNS,u'height'), + (SVGNS,u'width'), + (XLINKNS,u'href'), + (DRAWNS,u'display-name'), + (XLINKNS,u'type'), + ), + (DRAWNS,u'floating-frame'):( + (XLINKNS,u'href'), + (XLINKNS,u'actuate'), + (DRAWNS,u'frame-name'), + (XLINKNS,u'type'), + (XLINKNS,u'show'), + ), + (DRAWNS,u'frame'):( + (DRAWNS,u'copy-of'), + (DRAWNS,u'id'), + (DRAWNS,u'layer'), + (DRAWNS,u'name'), + (DRAWNS,u'class-names'), + (DRAWNS,u'caption-id'), + (DRAWNS,u'style-name'), + (DRAWNS,u'text-style-name'), + (DRAWNS,u'transform'), + (DRAWNS,u'z-index'), + (PRESENTATIONNS,u'class'), + (PRESENTATIONNS,u'class-names'), + (PRESENTATIONNS,u'placeholder'), + (PRESENTATIONNS,u'style-name'), + (PRESENTATIONNS,u'user-transformed'), + (STYLENS,u'rel-height'), + (STYLENS,u'rel-width'), + (SVGNS,u'height'), + (SVGNS,u'width'), + (SVGNS,u'x'), + (SVGNS,u'y'), + (TABLENS,u'end-cell-address'), + (TABLENS,u'end-x'), + (TABLENS,u'end-y'), + (TABLENS,u'table-background'), + (TEXTNS,u'anchor-page-number'), + (TEXTNS,u'anchor-type'), + ), +# allowed_attributes + (DRAWNS,u'g'):( + (DRAWNS,u'id'), + (DRAWNS,u'caption-id'), + (DRAWNS,u'name'), + (DRAWNS,u'class-names'), + (DRAWNS,u'style-name'), + (DRAWNS,u'z-index'), + (PRESENTATIONNS,u'class-names'), + (PRESENTATIONNS,u'style-name'), + (SVGNS,u'y'), + (TABLENS,u'end-cell-address'), + (TABLENS,u'end-x'), + (TABLENS,u'end-y'), + (TABLENS,u'table-background'), + (TEXTNS,u'anchor-page-number'), + (TEXTNS,u'anchor-type'), + ), + (DRAWNS,u'glue-point'):( + (SVGNS,u'y'), + (SVGNS,u'x'), + (DRAWNS,u'align'), + (DRAWNS,u'id'), + (DRAWNS,u'escape-direction'), + ), + (DRAWNS,u'gradient'):( + (DRAWNS,u'style'), + (DRAWNS,u'angle'), + (DRAWNS,u'name'), + (DRAWNS,u'end-color'), + (DRAWNS,u'start-color'), + (DRAWNS,u'cy'), + (DRAWNS,u'cx'), + (DRAWNS,u'display-name'), + (DRAWNS,u'border'), + (DRAWNS,u'end-intensity'), + (DRAWNS,u'start-intensity'), + ), + (DRAWNS,u'handle'):( + (DRAWNS,u'handle-radius-range-minimum'), + (DRAWNS,u'handle-switched'), + (DRAWNS,u'handle-range-y-maximum'), + (DRAWNS,u'handle-mirror-horizontal'), + (DRAWNS,u'handle-range-x-maximum'), + (DRAWNS,u'handle-mirror-vertical'), + (DRAWNS,u'handle-range-y-minimum'), + (DRAWNS,u'handle-radius-range-maximum'), + (DRAWNS,u'handle-range-x-minimum'), + (DRAWNS,u'handle-position'), + (DRAWNS,u'handle-polar'), + ), + (DRAWNS,u'hatch'):( + (DRAWNS,u'distance'), + (DRAWNS,u'style'), + (DRAWNS,u'name'), + (DRAWNS,u'color'), + (DRAWNS,u'display-name'), + (DRAWNS,u'rotation'), + ), + (DRAWNS,u'image'):( + (DRAWNS,u'filter-name'), + (XLINKNS,u'href'), + (XLINKNS,u'type'), + (XLINKNS,u'actuate'), + (XLINKNS,u'show'), + ), + (DRAWNS,u'image-map'):( + ), + (DRAWNS,u'layer'):( + (DRAWNS,u'protected'), + (DRAWNS,u'name'), + (DRAWNS,u'display'), + ), +# allowed_attributes + (DRAWNS,u'layer-set'):( + ), + (DRAWNS,u'line'):( + (DRAWNS,u'class-names'), + (DRAWNS,u'id'), + (DRAWNS,u'caption-id'), + (DRAWNS,u'layer'), + (DRAWNS,u'name'), + (DRAWNS,u'style-name'), + (DRAWNS,u'text-style-name'), + (DRAWNS,u'transform'), + (DRAWNS,u'z-index'), + (PRESENTATIONNS,u'class-names'), + (PRESENTATIONNS,u'style-name'), + (SVGNS,u'x1'), + (SVGNS,u'x2'), + (SVGNS,u'y1'), + (SVGNS,u'y2'), + (TABLENS,u'end-cell-address'), + (TABLENS,u'end-x'), + (TABLENS,u'end-y'), + (TABLENS,u'table-background'), + (TEXTNS,u'anchor-page-number'), + (TEXTNS,u'anchor-type'), + ), + (DRAWNS,u'marker'):( + (SVGNS,u'd'), + (DRAWNS,u'display-name'), + (DRAWNS,u'name'), + (SVGNS,u'viewBox'), + ), +# allowed_attributes + (DRAWNS,u'measure'):( + (TABLENS,u'end-cell-address'), + (DRAWNS,u'layer'), + (SVGNS,u'y2'), + (DRAWNS,u'name'), + (DRAWNS,u'text-style-name'), + (DRAWNS,u'transform'), + (TABLENS,u'table-background'), + (SVGNS,u'x2'), + (DRAWNS,u'z-index'), + (DRAWNS,u'class-names'), + (DRAWNS,u'style-name'), + (PRESENTATIONNS,u'style-name'), + (PRESENTATIONNS,u'class-names'), + (TABLENS,u'end-x'), + (TEXTNS,u'anchor-page-number'), + (SVGNS,u'y1'), + (DRAWNS,u'caption-id'), + (TABLENS,u'end-y'), + (SVGNS,u'x1'), + (DRAWNS,u'id'), + (TEXTNS,u'anchor-type'), + ), + (DRAWNS,u'object'):( + (XLINKNS,u'type'), + (XLINKNS,u'href'), + (DRAWNS,u'notify-on-update-of-ranges'), + (XLINKNS,u'actuate'), + (XLINKNS,u'show'), + ), + (DRAWNS,u'object-ole'):( + (XLINKNS,u'actuate'), + (XLINKNS,u'href'), + (XLINKNS,u'type'), + (DRAWNS,u'class-id'), + (XLINKNS,u'show'), + ), + (DRAWNS,u'opacity'):( + (DRAWNS,u'style'), + (DRAWNS,u'angle'), + (DRAWNS,u'name'), + (DRAWNS,u'start'), + (DRAWNS,u'cy'), + (DRAWNS,u'cx'), + (DRAWNS,u'end'), + (DRAWNS,u'display-name'), + (DRAWNS,u'border'), + ), + (DRAWNS,u'page'):( + (PRESENTATIONNS,u'presentation-page-layout-name'), + (DRAWNS,u'name'), + (DRAWNS,u'nav-order'), + (PRESENTATIONNS,u'use-footer-name'), + (DRAWNS,u'style-name'), + (PRESENTATIONNS,u'use-header-name'), + (DRAWNS,u'master-page-name'), + (DRAWNS,u'id'), + (PRESENTATIONNS,u'use-date-time-name'), + ), + (DRAWNS,u'page-thumbnail'):( + (TABLENS,u'table-background'), + (DRAWNS,u'caption-id'), + (PRESENTATIONNS,u'user-transformed'), + (DRAWNS,u'layer'), + (TABLENS,u'end-cell-address'), + (DRAWNS,u'name'), + (DRAWNS,u'id'), + (DRAWNS,u'transform'), + (DRAWNS,u'page-number'), + (SVGNS,u'height'), + (SVGNS,u'width'), + (DRAWNS,u'z-index'), + (DRAWNS,u'class-names'), + (DRAWNS,u'style-name'), + (PRESENTATIONNS,u'style-name'), + (PRESENTATIONNS,u'class-names'), + (TABLENS,u'end-x'), + (TEXTNS,u'anchor-page-number'), + (SVGNS,u'y'), + (SVGNS,u'x'), + (TABLENS,u'end-y'), + (PRESENTATIONNS,u'placeholder'), + (PRESENTATIONNS,u'class'), + (TEXTNS,u'anchor-type'), + ), + (DRAWNS,u'param'):( + (DRAWNS,u'name'), + (DRAWNS,u'value'), + ), +# allowed_attributes + (DRAWNS,u'path'):( + (TABLENS,u'table-background'), + (DRAWNS,u'layer'), + (TABLENS,u'end-cell-address'), + (DRAWNS,u'caption-id'), + (SVGNS,u'd'), + (DRAWNS,u'text-style-name'), + (DRAWNS,u'id'), + (DRAWNS,u'transform'), + (SVGNS,u'height'), + (SVGNS,u'width'), + (DRAWNS,u'z-index'), + (DRAWNS,u'class-names'), + (DRAWNS,u'style-name'), + (PRESENTATIONNS,u'style-name'), + (PRESENTATIONNS,u'class-names'), + (TABLENS,u'end-x'), + (TEXTNS,u'anchor-type'), + (TEXTNS,u'anchor-page-number'), + (SVGNS,u'y'), + (SVGNS,u'x'), + (TABLENS,u'end-y'), + (SVGNS,u'viewBox'), + (DRAWNS,u'name'), + ), + (DRAWNS,u'plugin'):( + (XLINKNS,u'type'), + (XLINKNS,u'href'), + (DRAWNS,u'mime-type'), + (XLINKNS,u'actuate'), + (XLINKNS,u'show'), + ), + (DRAWNS,u'polygon'):( + (DRAWNS,u'caption-id'), + (TABLENS,u'table-background'), + (DRAWNS,u'layer'), + (TABLENS,u'end-cell-address'), + (DRAWNS,u'name'), + (DRAWNS,u'text-style-name'), + (DRAWNS,u'id'), + (DRAWNS,u'transform'), + (PRESENTATIONNS,u'style-name'), + (SVGNS,u'height'), + (SVGNS,u'width'), + (DRAWNS,u'z-index'), + (DRAWNS,u'points'), + (DRAWNS,u'class-names'), + (DRAWNS,u'style-name'), + (PRESENTATIONNS,u'class-names'), + (TABLENS,u'end-x'), + (TEXTNS,u'anchor-page-number'), + (SVGNS,u'y'), + (SVGNS,u'x'), + (TABLENS,u'end-y'), + (SVGNS,u'viewBox'), + (TEXTNS,u'anchor-type'), + ), +# allowed_attributes + (DRAWNS,u'polyline'):( + (TABLENS,u'table-background'), + (DRAWNS,u'layer'), + (TABLENS,u'end-cell-address'), + (DRAWNS,u'name'), + (DRAWNS,u'text-style-name'), + (DRAWNS,u'id'), + (DRAWNS,u'caption-id'), + (DRAWNS,u'transform'), + (PRESENTATIONNS,u'style-name'), + (SVGNS,u'height'), + (SVGNS,u'width'), + (DRAWNS,u'z-index'), + (DRAWNS,u'points'), + (DRAWNS,u'class-names'), + (DRAWNS,u'style-name'), + (PRESENTATIONNS,u'class-names'), + (TABLENS,u'end-x'), + (TEXTNS,u'anchor-page-number'), + (SVGNS,u'y'), + (SVGNS,u'x'), + (TABLENS,u'end-y'), + (SVGNS,u'viewBox'), + (TEXTNS,u'anchor-type'), + ), + (DRAWNS,u'rect'):( + (DRAWNS,u'corner-radius'), + (DRAWNS,u'caption-id'), + (DRAWNS,u'id'), + (DRAWNS,u'layer'), + (DRAWNS,u'name'), + (DRAWNS,u'text-style-name'), + (DRAWNS,u'transform'), + (DRAWNS,u'z-index'), + (DRAWNS,u'class-names'), + (DRAWNS,u'style-name'), + (PRESENTATIONNS,u'class-names'), + (PRESENTATIONNS,u'style-name'), + (SVGNS,u'height'), + (SVGNS,u'width'), + (SVGNS,u'x'), + (SVGNS,u'y'), + (TABLENS,u'end-cell-address'), + (TABLENS,u'end-x'), + (TABLENS,u'end-y'), + (TABLENS,u'table-background'), + (TEXTNS,u'anchor-page-number'), + (TEXTNS,u'anchor-type'), + ), +# allowed_attributes + (DRAWNS,u'regular-polygon'):( + (TABLENS,u'table-background'), + (DRAWNS,u'layer'), + (TABLENS,u'end-cell-address'), + (DRAWNS,u'caption-id'), + (DRAWNS,u'name'), + (DRAWNS,u'text-style-name'), + (TEXTNS,u'anchor-page-number'), + (DRAWNS,u'concave'), + (DRAWNS,u'sharpness'), + (DRAWNS,u'transform'), + (SVGNS,u'height'), + (SVGNS,u'width'), + (DRAWNS,u'z-index'), + (DRAWNS,u'class-names'), + (DRAWNS,u'style-name'), + (PRESENTATIONNS,u'style-name'), + (PRESENTATIONNS,u'class-names'), + (TABLENS,u'end-x'), + (DRAWNS,u'corners'), + (SVGNS,u'y'), + (SVGNS,u'x'), + (TABLENS,u'end-y'), + (DRAWNS,u'id'), + (TEXTNS,u'anchor-type'), + ), + (DRAWNS,u'stroke-dash'):( + (DRAWNS,u'distance'), + (DRAWNS,u'dots1-length'), + (DRAWNS,u'name'), + (DRAWNS,u'dots2-length'), + (DRAWNS,u'style'), + (DRAWNS,u'dots1'), + (DRAWNS,u'display-name'), + (DRAWNS,u'dots2'), + ), + (DRAWNS,u'text-box'):( + (FONS,u'min-width'), + (DRAWNS,u'corner-radius'), + (FONS,u'max-height'), + (FONS,u'min-height'), + (DRAWNS,u'chain-next-name'), + (FONS,u'max-width'), + (TEXTNS,u'id'), + ), +# allowed_attributes + (FORMNS,u'button'):( + (FORMNS,u'tab-stop'), + (FORMNS,u'focus-on-click'), + (FORMNS,u'image-align'), + (FORMNS,u'name'), + (FORMNS,u'tab-index'), + (FORMNS,u'control-implementation'), + (XFORMSNS,u'bind'), + (FORMNS,u'button-type'), + (FORMNS,u'title'), + (FORMNS,u'default-button'), + (FORMNS,u'value'), + (FORMNS,u'label'), + (FORMNS,u'disabled'), + (FORMNS,u'printable'), + (FORMNS,u'image-data'), + (XLINKNS,u'href'), + (FORMNS,u'toggle'), + (FORMNS,u'xforms-submission'), + (OFFICENS,u'target-frame'), + (FORMNS,u'id'), + (FORMNS,u'image-position'), + ), + (FORMNS,u'checkbox'):( + (FORMNS,u'tab-stop'), + (FORMNS,u'image-align'), + (FORMNS,u'name'), + (FORMNS,u'tab-index'), + (FORMNS,u'control-implementation'), + (XFORMSNS,u'bind'), + (FORMNS,u'data-field'), + (FORMNS,u'title'), + (FORMNS,u'is-tristate'), + (FORMNS,u'current-state'), + (FORMNS,u'value'), + (FORMNS,u'label'), + (FORMNS,u'disabled'), + (FORMNS,u'printable'), + (FORMNS,u'state'), + (FORMNS,u'visual-effect'), + (FORMNS,u'id'), + (FORMNS,u'image-position'), + ), + (FORMNS,u'column'):( + (FORMNS,u'control-implementation'), + (FORMNS,u'text-style-name'), + (FORMNS,u'name'), + (FORMNS,u'label'), + ), + (FORMNS,u'combobox'):( + (FORMNS,u'convert-empty-to-null'), + (FORMNS,u'max-length'), + (FORMNS,u'tab-stop'), + (FORMNS,u'name'), + (FORMNS,u'dropdown'), + (FORMNS,u'control-implementation'), + (XFORMSNS,u'bind'), + (FORMNS,u'data-field'), + (FORMNS,u'tab-index'), + (FORMNS,u'auto-complete'), + (FORMNS,u'value'), + (FORMNS,u'disabled'), + (FORMNS,u'printable'), + (FORMNS,u'readonly'), + (FORMNS,u'list-source'), + (FORMNS,u'title'), + (FORMNS,u'list-source-type'), + (FORMNS,u'id'), + (FORMNS,u'current-value'), + (FORMNS,u'size'), + ), +# allowed_attributes + (FORMNS,u'connection-resource'):( + (XLINKNS,u'href'), + ), + (FORMNS,u'date'):( + (FORMNS,u'convert-empty-to-null'), + (FORMNS,u'max-length'), + (FORMNS,u'tab-stop'), + (FORMNS,u'name'), + (FORMNS,u'tab-index'), + (FORMNS,u'control-implementation'), + (FORMNS,u'min-value'), + (FORMNS,u'data-field'), + (FORMNS,u'max-value'), + (FORMNS,u'value'), + (FORMNS,u'disabled'), + (FORMNS,u'printable'), + (FORMNS,u'readonly'), + (XFORMSNS,u'bind'), + (FORMNS,u'title'), + (FORMNS,u'id'), + (FORMNS,u'current-value'), + ), + (FORMNS,u'file'):( + (FORMNS,u'max-length'), + (FORMNS,u'tab-stop'), + (FORMNS,u'name'), + (FORMNS,u'tab-index'), + (FORMNS,u'control-implementation'), + (XFORMSNS,u'bind'), + (FORMNS,u'title'), + (FORMNS,u'value'), + (FORMNS,u'disabled'), + (FORMNS,u'printable'), + (FORMNS,u'readonly'), + (FORMNS,u'id'), + (FORMNS,u'current-value'), + ), + (FORMNS,u'fixed-text'):( + (FORMNS,u'name'), + (FORMNS,u'for'), + (FORMNS,u'title'), + (FORMNS,u'control-implementation'), + (XFORMSNS,u'bind'), + (FORMNS,u'multi-line'), + (FORMNS,u'label'), + (FORMNS,u'disabled'), + (FORMNS,u'printable'), + (FORMNS,u'id'), + ), +# allowed_attributes + (FORMNS,u'form'):( + (XLINKNS,u'actuate'), + (XLINKNS,u'href'), + (FORMNS,u'allow-deletes'), + (FORMNS,u'command-type'), + (FORMNS,u'apply-filter'), + (XLINKNS,u'type'), + (FORMNS,u'method'), + (OFFICENS,u'target-frame'), + (FORMNS,u'navigation-mode'), + (FORMNS,u'detail-fields'), + (FORMNS,u'master-fields'), + (FORMNS,u'allow-updates'), + (FORMNS,u'name'), + (FORMNS,u'tab-cycle'), + (FORMNS,u'control-implementation'), + (FORMNS,u'escape-processing'), + (FORMNS,u'filter'), + (FORMNS,u'command'), + (FORMNS,u'datasource'), + (FORMNS,u'enctype'), + (FORMNS,u'allow-inserts'), + (FORMNS,u'ignore-result'), + (FORMNS,u'order'), + ), + (FORMNS,u'formatted-text'):( + (FORMNS,u'convert-empty-to-null'), + (FORMNS,u'max-length'), + (FORMNS,u'tab-stop'), + (FORMNS,u'max-value'), + (FORMNS,u'name'), + (FORMNS,u'tab-index'), + (FORMNS,u'control-implementation'), + (XFORMSNS,u'bind'), + (FORMNS,u'data-field'), + (FORMNS,u'title'), + (FORMNS,u'value'), + (FORMNS,u'disabled'), + (FORMNS,u'printable'), + (FORMNS,u'readonly'), + (FORMNS,u'min-value'), + (FORMNS,u'validation'), + (FORMNS,u'id'), + (FORMNS,u'current-value'), + ), + (FORMNS,u'frame'):( + (FORMNS,u'name'), + (FORMNS,u'for'), + (FORMNS,u'title'), + (FORMNS,u'control-implementation'), + (XFORMSNS,u'bind'), + (FORMNS,u'label'), + (FORMNS,u'disabled'), + (FORMNS,u'printable'), + (FORMNS,u'id'), + ), +# allowed_attributes + (FORMNS,u'generic-control'):( + (FORMNS,u'control-implementation'), + (XFORMSNS,u'bind'), + (FORMNS,u'name'), + (FORMNS,u'id'), + ), + (FORMNS,u'grid'):( + (FORMNS,u'tab-stop'), + (FORMNS,u'name'), + (FORMNS,u'tab-index'), + (FORMNS,u'control-implementation'), + (XFORMSNS,u'bind'), + (FORMNS,u'title'), + (FORMNS,u'disabled'), + (FORMNS,u'printable'), + (FORMNS,u'id'), + ), + (FORMNS,u'hidden'):( + (FORMNS,u'control-implementation'), + (XFORMSNS,u'bind'), + (FORMNS,u'name'), + (FORMNS,u'value'), + (FORMNS,u'id'), + ), + (FORMNS,u'image'):( + (FORMNS,u'tab-stop'), + (FORMNS,u'name'), + (FORMNS,u'tab-index'), + (FORMNS,u'control-implementation'), + (XFORMSNS,u'bind'), + (FORMNS,u'button-type'), + (FORMNS,u'title'), + (FORMNS,u'value'), + (OFFICENS,u'target-frame'), + (FORMNS,u'disabled'), + (FORMNS,u'printable'), + (FORMNS,u'image-data'), + (XLINKNS,u'href'), + (FORMNS,u'id'), + ), + (FORMNS,u'image-frame'):( + (FORMNS,u'name'), + (FORMNS,u'title'), + (FORMNS,u'control-implementation'), + (XFORMSNS,u'bind'), + (FORMNS,u'data-field'), + (FORMNS,u'readonly'), + (FORMNS,u'disabled'), + (FORMNS,u'printable'), + (FORMNS,u'image-data'), + (FORMNS,u'id'), + ), + (FORMNS,u'item'):( + (FORMNS,u'label'), + ), + (FORMNS,u'list-property'):( + (FORMNS,u'property-name'), + (OFFICENS,u'value-type'), + ), + (FORMNS,u'list-value'):( + (OFFICENS,u'string-value'), + ), +# allowed_attributes + (FORMNS,u'listbox'):( + (FORMNS,u'tab-stop'), + (FORMNS,u'bound-column'), + (FORMNS,u'multiple'), + (FORMNS,u'name'), + (FORMNS,u'dropdown'), + (FORMNS,u'control-implementation'), + (XFORMSNS,u'bind'), + (FORMNS,u'data-field'), + (FORMNS,u'tab-index'), + (FORMNS,u'disabled'), + (FORMNS,u'printable'), + (FORMNS,u'list-source'), + (FORMNS,u'title'), + (FORMNS,u'list-source-type'), + (FORMNS,u'id'), + (FORMNS,u'xforms-list-source'), + (FORMNS,u'size'), + ), + (FORMNS,u'number'):( + (FORMNS,u'convert-empty-to-null'), + (FORMNS,u'max-length'), + (FORMNS,u'tab-stop'), + (FORMNS,u'name'), + (FORMNS,u'tab-index'), + (FORMNS,u'control-implementation'), + (FORMNS,u'min-value'), + (FORMNS,u'data-field'), + (FORMNS,u'max-value'), + (FORMNS,u'value'), + (FORMNS,u'disabled'), + (FORMNS,u'printable'), + (FORMNS,u'readonly'), + (XFORMSNS,u'bind'), + (FORMNS,u'title'), + (FORMNS,u'id'), + (FORMNS,u'current-value'), + ), + (FORMNS,u'option'):( + (FORMNS,u'current-selected'), + (FORMNS,u'selected'), + (FORMNS,u'value'), + (FORMNS,u'label'), + ), + (FORMNS,u'password'):( + (FORMNS,u'convert-empty-to-null'), + (FORMNS,u'max-length'), + (FORMNS,u'tab-stop'), + (FORMNS,u'name'), + (FORMNS,u'tab-index'), + (FORMNS,u'control-implementation'), + (XFORMSNS,u'bind'), + (FORMNS,u'title'), + (FORMNS,u'value'), + (FORMNS,u'disabled'), + (FORMNS,u'printable'), + (FORMNS,u'echo-char'), + (FORMNS,u'id'), + ), + (FORMNS,u'properties'):( + ), + (FORMNS,u'property'):( + (OFFICENS,u'string-value'), + (OFFICENS,u'value'), + (OFFICENS,u'boolean-value'), + (FORMNS,u'property-name'), + (OFFICENS,u'currency'), + (OFFICENS,u'date-value'), + (OFFICENS,u'value-type'), + (OFFICENS,u'time-value'), + ), + (FORMNS,u'radio'):( + (FORMNS,u'tab-stop'), + (FORMNS,u'selected'), + (FORMNS,u'image-align'), + (FORMNS,u'name'), + (FORMNS,u'tab-index'), + (FORMNS,u'control-implementation'), + (XFORMSNS,u'bind'), + (FORMNS,u'data-field'), + (FORMNS,u'current-selected'), + (FORMNS,u'value'), + (FORMNS,u'label'), + (FORMNS,u'disabled'), + (FORMNS,u'printable'), + (FORMNS,u'title'), + (FORMNS,u'visual-effect'), + (FORMNS,u'id'), + (FORMNS,u'image-position'), + ), + (FORMNS,u'text'):( + (FORMNS,u'convert-empty-to-null'), + (FORMNS,u'max-length'), + (FORMNS,u'tab-stop'), + (FORMNS,u'name'), + (FORMNS,u'tab-index'), + (FORMNS,u'control-implementation'), + (XFORMSNS,u'bind'), + (FORMNS,u'data-field'), + (FORMNS,u'title'), + (FORMNS,u'value'), + (FORMNS,u'disabled'), + (FORMNS,u'printable'), + (FORMNS,u'readonly'), + (FORMNS,u'id'), + (FORMNS,u'current-value'), + ), + (FORMNS,u'textarea'):( + (FORMNS,u'convert-empty-to-null'), + (FORMNS,u'max-length'), + (FORMNS,u'tab-stop'), + (FORMNS,u'name'), + (FORMNS,u'tab-index'), + (FORMNS,u'control-implementation'), + (XFORMSNS,u'bind'), + (FORMNS,u'data-field'), + (FORMNS,u'title'), + (FORMNS,u'value'), + (FORMNS,u'disabled'), + (FORMNS,u'printable'), + (FORMNS,u'readonly'), + (FORMNS,u'id'), + (FORMNS,u'current-value'), + ), + (FORMNS,u'time'):( + (FORMNS,u'convert-empty-to-null'), + (FORMNS,u'max-length'), + (FORMNS,u'tab-stop'), + (FORMNS,u'name'), + (FORMNS,u'tab-index'), + (FORMNS,u'control-implementation'), + (FORMNS,u'min-value'), + (FORMNS,u'data-field'), + (FORMNS,u'max-value'), + (FORMNS,u'value'), + (FORMNS,u'disabled'), + (FORMNS,u'printable'), + (FORMNS,u'readonly'), + (XFORMSNS,u'bind'), + (FORMNS,u'title'), + (FORMNS,u'id'), + (FORMNS,u'current-value'), + ), + (FORMNS,u'value-range'):( + (FORMNS,u'tab-stop'), + (FORMNS,u'max-value'), + (FORMNS,u'name'), + (FORMNS,u'tab-index'), + (FORMNS,u'control-implementation'), + (XFORMSNS,u'bind'), + (FORMNS,u'title'), + (FORMNS,u'value'), + (FORMNS,u'disabled'), + (FORMNS,u'printable'), + (FORMNS,u'orientation'), + (FORMNS,u'page-step-size'), + (FORMNS,u'delay-for-repeat'), + (FORMNS,u'min-value'), + (FORMNS,u'id'), + (FORMNS,u'step-size'), + ), + (MANIFESTNS,'algorithm') : ( + (MANIFESTNS,'algorithm-name'), + (MANIFESTNS,'initialisation-vector'), + ), + (MANIFESTNS,'encryption-data') : ( + (MANIFESTNS,'checksum-type'), + (MANIFESTNS,'checksum'), + ), + (MANIFESTNS,'file-entry') : ( + (MANIFESTNS,'full-path'), + (MANIFESTNS,'media-type'), + (MANIFESTNS,'size'), + ), + (MANIFESTNS,'key-derivation') : ( + (MANIFESTNS,'key-derivation-name'), + (MANIFESTNS,'salt'), + (MANIFESTNS,'iteration-count'), + ), + (MANIFESTNS,u'manifest'):( + ), +# allowed_attributes + (METANS,u'auto-reload'):( + (METANS,u'delay'), + (XLINKNS,u'actuate'), + (XLINKNS,u'href'), + (XLINKNS,u'type'), + (XLINKNS,u'show'), + ), + (METANS,u'creation-date'):( + ), + (METANS,u'date-string'):( + ), + (METANS,u'document-statistic'):( + (METANS,u'non-whitespace-character-count'), + (METANS,u'ole-object-count'), + (METANS,u'table-count'), + (METANS,u'row-count'), + (METANS,u'character-count'), + (METANS,u'sentence-count'), + (METANS,u'draw-count'), + (METANS,u'paragraph-count'), + (METANS,u'word-count'), + (METANS,u'object-count'), + (METANS,u'syllable-count'), + (METANS,u'image-count'), + (METANS,u'page-count'), + (METANS,u'frame-count'), + (METANS,u'cell-count'), + ), + (METANS,u'editing-cycles'):( + ), + (METANS,u'editing-duration'):( + ), + (METANS,u'generator'):( + ), +# allowed_attributes + (METANS,u'hyperlink-behaviour'):( + (OFFICENS,u'target-frame-name'), + (XLINKNS,u'show'), + ), + (METANS,u'initial-creator'):( + ), + (METANS,u'keyword'):( + ), + (METANS,u'print-date'):( + ), + (METANS,u'printed-by'):( + ), + (METANS,u'template'):( + (METANS,u'date'), + (XLINKNS,u'actuate'), + (XLINKNS,u'href'), + (XLINKNS,u'type'), + (XLINKNS,u'title'), + ), + (METANS,u'user-defined'):( + (METANS,u'name'), + (METANS,u'value-type'), + ), + (OFFICENS,u'annotation'):( + (DRAWNS,u'layer'), + (SVGNS,u'height'), + (TEXTNS,u'anchor-page-number'), + (TABLENS,u'table-background'), + (TABLENS,u'end-cell-address'), + (DRAWNS,u'transform'), + (DRAWNS,u'id'), + (SVGNS,u'width'), + (DRAWNS,u'class-names'), + (DRAWNS,u'style-name'), + (PRESENTATIONNS,u'class-names'), + (TABLENS,u'end-x'), + (DRAWNS,u'text-style-name'), + (DRAWNS,u'z-index'), + (PRESENTATIONNS,u'style-name'), + (TEXTNS,u'anchor-type'), + (DRAWNS,u'name'), + (DRAWNS,u'caption-point-y'), + (DRAWNS,u'caption-point-x'), + (DRAWNS,u'corner-radius'), + (SVGNS,u'y'), + (SVGNS,u'x'), + (TABLENS,u'end-y'), + (OFFICENS,u'display'), + ), + (OFFICENS,u'automatic-styles'):( + ), + (OFFICENS,u'binary-data'):( + ), + (OFFICENS,u'body'):( + ), + (OFFICENS,u'change-info'):( + ), + (OFFICENS,u'chart'):( + ), + (OFFICENS,u'dde-source'):( + (OFFICENS,u'dde-application'), + (OFFICENS,u'automatic-update'), + (OFFICENS,u'conversion-mode'), + (OFFICENS,u'dde-item'), + (OFFICENS,u'dde-topic'), + (OFFICENS,u'name'), + ), + (OFFICENS,u'document'):( + (OFFICENS,u'mimetype'), + (OFFICENS,u'version'), + ), + (OFFICENS,u'document-content'):( + (OFFICENS,u'version'), + ), + (OFFICENS,u'document-meta'):( + (OFFICENS,u'version'), + ), + (OFFICENS,u'document-settings'):( + (OFFICENS,u'version'), + ), + (OFFICENS,u'document-styles'):( + (OFFICENS,u'version'), + ), + (OFFICENS,u'drawing'):( + ), + (OFFICENS,u'event-listeners'):( + ), + (OFFICENS,u'font-face-decls'):( + ), + (OFFICENS,u'forms'):( + (FORMNS,u'automatic-focus'), + (FORMNS,u'apply-design-mode'), + ), + (OFFICENS,u'image'):( + ), +# allowed_attributes + (OFFICENS,u'master-styles'):( + ), + (OFFICENS,u'meta'):( + ), + (OFFICENS,u'presentation'):( + ), + (OFFICENS,u'script'):( + (SCRIPTNS,u'language'), + ), + (OFFICENS,u'scripts'):( + ), + (OFFICENS,u'settings'):( + ), + (OFFICENS,u'spreadsheet'):( + (TABLENS,u'structure-protected'), + (TABLENS,u'protection-key'), + ), + (OFFICENS,u'styles'):( + ), + (OFFICENS,u'text'):( + (TEXTNS,u'global'), + (TEXTNS,u'use-soft-page-breaks'), + ), + (PRESENTATIONNS,u'animation-group'):( + ), + (PRESENTATIONNS,u'animations'):( + ), + (PRESENTATIONNS,u'date-time'):( + ), + (PRESENTATIONNS,u'date-time-decl'):( + (PRESENTATIONNS,u'source'), + (STYLENS,u'data-style-name'), + (PRESENTATIONNS,u'name'), + ), + (PRESENTATIONNS,u'dim'):( + (DRAWNS,u'color'), + (DRAWNS,u'shape-id'), + ), + (PRESENTATIONNS,u'event-listener'):( + (PRESENTATIONNS,u'direction'), + (XLINKNS,u'show'), + (XLINKNS,u'type'), + (XLINKNS,u'actuate'), + (PRESENTATIONNS,u'effect'), + (SCRIPTNS,u'event-name'), + (PRESENTATIONNS,u'start-scale'), + (XLINKNS,u'href'), + (PRESENTATIONNS,u'verb'), + (PRESENTATIONNS,u'action'), + (PRESENTATIONNS,u'speed'), + ), + (PRESENTATIONNS,u'footer'):( + ), + (PRESENTATIONNS,u'footer-decl'):( + (PRESENTATIONNS,u'name'), + ), + (PRESENTATIONNS,u'header'):( + ), + (PRESENTATIONNS,u'header-decl'):( + (PRESENTATIONNS,u'name'), + ), + (PRESENTATIONNS,u'hide-shape'):( + (PRESENTATIONNS,u'direction'), + (PRESENTATIONNS,u'effect'), + (PRESENTATIONNS,u'delay'), + (PRESENTATIONNS,u'start-scale'), + (PRESENTATIONNS,u'path-id'), + (PRESENTATIONNS,u'speed'), + (DRAWNS,u'shape-id'), + ), +# allowed_attributes + (PRESENTATIONNS,u'hide-text'):( + (PRESENTATIONNS,u'direction'), + (PRESENTATIONNS,u'effect'), + (PRESENTATIONNS,u'delay'), + (PRESENTATIONNS,u'start-scale'), + (PRESENTATIONNS,u'path-id'), + (PRESENTATIONNS,u'speed'), + (DRAWNS,u'shape-id'), + ), + (PRESENTATIONNS,u'notes'):( + (STYLENS,u'page-layout-name'), + (DRAWNS,u'style-name'), + (PRESENTATIONNS,u'use-header-name'), + (PRESENTATIONNS,u'use-date-time-name'), + (PRESENTATIONNS,u'use-footer-name'), + ), + (PRESENTATIONNS,u'placeholder'):( + (SVGNS,u'y'), + (SVGNS,u'x'), + (SVGNS,u'height'), + (PRESENTATIONNS,u'object'), + (SVGNS,u'width'), + ), + (PRESENTATIONNS,u'play'):( + (PRESENTATIONNS,u'speed'), + (DRAWNS,u'shape-id'), + ), +# allowed_attributes + (PRESENTATIONNS,u'settings'):( + (PRESENTATIONNS,u'animations'), + (PRESENTATIONNS,u'endless'), + (PRESENTATIONNS,u'force-manual'), + (PRESENTATIONNS,u'full-screen'), + (PRESENTATIONNS,u'mouse-as-pen'), + (PRESENTATIONNS,u'mouse-visible'), + (PRESENTATIONNS,u'pause'), + (PRESENTATIONNS,u'show'), + (PRESENTATIONNS,u'show-end-of-presentation-slide'), + (PRESENTATIONNS,u'show-logo'), + (PRESENTATIONNS,u'start-page'), + (PRESENTATIONNS,u'start-with-navigator'), + (PRESENTATIONNS,u'stay-on-top'), + (PRESENTATIONNS,u'transition-on-click'), + ), + (PRESENTATIONNS,u'show'):( + (PRESENTATIONNS,u'name'), + (PRESENTATIONNS,u'pages'), + ), + (PRESENTATIONNS,u'show-shape'):( + (PRESENTATIONNS,u'direction'), + (PRESENTATIONNS,u'effect'), + (PRESENTATIONNS,u'delay'), + (PRESENTATIONNS,u'start-scale'), + (PRESENTATIONNS,u'path-id'), + (PRESENTATIONNS,u'speed'), + (DRAWNS,u'shape-id'), + ), + (PRESENTATIONNS,u'show-text'):( + (PRESENTATIONNS,u'direction'), + (PRESENTATIONNS,u'effect'), + (PRESENTATIONNS,u'delay'), + (PRESENTATIONNS,u'start-scale'), + (PRESENTATIONNS,u'path-id'), + (PRESENTATIONNS,u'speed'), + (DRAWNS,u'shape-id'), + ), + (PRESENTATIONNS,u'sound'):( + (XLINKNS,u'actuate'), + (XLINKNS,u'href'), + (XLINKNS,u'type'), + (PRESENTATIONNS,u'play-full'), + (XLINKNS,u'show'), + ), +# allowed_attributes + (SCRIPTNS,u'event-listener'):( + (SCRIPTNS,u'language'), + (SCRIPTNS,u'macro-name'), + (XLINKNS,u'actuate'), + (SCRIPTNS,u'event-name'), + (XLINKNS,u'href'), + (XLINKNS,u'type'), + ), + (STYLENS,u'background-image'):( + (DRAWNS,u'opacity'), + (STYLENS,u'repeat'), + (XLINKNS,u'show'), + (XLINKNS,u'actuate'), + (STYLENS,u'filter-name'), + (XLINKNS,u'href'), + (STYLENS,u'position'), + (XLINKNS,u'type'), + ), + (STYLENS,u'chart-properties'): ( + (CHARTNS,u'connect-bars'), + (CHARTNS,u'data-label-number'), + (CHARTNS,u'data-label-symbol'), + (CHARTNS,u'data-label-text'), + (CHARTNS,u'deep'), + (CHARTNS,u'display-label'), + (CHARTNS,u'error-category'), + (CHARTNS,u'error-lower-indicator'), + (CHARTNS,u'error-lower-limit'), + (CHARTNS,u'error-margin'), + (CHARTNS,u'error-percentage'), + (CHARTNS,u'error-upper-indicator'), + (CHARTNS,u'error-upper-limit'), + (CHARTNS,u'gap-width'), + (CHARTNS,u'interpolation'), + (CHARTNS,u'interval-major'), + (CHARTNS,u'interval-minor-divisor'), + (CHARTNS,u'japanese-candle-stick'), + (CHARTNS,u'label-arrangement'), + (CHARTNS,u'lines'), + (CHARTNS,u'link-data-style-to-source'), + (CHARTNS,u'logarithmic'), + (CHARTNS,u'maximum'), + (CHARTNS,u'mean-value'), + (CHARTNS,u'minimum'), + (CHARTNS,u'origin'), + (CHARTNS,u'overlap'), + (CHARTNS,u'percentage'), + (CHARTNS,u'pie-offset'), + (CHARTNS,u'regression-type'), + (CHARTNS,u'scale-text'), + (CHARTNS,u'series-source'), + (CHARTNS,u'solid-type'), + (CHARTNS,u'spline-order'), + (CHARTNS,u'spline-resolution'), + (CHARTNS,u'stacked'), + (CHARTNS,u'symbol-height'), + (CHARTNS,u'symbol-name'), + (CHARTNS,u'symbol-type'), + (CHARTNS,u'symbol-width'), + (CHARTNS,u'text-overlap'), + (CHARTNS,u'three-dimensional'), + (CHARTNS,u'tick-marks-major-inner'), + (CHARTNS,u'tick-marks-major-outer'), + (CHARTNS,u'tick-marks-minor-inner'), + (CHARTNS,u'tick-marks-minor-outer'), + (CHARTNS,u'vertical'), + (CHARTNS,u'visible'), + (STYLENS,u'direction'), + (STYLENS,u'rotation-angle'), + (TEXTNS,u'line-break'), + ), + (STYLENS,u'column'):( + (FONS,u'end-indent'), + (FONS,u'space-before'), + (FONS,u'start-indent'), + (FONS,u'space-after'), + (STYLENS,u'rel-width'), + ), + (STYLENS,u'column-sep'):( + (STYLENS,u'color'), + (STYLENS,u'width'), + (STYLENS,u'style'), + (STYLENS,u'vertical-align'), + (STYLENS,u'height'), + ), + (STYLENS,u'columns'):( + (FONS,u'column-count'), + (FONS,u'column-gap'), + ), + (STYLENS,u'default-style'):( + (STYLENS,u'family'), + ), +# allowed_attributes + (STYLENS,u'drawing-page-properties'): ( + (DRAWNS,u'fill'), + (DRAWNS,u'fill-color'), + (DRAWNS,u'secondary-fill-color'), + (DRAWNS,u'fill-gradient-name'), + (DRAWNS,u'gradient-step-count'), + (DRAWNS,u'fill-hatch-name'), + (DRAWNS,u'fill-hatch-solid'), + (DRAWNS,u'fill-image-name'), + (STYLENS,u'repeat'), + (DRAWNS,u'fill-image-width'), + (DRAWNS,u'fill-image-height'), + (DRAWNS,u'fill-image-ref-point-x'), + (DRAWNS,u'fill-image-ref-point-y'), + (DRAWNS,u'fill-image-ref-point'), + (DRAWNS,u'tile-repeat-offset'), + (DRAWNS,u'opacity'), + (DRAWNS,u'opacity-name'), + (SVGNS,u'fill-rule'), + (PRESENTATIONNS,u'transition-type'), + (PRESENTATIONNS,u'transition-style'), + (PRESENTATIONNS,u'transition-speed'), + (SMILNS,u'type'), + (SMILNS,u'subtype'), + (SMILNS,u'direction'), + (SMILNS,u'fadeColor'), + (PRESENTATIONNS,u'duration'), + (PRESENTATIONNS,u'visibility'), + (DRAWNS,u'background-size'), + (PRESENTATIONNS,u'background-objects-visible'), + (PRESENTATIONNS,u'background-visible'), + (PRESENTATIONNS,u'display-header'), + (PRESENTATIONNS,u'display-footer'), + (PRESENTATIONNS,u'display-page-number'), + (PRESENTATIONNS,u'display-date-time'), + ), + (STYLENS,u'drop-cap'):( + (STYLENS,u'distance'), + (STYLENS,u'length'), + (STYLENS,u'style-name'), + (STYLENS,u'lines'), + ), +# allowed_attributes + (STYLENS,u'font-face'):( + (STYLENS,u'font-adornments'), + (STYLENS,u'font-charset'), + (STYLENS,u'font-family-generic'), + (STYLENS,u'font-pitch'), + (STYLENS,u'name'), + (SVGNS,u'accent-height'), + (SVGNS,u'alphabetic'), + (SVGNS,u'ascent'), + (SVGNS,u'bbox'), + (SVGNS,u'cap-height'), + (SVGNS,u'descent'), + (SVGNS,u'font-family'), + (SVGNS,u'font-size'), + (SVGNS,u'font-stretch'), + (SVGNS,u'font-style'), + (SVGNS,u'font-variant'), + (SVGNS,u'font-weight'), + (SVGNS,u'hanging'), + (SVGNS,u'ideographic'), + (SVGNS,u'mathematical'), + (SVGNS,u'overline-position'), + (SVGNS,u'overline-thickness'), + (SVGNS,u'panose-1'), + (SVGNS,u'slope'), + (SVGNS,u'stemh'), + (SVGNS,u'stemv'), + (SVGNS,u'strikethrough-position'), + (SVGNS,u'strikethrough-thickness'), + (SVGNS,u'underline-position'), + (SVGNS,u'underline-thickness'), + (SVGNS,u'unicode-range'), + (SVGNS,u'units-per-em'), + (SVGNS,u'v-alphabetic'), + (SVGNS,u'v-hanging'), + (SVGNS,u'v-ideographic'), + (SVGNS,u'v-mathematical'), + (SVGNS,u'widths'), + (SVGNS,u'x-height'), + ), + (STYLENS,u'footer'):( + (STYLENS,u'display'), + ), + (STYLENS,u'footer-left'):( + (STYLENS,u'display'), + ), + (STYLENS,u'footer-style'):( + ), + (STYLENS,u'footnote-sep'):( + (STYLENS,u'distance-after-sep'), + (STYLENS,u'color'), + (STYLENS,u'rel-width'), + (STYLENS,u'width'), + (STYLENS,u'distance-before-sep'), + (STYLENS,u'line-style'), + (STYLENS,u'adjustment'), + ), +# allowed_attributes + (STYLENS,u'graphic-properties'): ( + (DR3DNS,u'ambient-color'), + (DR3DNS,u'back-scale'), + (DR3DNS,u'backface-culling'), + (DR3DNS,u'close-back'), + (DR3DNS,u'close-front'), + (DR3DNS,u'depth'), + (DR3DNS,u'diffuse-color'), + (DR3DNS,u'edge-rounding'), + (DR3DNS,u'edge-rounding-mode'), + (DR3DNS,u'emissive-color'), + (DR3DNS,u'end-angle'), + (DR3DNS,u'horizontal-segments'), + (DR3DNS,u'lighting-mode'), + (DR3DNS,u'normals-direction'), + (DR3DNS,u'normals-kind'), + (DR3DNS,u'shadow'), + (DR3DNS,u'shininess'), + (DR3DNS,u'specular-color'), + (DR3DNS,u'texture-filter'), + (DR3DNS,u'texture-generation-mode-x'), + (DR3DNS,u'texture-generation-mode-y'), + (DR3DNS,u'texture-kind'), + (DR3DNS,u'texture-mode'), + (DR3DNS,u'vertical-segments'), + (DRAWNS,u'auto-grow-height'), + (DRAWNS,u'auto-grow-width'), + (DRAWNS,u'blue'), + (DRAWNS,u'caption-angle'), + (DRAWNS,u'caption-angle-type'), + (DRAWNS,u'caption-escape'), + (DRAWNS,u'caption-escape-direction'), + (DRAWNS,u'caption-fit-line-length'), + (DRAWNS,u'caption-gap'), + (DRAWNS,u'caption-line-length'), + (DRAWNS,u'caption-type'), + (DRAWNS,u'color-inversion'), + (DRAWNS,u'color-mode'), + (DRAWNS,u'contrast'), + (DRAWNS,u'decimal-places'), + (DRAWNS,u'end-guide'), + (DRAWNS,u'end-line-spacing-horizontal'), + (DRAWNS,u'end-line-spacing-vertical'), + (DRAWNS,u'fill'), + (DRAWNS,u'fill-color'), + (DRAWNS,u'fill-gradient-name'), + (DRAWNS,u'fill-hatch-name'), + (DRAWNS,u'fill-hatch-solid'), + (DRAWNS,u'fill-image-height'), + (DRAWNS,u'fill-image-name'), + (DRAWNS,u'fill-image-ref-point'), + (DRAWNS,u'fill-image-ref-point-x'), + (DRAWNS,u'fill-image-ref-point-y'), + (DRAWNS,u'fill-image-width'), +# allowed_attributes + (DRAWNS,u'fit-to-contour'), + (DRAWNS,u'fit-to-size'), + (DRAWNS,u'frame-display-border'), + (DRAWNS,u'frame-display-scrollbar'), + (DRAWNS,u'frame-margin-horizontal'), + (DRAWNS,u'frame-margin-vertical'), + (DRAWNS,u'gamma'), + (DRAWNS,u'gradient-step-count'), + (DRAWNS,u'green'), + (DRAWNS,u'guide-distance'), + (DRAWNS,u'guide-overhang'), + (DRAWNS,u'image-opacity'), + (DRAWNS,u'line-distance'), + (DRAWNS,u'luminance'), + (DRAWNS,u'marker-end'), + (DRAWNS,u'marker-end-center'), + (DRAWNS,u'marker-end-width'), + (DRAWNS,u'marker-start'), + (DRAWNS,u'marker-start-center'), + (DRAWNS,u'marker-start-width'), + (DRAWNS,u'measure-align'), + (DRAWNS,u'measure-vertical-align'), + (DRAWNS,u'ole-draw-aspect'), + (DRAWNS,u'opacity'), + (DRAWNS,u'opacity-name'), + (DRAWNS,u'parallel'), + (DRAWNS,u'placing'), + (DRAWNS,u'red'), + (DRAWNS,u'secondary-fill-color'), + (DRAWNS,u'shadow'), + (DRAWNS,u'shadow-color'), + (DRAWNS,u'shadow-offset-x'), + (DRAWNS,u'shadow-offset-y'), + (DRAWNS,u'shadow-opacity'), + (DRAWNS,u'show-unit'), + (DRAWNS,u'start-guide'), + (DRAWNS,u'start-line-spacing-horizontal'), + (DRAWNS,u'start-line-spacing-vertical'), + (DRAWNS,u'stroke'), + (DRAWNS,u'stroke-dash'), + (DRAWNS,u'stroke-dash-names'), + (DRAWNS,u'stroke-linejoin'), + (DRAWNS,u'symbol-color'), + (DRAWNS,u'textarea-horizontal-align'), + (DRAWNS,u'textarea-vertical-align'), + (DRAWNS,u'tile-repeat-offset'), + (DRAWNS,u'unit'), + (DRAWNS,u'visible-area-height'), + (DRAWNS,u'visible-area-left'), + (DRAWNS,u'visible-area-top'), + (DRAWNS,u'visible-area-width'), + (DRAWNS,u'wrap-influence-on-position'), +# allowed_attributes + (FONS,u'background-color'), + (FONS,u'border'), + (FONS,u'border-bottom'), + (FONS,u'border-left'), + (FONS,u'border-right'), + (FONS,u'border-top'), + (FONS,u'clip'), + (FONS,u'margin'), + (FONS,u'margin-bottom'), + (FONS,u'margin-left'), + (FONS,u'margin-right'), + (FONS,u'margin-top'), + (FONS,u'max-height'), + (FONS,u'max-width'), + (FONS,u'min-height'), + (FONS,u'min-width'), + (FONS,u'padding'), + (FONS,u'padding-bottom'), + (FONS,u'padding-left'), + (FONS,u'padding-right'), + (FONS,u'padding-top'), + (FONS,u'wrap-option'), + (STYLENS,u'border-line-width'), + (STYLENS,u'border-line-width-bottom'), + (STYLENS,u'border-line-width-left'), + (STYLENS,u'border-line-width-right'), + (STYLENS,u'border-line-width-top'), + (STYLENS,u'editable'), + (STYLENS,u'flow-with-text'), + (STYLENS,u'horizontal-pos'), + (STYLENS,u'horizontal-rel'), + (STYLENS,u'mirror'), + (STYLENS,u'number-wrapped-paragraphs'), + (STYLENS,u'overflow-behavior'), + (STYLENS,u'print-content'), + (STYLENS,u'protect'), + (STYLENS,u'rel-height'), + (STYLENS,u'rel-width'), + (STYLENS,u'repeat'), + (STYLENS,u'run-through'), + (STYLENS,u'shadow'), + (STYLENS,u'vertical-pos'), + (STYLENS,u'vertical-rel'), + (STYLENS,u'wrap'), + (STYLENS,u'wrap-contour'), + (STYLENS,u'wrap-contour-mode'), + (STYLENS,u'wrap-dynamic-threshold'), + (STYLENS,u'writing-mode'), + (SVGNS,u'fill-rule'), + (SVGNS,u'height'), + (SVGNS,u'stroke-color'), + (SVGNS,u'stroke-opacity'), + (SVGNS,u'stroke-width'), + (SVGNS,u'width'), + (SVGNS,u'x'), + (SVGNS,u'y'), + (TEXTNS,u'anchor-page-number'), + (TEXTNS,u'anchor-type'), + (TEXTNS,u'animation'), + (TEXTNS,u'animation-delay'), + (TEXTNS,u'animation-direction'), + (TEXTNS,u'animation-repeat'), + (TEXTNS,u'animation-start-inside'), + (TEXTNS,u'animation-steps'), + (TEXTNS,u'animation-stop-inside'), + ), + (STYLENS,u'handout-master'):( + (PRESENTATIONNS,u'presentation-page-layout-name'), + (STYLENS,u'page-layout-name'), + (PRESENTATIONNS,u'use-footer-name'), + (DRAWNS,u'style-name'), + (PRESENTATIONNS,u'use-header-name'), + (PRESENTATIONNS,u'use-date-time-name'), + ), +# allowed_attributes + (STYLENS,u'header'):( + (STYLENS,u'display'), + ), + (STYLENS,u'header-footer-properties'): ( + (FONS,u'background-color'), + (FONS,u'border'), + (FONS,u'border-bottom'), + (FONS,u'border-left'), + (FONS,u'border-right'), + (FONS,u'border-top'), + (FONS,u'margin'), + (FONS,u'margin-bottom'), + (FONS,u'margin-left'), + (FONS,u'margin-right'), + (FONS,u'margin-top'), + (FONS,u'min-height'), + (FONS,u'padding'), + (FONS,u'padding-bottom'), + (FONS,u'padding-left'), + (FONS,u'padding-right'), + (FONS,u'padding-top'), + (STYLENS,u'border-line-width'), + (STYLENS,u'border-line-width-bottom'), + (STYLENS,u'border-line-width-left'), + (STYLENS,u'border-line-width-right'), + (STYLENS,u'border-line-width-top'), + (STYLENS,u'dynamic-spacing'), + (STYLENS,u'shadow'), + (SVGNS,u'height'), + ), + (STYLENS,u'header-left'):( + (STYLENS,u'display'), + ), + (STYLENS,u'header-style'):( + ), +# allowed_attributes + (STYLENS,u'list-level-properties'): ( + (FONS,u'height'), + (FONS,u'text-align'), + (FONS,u'width'), + (STYLENS,u'font-name'), + (STYLENS,u'vertical-pos'), + (STYLENS,u'vertical-rel'), + (SVGNS,u'y'), + (TEXTNS,u'min-label-distance'), + (TEXTNS,u'min-label-width'), + (TEXTNS,u'space-before'), + ), + (STYLENS,u'map'):( + (STYLENS,u'apply-style-name'), + (STYLENS,u'base-cell-address'), + (STYLENS,u'condition'), + ), + (STYLENS,u'master-page'):( + (STYLENS,u'page-layout-name'), + (STYLENS,u'display-name'), + (DRAWNS,u'style-name'), + (STYLENS,u'name'), + (STYLENS,u'next-style-name'), + ), + (STYLENS,u'page-layout'):( + (STYLENS,u'name'), + (STYLENS,u'page-usage'), + ), +# allowed_attributes + (STYLENS,u'page-layout-properties'): ( + (FONS,u'background-color'), + (FONS,u'border'), + (FONS,u'border-bottom'), + (FONS,u'border-left'), + (FONS,u'border-right'), + (FONS,u'border-top'), + (FONS,u'margin'), + (FONS,u'margin-bottom'), + (FONS,u'margin-left'), + (FONS,u'margin-right'), + (FONS,u'margin-top'), + (FONS,u'padding'), + (FONS,u'padding-bottom'), + (FONS,u'padding-left'), + (FONS,u'padding-right'), + (FONS,u'padding-top'), + (FONS,u'page-height'), + (FONS,u'page-width'), + (STYLENS,u'border-line-width'), + (STYLENS,u'border-line-width-bottom'), + (STYLENS,u'border-line-width-left'), + (STYLENS,u'border-line-width-right'), + (STYLENS,u'border-line-width-top'), + (STYLENS,u'first-page-number'), + (STYLENS,u'footnote-max-height'), + (STYLENS,u'layout-grid-base-height'), + (STYLENS,u'layout-grid-color'), + (STYLENS,u'layout-grid-display'), + (STYLENS,u'layout-grid-lines'), + (STYLENS,u'layout-grid-mode'), + (STYLENS,u'layout-grid-print'), + (STYLENS,u'layout-grid-ruby-below'), + (STYLENS,u'layout-grid-ruby-height'), + (STYLENS,u'num-format'), + (STYLENS,u'num-letter-sync'), + (STYLENS,u'num-prefix'), + (STYLENS,u'num-suffix'), + (STYLENS,u'paper-tray-name'), + (STYLENS,u'print'), + (STYLENS,u'print-orientation'), + (STYLENS,u'print-page-order'), + (STYLENS,u'register-truth-ref-style-name'), + (STYLENS,u'scale-to'), + (STYLENS,u'scale-to-pages'), + (STYLENS,u'shadow'), + (STYLENS,u'table-centering'), + (STYLENS,u'writing-mode'), + ), +# allowed_attributes + (STYLENS,u'paragraph-properties'): ( + (FONS,u'background-color'), + (FONS,u'border'), + (FONS,u'border-bottom'), + (FONS,u'border-left'), + (FONS,u'border-right'), + (FONS,u'border-top'), + (FONS,u'break-after'), + (FONS,u'break-before'), + (FONS,u'hyphenation-keep'), + (FONS,u'hyphenation-ladder-count'), + (FONS,u'keep-together'), + (FONS,u'keep-with-next'), + (FONS,u'line-height'), + (FONS,u'margin'), + (FONS,u'margin-bottom'), + (FONS,u'margin-left'), + (FONS,u'margin-right'), + (FONS,u'margin-top'), + (FONS,u'orphans'), + (FONS,u'padding'), + (FONS,u'padding-bottom'), + (FONS,u'padding-left'), + (FONS,u'padding-right'), + (FONS,u'padding-top'), + (FONS,u'text-align'), + (FONS,u'text-align-last'), + (FONS,u'text-indent'), + (FONS,u'widows'), + (STYLENS,u'auto-text-indent'), + (STYLENS,u'background-transparency'), + (STYLENS,u'border-line-width'), + (STYLENS,u'border-line-width-bottom'), + (STYLENS,u'border-line-width-left'), + (STYLENS,u'border-line-width-right'), + (STYLENS,u'border-line-width-top'), + (STYLENS,u'font-independent-line-spacing'), + (STYLENS,u'justify-single-word'), + (STYLENS,u'line-break'), + (STYLENS,u'line-height-at-least'), + (STYLENS,u'line-spacing'), + (STYLENS,u'page-number'), + (STYLENS,u'punctuation-wrap'), + (STYLENS,u'register-true'), + (STYLENS,u'shadow'), + (STYLENS,u'snap-to-layout-grid'), + (STYLENS,u'tab-stop-distance'), + (STYLENS,u'text-autospace'), + (STYLENS,u'vertical-align'), + (STYLENS,u'writing-mode'), + (STYLENS,u'writing-mode-automatic'), + (TEXTNS,u'line-number'), + (TEXTNS,u'number-lines'), + ), + (STYLENS,u'presentation-page-layout'):( + (STYLENS,u'display-name'), + (STYLENS,u'name'), + ), +# allowed_attributes + (STYLENS,u'region-center'):( + ), + (STYLENS,u'region-left'):( + ), + (STYLENS,u'region-right'):( + ), + (STYLENS,u'ruby-properties'): ( + (STYLENS,u'ruby-position'), + (STYLENS,u'ruby-align'), + ), + (STYLENS,u'section-properties'): ( + (FONS,u'background-color'), + (FONS,u'margin-left'), + (FONS,u'margin-right'), + (STYLENS,u'protect'), + (STYLENS,u'writing-mode'), + (TEXTNS,u'dont-balance-text-columns'), + ), + (STYLENS,u'style'):( + (STYLENS,u'family'), + (STYLENS,u'list-style-name'), + (STYLENS,u'name'), + (STYLENS,u'auto-update'), + (STYLENS,u'default-outline-level'), + (STYLENS,u'class'), + (STYLENS,u'next-style-name'), + (STYLENS,u'data-style-name'), + (STYLENS,u'master-page-name'), + (STYLENS,u'display-name'), + (STYLENS,u'parent-style-name'), + ), +# allowed_attributes + (STYLENS,u'tab-stop'):( + (STYLENS,u'leader-text-style'), + (STYLENS,u'leader-width'), + (STYLENS,u'leader-style'), + (STYLENS,u'char'), + (STYLENS,u'leader-color'), + (STYLENS,u'position'), + (STYLENS,u'leader-text'), + (STYLENS,u'type'), + (STYLENS,u'leader-type'), + ), + (STYLENS,u'tab-stops'):( + ), + (STYLENS,u'table-cell-properties'): ( + (FONS,u'background-color'), + (FONS,u'border'), + (FONS,u'border-bottom'), + (FONS,u'border-left'), + (FONS,u'border-right'), + (FONS,u'border-top'), + (FONS,u'padding'), + (FONS,u'padding-bottom'), + (FONS,u'padding-left'), + (FONS,u'padding-right'), + (FONS,u'padding-top'), + (FONS,u'wrap-option'), + (STYLENS,u'border-line-width'), + (STYLENS,u'border-line-width-bottom'), + (STYLENS,u'border-line-width-left'), + (STYLENS,u'border-line-width-right'), + (STYLENS,u'border-line-width-top'), + (STYLENS,u'cell-protect'), + (STYLENS,u'decimal-places'), + (STYLENS,u'diagonal-bl-tr'), + (STYLENS,u'diagonal-bl-tr-widths'), + (STYLENS,u'diagonal-tl-br'), + (STYLENS,u'diagonal-tl-br-widths'), + (STYLENS,u'direction'), + (STYLENS,u'glyph-orientation-vertical'), + (STYLENS,u'print-content'), + (STYLENS,u'repeat-content'), + (STYLENS,u'rotation-align'), + (STYLENS,u'rotation-angle'), + (STYLENS,u'shadow'), + (STYLENS,u'shrink-to-fit'), + (STYLENS,u'text-align-source'), + (STYLENS,u'vertical-align'), + ), +# allowed_attributes + (STYLENS,u'table-column-properties'): ( + (FONS,u'break-after'), + (FONS,u'break-before'), + (STYLENS,u'column-width'), + (STYLENS,u'rel-column-width'), + (STYLENS,u'use-optimal-column-width'), + ), + (STYLENS,u'table-properties'): ( + (FONS,u'background-color'), + (FONS,u'break-after'), + (FONS,u'break-before'), + (FONS,u'keep-with-next'), + (FONS,u'margin'), + (FONS,u'margin-bottom'), + (FONS,u'margin-left'), + (FONS,u'margin-right'), + (FONS,u'margin-top'), + (STYLENS,u'may-break-between-rows'), + (STYLENS,u'page-number'), + (STYLENS,u'rel-width'), + (STYLENS,u'shadow'), + (STYLENS,u'width'), + (STYLENS,u'writing-mode'), + (TABLENS,u'align'), + (TABLENS,u'border-model'), + (TABLENS,u'display'), + ), + (STYLENS,u'table-row-properties'): ( + (FONS,u'background-color'), + (FONS,u'break-after'), + (FONS,u'break-before'), + (FONS,u'keep-together'), + (STYLENS,u'min-row-height'), + (STYLENS,u'row-height'), + (STYLENS,u'use-optimal-row-height'), + ), +# allowed_attributes + (STYLENS,u'text-properties'): ( + (FONS,u'background-color'), + (FONS,u'color'), + (FONS,u'country'), + (FONS,u'font-family'), + (FONS,u'font-size'), + (FONS,u'font-style'), + (FONS,u'font-variant'), + (FONS,u'font-weight'), + (FONS,u'hyphenate'), + (FONS,u'hyphenation-push-char-count'), + (FONS,u'hyphenation-remain-char-count'), + (FONS,u'language'), + (FONS,u'letter-spacing'), + (FONS,u'text-shadow'), + (FONS,u'text-transform'), + (STYLENS,u'country-asian'), + (STYLENS,u'country-complex'), + (STYLENS,u'font-charset'), + (STYLENS,u'font-charset-asian'), + (STYLENS,u'font-charset-complex'), + (STYLENS,u'font-family-asian'), + (STYLENS,u'font-family-complex'), + (STYLENS,u'font-family-generic'), + (STYLENS,u'font-family-generic-asian'), + (STYLENS,u'font-family-generic-complex'), + (STYLENS,u'font-name'), + (STYLENS,u'font-name-asian'), + (STYLENS,u'font-name-complex'), + (STYLENS,u'font-pitch'), + (STYLENS,u'font-pitch-asian'), + (STYLENS,u'font-pitch-complex'), + (STYLENS,u'font-relief'), + (STYLENS,u'font-size-asian'), + (STYLENS,u'font-size-complex'), + (STYLENS,u'font-size-rel'), + (STYLENS,u'font-size-rel-asian'), + (STYLENS,u'font-size-rel-complex'), + (STYLENS,u'font-style-asian'), + (STYLENS,u'font-style-complex'), + (STYLENS,u'font-style-name'), + (STYLENS,u'font-style-name-asian'), + (STYLENS,u'font-style-name-complex'), + (STYLENS,u'font-weight-asian'), + (STYLENS,u'font-weight-complex'), + (STYLENS,u'language-asian'), + (STYLENS,u'language-complex'), + (STYLENS,u'letter-kerning'), + (STYLENS,u'script-type'), + (STYLENS,u'text-blinking'), + (STYLENS,u'text-combine'), + (STYLENS,u'text-combine-end-char'), + (STYLENS,u'text-combine-start-char'), + (STYLENS,u'text-emphasize'), + (STYLENS,u'text-line-through-color'), + (STYLENS,u'text-line-through-mode'), + (STYLENS,u'text-line-through-style'), + (STYLENS,u'text-line-through-text'), + (STYLENS,u'text-line-through-text-style'), + (STYLENS,u'text-line-through-type'), + (STYLENS,u'text-line-through-width'), + (STYLENS,u'text-outline'), + (STYLENS,u'text-position'), + (STYLENS,u'text-rotation-angle'), + (STYLENS,u'text-rotation-scale'), + (STYLENS,u'text-scale'), + (STYLENS,u'text-underline-color'), + (STYLENS,u'text-underline-mode'), + (STYLENS,u'text-underline-style'), + (STYLENS,u'text-underline-type'), + (STYLENS,u'text-underline-width'), + (STYLENS,u'use-window-font-color'), + (TEXTNS,u'condition'), + (TEXTNS,u'display'), + ), + (SVGNS,u'definition-src'):( + (XLINKNS,u'actuate'), + (XLINKNS,u'href'), + (XLINKNS,u'type'), + ), + (SVGNS,u'desc'):( + ), + (SVGNS,u'font-face-format'):( + (SVGNS,u'string'), + ), +# allowed_attributes + (SVGNS,u'font-face-name'):( + (SVGNS,u'name'), + ), + (SVGNS,u'font-face-src'):( + ), + (SVGNS,u'font-face-uri'):( + (XLINKNS,u'actuate'), + (XLINKNS,u'href'), + (XLINKNS,u'type'), + ), + (SVGNS,u'linearGradient'):( + (SVGNS,u'y2'), + (DRAWNS,u'name'), + (SVGNS,u'spreadMethod'), + (SVGNS,u'gradientUnits'), + (SVGNS,u'x2'), + (SVGNS,u'gradientTransform'), + (SVGNS,u'y1'), + (DRAWNS,u'display-name'), + (SVGNS,u'x1'), + ), + (SVGNS,u'radialGradient'):( + (DRAWNS,u'name'), + (SVGNS,u'fx'), + (SVGNS,u'fy'), + (SVGNS,u'spreadMethod'), + (SVGNS,u'gradientUnits'), + (SVGNS,u'cy'), + (SVGNS,u'cx'), + (SVGNS,u'gradientTransform'), + (DRAWNS,u'display-name'), + (SVGNS,u'r'), + ), + (SVGNS,u'stop'):( + (SVGNS,u'stop-color'), + (SVGNS,u'stop-opacity'), + (SVGNS,u'offset'), + ), + (SVGNS,u'title'):( + ), +# allowed_attributes + (TABLENS,u'body'):( + (TEXTNS,u'paragraph-style-name'), + (TEXTNS,u'style-name'), + ), + (TABLENS,u'calculation-settings'):( + (TABLENS,u'automatic-find-labels'), + (TABLENS,u'case-sensitive'), + (TABLENS,u'search-criteria-must-apply-to-whole-cell'), + (TABLENS,u'precision-as-shown'), + (TABLENS,u'use-regular-expressions'), + (TABLENS,u'null-year'), + ), + (TABLENS,u'cell-address'):( + (TABLENS,u'column'), + (TABLENS,u'table'), + (TABLENS,u'row'), + ), + (TABLENS,u'cell-content-change'):( + (TABLENS,u'id'), + (TABLENS,u'rejecting-change-id'), + (TABLENS,u'acceptance-state'), + ), + (TABLENS,u'cell-content-deletion'):( + (TABLENS,u'id'), + ), + (TABLENS,u'cell-range-source'):( + (TABLENS,u'last-row-spanned'), + (TABLENS,u'last-column-spanned'), + (TABLENS,u'name'), + (TABLENS,u'filter-options'), + (XLINKNS,u'actuate'), + (TABLENS,u'filter-name'), + (XLINKNS,u'href'), + (TABLENS,u'refresh-delay'), + (XLINKNS,u'type'), + ), + (TABLENS,u'change-deletion'):( + (TABLENS,u'id'), + ), + (TABLENS,u'change-track-table-cell'):( + (OFFICENS,u'string-value'), + (TABLENS,u'cell-address'), + (TABLENS,u'number-matrix-columns-spanned'), + (TABLENS,u'number-matrix-rows-spanned'), + (TABLENS,u'matrix-covered'), + (OFFICENS,u'value-type'), + (OFFICENS,u'boolean-value'), + (OFFICENS,u'currency'), + (OFFICENS,u'date-value'), + (OFFICENS,u'value'), + (TABLENS,u'formula'), + (OFFICENS,u'time-value'), + ), + (TABLENS,u'consolidation'):( + (TABLENS,u'function'), + (TABLENS,u'source-cell-range-addresses'), + (TABLENS,u'target-cell-address'), + (TABLENS,u'link-to-source-data'), + (TABLENS,u'use-labels'), + ), + (TABLENS,u'content-validation'):( + (TABLENS,u'base-cell-address'), + (TABLENS,u'display-list'), + (TABLENS,u'allow-empty-cell'), + (TABLENS,u'name'), + (TABLENS,u'condition'), + ), + (TABLENS,u'content-validations'):( + ), +# allowed_attributes + (TABLENS,u'covered-table-cell'):( + (TABLENS,u'protect'), + (OFFICENS,u'string-value'), + (OFFICENS,u'value'), + (OFFICENS,u'boolean-value'), + (OFFICENS,u'currency'), + (OFFICENS,u'date-value'), + (TABLENS,u'style-name'), + (TABLENS,u'content-validation-name'), + (OFFICENS,u'value-type'), + (TABLENS,u'number-columns-repeated'), + (TABLENS,u'formula'), + (OFFICENS,u'time-value'), + ), + (TABLENS,u'cut-offs'):( + ), + (TABLENS,u'data-pilot-display-info'):( + (TABLENS,u'member-count'), + (TABLENS,u'data-field'), + (TABLENS,u'enabled'), + (TABLENS,u'display-member-mode'), + ), + (TABLENS,u'data-pilot-field'):( + (TABLENS,u'selected-page'), + (TABLENS,u'function'), + (TABLENS,u'orientation'), + (TABLENS,u'used-hierarchy'), + (TABLENS,u'is-data-layout-field'), + (TABLENS,u'source-field-name'), + ), + (TABLENS,u'data-pilot-field-reference'):( + (TABLENS,u'member-name'), + (TABLENS,u'field-name'), + (TABLENS,u'member-type'), + (TABLENS,u'type'), + ), +# allowed_attributes + (TABLENS,u'data-pilot-group'):( + (TABLENS,u'name'), + ), + (TABLENS,u'data-pilot-group-member'):( + (TABLENS,u'name'), + ), + (TABLENS,u'data-pilot-groups'):( + (TABLENS,u'date-end'), + (TABLENS,u'end'), + (TABLENS,u'start'), + (TABLENS,u'source-field-name'), + (TABLENS,u'step'), + (TABLENS,u'date-start'), + (TABLENS,u'grouped-by'), + ), + (TABLENS,u'data-pilot-layout-info'):( + (TABLENS,u'add-empty-lines'), + (TABLENS,u'layout-mode'), + ), + (TABLENS,u'data-pilot-level'):( + (TABLENS,u'show-empty'), + ), +# allowed_attributes + (TABLENS,u'data-pilot-member'):( + (TABLENS,u'show-details'), + (TABLENS,u'name'), + (TABLENS,u'display'), + ), + (TABLENS,u'data-pilot-members'):( + ), + (TABLENS,u'data-pilot-sort-info'):( + (TABLENS,u'data-field'), + (TABLENS,u'sort-mode'), + (TABLENS,u'order'), + ), + (TABLENS,u'data-pilot-subtotal'):( + (TABLENS,u'function'), + ), + (TABLENS,u'data-pilot-subtotals'):( + ), + (TABLENS,u'data-pilot-table'):( + (TABLENS,u'buttons'), + (TABLENS,u'application-data'), + (TABLENS,u'name'), + (TABLENS,u'drill-down-on-double-click'), + (TABLENS,u'target-range-address'), + (TABLENS,u'ignore-empty-rows'), + (TABLENS,u'identify-categories'), + (TABLENS,u'show-filter-button'), + (TABLENS,u'grand-total'), + ), +# allowed_attributes + (TABLENS,u'data-pilot-tables'):( + ), + (TABLENS,u'database-range'):( + (TABLENS,u'orientation'), + (TABLENS,u'target-range-address'), + (TABLENS,u'contains-header'), + (TABLENS,u'on-update-keep-size'), + (TABLENS,u'name'), + (TABLENS,u'is-selection'), + (TABLENS,u'refresh-delay'), + (TABLENS,u'display-filter-buttons'), + (TABLENS,u'has-persistent-data'), + (TABLENS,u'on-update-keep-styles'), + ), + (TABLENS,u'database-ranges'):( + ), + (TABLENS,u'database-source-query'):( + (TABLENS,u'query-name'), + (TABLENS,u'database-name'), + ), +# allowed_attributes + (TABLENS,u'database-source-sql'):( + (TABLENS,u'parse-sql-statement'), + (TABLENS,u'database-name'), + (TABLENS,u'sql-statement'), + ), + (TABLENS,u'database-source-table'):( + (TABLENS,u'database-table-name'), + (TABLENS,u'database-name'), + ), + (TABLENS,u'dde-link'):( + ), + (TABLENS,u'dde-links'):( + ), + (TABLENS,u'deletion'):( + (TABLENS,u'rejecting-change-id'), + (TABLENS,u'multi-deletion-spanned'), + (TABLENS,u'acceptance-state'), + (TABLENS,u'table'), + (TABLENS,u'position'), + (TABLENS,u'type'), + (TABLENS,u'id'), + ), +# allowed_attributes + (TABLENS,u'deletions'):( + ), + (TABLENS,u'dependencies'):( + ), + (TABLENS,u'dependency'):( + (TABLENS,u'id'), + ), + (TABLENS,u'detective'):( + ), + (TABLENS,u'error-macro'):( + (TABLENS,u'execute'), + ), + (TABLENS,u'error-message'):( + (TABLENS,u'display'), + (TABLENS,u'message-type'), + (TABLENS,u'title'), + ), + (TABLENS,u'even-columns'):( + (TEXTNS,u'paragraph-style-name'), + (TEXTNS,u'style-name'), + ), + (TABLENS,u'even-rows'):( + (TEXTNS,u'paragraph-style-name'), + (TEXTNS,u'style-name'), + ), +# allowed_attributes + (TABLENS,u'filter'):( + (TABLENS,u'target-range-address'), + (TABLENS,u'display-duplicates'), + (TABLENS,u'condition-source-range-address'), + (TABLENS,u'condition-source'), + ), + (TABLENS,u'filter-and'):( + ), + (TABLENS,u'filter-condition'):( + (TABLENS,u'operator'), + (TABLENS,u'field-number'), + (TABLENS,u'data-type'), + (TABLENS,u'case-sensitive'), + (TABLENS,u'value'), + ), + (TABLENS,u'filter-or'):( + ), + (TABLENS,u'first-column'):( + (TEXTNS,u'paragraph-style-name'), + (TEXTNS,u'style-name'), + ), + (TABLENS,u'first-row'):( + (TEXTNS,u'paragraph-style-name'), + (TEXTNS,u'style-name'), + ), +# allowed_attributes + (TABLENS,u'help-message'):( + (TABLENS,u'display'), + (TABLENS,u'title'), + ), + (TABLENS,u'highlighted-range'):( + (TABLENS,u'contains-error'), + (TABLENS,u'direction'), + (TABLENS,u'marked-invalid'), + (TABLENS,u'cell-range-address'), + ), + (TABLENS,u'insertion'):( + (TABLENS,u'count'), + (TABLENS,u'rejecting-change-id'), + (TABLENS,u'acceptance-state'), + (TABLENS,u'table'), + (TABLENS,u'position'), + (TABLENS,u'type'), + (TABLENS,u'id'), + ), + (TABLENS,u'insertion-cut-off'):( + (TABLENS,u'position'), + (TABLENS,u'id'), + ), + (TABLENS,u'iteration'):( + (TABLENS,u'status'), + (TABLENS,u'maximum-difference'), + (TABLENS,u'steps'), + ), +# allowed_attributes + (TABLENS,u'label-range'):( + (TABLENS,u'label-cell-range-address'), + (TABLENS,u'data-cell-range-address'), + (TABLENS,u'orientation'), + ), + (TABLENS,u'label-ranges'):( + ), + (TABLENS,u'last-column'):( + (TEXTNS,u'paragraph-style-name'), + (TEXTNS,u'style-name'), + ), + (TABLENS,u'last-row'):( + (TEXTNS,u'paragraph-style-name'), + (TEXTNS,u'style-name'), + ), + (TABLENS,u'movement'):( + (TABLENS,u'id'), + (TABLENS,u'rejecting-change-id'), + (TABLENS,u'acceptance-state'), + ), + (TABLENS,u'movement-cut-off'):( + (TABLENS,u'position'), + (TABLENS,u'end-position'), + (TABLENS,u'start-position'), + ), + (TABLENS,u'named-expression'):( + (TABLENS,u'base-cell-address'), + (TABLENS,u'expression'), + (TABLENS,u'name'), + ), + (TABLENS,u'named-expressions'):( + ), + (TABLENS,u'named-range'):( + (TABLENS,u'range-usable-as'), + (TABLENS,u'base-cell-address'), + (TABLENS,u'name'), + (TABLENS,u'cell-range-address'), + ), + (TABLENS,u'null-date'):( + (TABLENS,u'date-value'), + (TABLENS,u'value-type'), + ), + (TABLENS,u'odd-columns'):( + (TEXTNS,u'paragraph-style-name'), + (TEXTNS,u'style-name'), + ), + (TABLENS,u'odd-rows'):( + (TEXTNS,u'paragraph-style-name'), + (TEXTNS,u'style-name'), + ), + (TABLENS,u'operation'):( + (TABLENS,u'index'), + (TABLENS,u'name'), + ), + (TABLENS,u'previous'):( + (TABLENS,u'id'), + ), + (TABLENS,u'scenario'):( + (TABLENS,u'comment'), + (TABLENS,u'border-color'), + (TABLENS,u'copy-back'), + (TABLENS,u'is-active'), + (TABLENS,u'protected'), + (TABLENS,u'copy-formulas'), + (TABLENS,u'copy-styles'), + (TABLENS,u'scenario-ranges'), + (TABLENS,u'display-border'), + ), + (TABLENS,u'shapes'):( + ), + (TABLENS,u'sort'):( + (TABLENS,u'case-sensitive'), + (TABLENS,u'algorithm'), + (TABLENS,u'target-range-address'), + (TABLENS,u'country'), + (TABLENS,u'language'), + (TABLENS,u'bind-styles-to-content'), + ), + (TABLENS,u'sort-by'):( + (TABLENS,u'field-number'), + (TABLENS,u'data-type'), + (TABLENS,u'order'), + ), + (TABLENS,u'sort-groups'):( + (TABLENS,u'data-type'), + (TABLENS,u'order'), + ), + (TABLENS,u'source-cell-range'):( + (TABLENS,u'cell-range-address'), + ), + (TABLENS,u'source-range-address'):( + (TABLENS,u'column'), + (TABLENS,u'end-column'), + (TABLENS,u'start-table'), + (TABLENS,u'end-row'), + (TABLENS,u'table'), + (TABLENS,u'start-row'), + (TABLENS,u'row'), + (TABLENS,u'end-table'), + (TABLENS,u'start-column'), + ), +# allowed_attributes + (TABLENS,u'source-service'):( + (TABLENS,u'user-name'), + (TABLENS,u'source-name'), + (TABLENS,u'password'), + (TABLENS,u'object-name'), + (TABLENS,u'name'), + ), + (TABLENS,u'subtotal-field'):( + (TABLENS,u'function'), + (TABLENS,u'field-number'), + ), + (TABLENS,u'subtotal-rule'):( + (TABLENS,u'group-by-field-number'), + ), + (TABLENS,u'subtotal-rules'):( + (TABLENS,u'bind-styles-to-content'), + (TABLENS,u'page-breaks-on-group-change'), + (TABLENS,u'case-sensitive'), + ), + (TABLENS,u'table'):( + (TABLENS,u'name'), + (TABLENS,u'is-sub-table'), + (TABLENS,u'style-name'), + (TABLENS,u'protected'), + (TABLENS,u'print-ranges'), + (TABLENS,u'print'), + (TABLENS,u'protection-key'), + ), + (TABLENS,u'table-cell'):( + (TABLENS,u'protect'), + (TABLENS,u'number-matrix-rows-spanned'), + (TABLENS,u'number-matrix-columns-spanned'), + (OFFICENS,u'string-value'), + (TABLENS,u'number-columns-spanned'), + (OFFICENS,u'value'), + (OFFICENS,u'boolean-value'), + (OFFICENS,u'currency'), + (OFFICENS,u'date-value'), + (TABLENS,u'style-name'), + (TABLENS,u'content-validation-name'), + (OFFICENS,u'value-type'), + (TABLENS,u'number-rows-spanned'), + (TABLENS,u'number-columns-repeated'), + (TABLENS,u'formula'), + (OFFICENS,u'time-value'), + ), +# allowed_attributes + (TABLENS,u'table-column'):( + (TABLENS,u'style-name'), + (TABLENS,u'default-cell-style-name'), + (TABLENS,u'visibility'), + (TABLENS,u'number-columns-repeated'), + ), + (TABLENS,u'table-column-group'):( + (TABLENS,u'display'), + ), + (TABLENS,u'table-columns'):( + ), + (TABLENS,u'table-header-columns'):( + ), + (TABLENS,u'table-header-rows'):( + ), + (TABLENS,u'table-row'):( + (TABLENS,u'number-rows-repeated'), + (TABLENS,u'style-name'), + (TABLENS,u'visibility'), + (TABLENS,u'default-cell-style-name'), + ), + (TABLENS,u'table-row-group'):( + (TABLENS,u'display'), + ), + (TABLENS,u'table-rows'):( + ), + (TABLENS,u'table-source'):( + (TABLENS,u'filter-options'), + (XLINKNS,u'actuate'), + (TABLENS,u'filter-name'), + (XLINKNS,u'href'), + (TABLENS,u'mode'), + (TABLENS,u'table-name'), + (XLINKNS,u'type'), + (TABLENS,u'refresh-delay'), + ), + (TABLENS,u'table-template'):( + (TEXTNS,u'last-row-end-column'), + (TEXTNS,u'first-row-end-column'), + (TEXTNS,u'name'), + (TEXTNS,u'last-row-start-column'), + (TEXTNS,u'first-row-start-column'), + ), + (TABLENS,u'target-range-address'):( + (TABLENS,u'column'), + (TABLENS,u'end-column'), + (TABLENS,u'start-table'), + (TABLENS,u'end-row'), + (TABLENS,u'table'), + (TABLENS,u'start-row'), + (TABLENS,u'row'), + (TABLENS,u'end-table'), + (TABLENS,u'start-column'), + ), + (TABLENS,u'tracked-changes'):( + (TABLENS,u'track-changes'), + ), +# allowed_attributes + (TEXTNS,u'a'):( + (TEXTNS,u'visited-style-name'), + (OFFICENS,u'name'), + (OFFICENS,u'title'), + (XLINKNS,u'show'), + (OFFICENS,u'target-frame-name'), + (XLINKNS,u'actuate'), + (TEXTNS,u'style-name'), + (XLINKNS,u'href'), + (XLINKNS,u'type'), + ), + (TEXTNS,u'alphabetical-index'):( + (TEXTNS,u'protected'), + (TEXTNS,u'style-name'), + (TEXTNS,u'name'), + (TEXTNS,u'protection-key'), + ), + (TEXTNS,u'alphabetical-index-auto-mark-file'):( + (XLINKNS,u'href'), + (XLINKNS,u'type'), + ), + (TEXTNS,u'alphabetical-index-entry-template'):( + (TEXTNS,u'style-name'), + (TEXTNS,u'outline-level'), + ), + (TEXTNS,u'alphabetical-index-mark'):( + (TEXTNS,u'main-entry'), + (TEXTNS,u'key1-phonetic'), + (TEXTNS,u'key2'), + (TEXTNS,u'key1'), + (TEXTNS,u'string-value'), + (TEXTNS,u'key2-phonetic'), + (TEXTNS,u'string-value-phonetic'), + ), +# allowed_attributes + (TEXTNS,u'alphabetical-index-mark-end'):( + (TEXTNS,u'id'), + ), + (TEXTNS,u'alphabetical-index-mark-start'):( + (TEXTNS,u'main-entry'), + (TEXTNS,u'key1-phonetic'), + (TEXTNS,u'key2'), + (TEXTNS,u'key1'), + (TEXTNS,u'string-value-phonetic'), + (TEXTNS,u'key2-phonetic'), + (TEXTNS,u'id'), + ), + (TEXTNS,u'alphabetical-index-source'):( + (TEXTNS,u'capitalize-entries'), + (FONS,u'language'), + (TEXTNS,u'relative-tab-stop-position'), + (TEXTNS,u'alphabetical-separators'), + (TEXTNS,u'combine-entries-with-pp'), + (TEXTNS,u'combine-entries-with-dash'), + (TEXTNS,u'sort-algorithm'), + (TEXTNS,u'ignore-case'), + (TEXTNS,u'combine-entries'), + (TEXTNS,u'comma-separated'), + (FONS,u'country'), + (TEXTNS,u'index-scope'), + (TEXTNS,u'main-entry-style-name'), + (TEXTNS,u'use-keys-as-entries'), + ), +# allowed_attributes + (TEXTNS,u'author-initials'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'author-name'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'bibliography'):( + (TEXTNS,u'protected'), + (TEXTNS,u'style-name'), + (TEXTNS,u'name'), + (TEXTNS,u'protection-key'), + ), + (TEXTNS,u'bibliography-configuration'):( + (TEXTNS,u'suffix'), + (FONS,u'language'), + (TEXTNS,u'numbered-entries'), + (FONS,u'country'), + (TEXTNS,u'sort-by-position'), + (TEXTNS,u'sort-algorithm'), + (TEXTNS,u'prefix'), + ), + (TEXTNS,u'bibliography-entry-template'):( + (TEXTNS,u'style-name'), + (TEXTNS,u'bibliography-type'), + ), +# allowed_attributes + (TEXTNS,u'bibliography-mark'):( + (TEXTNS,u'address'), + (TEXTNS,u'annote'), + (TEXTNS,u'author'), + (TEXTNS,u'bibliography-type'), + (TEXTNS,u'booktitle'), + (TEXTNS,u'chapter'), + (TEXTNS,u'custom1'), + (TEXTNS,u'custom2'), + (TEXTNS,u'custom3'), + (TEXTNS,u'custom4'), + (TEXTNS,u'custom5'), + (TEXTNS,u'edition'), + (TEXTNS,u'editor'), + (TEXTNS,u'howpublished'), + (TEXTNS,u'identifier'), + (TEXTNS,u'institution'), + (TEXTNS,u'isbn'), + (TEXTNS,u'issn'), + (TEXTNS,u'journal'), + (TEXTNS,u'month'), + (TEXTNS,u'note'), + (TEXTNS,u'number'), + (TEXTNS,u'organizations'), + (TEXTNS,u'pages'), + (TEXTNS,u'publisher'), + (TEXTNS,u'report-type'), + (TEXTNS,u'school'), + (TEXTNS,u'series'), + (TEXTNS,u'title'), + (TEXTNS,u'url'), + (TEXTNS,u'volume'), + (TEXTNS,u'year'), + ), + (TEXTNS,u'bibliography-source'):( + ), + (TEXTNS,u'bookmark'):( + (TEXTNS,u'name'), + ), + (TEXTNS,u'bookmark-end'):( + (TEXTNS,u'name'), + ), + (TEXTNS,u'bookmark-ref'):( + (TEXTNS,u'ref-name'), + (TEXTNS,u'reference-format'), + ), + (TEXTNS,u'bookmark-start'):( + (TEXTNS,u'name'), + ), +# allowed_attributes + (TEXTNS,u'change'):( + (TEXTNS,u'change-id'), + ), + (TEXTNS,u'change-end'):( + (TEXTNS,u'change-id'), + ), + (TEXTNS,u'change-start'):( + (TEXTNS,u'change-id'), + ), + (TEXTNS,u'changed-region'):( + (TEXTNS,u'id'), + ), + (TEXTNS,u'chapter'):( + (TEXTNS,u'display'), + (TEXTNS,u'outline-level'), + ), + (TEXTNS,u'conditional-text'):( + (TEXTNS,u'string-value-if-true'), + (TEXTNS,u'current-value'), + (TEXTNS,u'string-value-if-false'), + (TEXTNS,u'condition'), + ), + (TEXTNS,u'creation-date'):( + (TEXTNS,u'date-value'), + (TEXTNS,u'fixed'), + (STYLENS,u'data-style-name'), + ), + (TEXTNS,u'creation-time'):( + (TEXTNS,u'fixed'), + (TEXTNS,u'time-value'), + (STYLENS,u'data-style-name'), + ), + (TEXTNS,u'creator'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'database-display'):( + (TEXTNS,u'column-name'), + (TEXTNS,u'table-name'), + (TEXTNS,u'table-type'), + (TEXTNS,u'database-name'), + (STYLENS,u'data-style-name'), + ), + (TEXTNS,u'database-name'):( + (TEXTNS,u'table-name'), + (TEXTNS,u'table-type'), + (TEXTNS,u'database-name'), + ), + (TEXTNS,u'database-next'):( + (TEXTNS,u'table-name'), + (TEXTNS,u'table-type'), + (TEXTNS,u'database-name'), + (TEXTNS,u'condition'), + ), + (TEXTNS,u'database-row-number'):( + (STYLENS,u'num-format'), + (TEXTNS,u'database-name'), + (TEXTNS,u'value'), + (STYLENS,u'num-letter-sync'), + (TEXTNS,u'table-name'), + (TEXTNS,u'table-type'), + ), + (TEXTNS,u'database-row-select'):( + (TEXTNS,u'row-number'), + (TEXTNS,u'table-name'), + (TEXTNS,u'table-type'), + (TEXTNS,u'database-name'), + (TEXTNS,u'condition'), + ), +# allowed_attributes + (TEXTNS,u'date'):( + (TEXTNS,u'date-value'), + (TEXTNS,u'fixed'), + (TEXTNS,u'date-adjust'), + (STYLENS,u'data-style-name'), + ), + (TEXTNS,u'dde-connection'):( + (TEXTNS,u'connection-name'), + ), + (TEXTNS,u'dde-connection-decl'):( + (OFFICENS,u'automatic-update'), + (OFFICENS,u'dde-topic'), + (OFFICENS,u'dde-application'), + (OFFICENS,u'name'), + (OFFICENS,u'dde-item'), + ), + (TEXTNS,u'dde-connection-decls'):( + ), + (TEXTNS,u'deletion'):( + ), + (TEXTNS,u'description'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'editing-cycles'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'editing-duration'):( + (TEXTNS,u'duration'), + (TEXTNS,u'fixed'), + (STYLENS,u'data-style-name'), + ), + (TEXTNS,u'execute-macro'):( + (TEXTNS,u'name'), + ), + (TEXTNS,u'expression'):( + (TEXTNS,u'display'), + (OFFICENS,u'string-value'), + (OFFICENS,u'value'), + (OFFICENS,u'boolean-value'), + (OFFICENS,u'currency'), + (OFFICENS,u'date-value'), + (STYLENS,u'data-style-name'), + (OFFICENS,u'value-type'), + (TEXTNS,u'formula'), + (OFFICENS,u'time-value'), + ), + (TEXTNS,u'file-name'):( + (TEXTNS,u'fixed'), + (TEXTNS,u'display'), + ), +# allowed_attributes + (TEXTNS,u'format-change'):( + ), + (TEXTNS,u'h'):( + (TEXTNS,u'restart-numbering'), + (TEXTNS,u'cond-style-name'), + (TEXTNS,u'is-list-header'), + (TEXTNS,u'style-name'), + (TEXTNS,u'class-names'), + (TEXTNS,u'start-value'), + (TEXTNS,u'id'), + (TEXTNS,u'outline-level'), + ), + (TEXTNS,u'hidden-paragraph'):( + (TEXTNS,u'is-hidden'), + (TEXTNS,u'condition'), + ), + (TEXTNS,u'hidden-text'):( + (TEXTNS,u'string-value'), + (TEXTNS,u'is-hidden'), + (TEXTNS,u'condition'), + ), + (TEXTNS,u'illustration-index'):( + (TEXTNS,u'protected'), + (TEXTNS,u'style-name'), + (TEXTNS,u'name'), + (TEXTNS,u'protection-key'), + ), + (TEXTNS,u'illustration-index-entry-template'):( + (TEXTNS,u'style-name'), + ), + (TEXTNS,u'illustration-index-source'):( + (TEXTNS,u'index-scope'), + (TEXTNS,u'caption-sequence-name'), + (TEXTNS,u'use-caption'), + (TEXTNS,u'caption-sequence-format'), + (TEXTNS,u'relative-tab-stop-position'), + ), + (TEXTNS,u'index-body'):( + ), + (TEXTNS,u'index-entry-bibliography'):( + (TEXTNS,u'bibliography-data-field'), + (TEXTNS,u'style-name'), + ), + (TEXTNS,u'index-entry-chapter'):( + (TEXTNS,u'style-name'), + (TEXTNS,u'display'), + ), +# allowed_attributes + (TEXTNS,u'index-entry-link-end'):( + (TEXTNS,u'style-name'), + ), + (TEXTNS,u'index-entry-link-start'):( + (TEXTNS,u'style-name'), + ), + (TEXTNS,u'index-entry-page-number'):( + (TEXTNS,u'style-name'), + ), + (TEXTNS,u'index-entry-span'):( + (TEXTNS,u'style-name'), + ), + (TEXTNS,u'index-entry-tab-stop'):( + (STYLENS,u'position'), + (TEXTNS,u'style-name'), + (STYLENS,u'type'), + (STYLENS,u'leader-char'), + ), + (TEXTNS,u'index-entry-text'):( + (TEXTNS,u'style-name'), + ), + (TEXTNS,u'index-source-style'):( + (TEXTNS,u'style-name'), + ), + (TEXTNS,u'index-source-styles'):( + (TEXTNS,u'outline-level'), + ), + (TEXTNS,u'index-title'):( + (TEXTNS,u'protected'), + (TEXTNS,u'style-name'), + (TEXTNS,u'name'), + (TEXTNS,u'protection-key'), + ), + (TEXTNS,u'index-title-template'):( + (TEXTNS,u'style-name'), + ), + (TEXTNS,u'initial-creator'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'insertion'):( + ), +# allowed_attributes + (TEXTNS,u'keywords'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'line-break'):( + ), + (TEXTNS,u'linenumbering-configuration'):( + (TEXTNS,u'number-position'), + (TEXTNS,u'number-lines'), + (STYLENS,u'num-format'), + (TEXTNS,u'count-empty-lines'), + (TEXTNS,u'count-in-text-boxes'), + (TEXTNS,u'style-name'), + (STYLENS,u'num-letter-sync'), + (TEXTNS,u'increment'), + (TEXTNS,u'offset'), + (TEXTNS,u'restart-on-page'), + ), + (TEXTNS,u'linenumbering-separator'):( + (TEXTNS,u'increment'), + ), + (TEXTNS,u'list'):( + (TEXTNS,u'style-name'), + (TEXTNS,u'continue-numbering'), + ), + (TEXTNS,u'list-header'):( + ), + (TEXTNS,u'list-item'):( + (TEXTNS,u'start-value'), + ), + (TEXTNS,u'list-level-style-bullet'):( + (TEXTNS,u'level'), + (STYLENS,u'num-prefix'), + (STYLENS,u'num-suffix'), + (TEXTNS,u'bullet-relative-size'), + (TEXTNS,u'style-name'), + (TEXTNS,u'bullet-char'), + ), + (TEXTNS,u'list-level-style-image'):( + (XLINKNS,u'show'), + (XLINKNS,u'actuate'), + (XLINKNS,u'href'), + (XLINKNS,u'type'), + (TEXTNS,u'level'), + ), + (TEXTNS,u'list-level-style-number'):( + (TEXTNS,u'level'), + (TEXTNS,u'display-levels'), + (STYLENS,u'num-format'), + (STYLENS,u'num-suffix'), + (TEXTNS,u'style-name'), + (STYLENS,u'num-prefix'), + (STYLENS,u'num-letter-sync'), + (TEXTNS,u'start-value'), + ), +# allowed_attributes + (TEXTNS,u'list-style'):( + (TEXTNS,u'consecutive-numbering'), + (STYLENS,u'display-name'), + (STYLENS,u'name'), + ), + (TEXTNS,u'measure'):( + (TEXTNS,u'kind'), + ), + (TEXTNS,u'modification-date'):( + (TEXTNS,u'date-value'), + (TEXTNS,u'fixed'), + (STYLENS,u'data-style-name'), + ), + (TEXTNS,u'modification-time'):( + (TEXTNS,u'fixed'), + (TEXTNS,u'time-value'), + (STYLENS,u'data-style-name'), + ), + (TEXTNS,u'note'):( + (TEXTNS,u'note-class'), + (TEXTNS,u'id'), + ), + (TEXTNS,u'note-body'):( + ), + (TEXTNS,u'note-citation'):( + (TEXTNS,u'label'), + ), + (TEXTNS,u'note-continuation-notice-backward'):( + ), + (TEXTNS,u'note-continuation-notice-forward'):( + ), + (TEXTNS,u'note-ref'):( + (TEXTNS,u'ref-name'), + (TEXTNS,u'note-class'), + (TEXTNS,u'reference-format'), + ), + (TEXTNS,u'notes-configuration'):( + (TEXTNS,u'citation-body-style-name'), + (STYLENS,u'num-format'), + (TEXTNS,u'default-style-name'), + (STYLENS,u'num-suffix'), + (TEXTNS,u'start-numbering-at'), + (STYLENS,u'num-prefix'), + (STYLENS,u'num-letter-sync'), + (TEXTNS,u'citation-style-name'), + (TEXTNS,u'footnotes-position'), + (TEXTNS,u'master-page-name'), + (TEXTNS,u'start-value'), + (TEXTNS,u'note-class'), + ), + (TEXTNS,u'number'):( + ), + (TEXTNS,u'numbered-paragraph'):( + (TEXTNS,u'continue-numbering'), + (TEXTNS,u'style-name'), + (TEXTNS,u'start-value'), + (TEXTNS,u'level'), + ), + (TEXTNS,u'object-count'):( + (STYLENS,u'num-format'), + (STYLENS,u'num-letter-sync'), + ), + (TEXTNS,u'object-index'):( + (TEXTNS,u'protected'), + (TEXTNS,u'style-name'), + (TEXTNS,u'name'), + (TEXTNS,u'protection-key'), + ), +# allowed_attributes + (TEXTNS,u'object-index-entry-template'):( + (TEXTNS,u'style-name'), + ), + (TEXTNS,u'object-index-source'):( + (TEXTNS,u'use-draw-objects'), + (TEXTNS,u'use-math-objects'), + (TEXTNS,u'relative-tab-stop-position'), + (TEXTNS,u'use-chart-objects'), + (TEXTNS,u'index-scope'), + (TEXTNS,u'use-spreadsheet-objects'), + (TEXTNS,u'use-other-objects'), + ), + (TEXTNS,u'outline-level-style'):( + (TEXTNS,u'level'), + (TEXTNS,u'display-levels'), + (STYLENS,u'num-format'), + (STYLENS,u'num-suffix'), + (TEXTNS,u'style-name'), + (STYLENS,u'num-prefix'), + (STYLENS,u'num-letter-sync'), + (TEXTNS,u'start-value'), + ), + (TEXTNS,u'outline-style'):( + ), + (TEXTNS,u'p'):( + (TEXTNS,u'cond-style-name'), + (TEXTNS,u'style-name'), + (TEXTNS,u'class-names'), + (TEXTNS,u'id'), + ), + (TEXTNS,u'page'):( + (TEXTNS,u'master-page-name'), + ), + (TEXTNS,u'page-continuation'):( + (TEXTNS,u'string-value'), + (TEXTNS,u'select-page'), + ), + (TEXTNS,u'page-number'):( + (TEXTNS,u'page-adjust'), + (STYLENS,u'num-format'), + (TEXTNS,u'fixed'), + (STYLENS,u'num-letter-sync'), + (TEXTNS,u'select-page'), + ), + (TEXTNS,u'page-sequence'):( + ), + (TEXTNS,u'page-variable-get'):( + (STYLENS,u'num-format'), + (STYLENS,u'num-letter-sync'), + ), + (TEXTNS,u'page-variable-set'):( + (TEXTNS,u'active'), + (TEXTNS,u'page-adjust'), + ), + (TEXTNS,u'placeholder'):( + (TEXTNS,u'placeholder-type'), + (TEXTNS,u'description'), + ), + (TEXTNS,u'print-date'):( + (TEXTNS,u'date-value'), + (TEXTNS,u'fixed'), + (STYLENS,u'data-style-name'), + ), + (TEXTNS,u'print-time'):( + (TEXTNS,u'fixed'), + (TEXTNS,u'time-value'), + (STYLENS,u'data-style-name'), + ), + (TEXTNS,u'printed-by'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'reference-mark'):( + (TEXTNS,u'name'), + ), + (TEXTNS,u'reference-mark-end'):( + (TEXTNS,u'name'), + ), + (TEXTNS,u'reference-mark-start'):( + (TEXTNS,u'name'), + ), + (TEXTNS,u'ruby'):( + (TEXTNS,u'style-name'), + ), + (TEXTNS,u'ruby-base'):( + ), + (TEXTNS,u'ruby-text'):( + (TEXTNS,u'style-name'), + ), + (TEXTNS,u's'):( + (TEXTNS,u'c'), + ), + (TEXTNS,u'script'):( + (XLINKNS,u'href'), + (XLINKNS,u'type'), + (SCRIPTNS,u'language'), + ), + (TEXTNS,u'section'):( + (TEXTNS,u'name'), + (TEXTNS,u'protection-key'), + (TEXTNS,u'style-name'), + (TEXTNS,u'protected'), + (TEXTNS,u'display'), + (TEXTNS,u'condition'), + ), + (TEXTNS,u'section-source'):( + (TEXTNS,u'filter-name'), + (XLINKNS,u'href'), + (XLINKNS,u'type'), + (TEXTNS,u'section-name'), + (XLINKNS,u'show'), + ), + (TEXTNS,u'sender-city'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'sender-company'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'sender-country'):( + (TEXTNS,u'fixed'), + ), +# allowed_attributes + (TEXTNS,u'sender-email'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'sender-fax'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'sender-firstname'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'sender-initials'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'sender-lastname'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'sender-phone-private'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'sender-phone-work'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'sender-position'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'sender-postal-code'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'sender-state-or-province'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'sender-street'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'sender-title'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'sequence'):( + (TEXTNS,u'formula'), + (STYLENS,u'num-format'), + (STYLENS,u'num-letter-sync'), + (TEXTNS,u'name'), + (TEXTNS,u'ref-name'), + ), + (TEXTNS,u'sequence-decl'):( + (TEXTNS,u'separation-character'), + (TEXTNS,u'display-outline-level'), + (TEXTNS,u'name'), + ), + (TEXTNS,u'sequence-decls'):( + ), + (TEXTNS,u'sequence-ref'):( + (TEXTNS,u'ref-name'), + (TEXTNS,u'reference-format'), + ), + (TEXTNS,u'sheet-name'):( + ), + (TEXTNS,u'soft-page-break'):( + ), + (TEXTNS,u'sort-key'):( + (TEXTNS,u'sort-ascending'), + (TEXTNS,u'key'), + ), +# allowed_attributes + (TEXTNS,u'span'):( + (TEXTNS,u'style-name'), + (TEXTNS,u'class-names'), + ), + (TEXTNS,u'subject'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'tab'):( + (TEXTNS,u'tab-ref'), + ), + (TEXTNS,u'table-formula'):( + (TEXTNS,u'formula'), + (STYLENS,u'data-style-name'), + (TEXTNS,u'display'), + ), + (TEXTNS,u'table-index'):( + (TEXTNS,u'protected'), + (TEXTNS,u'style-name'), + (TEXTNS,u'name'), + (TEXTNS,u'protection-key'), + ), + (TEXTNS,u'table-index-entry-template'):( + (TEXTNS,u'style-name'), + ), + (TEXTNS,u'table-index-source'):( + (TEXTNS,u'index-scope'), + (TEXTNS,u'caption-sequence-name'), + (TEXTNS,u'use-caption'), + (TEXTNS,u'caption-sequence-format'), + (TEXTNS,u'relative-tab-stop-position'), + ), +# allowed_attributes + (TEXTNS,u'table-of-content'):( + (TEXTNS,u'protected'), + (TEXTNS,u'style-name'), + (TEXTNS,u'name'), + (TEXTNS,u'protection-key'), + ), + (TEXTNS,u'table-of-content-entry-template'):( + (TEXTNS,u'style-name'), + (TEXTNS,u'outline-level'), + ), + (TEXTNS,u'table-of-content-source'):( + (TEXTNS,u'index-scope'), + (TEXTNS,u'outline-level'), + (TEXTNS,u'relative-tab-stop-position'), + (TEXTNS,u'use-index-marks'), + (TEXTNS,u'use-outline-level'), + (TEXTNS,u'use-index-source-styles'), + ), + (TEXTNS,u'template-name'):( + (TEXTNS,u'display'), + ), + (TEXTNS,u'text-input'):( + (TEXTNS,u'description'), + ), + (TEXTNS,u'time'):( + (TEXTNS,u'time-adjust'), + (TEXTNS,u'fixed'), + (TEXTNS,u'time-value'), + (STYLENS,u'data-style-name'), + ), + (TEXTNS,u'title'):( + (TEXTNS,u'fixed'), + ), + (TEXTNS,u'toc-mark'):( + (TEXTNS,u'string-value'), + (TEXTNS,u'outline-level'), + ), + (TEXTNS,u'toc-mark-end'):( + (TEXTNS,u'id'), + ), + (TEXTNS,u'toc-mark-start'):( + (TEXTNS,u'id'), + (TEXTNS,u'outline-level'), + ), + (TEXTNS,u'tracked-changes'):( + (TEXTNS,u'track-changes'), + ), + (TEXTNS,u'user-defined'):( + (TEXTNS,u'name'), + (OFFICENS,u'string-value'), + (OFFICENS,u'value'), + (OFFICENS,u'boolean-value'), + (OFFICENS,u'date-value'), + (STYLENS,u'data-style-name'), + (TEXTNS,u'fixed'), + (OFFICENS,u'time-value'), + ), + (TEXTNS,u'user-field-decl'):( + (TEXTNS,u'name'), + (OFFICENS,u'string-value'), + (OFFICENS,u'value'), + (OFFICENS,u'boolean-value'), + (OFFICENS,u'currency'), + (OFFICENS,u'date-value'), + (OFFICENS,u'value-type'), + (TEXTNS,u'formula'), + (OFFICENS,u'time-value'), + ), + (TEXTNS,u'user-field-decls'):( + ), + (TEXTNS,u'user-field-get'):( + (STYLENS,u'data-style-name'), + (TEXTNS,u'name'), + (TEXTNS,u'display'), + ), +# allowed_attributes + (TEXTNS,u'user-field-input'):( + (STYLENS,u'data-style-name'), + (TEXTNS,u'name'), + (TEXTNS,u'description'), + ), + (TEXTNS,u'user-index'):( + (TEXTNS,u'protected'), + (TEXTNS,u'style-name'), + (TEXTNS,u'name'), + (TEXTNS,u'protection-key'), + ), + (TEXTNS,u'user-index-entry-template'):( + (TEXTNS,u'style-name'), + (TEXTNS,u'outline-level'), + ), + (TEXTNS,u'user-index-mark'):( + (TEXTNS,u'index-name'), + (TEXTNS,u'string-value'), + (TEXTNS,u'outline-level'), + ), + (TEXTNS,u'user-index-mark-end'):( + (TEXTNS,u'id'), + (TEXTNS,u'outline-level'), + ), + (TEXTNS,u'user-index-mark-start'):( + (TEXTNS,u'index-name'), + (TEXTNS,u'id'), + (TEXTNS,u'outline-level'), + ), +# allowed_attributes + (TEXTNS,u'user-index-source'):( + (TEXTNS,u'copy-outline-levels'), + (TEXTNS,u'index-name'), + (TEXTNS,u'index-scope'), + (TEXTNS,u'relative-tab-stop-position'), + (TEXTNS,u'use-floating-frames'), + (TEXTNS,u'use-graphics'), + (TEXTNS,u'use-index-marks'), + (TEXTNS,u'use-objects'), + (TEXTNS,u'use-tables'), + ), + (TEXTNS,u'variable-decl'):( + (TEXTNS,u'name'), + (OFFICENS,u'value-type'), + ), + (TEXTNS,u'variable-decls'):( + ), + (TEXTNS,u'variable-get'):( + (STYLENS,u'data-style-name'), + (TEXTNS,u'name'), + (TEXTNS,u'display'), + ), + (TEXTNS,u'variable-input'):( + (STYLENS,u'data-style-name'), + (TEXTNS,u'display'), + (TEXTNS,u'name'), + (OFFICENS,u'value-type'), + (TEXTNS,u'description'), + ), + (TEXTNS,u'variable-set'):( + (TEXTNS,u'name'), + (TEXTNS,u'display'), + (OFFICENS,u'string-value'), + (OFFICENS,u'value'), + (OFFICENS,u'boolean-value'), + (OFFICENS,u'currency'), + (OFFICENS,u'date-value'), + (STYLENS,u'data-style-name'), + (OFFICENS,u'value-type'), + (TEXTNS,u'formula'), + (OFFICENS,u'time-value'), + ), +# allowed_attributes +} diff --git a/tablib/packages/odf/load.py b/tablib/packages/odf/load.py new file mode 100644 index 0000000..e48fcaa --- /dev/null +++ b/tablib/packages/odf/load.py @@ -0,0 +1,112 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2008 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +# This script is to be embedded in opendocument.py later +# The purpose is to read an ODT/ODP/ODS file and create the datastructure +# in memory. The user should then be able to make operations and then save +# the structure again. + +from xml.sax import make_parser,handler +from xml.sax.xmlreader import InputSource +import xml.sax.saxutils +from element import Element +from namespaces import OFFICENS +from cStringIO import StringIO + +# +# Parse the XML files +# +class LoadParser(handler.ContentHandler): + """ Extract headings from content.xml of an ODT file """ + triggers = ( + (OFFICENS, 'automatic-styles'), (OFFICENS, 'body'), + (OFFICENS, 'font-face-decls'), (OFFICENS, 'master-styles'), + (OFFICENS, 'meta'), (OFFICENS, 'scripts'), + (OFFICENS, 'settings'), (OFFICENS, 'styles') ) + + def __init__(self, document): + self.doc = document + self.data = [] + self.level = 0 + self.parse = False + + def characters(self, data): + if self.parse == False: + return + self.data.append(data) + + def startElementNS(self, tag, qname, attrs): + if tag in self.triggers: + self.parse = True + if self.doc._parsing != "styles.xml" and tag == (OFFICENS, 'font-face-decls'): + self.parse = False + if self.parse == False: + return + + self.level = self.level + 1 + # Add any accumulated text content + content = ''.join(self.data) + if len(content.strip()) > 0: + self.parent.addText(content, check_grammar=False) + self.data = [] + # Create the element + attrdict = {} + for (att,value) in attrs.items(): + attrdict[att] = value + try: + e = Element(qname = tag, qattributes=attrdict, check_grammar=False) + self.curr = e + except AttributeError, v: + print "Error: %s" % v + + if tag == (OFFICENS, 'automatic-styles'): + e = self.doc.automaticstyles + elif tag == (OFFICENS, 'body'): + e = self.doc.body + elif tag == (OFFICENS, 'master-styles'): + e = self.doc.masterstyles + elif tag == (OFFICENS, 'meta'): + e = self.doc.meta + elif tag == (OFFICENS,'scripts'): + e = self.doc.scripts + elif tag == (OFFICENS,'settings'): + e = self.doc.settings + elif tag == (OFFICENS,'styles'): + e = self.doc.styles + elif self.doc._parsing == "styles.xml" and tag == (OFFICENS, 'font-face-decls'): + e = self.doc.fontfacedecls + elif hasattr(self,'parent'): + self.parent.addElement(e, check_grammar=False) + self.parent = e + + + def endElementNS(self, tag, qname): + if self.parse == False: + return + self.level = self.level - 1 + str = ''.join(self.data) + if len(str.strip()) > 0: + self.curr.addText(str, check_grammar=False) + self.data = [] + self.curr = self.curr.parentNode + self.parent = self.curr + if tag in self.triggers: + self.parse = False diff --git a/tablib/packages/odf/manifest.py b/tablib/packages/odf/manifest.py new file mode 100644 index 0000000..de59048 --- /dev/null +++ b/tablib/packages/odf/manifest.py @@ -0,0 +1,41 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# +# + +from namespaces import MANIFESTNS +from element import Element + +# Autogenerated +def Manifest(**args): + return Element(qname = (MANIFESTNS,'manifest'), **args) + +def FileEntry(**args): + return Element(qname = (MANIFESTNS,'file-entry'), **args) + +def EncryptionData(**args): + return Element(qname = (MANIFESTNS,'encryption-data'), **args) + +def Algorithm(**args): + return Element(qname = (MANIFESTNS,'algorithm'), **args) + +def KeyDerivation(**args): + return Element(qname = (MANIFESTNS,'key-derivation'), **args) + diff --git a/tablib/packages/odf/math.py b/tablib/packages/odf/math.py new file mode 100644 index 0000000..5dc38df --- /dev/null +++ b/tablib/packages/odf/math.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from namespaces import MATHNS +from element import Element + +# ODF 1.0 section 12.5 +# Mathematical content is represented by MathML 2.0 + +# Autogenerated +def Math(**args): + return Element(qname = (MATHNS,'math'), **args) + diff --git a/tablib/packages/odf/meta.py b/tablib/packages/odf/meta.py new file mode 100644 index 0000000..dc03181 --- /dev/null +++ b/tablib/packages/odf/meta.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from namespaces import METANS +from element import Element + +# Autogenerated +def AutoReload(**args): + return Element(qname = (METANS,'auto-reload'), **args) + +def CreationDate(**args): + return Element(qname = (METANS,'creation-date'), **args) + +def DateString(**args): + return Element(qname = (METANS,'date-string'), **args) + +def DocumentStatistic(**args): + return Element(qname = (METANS,'document-statistic'), **args) + +def EditingCycles(**args): + return Element(qname = (METANS,'editing-cycles'), **args) + +def EditingDuration(**args): + return Element(qname = (METANS,'editing-duration'), **args) + +def Generator(**args): + return Element(qname = (METANS,'generator'), **args) + +def HyperlinkBehaviour(**args): + return Element(qname = (METANS,'hyperlink-behaviour'), **args) + +def InitialCreator(**args): + return Element(qname = (METANS,'initial-creator'), **args) + +def Keyword(**args): + return Element(qname = (METANS,'keyword'), **args) + +def PrintDate(**args): + return Element(qname = (METANS,'print-date'), **args) + +def PrintedBy(**args): + return Element(qname = (METANS,'printed-by'), **args) + +def Template(**args): + return Element(qname = (METANS,'template'), **args) + +def UserDefined(**args): + return Element(qname = (METANS,'user-defined'), **args) + diff --git a/tablib/packages/odf/namespaces.py b/tablib/packages/odf/namespaces.py new file mode 100644 index 0000000..95046b4 --- /dev/null +++ b/tablib/packages/odf/namespaces.py @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2010 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# +TOOLSVERSION = u"ODFPY/0.9.3" + +ANIMNS = u"urn:oasis:names:tc:opendocument:xmlns:animation:1.0" +DBNS = u"urn:oasis:names:tc:opendocument:xmlns:database:1.0" +CHARTNS = u"urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +CONFIGNS = u"urn:oasis:names:tc:opendocument:xmlns:config:1.0" +#DBNS = u"http://openoffice.org/2004/database" +DCNS = u"http://purl.org/dc/elements/1.1/" +DOMNS = u"http://www.w3.org/2001/xml-events" +DR3DNS = u"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +DRAWNS = u"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +FIELDNS = u"urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +FONS = u"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +FORMNS = u"urn:oasis:names:tc:opendocument:xmlns:form:1.0" +GRDDLNS = u"http://www.w3.org/2003/g/data-view#" +KOFFICENS = u"http://www.koffice.org/2005/" +MANIFESTNS = u"urn:oasis:names:tc:opendocument:xmlns:manifest:1.0" +MATHNS = u"http://www.w3.org/1998/Math/MathML" +METANS = u"urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +NUMBERNS = u"urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +OFFICENS = u"urn:oasis:names:tc:opendocument:xmlns:office:1.0" +OFNS = u"urn:oasis:names:tc:opendocument:xmlns:of:1.2" +OOONS = u"http://openoffice.org/2004/office" +OOOWNS = u"http://openoffice.org/2004/writer" +OOOCNS = u"http://openoffice.org/2004/calc" +PRESENTATIONNS = u"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" +RDFANS = u"http://docs.oasis-open.org/opendocument/meta/rdfa#" +RPTNS = u"http://openoffice.org/2005/report" +SCRIPTNS = u"urn:oasis:names:tc:opendocument:xmlns:script:1.0" +SMILNS = u"urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" +STYLENS = u"urn:oasis:names:tc:opendocument:xmlns:style:1.0" +SVGNS = u"urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +TABLENS = u"urn:oasis:names:tc:opendocument:xmlns:table:1.0" +TEXTNS = u"urn:oasis:names:tc:opendocument:xmlns:text:1.0" +XFORMSNS = u"http://www.w3.org/2002/xforms" +XLINKNS = u"http://www.w3.org/1999/xlink" +XMLNS = u"http://www.w3.org/XML/1998/namespace" +XSDNS = u"http://www.w3.org/2001/XMLSchema" +XSINS = u"http://www.w3.org/2001/XMLSchema-instance" + +nsdict = { + ANIMNS: u'anim', + CHARTNS: u'chart', + CONFIGNS: u'config', + DBNS: u'db', + DCNS: u'dc', + DOMNS: u'dom', + DR3DNS: u'dr3d', + DRAWNS: u'draw', + FIELDNS: u'field', + FONS: u'fo', + FORMNS: u'form', + GRDDLNS: u'grddl', + KOFFICENS: u'koffice', + MANIFESTNS: u'manifest', + MATHNS: u'math', + METANS: u'meta', + NUMBERNS: u'number', + OFFICENS: u'office', + OFNS: u'of', + OOONS: u'ooo', + OOOWNS: u'ooow', + OOOCNS: u'oooc', + PRESENTATIONNS: u'presentation', + RDFANS: u'rdfa', + RPTNS: u'rpt', + SCRIPTNS: u'script', + SMILNS: u'smil', + STYLENS: u'style', + SVGNS: u'svg', + TABLENS: u'table', + TEXTNS: u'text', + XFORMSNS: u'xforms', + XLINKNS: u'xlink', + XMLNS: u'xml', + XSDNS: u'xsd', + XSINS: u'xsi', +} diff --git a/tablib/packages/odf/number.py b/tablib/packages/odf/number.py new file mode 100644 index 0000000..12d81cb --- /dev/null +++ b/tablib/packages/odf/number.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from namespaces import NUMBERNS +from element import Element +from style import StyleElement + + +# Autogenerated +def AmPm(**args): + return Element(qname = (NUMBERNS,'am-pm'), **args) + +def Boolean(**args): + return Element(qname = (NUMBERNS,'boolean'), **args) + +def BooleanStyle(**args): + return StyleElement(qname = (NUMBERNS,'boolean-style'), **args) + +def CurrencyStyle(**args): + return StyleElement(qname = (NUMBERNS,'currency-style'), **args) + +def CurrencySymbol(**args): + return Element(qname = (NUMBERNS,'currency-symbol'), **args) + +def DateStyle(**args): + return StyleElement(qname = (NUMBERNS,'date-style'), **args) + +def Day(**args): + return Element(qname = (NUMBERNS,'day'), **args) + +def DayOfWeek(**args): + return Element(qname = (NUMBERNS,'day-of-week'), **args) + +def EmbeddedText(**args): + return Element(qname = (NUMBERNS,'embedded-text'), **args) + +def Era(**args): + return Element(qname = (NUMBERNS,'era'), **args) + +def Fraction(**args): + return Element(qname = (NUMBERNS,'fraction'), **args) + +def Hours(**args): + return Element(qname = (NUMBERNS,'hours'), **args) + +def Minutes(**args): + return Element(qname = (NUMBERNS,'minutes'), **args) + +def Month(**args): + return Element(qname = (NUMBERNS,'month'), **args) + +def Number(**args): + return Element(qname = (NUMBERNS,'number'), **args) + +def NumberStyle(**args): + return StyleElement(qname = (NUMBERNS,'number-style'), **args) + +def PercentageStyle(**args): + return StyleElement(qname = (NUMBERNS,'percentage-style'), **args) + +def Quarter(**args): + return Element(qname = (NUMBERNS,'quarter'), **args) + +def ScientificNumber(**args): + return Element(qname = (NUMBERNS,'scientific-number'), **args) + +def Seconds(**args): + return Element(qname = (NUMBERNS,'seconds'), **args) + +def Text(**args): + return Element(qname = (NUMBERNS,'text'), **args) + +def TextContent(**args): + return Element(qname = (NUMBERNS,'text-content'), **args) + +def TextStyle(**args): + return StyleElement(qname = (NUMBERNS,'text-style'), **args) + +def TimeStyle(**args): + return StyleElement(qname = (NUMBERNS,'time-style'), **args) + +def WeekOfYear(**args): + return Element(qname = (NUMBERNS,'week-of-year'), **args) + +def Year(**args): + return Element(qname = (NUMBERNS,'year'), **args) + diff --git a/tablib/packages/odf/odf2moinmoin.py b/tablib/packages/odf/odf2moinmoin.py new file mode 100644 index 0000000..167fcda --- /dev/null +++ b/tablib/packages/odf/odf2moinmoin.py @@ -0,0 +1,579 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2008 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# See http://trac.edgewall.org/wiki/WikiFormatting +# +# Contributor(s): +# + +import sys, zipfile, xml.dom.minidom +from namespaces import nsdict +from elementtypes import * + +IGNORED_TAGS = [ + 'draw:a' + 'draw:g', + 'draw:line', + 'draw:object-ole', + 'office:annotation', + 'presentation:notes', + 'svg:desc', +] + [ nsdict[item[0]]+":"+item[1] for item in empty_elements] + +INLINE_TAGS = [ nsdict[item[0]]+":"+item[1] for item in inline_elements] + + +class TextProps: + """ Holds properties for a text style. """ + + def __init__(self): + + self.italic = False + self.bold = False + self.fixed = False + self.underlined = False + self.strikethrough = False + self.superscript = False + self.subscript = False + + def setItalic(self, value): + if value == "italic": + self.italic = True + elif value == "normal": + self.italic = False + + def setBold(self, value): + if value == "bold": + self.bold = True + elif value == "normal": + self.bold = False + + def setFixed(self, value): + self.fixed = value + + def setUnderlined(self, value): + if value and value != "none": + self.underlined = True + + def setStrikethrough(self, value): + if value and value != "none": + self.strikethrough = True + + def setPosition(self, value): + if value is None or value == '': + return + posisize = value.split(' ') + textpos = posisize[0] + if textpos.find('%') == -1: + if textpos == "sub": + self.superscript = False + self.subscript = True + elif textpos == "super": + self.superscript = True + self.subscript = False + else: + itextpos = int(textpos[:textpos.find('%')]) + if itextpos > 10: + self.superscript = False + self.subscript = True + elif itextpos < -10: + self.superscript = True + self.subscript = False + + def __str__(self): + + return "[italic=%s, bold=i%s, fixed=%s]" % (str(self.italic), + str(self.bold), + str(self.fixed)) + +class ParagraphProps: + """ Holds properties of a paragraph style. """ + + def __init__(self): + + self.blockquote = False + self.headingLevel = 0 + self.code = False + self.title = False + self.indented = 0 + + def setIndented(self, value): + self.indented = value + + def setHeading(self, level): + self.headingLevel = level + + def setTitle(self, value): + self.title = value + + def setCode(self, value): + self.code = value + + + def __str__(self): + + return "[bq=%s, h=%d, code=%s]" % (str(self.blockquote), + self.headingLevel, + str(self.code)) + + +class ListProperties: + """ Holds properties for a list style. """ + + def __init__(self): + self.ordered = False + + def setOrdered(self, value): + self.ordered = value + + + +class ODF2MoinMoin(object): + + + def __init__(self, filepath): + self.footnotes = [] + self.footnoteCounter = 0 + self.textStyles = {"Standard": TextProps()} + self.paragraphStyles = {"Standard": ParagraphProps()} + self.listStyles = {} + self.fixedFonts = [] + self.hasTitle = 0 + self.lastsegment = None + + # Tags + self.elements = { + 'draw:page': self.textToString, + 'draw:frame': self.textToString, + 'draw:image': self.draw_image, + 'draw:text-box': self.textToString, + 'text:a': self.text_a, + 'text:note': self.text_note, + } + for tag in IGNORED_TAGS: + self.elements[tag] = self.do_nothing + + for tag in INLINE_TAGS: + self.elements[tag] = self.inline_markup + self.elements['text:line-break'] = self.text_line_break + self.elements['text:s'] = self.text_s + self.elements['text:tab'] = self.text_tab + + self.load(filepath) + + def processFontDeclarations(self, fontDecl): + """ Extracts necessary font information from a font-declaration + element. + """ + for fontFace in fontDecl.getElementsByTagName("style:font-face"): + if fontFace.getAttribute("style:font-pitch") == "fixed": + self.fixedFonts.append(fontFace.getAttribute("style:name")) + + + + def extractTextProperties(self, style, parent=None): + """ Extracts text properties from a style element. """ + + textProps = TextProps() + + if parent: + parentProp = self.textStyles.get(parent, None) + if parentProp: + textProp = parentProp + + textPropEl = style.getElementsByTagName("style:text-properties") + if not textPropEl: return textProps + + textPropEl = textPropEl[0] + + textProps.setItalic(textPropEl.getAttribute("fo:font-style")) + textProps.setBold(textPropEl.getAttribute("fo:font-weight")) + textProps.setUnderlined(textPropEl.getAttribute("style:text-underline-style")) + textProps.setStrikethrough(textPropEl.getAttribute("style:text-line-through-style")) + textProps.setPosition(textPropEl.getAttribute("style:text-position")) + + if textPropEl.getAttribute("style:font-name") in self.fixedFonts: + textProps.setFixed(True) + + return textProps + + def extractParagraphProperties(self, style, parent=None): + """ Extracts paragraph properties from a style element. """ + + paraProps = ParagraphProps() + + name = style.getAttribute("style:name") + + if name.startswith("Heading_20_"): + level = name[11:] + try: + level = int(level) + paraProps.setHeading(level) + except: + level = 0 + + if name == "Title": + paraProps.setTitle(True) + + paraPropEl = style.getElementsByTagName("style:paragraph-properties") + if paraPropEl: + paraPropEl = paraPropEl[0] + leftMargin = paraPropEl.getAttribute("fo:margin-left") + if leftMargin: + try: + leftMargin = float(leftMargin[:-2]) + if leftMargin > 0.01: + paraProps.setIndented(True) + except: + pass + + textProps = self.extractTextProperties(style) + if textProps.fixed: + paraProps.setCode(True) + + return paraProps + + + def processStyles(self, styleElements): + """ Runs through "style" elements extracting necessary information. + """ + + for style in styleElements: + + name = style.getAttribute("style:name") + + if name == "Standard": continue + + family = style.getAttribute("style:family") + parent = style.getAttribute("style:parent-style-name") + + if family == "text": + self.textStyles[name] = self.extractTextProperties(style, parent) + + elif family == "paragraph": + self.paragraphStyles[name] = \ + self.extractParagraphProperties(style, parent) + self.textStyles[name] = self.extractTextProperties(style, parent) + + def processListStyles(self, listStyleElements): + + for style in listStyleElements: + name = style.getAttribute("style:name") + + prop = ListProperties() + if style.hasChildNodes(): + subitems = [el for el in style.childNodes + if el.nodeType == xml.dom.Node.ELEMENT_NODE + and el.tagName == "text:list-level-style-number"] + if len(subitems) > 0: + prop.setOrdered(True) + + self.listStyles[name] = prop + + + def load(self, filepath): + """ Loads an ODT file. """ + + zip = zipfile.ZipFile(filepath) + + styles_doc = xml.dom.minidom.parseString(zip.read("styles.xml")) + fontfacedecls = styles_doc.getElementsByTagName("office:font-face-decls") + if fontfacedecls: + self.processFontDeclarations(fontfacedecls[0]) + self.processStyles(styles_doc.getElementsByTagName("style:style")) + self.processListStyles(styles_doc.getElementsByTagName("text:list-style")) + + self.content = xml.dom.minidom.parseString(zip.read("content.xml")) + fontfacedecls = self.content.getElementsByTagName("office:font-face-decls") + if fontfacedecls: + self.processFontDeclarations(fontfacedecls[0]) + + self.processStyles(self.content.getElementsByTagName("style:style")) + self.processListStyles(self.content.getElementsByTagName("text:list-style")) + + def compressCodeBlocks(self, text): + """ Removes extra blank lines from code blocks. """ + + return text + lines = text.split("\n") + buffer = [] + numLines = len(lines) + for i in range(numLines): + + if (lines[i].strip() or i == numLines-1 or i == 0 or + not ( lines[i-1].startswith(" ") + and lines[i+1].startswith(" ") ) ): + buffer.append("\n" + lines[i]) + + return ''.join(buffer) + +#----------------------------------- + def do_nothing(self, node): + return '' + + def draw_image(self, node): + """ + """ + + link = node.getAttribute("xlink:href") + if link and link[:2] == './': # Indicates a sub-object, which isn't supported + return "%s\n" % link + if link and link[:9] == 'Pictures/': + link = link[9:] + return "[[Image(%s)]]\n" % link + + def text_a(self, node): + text = self.textToString(node) + link = node.getAttribute("xlink:href") + if link.strip() == text.strip(): + return "[%s] " % link.strip() + else: + return "[%s %s] " % (link.strip(), text.strip()) + + + def text_line_break(self, node): + return "[[BR]]" + + def text_note(self, node): + cite = (node.getElementsByTagName("text:note-citation")[0] + .childNodes[0].nodeValue) + body = (node.getElementsByTagName("text:note-body")[0] + .childNodes[0]) + self.footnotes.append((cite, self.textToString(body))) + return "^%s^" % cite + + def text_s(self, node): + try: + num = int(node.getAttribute("text:c")) + return " "*num + except: + return " " + + def text_tab(self, node): + return " " + + def inline_markup(self, node): + text = self.textToString(node) + + if not text.strip(): + return '' # don't apply styles to white space + + styleName = node.getAttribute("text:style-name") + style = self.textStyles.get(styleName, TextProps()) + + if style.fixed: + return "`" + text + "`" + + mark = [] + if style: + if style.italic: + mark.append("''") + if style.bold: + mark.append("'''") + if style.underlined: + mark.append("__") + if style.strikethrough: + mark.append("~~") + if style.superscript: + mark.append("^") + if style.subscript: + mark.append(",,") + revmark = mark[:] + revmark.reverse() + return "%s%s%s" % (''.join(mark), text, ''.join(revmark)) + +#----------------------------------- + def listToString(self, listElement, indent = 0): + + self.lastsegment = listElement.tagName + buffer = [] + + styleName = listElement.getAttribute("text:style-name") + props = self.listStyles.get(styleName, ListProperties()) + + i = 0 + for item in listElement.childNodes: + buffer.append(" "*indent) + i += 1 + if props.ordered: + number = str(i) + number = " " + number + ". " + buffer.append(" 1. ") + else: + buffer.append(" * ") + subitems = [el for el in item.childNodes + if el.tagName in ["text:p", "text:h", "text:list"]] + for subitem in subitems: + if subitem.tagName == "text:list": + buffer.append("\n") + buffer.append(self.listToString(subitem, indent+3)) + else: + buffer.append(self.paragraphToString(subitem, indent+3)) + self.lastsegment = subitem.tagName + self.lastsegment = item.tagName + buffer.append("\n") + + return ''.join(buffer) + + def tableToString(self, tableElement): + """ MoinMoin uses || to delimit table cells + """ + + self.lastsegment = tableElement.tagName + buffer = [] + + for item in tableElement.childNodes: + self.lastsegment = item.tagName + if item.tagName == "table:table-header-rows": + buffer.append(self.tableToString(item)) + if item.tagName == "table:table-row": + buffer.append("\n||") + for cell in item.childNodes: + buffer.append(self.inline_markup(cell)) + buffer.append("||") + self.lastsegment = cell.tagName + return ''.join(buffer) + + + def toString(self): + """ Converts the document to a string. + FIXME: Result from second call differs from first call + """ + body = self.content.getElementsByTagName("office:body")[0] + text = body.childNodes[0] + + buffer = [] + + paragraphs = [el for el in text.childNodes + if el.tagName in ["draw:page", "text:p", "text:h","text:section", + "text:list", "table:table"]] + + for paragraph in paragraphs: + if paragraph.tagName == "text:list": + text = self.listToString(paragraph) + elif paragraph.tagName == "text:section": + text = self.textToString(paragraph) + elif paragraph.tagName == "table:table": + text = self.tableToString(paragraph) + else: + text = self.paragraphToString(paragraph) + if text: + buffer.append(text) + + if self.footnotes: + + buffer.append("----") + for cite, body in self.footnotes: + buffer.append("%s: %s" % (cite, body)) + + + buffer.append("") + return self.compressCodeBlocks('\n'.join(buffer)) + + + def textToString(self, element): + + buffer = [] + + for node in element.childNodes: + + if node.nodeType == xml.dom.Node.TEXT_NODE: + buffer.append(node.nodeValue) + + elif node.nodeType == xml.dom.Node.ELEMENT_NODE: + tag = node.tagName + + if tag in ("draw:text-box", "draw:frame"): + buffer.append(self.textToString(node)) + + elif tag in ("text:p", "text:h"): + text = self.paragraphToString(node) + if text: + buffer.append(text) + elif tag == "text:list": + buffer.append(self.listToString(node)) + else: + method = self.elements.get(tag) + if method: + buffer.append(method(node)) + else: + buffer.append(" {" + tag + "} ") + + return ''.join(buffer) + + def paragraphToString(self, paragraph, indent = 0): + + dummyParaProps = ParagraphProps() + + style_name = paragraph.getAttribute("text:style-name") + paraProps = self.paragraphStyles.get(style_name, dummyParaProps) + text = self.inline_markup(paragraph) + + if paraProps and not paraProps.code: + text = text.strip() + + if paragraph.tagName == "text:p" and self.lastsegment == "text:p": + text = "\n" + text + + self.lastsegment = paragraph.tagName + + if paraProps.title: + self.hasTitle = 1 + return "= " + text + " =\n" + + outlinelevel = paragraph.getAttribute("text:outline-level") + if outlinelevel: + + level = int(outlinelevel) + if self.hasTitle: level += 1 + + if level >= 1: + return "=" * level + " " + text + " " + "=" * level + "\n" + + elif paraProps.code: + return "{{{\n" + text + "\n}}}\n" + + if paraProps.indented: + return self.wrapParagraph(text, indent = indent, blockquote = True) + + else: + return self.wrapParagraph(text, indent = indent) + + + def wrapParagraph(self, text, indent = 0, blockquote=False): + + counter = 0 + buffer = [] + LIMIT = 50 + + if blockquote: + buffer.append(" ") + + return ''.join(buffer) + text + # Unused from here + for token in text.split(): + + if counter > LIMIT - indent: + buffer.append("\n" + " "*indent) + if blockquote: + buffer.append(" ") + counter = 0 + + buffer.append(token + " ") + counter += len(token) + + return ''.join(buffer) diff --git a/tablib/packages/odf/odf2xhtml.py b/tablib/packages/odf/odf2xhtml.py new file mode 100644 index 0000000..4bf4553 --- /dev/null +++ b/tablib/packages/odf/odf2xhtml.py @@ -0,0 +1,1582 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2010 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# +#import pdb +#pdb.set_trace() +from xml.sax import handler +from xml.sax.saxutils import escape, quoteattr +from xml.dom import Node + +from opendocument import load + +from namespaces import ANIMNS, CHARTNS, CONFIGNS, DCNS, DR3DNS, DRAWNS, FONS, \ + FORMNS, MATHNS, METANS, NUMBERNS, OFFICENS, PRESENTATIONNS, SCRIPTNS, \ + SMILNS, STYLENS, SVGNS, TABLENS, TEXTNS, XLINKNS + +# Handling of styles +# +# First there are font face declarations. These set up a font style that will be +# referenced from a text-property. The declaration describes the font making +# it possible for the application to find a similar font should the system not +# have that particular one. The StyleToCSS stores these attributes to be used +# for the CSS2 font declaration. +# +# Then there are default-styles. These set defaults for various style types: +# "text", "paragraph", "section", "ruby", "table", "table-column", "table-row", +# "table-cell", "graphic", "presentation", "drawing-page", "chart". +# Since CSS2 can't refer to another style, ODF2XHTML add these to all +# styles unless overridden. +# +# The real styles are declared in the element. They have a +# family referring to the default-styles, and may have a parent style. +# +# Styles have scope. The same name can be used for both paragraph and +# character etc. styles Since CSS2 has no scope we use a prefix. (Not elegant) +# In ODF a style can have a parent, these parents can be chained. + +class StyleToCSS: + """ The purpose of the StyleToCSS class is to contain the rules to convert + ODF styles to CSS2. Since it needs the generic fonts, it would probably + make sense to also contain the Styles in a dict as well.. + """ + + def __init__(self): + # Font declarations + self.fontdict = {} + + # Fill-images from presentations for backgrounds + self.fillimages = {} + + self.ruleconversions = { + (DRAWNS,u'fill-image-name'): self.c_drawfillimage, + (FONS,u"background-color"): self.c_fo, + (FONS,u"border"): self.c_fo, + (FONS,u"border-bottom"): self.c_fo, + (FONS,u"border-left"): self.c_fo, + (FONS,u"border-right"): self.c_fo, + (FONS,u"border-top"): self.c_fo, + (FONS,u"color"): self.c_fo, + (FONS,u"font-family"): self.c_fo, + (FONS,u"font-size"): self.c_fo, + (FONS,u"font-style"): self.c_fo, + (FONS,u"font-variant"): self.c_fo, + (FONS,u"font-weight"): self.c_fo, + (FONS,u"line-height"): self.c_fo, + (FONS,u"margin"): self.c_fo, + (FONS,u"margin-bottom"): self.c_fo, + (FONS,u"margin-left"): self.c_fo, + (FONS,u"margin-right"): self.c_fo, + (FONS,u"margin-top"): self.c_fo, + (FONS,u"min-height"): self.c_fo, + (FONS,u"padding"): self.c_fo, + (FONS,u"padding-bottom"): self.c_fo, + (FONS,u"padding-left"): self.c_fo, + (FONS,u"padding-right"): self.c_fo, + (FONS,u"padding-top"): self.c_fo, + (FONS,u"page-width"): self.c_page_width, + (FONS,u"page-height"): self.c_page_height, + (FONS,u"text-align"): self.c_text_align, + (FONS,u"text-indent") :self.c_fo, + (TABLENS,u'border-model') :self.c_border_model, + (STYLENS,u'column-width') : self.c_width, + (STYLENS,u"font-name"): self.c_fn, + (STYLENS,u'horizontal-pos'): self.c_hp, + (STYLENS,u'text-position'): self.c_text_position, + (STYLENS,u'text-line-through-style'): self.c_text_line_through_style, + (STYLENS,u'text-underline-style'): self.c_text_underline_style, + (STYLENS,u'width') : self.c_width, + # FIXME Should do style:vertical-pos here + } + + def save_font(self, name, family, generic): + """ It is possible that the HTML browser doesn't know how to + show a particular font. Fortunately ODF provides generic fallbacks. + Unfortunately they are not the same as CSS2. + CSS2: serif, sans-serif, cursive, fantasy, monospace + ODF: roman, swiss, modern, decorative, script, system + This method put the font and fallback into a dictionary + """ + htmlgeneric = "sans-serif" + if generic == "roman": htmlgeneric = "serif" + elif generic == "swiss": htmlgeneric = "sans-serif" + elif generic == "modern": htmlgeneric = "monospace" + elif generic == "decorative": htmlgeneric = "sans-serif" + elif generic == "script": htmlgeneric = "monospace" + elif generic == "system": htmlgeneric = "serif" + self.fontdict[name] = (family, htmlgeneric) + + def c_drawfillimage(self, ruleset, sdict, rule, val): + """ Fill a figure with an image. Since CSS doesn't let you resize images + this should really be implemented as an absolutely position + with a width and a height + """ + sdict['background-image'] = "url('%s')" % self.fillimages[val] + + def c_fo(self, ruleset, sdict, rule, val): + """ XSL formatting attributes """ + selector = rule[1] + sdict[selector] = val + + def c_border_model(self, ruleset, sdict, rule, val): + """ Convert to CSS2 border model """ + if val == 'collapsing': + sdict['border-collapse'] ='collapse' + else: + sdict['border-collapse'] ='separate' + + def c_width(self, ruleset, sdict, rule, val): + """ Set width of box """ + sdict['width'] = val + + def c_text_align(self, ruleset, sdict, rule, align): + """ Text align """ + if align == "start": align = "left" + if align == "end": align = "right" + sdict['text-align'] = align + + def c_fn(self, ruleset, sdict, rule, fontstyle): + """ Generate the CSS font family + A generic font can be found in two ways. In a + element or as a font-family-generic attribute in text-properties. + """ + generic = ruleset.get((STYLENS,'font-family-generic') ) + if generic is not None: + self.save_font(fontstyle, fontstyle, generic) + family, htmlgeneric = self.fontdict.get(fontstyle, (fontstyle, 'serif')) + sdict['font-family'] = '%s, %s' % (family, htmlgeneric) + + def c_text_position(self, ruleset, sdict, rule, tp): + """ Text position. This is used e.g. to make superscript and subscript + This attribute can have one or two values. + + The first value must be present and specifies the vertical + text position as a percentage that relates to the current font + height or it takes one of the values sub or super. Negative + percentages or the sub value place the text below the + baseline. Positive percentages or the super value place + the text above the baseline. If sub or super is specified, + the application can choose an appropriate text position. + + The second value is optional and specifies the font height + as a percentage that relates to the current font-height. If + this value is not specified, an appropriate font height is + used. Although this value may change the font height that + is displayed, it never changes the current font height that + is used for additional calculations. + """ + textpos = tp.split(' ') + if len(textpos) == 2 and textpos[0] != "0%": + # Bug in OpenOffice. If vertical-align is 0% - ignore the text size. + sdict['font-size'] = textpos[1] + if textpos[0] == "super": + sdict['vertical-align'] = "33%" + elif textpos[0] == "sub": + sdict['vertical-align'] = "-33%" + else: + sdict['vertical-align'] = textpos[0] + + def c_hp(self, ruleset, sdict, rule, hpos): + #FIXME: Frames wrap-style defaults to 'parallel', graphics to 'none'. + # It is properly set in the parent-styles, but the program doesn't + # collect the information. + wrap = ruleset.get((STYLENS,'wrap'),'parallel') + # Can have: from-left, left, center, right, from-inside, inside, outside + if hpos == "center": + sdict['margin-left'] = "auto" + sdict['margin-right'] = "auto" +# else: +# # force it to be *something* then delete it +# sdict['margin-left'] = sdict['margin-right'] = '' +# del sdict['margin-left'], sdict['margin-right'] + + if hpos in ("right","outside"): + if wrap in ( "left", "parallel","dynamic"): + sdict['float'] = "right" + elif wrap == "run-through": + sdict['position'] = "absolute" # Simulate run-through + sdict['top'] = "0" + sdict['right'] = "0"; + else: # No wrapping + sdict['margin-left'] = "auto" + sdict['margin-right'] = "0px" + elif hpos in ("left", "inside"): + if wrap in ( "right", "parallel","dynamic"): + sdict['float'] = "left" + elif wrap == "run-through": + sdict['position'] = "absolute" # Simulate run-through + sdict['top'] = "0" + sdict['left'] = "0" + else: # No wrapping + sdict['margin-left'] = "0px" + sdict['margin-right'] = "auto" + elif hpos in ("from-left", "from-inside"): + if wrap in ( "right", "parallel"): + sdict['float'] = "left" + else: + sdict['position'] = "relative" # No wrapping + if ruleset.has_key( (SVGNS,'x') ): + sdict['left'] = ruleset[(SVGNS,'x')] + + def c_page_width(self, ruleset, sdict, rule, val): + """ Set width of box + HTML doesn't really have a page-width. It is always 100% of the browser width + """ + sdict['width'] = val + + def c_text_underline_style(self, ruleset, sdict, rule, val): + """ Set underline decoration + HTML doesn't really have a page-width. It is always 100% of the browser width + """ + if val and val != "none": + sdict['text-decoration'] = "underline" + + def c_text_line_through_style(self, ruleset, sdict, rule, val): + """ Set underline decoration + HTML doesn't really have a page-width. It is always 100% of the browser width + """ + if val and val != "none": + sdict['text-decoration'] = "line-through" + + def c_page_height(self, ruleset, sdict, rule, val): + """ Set height of box """ + sdict['height'] = val + + def convert_styles(self, ruleset): + """ Rule is a tuple of (namespace, name). If the namespace is '' then + it is already CSS2 + """ + sdict = {} + for rule,val in ruleset.items(): + if rule[0] == '': + sdict[rule[1]] = val + continue + method = self.ruleconversions.get(rule, None ) + if method: + method(ruleset, sdict, rule, val) + return sdict + + +class TagStack: + def __init__(self): + self.stack = [] + + def push(self, tag, attrs): + self.stack.append( (tag, attrs) ) + + def pop(self): + item = self.stack.pop() + return item + + def stackparent(self): + item = self.stack[-1] + return item[1] + + def rfindattr(self, attr): + """ Find a tag with the given attribute """ + for tag, attrs in self.stack: + if attrs.has_key(attr): + return attrs[attr] + return None + def count_tags(self, tag): + c = 0 + for ttag, tattrs in self.stack: + if ttag == tag: c = c + 1 + return c + +special_styles = { + 'S-Emphasis':'em', + 'S-Citation':'cite', + 'S-Strong_20_Emphasis':'strong', + 'S-Variable':'var', + 'S-Definition':'dfn', + 'S-Teletype':'tt', + 'P-Heading_20_1':'h1', + 'P-Heading_20_2':'h2', + 'P-Heading_20_3':'h3', + 'P-Heading_20_4':'h4', + 'P-Heading_20_5':'h5', + 'P-Heading_20_6':'h6', +# 'P-Caption':'caption', + 'P-Addressee':'address', +# 'P-List_20_Heading':'dt', +# 'P-List_20_Contents':'dd', + 'P-Preformatted_20_Text':'pre', +# 'P-Table_20_Heading':'th', +# 'P-Table_20_Contents':'td', +# 'P-Text_20_body':'p' +} + +#----------------------------------------------------------------------------- +# +# ODFCONTENTHANDLER +# +#----------------------------------------------------------------------------- +class ODF2XHTML(handler.ContentHandler): + """ The ODF2XHTML parses an ODF file and produces XHTML""" + + def __init__(self, generate_css=True, embedable=False): + # Tags + self.generate_css = generate_css + self.elements = { + (DCNS, 'title'): (self.s_processcont, self.e_dc_title), + (DCNS, 'language'): (self.s_processcont, self.e_dc_contentlanguage), + (DCNS, 'creator'): (self.s_processcont, self.e_dc_creator), + (DCNS, 'description'): (self.s_processcont, self.e_dc_metatag), + (DCNS, 'date'): (self.s_processcont, self.e_dc_metatag), + (DRAWNS, 'custom-shape'): (self.s_custom_shape, self.e_custom_shape), + (DRAWNS, 'frame'): (self.s_draw_frame, self.e_draw_frame), + (DRAWNS, 'image'): (self.s_draw_image, None), + (DRAWNS, 'fill-image'): (self.s_draw_fill_image, None), + (DRAWNS, "layer-set"):(self.s_ignorexml, None), + (DRAWNS, 'object'): (self.s_draw_object, None), + (DRAWNS, 'object-ole'): (self.s_draw_object_ole, None), + (DRAWNS, 'page'): (self.s_draw_page, self.e_draw_page), + (DRAWNS, 'text-box'): (self.s_draw_textbox, self.e_draw_textbox), + (METANS, 'creation-date'):(self.s_processcont, self.e_dc_metatag), + (METANS, 'generator'):(self.s_processcont, self.e_dc_metatag), + (METANS, 'initial-creator'): (self.s_processcont, self.e_dc_metatag), + (METANS, 'keyword'): (self.s_processcont, self.e_dc_metatag), + (NUMBERNS, "boolean-style"):(self.s_ignorexml, None), + (NUMBERNS, "currency-style"):(self.s_ignorexml, None), + (NUMBERNS, "date-style"):(self.s_ignorexml, None), + (NUMBERNS, "number-style"):(self.s_ignorexml, None), + (NUMBERNS, "text-style"):(self.s_ignorexml, None), + (OFFICENS, "annotation"):(self.s_ignorexml, None), + (OFFICENS, "automatic-styles"):(self.s_office_automatic_styles, None), + (OFFICENS, "document"):(self.s_office_document_content, self.e_office_document_content), + (OFFICENS, "document-content"):(self.s_office_document_content, self.e_office_document_content), + (OFFICENS, "forms"):(self.s_ignorexml, None), + (OFFICENS, "master-styles"):(self.s_office_master_styles, None), + (OFFICENS, "meta"):(self.s_ignorecont, None), + (OFFICENS, "presentation"):(self.s_office_presentation, self.e_office_presentation), + (OFFICENS, "spreadsheet"):(self.s_office_spreadsheet, self.e_office_spreadsheet), + (OFFICENS, "styles"):(self.s_office_styles, None), + (OFFICENS, "text"):(self.s_office_text, self.e_office_text), + (OFFICENS, "scripts"):(self.s_ignorexml, None), + (OFFICENS, "settings"):(self.s_ignorexml, None), + (PRESENTATIONNS, "notes"):(self.s_ignorexml, None), +# (STYLENS, "default-page-layout"):(self.s_style_default_page_layout, self.e_style_page_layout), + (STYLENS, "default-page-layout"):(self.s_ignorexml, None), + (STYLENS, "default-style"):(self.s_style_default_style, self.e_style_default_style), + (STYLENS, "drawing-page-properties"):(self.s_style_handle_properties, None), + (STYLENS, "font-face"):(self.s_style_font_face, None), +# (STYLENS, "footer"):(self.s_style_footer, self.e_style_footer), +# (STYLENS, "footer-style"):(self.s_style_footer_style, None), + (STYLENS, "graphic-properties"):(self.s_style_handle_properties, None), + (STYLENS, "handout-master"):(self.s_ignorexml, None), +# (STYLENS, "header"):(self.s_style_header, self.e_style_header), +# (STYLENS, "header-footer-properties"):(self.s_style_handle_properties, None), +# (STYLENS, "header-style"):(self.s_style_header_style, None), + (STYLENS, "master-page"):(self.s_style_master_page, None), + (STYLENS, "page-layout-properties"):(self.s_style_handle_properties, None), + (STYLENS, "page-layout"):(self.s_style_page_layout, self.e_style_page_layout), +# (STYLENS, "page-layout"):(self.s_ignorexml, None), + (STYLENS, "paragraph-properties"):(self.s_style_handle_properties, None), + (STYLENS, "style"):(self.s_style_style, self.e_style_style), + (STYLENS, "table-cell-properties"):(self.s_style_handle_properties, None), + (STYLENS, "table-column-properties"):(self.s_style_handle_properties, None), + (STYLENS, "table-properties"):(self.s_style_handle_properties, None), + (STYLENS, "text-properties"):(self.s_style_handle_properties, None), + (SVGNS, 'desc'): (self.s_ignorexml, None), + (TABLENS, 'covered-table-cell'): (self.s_ignorexml, None), + (TABLENS, 'table-cell'): (self.s_table_table_cell, self.e_table_table_cell), + (TABLENS, 'table-column'): (self.s_table_table_column, None), + (TABLENS, 'table-row'): (self.s_table_table_row, self.e_table_table_row), + (TABLENS, 'table'): (self.s_table_table, self.e_table_table), + (TEXTNS, 'a'): (self.s_text_a, self.e_text_a), + (TEXTNS, "alphabetical-index-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, "bibliography-configuration"):(self.s_ignorexml, None), + (TEXTNS, "bibliography-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, 'bookmark'): (self.s_text_bookmark, None), + (TEXTNS, 'bookmark-start'): (self.s_text_bookmark, None), + (TEXTNS, 'bookmark-ref'): (self.s_text_bookmark_ref, self.e_text_a), + (TEXTNS, 'bookmark-ref-start'): (self.s_text_bookmark_ref, None), + (TEXTNS, 'h'): (self.s_text_h, self.e_text_h), + (TEXTNS, "illustration-index-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, 'line-break'):(self.s_text_line_break, None), + (TEXTNS, "linenumbering-configuration"):(self.s_ignorexml, None), + (TEXTNS, "list"):(self.s_text_list, self.e_text_list), + (TEXTNS, "list-item"):(self.s_text_list_item, self.e_text_list_item), + (TEXTNS, "list-level-style-bullet"):(self.s_text_list_level_style_bullet, self.e_text_list_level_style_bullet), + (TEXTNS, "list-level-style-number"):(self.s_text_list_level_style_number, self.e_text_list_level_style_number), + (TEXTNS, "list-style"):(None, None), + (TEXTNS, "note"):(self.s_text_note, None), + (TEXTNS, "note-body"):(self.s_text_note_body, self.e_text_note_body), + (TEXTNS, "note-citation"):(None, self.e_text_note_citation), + (TEXTNS, "notes-configuration"):(self.s_ignorexml, None), + (TEXTNS, "object-index-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, 'p'): (self.s_text_p, self.e_text_p), + (TEXTNS, 's'): (self.s_text_s, None), + (TEXTNS, 'span'): (self.s_text_span, self.e_text_span), + (TEXTNS, 'tab'): (self.s_text_tab, None), + (TEXTNS, "table-index-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, "table-of-content-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, "user-index-source"):(self.s_text_x_source, self.e_text_x_source), + } + if embedable: + self.make_embedable() + self._resetobject() + + def set_plain(self): + """ Tell the parser to not generate CSS """ + self.generate_css = False + + def set_embedable(self): + """ Tells the converter to only output the parts inside the """ + self.elements[(OFFICENS, u"text")] = (None,None) + self.elements[(OFFICENS, u"spreadsheet")] = (None,None) + self.elements[(OFFICENS, u"presentation")] = (None,None) + self.elements[(OFFICENS, u"document-content")] = (None,None) + + + def add_style_file(self, stylefilename, media=None): + """ Add a link to an external style file. + Also turns of the embedding of styles in the HTML + """ + self.use_internal_css = False + self.stylefilename = stylefilename + if media: + self.metatags.append('\n' % (stylefilename,media)) + else: + self.metatags.append('\n' % (stylefilename)) + + def _resetfootnotes(self): + # Footnotes and endnotes + self.notedict = {} + self.currentnote = 0 + self.notebody = '' + + def _resetobject(self): + self.lines = [] + self._wfunc = self._wlines + self.xmlfile = '' + self.title = '' + self.language = '' + self.creator = '' + self.data = [] + self.tagstack = TagStack() + self.htmlstack = [] + self.pstack = [] + self.processelem = True + self.processcont = True + self.listtypes = {} + self.headinglevels = [0, 0,0,0,0,0, 0,0,0,0,0] # level 0 to 10 + self.use_internal_css = True + self.cs = StyleToCSS() + self.anchors = {} + + # Style declarations + self.stylestack = [] + self.styledict = {} + self.currentstyle = None + + self._resetfootnotes() + + # Tags from meta.xml + self.metatags = [] + + + def writeout(self, s): + if s != '': + self._wfunc(s) + + def writedata(self): + d = ''.join(self.data) + if d != '': + self.writeout(escape(d)) + + def opentag(self, tag, attrs={}, block=False): + """ Create an open HTML tag """ + self.htmlstack.append((tag,attrs,block)) + a = [] + for key,val in attrs.items(): + a.append('''%s=%s''' % (key, quoteattr(val))) + if len(a) == 0: + self.writeout("<%s>" % tag) + else: + self.writeout("<%s %s>" % (tag, " ".join(a))) + if block == True: + self.writeout("\n") + + def closetag(self, tag, block=True): + """ Close an open HTML tag """ + self.htmlstack.pop() + self.writeout("" % tag) + if block == True: + self.writeout("\n") + + def emptytag(self, tag, attrs={}): + a = [] + for key,val in attrs.items(): + a.append('''%s=%s''' % (key, quoteattr(val))) + self.writeout("<%s %s/>\n" % (tag, " ".join(a))) + +#-------------------------------------------------- +# Interface to parser +#-------------------------------------------------- + def characters(self, data): + if self.processelem and self.processcont: + self.data.append(data) + + def startElementNS(self, tag, qname, attrs): + self.pstack.append( (self.processelem, self.processcont) ) + if self.processelem: + method = self.elements.get(tag, (None, None) )[0] + if method: + self.handle_starttag(tag, method, attrs) + else: + self.unknown_starttag(tag,attrs) + self.tagstack.push( tag, attrs ) + + def endElementNS(self, tag, qname): + stag, attrs = self.tagstack.pop() + if self.processelem: + method = self.elements.get(tag, (None, None) )[1] + if method: + self.handle_endtag(tag, attrs, method) + else: + self.unknown_endtag(tag, attrs) + self.processelem, self.processcont = self.pstack.pop() + +#-------------------------------------------------- + def handle_starttag(self, tag, method, attrs): + method(tag,attrs) + + def handle_endtag(self, tag, attrs, method): + method(tag, attrs) + + def unknown_starttag(self, tag, attrs): + pass + + def unknown_endtag(self, tag, attrs): + pass + + def s_ignorexml(self, tag, attrs): + """ Ignore this xml element and all children of it + It will automatically stop ignoring + """ + self.processelem = False + + def s_ignorecont(self, tag, attrs): + """ Stop processing the text nodes """ + self.processcont = False + + def s_processcont(self, tag, attrs): + """ Start processing the text nodes """ + self.processcont = True + + def classname(self, attrs): + """ Generate a class name from a style name """ + c = attrs.get((TEXTNS,'style-name'),'') + c = c.replace(".","_") + return c + + def get_anchor(self, name): + """ Create a unique anchor id for a href name """ + if not self.anchors.has_key(name): + self.anchors[name] = "anchor%03d" % (len(self.anchors) + 1) + return self.anchors.get(name) + + +#-------------------------------------------------- + + def purgedata(self): + self.data = [] + +#----------------------------------------------------------------------------- +# +# Handle meta data +# +#----------------------------------------------------------------------------- + def e_dc_title(self, tag, attrs): + """ Get the title from the meta data and create a HTML + """ + self.title = ''.join(self.data) + #self.metatags.append('<title>%s\n' % escape(self.title)) + self.data = [] + + def e_dc_metatag(self, tag, attrs): + """ Any other meta data is added as a element + """ + self.metatags.append('\n' % (tag[1], quoteattr(''.join(self.data)))) + self.data = [] + + def e_dc_contentlanguage(self, tag, attrs): + """ Set the content language. Identifies the targeted audience + """ + self.language = ''.join(self.data) + self.metatags.append('\n' % escape(self.language)) + self.data = [] + + def e_dc_creator(self, tag, attrs): + """ Set the content creator. Identifies the targeted audience + """ + self.creator = ''.join(self.data) + self.metatags.append('\n' % escape(self.creator)) + self.data = [] + + def s_custom_shape(self, tag, attrs): + """ A is made into a
in HTML which is then styled + """ + anchor_type = attrs.get((TEXTNS,'anchor-type'),'notfound') + htmltag = 'div' + name = "G-" + attrs.get( (DRAWNS,'style-name'), "") + if name == 'G-': + name = "PR-" + attrs.get( (PRESENTATIONNS,'style-name'), "") + name = name.replace(".","_") + if anchor_type == "paragraph": + style = 'position:absolute;' + elif anchor_type == 'char': + style = "position:absolute;" + elif anchor_type == 'as-char': + htmltag = 'div' + style = '' + else: + style = "position: absolute;" + if attrs.has_key( (SVGNS,"width") ): + style = style + "width:" + attrs[(SVGNS,"width")] + ";" + if attrs.has_key( (SVGNS,"height") ): + style = style + "height:" + attrs[(SVGNS,"height")] + ";" + if attrs.has_key( (SVGNS,"x") ): + style = style + "left:" + attrs[(SVGNS,"x")] + ";" + if attrs.has_key( (SVGNS,"y") ): + style = style + "top:" + attrs[(SVGNS,"y")] + ";" + if self.generate_css: + self.opentag(htmltag, {'class': name, 'style': style}) + else: + self.opentag(htmltag) + + def e_custom_shape(self, tag, attrs): + """ End the + """ + self.closetag('div') + + def s_draw_frame(self, tag, attrs): + """ A is made into a
in HTML which is then styled + """ + anchor_type = attrs.get((TEXTNS,'anchor-type'),'notfound') + htmltag = 'div' + name = "G-" + attrs.get( (DRAWNS,'style-name'), "") + if name == 'G-': + name = "PR-" + attrs.get( (PRESENTATIONNS,'style-name'), "") + name = name.replace(".","_") + if anchor_type == "paragraph": + style = 'position:relative;' + elif anchor_type == 'char': + style = "position:relative;" + elif anchor_type == 'as-char': + htmltag = 'div' + style = '' + else: + style = "position:absolute;" + if attrs.has_key( (SVGNS,"width") ): + style = style + "width:" + attrs[(SVGNS,"width")] + ";" + if attrs.has_key( (SVGNS,"height") ): + style = style + "height:" + attrs[(SVGNS,"height")] + ";" + if attrs.has_key( (SVGNS,"x") ): + style = style + "left:" + attrs[(SVGNS,"x")] + ";" + if attrs.has_key( (SVGNS,"y") ): + style = style + "top:" + attrs[(SVGNS,"y")] + ";" + if self.generate_css: + self.opentag(htmltag, {'class': name, 'style': style}) + else: + self.opentag(htmltag) + + def e_draw_frame(self, tag, attrs): + """ End the + """ + self.closetag('div') + + def s_draw_fill_image(self, tag, attrs): + name = attrs.get( (DRAWNS,'name'), "NoName") + imghref = attrs[(XLINKNS,"href")] + imghref = self.rewritelink(imghref) + self.cs.fillimages[name] = imghref + + def rewritelink(self, imghref): + """ Intended to be overloaded if you don't store your pictures + in a Pictures subfolder + """ + return imghref + + def s_draw_image(self, tag, attrs): + """ A becomes an element + """ + parent = self.tagstack.stackparent() + anchor_type = parent.get((TEXTNS,'anchor-type')) + imghref = attrs[(XLINKNS,"href")] + imghref = self.rewritelink(imghref) + htmlattrs = {'alt':"", 'src':imghref } + if self.generate_css: + if anchor_type != "char": + htmlattrs['style'] = "display: block;" + self.emptytag('img', htmlattrs) + + def s_draw_object(self, tag, attrs): + """ A is embedded object in the document (e.g. spreadsheet in presentation). + """ + objhref = attrs[(XLINKNS,"href")] + # Remove leading "./": from "./Object 1" to "Object 1" +# objhref = objhref [2:] + + # Not using os.path.join since it fails to find the file on Windows. +# objcontentpath = '/'.join([objhref, 'content.xml']) + + for c in self.document.childnodes: + if c.folder == objhref: + self._walknode(c.topnode) + + def s_draw_object_ole(self, tag, attrs): + """ A is embedded OLE object in the document (e.g. MS Graph). + """ + class_id = attrs[(DRAWNS,"class-id")] + if class_id and class_id.lower() == "00020803-0000-0000-c000-000000000046": ## Microsoft Graph 97 Chart + tagattrs = { 'name':'object_ole_graph', 'class':'ole-graph' } + self.opentag('a', tagattrs) + self.closetag('a', tagattrs) + + def s_draw_page(self, tag, attrs): + """ A is a slide in a presentation. We use a
element in HTML. + Therefore if you convert a ODP file, you get a series of
s. + Override this for your own purpose. + """ + name = attrs.get( (DRAWNS,'name'), "NoName") + stylename = attrs.get( (DRAWNS,'style-name'), "") + stylename = stylename.replace(".","_") + masterpage = attrs.get( (DRAWNS,'master-page-name'),"") + masterpage = masterpage.replace(".","_") + if self.generate_css: + self.opentag('fieldset', {'class':"DP-%s MP-%s" % (stylename, masterpage) }) + else: + self.opentag('fieldset') + self.opentag('legend') + self.writeout(escape(name)) + self.closetag('legend') + + def e_draw_page(self, tag, attrs): + self.closetag('fieldset') + + def s_draw_textbox(self, tag, attrs): + style = '' + if attrs.has_key( (FONS,"min-height") ): + style = style + "min-height:" + attrs[(FONS,"min-height")] + ";" + self.opentag('div') +# self.opentag('div', {'style': style}) + + def e_draw_textbox(self, tag, attrs): + """ End the + """ + self.closetag('div') + + def html_body(self, tag, attrs): + self.writedata() + if self.generate_css and self.use_internal_css: + self.opentag('style', {'type':"text/css"}, True) + self.writeout('/**/\n') + self.closetag('style') + self.purgedata() + self.closetag('head') + self.opentag('body', block=True) + + default_styles = """ +img { width: 100%; height: 100%; } +* { padding: 0; margin: 0; background-color:white; } +body { margin: 0 1em; } +ol, ul { padding-left: 2em; } +""" + + def generate_stylesheet(self): + for name in self.stylestack: + styles = self.styledict.get(name) + # Preload with the family's default style + if styles.has_key('__style-family') and self.styledict.has_key(styles['__style-family']): + familystyle = self.styledict[styles['__style-family']].copy() + del styles['__style-family'] + for style, val in styles.items(): + familystyle[style] = val + styles = familystyle + # Resolve the remaining parent styles + while styles.has_key('__parent-style-name') and self.styledict.has_key(styles['__parent-style-name']): + parentstyle = self.styledict[styles['__parent-style-name']].copy() + del styles['__parent-style-name'] + for style, val in styles.items(): + parentstyle[style] = val + styles = parentstyle + self.styledict[name] = styles + # Write the styles to HTML + self.writeout(self.default_styles) + for name in self.stylestack: + styles = self.styledict.get(name) + css2 = self.cs.convert_styles(styles) + self.writeout("%s {\n" % name) + for style, val in css2.items(): + self.writeout("\t%s: %s;\n" % (style, val) ) + self.writeout("}\n") + + def generate_footnotes(self): + if self.currentnote == 0: + return + if self.generate_css: + self.opentag('ol', {'style':'border-top: 1px solid black'}, True) + else: + self.opentag('ol') + for key in range(1,self.currentnote+1): + note = self.notedict[key] +# for key,note in self.notedict.items(): + self.opentag('li', { 'id':"footnote-%d" % key }) +# self.opentag('sup') +# self.writeout(escape(note['citation'])) +# self.closetag('sup', False) + self.writeout(note['body']) + self.closetag('li') + self.closetag('ol') + + def s_office_automatic_styles(self, tag, attrs): + if self.xmlfile == 'styles.xml': + self.autoprefix = "A" + else: + self.autoprefix = "" + + def s_office_document_content(self, tag, attrs): + """ First tag in the content.xml file""" + self.writeout('\n') + self.opentag('html', {'xmlns':"http://www.w3.org/1999/xhtml"}, True) + self.opentag('head', block=True) + self.emptytag('meta', { 'http-equiv':"Content-Type", 'content':"text/html;charset=UTF-8"}) + for metaline in self.metatags: + self.writeout(metaline) + self.writeout('%s\n' % escape(self.title)) + + def e_office_document_content(self, tag, attrs): + """ Last tag """ + self.closetag('html') + + def s_office_master_styles(self, tag, attrs): + """ """ + + def s_office_presentation(self, tag, attrs): + """ For some odd reason, OpenOffice Impress doesn't define a default-style + for the 'paragraph'. We therefore force a standard when we see + it is a presentation + """ + self.styledict['p'] = {(FONS,u'font-size'): u"24pt" } + self.styledict['presentation'] = {(FONS,u'font-size'): u"24pt" } + self.html_body(tag, attrs) + + def e_office_presentation(self, tag, attrs): + self.generate_footnotes() + self.closetag('body') + + def s_office_spreadsheet(self, tag, attrs): + self.html_body(tag, attrs) + + def e_office_spreadsheet(self, tag, attrs): + self.generate_footnotes() + self.closetag('body') + + def s_office_styles(self, tag, attrs): + self.autoprefix = "" + + def s_office_text(self, tag, attrs): + """ OpenDocument text """ + self.styledict['frame'] = { (STYLENS,'wrap'): u'parallel'} + self.html_body(tag, attrs) + + def e_office_text(self, tag, attrs): + self.generate_footnotes() + self.closetag('body') + + def s_style_handle_properties(self, tag, attrs): + """ Copy all attributes to a struct. + We will later convert them to CSS2 + """ + for key,attr in attrs.items(): + self.styledict[self.currentstyle][key] = attr + + + familymap = {'frame':'frame', 'paragraph':'p', 'presentation':'presentation', + 'text':'span','section':'div', + 'table':'table','table-cell':'td','table-column':'col', + 'table-row':'tr','graphic':'graphic' } + + def s_style_default_style(self, tag, attrs): + """ A default style is like a style on an HTML tag + """ + family = attrs[(STYLENS,'family')] + htmlfamily = self.familymap.get(family,'unknown') + self.currentstyle = htmlfamily +# self.stylestack.append(self.currentstyle) + self.styledict[self.currentstyle] = {} + + def e_style_default_style(self, tag, attrs): + self.currentstyle = None + + def s_style_font_face(self, tag, attrs): + """ It is possible that the HTML browser doesn't know how to + show a particular font. Luckily ODF provides generic fallbacks + Unfortunately they are not the same as CSS2. + CSS2: serif, sans-serif, cursive, fantasy, monospace + ODF: roman, swiss, modern, decorative, script, system + """ + name = attrs[(STYLENS,"name")] + family = attrs[(SVGNS,"font-family")] + generic = attrs.get( (STYLENS,'font-family-generic'),"" ) + self.cs.save_font(name, family, generic) + + def s_style_footer(self, tag, attrs): + self.opentag('div', { 'id':"footer" }) + self.purgedata() + + def e_style_footer(self, tag, attrs): + self.writedata() + self.closetag('div') + self.purgedata() + + def s_style_footer_style(self, tag, attrs): + self.currentstyle = "@print #footer" + self.stylestack.append(self.currentstyle) + self.styledict[self.currentstyle] = {} + + def s_style_header(self, tag, attrs): + self.opentag('div', { 'id':"header" }) + self.purgedata() + + def e_style_header(self, tag, attrs): + self.writedata() + self.closetag('div') + self.purgedata() + + def s_style_header_style(self, tag, attrs): + self.currentstyle = "@print #header" + self.stylestack.append(self.currentstyle) + self.styledict[self.currentstyle] = {} + + def s_style_default_page_layout(self, tag, attrs): + """ Collect the formatting for the default page layout style. + """ + self.currentstyle = "@page" + self.stylestack.append(self.currentstyle) + self.styledict[self.currentstyle] = {} + + def s_style_page_layout(self, tag, attrs): + """ Collect the formatting for the page layout style. + This won't work in CSS 2.1, as page identifiers are not allowed. + It is legal in CSS3, but the rest of the application doesn't specify when to use what page layout + """ + name = attrs[(STYLENS,'name')] + name = name.replace(".","_") + self.currentstyle = ".PL-" + name + self.stylestack.append(self.currentstyle) + self.styledict[self.currentstyle] = {} + + def e_style_page_layout(self, tag, attrs): + """ End this style + """ + self.currentstyle = None + + def s_style_master_page(self, tag, attrs): + """ Collect the formatting for the page layout style. + """ + name = attrs[(STYLENS,'name')] + name = name.replace(".","_") + + self.currentstyle = ".MP-" + name + self.stylestack.append(self.currentstyle) + self.styledict[self.currentstyle] = {('','position'):'relative'} + # Then load the pagelayout style if we find it + pagelayout = attrs.get( (STYLENS,'page-layout-name'), None) + if pagelayout: + pagelayout = ".PL-" + pagelayout + if self.styledict.has_key( pagelayout ): + styles = self.styledict[pagelayout] + for style, val in styles.items(): + self.styledict[self.currentstyle][style] = val + else: + self.styledict[self.currentstyle]['__parent-style-name'] = pagelayout + self.s_ignorexml(tag, attrs) + + # Short prefixes for class selectors + _familyshort = {'drawing-page':'DP', 'paragraph':'P', 'presentation':'PR', + 'text':'S', 'section':'D', + 'table':'T', 'table-cell':'TD', 'table-column':'TC', + 'table-row':'TR', 'graphic':'G' } + + def s_style_style(self, tag, attrs): + """ Collect the formatting for the style. + Styles have scope. The same name can be used for both paragraph and + character styles Since CSS has no scope we use a prefix. (Not elegant) + In ODF a style can have a parent, these parents can be chained. + We may not have encountered the parent yet, but if we have, we resolve it. + """ + name = attrs[(STYLENS,'name')] + name = name.replace(".","_") + family = attrs[(STYLENS,'family')] + htmlfamily = self.familymap.get(family,'unknown') + sfamily = self._familyshort.get(family,'X') + name = "%s%s-%s" % (self.autoprefix, sfamily, name) + parent = attrs.get( (STYLENS,'parent-style-name') ) + self.currentstyle = special_styles.get(name,"."+name) + self.stylestack.append(self.currentstyle) + if not self.styledict.has_key(self.currentstyle): + self.styledict[self.currentstyle] = {} + + self.styledict[self.currentstyle]['__style-family'] = htmlfamily + + # Then load the parent style if we find it + if parent: + parent = "%s-%s" % (sfamily, parent) + parent = special_styles.get(parent, "."+parent) + if self.styledict.has_key( parent ): + styles = self.styledict[parent] + for style, val in styles.items(): + self.styledict[self.currentstyle][style] = val + else: + self.styledict[self.currentstyle]['__parent-style-name'] = parent + + def e_style_style(self, tag, attrs): + """ End this style + """ + self.currentstyle = None + + def s_table_table(self, tag, attrs): + """ Start a table + """ + c = attrs.get( (TABLENS,'style-name'), None) + if c and self.generate_css: + c = c.replace(".","_") + self.opentag('table',{ 'class': "T-%s" % c }) + else: + self.opentag('table') + self.purgedata() + + def e_table_table(self, tag, attrs): + """ End a table + """ + self.writedata() + self.closetag('table') + self.purgedata() + + def s_table_table_cell(self, tag, attrs): + """ Start a table cell """ + #FIXME: number-columns-repeated § 8.1.3 + #repeated = int(attrs.get( (TABLENS,'number-columns-repeated'), 1)) + htmlattrs = {} + rowspan = attrs.get( (TABLENS,'number-rows-spanned') ) + if rowspan: + htmlattrs['rowspan'] = rowspan + colspan = attrs.get( (TABLENS,'number-columns-spanned') ) + if colspan: + htmlattrs['colspan'] = colspan + + c = attrs.get( (TABLENS,'style-name') ) + if c: + htmlattrs['class'] = 'TD-%s' % c.replace(".","_") + self.opentag('td', htmlattrs) + self.purgedata() + + def e_table_table_cell(self, tag, attrs): + """ End a table cell """ + self.writedata() + self.closetag('td') + self.purgedata() + + def s_table_table_column(self, tag, attrs): + """ Start a table column """ + c = attrs.get( (TABLENS,'style-name'), None) + repeated = int(attrs.get( (TABLENS,'number-columns-repeated'), 1)) + htmlattrs = {} + if c: + htmlattrs['class'] = "TC-%s" % c.replace(".","_") + for x in xrange(repeated): + self.emptytag('col', htmlattrs) + self.purgedata() + + def s_table_table_row(self, tag, attrs): + """ Start a table row """ + #FIXME: table:number-rows-repeated + c = attrs.get( (TABLENS,'style-name'), None) + htmlattrs = {} + if c: + htmlattrs['class'] = "TR-%s" % c.replace(".","_") + self.opentag('tr', htmlattrs) + self.purgedata() + + def e_table_table_row(self, tag, attrs): + """ End a table row """ + self.writedata() + self.closetag('tr') + self.purgedata() + + def s_text_a(self, tag, attrs): + """ Anchors start """ + self.writedata() + href = attrs[(XLINKNS,"href")].split("|")[0] + if href[0] == "#": + href = "#" + self.get_anchor(href[1:]) + self.opentag('a', {'href':href}) + self.purgedata() + + def e_text_a(self, tag, attrs): + """ End an anchor or bookmark reference """ + self.writedata() + self.closetag('a', False) + self.purgedata() + + def s_text_bookmark(self, tag, attrs): + """ Bookmark definition """ + name = attrs[(TEXTNS,'name')] + html_id = self.get_anchor(name) + self.writedata() + self.opentag('span', {'id':html_id}) + self.closetag('span', False) + self.purgedata() + + def s_text_bookmark_ref(self, tag, attrs): + """ Bookmark reference """ + name = attrs[(TEXTNS,'ref-name')] + html_id = "#" + self.get_anchor(name) + self.writedata() + self.opentag('a', {'href':html_id}) + self.purgedata() + + def s_text_h(self, tag, attrs): + """ Headings start """ + level = int(attrs[(TEXTNS,'outline-level')]) + if level > 6: level = 6 # Heading levels go only to 6 in XHTML + if level < 1: level = 1 + self.headinglevels[level] = self.headinglevels[level] + 1 + name = self.classname(attrs) + for x in range(level + 1,10): + self.headinglevels[x] = 0 + special = special_styles.get("P-"+name) + if special or not self.generate_css: + self.opentag('h%s' % level) + else: + self.opentag('h%s' % level, {'class':"P-%s" % name }) + self.purgedata() + + def e_text_h(self, tag, attrs): + """ Headings end + Side-effect: If there is no title in the metadata, then it is taken + from the first heading of any level. + """ + self.writedata() + level = int(attrs[(TEXTNS,'outline-level')]) + if level > 6: level = 6 # Heading levels go only to 6 in XHTML + if level < 1: level = 1 + lev = self.headinglevels[1:level+1] + outline = '.'.join(map(str,lev) ) + heading = ''.join(self.data) + if self.title == '': self.title = heading + anchor = self.get_anchor("%s.%s" % ( outline, heading)) + self.opentag('a', {'id': anchor} ) + self.closetag('a', False) + self.closetag('h%s' % level) + self.purgedata() + + def s_text_line_break(self, tag, attrs): + """ Force a line break (
) """ + self.writedata() + self.emptytag('br') + self.purgedata() + + def s_text_list(self, tag, attrs): + """ Start a list (
    or
      ) + To know which level we're at, we have to count the number + of elements on the tagstack. + """ + name = attrs.get( (TEXTNS,'style-name') ) + level = self.tagstack.count_tags(tag) + 1 + if name: + name = name.replace(".","_") + else: + # FIXME: If a list is contained in a table cell or text box, + # the list level must return to 1, even though the table or + # textbox itself may be nested within another list. + name = self.tagstack.rfindattr( (TEXTNS,'style-name') ) + list_class = "%s_%d" % (name, level) + if self.generate_css: + self.opentag('%s' % self.listtypes.get(list_class,'ul'), {'class': list_class }) + else: + self.opentag('%s' % self.listtypes.get(list_class,'ul')) + self.purgedata() + + def e_text_list(self, tag, attrs): + """ End a list """ + self.writedata() + name = attrs.get( (TEXTNS,'style-name') ) + level = self.tagstack.count_tags(tag) + 1 + if name: + name = name.replace(".","_") + else: + # FIXME: If a list is contained in a table cell or text box, + # the list level must return to 1, even though the table or + # textbox itself may be nested within another list. + name = self.tagstack.rfindattr( (TEXTNS,'style-name') ) + list_class = "%s_%d" % (name, level) + self.closetag(self.listtypes.get(list_class,'ul')) + self.purgedata() + + def s_text_list_item(self, tag, attrs): + """ Start list item """ + self.opentag('li') + self.purgedata() + + def e_text_list_item(self, tag, attrs): + """ End list item """ + self.writedata() + self.closetag('li') + self.purgedata() + + def s_text_list_level_style_bullet(self, tag, attrs): + """ CSS doesn't have the ability to set the glyph + to a particular character, so we just go through + the available glyphs + """ + name = self.tagstack.rfindattr( (STYLENS,'name') ) + level = attrs[(TEXTNS,'level')] + self.prevstyle = self.currentstyle + list_class = "%s_%s" % (name, level) + self.listtypes[list_class] = 'ul' + self.currentstyle = ".%s_%s" % ( name.replace(".","_"), level) + self.stylestack.append(self.currentstyle) + self.styledict[self.currentstyle] = {} + + level = int(level) + listtype = ("square", "disc", "circle")[level % 3] + self.styledict[self.currentstyle][('','list-style-type')] = listtype + + def e_text_list_level_style_bullet(self, tag, attrs): + self.currentstyle = self.prevstyle + del self.prevstyle + + def s_text_list_level_style_number(self, tag, attrs): + name = self.tagstack.stackparent()[(STYLENS,'name')] + level = attrs[(TEXTNS,'level')] + num_format = attrs.get( (STYLENS,'name'),"1") + list_class = "%s_%s" % (name, level) + self.prevstyle = self.currentstyle + self.currentstyle = ".%s_%s" % ( name.replace(".","_"), level) + self.listtypes[list_class] = 'ol' + self.stylestack.append(self.currentstyle) + self.styledict[self.currentstyle] = {} + if num_format == "1": listtype = "decimal" + elif num_format == "I": listtype = "upper-roman" + elif num_format == "i": listtype = "lower-roman" + elif num_format == "A": listtype = "upper-alpha" + elif num_format == "a": listtype = "lower-alpha" + else: listtype = "decimal" + self.styledict[self.currentstyle][('','list-style-type')] = listtype + + def e_text_list_level_style_number(self, tag, attrs): + self.currentstyle = self.prevstyle + del self.prevstyle + + def s_text_note(self, tag, attrs): + self.writedata() + self.purgedata() + self.currentnote = self.currentnote + 1 + self.notedict[self.currentnote] = {} + self.notebody = [] + + def e_text_note(self, tag, attrs): + pass + + def collectnote(self,s): + if s != '': + self.notebody.append(s) + + def s_text_note_body(self, tag, attrs): + self._orgwfunc = self._wfunc + self._wfunc = self.collectnote + + def e_text_note_body(self, tag, attrs): + self._wfunc = self._orgwfunc + self.notedict[self.currentnote]['body'] = ''.join(self.notebody) + self.notebody = '' + del self._orgwfunc + + def e_text_note_citation(self, tag, attrs): + mark = ''.join(self.data) + self.notedict[self.currentnote]['citation'] = mark + self.opentag('a',{ 'href': "#footnote-%s" % self.currentnote }) + self.opentag('sup') +# self.writeout( escape(mark) ) + # Since HTML only knows about endnotes, there is too much risk that the + # marker is reused in the source. Therefore we force numeric markers + self.writeout(unicode(self.currentnote)) + self.closetag('sup') + self.closetag('a') + + def s_text_p(self, tag, attrs): + """ Paragraph + """ + htmlattrs = {} + specialtag = "p" + c = attrs.get( (TEXTNS,'style-name'), None) + if c: + c = c.replace(".","_") + specialtag = special_styles.get("P-"+c) + if specialtag is None: + specialtag = 'p' + if self.generate_css: + htmlattrs['class'] = "P-%s" % c + self.opentag(specialtag, htmlattrs) + self.purgedata() + + def e_text_p(self, tag, attrs): + """ End Paragraph + """ + specialtag = "p" + c = attrs.get( (TEXTNS,'style-name'), None) + if c: + c = c.replace(".","_") + specialtag = special_styles.get("P-"+c) + if specialtag is None: + specialtag = 'p' + self.writedata() + self.closetag(specialtag) + self.purgedata() + + def s_text_s(self, tag, attrs): + """ Generate a number of spaces. ODF has an element; HTML uses   + We use   so we can send the output through an XML parser if we desire to + """ + c = attrs.get( (TEXTNS,'c'),"1") + for x in xrange(int(c)): + self.writeout(' ') + + def s_text_span(self, tag, attrs): + """ The element matches the element in HTML. It is + typically used to properties of the text. + """ + self.writedata() + c = attrs.get( (TEXTNS,'style-name'), None) + htmlattrs = {} + if c: + c = c.replace(".","_") + special = special_styles.get("S-"+c) + if special is None and self.generate_css: + htmlattrs['class'] = "S-%s" % c + self.opentag('span', htmlattrs) + self.purgedata() + + def e_text_span(self, tag, attrs): + """ End the """ + self.writedata() + self.closetag('span', False) + self.purgedata() + + def s_text_tab(self, tag, attrs): + """ Move to the next tabstop. We ignore this in HTML + """ + self.writedata() + self.writeout(' ') + self.purgedata() + + def s_text_x_source(self, tag, attrs): + """ Various indexes and tables of contents. We ignore those. + """ + self.writedata() + self.purgedata() + self.s_ignorexml(tag, attrs) + + def e_text_x_source(self, tag, attrs): + """ Various indexes and tables of contents. We ignore those. + """ + self.writedata() + self.purgedata() + + +#----------------------------------------------------------------------------- +# +# Reading the file +# +#----------------------------------------------------------------------------- + + def load(self, odffile): + """ Loads a document into the parser and parses it. + The argument can either be a filename or a document in memory. + """ + self.lines = [] + self._wfunc = self._wlines + if isinstance(odffile, basestring): + self.document = load(odffile) + else: + self.document = odffile + self._walknode(self.document.topnode) + + def _walknode(self, node): + if node.nodeType == Node.ELEMENT_NODE: + self.startElementNS(node.qname, node.tagName, node.attributes) + for c in node.childNodes: + self._walknode(c) + self.endElementNS(node.qname, node.tagName) + if node.nodeType == Node.TEXT_NODE or node.nodeType == Node.CDATA_SECTION_NODE: + self.characters(unicode(node)) + + + def odf2xhtml(self, odffile): + """ Load a file and return the XHTML + """ + self.load(odffile) + return self.xhtml() + + def _wlines(self,s): + if s != '': self.lines.append(s) + + def xhtml(self): + """ Returns the xhtml + """ + return ''.join(self.lines) + + def _writecss(self, s): + if s != '': self._csslines.append(s) + + def _writenothing(self, s): + pass + + def css(self): + """ Returns the CSS content """ + self._csslines = [] + self._wfunc = self._writecss + self.generate_stylesheet() + res = ''.join(self._csslines) + self._wfunc = self._wlines + del self._csslines + return res + + def save(self, outputfile, addsuffix=False): + """ Save the HTML under the filename. + If the filename is '-' then save to stdout + We have the last style filename in self.stylefilename + """ + if outputfile == '-': + outputfp = sys.stdout + else: + if addsuffix: + outputfile = outputfile + ".html" + outputfp = file(outputfile, "w") + outputfp.write(self.xhtml().encode('us-ascii','xmlcharrefreplace')) + outputfp.close() + + +class ODF2XHTMLembedded(ODF2XHTML): + """ The ODF2XHTML parses an ODF file and produces XHTML""" + + def __init__(self, lines, generate_css=True, embedable=False): + self._resetobject() + self.lines = lines + + # Tags + self.generate_css = generate_css + self.elements = { +# (DCNS, 'title'): (self.s_processcont, self.e_dc_title), +# (DCNS, 'language'): (self.s_processcont, self.e_dc_contentlanguage), +# (DCNS, 'creator'): (self.s_processcont, self.e_dc_metatag), +# (DCNS, 'description'): (self.s_processcont, self.e_dc_metatag), +# (DCNS, 'date'): (self.s_processcont, self.e_dc_metatag), + (DRAWNS, 'frame'): (self.s_draw_frame, self.e_draw_frame), + (DRAWNS, 'image'): (self.s_draw_image, None), + (DRAWNS, 'fill-image'): (self.s_draw_fill_image, None), + (DRAWNS, "layer-set"):(self.s_ignorexml, None), + (DRAWNS, 'page'): (self.s_draw_page, self.e_draw_page), + (DRAWNS, 'object'): (self.s_draw_object, None), + (DRAWNS, 'object-ole'): (self.s_draw_object_ole, None), + (DRAWNS, 'text-box'): (self.s_draw_textbox, self.e_draw_textbox), +# (METANS, 'creation-date'):(self.s_processcont, self.e_dc_metatag), +# (METANS, 'generator'):(self.s_processcont, self.e_dc_metatag), +# (METANS, 'initial-creator'): (self.s_processcont, self.e_dc_metatag), +# (METANS, 'keyword'): (self.s_processcont, self.e_dc_metatag), + (NUMBERNS, "boolean-style"):(self.s_ignorexml, None), + (NUMBERNS, "currency-style"):(self.s_ignorexml, None), + (NUMBERNS, "date-style"):(self.s_ignorexml, None), + (NUMBERNS, "number-style"):(self.s_ignorexml, None), + (NUMBERNS, "text-style"):(self.s_ignorexml, None), +# (OFFICENS, "automatic-styles"):(self.s_office_automatic_styles, None), +# (OFFICENS, "document-content"):(self.s_office_document_content, self.e_office_document_content), + (OFFICENS, "forms"):(self.s_ignorexml, None), +# (OFFICENS, "master-styles"):(self.s_office_master_styles, None), + (OFFICENS, "meta"):(self.s_ignorecont, None), +# (OFFICENS, "presentation"):(self.s_office_presentation, self.e_office_presentation), +# (OFFICENS, "spreadsheet"):(self.s_office_spreadsheet, self.e_office_spreadsheet), +# (OFFICENS, "styles"):(self.s_office_styles, None), +# (OFFICENS, "text"):(self.s_office_text, self.e_office_text), + (OFFICENS, "scripts"):(self.s_ignorexml, None), + (PRESENTATIONNS, "notes"):(self.s_ignorexml, None), +## (STYLENS, "default-page-layout"):(self.s_style_default_page_layout, self.e_style_page_layout), +# (STYLENS, "default-page-layout"):(self.s_ignorexml, None), +# (STYLENS, "default-style"):(self.s_style_default_style, self.e_style_default_style), +# (STYLENS, "drawing-page-properties"):(self.s_style_handle_properties, None), +# (STYLENS, "font-face"):(self.s_style_font_face, None), +## (STYLENS, "footer"):(self.s_style_footer, self.e_style_footer), +## (STYLENS, "footer-style"):(self.s_style_footer_style, None), +# (STYLENS, "graphic-properties"):(self.s_style_handle_properties, None), +# (STYLENS, "handout-master"):(self.s_ignorexml, None), +## (STYLENS, "header"):(self.s_style_header, self.e_style_header), +## (STYLENS, "header-footer-properties"):(self.s_style_handle_properties, None), +## (STYLENS, "header-style"):(self.s_style_header_style, None), +# (STYLENS, "master-page"):(self.s_style_master_page, None), +# (STYLENS, "page-layout-properties"):(self.s_style_handle_properties, None), +## (STYLENS, "page-layout"):(self.s_style_page_layout, self.e_style_page_layout), +# (STYLENS, "page-layout"):(self.s_ignorexml, None), +# (STYLENS, "paragraph-properties"):(self.s_style_handle_properties, None), +# (STYLENS, "style"):(self.s_style_style, self.e_style_style), +# (STYLENS, "table-cell-properties"):(self.s_style_handle_properties, None), +# (STYLENS, "table-column-properties"):(self.s_style_handle_properties, None), +# (STYLENS, "table-properties"):(self.s_style_handle_properties, None), +# (STYLENS, "text-properties"):(self.s_style_handle_properties, None), + (SVGNS, 'desc'): (self.s_ignorexml, None), + (TABLENS, 'covered-table-cell'): (self.s_ignorexml, None), + (TABLENS, 'table-cell'): (self.s_table_table_cell, self.e_table_table_cell), + (TABLENS, 'table-column'): (self.s_table_table_column, None), + (TABLENS, 'table-row'): (self.s_table_table_row, self.e_table_table_row), + (TABLENS, 'table'): (self.s_table_table, self.e_table_table), + (TEXTNS, 'a'): (self.s_text_a, self.e_text_a), + (TEXTNS, "alphabetical-index-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, "bibliography-configuration"):(self.s_ignorexml, None), + (TEXTNS, "bibliography-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, 'h'): (self.s_text_h, self.e_text_h), + (TEXTNS, "illustration-index-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, 'line-break'):(self.s_text_line_break, None), + (TEXTNS, "linenumbering-configuration"):(self.s_ignorexml, None), + (TEXTNS, "list"):(self.s_text_list, self.e_text_list), + (TEXTNS, "list-item"):(self.s_text_list_item, self.e_text_list_item), + (TEXTNS, "list-level-style-bullet"):(self.s_text_list_level_style_bullet, self.e_text_list_level_style_bullet), + (TEXTNS, "list-level-style-number"):(self.s_text_list_level_style_number, self.e_text_list_level_style_number), + (TEXTNS, "list-style"):(None, None), + (TEXTNS, "note"):(self.s_text_note, None), + (TEXTNS, "note-body"):(self.s_text_note_body, self.e_text_note_body), + (TEXTNS, "note-citation"):(None, self.e_text_note_citation), + (TEXTNS, "notes-configuration"):(self.s_ignorexml, None), + (TEXTNS, "object-index-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, 'p'): (self.s_text_p, self.e_text_p), + (TEXTNS, 's'): (self.s_text_s, None), + (TEXTNS, 'span'): (self.s_text_span, self.e_text_span), + (TEXTNS, 'tab'): (self.s_text_tab, None), + (TEXTNS, "table-index-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, "table-of-content-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, "user-index-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, "page-number"):(None, None), + } + diff --git a/tablib/packages/odf/odfmanifest.py b/tablib/packages/odf/odfmanifest.py new file mode 100644 index 0000000..07754fd --- /dev/null +++ b/tablib/packages/odf/odfmanifest.py @@ -0,0 +1,115 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +# This script lists the content of the manifest.xml file +import zipfile +from xml.sax import make_parser,handler +from xml.sax.xmlreader import InputSource +import xml.sax.saxutils +from cStringIO import StringIO + +MANIFESTNS="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0" + +#----------------------------------------------------------------------------- +# +# ODFMANIFESTHANDLER +# +#----------------------------------------------------------------------------- + +class ODFManifestHandler(handler.ContentHandler): + """ The ODFManifestHandler parses a manifest file and produces a list of + content """ + + def __init__(self): + self.manifest = {} + + # Tags + # FIXME: Also handle encryption data + self.elements = { + (MANIFESTNS, 'file-entry'): (self.s_file_entry, self.donothing), + } + + def handle_starttag(self, tag, method, attrs): + method(tag,attrs) + + def handle_endtag(self, tag, method): + method(tag) + + def startElementNS(self, tag, qname, attrs): + method = self.elements.get(tag, (None, None))[0] + if method: + self.handle_starttag(tag, method, attrs) + else: + self.unknown_starttag(tag,attrs) + + def endElementNS(self, tag, qname): + method = self.elements.get(tag, (None, None))[1] + if method: + self.handle_endtag(tag, method) + else: + self.unknown_endtag(tag) + + def unknown_starttag(self, tag, attrs): + pass + + def unknown_endtag(self, tag): + pass + + def donothing(self, tag, attrs=None): + pass + + def s_file_entry(self, tag, attrs): + m = attrs.get((MANIFESTNS, 'media-type'),"application/octet-stream") + p = attrs.get((MANIFESTNS, 'full-path')) + self.manifest[p] = { 'media-type':m, 'full-path':p } + + +#----------------------------------------------------------------------------- +# +# Reading the file +# +#----------------------------------------------------------------------------- + +def manifestlist(manifestxml): + odhandler = ODFManifestHandler() + parser = make_parser() + parser.setFeature(handler.feature_namespaces, 1) + parser.setContentHandler(odhandler) + parser.setErrorHandler(handler.ErrorHandler()) + + inpsrc = InputSource() + inpsrc.setByteStream(StringIO(manifestxml)) + parser.parse(inpsrc) + + return odhandler.manifest + +def odfmanifest(odtfile): + z = zipfile.ZipFile(odtfile) + manifest = z.read('META-INF/manifest.xml') + z.close() + return manifestlist(manifest) + +if __name__ == "__main__": + import sys + result = odfmanifest(sys.argv[1]) + for file in result.values(): + print "%-40s %-40s" % (file['media-type'], file['full-path']) + diff --git a/tablib/packages/odf/office.py b/tablib/packages/odf/office.py new file mode 100644 index 0000000..085e251 --- /dev/null +++ b/tablib/packages/odf/office.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from namespaces import OFFICENS +from element import Element +from draw import StyleRefElement + +# Autogenerated +def Annotation(**args): + return StyleRefElement(qname = (OFFICENS,'annotation'), **args) + +def AutomaticStyles(**args): + return Element(qname = (OFFICENS, 'automatic-styles'), **args) + +def BinaryData(**args): + return Element(qname = (OFFICENS,'binary-data'), **args) + +def Body(**args): + return Element(qname = (OFFICENS, 'body'), **args) + +def ChangeInfo(**args): + return Element(qname = (OFFICENS,'change-info'), **args) + +def Chart(**args): + return Element(qname = (OFFICENS,'chart'), **args) + +def DdeSource(**args): + return Element(qname = (OFFICENS,'dde-source'), **args) + +def Document(version="1.1", **args): + return Element(qname = (OFFICENS,'document'), version=version, **args) + +def DocumentContent(version="1.1", **args): + return Element(qname = (OFFICENS, 'document-content'), version=version, **args) + +def DocumentMeta(version="1.1", **args): + return Element(qname = (OFFICENS, 'document-meta'), version=version, **args) + +def DocumentSettings(version="1.1", **args): + return Element(qname = (OFFICENS, 'document-settings'), version=version, **args) + +def DocumentStyles(version="1.1", **args): + return Element(qname = (OFFICENS, 'document-styles'), version=version, **args) + +def Drawing(**args): + return Element(qname = (OFFICENS,'drawing'), **args) + +def EventListeners(**args): + return Element(qname = (OFFICENS,'event-listeners'), **args) + +def FontFaceDecls(**args): + return Element(qname = (OFFICENS, 'font-face-decls'), **args) + +def Forms(**args): + return Element(qname = (OFFICENS,'forms'), **args) + +def Image(**args): + return Element(qname = (OFFICENS,'image'), **args) + +def MasterStyles(**args): + return Element(qname = (OFFICENS, 'master-styles'), **args) + +def Meta(**args): + return Element(qname = (OFFICENS, 'meta'), **args) + +def Presentation(**args): + return Element(qname = (OFFICENS,'presentation'), **args) + +def Script(**args): + return Element(qname = (OFFICENS, 'script'), **args) + +def Scripts(**args): + return Element(qname = (OFFICENS, 'scripts'), **args) + +def Settings(**args): + return Element(qname = (OFFICENS, 'settings'), **args) + +def Spreadsheet(**args): + return Element(qname = (OFFICENS, 'spreadsheet'), **args) + +def Styles(**args): + return Element(qname = (OFFICENS, 'styles'), **args) + +def Text(**args): + return Element(qname = (OFFICENS, 'text'), **args) + +# Autogenerated end diff --git a/tablib/packages/odf/opendocument.py b/tablib/packages/odf/opendocument.py new file mode 100644 index 0000000..6319638 --- /dev/null +++ b/tablib/packages/odf/opendocument.py @@ -0,0 +1,654 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2010 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +__doc__="""Use OpenDocument to generate your documents.""" + +import zipfile, time, sys, mimetypes, copy +from cStringIO import StringIO +from namespaces import * +import manifest, meta +from office import * +import element +from attrconverters import make_NCName +from xml.sax.xmlreader import InputSource +from odfmanifest import manifestlist + +__version__= TOOLSVERSION + +_XMLPROLOGUE = u"\n" + +UNIXPERMS = 0100644 << 16L # -rw-r--r-- + +IS_FILENAME = 0 +IS_IMAGE = 1 +# We need at least Python 2.2 +assert sys.version_info[0]>=2 and sys.version_info[1] >= 2 + +#sys.setrecursionlimit(100) +#The recursion limit is set conservative so mistakes like +# s=content() s.addElement(s) won't eat up too much processor time. + +odmimetypes = { + 'application/vnd.oasis.opendocument.text': '.odt', + 'application/vnd.oasis.opendocument.text-template': '.ott', + 'application/vnd.oasis.opendocument.graphics': '.odg', + 'application/vnd.oasis.opendocument.graphics-template': '.otg', + 'application/vnd.oasis.opendocument.presentation': '.odp', + 'application/vnd.oasis.opendocument.presentation-template': '.otp', + 'application/vnd.oasis.opendocument.spreadsheet': '.ods', + 'application/vnd.oasis.opendocument.spreadsheet-template': '.ots', + 'application/vnd.oasis.opendocument.chart': '.odc', + 'application/vnd.oasis.opendocument.chart-template': '.otc', + 'application/vnd.oasis.opendocument.image': '.odi', + 'application/vnd.oasis.opendocument.image-template': '.oti', + 'application/vnd.oasis.opendocument.formula': '.odf', + 'application/vnd.oasis.opendocument.formula-template': '.otf', + 'application/vnd.oasis.opendocument.text-master': '.odm', + 'application/vnd.oasis.opendocument.text-web': '.oth', +} + +class OpaqueObject: + def __init__(self, filename, mediatype, content=None): + self.mediatype = mediatype + self.filename = filename + self.content = content + +class OpenDocument: + """ A class to hold the content of an OpenDocument document + Use the xml method to write the XML + source to the screen or to a file + d = OpenDocument(mimetype) + fd.write(d.xml()) + """ + thumbnail = None + + def __init__(self, mimetype, add_generator=True): + self.mimetype = mimetype + self.childobjects = [] + self._extra = [] + self.folder = "" # Always empty for toplevel documents + self.topnode = Document(mimetype=self.mimetype) + self.topnode.ownerDocument = self + + self.clear_caches() + + self.Pictures = {} + self.meta = Meta() + self.topnode.addElement(self.meta) + if add_generator: + self.meta.addElement(meta.Generator(text=TOOLSVERSION)) + self.scripts = Scripts() + self.topnode.addElement(self.scripts) + self.fontfacedecls = FontFaceDecls() + self.topnode.addElement(self.fontfacedecls) + self.settings = Settings() + self.topnode.addElement(self.settings) + self.styles = Styles() + self.topnode.addElement(self.styles) + self.automaticstyles = AutomaticStyles() + self.topnode.addElement(self.automaticstyles) + self.masterstyles = MasterStyles() + self.topnode.addElement(self.masterstyles) + self.body = Body() + self.topnode.addElement(self.body) + + def rebuild_caches(self, node=None): + if node is None: node = self.topnode + self.build_caches(node) + for e in node.childNodes: + if e.nodeType == element.Node.ELEMENT_NODE: + self.rebuild_caches(e) + + def clear_caches(self): + self.element_dict = {} + self._styles_dict = {} + self._styles_ooo_fix = {} + + def build_caches(self, element): + """ Called from element.py + """ + if not self.element_dict.has_key(element.qname): + self.element_dict[element.qname] = [] + self.element_dict[element.qname].append(element) + if element.qname == (STYLENS, u'style'): + self.__register_stylename(element) # Add to style dictionary + styleref = element.getAttrNS(TEXTNS,u'style-name') + if styleref is not None and self._styles_ooo_fix.has_key(styleref): + element.setAttrNS(TEXTNS,u'style-name', self._styles_ooo_fix[styleref]) + + def __register_stylename(self, element): + ''' Register a style. But there are three style dictionaries: + office:styles, office:automatic-styles and office:master-styles + Chapter 14 + ''' + name = element.getAttrNS(STYLENS, u'name') + if name is None: + return + if element.parentNode.qname in ((OFFICENS,u'styles'), (OFFICENS,u'automatic-styles')): + if self._styles_dict.has_key(name): + newname = 'M'+name # Rename style + self._styles_ooo_fix[name] = newname + # From here on all references to the old name will refer to the new one + name = newname + element.setAttrNS(STYLENS, u'name', name) + self._styles_dict[name] = element + + def toXml(self, filename=''): + xml=StringIO() + xml.write(_XMLPROLOGUE) + self.body.toXml(0, xml) + if not filename: + return xml.getvalue() + else: + f=file(filename,'w') + f.write(xml.getvalue()) + f.close() + + def xml(self): + """ Generates the full document as an XML file + Always written as a bytestream in UTF-8 encoding + """ + self.__replaceGenerator() + xml=StringIO() + xml.write(_XMLPROLOGUE) + self.topnode.toXml(0, xml) + return xml.getvalue() + + + def contentxml(self): + """ Generates the content.xml file + Always written as a bytestream in UTF-8 encoding + """ + xml=StringIO() + xml.write(_XMLPROLOGUE) + x = DocumentContent() + x.write_open_tag(0, xml) + if self.scripts.hasChildNodes(): + self.scripts.toXml(1, xml) + if self.fontfacedecls.hasChildNodes(): + self.fontfacedecls.toXml(1, xml) + a = AutomaticStyles() + stylelist = self._used_auto_styles([self.styles, self.automaticstyles, self.body]) + if len(stylelist) > 0: + a.write_open_tag(1, xml) + for s in stylelist: + s.toXml(2, xml) + a.write_close_tag(1, xml) + else: + a.toXml(1, xml) + self.body.toXml(1, xml) + x.write_close_tag(0, xml) + return xml.getvalue() + + def __manifestxml(self): + """ Generates the manifest.xml file + The self.manifest isn't avaible unless the document is being saved + """ + xml=StringIO() + xml.write(_XMLPROLOGUE) + self.manifest.toXml(0,xml) + return xml.getvalue() + + def metaxml(self): + """ Generates the meta.xml file """ + self.__replaceGenerator() + x = DocumentMeta() + x.addElement(self.meta) + xml=StringIO() + xml.write(_XMLPROLOGUE) + x.toXml(0,xml) + return xml.getvalue() + + def settingsxml(self): + """ Generates the settings.xml file """ + x = DocumentSettings() + x.addElement(self.settings) + xml=StringIO() + xml.write(_XMLPROLOGUE) + x.toXml(0,xml) + return xml.getvalue() + + def _parseoneelement(self, top, stylenamelist): + """ Finds references to style objects in master-styles + and add the style name to the style list if not already there. + Recursive + """ + for e in top.childNodes: + if e.nodeType == element.Node.ELEMENT_NODE: + for styleref in ( (DRAWNS,u'style-name'), + (DRAWNS,u'text-style-name'), + (PRESENTATIONNS,u'style-name'), + (STYLENS,u'data-style-name'), + (STYLENS,u'list-style-name'), + (STYLENS,u'page-layout-name'), + (STYLENS,u'style-name'), + (TABLENS,u'default-cell-style-name'), + (TABLENS,u'style-name'), + (TEXTNS,u'style-name') ): + if e.getAttrNS(styleref[0],styleref[1]): + stylename = e.getAttrNS(styleref[0],styleref[1]) + if stylename not in stylenamelist: + stylenamelist.append(stylename) + stylenamelist = self._parseoneelement(e, stylenamelist) + return stylenamelist + + def _used_auto_styles(self, segments): + """ Loop through the masterstyles elements, and find the automatic + styles that are used. These will be added to the automatic-styles + element in styles.xml + """ + stylenamelist = [] + for top in segments: + stylenamelist = self._parseoneelement(top, stylenamelist) + stylelist = [] + for e in self.automaticstyles.childNodes: + if e.getAttrNS(STYLENS,u'name') in stylenamelist: + stylelist.append(e) + return stylelist + + def stylesxml(self): + """ Generates the styles.xml file """ + xml=StringIO() + xml.write(_XMLPROLOGUE) + x = DocumentStyles() + x.write_open_tag(0, xml) + if self.fontfacedecls.hasChildNodes(): + self.fontfacedecls.toXml(1, xml) + self.styles.toXml(1, xml) + a = AutomaticStyles() + a.write_open_tag(1, xml) + for s in self._used_auto_styles([self.masterstyles]): + s.toXml(2, xml) + a.write_close_tag(1, xml) + if self.masterstyles.hasChildNodes(): + self.masterstyles.toXml(1, xml) + x.write_close_tag(0, xml) + return xml.getvalue() + + def addPicture(self, filename, mediatype=None, content=None): + """ Add a picture + It uses the same convention as OOo, in that it saves the picture in + the zipfile in the subdirectory 'Pictures' + If passed a file ptr, mediatype must be set + """ + if content is None: + if mediatype is None: + mediatype, encoding = mimetypes.guess_type(filename) + if mediatype is None: + mediatype = '' + try: ext = filename[filename.rindex('.'):] + except: ext='' + else: + ext = mimetypes.guess_extension(mediatype) + manifestfn = "Pictures/%0.0f%s" % ((time.time()*10000000000), ext) + self.Pictures[manifestfn] = (IS_FILENAME, filename, mediatype) + else: + manifestfn = filename + self.Pictures[manifestfn] = (IS_IMAGE, content, mediatype) + return manifestfn + + def addPictureFromFile(self, filename, mediatype=None): + """ Add a picture + It uses the same convention as OOo, in that it saves the picture in + the zipfile in the subdirectory 'Pictures'. + If mediatype is not given, it will be guessed from the filename + extension. + """ + if mediatype is None: + mediatype, encoding = mimetypes.guess_type(filename) + if mediatype is None: + mediatype = '' + try: ext = filename[filename.rindex('.'):] + except ValueError: ext='' + else: + ext = mimetypes.guess_extension(mediatype) + manifestfn = "Pictures/%0.0f%s" % ((time.time()*10000000000), ext) + self.Pictures[manifestfn] = (IS_FILENAME, filename, mediatype) + return manifestfn + + def addPictureFromString(self, content, mediatype): + """ Add a picture + It uses the same convention as OOo, in that it saves the picture in + the zipfile in the subdirectory 'Pictures'. The content variable + is a string that contains the binary image data. The mediatype + indicates the image format. + """ + ext = mimetypes.guess_extension(mediatype) + manifestfn = "Pictures/%0.0f%s" % ((time.time()*10000000000), ext) + self.Pictures[manifestfn] = (IS_IMAGE, content, mediatype) + return manifestfn + + def addThumbnail(self, filecontent=None): + """ Add a fixed thumbnail + The thumbnail in the library is big, so this is pretty useless. + """ + if filecontent is None: + import thumbnail + self.thumbnail = thumbnail.thumbnail() + else: + self.thumbnail = filecontent + + def addObject(self, document, objectname=None): + """ Adds an object (subdocument). The object must be an OpenDocument class + The return value will be the folder in the zipfile the object is stored in + """ + self.childobjects.append(document) + if objectname is None: + document.folder = "%s/Object %d" % (self.folder, len(self.childobjects)) + else: + document.folder = objectname + return ".%s" % document.folder + + def _savePictures(self, object, folder): + hasPictures = False + for arcname, picturerec in object.Pictures.items(): + what_it_is, fileobj, mediatype = picturerec + self.manifest.addElement(manifest.FileEntry(fullpath="%s%s" % ( folder ,arcname), mediatype=mediatype)) + hasPictures = True + if what_it_is == IS_FILENAME: + self._z.write(fileobj, arcname, zipfile.ZIP_STORED) + else: + zi = zipfile.ZipInfo(str(arcname), self._now) + zi.compress_type = zipfile.ZIP_STORED + zi.external_attr = UNIXPERMS + self._z.writestr(zi, fileobj) + # According to section 17.7.3 in ODF 1.1, the pictures folder should not have a manifest entry +# if hasPictures: +# self.manifest.addElement(manifest.FileEntry(fullpath="%sPictures/" % folder, mediatype="")) + # Look in subobjects + subobjectnum = 1 + for subobject in object.childobjects: + self._savePictures(subobject,'%sObject %d/' % (folder, subobjectnum)) + subobjectnum += 1 + + def __replaceGenerator(self): + """ Section 3.1.1: The application MUST NOT export the original identifier + belonging to the application that created the document. + """ + for m in self.meta.childNodes[:]: + if m.qname == (METANS, u'generator'): + self.meta.removeChild(m) + self.meta.addElement(meta.Generator(text=TOOLSVERSION)) + + def save(self, outputfile, addsuffix=False): + """ Save the document under the filename. + If the filename is '-' then save to stdout + """ + if outputfile == '-': + outputfp = zipfile.ZipFile(sys.stdout,"w") + else: + if addsuffix: + outputfile = outputfile + odmimetypes.get(self.mimetype,'.xxx') + outputfp = zipfile.ZipFile(outputfile, "w") + self.__zipwrite(outputfp) + outputfp.close() + + def write(self, outputfp): + """ User API to write the ODF file to an open file descriptor + Writes the ZIP format + """ + zipoutputfp = zipfile.ZipFile(outputfp,"w") + self.__zipwrite(zipoutputfp) + + def __zipwrite(self, outputfp): + """ Write the document to an open file pointer + This is where the real work is done + """ + self._z = outputfp + self._now = time.localtime()[:6] + self.manifest = manifest.Manifest() + + # Write mimetype + zi = zipfile.ZipInfo('mimetype', self._now) + zi.compress_type = zipfile.ZIP_STORED + zi.external_attr = UNIXPERMS + self._z.writestr(zi, self.mimetype) + + self._saveXmlObjects(self,"") + + # Write pictures + self._savePictures(self,"") + + # Write the thumbnail + if self.thumbnail is not None: + self.manifest.addElement(manifest.FileEntry(fullpath="Thumbnails/", mediatype='')) + self.manifest.addElement(manifest.FileEntry(fullpath="Thumbnails/thumbnail.png", mediatype='')) + zi = zipfile.ZipInfo("Thumbnails/thumbnail.png", self._now) + zi.compress_type = zipfile.ZIP_DEFLATED + zi.external_attr = UNIXPERMS + self._z.writestr(zi, self.thumbnail) + + # Write any extra files + for op in self._extra: + if op.filename == "META-INF/documentsignatures.xml": continue # Don't save signatures + self.manifest.addElement(manifest.FileEntry(fullpath=op.filename, mediatype=op.mediatype)) + zi = zipfile.ZipInfo(op.filename.encode('utf-8'), self._now) + zi.compress_type = zipfile.ZIP_DEFLATED + zi.external_attr = UNIXPERMS + if op.content is not None: + self._z.writestr(zi, op.content) + # Write manifest + zi = zipfile.ZipInfo("META-INF/manifest.xml", self._now) + zi.compress_type = zipfile.ZIP_DEFLATED + zi.external_attr = UNIXPERMS + self._z.writestr(zi, self.__manifestxml() ) + del self._z + del self._now + del self.manifest + + + def _saveXmlObjects(self, object, folder): + if self == object: + self.manifest.addElement(manifest.FileEntry(fullpath="/", mediatype=object.mimetype)) + else: + self.manifest.addElement(manifest.FileEntry(fullpath=folder, mediatype=object.mimetype)) + # Write styles + self.manifest.addElement(manifest.FileEntry(fullpath="%sstyles.xml" % folder, mediatype="text/xml")) + zi = zipfile.ZipInfo("%sstyles.xml" % folder, self._now) + zi.compress_type = zipfile.ZIP_DEFLATED + zi.external_attr = UNIXPERMS + self._z.writestr(zi, object.stylesxml() ) + + # Write content + self.manifest.addElement(manifest.FileEntry(fullpath="%scontent.xml" % folder, mediatype="text/xml")) + zi = zipfile.ZipInfo("%scontent.xml" % folder, self._now) + zi.compress_type = zipfile.ZIP_DEFLATED + zi.external_attr = UNIXPERMS + self._z.writestr(zi, object.contentxml() ) + + # Write settings + if object.settings.hasChildNodes(): + self.manifest.addElement(manifest.FileEntry(fullpath="%ssettings.xml" % folder, mediatype="text/xml")) + zi = zipfile.ZipInfo("%ssettings.xml" % folder, self._now) + zi.compress_type = zipfile.ZIP_DEFLATED + zi.external_attr = UNIXPERMS + self._z.writestr(zi, object.settingsxml() ) + + # Write meta + if self == object: + self.manifest.addElement(manifest.FileEntry(fullpath="meta.xml", mediatype="text/xml")) + zi = zipfile.ZipInfo("meta.xml", self._now) + zi.compress_type = zipfile.ZIP_DEFLATED + zi.external_attr = UNIXPERMS + self._z.writestr(zi, object.metaxml() ) + + # Write subobjects + subobjectnum = 1 + for subobject in object.childobjects: + self._saveXmlObjects(subobject, '%sObject %d/' % (folder, subobjectnum)) + subobjectnum += 1 + +# Document's DOM methods + def createElement(self, element): + """ Inconvenient interface to create an element, but follows XML-DOM. + Does not allow attributes as argument, therefore can't check grammar. + """ + return element(check_grammar=False) + + def createTextNode(self, data): + """ Method to create a text node """ + return element.Text(data) + + def createCDATASection(self, data): + """ Method to create a CDATA section """ + return element.CDATASection(cdata) + + def getMediaType(self): + """ Returns the media type """ + return self.mimetype + + def getStyleByName(self, name): + """ Finds a style object based on the name """ + ncname = make_NCName(name) + if self._styles_dict == {}: + self.rebuild_caches() + return self._styles_dict.get(ncname, None) + + def getElementsByType(self, element): + """ Gets elements based on the type, which is function from text.py, draw.py etc. """ + obj = element(check_grammar=False) + if self.element_dict == {}: + self.rebuild_caches() + return self.element_dict.get(obj.qname, []) + +# Convenience functions +def OpenDocumentChart(): + """ Creates a chart document """ + doc = OpenDocument('application/vnd.oasis.opendocument.chart') + doc.chart = Chart() + doc.body.addElement(doc.chart) + return doc + +def OpenDocumentDrawing(): + """ Creates a drawing document """ + doc = OpenDocument('application/vnd.oasis.opendocument.graphics') + doc.drawing = Drawing() + doc.body.addElement(doc.drawing) + return doc + +def OpenDocumentImage(): + """ Creates an image document """ + doc = OpenDocument('application/vnd.oasis.opendocument.image') + doc.image = Image() + doc.body.addElement(doc.image) + return doc + +def OpenDocumentPresentation(): + """ Creates a presentation document """ + doc = OpenDocument('application/vnd.oasis.opendocument.presentation') + doc.presentation = Presentation() + doc.body.addElement(doc.presentation) + return doc + +def OpenDocumentSpreadsheet(): + """ Creates a spreadsheet document """ + doc = OpenDocument('application/vnd.oasis.opendocument.spreadsheet') + doc.spreadsheet = Spreadsheet() + doc.body.addElement(doc.spreadsheet) + return doc + +def OpenDocumentText(): + """ Creates a text document """ + doc = OpenDocument('application/vnd.oasis.opendocument.text') + doc.text = Text() + doc.body.addElement(doc.text) + return doc + +def OpenDocumentTextMaster(): + """ Creates a text master document """ + doc = OpenDocument('application/vnd.oasis.opendocument.text-master') + doc.text = Text() + doc.body.addElement(doc.text) + return doc + +def __loadxmlparts(z, manifest, doc, objectpath): + from load import LoadParser + from xml.sax import make_parser, handler + + for xmlfile in (objectpath+'settings.xml', objectpath+'meta.xml', objectpath+'content.xml', objectpath+'styles.xml'): + if not manifest.has_key(xmlfile): + continue + try: + xmlpart = z.read(xmlfile) + doc._parsing = xmlfile + + parser = make_parser() + parser.setFeature(handler.feature_namespaces, 1) + parser.setContentHandler(LoadParser(doc)) + parser.setErrorHandler(handler.ErrorHandler()) + + inpsrc = InputSource() + inpsrc.setByteStream(StringIO(xmlpart)) + parser.parse(inpsrc) + del doc._parsing + except KeyError, v: pass + +def load(odffile): + """ Load an ODF file into memory + Returns a reference to the structure + """ + z = zipfile.ZipFile(odffile) + mimetype = z.read('mimetype') + doc = OpenDocument(mimetype, add_generator=False) + + # Look in the manifest file to see if which of the four files there are + manifestpart = z.read('META-INF/manifest.xml') + manifest = manifestlist(manifestpart) + __loadxmlparts(z, manifest, doc, '') + for mentry,mvalue in manifest.items(): + if mentry[:9] == "Pictures/" and len(mentry) > 9: + doc.addPicture(mvalue['full-path'], mvalue['media-type'], z.read(mentry)) + elif mentry == "Thumbnails/thumbnail.png": + doc.addThumbnail(z.read(mentry)) + elif mentry in ('settings.xml', 'meta.xml', 'content.xml', 'styles.xml'): + pass + # Load subobjects into structure + elif mentry[:7] == "Object " and len(mentry) < 11 and mentry[-1] == "/": + subdoc = OpenDocument(mvalue['media-type'], add_generator=False) + doc.addObject(subdoc, "/" + mentry[:-1]) + __loadxmlparts(z, manifest, subdoc, mentry) + elif mentry[:7] == "Object ": + pass # Don't load subobjects as opaque objects + else: + if mvalue['full-path'][-1] == '/': + doc._extra.append(OpaqueObject(mvalue['full-path'], mvalue['media-type'], None)) + else: + doc._extra.append(OpaqueObject(mvalue['full-path'], mvalue['media-type'], z.read(mentry))) + # Add the SUN junk here to the struct somewhere + # It is cached data, so it can be out-of-date + z.close() + b = doc.getElementsByType(Body) + if mimetype[:39] == 'application/vnd.oasis.opendocument.text': + doc.text = b[0].firstChild + elif mimetype[:43] == 'application/vnd.oasis.opendocument.graphics': + doc.graphics = b[0].firstChild + elif mimetype[:47] == 'application/vnd.oasis.opendocument.presentation': + doc.presentation = b[0].firstChild + elif mimetype[:46] == 'application/vnd.oasis.opendocument.spreadsheet': + doc.spreadsheet = b[0].firstChild + elif mimetype[:40] == 'application/vnd.oasis.opendocument.chart': + doc.chart = b[0].firstChild + elif mimetype[:40] == 'application/vnd.oasis.opendocument.image': + doc.image = b[0].firstChild + elif mimetype[:42] == 'application/vnd.oasis.opendocument.formula': + doc.formula = b[0].firstChild + return doc + +# vim: set expandtab sw=4 : diff --git a/tablib/packages/odf/presentation.py b/tablib/packages/odf/presentation.py new file mode 100644 index 0000000..c1f2135 --- /dev/null +++ b/tablib/packages/odf/presentation.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from namespaces import PRESENTATIONNS +from element import Element + +# ODF 1.0 section 9.6 and 9.7 +# Autogenerated +def AnimationGroup(**args): + return Element(qname = (PRESENTATIONNS,'animation-group'), **args) + +def Animations(**args): + return Element(qname = (PRESENTATIONNS,'animations'), **args) + +def DateTime(**args): + return Element(qname = (PRESENTATIONNS,'date-time'), **args) + +def DateTimeDecl(**args): + return Element(qname = (PRESENTATIONNS,'date-time-decl'), **args) + +def Dim(**args): + return Element(qname = (PRESENTATIONNS,'dim'), **args) + +def EventListener(**args): + return Element(qname = (PRESENTATIONNS,'event-listener'), **args) + +def Footer(**args): + return Element(qname = (PRESENTATIONNS,'footer'), **args) + +def FooterDecl(**args): + return Element(qname = (PRESENTATIONNS,'footer-decl'), **args) + +def Header(**args): + return Element(qname = (PRESENTATIONNS,'header'), **args) + +def HeaderDecl(**args): + return Element(qname = (PRESENTATIONNS,'header-decl'), **args) + +def HideShape(**args): + return Element(qname = (PRESENTATIONNS,'hide-shape'), **args) + +def HideText(**args): + return Element(qname = (PRESENTATIONNS,'hide-text'), **args) + +def Notes(**args): + return Element(qname = (PRESENTATIONNS,'notes'), **args) + +def Placeholder(**args): + return Element(qname = (PRESENTATIONNS,'placeholder'), **args) + +def Play(**args): + return Element(qname = (PRESENTATIONNS,'play'), **args) + +def Settings(**args): + return Element(qname = (PRESENTATIONNS,'settings'), **args) + +def Show(**args): + return Element(qname = (PRESENTATIONNS,'show'), **args) + +def ShowShape(**args): + return Element(qname = (PRESENTATIONNS,'show-shape'), **args) + +def ShowText(**args): + return Element(qname = (PRESENTATIONNS,'show-text'), **args) + +def Sound(**args): + return Element(qname = (PRESENTATIONNS,'sound'), **args) + diff --git a/tablib/packages/odf/script.py b/tablib/packages/odf/script.py new file mode 100644 index 0000000..adbc73f --- /dev/null +++ b/tablib/packages/odf/script.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from namespaces import SCRIPTNS +from element import Element + +# ODF 1.0 section 12.4.1 +# The element binds an event to a macro. + +# Autogenerated +def EventListener(**args): + return Element(qname = (SCRIPTNS,'event-listener'), **args) + diff --git a/tablib/packages/odf/style.py b/tablib/packages/odf/style.py new file mode 100644 index 0000000..f64d7c8 --- /dev/null +++ b/tablib/packages/odf/style.py @@ -0,0 +1,148 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from namespaces import STYLENS +from element import Element + +def StyleElement(**args): + e = Element(**args) + if args.get('check_grammar', True) == True: + if not args.has_key('displayname'): + e.setAttrNS(STYLENS,'display-name', args.get('name')) + return e + +# Autogenerated +def BackgroundImage(**args): + return Element(qname = (STYLENS,'background-image'), **args) + +def ChartProperties(**args): + return Element(qname = (STYLENS,'chart-properties'), **args) + +def Column(**args): + return Element(qname = (STYLENS,'column'), **args) + +def ColumnSep(**args): + return Element(qname = (STYLENS,'column-sep'), **args) + +def Columns(**args): + return Element(qname = (STYLENS,'columns'), **args) + +def DefaultStyle(**args): + return Element(qname = (STYLENS,'default-style'), **args) + +def DrawingPageProperties(**args): + return Element(qname = (STYLENS,'drawing-page-properties'), **args) + +def DropCap(**args): + return Element(qname = (STYLENS,'drop-cap'), **args) + +def FontFace(**args): + return Element(qname = (STYLENS,'font-face'), **args) + +def Footer(**args): + return Element(qname = (STYLENS,'footer'), **args) + +def FooterLeft(**args): + return Element(qname = (STYLENS,'footer-left'), **args) + +def FooterStyle(**args): + return Element(qname = (STYLENS,'footer-style'), **args) + +def FootnoteSep(**args): + return Element(qname = (STYLENS,'footnote-sep'), **args) + +def GraphicProperties(**args): + return Element(qname = (STYLENS,'graphic-properties'), **args) + +def HandoutMaster(**args): + return Element(qname = (STYLENS,'handout-master'), **args) + +def Header(**args): + return Element(qname = (STYLENS,'header'), **args) + +def HeaderFooterProperties(**args): + return Element(qname = (STYLENS,'header-footer-properties'), **args) + +def HeaderLeft(**args): + return Element(qname = (STYLENS,'header-left'), **args) + +def HeaderStyle(**args): + return Element(qname = (STYLENS,'header-style'), **args) + +def ListLevelProperties(**args): + return Element(qname = (STYLENS,'list-level-properties'), **args) + +def Map(**args): + return Element(qname = (STYLENS,'map'), **args) + +def MasterPage(**args): + return StyleElement(qname = (STYLENS,'master-page'), **args) + +def PageLayout(**args): + return Element(qname = (STYLENS,'page-layout'), **args) + +def PageLayoutProperties(**args): + return Element(qname = (STYLENS,'page-layout-properties'), **args) + +def ParagraphProperties(**args): + return Element(qname = (STYLENS,'paragraph-properties'), **args) + +def PresentationPageLayout(**args): + return StyleElement(qname = (STYLENS,'presentation-page-layout'), **args) + +def RegionCenter(**args): + return Element(qname = (STYLENS,'region-center'), **args) + +def RegionLeft(**args): + return Element(qname = (STYLENS,'region-left'), **args) + +def RegionRight(**args): + return Element(qname = (STYLENS,'region-right'), **args) + +def RubyProperties(**args): + return Element(qname = (STYLENS,'ruby-properties'), **args) + +def SectionProperties(**args): + return Element(qname = (STYLENS,'section-properties'), **args) + +def Style(**args): + return StyleElement(qname = (STYLENS,'style'), **args) + +def TabStop(**args): + return Element(qname = (STYLENS,'tab-stop'), **args) + +def TabStops(**args): + return Element(qname = (STYLENS,'tab-stops'), **args) + +def TableCellProperties(**args): + return Element(qname = (STYLENS,'table-cell-properties'), **args) + +def TableColumnProperties(**args): + return Element(qname = (STYLENS,'table-column-properties'), **args) + +def TableProperties(**args): + return Element(qname = (STYLENS,'table-properties'), **args) + +def TableRowProperties(**args): + return Element(qname = (STYLENS,'table-row-properties'), **args) + +def TextProperties(**args): + return Element(qname = (STYLENS,'text-properties'), **args) + diff --git a/tablib/packages/odf/svg.py b/tablib/packages/odf/svg.py new file mode 100644 index 0000000..346c490 --- /dev/null +++ b/tablib/packages/odf/svg.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from namespaces import SVGNS +from element import Element +from draw import DrawElement + +# Autogenerated +def DefinitionSrc(**args): + return Element(qname = (SVGNS,'definition-src'), **args) + +def Desc(**args): + return Element(qname = (SVGNS,'desc'), **args) + +def FontFaceFormat(**args): + return Element(qname = (SVGNS,'font-face-format'), **args) + +def FontFaceName(**args): + return Element(qname = (SVGNS,'font-face-name'), **args) + +def FontFaceSrc(**args): + return Element(qname = (SVGNS,'font-face-src'), **args) + +def FontFaceUri(**args): + return Element(qname = (SVGNS,'font-face-uri'), **args) + +def Lineargradient(**args): + return DrawElement(qname = (SVGNS,'linearGradient'), **args) + +def Radialgradient(**args): + return DrawElement(qname = (SVGNS,'radialGradient'), **args) + +def Stop(**args): + return Element(qname = (SVGNS,'stop'), **args) + +def Title(**args): + return Element(qname = (SVGNS,'title'), **args) diff --git a/tablib/packages/odf/table.py b/tablib/packages/odf/table.py new file mode 100644 index 0000000..4ba0c36 --- /dev/null +++ b/tablib/packages/odf/table.py @@ -0,0 +1,307 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from namespaces import TABLENS +from element import Element + + +# Autogenerated +def Body(**args): + return Element(qname = (TABLENS,'body'), **args) + +def CalculationSettings(**args): + return Element(qname = (TABLENS,'calculation-settings'), **args) + +def CellAddress(**args): + return Element(qname = (TABLENS,'cell-address'), **args) + +def CellContentChange(**args): + return Element(qname = (TABLENS,'cell-content-change'), **args) + +def CellContentDeletion(**args): + return Element(qname = (TABLENS,'cell-content-deletion'), **args) + +def CellRangeSource(**args): + return Element(qname = (TABLENS,'cell-range-source'), **args) + +def ChangeDeletion(**args): + return Element(qname = (TABLENS,'change-deletion'), **args) + +def ChangeTrackTableCell(**args): + return Element(qname = (TABLENS,'change-track-table-cell'), **args) + +def Consolidation(**args): + return Element(qname = (TABLENS,'consolidation'), **args) + +def ContentValidation(**args): + return Element(qname = (TABLENS,'content-validation'), **args) + +def ContentValidations(**args): + return Element(qname = (TABLENS,'content-validations'), **args) + +def CoveredTableCell(**args): + return Element(qname = (TABLENS,'covered-table-cell'), **args) + +def CutOffs(**args): + return Element(qname = (TABLENS,'cut-offs'), **args) + +def DataPilotDisplayInfo(**args): + return Element(qname = (TABLENS,'data-pilot-display-info'), **args) + +def DataPilotField(**args): + return Element(qname = (TABLENS,'data-pilot-field'), **args) + +def DataPilotFieldReference(**args): + return Element(qname = (TABLENS,'data-pilot-field-reference'), **args) + +def DataPilotGroup(**args): + return Element(qname = (TABLENS,'data-pilot-group'), **args) + +def DataPilotGroupMember(**args): + return Element(qname = (TABLENS,'data-pilot-group-member'), **args) + +def DataPilotGroups(**args): + return Element(qname = (TABLENS,'data-pilot-groups'), **args) + +def DataPilotLayoutInfo(**args): + return Element(qname = (TABLENS,'data-pilot-layout-info'), **args) + +def DataPilotLevel(**args): + return Element(qname = (TABLENS,'data-pilot-level'), **args) + +def DataPilotMember(**args): + return Element(qname = (TABLENS,'data-pilot-member'), **args) + +def DataPilotMembers(**args): + return Element(qname = (TABLENS,'data-pilot-members'), **args) + +def DataPilotSortInfo(**args): + return Element(qname = (TABLENS,'data-pilot-sort-info'), **args) + +def DataPilotSubtotal(**args): + return Element(qname = (TABLENS,'data-pilot-subtotal'), **args) + +def DataPilotSubtotals(**args): + return Element(qname = (TABLENS,'data-pilot-subtotals'), **args) + +def DataPilotTable(**args): + return Element(qname = (TABLENS,'data-pilot-table'), **args) + +def DataPilotTables(**args): + return Element(qname = (TABLENS,'data-pilot-tables'), **args) + +def DatabaseRange(**args): + return Element(qname = (TABLENS,'database-range'), **args) + +def DatabaseRanges(**args): + return Element(qname = (TABLENS,'database-ranges'), **args) + +def DatabaseSourceQuery(**args): + return Element(qname = (TABLENS,'database-source-query'), **args) + +def DatabaseSourceSql(**args): + return Element(qname = (TABLENS,'database-source-sql'), **args) + +def DatabaseSourceTable(**args): + return Element(qname = (TABLENS,'database-source-table'), **args) + +def DdeLink(**args): + return Element(qname = (TABLENS,'dde-link'), **args) + +def DdeLinks(**args): + return Element(qname = (TABLENS,'dde-links'), **args) + +def Deletion(**args): + return Element(qname = (TABLENS,'deletion'), **args) + +def Deletions(**args): + return Element(qname = (TABLENS,'deletions'), **args) + +def Dependencies(**args): + return Element(qname = (TABLENS,'dependencies'), **args) + +def Dependency(**args): + return Element(qname = (TABLENS,'dependency'), **args) + +def Detective(**args): + return Element(qname = (TABLENS,'detective'), **args) + +def ErrorMacro(**args): + return Element(qname = (TABLENS,'error-macro'), **args) + +def ErrorMessage(**args): + return Element(qname = (TABLENS,'error-message'), **args) + +def EvenColumns(**args): + return Element(qname = (TABLENS,'even-columns'), **args) + +def EvenRows(**args): + return Element(qname = (TABLENS,'even-rows'), **args) + +def Filter(**args): + return Element(qname = (TABLENS,'filter'), **args) + +def FilterAnd(**args): + return Element(qname = (TABLENS,'filter-and'), **args) + +def FilterCondition(**args): + return Element(qname = (TABLENS,'filter-condition'), **args) + +def FilterOr(**args): + return Element(qname = (TABLENS,'filter-or'), **args) + +def FirstColumn(**args): + return Element(qname = (TABLENS,'first-column'), **args) + +def FirstRow(**args): + return Element(qname = (TABLENS,'first-row'), **args) + +def HelpMessage(**args): + return Element(qname = (TABLENS,'help-message'), **args) + +def HighlightedRange(**args): + return Element(qname = (TABLENS,'highlighted-range'), **args) + +def Insertion(**args): + return Element(qname = (TABLENS,'insertion'), **args) + +def InsertionCutOff(**args): + return Element(qname = (TABLENS,'insertion-cut-off'), **args) + +def Iteration(**args): + return Element(qname = (TABLENS,'iteration'), **args) + +def LabelRange(**args): + return Element(qname = (TABLENS,'label-range'), **args) + +def LabelRanges(**args): + return Element(qname = (TABLENS,'label-ranges'), **args) + +def LastColumn(**args): + return Element(qname = (TABLENS,'last-column'), **args) + +def LastRow(**args): + return Element(qname = (TABLENS,'last-row'), **args) + +def Movement(**args): + return Element(qname = (TABLENS,'movement'), **args) + +def MovementCutOff(**args): + return Element(qname = (TABLENS,'movement-cut-off'), **args) + +def NamedExpression(**args): + return Element(qname = (TABLENS,'named-expression'), **args) + +def NamedExpressions(**args): + return Element(qname = (TABLENS,'named-expressions'), **args) + +def NamedRange(**args): + return Element(qname = (TABLENS,'named-range'), **args) + +def NullDate(**args): + return Element(qname = (TABLENS,'null-date'), **args) + +def OddColumns(**args): + return Element(qname = (TABLENS,'odd-columns'), **args) + +def OddRows(**args): + return Element(qname = (TABLENS,'odd-rows'), **args) + +def Operation(**args): + return Element(qname = (TABLENS,'operation'), **args) + +def Previous(**args): + return Element(qname = (TABLENS,'previous'), **args) + +def Scenario(**args): + return Element(qname = (TABLENS,'scenario'), **args) + +def Shapes(**args): + return Element(qname = (TABLENS,'shapes'), **args) + +def Sort(**args): + return Element(qname = (TABLENS,'sort'), **args) + +def SortBy(**args): + return Element(qname = (TABLENS,'sort-by'), **args) + +def SortGroups(**args): + return Element(qname = (TABLENS,'sort-groups'), **args) + +def SourceCellRange(**args): + return Element(qname = (TABLENS,'source-cell-range'), **args) + +def SourceRangeAddress(**args): + return Element(qname = (TABLENS,'source-range-address'), **args) + +def SourceService(**args): + return Element(qname = (TABLENS,'source-service'), **args) + +def SubtotalField(**args): + return Element(qname = (TABLENS,'subtotal-field'), **args) + +def SubtotalRule(**args): + return Element(qname = (TABLENS,'subtotal-rule'), **args) + +def SubtotalRules(**args): + return Element(qname = (TABLENS,'subtotal-rules'), **args) + +def Table(**args): + return Element(qname = (TABLENS,'table'), **args) + +def TableCell(**args): + return Element(qname = (TABLENS,'table-cell'), **args) + +def TableColumn(**args): + return Element(qname = (TABLENS,'table-column'), **args) + +def TableColumnGroup(**args): + return Element(qname = (TABLENS,'table-column-group'), **args) + +def TableColumns(**args): + return Element(qname = (TABLENS,'table-columns'), **args) + +def TableHeaderColumns(**args): + return Element(qname = (TABLENS,'table-header-columns'), **args) + +def TableHeaderRows(**args): + return Element(qname = (TABLENS,'table-header-rows'), **args) + +def TableRow(**args): + return Element(qname = (TABLENS,'table-row'), **args) + +def TableRowGroup(**args): + return Element(qname = (TABLENS,'table-row-group'), **args) + +def TableRows(**args): + return Element(qname = (TABLENS,'table-rows'), **args) + +def TableSource(**args): + return Element(qname = (TABLENS,'table-source'), **args) + +def TableTemplate(**args): + return Element(qname = (TABLENS,'table-template'), **args) + +def TargetRangeAddress(**args): + return Element(qname = (TABLENS,'target-range-address'), **args) + +def TrackedChanges(**args): + return Element(qname = (TABLENS,'tracked-changes'), **args) + diff --git a/tablib/packages/odf/teletype.py b/tablib/packages/odf/teletype.py new file mode 100644 index 0000000..53b58fd --- /dev/null +++ b/tablib/packages/odf/teletype.py @@ -0,0 +1,137 @@ +# -*- coding: utf-8 -*- +# +# Create and extract text from ODF, handling whitespace correctly. +# Copyright (C) 2008 J. David Eisenberg +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + +""" +Class for handling whitespace properly in OpenDocument. + +While it is possible to use getTextContent() and setTextContent() +to extract or create ODF content, these won't extract or create +the appropriate , , or +elements. This module takes care of that problem. +""" + +from odf.element import Node +import odf.opendocument +from odf.text import S,LineBreak,Tab + +class WhitespaceText(object): + + def __init__(self): + self.textBuffer = [] + self.spaceCount = 0 + + def addTextToElement(self, odfElement, s): + """ Process an input string, inserting + elements for '\t', + elements for '\n', and + elements for runs of more than one blank. + These will be added to the given element. + """ + i = 0 + ch = ' ' + + # When we encounter a tab or newline, we can immediately + # dump any accumulated text and then emit the appropriate + # ODF element. + # + # When we encounter a space, we add it to the text buffer, + # and then collect more spaces. If there are more spaces + # after the first one, we dump the text buffer and then + # then emit the appropriate element. + + while i < len(s): + ch = s[i] + if ch == '\t': + self._emitTextBuffer(odfElement) + odfElement.addElement(Tab()) + i += 1 + elif ch == '\n': + self._emitTextBuffer(odfElement); + odfElement.addElement(LineBreak()) + i += 1 + elif ch == ' ': + self.textBuffer.append(' ') + i += 1 + self.spaceCount = 0 + while i < len(s) and (s[i] == ' '): + self.spaceCount += 1 + i += 1 + if self.spaceCount > 0: + self._emitTextBuffer(odfElement) + self._emitSpaces(odfElement) + else: + self.textBuffer.append(ch) + i += 1 + + self._emitTextBuffer(odfElement) + + def _emitTextBuffer(self, odfElement): + """ Creates a Text Node whose contents are the current textBuffer. + Side effect: clears the text buffer. + """ + if len(self.textBuffer) > 0: + odfElement.addText(''.join(self.textBuffer)) + self.textBuffer = [] + + + def _emitSpaces(self, odfElement): + """ Creates a element for the current spaceCount. + Side effect: sets spaceCount back to zero + """ + if self.spaceCount > 0: + spaceElement = S(c=self.spaceCount) + odfElement.addElement(spaceElement) + self.spaceCount = 0 + +def addTextToElement(odfElement, s): + wst = WhitespaceText() + wst.addTextToElement(odfElement, s) + +def extractText(odfElement): + """ Extract text content from an Element, with whitespace represented + properly. Returns the text, with tabs, spaces, and newlines + correctly evaluated. This method recursively descends through the + children of the given element, accumulating text and "unwrapping" + , , and elements along the way. + """ + result = []; + + if len(odfElement.childNodes) != 0: + for child in odfElement.childNodes: + if child.nodeType == Node.TEXT_NODE: + result.append(child.data) + elif child.nodeType == Node.ELEMENT_NODE: + subElement = child + tagName = subElement.qname; + if tagName == (u"urn:oasis:names:tc:opendocument:xmlns:text:1.0", u"line-break"): + result.append("\n") + elif tagName == (u"urn:oasis:names:tc:opendocument:xmlns:text:1.0", u"tab"): + result.append("\t") + elif tagName == (u"urn:oasis:names:tc:opendocument:xmlns:text:1.0", u"s"): + c = subElement.getAttribute('c') + if c: + spaceCount = int(c) + else: + spaceCount = 1 + + result.append(" " * spaceCount) + else: + result.append(extractText(subElement)) + return ''.join(result) diff --git a/tablib/packages/odf/text.py b/tablib/packages/odf/text.py new file mode 100644 index 0000000..b55a3a4 --- /dev/null +++ b/tablib/packages/odf/text.py @@ -0,0 +1,562 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from namespaces import TEXTNS +from element import Element +from style import StyleElement + +# Autogenerated +def A(**args): + return Element(qname = (TEXTNS,'a'), **args) + +def AlphabeticalIndex(**args): + return Element(qname = (TEXTNS,'alphabetical-index'), **args) + +def AlphabeticalIndexAutoMarkFile(**args): + return Element(qname = (TEXTNS,'alphabetical-index-auto-mark-file'), **args) + +def AlphabeticalIndexEntryTemplate(**args): + return Element(qname = (TEXTNS,'alphabetical-index-entry-template'), **args) + +def AlphabeticalIndexMark(**args): + return Element(qname = (TEXTNS,'alphabetical-index-mark'), **args) + +def AlphabeticalIndexMarkEnd(**args): + return Element(qname = (TEXTNS,'alphabetical-index-mark-end'), **args) + +def AlphabeticalIndexMarkStart(**args): + return Element(qname = (TEXTNS,'alphabetical-index-mark-start'), **args) + +def AlphabeticalIndexSource(**args): + return Element(qname = (TEXTNS,'alphabetical-index-source'), **args) + +def AuthorInitials(**args): + return Element(qname = (TEXTNS,'author-initials'), **args) + +def AuthorName(**args): + return Element(qname = (TEXTNS,'author-name'), **args) + +def Bibliography(**args): + return Element(qname = (TEXTNS,'bibliography'), **args) + +def BibliographyConfiguration(**args): + return Element(qname = (TEXTNS,'bibliography-configuration'), **args) + +def BibliographyEntryTemplate(**args): + return Element(qname = (TEXTNS,'bibliography-entry-template'), **args) + +def BibliographyMark(**args): + return Element(qname = (TEXTNS,'bibliography-mark'), **args) + +def BibliographySource(**args): + return Element(qname = (TEXTNS,'bibliography-source'), **args) + +def Bookmark(**args): + return Element(qname = (TEXTNS,'bookmark'), **args) + +def BookmarkEnd(**args): + return Element(qname = (TEXTNS,'bookmark-end'), **args) + +def BookmarkRef(**args): + return Element(qname = (TEXTNS,'bookmark-ref'), **args) + +def BookmarkStart(**args): + return Element(qname = (TEXTNS,'bookmark-start'), **args) + +def Change(**args): + return Element(qname = (TEXTNS,'change'), **args) + +def ChangeEnd(**args): + return Element(qname = (TEXTNS,'change-end'), **args) + +def ChangeStart(**args): + return Element(qname = (TEXTNS,'change-start'), **args) + +def ChangedRegion(**args): + return Element(qname = (TEXTNS,'changed-region'), **args) + +def Chapter(**args): + return Element(qname = (TEXTNS,'chapter'), **args) + +def CharacterCount(**args): + return Element(qname = (TEXTNS,'character-count'), **args) + +def ConditionalText(**args): + return Element(qname = (TEXTNS,'conditional-text'), **args) + +def CreationDate(**args): + return Element(qname = (TEXTNS,'creation-date'), **args) + +def CreationTime(**args): + return Element(qname = (TEXTNS,'creation-time'), **args) + +def Creator(**args): + return Element(qname = (TEXTNS,'creator'), **args) + +def DatabaseDisplay(**args): + return Element(qname = (TEXTNS,'database-display'), **args) + +def DatabaseName(**args): + return Element(qname = (TEXTNS,'database-name'), **args) + +def DatabaseNext(**args): + return Element(qname = (TEXTNS,'database-next'), **args) + +def DatabaseRowNumber(**args): + return Element(qname = (TEXTNS,'database-row-number'), **args) + +def DatabaseRowSelect(**args): + return Element(qname = (TEXTNS,'database-row-select'), **args) + +def Date(**args): + return Element(qname = (TEXTNS,'date'), **args) + +def DdeConnection(**args): + return Element(qname = (TEXTNS,'dde-connection'), **args) + +def DdeConnectionDecl(**args): + return Element(qname = (TEXTNS,'dde-connection-decl'), **args) + +def DdeConnectionDecls(**args): + return Element(qname = (TEXTNS,'dde-connection-decls'), **args) + +def Deletion(**args): + return Element(qname = (TEXTNS,'deletion'), **args) + +def Description(**args): + return Element(qname = (TEXTNS,'description'), **args) + +def EditingCycles(**args): + return Element(qname = (TEXTNS,'editing-cycles'), **args) + +def EditingDuration(**args): + return Element(qname = (TEXTNS,'editing-duration'), **args) + +def ExecuteMacro(**args): + return Element(qname = (TEXTNS,'execute-macro'), **args) + +def Expression(**args): + return Element(qname = (TEXTNS,'expression'), **args) + +def FileName(**args): + return Element(qname = (TEXTNS,'file-name'), **args) + +def FormatChange(**args): + return Element(qname = (TEXTNS,'format-change'), **args) + +def H(**args): + return Element(qname = (TEXTNS, 'h'), **args) + +def HiddenParagraph(**args): + return Element(qname = (TEXTNS,'hidden-paragraph'), **args) + +def HiddenText(**args): + return Element(qname = (TEXTNS,'hidden-text'), **args) + +def IllustrationIndex(**args): + return Element(qname = (TEXTNS,'illustration-index'), **args) + +def IllustrationIndexEntryTemplate(**args): + return Element(qname = (TEXTNS,'illustration-index-entry-template'), **args) + +def IllustrationIndexSource(**args): + return Element(qname = (TEXTNS,'illustration-index-source'), **args) + +def ImageCount(**args): + return Element(qname = (TEXTNS,'image-count'), **args) + +def IndexBody(**args): + return Element(qname = (TEXTNS,'index-body'), **args) + +def IndexEntryBibliography(**args): + return Element(qname = (TEXTNS,'index-entry-bibliography'), **args) + +def IndexEntryChapter(**args): + return Element(qname = (TEXTNS,'index-entry-chapter'), **args) + +def IndexEntryLinkEnd(**args): + return Element(qname = (TEXTNS,'index-entry-link-end'), **args) + +def IndexEntryLinkStart(**args): + return Element(qname = (TEXTNS,'index-entry-link-start'), **args) + +def IndexEntryPageNumber(**args): + return Element(qname = (TEXTNS,'index-entry-page-number'), **args) + +def IndexEntrySpan(**args): + return Element(qname = (TEXTNS,'index-entry-span'), **args) + +def IndexEntryTabStop(**args): + return Element(qname = (TEXTNS,'index-entry-tab-stop'), **args) + +def IndexEntryText(**args): + return Element(qname = (TEXTNS,'index-entry-text'), **args) + +def IndexSourceStyle(**args): + return Element(qname = (TEXTNS,'index-source-style'), **args) + +def IndexSourceStyles(**args): + return Element(qname = (TEXTNS,'index-source-styles'), **args) + +def IndexTitle(**args): + return Element(qname = (TEXTNS,'index-title'), **args) + +def IndexTitleTemplate(**args): + return Element(qname = (TEXTNS,'index-title-template'), **args) + +def InitialCreator(**args): + return Element(qname = (TEXTNS,'initial-creator'), **args) + +def Insertion(**args): + return Element(qname = (TEXTNS,'insertion'), **args) + +def Keywords(**args): + return Element(qname = (TEXTNS,'keywords'), **args) + +def LineBreak(**args): + return Element(qname = (TEXTNS,'line-break'), **args) + +def LinenumberingConfiguration(**args): + return Element(qname = (TEXTNS,'linenumbering-configuration'), **args) + +def LinenumberingSeparator(**args): + return Element(qname = (TEXTNS,'linenumbering-separator'), **args) + +def List(**args): + return Element(qname = (TEXTNS,'list'), **args) + +def ListHeader(**args): + return Element(qname = (TEXTNS,'list-header'), **args) + +def ListItem(**args): + return Element(qname = (TEXTNS,'list-item'), **args) + +def ListLevelStyleBullet(**args): + return Element(qname = (TEXTNS,'list-level-style-bullet'), **args) + +def ListLevelStyleImage(**args): + return Element(qname = (TEXTNS,'list-level-style-image'), **args) + +def ListLevelStyleNumber(**args): + return Element(qname = (TEXTNS,'list-level-style-number'), **args) + +def ListStyle(**args): + return StyleElement(qname = (TEXTNS,'list-style'), **args) + +def Measure(**args): + return Element(qname = (TEXTNS,'measure'), **args) + +def ModificationDate(**args): + return Element(qname = (TEXTNS,'modification-date'), **args) + +def ModificationTime(**args): + return Element(qname = (TEXTNS,'modification-time'), **args) + +def Note(**args): + return Element(qname = (TEXTNS,'note'), **args) + +def NoteBody(**args): + return Element(qname = (TEXTNS,'note-body'), **args) + +def NoteCitation(**args): + return Element(qname = (TEXTNS,'note-citation'), **args) + +def NoteContinuationNoticeBackward(**args): + return Element(qname = (TEXTNS,'note-continuation-notice-backward'), **args) + +def NoteContinuationNoticeForward(**args): + return Element(qname = (TEXTNS,'note-continuation-notice-forward'), **args) + +def NoteRef(**args): + return Element(qname = (TEXTNS,'note-ref'), **args) + +def NotesConfiguration(**args): + return Element(qname = (TEXTNS,'notes-configuration'), **args) + +def Number(**args): + return Element(qname = (TEXTNS,'number'), **args) + +def NumberedParagraph(**args): + return Element(qname = (TEXTNS,'numbered-paragraph'), **args) + +def ObjectCount(**args): + return Element(qname = (TEXTNS,'object-count'), **args) + +def ObjectIndex(**args): + return Element(qname = (TEXTNS,'object-index'), **args) + +def ObjectIndexEntryTemplate(**args): + return Element(qname = (TEXTNS,'object-index-entry-template'), **args) + +def ObjectIndexSource(**args): + return Element(qname = (TEXTNS,'object-index-source'), **args) + +def OutlineLevelStyle(**args): + return Element(qname = (TEXTNS,'outline-level-style'), **args) + +def OutlineStyle(**args): + return Element(qname = (TEXTNS,'outline-style'), **args) + +def P(**args): + return Element(qname = (TEXTNS, 'p'), **args) + +def Page(**args): + return Element(qname = (TEXTNS,'page'), **args) + +def PageContinuation(**args): + return Element(qname = (TEXTNS,'page-continuation'), **args) + +def PageCount(**args): + return Element(qname = (TEXTNS,'page-count'), **args) + +def PageNumber(**args): + return Element(qname = (TEXTNS,'page-number'), **args) + +def PageSequence(**args): + return Element(qname = (TEXTNS,'page-sequence'), **args) + +def PageVariableGet(**args): + return Element(qname = (TEXTNS,'page-variable-get'), **args) + +def PageVariableSet(**args): + return Element(qname = (TEXTNS,'page-variable-set'), **args) + +def ParagraphCount(**args): + return Element(qname = (TEXTNS,'paragraph-count'), **args) + +def Placeholder(**args): + return Element(qname = (TEXTNS,'placeholder'), **args) + +def PrintDate(**args): + return Element(qname = (TEXTNS,'print-date'), **args) + +def PrintTime(**args): + return Element(qname = (TEXTNS,'print-time'), **args) + +def PrintedBy(**args): + return Element(qname = (TEXTNS,'printed-by'), **args) + +def ReferenceMark(**args): + return Element(qname = (TEXTNS,'reference-mark'), **args) + +def ReferenceMarkEnd(**args): + return Element(qname = (TEXTNS,'reference-mark-end'), **args) + +def ReferenceMarkStart(**args): + return Element(qname = (TEXTNS,'reference-mark-start'), **args) + +def ReferenceRef(**args): + return Element(qname = (TEXTNS,'reference-ref'), **args) + +def Ruby(**args): + return Element(qname = (TEXTNS,'ruby'), **args) + +def RubyBase(**args): + return Element(qname = (TEXTNS,'ruby-base'), **args) + +def RubyText(**args): + return Element(qname = (TEXTNS,'ruby-text'), **args) + +def S(**args): + return Element(qname = (TEXTNS,'s'), **args) + +def Script(**args): + return Element(qname = (TEXTNS,'script'), **args) + +def Section(**args): + return Element(qname = (TEXTNS,'section'), **args) + +def SectionSource(**args): + return Element(qname = (TEXTNS,'section-source'), **args) + +def SenderCity(**args): + return Element(qname = (TEXTNS,'sender-city'), **args) + +def SenderCompany(**args): + return Element(qname = (TEXTNS,'sender-company'), **args) + +def SenderCountry(**args): + return Element(qname = (TEXTNS,'sender-country'), **args) + +def SenderEmail(**args): + return Element(qname = (TEXTNS,'sender-email'), **args) + +def SenderFax(**args): + return Element(qname = (TEXTNS,'sender-fax'), **args) + +def SenderFirstname(**args): + return Element(qname = (TEXTNS,'sender-firstname'), **args) + +def SenderInitials(**args): + return Element(qname = (TEXTNS,'sender-initials'), **args) + +def SenderLastname(**args): + return Element(qname = (TEXTNS,'sender-lastname'), **args) + +def SenderPhonePrivate(**args): + return Element(qname = (TEXTNS,'sender-phone-private'), **args) + +def SenderPhoneWork(**args): + return Element(qname = (TEXTNS,'sender-phone-work'), **args) + +def SenderPosition(**args): + return Element(qname = (TEXTNS,'sender-position'), **args) + +def SenderPostalCode(**args): + return Element(qname = (TEXTNS,'sender-postal-code'), **args) + +def SenderStateOrProvince(**args): + return Element(qname = (TEXTNS,'sender-state-or-province'), **args) + +def SenderStreet(**args): + return Element(qname = (TEXTNS,'sender-street'), **args) + +def SenderTitle(**args): + return Element(qname = (TEXTNS,'sender-title'), **args) + +def Sequence(**args): + return Element(qname = (TEXTNS,'sequence'), **args) + +def SequenceDecl(**args): + return Element(qname = (TEXTNS,'sequence-decl'), **args) + +def SequenceDecls(**args): + return Element(qname = (TEXTNS,'sequence-decls'), **args) + +def SequenceRef(**args): + return Element(qname = (TEXTNS,'sequence-ref'), **args) + +def SheetName(**args): + return Element(qname = (TEXTNS,'sheet-name'), **args) + +def SoftPageBreak(**args): + return Element(qname = (TEXTNS,'soft-page-break'), **args) + +def SortKey(**args): + return Element(qname = (TEXTNS,'sort-key'), **args) + +def Span(**args): + return Element(qname = (TEXTNS,'span'), **args) + +def Subject(**args): + return Element(qname = (TEXTNS,'subject'), **args) + +def Tab(**args): + return Element(qname = (TEXTNS,'tab'), **args) + +def TableCount(**args): + return Element(qname = (TEXTNS,'table-count'), **args) + +def TableFormula(**args): + return Element(qname = (TEXTNS,'table-formula'), **args) + +def TableIndex(**args): + return Element(qname = (TEXTNS,'table-index'), **args) + +def TableIndexEntryTemplate(**args): + return Element(qname = (TEXTNS,'table-index-entry-template'), **args) + +def TableIndexSource(**args): + return Element(qname = (TEXTNS,'table-index-source'), **args) + +def TableOfContent(**args): + return Element(qname = (TEXTNS,'table-of-content'), **args) + +def TableOfContentEntryTemplate(**args): + return Element(qname = (TEXTNS,'table-of-content-entry-template'), **args) + +def TableOfContentSource(**args): + return Element(qname = (TEXTNS,'table-of-content-source'), **args) + +def TemplateName(**args): + return Element(qname = (TEXTNS,'template-name'), **args) + +def TextInput(**args): + return Element(qname = (TEXTNS,'text-input'), **args) + +def Time(**args): + return Element(qname = (TEXTNS,'time'), **args) + +def Title(**args): + return Element(qname = (TEXTNS,'title'), **args) + +def TocMark(**args): + return Element(qname = (TEXTNS,'toc-mark'), **args) + +def TocMarkEnd(**args): + return Element(qname = (TEXTNS,'toc-mark-end'), **args) + +def TocMarkStart(**args): + return Element(qname = (TEXTNS,'toc-mark-start'), **args) + +def TrackedChanges(**args): + return Element(qname = (TEXTNS,'tracked-changes'), **args) + +def UserDefined(**args): + return Element(qname = (TEXTNS,'user-defined'), **args) + +def UserFieldDecl(**args): + return Element(qname = (TEXTNS,'user-field-decl'), **args) + +def UserFieldDecls(**args): + return Element(qname = (TEXTNS,'user-field-decls'), **args) + +def UserFieldGet(**args): + return Element(qname = (TEXTNS,'user-field-get'), **args) + +def UserFieldInput(**args): + return Element(qname = (TEXTNS,'user-field-input'), **args) + +def UserIndex(**args): + return Element(qname = (TEXTNS,'user-index'), **args) + +def UserIndexEntryTemplate(**args): + return Element(qname = (TEXTNS,'user-index-entry-template'), **args) + +def UserIndexMark(**args): + return Element(qname = (TEXTNS,'user-index-mark'), **args) + +def UserIndexMarkEnd(**args): + return Element(qname = (TEXTNS,'user-index-mark-end'), **args) + +def UserIndexMarkStart(**args): + return Element(qname = (TEXTNS,'user-index-mark-start'), **args) + +def UserIndexSource(**args): + return Element(qname = (TEXTNS,'user-index-source'), **args) + +def VariableDecl(**args): + return Element(qname = (TEXTNS,'variable-decl'), **args) + +def VariableDecls(**args): + return Element(qname = (TEXTNS,'variable-decls'), **args) + +def VariableGet(**args): + return Element(qname = (TEXTNS,'variable-get'), **args) + +def VariableInput(**args): + return Element(qname = (TEXTNS,'variable-input'), **args) + +def VariableSet(**args): + return Element(qname = (TEXTNS,'variable-set'), **args) + +def WordCount(**args): + return Element(qname = (TEXTNS,'word-count'), **args) + diff --git a/tablib/packages/odf/thumbnail.py b/tablib/packages/odf/thumbnail.py new file mode 100644 index 0000000..d6388cc --- /dev/null +++ b/tablib/packages/odf/thumbnail.py @@ -0,0 +1,427 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# This contains a 128x128 px thumbnail in PNG format +# Taken from http://www.zwahlendesign.ch/en/node/20 +# openoffice_icons/openoffice_icons_linux/openoffice11.png +# License: Freeware +import base64 + +iconstr = """\ +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 +N38FAAAAAElFTkSuQmCC\ +""" + +def thumbnail(): + icon = base64.decodestring(iconstr) + return icon + +if __name__ == "__main__": + icon = thumbnail() + f = file("thumbnail.png","wb") + f.write(icon) + f.close() diff --git a/tablib/packages/odf/userfield.py b/tablib/packages/odf/userfield.py new file mode 100644 index 0000000..196bae1 --- /dev/null +++ b/tablib/packages/odf/userfield.py @@ -0,0 +1,169 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2009 Søren Roug, European Environment Agency +# +# This is free software. You may redistribute it under the terms +# of the Apache license and the GNU General Public License Version +# 2 or at your option any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): Michael Howitz, gocept gmbh & co. kg +# +# $Id: userfield.py 447 2008-07-10 20:01:30Z roug $ + +"""Class to show and manipulate user fields in odf documents.""" + +import sys +import zipfile + +from odf.text import UserFieldDecl +from odf.namespaces import OFFICENS +from odf.opendocument import load + +OUTENCODING = "utf-8" + + +# OpenDocument v.1.0 section 6.7.1 +VALUE_TYPES = { + 'float': (OFFICENS, u'value'), + 'percentage': (OFFICENS, u'value'), + 'currency': (OFFICENS, u'value'), + 'date': (OFFICENS, u'date-value'), + 'time': (OFFICENS, u'time-value'), + 'boolean': (OFFICENS, u'boolean-value'), + 'string': (OFFICENS, u'string-value'), + } + + +class UserFields(object): + """List, view and manipulate user fields.""" + + # these attributes can be a filename or a file like object + src_file = None + dest_file = None + + def __init__(self, src=None, dest=None): + """Constructor + + src ... source document name, file like object or None for stdin + dest ... destination document name, file like object or None for stdout + + """ + self.src_file = src + self.dest_file = dest + self.document = None + + def loaddoc(self): + if isinstance(self.src_file, basestring): + # src_file is a filename, check if it is a zip-file + if not zipfile.is_zipfile(self.src_file): + raise TypeError("%s is no odt file." % self.src_file) + elif self.src_file is None: + # use stdin if no file given + self.src_file = sys.stdin + + self.document = load(self.src_file) + + def savedoc(self): + # write output + if self.dest_file is None: + # use stdout if no filename given + self.document.save('-') + else: + self.document.save(self.dest_file) + + def list_fields(self): + """List (extract) all known user-fields. + + Returns list of user-field names. + + """ + return [x[0] for x in self.list_fields_and_values()] + + def list_fields_and_values(self, field_names=None): + """List (extract) user-fields with type and value. + + field_names ... list of field names to show or None for all. + + Returns list of tuples (, , ). + + """ + self.loaddoc() + found_fields = [] + all_fields = self.document.getElementsByType(UserFieldDecl) + for f in all_fields: + value_type = f.getAttribute('valuetype') + if value_type == 'string': + value = f.getAttribute('stringvalue') + else: + value = f.getAttribute('value') + field_name = f.getAttribute('name') + + if field_names is None or field_name in field_names: + found_fields.append((field_name.encode(OUTENCODING), + value_type.encode(OUTENCODING), + value.encode(OUTENCODING))) + return found_fields + + def list_values(self, field_names): + """Extract the contents of given field names from the file. + + field_names ... list of field names + + Returns list of field values. + + """ + return [x[2] for x in self.list_fields_and_values(field_names)] + + def get(self, field_name): + """Extract the contents of this field from the file. + + Returns field value or None if field does not exist. + + """ + values = self.list_values([field_name]) + if not values: + return None + return values[0] + + def get_type_and_value(self, field_name): + """Extract the type and contents of this field from the file. + + Returns tuple (, ) or None if field does not exist. + + """ + fields = self.list_fields_and_values([field_name]) + if not fields: + return None + field_name, value_type, value = fields[0] + return value_type, value + + def update(self, data): + """Set the value of user fields. The field types will be the same. + + data ... dict, with field name as key, field value as value + + Returns None + + """ + self.loaddoc() + all_fields = self.document.getElementsByType(UserFieldDecl) + for f in all_fields: + field_name = f.getAttribute('name') + if data.has_key(field_name): + value_type = f.getAttribute('valuetype') + value = data.get(field_name) + if value_type == 'string': + f.setAttribute('stringvalue', value) + else: + f.setAttribute('value', value) + self.savedoc() + diff --git a/tablib/packages/odf/xforms.py b/tablib/packages/odf/xforms.py new file mode 100644 index 0000000..f28b96e --- /dev/null +++ b/tablib/packages/odf/xforms.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from namespaces import XFORMSNS +from element import Element + +# ODF 1.0 section 11.2 +# XForms is designed to be embedded in another XML format. +# Autogenerated +def Model(**args): + return Element(qname = (XFORMSNS,'model'), **args) + +def Instance(**args): + return Element(qname = (XFORMSNS,'instance'), **args) + +def Bind(**args): + return Element(qname = (XFORMSNS,'bind'), **args) From 9a05770899a5864e72727830da71a23b7203d050 Mon Sep 17 00:00:00 2001 From: Mark Rogers Date: Sat, 14 May 2011 14:52:16 -0500 Subject: [PATCH 11/32] proof of concept works. Onto styling and tidying --- tablib/core.py | 12 ++++ tablib/formats/__init__.py | 3 +- tablib/formats/_odf.py | 118 +++++++++++++++++++++++++++++++++++++ 3 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 tablib/formats/_odf.py diff --git a/tablib/core.py b/tablib/core.py index 03547ff..e8e17ce 100644 --- a/tablib/core.py +++ b/tablib/core.py @@ -401,6 +401,18 @@ class Dataset(object): """ pass + @property + def odf(): + """An Excel Spreadsheet representation of the :class:`Dataset` object, with :ref:`separators`. Cannot be set. + + .. admonition:: Binary Warning + + :class:`Dataset.xlsx` contains binary data, so make sure to write in binary mode:: + + with open('output.xlsx', 'wb') as f: + f.write(data.xlsx)' + """ + pass @property def csv(): diff --git a/tablib/formats/__init__.py b/tablib/formats/__init__.py index 306ca30..58199a3 100644 --- a/tablib/formats/__init__.py +++ b/tablib/formats/__init__.py @@ -10,5 +10,6 @@ from . import _yaml as yaml from . import _tsv as tsv from . import _html as html from . import _xlsx as xlsx +from . import _odf as odf -available = (json, xls, yaml, csv, tsv, html, xlsx) +available = (json, xls, yaml, csv, tsv, html, xlsx, odf) diff --git a/tablib/formats/_odf.py b/tablib/formats/_odf.py new file mode 100644 index 0000000..4dafab4 --- /dev/null +++ b/tablib/formats/_odf.py @@ -0,0 +1,118 @@ +# -*- coding: utf-8 -*- + +""" Tablib - ODF Support. +""" + +import sys + + +if sys.version_info[0] > 2: + from io import BytesIO +else: + from cStringIO import StringIO as BytesIO + +from tablib.compat import openpyxl + +from odf.opendocument import OpenDocumentSpreadsheet +from odf.style import Style, TextProperties, TableColumnProperties, Map +from odf.number import NumberStyle, CurrencyStyle, CurrencySymbol, Number, Text +from odf.text import P +from odf.table import Table, TableColumn, TableRow, TableCell + +from tablib.compat import unicode + +title = 'odf' +extentions = ('odf',) + +def export_set(dataset): + """Returns ODF representation of Dataset.""" + + wb = OpenDocumentSpreadsheet() + ws = Table(name=dataset.title if dataset.title else 'Tablib Dataset') + wb.spreadsheet.addElement(ws) + dset_sheet(dataset, ws) + + stream = BytesIO() + wb.save(stream) + return stream.getvalue() + + +def export_book(databook): + """Returns ODF representation of DataBook.""" + + wb = OpenDocumentSpreadsheet() + for i, dset in enumerate(databook._datasets): + ws = Table(name=dset.title if dset.title else 'Sheet%s' % (i)) + wb.spreadsheet.addElement(ws) + dset_sheet(dset, ws) + + + stream = BytesIO() + wb.save(stream) + return stream.getvalue() + + +def dset_sheet(dataset, ws): + """Completes given worksheet from given Dataset.""" + _package = dataset._package(dicts=False) + + for i, sep in enumerate(dataset._separators): + _offset = i + _package.insert((sep[0] + _offset), (sep[1],)) + + for i, row in enumerate(_package): + row_number = i + 1 + odf_row = TableRow() + for j, col in enumerate(row): + ws.addElement(TableColumn()) + #col_idx = get_column_letter(j + 1) + + # bold headers + if (row_number == 1) and dataset.headers: + ws.addElement(odf_row) + cell = TableCell() + cell.addElement(P(text=col)) + odf_row.addElement(cell) + #style = ws.get_style('%s%s' % (col_idx, row_number)) + #style.font.bold = True + #ws.freeze_panes = '%s%s' % (col_idx, row_number) + + + # bold separators + elif len(row) < dataset.width: + ws.addElement(odf_row) + cell = TableCell() + cell.addElement(P(text=col)) + odf_row.addElement(cell) + #ws.cell('%s%s'%(col_idx, row_number)).value = unicode( + # '%s' % col, errors='ignore') + #style = ws.get_style('%s%s' % (col_idx, row_number)) + #style.font.bold = True + + # wrap the rest + else: + try: + if '\n' in col: + ws.addElement(odf_row) + cell = TableCell() + cell.addElement(P(text=col)) + odf_row.addElement(cell) + #ws.cell('%s%s'%(col_idx, row_number)).value = unicode( + # '%s' % col, errors='ignore') + #style = ws.get_style('%s%s' % (col_idx, row_number)) + #style.alignment.wrap_text + else: + ws.addElement(odf_row) + cell = TableCell() + cell.addElement(P(text=col)) + odf_row.addElement(cell) + #ws.cell('%s%s'%(col_idx, row_number)).value = unicode( + # '%s' % col, errors='ignore') + except TypeError: + ws.addElement(odf_row) + cell = TableCell() + cell.addElement(P(text=col)) + odf_row.addElement(cell) + #ws.cell('%s%s'%(col_idx, row_number)).value = unicode(col) + + From 420dd36ab8c4fa7a3f75b8da80ffc2effdf0029e Mon Sep 17 00:00:00 2001 From: Mark Rogers Date: Sat, 14 May 2011 16:13:17 -0500 Subject: [PATCH 12/32] Tidied up a bit, renamed _odf to _ods like it should have been. Bold not working yet :( --- tablib/core.py | 2 +- tablib/formats/__init__.py | 4 +-- tablib/formats/{_odf.py => _ods.py} | 52 ++++++++++++----------------- test_tablib.py | 2 ++ 4 files changed, 26 insertions(+), 34 deletions(-) rename tablib/formats/{_odf.py => _ods.py} (59%) diff --git a/tablib/core.py b/tablib/core.py index e8e17ce..678e515 100644 --- a/tablib/core.py +++ b/tablib/core.py @@ -402,7 +402,7 @@ class Dataset(object): pass @property - def odf(): + def ods(): """An Excel Spreadsheet representation of the :class:`Dataset` object, with :ref:`separators`. Cannot be set. .. admonition:: Binary Warning diff --git a/tablib/formats/__init__.py b/tablib/formats/__init__.py index 58199a3..5fdf279 100644 --- a/tablib/formats/__init__.py +++ b/tablib/formats/__init__.py @@ -10,6 +10,6 @@ from . import _yaml as yaml from . import _tsv as tsv from . import _html as html from . import _xlsx as xlsx -from . import _odf as odf +from . import _ods as ods -available = (json, xls, yaml, csv, tsv, html, xlsx, odf) +available = (json, xls, yaml, csv, tsv, html, xlsx, ods) diff --git a/tablib/formats/_odf.py b/tablib/formats/_ods.py similarity index 59% rename from tablib/formats/_odf.py rename to tablib/formats/_ods.py index 4dafab4..d4520c7 100644 --- a/tablib/formats/_odf.py +++ b/tablib/formats/_ods.py @@ -11,23 +11,26 @@ if sys.version_info[0] > 2: else: from cStringIO import StringIO as BytesIO -from tablib.compat import openpyxl - -from odf.opendocument import OpenDocumentSpreadsheet -from odf.style import Style, TextProperties, TableColumnProperties, Map -from odf.number import NumberStyle, CurrencyStyle, CurrencySymbol, Number, Text -from odf.text import P -from odf.table import Table, TableColumn, TableRow, TableCell +from tablib.packages.odf.opendocument import OpenDocumentSpreadsheet +from tablib.packages.odf.style import Style, TextProperties, TableColumnProperties, Map +from tablib.packages.odf.number import NumberStyle, CurrencyStyle, CurrencySymbol, Number, Text +from tablib.packages.odf.text import P +from tablib.packages.odf.table import Table, TableColumn, TableRow, TableCell from tablib.compat import unicode -title = 'odf' -extentions = ('odf',) +title = 'ods' +extentions = ('ods',) + +bold = Style(name='Bold', family="text") +bold.addElement(TextProperties(fontweight="bold")) def export_set(dataset): """Returns ODF representation of Dataset.""" wb = OpenDocumentSpreadsheet() + wb.automaticstyles.addElement(bold) + ws = Table(name=dataset.title if dataset.title else 'Tablib Dataset') wb.spreadsheet.addElement(ws) dset_sheet(dataset, ws) @@ -41,6 +44,8 @@ def export_book(databook): """Returns ODF representation of DataBook.""" wb = OpenDocumentSpreadsheet() + wb.automaticstyles.addElement(bold) + for i, dset in enumerate(databook._datasets): ws = Table(name=dset.title if dset.title else 'Sheet%s' % (i)) wb.spreadsheet.addElement(ws) @@ -62,32 +67,24 @@ def dset_sheet(dataset, ws): for i, row in enumerate(_package): row_number = i + 1 - odf_row = TableRow() + odf_row = TableRow(stylename=bold) for j, col in enumerate(row): ws.addElement(TableColumn()) - #col_idx = get_column_letter(j + 1) # bold headers if (row_number == 1) and dataset.headers: + odf_row.setAttribute('stylename', bold) ws.addElement(odf_row) cell = TableCell() - cell.addElement(P(text=col)) + cell.addElement(P(stylename="Bold", text=unicode(col, errors='ignore'))) odf_row.addElement(cell) - #style = ws.get_style('%s%s' % (col_idx, row_number)) - #style.font.bold = True - #ws.freeze_panes = '%s%s' % (col_idx, row_number) - # bold separators elif len(row) < dataset.width: ws.addElement(odf_row) cell = TableCell() - cell.addElement(P(text=col)) + cell.addElement(P(text=unicode(col, errors='ignore'))) odf_row.addElement(cell) - #ws.cell('%s%s'%(col_idx, row_number)).value = unicode( - # '%s' % col, errors='ignore') - #style = ws.get_style('%s%s' % (col_idx, row_number)) - #style.font.bold = True # wrap the rest else: @@ -95,24 +92,17 @@ def dset_sheet(dataset, ws): if '\n' in col: ws.addElement(odf_row) cell = TableCell() - cell.addElement(P(text=col)) + cell.addElement(P(text=unicode(col, errors='ignore'))) odf_row.addElement(cell) - #ws.cell('%s%s'%(col_idx, row_number)).value = unicode( - # '%s' % col, errors='ignore') - #style = ws.get_style('%s%s' % (col_idx, row_number)) - #style.alignment.wrap_text else: ws.addElement(odf_row) cell = TableCell() - cell.addElement(P(text=col)) + cell.addElement(P(text=unicode(col, errors='ignore'))) odf_row.addElement(cell) - #ws.cell('%s%s'%(col_idx, row_number)).value = unicode( - # '%s' % col, errors='ignore') except TypeError: ws.addElement(odf_row) cell = TableCell() - cell.addElement(P(text=col)) + cell.addElement(P(text=unicode(col, errors='ignore'))) odf_row.addElement(cell) - #ws.cell('%s%s'%(col_idx, row_number)).value = unicode(col) diff --git a/test_tablib.py b/test_tablib.py index 474323a..5715eb0 100755 --- a/test_tablib.py +++ b/test_tablib.py @@ -223,6 +223,7 @@ class TablibTestCase(unittest.TestCase): data.tsv data.xls data.xlsx + data.ods data.html @@ -236,6 +237,7 @@ class TablibTestCase(unittest.TestCase): book.yaml book.xls book.xlsx + book.ods def test_json_import_set(self): From 1e21fee70ebbafab5a51e7c3a1ec77dae417802c Mon Sep 17 00:00:00 2001 From: Mark Rogers Date: Sat, 14 May 2011 16:44:23 -0500 Subject: [PATCH 13/32] start of the py3k port of odfpy --- tablib/compat.py | 2 + tablib/formats/_ods.py | 44 +- tablib/packages/odf3/__init__.py | 0 tablib/packages/odf3/anim.py | 61 + tablib/packages/odf3/attrconverters.py | 1484 +++++ tablib/packages/odf3/chart.py | 87 + tablib/packages/odf3/config.py | 39 + tablib/packages/odf3/dc.py | 72 + tablib/packages/odf3/dr3d.py | 43 + tablib/packages/odf3/draw.py | 182 + tablib/packages/odf3/easyliststyle.py | 103 + tablib/packages/odf3/element.py | 513 ++ tablib/packages/odf3/elementtypes.py | 325 + tablib/packages/odf3/form.py | 115 + tablib/packages/odf3/grammar.py | 8426 ++++++++++++++++++++++++ tablib/packages/odf3/load.py | 112 + tablib/packages/odf3/manifest.py | 41 + tablib/packages/odf3/math.py | 30 + tablib/packages/odf3/meta.py | 66 + tablib/packages/odf3/namespaces.py | 97 + tablib/packages/odf3/number.py | 104 + tablib/packages/odf3/odf2moinmoin.py | 579 ++ tablib/packages/odf3/odf2xhtml.py | 1582 +++++ tablib/packages/odf3/odfmanifest.py | 115 + tablib/packages/odf3/office.py | 104 + tablib/packages/odf3/opendocument.py | 654 ++ tablib/packages/odf3/presentation.py | 85 + tablib/packages/odf3/script.py | 30 + tablib/packages/odf3/style.py | 148 + tablib/packages/odf3/svg.py | 54 + tablib/packages/odf3/table.py | 307 + tablib/packages/odf3/teletype.py | 137 + tablib/packages/odf3/text.py | 562 ++ tablib/packages/odf3/thumbnail.py | 427 ++ tablib/packages/odf3/userfield.py | 169 + tablib/packages/odf3/xforms.py | 34 + 36 files changed, 16908 insertions(+), 25 deletions(-) create mode 100644 tablib/packages/odf3/__init__.py create mode 100644 tablib/packages/odf3/anim.py create mode 100644 tablib/packages/odf3/attrconverters.py create mode 100644 tablib/packages/odf3/chart.py create mode 100644 tablib/packages/odf3/config.py create mode 100644 tablib/packages/odf3/dc.py create mode 100644 tablib/packages/odf3/dr3d.py create mode 100644 tablib/packages/odf3/draw.py create mode 100644 tablib/packages/odf3/easyliststyle.py create mode 100644 tablib/packages/odf3/element.py create mode 100644 tablib/packages/odf3/elementtypes.py create mode 100644 tablib/packages/odf3/form.py create mode 100644 tablib/packages/odf3/grammar.py create mode 100644 tablib/packages/odf3/load.py create mode 100644 tablib/packages/odf3/manifest.py create mode 100644 tablib/packages/odf3/math.py create mode 100644 tablib/packages/odf3/meta.py create mode 100644 tablib/packages/odf3/namespaces.py create mode 100644 tablib/packages/odf3/number.py create mode 100644 tablib/packages/odf3/odf2moinmoin.py create mode 100644 tablib/packages/odf3/odf2xhtml.py create mode 100644 tablib/packages/odf3/odfmanifest.py create mode 100644 tablib/packages/odf3/office.py create mode 100644 tablib/packages/odf3/opendocument.py create mode 100644 tablib/packages/odf3/presentation.py create mode 100644 tablib/packages/odf3/script.py create mode 100644 tablib/packages/odf3/style.py create mode 100644 tablib/packages/odf3/svg.py create mode 100644 tablib/packages/odf3/table.py create mode 100644 tablib/packages/odf3/teletype.py create mode 100644 tablib/packages/odf3/text.py create mode 100644 tablib/packages/odf3/thumbnail.py create mode 100644 tablib/packages/odf3/userfield.py create mode 100644 tablib/packages/odf3/xforms.py diff --git a/tablib/compat.py b/tablib/compat.py index 48e0081..77a4656 100644 --- a/tablib/compat.py +++ b/tablib/compat.py @@ -25,6 +25,7 @@ if is_py3: import tablib.packages.xlwt3 as xlwt from tablib.packages import markup3 as markup from tablib.packages import openpyxl3 as openpyxl + from tablib.packages.odf3 import opendocument, style, text, table # py3 mappings ifilter = filter @@ -39,6 +40,7 @@ else: from tablib.packages import markup from itertools import ifilter from tablib.packages import openpyxl + from tablib.packages.odf import opendocument, style, text, table # py2 mappings xrange = xrange diff --git a/tablib/formats/_ods.py b/tablib/formats/_ods.py index d4520c7..f1b0dfa 100644 --- a/tablib/formats/_ods.py +++ b/tablib/formats/_ods.py @@ -11,27 +11,21 @@ if sys.version_info[0] > 2: else: from cStringIO import StringIO as BytesIO -from tablib.packages.odf.opendocument import OpenDocumentSpreadsheet -from tablib.packages.odf.style import Style, TextProperties, TableColumnProperties, Map -from tablib.packages.odf.number import NumberStyle, CurrencyStyle, CurrencySymbol, Number, Text -from tablib.packages.odf.text import P -from tablib.packages.odf.table import Table, TableColumn, TableRow, TableCell - -from tablib.compat import unicode +from tablib.compat import opendocument, style, table, text, unicode title = 'ods' extentions = ('ods',) -bold = Style(name='Bold', family="text") -bold.addElement(TextProperties(fontweight="bold")) +bold = style.Style(name='Bold', family="text") +bold.addElement(style.TextProperties(fontweight="bold")) def export_set(dataset): """Returns ODF representation of Dataset.""" - wb = OpenDocumentSpreadsheet() + wb = opendocument.OpenDocumentSpreadsheet() wb.automaticstyles.addElement(bold) - ws = Table(name=dataset.title if dataset.title else 'Tablib Dataset') + ws = table.Table(name=dataset.title if dataset.title else 'Tablib Dataset') wb.spreadsheet.addElement(ws) dset_sheet(dataset, ws) @@ -43,11 +37,11 @@ def export_set(dataset): def export_book(databook): """Returns ODF representation of DataBook.""" - wb = OpenDocumentSpreadsheet() + wb = opendocument.OpenDocumentSpreadsheet() wb.automaticstyles.addElement(bold) for i, dset in enumerate(databook._datasets): - ws = Table(name=dset.title if dset.title else 'Sheet%s' % (i)) + ws = table.Table(name=dset.title if dset.title else 'Sheet%s' % (i)) wb.spreadsheet.addElement(ws) dset_sheet(dset, ws) @@ -67,23 +61,23 @@ def dset_sheet(dataset, ws): for i, row in enumerate(_package): row_number = i + 1 - odf_row = TableRow(stylename=bold) + odf_row = table.TableRow(stylename=bold) for j, col in enumerate(row): - ws.addElement(TableColumn()) + ws.addElement(table.TableColumn()) # bold headers if (row_number == 1) and dataset.headers: odf_row.setAttribute('stylename', bold) ws.addElement(odf_row) - cell = TableCell() - cell.addElement(P(stylename="Bold", text=unicode(col, errors='ignore'))) + cell = table.TableCell() + cell.addElement(text.P(stylename="Bold", text=unicode(col, errors='ignore'))) odf_row.addElement(cell) # bold separators elif len(row) < dataset.width: ws.addElement(odf_row) - cell = TableCell() - cell.addElement(P(text=unicode(col, errors='ignore'))) + cell = table.TableCell() + cell.addElement(text.P(text=unicode(col, errors='ignore'))) odf_row.addElement(cell) # wrap the rest @@ -91,18 +85,18 @@ def dset_sheet(dataset, ws): try: if '\n' in col: ws.addElement(odf_row) - cell = TableCell() - cell.addElement(P(text=unicode(col, errors='ignore'))) + cell = table.TableCell() + cell.addElement(text.P(text=unicode(col, errors='ignore'))) odf_row.addElement(cell) else: ws.addElement(odf_row) - cell = TableCell() - cell.addElement(P(text=unicode(col, errors='ignore'))) + cell = table.TableCell() + cell.addElement(text.P(text=unicode(col, errors='ignore'))) odf_row.addElement(cell) except TypeError: ws.addElement(odf_row) - cell = TableCell() - cell.addElement(P(text=unicode(col, errors='ignore'))) + cell = table.TableCell() + cell.addElement(text.P(text=unicode(col, errors='ignore'))) odf_row.addElement(cell) diff --git a/tablib/packages/odf3/__init__.py b/tablib/packages/odf3/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tablib/packages/odf3/anim.py b/tablib/packages/odf3/anim.py new file mode 100644 index 0000000..21a7852 --- /dev/null +++ b/tablib/packages/odf3/anim.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from .namespaces import ANIMNS +from .element import Element + + +# Autogenerated +def Animate(**args): + return Element(qname = (ANIMNS,'animate'), **args) + +def Animatecolor(**args): + return Element(qname = (ANIMNS,'animateColor'), **args) + +def Animatemotion(**args): + return Element(qname = (ANIMNS,'animateMotion'), **args) + +def Animatetransform(**args): + return Element(qname = (ANIMNS,'animateTransform'), **args) + +def Audio(**args): + return Element(qname = (ANIMNS,'audio'), **args) + +def Command(**args): + return Element(qname = (ANIMNS,'command'), **args) + +def Iterate(**args): + return Element(qname = (ANIMNS,'iterate'), **args) + +def Par(**args): + return Element(qname = (ANIMNS,'par'), **args) + +def Param(**args): + return Element(qname = (ANIMNS,'param'), **args) + +def Seq(**args): + return Element(qname = (ANIMNS,'seq'), **args) + +def Set(**args): + return Element(qname = (ANIMNS,'set'), **args) + +def Transitionfilter(**args): + return Element(qname = (ANIMNS,'transitionFilter'), **args) + diff --git a/tablib/packages/odf3/attrconverters.py b/tablib/packages/odf3/attrconverters.py new file mode 100644 index 0000000..6af6ec1 --- /dev/null +++ b/tablib/packages/odf3/attrconverters.py @@ -0,0 +1,1484 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2010 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# +from .namespaces import * +import re, types + +pattern_color = re.compile(r'#[0-9a-fA-F]{6}') +pattern_vector3D = re.compile(r'\([ ]*-?([0-9]+(\.[0-9]*)?|\.[0-9]+)([ ]+-?([0-9]+(\.[0-9]*)?|\.[0-9]+)){2}[ ]*\)') + +def make_NCName(arg): + for c in (':',' '): + arg = arg.replace(c,"_%x_" % ord(c)) + return arg + +def cnv_anyURI(attribute, arg, element): + return str(arg) + +def cnv_boolean(attribute, arg, element): + if arg.lower() in ("false","no"): + return "false" + if arg: + return "true" + return "false" + +# Potentially accept color values +def cnv_color(attribute, arg, element): + """ A RGB color in conformance with §5.9.11 of [XSL], that is a RGB color in notation “#rrggbb”, where + rr, gg and bb are 8-bit hexadecimal digits. + """ + return str(arg) + +def cnv_configtype(attribute, arg, element): + if str(arg) not in ("boolean", "short", "int", "long", + "double", "string", "datetime", "base64Binary"): + raise ValueError("'%s' not allowed" % str(arg)) + return str(arg) + +def cnv_data_source_has_labels(attribute, arg, element): + if str(arg) not in ("none","row","column","both"): + raise ValueError("'%s' not allowed" % str(arg)) + return str(arg) + +# Understand different date formats +def cnv_date(attribute, arg, element): + """ A dateOrDateTime value is either an [xmlschema-2] date value or an [xmlschema-2] dateTime + value. + """ + return str(arg) + +def cnv_dateTime(attribute, arg, element): + """ A dateOrDateTime value is either an [xmlschema-2] date value or an [xmlschema-2] dateTime + value. + """ + return str(arg) + +def cnv_double(attribute, arg, element): + return str(arg) + +def cnv_duration(attribute, arg, element): + return str(arg) + +def cnv_family(attribute, arg, element): + """ A style family """ + if str(arg) not in ("text", "paragraph", "section", "ruby", "table", "table-column", "table-row", "table-cell", + "graphic", "presentation", "drawing-page", "chart"): + raise ValueError("'%s' not allowed" % str(arg)) + return str(arg) + +def __save_prefix(attribute, arg, element): + prefix = arg.split(':',1)[0] + if prefix == arg: + return str(arg) + namespace = element.get_knownns(prefix) + if namespace is None: + #raise ValueError, "'%s' is an unknown prefix" % str(prefix) + return str(arg) + p = element.get_nsprefix(namespace) + return str(arg) + +def cnv_formula(attribute, arg, element): + """ A string containing a formula. Formulas do not have a predefined syntax, but the string should + begin with a namespace prefix, followed by a “:” (COLON, U+003A) separator, followed by the text + of the formula. The namespace bound to the prefix determines the syntax and semantics of the + formula. + """ + return __save_prefix(attribute, arg, element) + +def cnv_ID(attribute, arg, element): + return str(arg) + +def cnv_IDREF(attribute, arg, element): + return str(arg) + +def cnv_integer(attribute, arg, element): + return str(arg) + +def cnv_legend_position(attribute, arg, element): + if str(arg) not in ("start", "end", "top", "bottom", "top-start", "bottom-start", "top-end", "bottom-end"): + raise ValueError("'%s' not allowed" % str(arg)) + return str(arg) + +pattern_length = re.compile(r'-?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px))') + +def cnv_length(attribute, arg, element): + """ A (positive or negative) physical length, consisting of magnitude and unit, in conformance with the + Units of Measure defined in §5.9.13 of [XSL]. + """ + global pattern_length + if not pattern_length.match(arg): + raise ValueError("'%s' is not a valid length" % arg) + return arg + +def cnv_lengthorpercent(attribute, arg, element): + failed = False + try: return cnv_length(attribute, arg, element) + except: failed = True + try: return cnv_percent(attribute, arg, element) + except: failed = True + if failed: + raise ValueError("'%s' is not a valid length or percent" % arg) + return arg + +def cnv_metavaluetype(attribute, arg, element): + if str(arg) not in ("float", "date", "time", "boolean", "string"): + raise ValueError("'%s' not allowed" % str(arg)) + return str(arg) + +def cnv_major_minor(attribute, arg, element): + if arg not in ('major','minor'): + raise ValueError("'%s' is not either 'minor' or 'major'" % arg) + +pattern_namespacedToken = re.compile(r'[0-9a-zA-Z_]+:[0-9a-zA-Z._\-]+') + +def cnv_namespacedToken(attribute, arg, element): + global pattern_namespacedToken + + if not pattern_namespacedToken.match(arg): + raise ValueError("'%s' is not a valid namespaced token" % arg) + return __save_prefix(attribute, arg, element) + +def cnv_NCName(attribute, arg, element): + """ NCName is defined in http://www.w3.org/TR/REC-xml-names/#NT-NCName + Essentially an XML name minus ':' + """ + if type(arg) in str: + return make_NCName(arg) + else: + return arg.getAttrNS(STYLENS, 'name') + +# This function takes either an instance of a style (preferred) +# or a text string naming the style. If it is a text string, then it must +# already have been converted to an NCName +# The text-string argument is mainly for when we build a structure from XML +def cnv_StyleNameRef(attribute, arg, element): + try: + return arg.getAttrNS(STYLENS, 'name') + except: + return arg + +# This function takes either an instance of a style (preferred) +# or a text string naming the style. If it is a text string, then it must +# already have been converted to an NCName +# The text-string argument is mainly for when we build a structure from XML +def cnv_DrawNameRef(attribute, arg, element): + try: + return arg.getAttrNS(DRAWNS, 'name') + except: + return arg + +# Must accept list of Style objects +def cnv_NCNames(attribute, arg, element): + return ' '.join(arg) + +def cnv_nonNegativeInteger(attribute, arg, element): + return str(arg) + +pattern_percent = re.compile(r'-?([0-9]+(\.[0-9]*)?|\.[0-9]+)%') + +def cnv_percent(attribute, arg, element): + global pattern_percent + if not pattern_percent.match(arg): + raise ValueError("'%s' is not a valid length" % arg) + return arg + +# Real one doesn't allow floating point values +pattern_points = re.compile(r'-?[0-9]+,-?[0-9]+([ ]+-?[0-9]+,-?[0-9]+)*') +#pattern_points = re.compile(r'-?[0-9.]+,-?[0-9.]+([ ]+-?[0-9.]+,-?[0-9.]+)*') +def cnv_points(attribute, arg, element): + global pattern_points + if type(arg) in str: + if not pattern_points.match(arg): + raise ValueError("x,y are separated by a comma and the points are separated by white spaces") + return arg + else: + try: + strarg = ' '.join([ "%d,%d" % p for p in arg]) + except: + raise ValueError("Points must be string or [(0,0),(1,1)] - not %s" % arg) + return strarg + +def cnv_positiveInteger(attribute, arg, element): + return str(arg) + +def cnv_string(attribute, arg, element): + return str(arg) + +def cnv_textnoteclass(attribute, arg, element): + if str(arg) not in ("footnote", "endnote"): + raise ValueError("'%s' not allowed" % str(arg)) + return str(arg) + +# Understand different time formats +def cnv_time(attribute, arg, element): + return str(arg) + +def cnv_token(attribute, arg, element): + return str(arg) + +pattern_viewbox = re.compile(r'-?[0-9]+([ ]+-?[0-9]+){3}$') + +def cnv_viewbox(attribute, arg, element): + global pattern_viewbox + if not pattern_viewbox.match(arg): + raise ValueError("viewBox must be four integers separated by whitespaces") + return arg + +def cnv_xlinkshow(attribute, arg, element): + if str(arg) not in ("new", "replace", "embed"): + raise ValueError("'%s' not allowed" % str(arg)) + return str(arg) + + +attrconverters = { + ((ANIMNS,'audio-level'), None): cnv_double, + ((ANIMNS,'color-interpolation'), None): cnv_string, + ((ANIMNS,'color-interpolation-direction'), None): cnv_string, + ((ANIMNS,'command'), None): cnv_string, + ((ANIMNS,'formula'), None): cnv_string, + ((ANIMNS,'id'), None): cnv_ID, + ((ANIMNS,'iterate-interval'), None): cnv_duration, + ((ANIMNS,'iterate-type'), None): cnv_string, + ((ANIMNS,'name'), None): cnv_string, + ((ANIMNS,'sub-item'), None): cnv_string, + ((ANIMNS,'value'), None): cnv_string, +# ((DBNS,u'type'), None): cnv_namespacedToken, + ((CHARTNS,'attached-axis'), None): cnv_string, + ((CHARTNS,'class'), (CHARTNS,'grid')): cnv_major_minor, + ((CHARTNS,'class'), None): cnv_namespacedToken, + ((CHARTNS,'column-mapping'), None): cnv_string, + ((CHARTNS,'connect-bars'), None): cnv_boolean, + ((CHARTNS,'data-label-number'), None): cnv_string, + ((CHARTNS,'data-label-symbol'), None): cnv_boolean, + ((CHARTNS,'data-label-text'), None): cnv_boolean, + ((CHARTNS,'data-source-has-labels'), None): cnv_data_source_has_labels, + ((CHARTNS,'deep'), None): cnv_boolean, + ((CHARTNS,'dimension'), None): cnv_string, + ((CHARTNS,'display-label'), None): cnv_boolean, + ((CHARTNS,'error-category'), None): cnv_string, + ((CHARTNS,'error-lower-indicator'), None): cnv_boolean, + ((CHARTNS,'error-lower-limit'), None): cnv_string, + ((CHARTNS,'error-margin'), None): cnv_string, + ((CHARTNS,'error-percentage'), None): cnv_string, + ((CHARTNS,'error-upper-indicator'), None): cnv_boolean, + ((CHARTNS,'error-upper-limit'), None): cnv_string, + ((CHARTNS,'gap-width'), None): cnv_string, + ((CHARTNS,'interpolation'), None): cnv_string, + ((CHARTNS,'interval-major'), None): cnv_string, + ((CHARTNS,'interval-minor-divisor'), None): cnv_string, + ((CHARTNS,'japanese-candle-stick'), None): cnv_boolean, + ((CHARTNS,'label-arrangement'), None): cnv_string, + ((CHARTNS,'label-cell-address'), None): cnv_string, + ((CHARTNS,'legend-align'), None): cnv_string, + ((CHARTNS,'legend-position'), None): cnv_legend_position, + ((CHARTNS,'lines'), None): cnv_boolean, + ((CHARTNS,'link-data-style-to-source'), None): cnv_boolean, + ((CHARTNS,'logarithmic'), None): cnv_boolean, + ((CHARTNS,'maximum'), None): cnv_string, + ((CHARTNS,'mean-value'), None): cnv_boolean, + ((CHARTNS,'minimum'), None): cnv_string, + ((CHARTNS,'name'), None): cnv_string, + ((CHARTNS,'origin'), None): cnv_string, + ((CHARTNS,'overlap'), None): cnv_string, + ((CHARTNS,'percentage'), None): cnv_boolean, + ((CHARTNS,'pie-offset'), None): cnv_string, + ((CHARTNS,'regression-type'), None): cnv_string, + ((CHARTNS,'repeated'), None): cnv_nonNegativeInteger, + ((CHARTNS,'row-mapping'), None): cnv_string, + ((CHARTNS,'scale-text'), None): cnv_boolean, + ((CHARTNS,'series-source'), None): cnv_string, + ((CHARTNS,'solid-type'), None): cnv_string, + ((CHARTNS,'spline-order'), None): cnv_string, + ((CHARTNS,'spline-resolution'), None): cnv_string, + ((CHARTNS,'stacked'), None): cnv_boolean, + ((CHARTNS,'style-name'), None): cnv_StyleNameRef, + ((CHARTNS,'symbol-height'), None): cnv_string, + ((CHARTNS,'symbol-name'), None): cnv_string, + ((CHARTNS,'symbol-type'), None): cnv_string, + ((CHARTNS,'symbol-width'), None): cnv_string, + ((CHARTNS,'text-overlap'), None): cnv_boolean, + ((CHARTNS,'three-dimensional'), None): cnv_boolean, + ((CHARTNS,'tick-marks-major-inner'), None): cnv_boolean, + ((CHARTNS,'tick-marks-major-outer'), None): cnv_boolean, + ((CHARTNS,'tick-marks-minor-inner'), None): cnv_boolean, + ((CHARTNS,'tick-marks-minor-outer'), None): cnv_boolean, + ((CHARTNS,'values-cell-range-address'), None): cnv_string, + ((CHARTNS,'vertical'), None): cnv_boolean, + ((CHARTNS,'visible'), None): cnv_boolean, + ((CONFIGNS,'name'), None): cnv_formula, + ((CONFIGNS,'type'), None): cnv_configtype, + ((DR3DNS,'ambient-color'), None): cnv_string, + ((DR3DNS,'back-scale'), None): cnv_string, + ((DR3DNS,'backface-culling'), None): cnv_string, + ((DR3DNS,'center'), None): cnv_string, + ((DR3DNS,'close-back'), None): cnv_boolean, + ((DR3DNS,'close-front'), None): cnv_boolean, + ((DR3DNS,'depth'), None): cnv_length, + ((DR3DNS,'diffuse-color'), None): cnv_string, + ((DR3DNS,'direction'), None): cnv_string, + ((DR3DNS,'distance'), None): cnv_length, + ((DR3DNS,'edge-rounding'), None): cnv_string, + ((DR3DNS,'edge-rounding-mode'), None): cnv_string, + ((DR3DNS,'emissive-color'), None): cnv_string, + ((DR3DNS,'enabled'), None): cnv_boolean, + ((DR3DNS,'end-angle'), None): cnv_string, + ((DR3DNS,'focal-length'), None): cnv_length, + ((DR3DNS,'horizontal-segments'), None): cnv_string, + ((DR3DNS,'lighting-mode'), None): cnv_boolean, + ((DR3DNS,'max-edge'), None): cnv_string, + ((DR3DNS,'min-edge'), None): cnv_string, + ((DR3DNS,'normals-direction'), None): cnv_string, + ((DR3DNS,'normals-kind'), None): cnv_string, + ((DR3DNS,'projection'), None): cnv_string, + ((DR3DNS,'shade-mode'), None): cnv_string, + ((DR3DNS,'shadow'), None): cnv_string, + ((DR3DNS,'shadow-slant'), None): cnv_nonNegativeInteger, + ((DR3DNS,'shininess'), None): cnv_string, + ((DR3DNS,'size'), None): cnv_string, + ((DR3DNS,'specular'), None): cnv_boolean, + ((DR3DNS,'specular-color'), None): cnv_string, + ((DR3DNS,'texture-filter'), None): cnv_string, + ((DR3DNS,'texture-generation-mode-x'), None): cnv_string, + ((DR3DNS,'texture-generation-mode-y'), None): cnv_string, + ((DR3DNS,'texture-kind'), None): cnv_string, + ((DR3DNS,'texture-mode'), None): cnv_string, + ((DR3DNS,'transform'), None): cnv_string, + ((DR3DNS,'vertical-segments'), None): cnv_string, + ((DR3DNS,'vpn'), None): cnv_string, + ((DR3DNS,'vrp'), None): cnv_string, + ((DR3DNS,'vup'), None): cnv_string, + ((DRAWNS,'align'), None): cnv_string, + ((DRAWNS,'angle'), None): cnv_integer, + ((DRAWNS,'archive'), None): cnv_string, + ((DRAWNS,'auto-grow-height'), None): cnv_boolean, + ((DRAWNS,'auto-grow-width'), None): cnv_boolean, + ((DRAWNS,'background-size'), None): cnv_string, + ((DRAWNS,'blue'), None): cnv_string, + ((DRAWNS,'border'), None): cnv_string, + ((DRAWNS,'caption-angle'), None): cnv_string, + ((DRAWNS,'caption-angle-type'), None): cnv_string, + ((DRAWNS,'caption-escape'), None): cnv_string, + ((DRAWNS,'caption-escape-direction'), None): cnv_string, + ((DRAWNS,'caption-fit-line-length'), None): cnv_boolean, + ((DRAWNS,'caption-gap'), None): cnv_string, + ((DRAWNS,'caption-line-length'), None): cnv_length, + ((DRAWNS,'caption-point-x'), None): cnv_string, + ((DRAWNS,'caption-point-y'), None): cnv_string, + ((DRAWNS,'caption-id'), None): cnv_IDREF, + ((DRAWNS,'caption-type'), None): cnv_string, + ((DRAWNS,'chain-next-name'), None): cnv_string, + ((DRAWNS,'class-id'), None): cnv_string, + ((DRAWNS,'class-names'), None): cnv_NCNames, + ((DRAWNS,'code'), None): cnv_string, + ((DRAWNS,'color'), None): cnv_string, + ((DRAWNS,'color-inversion'), None): cnv_boolean, + ((DRAWNS,'color-mode'), None): cnv_string, + ((DRAWNS,'concave'), None): cnv_string, + ((DRAWNS,'concentric-gradient-fill-allowed'), None): cnv_boolean, + ((DRAWNS,'contrast'), None): cnv_string, + ((DRAWNS,'control'), None): cnv_IDREF, + ((DRAWNS,'copy-of'), None): cnv_string, + ((DRAWNS,'corner-radius'), None): cnv_length, + ((DRAWNS,'corners'), None): cnv_positiveInteger, + ((DRAWNS,'cx'), None): cnv_string, + ((DRAWNS,'cy'), None): cnv_string, + ((DRAWNS,'data'), None): cnv_string, + ((DRAWNS,'decimal-places'), None): cnv_string, + ((DRAWNS,'display'), None): cnv_string, + ((DRAWNS,'display-name'), None): cnv_string, + ((DRAWNS,'distance'), None): cnv_lengthorpercent, + ((DRAWNS,'dots1'), None): cnv_integer, + ((DRAWNS,'dots1-length'), None): cnv_lengthorpercent, + ((DRAWNS,'dots2'), None): cnv_integer, + ((DRAWNS,'dots2-length'), None): cnv_lengthorpercent, + ((DRAWNS,'end-angle'), None): cnv_double, + ((DRAWNS,'end'), None): cnv_string, + ((DRAWNS,'end-color'), None): cnv_string, + ((DRAWNS,'end-glue-point'), None): cnv_nonNegativeInteger, + ((DRAWNS,'end-guide'), None): cnv_length, + ((DRAWNS,'end-intensity'), None): cnv_string, + ((DRAWNS,'end-line-spacing-horizontal'), None): cnv_string, + ((DRAWNS,'end-line-spacing-vertical'), None): cnv_string, + ((DRAWNS,'end-shape'), None): cnv_IDREF, + ((DRAWNS,'engine'), None): cnv_namespacedToken, + ((DRAWNS,'enhanced-path'), None): cnv_string, + ((DRAWNS,'escape-direction'), None): cnv_string, + ((DRAWNS,'extrusion-allowed'), None): cnv_boolean, + ((DRAWNS,'extrusion-brightness'), None): cnv_string, + ((DRAWNS,'extrusion'), None): cnv_boolean, + ((DRAWNS,'extrusion-color'), None): cnv_boolean, + ((DRAWNS,'extrusion-depth'), None): cnv_double, + ((DRAWNS,'extrusion-diffusion'), None): cnv_string, + ((DRAWNS,'extrusion-first-light-direction'), None): cnv_string, + ((DRAWNS,'extrusion-first-light-harsh'), None): cnv_boolean, + ((DRAWNS,'extrusion-first-light-level'), None): cnv_string, + ((DRAWNS,'extrusion-light-face'), None): cnv_boolean, + ((DRAWNS,'extrusion-metal'), None): cnv_boolean, + ((DRAWNS,'extrusion-number-of-line-segments'), None): cnv_integer, + ((DRAWNS,'extrusion-origin'), None): cnv_double, + ((DRAWNS,'extrusion-rotation-angle'), None): cnv_double, + ((DRAWNS,'extrusion-rotation-center'), None): cnv_string, + ((DRAWNS,'extrusion-second-light-direction'), None): cnv_string, + ((DRAWNS,'extrusion-second-light-harsh'), None): cnv_boolean, + ((DRAWNS,'extrusion-second-light-level'), None): cnv_string, + ((DRAWNS,'extrusion-shininess'), None): cnv_string, + ((DRAWNS,'extrusion-skew'), None): cnv_double, + ((DRAWNS,'extrusion-specularity'), None): cnv_string, + ((DRAWNS,'extrusion-viewpoint'), None): cnv_string, + ((DRAWNS,'fill'), None): cnv_string, + ((DRAWNS,'fill-color'), None): cnv_string, + ((DRAWNS,'fill-gradient-name'), None): cnv_string, + ((DRAWNS,'fill-hatch-name'), None): cnv_string, + ((DRAWNS,'fill-hatch-solid'), None): cnv_boolean, + ((DRAWNS,'fill-image-height'), None): cnv_lengthorpercent, + ((DRAWNS,'fill-image-name'), None): cnv_DrawNameRef, + ((DRAWNS,'fill-image-ref-point'), None): cnv_string, + ((DRAWNS,'fill-image-ref-point-x'), None): cnv_string, + ((DRAWNS,'fill-image-ref-point-y'), None): cnv_string, + ((DRAWNS,'fill-image-width'), None): cnv_lengthorpercent, + ((DRAWNS,'filter-name'), None): cnv_string, + ((DRAWNS,'fit-to-contour'), None): cnv_boolean, + ((DRAWNS,'fit-to-size'), None): cnv_boolean, + ((DRAWNS,'formula'), None): cnv_string, + ((DRAWNS,'frame-display-border'), None): cnv_boolean, + ((DRAWNS,'frame-display-scrollbar'), None): cnv_boolean, + ((DRAWNS,'frame-margin-horizontal'), None): cnv_string, + ((DRAWNS,'frame-margin-vertical'), None): cnv_string, + ((DRAWNS,'frame-name'), None): cnv_string, + ((DRAWNS,'gamma'), None): cnv_string, + ((DRAWNS,'glue-point-leaving-directions'), None): cnv_string, + ((DRAWNS,'glue-point-type'), None): cnv_string, + ((DRAWNS,'glue-points'), None): cnv_string, + ((DRAWNS,'gradient-step-count'), None): cnv_string, + ((DRAWNS,'green'), None): cnv_string, + ((DRAWNS,'guide-distance'), None): cnv_string, + ((DRAWNS,'guide-overhang'), None): cnv_length, + ((DRAWNS,'handle-mirror-horizontal'), None): cnv_boolean, + ((DRAWNS,'handle-mirror-vertical'), None): cnv_boolean, + ((DRAWNS,'handle-polar'), None): cnv_string, + ((DRAWNS,'handle-position'), None): cnv_string, + ((DRAWNS,'handle-radius-range-maximum'), None): cnv_string, + ((DRAWNS,'handle-radius-range-minimum'), None): cnv_string, + ((DRAWNS,'handle-range-x-maximum'), None): cnv_string, + ((DRAWNS,'handle-range-x-minimum'), None): cnv_string, + ((DRAWNS,'handle-range-y-maximum'), None): cnv_string, + ((DRAWNS,'handle-range-y-minimum'), None): cnv_string, + ((DRAWNS,'handle-switched'), None): cnv_boolean, +# ((DRAWNS,u'id'), None): cnv_ID, +# ((DRAWNS,u'id'), None): cnv_nonNegativeInteger, # ?? line 6581 in RNG + ((DRAWNS,'id'), None): cnv_string, + ((DRAWNS,'image-opacity'), None): cnv_string, + ((DRAWNS,'kind'), None): cnv_string, + ((DRAWNS,'layer'), None): cnv_string, + ((DRAWNS,'line-distance'), None): cnv_string, + ((DRAWNS,'line-skew'), None): cnv_string, + ((DRAWNS,'luminance'), None): cnv_string, + ((DRAWNS,'marker-end-center'), None): cnv_boolean, + ((DRAWNS,'marker-end'), None): cnv_string, + ((DRAWNS,'marker-end-width'), None): cnv_length, + ((DRAWNS,'marker-start-center'), None): cnv_boolean, + ((DRAWNS,'marker-start'), None): cnv_string, + ((DRAWNS,'marker-start-width'), None): cnv_length, + ((DRAWNS,'master-page-name'), None): cnv_StyleNameRef, + ((DRAWNS,'may-script'), None): cnv_boolean, + ((DRAWNS,'measure-align'), None): cnv_string, + ((DRAWNS,'measure-vertical-align'), None): cnv_string, + ((DRAWNS,'mime-type'), None): cnv_string, + ((DRAWNS,'mirror-horizontal'), None): cnv_boolean, + ((DRAWNS,'mirror-vertical'), None): cnv_boolean, + ((DRAWNS,'modifiers'), None): cnv_string, + ((DRAWNS,'name'), None): cnv_NCName, +# ((DRAWNS,u'name'), None): cnv_string, + ((DRAWNS,'nav-order'), None): cnv_IDREF, + ((DRAWNS,'nohref'), None): cnv_string, + ((DRAWNS,'notify-on-update-of-ranges'), None): cnv_string, + ((DRAWNS,'object'), None): cnv_string, + ((DRAWNS,'ole-draw-aspect'), None): cnv_string, + ((DRAWNS,'opacity'), None): cnv_string, + ((DRAWNS,'opacity-name'), None): cnv_string, + ((DRAWNS,'page-number'), None): cnv_positiveInteger, + ((DRAWNS,'parallel'), None): cnv_boolean, + ((DRAWNS,'path-stretchpoint-x'), None): cnv_double, + ((DRAWNS,'path-stretchpoint-y'), None): cnv_double, + ((DRAWNS,'placing'), None): cnv_string, + ((DRAWNS,'points'), None): cnv_points, + ((DRAWNS,'protected'), None): cnv_boolean, + ((DRAWNS,'recreate-on-edit'), None): cnv_boolean, + ((DRAWNS,'red'), None): cnv_string, + ((DRAWNS,'rotation'), None): cnv_integer, + ((DRAWNS,'secondary-fill-color'), None): cnv_string, + ((DRAWNS,'shadow'), None): cnv_string, + ((DRAWNS,'shadow-color'), None): cnv_string, + ((DRAWNS,'shadow-offset-x'), None): cnv_length, + ((DRAWNS,'shadow-offset-y'), None): cnv_length, + ((DRAWNS,'shadow-opacity'), None): cnv_string, + ((DRAWNS,'shape-id'), None): cnv_IDREF, + ((DRAWNS,'sharpness'), None): cnv_string, + ((DRAWNS,'show-unit'), None): cnv_boolean, + ((DRAWNS,'start-angle'), None): cnv_double, + ((DRAWNS,'start'), None): cnv_string, + ((DRAWNS,'start-color'), None): cnv_string, + ((DRAWNS,'start-glue-point'), None): cnv_nonNegativeInteger, + ((DRAWNS,'start-guide'), None): cnv_length, + ((DRAWNS,'start-intensity'), None): cnv_string, + ((DRAWNS,'start-line-spacing-horizontal'), None): cnv_string, + ((DRAWNS,'start-line-spacing-vertical'), None): cnv_string, + ((DRAWNS,'start-shape'), None): cnv_IDREF, + ((DRAWNS,'stroke'), None): cnv_string, + ((DRAWNS,'stroke-dash'), None): cnv_string, + ((DRAWNS,'stroke-dash-names'), None): cnv_string, + ((DRAWNS,'stroke-linejoin'), None): cnv_string, + ((DRAWNS,'style'), None): cnv_string, + ((DRAWNS,'style-name'), None): cnv_StyleNameRef, + ((DRAWNS,'symbol-color'), None): cnv_string, + ((DRAWNS,'text-areas'), None): cnv_string, + ((DRAWNS,'text-path-allowed'), None): cnv_boolean, + ((DRAWNS,'text-path'), None): cnv_boolean, + ((DRAWNS,'text-path-mode'), None): cnv_string, + ((DRAWNS,'text-path-same-letter-heights'), None): cnv_boolean, + ((DRAWNS,'text-path-scale'), None): cnv_string, + ((DRAWNS,'text-rotate-angle'), None): cnv_double, + ((DRAWNS,'text-style-name'), None): cnv_StyleNameRef, + ((DRAWNS,'textarea-horizontal-align'), None): cnv_string, + ((DRAWNS,'textarea-vertical-align'), None): cnv_string, + ((DRAWNS,'tile-repeat-offset'), None): cnv_string, + ((DRAWNS,'transform'), None): cnv_string, + ((DRAWNS,'type'), None): cnv_string, + ((DRAWNS,'unit'), None): cnv_string, + ((DRAWNS,'value'), None): cnv_string, + ((DRAWNS,'visible-area-height'), None): cnv_string, + ((DRAWNS,'visible-area-left'), None): cnv_string, + ((DRAWNS,'visible-area-top'), None): cnv_string, + ((DRAWNS,'visible-area-width'), None): cnv_string, + ((DRAWNS,'wrap-influence-on-position'), None): cnv_string, + ((DRAWNS,'z-index'), None): cnv_nonNegativeInteger, + ((FONS,'background-color'), None): cnv_string, + ((FONS,'border-bottom'), None): cnv_string, + ((FONS,'border'), None): cnv_string, + ((FONS,'border-left'), None): cnv_string, + ((FONS,'border-right'), None): cnv_string, + ((FONS,'border-top'), None): cnv_string, + ((FONS,'break-after'), None): cnv_string, + ((FONS,'break-before'), None): cnv_string, + ((FONS,'clip'), None): cnv_string, + ((FONS,'color'), None): cnv_string, + ((FONS,'column-count'), None): cnv_positiveInteger, + ((FONS,'column-gap'), None): cnv_length, + ((FONS,'country'), None): cnv_token, + ((FONS,'end-indent'), None): cnv_length, + ((FONS,'font-family'), None): cnv_string, + ((FONS,'font-size'), None): cnv_string, + ((FONS,'font-style'), None): cnv_string, + ((FONS,'font-variant'), None): cnv_string, + ((FONS,'font-weight'), None): cnv_string, + ((FONS,'height'), None): cnv_string, + ((FONS,'hyphenate'), None): cnv_boolean, + ((FONS,'hyphenation-keep'), None): cnv_string, + ((FONS,'hyphenation-ladder-count'), None): cnv_string, + ((FONS,'hyphenation-push-char-count'), None): cnv_string, + ((FONS,'hyphenation-remain-char-count'), None): cnv_string, + ((FONS,'keep-together'), None): cnv_string, + ((FONS,'keep-with-next'), None): cnv_string, + ((FONS,'language'), None): cnv_token, + ((FONS,'letter-spacing'), None): cnv_string, + ((FONS,'line-height'), None): cnv_string, + ((FONS,'margin-bottom'), None): cnv_string, + ((FONS,'margin'), None): cnv_string, + ((FONS,'margin-left'), None): cnv_string, + ((FONS,'margin-right'), None): cnv_string, + ((FONS,'margin-top'), None): cnv_string, + ((FONS,'max-height'), None): cnv_string, + ((FONS,'max-width'), None): cnv_string, + ((FONS,'min-height'), None): cnv_length, + ((FONS,'min-width'), None): cnv_string, + ((FONS,'orphans'), None): cnv_string, + ((FONS,'padding-bottom'), None): cnv_string, + ((FONS,'padding'), None): cnv_string, + ((FONS,'padding-left'), None): cnv_string, + ((FONS,'padding-right'), None): cnv_string, + ((FONS,'padding-top'), None): cnv_string, + ((FONS,'page-height'), None): cnv_length, + ((FONS,'page-width'), None): cnv_length, + ((FONS,'space-after'), None): cnv_length, + ((FONS,'space-before'), None): cnv_length, + ((FONS,'start-indent'), None): cnv_length, + ((FONS,'text-align'), None): cnv_string, + ((FONS,'text-align-last'), None): cnv_string, + ((FONS,'text-indent'), None): cnv_string, + ((FONS,'text-shadow'), None): cnv_string, + ((FONS,'text-transform'), None): cnv_string, + ((FONS,'widows'), None): cnv_string, + ((FONS,'width'), None): cnv_string, + ((FONS,'wrap-option'), None): cnv_string, + ((FORMNS,'allow-deletes'), None): cnv_boolean, + ((FORMNS,'allow-inserts'), None): cnv_boolean, + ((FORMNS,'allow-updates'), None): cnv_boolean, + ((FORMNS,'apply-design-mode'), None): cnv_boolean, + ((FORMNS,'apply-filter'), None): cnv_boolean, + ((FORMNS,'auto-complete'), None): cnv_boolean, + ((FORMNS,'automatic-focus'), None): cnv_boolean, + ((FORMNS,'bound-column'), None): cnv_string, + ((FORMNS,'button-type'), None): cnv_string, + ((FORMNS,'command'), None): cnv_string, + ((FORMNS,'command-type'), None): cnv_string, + ((FORMNS,'control-implementation'), None): cnv_namespacedToken, + ((FORMNS,'convert-empty-to-null'), None): cnv_boolean, + ((FORMNS,'current-selected'), None): cnv_boolean, + ((FORMNS,'current-state'), None): cnv_string, +# ((FORMNS,u'current-value'), None): cnv_date, +# ((FORMNS,u'current-value'), None): cnv_double, + ((FORMNS,'current-value'), None): cnv_string, +# ((FORMNS,u'current-value'), None): cnv_time, + ((FORMNS,'data-field'), None): cnv_string, + ((FORMNS,'datasource'), None): cnv_string, + ((FORMNS,'default-button'), None): cnv_boolean, + ((FORMNS,'delay-for-repeat'), None): cnv_duration, + ((FORMNS,'detail-fields'), None): cnv_string, + ((FORMNS,'disabled'), None): cnv_boolean, + ((FORMNS,'dropdown'), None): cnv_boolean, + ((FORMNS,'echo-char'), None): cnv_string, + ((FORMNS,'enctype'), None): cnv_string, + ((FORMNS,'escape-processing'), None): cnv_boolean, + ((FORMNS,'filter'), None): cnv_string, + ((FORMNS,'focus-on-click'), None): cnv_boolean, + ((FORMNS,'for'), None): cnv_string, + ((FORMNS,'id'), None): cnv_ID, + ((FORMNS,'ignore-result'), None): cnv_boolean, + ((FORMNS,'image-align'), None): cnv_string, + ((FORMNS,'image-data'), None): cnv_anyURI, + ((FORMNS,'image-position'), None): cnv_string, + ((FORMNS,'is-tristate'), None): cnv_boolean, + ((FORMNS,'label'), None): cnv_string, + ((FORMNS,'list-source'), None): cnv_string, + ((FORMNS,'list-source-type'), None): cnv_string, + ((FORMNS,'master-fields'), None): cnv_string, + ((FORMNS,'max-length'), None): cnv_nonNegativeInteger, +# ((FORMNS,u'max-value'), None): cnv_date, +# ((FORMNS,u'max-value'), None): cnv_double, + ((FORMNS,'max-value'), None): cnv_string, +# ((FORMNS,u'max-value'), None): cnv_time, + ((FORMNS,'method'), None): cnv_string, +# ((FORMNS,u'min-value'), None): cnv_date, +# ((FORMNS,u'min-value'), None): cnv_double, + ((FORMNS,'min-value'), None): cnv_string, +# ((FORMNS,u'min-value'), None): cnv_time, + ((FORMNS,'multi-line'), None): cnv_boolean, + ((FORMNS,'multiple'), None): cnv_boolean, + ((FORMNS,'name'), None): cnv_string, + ((FORMNS,'navigation-mode'), None): cnv_string, + ((FORMNS,'order'), None): cnv_string, + ((FORMNS,'orientation'), None): cnv_string, + ((FORMNS,'page-step-size'), None): cnv_positiveInteger, + ((FORMNS,'printable'), None): cnv_boolean, + ((FORMNS,'property-name'), None): cnv_string, + ((FORMNS,'readonly'), None): cnv_boolean, + ((FORMNS,'selected'), None): cnv_boolean, + ((FORMNS,'size'), None): cnv_nonNegativeInteger, + ((FORMNS,'state'), None): cnv_string, + ((FORMNS,'step-size'), None): cnv_positiveInteger, + ((FORMNS,'tab-cycle'), None): cnv_string, + ((FORMNS,'tab-index'), None): cnv_nonNegativeInteger, + ((FORMNS,'tab-stop'), None): cnv_boolean, + ((FORMNS,'text-style-name'), None): cnv_StyleNameRef, + ((FORMNS,'title'), None): cnv_string, + ((FORMNS,'toggle'), None): cnv_boolean, + ((FORMNS,'validation'), None): cnv_boolean, +# ((FORMNS,u'value'), None): cnv_date, +# ((FORMNS,u'value'), None): cnv_double, + ((FORMNS,'value'), None): cnv_string, +# ((FORMNS,u'value'), None): cnv_time, + ((FORMNS,'visual-effect'), None): cnv_string, + ((FORMNS,'xforms-list-source'), None): cnv_string, + ((FORMNS,'xforms-submission'), None): cnv_string, + ((MANIFESTNS,'algorithm-name'), None): cnv_string, + ((MANIFESTNS,'checksum'), None): cnv_string, + ((MANIFESTNS,'checksum-type'), None): cnv_string, + ((MANIFESTNS,'full-path'), None): cnv_string, + ((MANIFESTNS,'initialisation-vector'), None): cnv_string, + ((MANIFESTNS,'iteration-count'), None): cnv_nonNegativeInteger, + ((MANIFESTNS,'key-derivation-name'), None): cnv_string, + ((MANIFESTNS,'media-type'), None): cnv_string, + ((MANIFESTNS,'salt'), None): cnv_string, + ((MANIFESTNS,'size'), None): cnv_nonNegativeInteger, + ((METANS,'cell-count'), None): cnv_nonNegativeInteger, + ((METANS,'character-count'), None): cnv_nonNegativeInteger, + ((METANS,'date'), None): cnv_dateTime, + ((METANS,'delay'), None): cnv_duration, + ((METANS,'draw-count'), None): cnv_nonNegativeInteger, + ((METANS,'frame-count'), None): cnv_nonNegativeInteger, + ((METANS,'image-count'), None): cnv_nonNegativeInteger, + ((METANS,'name'), None): cnv_string, + ((METANS,'non-whitespace-character-count'), None): cnv_nonNegativeInteger, + ((METANS,'object-count'), None): cnv_nonNegativeInteger, + ((METANS,'ole-object-count'), None): cnv_nonNegativeInteger, + ((METANS,'page-count'), None): cnv_nonNegativeInteger, + ((METANS,'paragraph-count'), None): cnv_nonNegativeInteger, + ((METANS,'row-count'), None): cnv_nonNegativeInteger, + ((METANS,'sentence-count'), None): cnv_nonNegativeInteger, + ((METANS,'syllable-count'), None): cnv_nonNegativeInteger, + ((METANS,'table-count'), None): cnv_nonNegativeInteger, + ((METANS,'value-type'), None): cnv_metavaluetype, + ((METANS,'word-count'), None): cnv_nonNegativeInteger, + ((NUMBERNS,'automatic-order'), None): cnv_boolean, + ((NUMBERNS,'calendar'), None): cnv_string, + ((NUMBERNS,'country'), None): cnv_token, + ((NUMBERNS,'decimal-places'), None): cnv_integer, + ((NUMBERNS,'decimal-replacement'), None): cnv_string, + ((NUMBERNS,'denominator-value'), None): cnv_integer, + ((NUMBERNS,'display-factor'), None): cnv_double, + ((NUMBERNS,'format-source'), None): cnv_string, + ((NUMBERNS,'grouping'), None): cnv_boolean, + ((NUMBERNS,'language'), None): cnv_token, + ((NUMBERNS,'min-denominator-digits'), None): cnv_integer, + ((NUMBERNS,'min-exponent-digits'), None): cnv_integer, + ((NUMBERNS,'min-integer-digits'), None): cnv_integer, + ((NUMBERNS,'min-numerator-digits'), None): cnv_integer, + ((NUMBERNS,'position'), None): cnv_integer, + ((NUMBERNS,'possessive-form'), None): cnv_boolean, + ((NUMBERNS,'style'), None): cnv_string, + ((NUMBERNS,'textual'), None): cnv_boolean, + ((NUMBERNS,'title'), None): cnv_string, + ((NUMBERNS,'transliteration-country'), None): cnv_token, + ((NUMBERNS,'transliteration-format'), None): cnv_string, + ((NUMBERNS,'transliteration-language'), None): cnv_token, + ((NUMBERNS,'transliteration-style'), None): cnv_string, + ((NUMBERNS,'truncate-on-overflow'), None): cnv_boolean, + ((OFFICENS,'automatic-update'), None): cnv_boolean, + ((OFFICENS,'boolean-value'), None): cnv_boolean, + ((OFFICENS,'conversion-mode'), None): cnv_string, + ((OFFICENS,'currency'), None): cnv_string, + ((OFFICENS,'date-value'), None): cnv_dateTime, + ((OFFICENS,'dde-application'), None): cnv_string, + ((OFFICENS,'dde-item'), None): cnv_string, + ((OFFICENS,'dde-topic'), None): cnv_string, + ((OFFICENS,'display'), None): cnv_boolean, + ((OFFICENS,'mimetype'), None): cnv_string, + ((OFFICENS,'name'), None): cnv_string, + ((OFFICENS,'process-content'), None): cnv_boolean, + ((OFFICENS,'server-map'), None): cnv_boolean, + ((OFFICENS,'string-value'), None): cnv_string, + ((OFFICENS,'target-frame'), None): cnv_string, + ((OFFICENS,'target-frame-name'), None): cnv_string, + ((OFFICENS,'time-value'), None): cnv_duration, + ((OFFICENS,'title'), None): cnv_string, + ((OFFICENS,'value'), None): cnv_double, + ((OFFICENS,'value-type'), None): cnv_string, + ((OFFICENS,'version'), None): cnv_string, + ((PRESENTATIONNS,'action'), None): cnv_string, + ((PRESENTATIONNS,'animations'), None): cnv_string, + ((PRESENTATIONNS,'background-objects-visible'), None): cnv_boolean, + ((PRESENTATIONNS,'background-visible'), None): cnv_boolean, + ((PRESENTATIONNS,'class'), None): cnv_string, + ((PRESENTATIONNS,'class-names'), None): cnv_NCNames, + ((PRESENTATIONNS,'delay'), None): cnv_duration, + ((PRESENTATIONNS,'direction'), None): cnv_string, + ((PRESENTATIONNS,'display-date-time'), None): cnv_boolean, + ((PRESENTATIONNS,'display-footer'), None): cnv_boolean, + ((PRESENTATIONNS,'display-header'), None): cnv_boolean, + ((PRESENTATIONNS,'display-page-number'), None): cnv_boolean, + ((PRESENTATIONNS,'duration'), None): cnv_string, + ((PRESENTATIONNS,'effect'), None): cnv_string, + ((PRESENTATIONNS,'endless'), None): cnv_boolean, + ((PRESENTATIONNS,'force-manual'), None): cnv_boolean, + ((PRESENTATIONNS,'full-screen'), None): cnv_boolean, + ((PRESENTATIONNS,'group-id'), None): cnv_string, + ((PRESENTATIONNS,'master-element'), None): cnv_IDREF, + ((PRESENTATIONNS,'mouse-as-pen'), None): cnv_boolean, + ((PRESENTATIONNS,'mouse-visible'), None): cnv_boolean, + ((PRESENTATIONNS,'name'), None): cnv_string, + ((PRESENTATIONNS,'node-type'), None): cnv_string, + ((PRESENTATIONNS,'object'), None): cnv_string, + ((PRESENTATIONNS,'pages'), None): cnv_string, + ((PRESENTATIONNS,'path-id'), None): cnv_string, + ((PRESENTATIONNS,'pause'), None): cnv_duration, + ((PRESENTATIONNS,'placeholder'), None): cnv_boolean, + ((PRESENTATIONNS,'play-full'), None): cnv_boolean, + ((PRESENTATIONNS,'presentation-page-layout-name'), None): cnv_StyleNameRef, + ((PRESENTATIONNS,'preset-class'), None): cnv_string, + ((PRESENTATIONNS,'preset-id'), None): cnv_string, + ((PRESENTATIONNS,'preset-sub-type'), None): cnv_string, + ((PRESENTATIONNS,'show'), None): cnv_string, + ((PRESENTATIONNS,'show-end-of-presentation-slide'), None): cnv_boolean, + ((PRESENTATIONNS,'show-logo'), None): cnv_boolean, + ((PRESENTATIONNS,'source'), None): cnv_string, + ((PRESENTATIONNS,'speed'), None): cnv_string, + ((PRESENTATIONNS,'start-page'), None): cnv_string, + ((PRESENTATIONNS,'start-scale'), None): cnv_string, + ((PRESENTATIONNS,'start-with-navigator'), None): cnv_boolean, + ((PRESENTATIONNS,'stay-on-top'), None): cnv_boolean, + ((PRESENTATIONNS,'style-name'), None): cnv_StyleNameRef, + ((PRESENTATIONNS,'transition-on-click'), None): cnv_string, + ((PRESENTATIONNS,'transition-speed'), None): cnv_string, + ((PRESENTATIONNS,'transition-style'), None): cnv_string, + ((PRESENTATIONNS,'transition-type'), None): cnv_string, + ((PRESENTATIONNS,'use-date-time-name'), None): cnv_string, + ((PRESENTATIONNS,'use-footer-name'), None): cnv_string, + ((PRESENTATIONNS,'use-header-name'), None): cnv_string, + ((PRESENTATIONNS,'user-transformed'), None): cnv_boolean, + ((PRESENTATIONNS,'verb'), None): cnv_nonNegativeInteger, + ((PRESENTATIONNS,'visibility'), None): cnv_string, + ((SCRIPTNS,'event-name'), None): cnv_formula, + ((SCRIPTNS,'language'), None): cnv_formula, + ((SCRIPTNS,'macro-name'), None): cnv_string, + ((SMILNS,'accelerate'), None): cnv_double, + ((SMILNS,'accumulate'), None): cnv_string, + ((SMILNS,'additive'), None): cnv_string, + ((SMILNS,'attributeName'), None): cnv_string, + ((SMILNS,'autoReverse'), None): cnv_boolean, + ((SMILNS,'begin'), None): cnv_string, + ((SMILNS,'by'), None): cnv_string, + ((SMILNS,'calcMode'), None): cnv_string, + ((SMILNS,'decelerate'), None): cnv_double, + ((SMILNS,'direction'), None): cnv_string, + ((SMILNS,'dur'), None): cnv_string, + ((SMILNS,'end'), None): cnv_string, + ((SMILNS,'endsync'), None): cnv_string, + ((SMILNS,'fadeColor'), None): cnv_string, + ((SMILNS,'fill'), None): cnv_string, + ((SMILNS,'fillDefault'), None): cnv_string, + ((SMILNS,'from'), None): cnv_string, + ((SMILNS,'keySplines'), None): cnv_string, + ((SMILNS,'keyTimes'), None): cnv_string, + ((SMILNS,'mode'), None): cnv_string, + ((SMILNS,'repeatCount'), None): cnv_nonNegativeInteger, + ((SMILNS,'repeatDur'), None): cnv_string, + ((SMILNS,'restart'), None): cnv_string, + ((SMILNS,'restartDefault'), None): cnv_string, + ((SMILNS,'subtype'), None): cnv_string, + ((SMILNS,'targetElement'), None): cnv_IDREF, + ((SMILNS,'to'), None): cnv_string, + ((SMILNS,'type'), None): cnv_string, + ((SMILNS,'values'), None): cnv_string, + ((STYLENS,'adjustment'), None): cnv_string, + ((STYLENS,'apply-style-name'), None): cnv_StyleNameRef, + ((STYLENS,'auto-text-indent'), None): cnv_boolean, + ((STYLENS,'auto-update'), None): cnv_boolean, + ((STYLENS,'background-transparency'), None): cnv_string, + ((STYLENS,'base-cell-address'), None): cnv_string, + ((STYLENS,'border-line-width-bottom'), None): cnv_string, + ((STYLENS,'border-line-width'), None): cnv_string, + ((STYLENS,'border-line-width-left'), None): cnv_string, + ((STYLENS,'border-line-width-right'), None): cnv_string, + ((STYLENS,'border-line-width-top'), None): cnv_string, + ((STYLENS,'cell-protect'), None): cnv_string, + ((STYLENS,'char'), None): cnv_string, + ((STYLENS,'class'), None): cnv_string, + ((STYLENS,'color'), None): cnv_string, + ((STYLENS,'column-width'), None): cnv_string, + ((STYLENS,'condition'), None): cnv_string, + ((STYLENS,'country-asian'), None): cnv_string, + ((STYLENS,'country-complex'), None): cnv_string, + ((STYLENS,'data-style-name'), None): cnv_StyleNameRef, + ((STYLENS,'decimal-places'), None): cnv_string, + ((STYLENS,'default-outline-level'), None): cnv_positiveInteger, + ((STYLENS,'diagonal-bl-tr'), None): cnv_string, + ((STYLENS,'diagonal-bl-tr-widths'), None): cnv_string, + ((STYLENS,'diagonal-tl-br'), None): cnv_string, + ((STYLENS,'diagonal-tl-br-widths'), None): cnv_string, + ((STYLENS,'direction'), None): cnv_string, + ((STYLENS,'display'), None): cnv_boolean, + ((STYLENS,'display-name'), None): cnv_string, + ((STYLENS,'distance-after-sep'), None): cnv_length, + ((STYLENS,'distance-before-sep'), None): cnv_length, + ((STYLENS,'distance'), None): cnv_length, + ((STYLENS,'dynamic-spacing'), None): cnv_boolean, + ((STYLENS,'editable'), None): cnv_boolean, + ((STYLENS,'family'), None): cnv_family, + ((STYLENS,'filter-name'), None): cnv_string, + ((STYLENS,'first-page-number'), None): cnv_string, + ((STYLENS,'flow-with-text'), None): cnv_boolean, + ((STYLENS,'font-adornments'), None): cnv_string, + ((STYLENS,'font-charset'), None): cnv_string, + ((STYLENS,'font-charset-asian'), None): cnv_string, + ((STYLENS,'font-charset-complex'), None): cnv_string, + ((STYLENS,'font-family-asian'), None): cnv_string, + ((STYLENS,'font-family-complex'), None): cnv_string, + ((STYLENS,'font-family-generic-asian'), None): cnv_string, + ((STYLENS,'font-family-generic'), None): cnv_string, + ((STYLENS,'font-family-generic-complex'), None): cnv_string, + ((STYLENS,'font-independent-line-spacing'), None): cnv_boolean, + ((STYLENS,'font-name-asian'), None): cnv_string, + ((STYLENS,'font-name'), None): cnv_string, + ((STYLENS,'font-name-complex'), None): cnv_string, + ((STYLENS,'font-pitch-asian'), None): cnv_string, + ((STYLENS,'font-pitch'), None): cnv_string, + ((STYLENS,'font-pitch-complex'), None): cnv_string, + ((STYLENS,'font-relief'), None): cnv_string, + ((STYLENS,'font-size-asian'), None): cnv_string, + ((STYLENS,'font-size-complex'), None): cnv_string, + ((STYLENS,'font-size-rel-asian'), None): cnv_length, + ((STYLENS,'font-size-rel'), None): cnv_length, + ((STYLENS,'font-size-rel-complex'), None): cnv_length, + ((STYLENS,'font-style-asian'), None): cnv_string, + ((STYLENS,'font-style-complex'), None): cnv_string, + ((STYLENS,'font-style-name-asian'), None): cnv_string, + ((STYLENS,'font-style-name'), None): cnv_string, + ((STYLENS,'font-style-name-complex'), None): cnv_string, + ((STYLENS,'font-weight-asian'), None): cnv_string, + ((STYLENS,'font-weight-complex'), None): cnv_string, + ((STYLENS,'footnote-max-height'), None): cnv_length, + ((STYLENS,'glyph-orientation-vertical'), None): cnv_string, + ((STYLENS,'height'), None): cnv_string, + ((STYLENS,'horizontal-pos'), None): cnv_string, + ((STYLENS,'horizontal-rel'), None): cnv_string, + ((STYLENS,'justify-single-word'), None): cnv_boolean, + ((STYLENS,'language-asian'), None): cnv_string, + ((STYLENS,'language-complex'), None): cnv_string, + ((STYLENS,'layout-grid-base-height'), None): cnv_length, + ((STYLENS,'layout-grid-color'), None): cnv_string, + ((STYLENS,'layout-grid-display'), None): cnv_boolean, + ((STYLENS,'layout-grid-lines'), None): cnv_string, + ((STYLENS,'layout-grid-mode'), None): cnv_string, + ((STYLENS,'layout-grid-print'), None): cnv_boolean, + ((STYLENS,'layout-grid-ruby-below'), None): cnv_boolean, + ((STYLENS,'layout-grid-ruby-height'), None): cnv_length, + ((STYLENS,'leader-char'), None): cnv_string, + ((STYLENS,'leader-color'), None): cnv_string, + ((STYLENS,'leader-style'), None): cnv_string, + ((STYLENS,'leader-text'), None): cnv_string, + ((STYLENS,'leader-text-style'), None): cnv_StyleNameRef, + ((STYLENS,'leader-type'), None): cnv_string, + ((STYLENS,'leader-width'), None): cnv_string, + ((STYLENS,'legend-expansion-aspect-ratio'), None): cnv_double, + ((STYLENS,'legend-expansion'), None): cnv_string, + ((STYLENS,'length'), None): cnv_positiveInteger, + ((STYLENS,'letter-kerning'), None): cnv_boolean, + ((STYLENS,'line-break'), None): cnv_string, + ((STYLENS,'line-height-at-least'), None): cnv_string, + ((STYLENS,'line-spacing'), None): cnv_length, + ((STYLENS,'line-style'), None): cnv_string, + ((STYLENS,'lines'), None): cnv_positiveInteger, + ((STYLENS,'list-style-name'), None): cnv_StyleNameRef, + ((STYLENS,'master-page-name'), None): cnv_StyleNameRef, + ((STYLENS,'may-break-between-rows'), None): cnv_boolean, + ((STYLENS,'min-row-height'), None): cnv_string, + ((STYLENS,'mirror'), None): cnv_string, + ((STYLENS,'name'), None): cnv_NCName, + ((STYLENS,'name'), (STYLENS,'font-face')): cnv_string, + ((STYLENS,'next-style-name'), None): cnv_StyleNameRef, + ((STYLENS,'num-format'), None): cnv_string, + ((STYLENS,'num-letter-sync'), None): cnv_boolean, + ((STYLENS,'num-prefix'), None): cnv_string, + ((STYLENS,'num-suffix'), None): cnv_string, + ((STYLENS,'number-wrapped-paragraphs'), None): cnv_string, + ((STYLENS,'overflow-behavior'), None): cnv_string, + ((STYLENS,'page-layout-name'), None): cnv_StyleNameRef, + ((STYLENS,'page-number'), None): cnv_string, + ((STYLENS,'page-usage'), None): cnv_string, + ((STYLENS,'paper-tray-name'), None): cnv_string, + ((STYLENS,'parent-style-name'), None): cnv_StyleNameRef, + ((STYLENS,'position'), (STYLENS,'tab-stop')): cnv_length, + ((STYLENS,'position'), None): cnv_string, + ((STYLENS,'print'), None): cnv_string, + ((STYLENS,'print-content'), None): cnv_boolean, + ((STYLENS,'print-orientation'), None): cnv_string, + ((STYLENS,'print-page-order'), None): cnv_string, + ((STYLENS,'protect'), None): cnv_boolean, + ((STYLENS,'punctuation-wrap'), None): cnv_string, + ((STYLENS,'register-true'), None): cnv_boolean, + ((STYLENS,'register-truth-ref-style-name'), None): cnv_string, + ((STYLENS,'rel-column-width'), None): cnv_string, + ((STYLENS,'rel-height'), None): cnv_string, + ((STYLENS,'rel-width'), None): cnv_string, + ((STYLENS,'repeat'), None): cnv_string, + ((STYLENS,'repeat-content'), None): cnv_boolean, + ((STYLENS,'rotation-align'), None): cnv_string, + ((STYLENS,'rotation-angle'), None): cnv_string, + ((STYLENS,'row-height'), None): cnv_string, + ((STYLENS,'ruby-align'), None): cnv_string, + ((STYLENS,'ruby-position'), None): cnv_string, + ((STYLENS,'run-through'), None): cnv_string, + ((STYLENS,'scale-to'), None): cnv_string, + ((STYLENS,'scale-to-pages'), None): cnv_string, + ((STYLENS,'script-type'), None): cnv_string, + ((STYLENS,'shadow'), None): cnv_string, + ((STYLENS,'shrink-to-fit'), None): cnv_boolean, + ((STYLENS,'snap-to-layout-grid'), None): cnv_boolean, + ((STYLENS,'style'), None): cnv_string, + ((STYLENS,'style-name'), None): cnv_StyleNameRef, + ((STYLENS,'tab-stop-distance'), None): cnv_string, + ((STYLENS,'table-centering'), None): cnv_string, + ((STYLENS,'text-align-source'), None): cnv_string, + ((STYLENS,'text-autospace'), None): cnv_string, + ((STYLENS,'text-blinking'), None): cnv_boolean, + ((STYLENS,'text-combine'), None): cnv_string, + ((STYLENS,'text-combine-end-char'), None): cnv_string, + ((STYLENS,'text-combine-start-char'), None): cnv_string, + ((STYLENS,'text-emphasize'), None): cnv_string, + ((STYLENS,'text-line-through-color'), None): cnv_string, + ((STYLENS,'text-line-through-mode'), None): cnv_string, + ((STYLENS,'text-line-through-style'), None): cnv_string, + ((STYLENS,'text-line-through-text'), None): cnv_string, + ((STYLENS,'text-line-through-text-style'), None): cnv_string, + ((STYLENS,'text-line-through-type'), None): cnv_string, + ((STYLENS,'text-line-through-width'), None): cnv_string, + ((STYLENS,'text-outline'), None): cnv_boolean, + ((STYLENS,'text-position'), None): cnv_string, + ((STYLENS,'text-rotation-angle'), None): cnv_string, + ((STYLENS,'text-rotation-scale'), None): cnv_string, + ((STYLENS,'text-scale'), None): cnv_string, + ((STYLENS,'text-underline-color'), None): cnv_string, + ((STYLENS,'text-underline-mode'), None): cnv_string, + ((STYLENS,'text-underline-style'), None): cnv_string, + ((STYLENS,'text-underline-type'), None): cnv_string, + ((STYLENS,'text-underline-width'), None): cnv_string, + ((STYLENS,'type'), None): cnv_string, + ((STYLENS,'use-optimal-column-width'), None): cnv_boolean, + ((STYLENS,'use-optimal-row-height'), None): cnv_boolean, + ((STYLENS,'use-window-font-color'), None): cnv_boolean, + ((STYLENS,'vertical-align'), None): cnv_string, + ((STYLENS,'vertical-pos'), None): cnv_string, + ((STYLENS,'vertical-rel'), None): cnv_string, + ((STYLENS,'volatile'), None): cnv_boolean, + ((STYLENS,'width'), None): cnv_string, + ((STYLENS,'wrap'), None): cnv_string, + ((STYLENS,'wrap-contour'), None): cnv_boolean, + ((STYLENS,'wrap-contour-mode'), None): cnv_string, + ((STYLENS,'wrap-dynamic-threshold'), None): cnv_length, + ((STYLENS,'writing-mode-automatic'), None): cnv_boolean, + ((STYLENS,'writing-mode'), None): cnv_string, + ((SVGNS,'accent-height'), None): cnv_integer, + ((SVGNS,'alphabetic'), None): cnv_integer, + ((SVGNS,'ascent'), None): cnv_integer, + ((SVGNS,'bbox'), None): cnv_string, + ((SVGNS,'cap-height'), None): cnv_integer, + ((SVGNS,'cx'), None): cnv_string, + ((SVGNS,'cy'), None): cnv_string, + ((SVGNS,'d'), None): cnv_string, + ((SVGNS,'descent'), None): cnv_integer, + ((SVGNS,'fill-rule'), None): cnv_string, + ((SVGNS,'font-family'), None): cnv_string, + ((SVGNS,'font-size'), None): cnv_string, + ((SVGNS,'font-stretch'), None): cnv_string, + ((SVGNS,'font-style'), None): cnv_string, + ((SVGNS,'font-variant'), None): cnv_string, + ((SVGNS,'font-weight'), None): cnv_string, + ((SVGNS,'fx'), None): cnv_string, + ((SVGNS,'fy'), None): cnv_string, + ((SVGNS,'gradientTransform'), None): cnv_string, + ((SVGNS,'gradientUnits'), None): cnv_string, + ((SVGNS,'hanging'), None): cnv_integer, + ((SVGNS,'height'), None): cnv_length, + ((SVGNS,'ideographic'), None): cnv_integer, + ((SVGNS,'mathematical'), None): cnv_integer, + ((SVGNS,'name'), None): cnv_string, + ((SVGNS,'offset'), None): cnv_string, + ((SVGNS,'origin'), None): cnv_string, + ((SVGNS,'overline-position'), None): cnv_integer, + ((SVGNS,'overline-thickness'), None): cnv_integer, + ((SVGNS,'panose-1'), None): cnv_string, + ((SVGNS,'path'), None): cnv_string, + ((SVGNS,'r'), None): cnv_length, + ((SVGNS,'rx'), None): cnv_length, + ((SVGNS,'ry'), None): cnv_length, + ((SVGNS,'slope'), None): cnv_integer, + ((SVGNS,'spreadMethod'), None): cnv_string, + ((SVGNS,'stemh'), None): cnv_integer, + ((SVGNS,'stemv'), None): cnv_integer, + ((SVGNS,'stop-color'), None): cnv_string, + ((SVGNS,'stop-opacity'), None): cnv_double, + ((SVGNS,'strikethrough-position'), None): cnv_integer, + ((SVGNS,'strikethrough-thickness'), None): cnv_integer, + ((SVGNS,'string'), None): cnv_string, + ((SVGNS,'stroke-color'), None): cnv_string, + ((SVGNS,'stroke-opacity'), None): cnv_string, + ((SVGNS,'stroke-width'), None): cnv_length, + ((SVGNS,'type'), None): cnv_string, + ((SVGNS,'underline-position'), None): cnv_integer, + ((SVGNS,'underline-thickness'), None): cnv_integer, + ((SVGNS,'unicode-range'), None): cnv_string, + ((SVGNS,'units-per-em'), None): cnv_integer, + ((SVGNS,'v-alphabetic'), None): cnv_integer, + ((SVGNS,'v-hanging'), None): cnv_integer, + ((SVGNS,'v-ideographic'), None): cnv_integer, + ((SVGNS,'v-mathematical'), None): cnv_integer, + ((SVGNS,'viewBox'), None): cnv_viewbox, + ((SVGNS,'width'), None): cnv_length, + ((SVGNS,'widths'), None): cnv_string, + ((SVGNS,'x'), None): cnv_length, + ((SVGNS,'x-height'), None): cnv_integer, + ((SVGNS,'x1'), None): cnv_lengthorpercent, + ((SVGNS,'x2'), None): cnv_lengthorpercent, + ((SVGNS,'y'), None): cnv_length, + ((SVGNS,'y1'), None): cnv_lengthorpercent, + ((SVGNS,'y2'), None): cnv_lengthorpercent, + ((TABLENS,'acceptance-state'), None): cnv_string, + ((TABLENS,'add-empty-lines'), None): cnv_boolean, + ((TABLENS,'algorithm'), None): cnv_formula, + ((TABLENS,'align'), None): cnv_string, + ((TABLENS,'allow-empty-cell'), None): cnv_boolean, + ((TABLENS,'application-data'), None): cnv_string, + ((TABLENS,'automatic-find-labels'), None): cnv_boolean, + ((TABLENS,'base-cell-address'), None): cnv_string, + ((TABLENS,'bind-styles-to-content'), None): cnv_boolean, + ((TABLENS,'border-color'), None): cnv_string, + ((TABLENS,'border-model'), None): cnv_string, + ((TABLENS,'buttons'), None): cnv_string, + ((TABLENS,'buttons'), None): cnv_string, + ((TABLENS,'case-sensitive'), None): cnv_boolean, + ((TABLENS,'case-sensitive'), None): cnv_string, + ((TABLENS,'cell-address'), None): cnv_string, + ((TABLENS,'cell-range-address'), None): cnv_string, + ((TABLENS,'cell-range-address'), None): cnv_string, + ((TABLENS,'cell-range'), None): cnv_string, + ((TABLENS,'column'), None): cnv_integer, + ((TABLENS,'comment'), None): cnv_string, + ((TABLENS,'condition'), None): cnv_formula, + ((TABLENS,'condition-source'), None): cnv_string, + ((TABLENS,'condition-source-range-address'), None): cnv_string, + ((TABLENS,'contains-error'), None): cnv_boolean, + ((TABLENS,'contains-header'), None): cnv_boolean, + ((TABLENS,'content-validation-name'), None): cnv_string, + ((TABLENS,'copy-back'), None): cnv_boolean, + ((TABLENS,'copy-formulas'), None): cnv_boolean, + ((TABLENS,'copy-styles'), None): cnv_boolean, + ((TABLENS,'count'), None): cnv_positiveInteger, + ((TABLENS,'country'), None): cnv_token, + ((TABLENS,'data-cell-range-address'), None): cnv_string, + ((TABLENS,'data-field'), None): cnv_string, + ((TABLENS,'data-type'), None): cnv_string, + ((TABLENS,'database-name'), None): cnv_string, + ((TABLENS,'database-table-name'), None): cnv_string, + ((TABLENS,'date-end'), None): cnv_string, + ((TABLENS,'date-start'), None): cnv_string, + ((TABLENS,'date-value'), None): cnv_date, + ((TABLENS,'default-cell-style-name'), None): cnv_StyleNameRef, + ((TABLENS,'direction'), None): cnv_string, + ((TABLENS,'display-border'), None): cnv_boolean, + ((TABLENS,'display'), None): cnv_boolean, + ((TABLENS,'display-duplicates'), None): cnv_boolean, + ((TABLENS,'display-filter-buttons'), None): cnv_boolean, + ((TABLENS,'display-list'), None): cnv_string, + ((TABLENS,'display-member-mode'), None): cnv_string, + ((TABLENS,'drill-down-on-double-click'), None): cnv_boolean, + ((TABLENS,'enabled'), None): cnv_boolean, + ((TABLENS,'end-cell-address'), None): cnv_string, + ((TABLENS,'end'), None): cnv_string, + ((TABLENS,'end-column'), None): cnv_integer, + ((TABLENS,'end-position'), None): cnv_integer, + ((TABLENS,'end-row'), None): cnv_integer, + ((TABLENS,'end-table'), None): cnv_integer, + ((TABLENS,'end-x'), None): cnv_length, + ((TABLENS,'end-y'), None): cnv_length, + ((TABLENS,'execute'), None): cnv_boolean, + ((TABLENS,'expression'), None): cnv_formula, + ((TABLENS,'field-name'), None): cnv_string, + ((TABLENS,'field-number'), None): cnv_nonNegativeInteger, + ((TABLENS,'field-number'), None): cnv_string, + ((TABLENS,'filter-name'), None): cnv_string, + ((TABLENS,'filter-options'), None): cnv_string, + ((TABLENS,'formula'), None): cnv_formula, + ((TABLENS,'function'), None): cnv_string, + ((TABLENS,'function'), None): cnv_string, + ((TABLENS,'grand-total'), None): cnv_string, + ((TABLENS,'group-by-field-number'), None): cnv_nonNegativeInteger, + ((TABLENS,'grouped-by'), None): cnv_string, + ((TABLENS,'has-persistent-data'), None): cnv_boolean, + ((TABLENS,'id'), None): cnv_string, + ((TABLENS,'identify-categories'), None): cnv_boolean, + ((TABLENS,'ignore-empty-rows'), None): cnv_boolean, + ((TABLENS,'index'), None): cnv_nonNegativeInteger, + ((TABLENS,'is-active'), None): cnv_boolean, + ((TABLENS,'is-data-layout-field'), None): cnv_string, + ((TABLENS,'is-selection'), None): cnv_boolean, + ((TABLENS,'is-sub-table'), None): cnv_boolean, + ((TABLENS,'label-cell-range-address'), None): cnv_string, + ((TABLENS,'language'), None): cnv_token, + ((TABLENS,'language'), None): cnv_token, + ((TABLENS,'last-column-spanned'), None): cnv_positiveInteger, + ((TABLENS,'last-row-spanned'), None): cnv_positiveInteger, + ((TABLENS,'layout-mode'), None): cnv_string, + ((TABLENS,'link-to-source-data'), None): cnv_boolean, + ((TABLENS,'marked-invalid'), None): cnv_boolean, + ((TABLENS,'matrix-covered'), None): cnv_boolean, + ((TABLENS,'maximum-difference'), None): cnv_double, + ((TABLENS,'member-count'), None): cnv_nonNegativeInteger, + ((TABLENS,'member-name'), None): cnv_string, + ((TABLENS,'member-type'), None): cnv_string, + ((TABLENS,'message-type'), None): cnv_string, + ((TABLENS,'mode'), None): cnv_string, + ((TABLENS,'multi-deletion-spanned'), None): cnv_integer, + ((TABLENS,'name'), None): cnv_string, + ((TABLENS,'name'), None): cnv_string, + ((TABLENS,'null-year'), None): cnv_positiveInteger, + ((TABLENS,'number-columns-repeated'), None): cnv_positiveInteger, + ((TABLENS,'number-columns-spanned'), None): cnv_positiveInteger, + ((TABLENS,'number-matrix-columns-spanned'), None): cnv_positiveInteger, + ((TABLENS,'number-matrix-rows-spanned'), None): cnv_positiveInteger, + ((TABLENS,'number-rows-repeated'), None): cnv_positiveInteger, + ((TABLENS,'number-rows-spanned'), None): cnv_positiveInteger, + ((TABLENS,'object-name'), None): cnv_string, + ((TABLENS,'on-update-keep-size'), None): cnv_boolean, + ((TABLENS,'on-update-keep-styles'), None): cnv_boolean, + ((TABLENS,'operator'), None): cnv_string, + ((TABLENS,'operator'), None): cnv_string, + ((TABLENS,'order'), None): cnv_string, + ((TABLENS,'orientation'), None): cnv_string, + ((TABLENS,'orientation'), None): cnv_string, + ((TABLENS,'page-breaks-on-group-change'), None): cnv_boolean, + ((TABLENS,'parse-sql-statement'), None): cnv_boolean, + ((TABLENS,'password'), None): cnv_string, + ((TABLENS,'position'), None): cnv_integer, + ((TABLENS,'precision-as-shown'), None): cnv_boolean, + ((TABLENS,'print'), None): cnv_boolean, + ((TABLENS,'print-ranges'), None): cnv_string, + ((TABLENS,'protect'), None): cnv_boolean, + ((TABLENS,'protected'), None): cnv_boolean, + ((TABLENS,'protection-key'), None): cnv_string, + ((TABLENS,'query-name'), None): cnv_string, + ((TABLENS,'range-usable-as'), None): cnv_string, + ((TABLENS,'refresh-delay'), None): cnv_boolean, + ((TABLENS,'refresh-delay'), None): cnv_duration, + ((TABLENS,'rejecting-change-id'), None): cnv_string, + ((TABLENS,'row'), None): cnv_integer, + ((TABLENS,'scenario-ranges'), None): cnv_string, + ((TABLENS,'search-criteria-must-apply-to-whole-cell'), None): cnv_boolean, + ((TABLENS,'selected-page'), None): cnv_string, + ((TABLENS,'show-details'), None): cnv_boolean, + ((TABLENS,'show-empty'), None): cnv_boolean, + ((TABLENS,'show-empty'), None): cnv_string, + ((TABLENS,'show-filter-button'), None): cnv_boolean, + ((TABLENS,'sort-mode'), None): cnv_string, + ((TABLENS,'source-cell-range-addresses'), None): cnv_string, + ((TABLENS,'source-cell-range-addresses'), None): cnv_string, + ((TABLENS,'source-field-name'), None): cnv_string, + ((TABLENS,'source-field-name'), None): cnv_string, + ((TABLENS,'source-name'), None): cnv_string, + ((TABLENS,'sql-statement'), None): cnv_string, + ((TABLENS,'start'), None): cnv_string, + ((TABLENS,'start-column'), None): cnv_integer, + ((TABLENS,'start-position'), None): cnv_integer, + ((TABLENS,'start-row'), None): cnv_integer, + ((TABLENS,'start-table'), None): cnv_integer, + ((TABLENS,'status'), None): cnv_string, + ((TABLENS,'step'), None): cnv_double, + ((TABLENS,'steps'), None): cnv_positiveInteger, + ((TABLENS,'structure-protected'), None): cnv_boolean, + ((TABLENS,'style-name'), None): cnv_StyleNameRef, + ((TABLENS,'table-background'), None): cnv_boolean, + ((TABLENS,'table'), None): cnv_integer, + ((TABLENS,'table-name'), None): cnv_string, + ((TABLENS,'target-cell-address'), None): cnv_string, + ((TABLENS,'target-cell-address'), None): cnv_string, + ((TABLENS,'target-range-address'), None): cnv_string, + ((TABLENS,'target-range-address'), None): cnv_string, + ((TABLENS,'title'), None): cnv_string, + ((TABLENS,'track-changes'), None): cnv_boolean, + ((TABLENS,'type'), None): cnv_string, + ((TABLENS,'use-labels'), None): cnv_string, + ((TABLENS,'use-regular-expressions'), None): cnv_boolean, + ((TABLENS,'used-hierarchy'), None): cnv_integer, + ((TABLENS,'user-name'), None): cnv_string, + ((TABLENS,'value'), None): cnv_string, + ((TABLENS,'value'), None): cnv_string, + ((TABLENS,'value-type'), None): cnv_string, + ((TABLENS,'visibility'), None): cnv_string, + ((TEXTNS,'active'), None): cnv_boolean, + ((TEXTNS,'address'), None): cnv_string, + ((TEXTNS,'alphabetical-separators'), None): cnv_boolean, + ((TEXTNS,'anchor-page-number'), None): cnv_positiveInteger, + ((TEXTNS,'anchor-type'), None): cnv_string, + ((TEXTNS,'animation'), None): cnv_string, + ((TEXTNS,'animation-delay'), None): cnv_string, + ((TEXTNS,'animation-direction'), None): cnv_string, + ((TEXTNS,'animation-repeat'), None): cnv_string, + ((TEXTNS,'animation-start-inside'), None): cnv_boolean, + ((TEXTNS,'animation-steps'), None): cnv_length, + ((TEXTNS,'animation-stop-inside'), None): cnv_boolean, + ((TEXTNS,'annote'), None): cnv_string, + ((TEXTNS,'author'), None): cnv_string, + ((TEXTNS,'bibliography-data-field'), None): cnv_string, + ((TEXTNS,'bibliography-type'), None): cnv_string, + ((TEXTNS,'booktitle'), None): cnv_string, + ((TEXTNS,'bullet-char'), None): cnv_string, + ((TEXTNS,'bullet-relative-size'), None): cnv_string, + ((TEXTNS,'c'), None): cnv_nonNegativeInteger, + ((TEXTNS,'capitalize-entries'), None): cnv_boolean, + ((TEXTNS,'caption-sequence-format'), None): cnv_string, + ((TEXTNS,'caption-sequence-name'), None): cnv_string, + ((TEXTNS,'change-id'), None): cnv_IDREF, + ((TEXTNS,'chapter'), None): cnv_string, + ((TEXTNS,'citation-body-style-name'), None): cnv_StyleNameRef, + ((TEXTNS,'citation-style-name'), None): cnv_StyleNameRef, + ((TEXTNS,'class-names'), None): cnv_NCNames, + ((TEXTNS,'column-name'), None): cnv_string, + ((TEXTNS,'combine-entries'), None): cnv_boolean, + ((TEXTNS,'combine-entries-with-dash'), None): cnv_boolean, + ((TEXTNS,'combine-entries-with-pp'), None): cnv_boolean, + ((TEXTNS,'comma-separated'), None): cnv_boolean, + ((TEXTNS,'cond-style-name'), None): cnv_StyleNameRef, + ((TEXTNS,'condition'), None): cnv_formula, + ((TEXTNS,'connection-name'), None): cnv_string, + ((TEXTNS,'consecutive-numbering'), None): cnv_boolean, + ((TEXTNS,'continue-numbering'), None): cnv_boolean, + ((TEXTNS,'copy-outline-levels'), None): cnv_boolean, + ((TEXTNS,'count-empty-lines'), None): cnv_boolean, + ((TEXTNS,'count-in-text-boxes'), None): cnv_boolean, + ((TEXTNS,'current-value'), None): cnv_boolean, + ((TEXTNS,'custom1'), None): cnv_string, + ((TEXTNS,'custom2'), None): cnv_string, + ((TEXTNS,'custom3'), None): cnv_string, + ((TEXTNS,'custom4'), None): cnv_string, + ((TEXTNS,'custom5'), None): cnv_string, + ((TEXTNS,'database-name'), None): cnv_string, + ((TEXTNS,'date-adjust'), None): cnv_duration, + ((TEXTNS,'date-value'), None): cnv_date, +# ((TEXTNS,u'date-value'), None): cnv_dateTime, + ((TEXTNS,'default-style-name'), None): cnv_StyleNameRef, + ((TEXTNS,'description'), None): cnv_string, + ((TEXTNS,'display'), None): cnv_string, + ((TEXTNS,'display-levels'), None): cnv_positiveInteger, + ((TEXTNS,'display-outline-level'), None): cnv_nonNegativeInteger, + ((TEXTNS,'dont-balance-text-columns'), None): cnv_boolean, + ((TEXTNS,'duration'), None): cnv_duration, + ((TEXTNS,'edition'), None): cnv_string, + ((TEXTNS,'editor'), None): cnv_string, + ((TEXTNS,'filter-name'), None): cnv_string, + ((TEXTNS,'first-row-end-column'), None): cnv_string, + ((TEXTNS,'first-row-start-column'), None): cnv_string, + ((TEXTNS,'fixed'), None): cnv_boolean, + ((TEXTNS,'footnotes-position'), None): cnv_string, + ((TEXTNS,'formula'), None): cnv_formula, + ((TEXTNS,'global'), None): cnv_boolean, + ((TEXTNS,'howpublished'), None): cnv_string, + ((TEXTNS,'id'), None): cnv_ID, +# ((TEXTNS,u'id'), None): cnv_string, + ((TEXTNS,'identifier'), None): cnv_string, + ((TEXTNS,'ignore-case'), None): cnv_boolean, + ((TEXTNS,'increment'), None): cnv_nonNegativeInteger, + ((TEXTNS,'index-name'), None): cnv_string, + ((TEXTNS,'index-scope'), None): cnv_string, + ((TEXTNS,'institution'), None): cnv_string, + ((TEXTNS,'is-hidden'), None): cnv_boolean, + ((TEXTNS,'is-list-header'), None): cnv_boolean, + ((TEXTNS,'isbn'), None): cnv_string, + ((TEXTNS,'issn'), None): cnv_string, + ((TEXTNS,'issn'), None): cnv_string, + ((TEXTNS,'journal'), None): cnv_string, + ((TEXTNS,'key'), None): cnv_string, + ((TEXTNS,'key1'), None): cnv_string, + ((TEXTNS,'key1-phonetic'), None): cnv_string, + ((TEXTNS,'key2'), None): cnv_string, + ((TEXTNS,'key2-phonetic'), None): cnv_string, + ((TEXTNS,'kind'), None): cnv_string, + ((TEXTNS,'label'), None): cnv_string, + ((TEXTNS,'last-row-end-column'), None): cnv_string, + ((TEXTNS,'last-row-start-column'), None): cnv_string, + ((TEXTNS,'level'), None): cnv_positiveInteger, + ((TEXTNS,'line-break'), None): cnv_boolean, + ((TEXTNS,'line-number'), None): cnv_string, + ((TEXTNS,'main-entry'), None): cnv_boolean, + ((TEXTNS,'main-entry-style-name'), None): cnv_StyleNameRef, + ((TEXTNS,'master-page-name'), None): cnv_StyleNameRef, + ((TEXTNS,'min-label-distance'), None): cnv_string, + ((TEXTNS,'min-label-width'), None): cnv_string, + ((TEXTNS,'month'), None): cnv_string, + ((TEXTNS,'name'), None): cnv_string, + ((TEXTNS,'note-class'), None): cnv_textnoteclass, + ((TEXTNS,'note'), None): cnv_string, + ((TEXTNS,'number'), None): cnv_string, + ((TEXTNS,'number-lines'), None): cnv_boolean, + ((TEXTNS,'number-position'), None): cnv_string, + ((TEXTNS,'numbered-entries'), None): cnv_boolean, + ((TEXTNS,'offset'), None): cnv_string, + ((TEXTNS,'organizations'), None): cnv_string, + ((TEXTNS,'outline-level'), None): cnv_string, + ((TEXTNS,'page-adjust'), None): cnv_integer, + ((TEXTNS,'pages'), None): cnv_string, + ((TEXTNS,'paragraph-style-name'), None): cnv_StyleNameRef, + ((TEXTNS,'placeholder-type'), None): cnv_string, + ((TEXTNS,'prefix'), None): cnv_string, + ((TEXTNS,'protected'), None): cnv_boolean, + ((TEXTNS,'protection-key'), None): cnv_string, + ((TEXTNS,'publisher'), None): cnv_string, + ((TEXTNS,'ref-name'), None): cnv_string, + ((TEXTNS,'reference-format'), None): cnv_string, + ((TEXTNS,'relative-tab-stop-position'), None): cnv_boolean, + ((TEXTNS,'report-type'), None): cnv_string, + ((TEXTNS,'restart-numbering'), None): cnv_boolean, + ((TEXTNS,'restart-on-page'), None): cnv_boolean, + ((TEXTNS,'row-number'), None): cnv_nonNegativeInteger, + ((TEXTNS,'school'), None): cnv_string, + ((TEXTNS,'section-name'), None): cnv_string, + ((TEXTNS,'select-page'), None): cnv_string, + ((TEXTNS,'separation-character'), None): cnv_string, + ((TEXTNS,'series'), None): cnv_string, + ((TEXTNS,'sort-algorithm'), None): cnv_string, + ((TEXTNS,'sort-ascending'), None): cnv_boolean, + ((TEXTNS,'sort-by-position'), None): cnv_boolean, + ((TEXTNS,'space-before'), None): cnv_string, + ((TEXTNS,'start-numbering-at'), None): cnv_string, + ((TEXTNS,'start-value'), None): cnv_nonNegativeInteger, + ((TEXTNS,'start-value'), None): cnv_positiveInteger, + ((TEXTNS,'string-value'), None): cnv_string, + ((TEXTNS,'string-value-if-false'), None): cnv_string, + ((TEXTNS,'string-value-if-true'), None): cnv_string, + ((TEXTNS,'string-value-phonetic'), None): cnv_string, + ((TEXTNS,'style-name'), None): cnv_StyleNameRef, + ((TEXTNS,'suffix'), None): cnv_string, + ((TEXTNS,'tab-ref'), None): cnv_nonNegativeInteger, + ((TEXTNS,'table-name'), None): cnv_string, + ((TEXTNS,'table-type'), None): cnv_string, + ((TEXTNS,'time-adjust'), None): cnv_duration, + ((TEXTNS,'time-value'), None): cnv_dateTime, + ((TEXTNS,'time-value'), None): cnv_time, + ((TEXTNS,'title'), None): cnv_string, + ((TEXTNS,'track-changes'), None): cnv_boolean, + ((TEXTNS,'url'), None): cnv_string, + ((TEXTNS,'use-caption'), None): cnv_boolean, + ((TEXTNS,'use-chart-objects'), None): cnv_boolean, + ((TEXTNS,'use-draw-objects'), None): cnv_boolean, + ((TEXTNS,'use-floating-frames'), None): cnv_boolean, + ((TEXTNS,'use-graphics'), None): cnv_boolean, + ((TEXTNS,'use-index-marks'), None): cnv_boolean, + ((TEXTNS,'use-index-source-styles'), None): cnv_boolean, + ((TEXTNS,'use-keys-as-entries'), None): cnv_boolean, + ((TEXTNS,'use-math-objects'), None): cnv_boolean, + ((TEXTNS,'use-objects'), None): cnv_boolean, + ((TEXTNS,'use-other-objects'), None): cnv_boolean, + ((TEXTNS,'use-outline-level'), None): cnv_boolean, + ((TEXTNS,'use-soft-page-breaks'), None): cnv_boolean, + ((TEXTNS,'use-spreadsheet-objects'), None): cnv_boolean, + ((TEXTNS,'use-tables'), None): cnv_boolean, + ((TEXTNS,'value'), None): cnv_nonNegativeInteger, + ((TEXTNS,'visited-style-name'), None): cnv_StyleNameRef, + ((TEXTNS,'volume'), None): cnv_string, + ((TEXTNS,'year'), None): cnv_string, + ((XFORMSNS,'bind'), None): cnv_string, + ((XLINKNS,'actuate'), None): cnv_string, + ((XLINKNS,'href'), None): cnv_anyURI, + ((XLINKNS,'show'), None): cnv_xlinkshow, + ((XLINKNS,'title'), None): cnv_string, + ((XLINKNS,'type'), None): cnv_string, +} + +class AttrConverters: + def convert(self, attribute, value, element): + """ Based on the element, figures out how to check/convert the attribute value + All values are converted to string + """ + conversion = attrconverters.get((attribute, element.qname), None) + if conversion is not None: + return conversion(attribute, value, element) + else: + conversion = attrconverters.get((attribute, None), None) + if conversion is not None: + return conversion(attribute, value, element) + return str(value) + diff --git a/tablib/packages/odf3/chart.py b/tablib/packages/odf3/chart.py new file mode 100644 index 0000000..a05e7e6 --- /dev/null +++ b/tablib/packages/odf3/chart.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from .namespaces import CHARTNS +from .element import Element + +# Autogenerated +def Axis(**args): + return Element(qname = (CHARTNS,'axis'), **args) + +def Categories(**args): + return Element(qname = (CHARTNS,'categories'), **args) + +def Chart(**args): + return Element(qname = (CHARTNS,'chart'), **args) + +def DataPoint(**args): + return Element(qname = (CHARTNS,'data-point'), **args) + +def Domain(**args): + return Element(qname = (CHARTNS,'domain'), **args) + +def ErrorIndicator(**args): + return Element(qname = (CHARTNS,'error-indicator'), **args) + +def Floor(**args): + return Element(qname = (CHARTNS,'floor'), **args) + +def Footer(**args): + return Element(qname = (CHARTNS,'footer'), **args) + +def Grid(**args): + return Element(qname = (CHARTNS,'grid'), **args) + +def Legend(**args): + return Element(qname = (CHARTNS,'legend'), **args) + +def MeanValue(**args): + return Element(qname = (CHARTNS,'mean-value'), **args) + +def PlotArea(**args): + return Element(qname = (CHARTNS,'plot-area'), **args) + +def RegressionCurve(**args): + return Element(qname = (CHARTNS,'regression-curve'), **args) + +def Series(**args): + return Element(qname = (CHARTNS,'series'), **args) + +def StockGainMarker(**args): + return Element(qname = (CHARTNS,'stock-gain-marker'), **args) + +def StockLossMarker(**args): + return Element(qname = (CHARTNS,'stock-loss-marker'), **args) + +def StockRangeLine(**args): + return Element(qname = (CHARTNS,'stock-range-line'), **args) + +def Subtitle(**args): + return Element(qname = (CHARTNS,'subtitle'), **args) + +def SymbolImage(**args): + return Element(qname = (CHARTNS,'symbol-image'), **args) + +def Title(**args): + return Element(qname = (CHARTNS,'title'), **args) + +def Wall(**args): + return Element(qname = (CHARTNS,'wall'), **args) + diff --git a/tablib/packages/odf3/config.py b/tablib/packages/odf3/config.py new file mode 100644 index 0000000..d73c530 --- /dev/null +++ b/tablib/packages/odf3/config.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from .namespaces import CONFIGNS +from .element import Element + +# Autogenerated +def ConfigItem(**args): + return Element(qname = (CONFIGNS, 'config-item'), **args) + +def ConfigItemMapEntry(**args): + return Element(qname = (CONFIGNS,'config-item-map-entry'), **args) + +def ConfigItemMapIndexed(**args): + return Element(qname = (CONFIGNS,'config-item-map-indexed'), **args) + +def ConfigItemMapNamed(**args): + return Element(qname = (CONFIGNS,'config-item-map-named'), **args) + +def ConfigItemSet(**args): + return Element(qname = (CONFIGNS, 'config-item-set'), **args) + diff --git a/tablib/packages/odf3/dc.py b/tablib/packages/odf3/dc.py new file mode 100644 index 0000000..387e6db --- /dev/null +++ b/tablib/packages/odf3/dc.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from .namespaces import DCNS +from .element import Element + +# Autogenerated +def Creator(**args): + return Element(qname = (DCNS,'creator'), **args) + +def Date(**args): + return Element(qname = (DCNS,'date'), **args) + +def Description(**args): + return Element(qname = (DCNS,'description'), **args) + +def Language(**args): + return Element(qname = (DCNS,'language'), **args) + +def Subject(**args): + return Element(qname = (DCNS,'subject'), **args) + +def Title(**args): + return Element(qname = (DCNS,'title'), **args) + +# The following complete the Dublin Core elements, but there is no +# guarantee a compliant implementation of OpenDocument will preserve +# these elements + +#def Contributor(**args): +# return Element(qname = (DCNS,'contributor'), **args) + +#def Coverage(**args): +# return Element(qname = (DCNS,'coverage'), **args) + +#def Format(**args): +# return Element(qname = (DCNS,'format'), **args) + +#def Identifier(**args): +# return Element(qname = (DCNS,'identifier'), **args) + +#def Publisher(**args): +# return Element(qname = (DCNS,'publisher'), **args) + +#def Relation(**args): +# return Element(qname = (DCNS,'relation'), **args) + +#def Rights(**args): +# return Element(qname = (DCNS,'rights'), **args) + +#def Source(**args): +# return Element(qname = (DCNS,'source'), **args) + +#def Type(**args): +# return Element(qname = (DCNS,'type'), **args) diff --git a/tablib/packages/odf3/dr3d.py b/tablib/packages/odf3/dr3d.py new file mode 100644 index 0000000..003c791 --- /dev/null +++ b/tablib/packages/odf3/dr3d.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from .namespaces import DR3DNS +from .element import Element +from .draw import StyleRefElement + +# Autogenerated +def Cube(**args): + return StyleRefElement(qname = (DR3DNS,'cube'), **args) + +def Extrude(**args): + return StyleRefElement(qname = (DR3DNS,'extrude'), **args) + +def Light(Element): + return StyleRefElement(qname = (DR3DNS,'light'), **args) + +def Rotate(**args): + return StyleRefElement(qname = (DR3DNS,'rotate'), **args) + +def Scene(**args): + return StyleRefElement(qname = (DR3DNS,'scene'), **args) + +def Sphere(**args): + return StyleRefElement(qname = (DR3DNS,'sphere'), **args) + diff --git a/tablib/packages/odf3/draw.py b/tablib/packages/odf3/draw.py new file mode 100644 index 0000000..6cc112e --- /dev/null +++ b/tablib/packages/odf3/draw.py @@ -0,0 +1,182 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from .namespaces import DRAWNS, STYLENS, PRESENTATIONNS +from .element import Element + +def StyleRefElement(stylename=None, classnames=None, **args): + qattrs = {} + if stylename is not None: + f = stylename.getAttrNS(STYLENS, 'family') + if f == 'graphic': + qattrs[(DRAWNS,'style-name')]= stylename + elif f == 'presentation': + qattrs[(PRESENTATIONNS,'style-name')]= stylename + else: + raise ValueError("Style's family must be either 'graphic' or 'presentation'") + if classnames is not None: + f = classnames[0].getAttrNS(STYLENS, 'family') + if f == 'graphic': + qattrs[(DRAWNS,'class-names')]= classnames + elif f == 'presentation': + qattrs[(PRESENTATIONNS,'class-names')]= classnames + else: + raise ValueError("Style's family must be either 'graphic' or 'presentation'") + return Element(qattributes=qattrs, **args) + +def DrawElement(name=None, **args): + e = Element(name=name, **args) + if 'displayname' not in args: + e.setAttrNS(DRAWNS,'display-name', name) + return e + +# Autogenerated +def A(**args): + return Element(qname = (DRAWNS,'a'), **args) + +def Applet(**args): + return Element(qname = (DRAWNS,'applet'), **args) + +def AreaCircle(**args): + return Element(qname = (DRAWNS,'area-circle'), **args) + +def AreaPolygon(**args): + return Element(qname = (DRAWNS,'area-polygon'), **args) + +def AreaRectangle(**args): + return Element(qname = (DRAWNS,'area-rectangle'), **args) + +def Caption(**args): + return StyleRefElement(qname = (DRAWNS,'caption'), **args) + +def Circle(**args): + return StyleRefElement(qname = (DRAWNS,'circle'), **args) + +def Connector(**args): + return StyleRefElement(qname = (DRAWNS,'connector'), **args) + +def ContourPath(**args): + return Element(qname = (DRAWNS,'contour-path'), **args) + +def ContourPolygon(**args): + return Element(qname = (DRAWNS,'contour-polygon'), **args) + +def Control(**args): + return StyleRefElement(qname = (DRAWNS,'control'), **args) + +def CustomShape(**args): + return StyleRefElement(qname = (DRAWNS,'custom-shape'), **args) + +def Ellipse(**args): + return StyleRefElement(qname = (DRAWNS,'ellipse'), **args) + +def EnhancedGeometry(**args): + return Element(qname = (DRAWNS,'enhanced-geometry'), **args) + +def Equation(**args): + return Element(qname = (DRAWNS,'equation'), **args) + +def FillImage(**args): + return DrawElement(qname = (DRAWNS,'fill-image'), **args) + +def FloatingFrame(**args): + return Element(qname = (DRAWNS,'floating-frame'), **args) + +def Frame(**args): + return StyleRefElement(qname = (DRAWNS,'frame'), **args) + +def G(**args): + return StyleRefElement(qname = (DRAWNS,'g'), **args) + +def GluePoint(**args): + return Element(qname = (DRAWNS,'glue-point'), **args) + +def Gradient(**args): + return DrawElement(qname = (DRAWNS,'gradient'), **args) + +def Handle(**args): + return Element(qname = (DRAWNS,'handle'), **args) + +def Hatch(**args): + return DrawElement(qname = (DRAWNS,'hatch'), **args) + +def Image(**args): + return Element(qname = (DRAWNS,'image'), **args) + +def ImageMap(**args): + return Element(qname = (DRAWNS,'image-map'), **args) + +def Layer(**args): + return Element(qname = (DRAWNS,'layer'), **args) + +def LayerSet(**args): + return Element(qname = (DRAWNS,'layer-set'), **args) + +def Line(**args): + return StyleRefElement(qname = (DRAWNS,'line'), **args) + +def Marker(**args): + return DrawElement(qname = (DRAWNS,'marker'), **args) + +def Measure(**args): + return StyleRefElement(qname = (DRAWNS,'measure'), **args) + +def Object(**args): + return Element(qname = (DRAWNS,'object'), **args) + +def ObjectOle(**args): + return Element(qname = (DRAWNS,'object-ole'), **args) + +def Opacity(**args): + return DrawElement(qname = (DRAWNS,'opacity'), **args) + +def Page(**args): + return Element(qname = (DRAWNS,'page'), **args) + +def PageThumbnail(**args): + return StyleRefElement(qname = (DRAWNS,'page-thumbnail'), **args) + +def Param(**args): + return Element(qname = (DRAWNS,'param'), **args) + +def Path(**args): + return StyleRefElement(qname = (DRAWNS,'path'), **args) + +def Plugin(**args): + return Element(qname = (DRAWNS,'plugin'), **args) + +def Polygon(**args): + return StyleRefElement(qname = (DRAWNS,'polygon'), **args) + +def Polyline(**args): + return StyleRefElement(qname = (DRAWNS,'polyline'), **args) + +def Rect(**args): + return StyleRefElement(qname = (DRAWNS,'rect'), **args) + +def RegularPolygon(**args): + return StyleRefElement(qname = (DRAWNS,'regular-polygon'), **args) + +def StrokeDash(**args): + return DrawElement(qname = (DRAWNS,'stroke-dash'), **args) + +def TextBox(**args): + return Element(qname = (DRAWNS,'text-box'), **args) + diff --git a/tablib/packages/odf3/easyliststyle.py b/tablib/packages/odf3/easyliststyle.py new file mode 100644 index 0000000..d676588 --- /dev/null +++ b/tablib/packages/odf3/easyliststyle.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- +# Create a element from a text string. +# Copyright (C) 2008 J. David Eisenberg +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Contributor(s): +# + +import re +from .style import Style, TextProperties, ListLevelProperties +from .text import ListStyle,ListLevelStyleNumber,ListLevelStyleBullet + +""" +Create a element from a string or array. + +List styles require a lot of code to create one level at a time. +These routines take a string and delimiter, or a list of +strings, and creates a element for you. +Each item in the string (or array) represents a list level + * style for levels 1-10.

      + * + *

      If an item contains 1, I, + * i, A, or a, then it is presumed + * to be a numbering style; otherwise it is a bulleted style.

      +""" + +_MAX_LIST_LEVEL = 10 +SHOW_ALL_LEVELS = True +SHOW_ONE_LEVEL = False + +def styleFromString(name, specifiers, delim, spacing, showAllLevels): + specArray = specifiers.split(delim) + return styleFromList( name, specArray, spacing, showAllLevels ) + +def styleFromList( styleName, specArray, spacing, showAllLevels): + bullet = "" + numPrefix = "" + numSuffix = "" + numberFormat = "" + cssLengthNum = 0 + cssLengthUnits = "" + numbered = False + displayLevels = 0 + listStyle = ListStyle(name=styleName) + numFormatPattern = re.compile("([1IiAa])") + cssLengthPattern = re.compile("([^a-z]+)\\s*([a-z]+)?") + m = cssLengthPattern.search( spacing ) + if (m != None): + cssLengthNum = float(m.group(1)) + if (m.lastindex == 2): + cssLengthUnits = m.group(2) + i = 0 + while i < len(specArray): + specification = specArray[i] + m = numFormatPattern.search(specification) + if (m != None): + numberFormat = m.group(1) + numPrefix = specification[0:m.start(1)] + numSuffix = specification[m.end(1):] + bullet = "" + numbered = True + if (showAllLevels): + displayLevels = i + 1 + else: + displayLevels = 1 + else: # it's a bullet style + bullet = specification + numPrefix = "" + numSuffix = "" + numberFormat = "" + displayLevels = 1 + numbered = False + if (numbered): + lls = ListLevelStyleNumber(level=(i+1)) + if (numPrefix != ''): + lls.setAttribute('numprefix', numPrefix) + if (numSuffix != ''): + lls.setAttribute('numsuffix', numSuffix) + lls.setAttribute('displaylevels', displayLevels) + else: + lls = ListLevelStyleBullet(level=(i+1),bulletchar=bullet[0]) + llp = ListLevelProperties() + llp.setAttribute('spacebefore', str(cssLengthNum * (i+1)) + cssLengthUnits) + llp.setAttribute('minlabelwidth', str(cssLengthNum) + cssLengthUnits) + lls.addElement( llp ) + listStyle.addElement(lls) + i += 1 + return listStyle + +# vim: set expandtab sw=4 : diff --git a/tablib/packages/odf3/element.py b/tablib/packages/odf3/element.py new file mode 100644 index 0000000..00ea088 --- /dev/null +++ b/tablib/packages/odf3/element.py @@ -0,0 +1,513 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2010 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +# Note: This script has copied a lot of text from xml.dom.minidom. +# Whatever license applies to that file also applies to this file. +# +import xml.dom +from xml.dom.minicompat import * +from .namespaces import nsdict +from . import grammar +from .attrconverters import AttrConverters + +# The following code is pasted form xml.sax.saxutils +# Tt makes it possible to run the code without the xml sax package installed +# To make it possible to have in your text elements, it is necessary to escape the texts +def _escape(data, entities={}): + """ Escape &, <, and > in a string of data. + + You can escape other strings of data by passing a dictionary as + the optional entities parameter. The keys and values must all be + strings; each key will be replaced with its corresponding value. + """ + data = data.replace("&", "&") + data = data.replace("<", "<") + data = data.replace(">", ">") + for chars, entity in list(entities.items()): + data = data.replace(chars, entity) + return data + +def _quoteattr(data, entities={}): + """ Escape and quote an attribute value. + + Escape &, <, and > in a string of data, then quote it for use as + an attribute value. The \" character will be escaped as well, if + necessary. + + You can escape other strings of data by passing a dictionary as + the optional entities parameter. The keys and values must all be + strings; each key will be replaced with its corresponding value. + """ + entities['\n']=' ' + entities['\r']=' ' + data = _escape(data, entities) + if '"' in data: + if "'" in data: + data = '"%s"' % data.replace('"', """) + else: + data = "'%s'" % data + else: + data = '"%s"' % data + return data + +def _nssplit(qualifiedName): + """ Split a qualified name into namespace part and local part. """ + fields = qualifiedName.split(':', 1) + if len(fields) == 2: + return fields + else: + return (None, fields[0]) + +def _nsassign(namespace): + return nsdict.setdefault(namespace,"ns" + str(len(nsdict))) + +# Exceptions +class IllegalChild(Exception): + """ Complains if you add an element to a parent where it is not allowed """ +class IllegalText(Exception): + """ Complains if you add text or cdata to an element where it is not allowed """ + +class Node(xml.dom.Node): + """ super class for more specific nodes """ + parentNode = None + nextSibling = None + previousSibling = None + + def hasChildNodes(self): + """ Tells whether this element has any children; text nodes, + subelements, whatever. + """ + if self.childNodes: + return True + else: + return False + + def _get_childNodes(self): + return self.childNodes + + def _get_firstChild(self): + if self.childNodes: + return self.childNodes[0] + + def _get_lastChild(self): + if self.childNodes: + return self.childNodes[-1] + + def insertBefore(self, newChild, refChild): + """ Inserts the node newChild before the existing child node refChild. + If refChild is null, insert newChild at the end of the list of children. + """ + if newChild.nodeType not in self._child_node_types: + raise IllegalChild("%s cannot be child of %s" % (newChild.tagName, self.tagName)) + if newChild.parentNode is not None: + newChild.parentNode.removeChild(newChild) + if refChild is None: + self.appendChild(newChild) + else: + try: + index = self.childNodes.index(refChild) + except ValueError: + raise xml.dom.NotFoundErr() + self.childNodes.insert(index, newChild) + newChild.nextSibling = refChild + refChild.previousSibling = newChild + if index: + node = self.childNodes[index-1] + node.nextSibling = newChild + newChild.previousSibling = node + else: + newChild.previousSibling = None + newChild.parentNode = self + return newChild + + def appendChild(self, newChild): + """ Adds the node newChild to the end of the list of children of this node. + If the newChild is already in the tree, it is first removed. + """ + if newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE: + for c in tuple(newChild.childNodes): + self.appendChild(c) + ### The DOM does not clearly specify what to return in this case + return newChild + if newChild.nodeType not in self._child_node_types: + raise IllegalChild("<%s> is not allowed in %s" % ( newChild.tagName, self.tagName)) + if newChild.parentNode is not None: + newChild.parentNode.removeChild(newChild) + _append_child(self, newChild) + newChild.nextSibling = None + return newChild + + def removeChild(self, oldChild): + """ Removes the child node indicated by oldChild from the list of children, and returns it. + """ + #FIXME: update ownerDocument.element_dict or find other solution + try: + self.childNodes.remove(oldChild) + except ValueError: + raise xml.dom.NotFoundErr() + if oldChild.nextSibling is not None: + oldChild.nextSibling.previousSibling = oldChild.previousSibling + if oldChild.previousSibling is not None: + oldChild.previousSibling.nextSibling = oldChild.nextSibling + oldChild.nextSibling = oldChild.previousSibling = None + if self.ownerDocument: + self.ownerDocument.clear_caches() + oldChild.parentNode = None + return oldChild + + def __str__(self): + val = [] + for c in self.childNodes: + val.append(str(c)) + return ''.join(val) + + def __unicode__(self): + val = [] + for c in self.childNodes: + val.append(str(c)) + return ''.join(val) + +defproperty(Node, "firstChild", doc="First child node, or None.") +defproperty(Node, "lastChild", doc="Last child node, or None.") + +def _append_child(self, node): + # fast path with less checks; usable by DOM builders if careful + childNodes = self.childNodes + if childNodes: + last = childNodes[-1] + node.__dict__["previousSibling"] = last + last.__dict__["nextSibling"] = node + childNodes.append(node) + node.__dict__["parentNode"] = self + +class Childless: + """ Mixin that makes childless-ness easy to implement and avoids + the complexity of the Node methods that deal with children. + """ + + attributes = None + childNodes = EmptyNodeList() + firstChild = None + lastChild = None + + def _get_firstChild(self): + return None + + def _get_lastChild(self): + return None + + def appendChild(self, node): + """ Raises an error """ + raise xml.dom.HierarchyRequestErr( + self.tagName + " nodes cannot have children") + + def hasChildNodes(self): + return False + + def insertBefore(self, newChild, refChild): + """ Raises an error """ + raise xml.dom.HierarchyRequestErr( + self.tagName + " nodes do not have children") + + def removeChild(self, oldChild): + """ Raises an error """ + raise xml.dom.NotFoundErr( + self.tagName + " nodes do not have children") + + def replaceChild(self, newChild, oldChild): + """ Raises an error """ + raise xml.dom.HierarchyRequestErr( + self.tagName + " nodes do not have children") + +class Text(Childless, Node): + nodeType = Node.TEXT_NODE + tagName = "Text" + + def __init__(self, data): + self.data = data + + def __str__(self): + return self.data.encode() + + def __unicode__(self): + return self.data + + def toXml(self,level,f): + """ Write XML in UTF-8 """ + if self.data: + f.write(_escape(str(self.data).encode('utf-8'))) + +class CDATASection(Childless, Text): + nodeType = Node.CDATA_SECTION_NODE + + def toXml(self,level,f): + """ Generate XML output of the node. If the text contains "]]>", then + escape it by going out of CDATA mode (]]>), then write the string + and then go into CDATA mode again. (' % self.data.replace(']]>',']]>]]>" % (r[1].lower().replace('-',''), self.tagName)) + + def get_knownns(self, prefix): + """ Odfpy maintains a list of known namespaces. In some cases a prefix is used, and + we need to know which namespace it resolves to. + """ + global nsdict + for ns,p in list(nsdict.items()): + if p == prefix: return ns + return None + + def get_nsprefix(self, namespace): + """ Odfpy maintains a list of known namespaces. In some cases we have a namespace URL, + and needs to look up or assign the prefix for it. + """ + if namespace is None: namespace = "" + prefix = _nsassign(namespace) + if namespace not in self.namespaces: + self.namespaces[namespace] = prefix + return prefix + + def allowed_attributes(self): + return grammar.allowed_attributes.get(self.qname) + + def _setOwnerDoc(self, element): + element.ownerDocument = self.ownerDocument + for child in element.childNodes: + self._setOwnerDoc(child) + + def addElement(self, element, check_grammar=True): + """ adds an element to an Element + + Element.addElement(Element) + """ + if check_grammar and self.allowed_children is not None: + if element.qname not in self.allowed_children: + raise IllegalChild("<%s> is not allowed in <%s>" % ( element.tagName, self.tagName)) + self.appendChild(element) + self._setOwnerDoc(element) + if self.ownerDocument: + self.ownerDocument.rebuild_caches(element) + + def addText(self, text, check_grammar=True): + """ Adds text to an element + Setting check_grammar=False turns off grammar checking + """ + if check_grammar and self.qname not in grammar.allows_text: + raise IllegalText("The <%s> element does not allow text" % self.tagName) + else: + if text != '': + self.appendChild(Text(text)) + + def addCDATA(self, cdata, check_grammar=True): + """ Adds CDATA to an element + Setting check_grammar=False turns off grammar checking + """ + if check_grammar and self.qname not in grammar.allows_text: + raise IllegalText("The <%s> element does not allow text" % self.tagName) + else: + self.appendChild(CDATASection(cdata)) + + def removeAttribute(self, attr, check_grammar=True): + """ Removes an attribute by name. """ + allowed_attrs = self.allowed_attributes() + if allowed_attrs is None: + if type(attr) == type(()): + prefix, localname = attr + self.removeAttrNS(prefix, localname) + else: + raise AttributeError("Unable to add simple attribute - use (namespace, localpart)") + else: + # Construct a list of allowed arguments + allowed_args = [ a[1].lower().replace('-','') for a in allowed_attrs] + if check_grammar and attr not in allowed_args: + raise AttributeError("Attribute %s is not allowed in <%s>" % ( attr, self.tagName)) + i = allowed_args.index(attr) + self.removeAttrNS(allowed_attrs[i][0], allowed_attrs[i][1]) + + def setAttribute(self, attr, value, check_grammar=True): + """ Add an attribute to the element + This is sort of a convenience method. All attributes in ODF have + namespaces. The library knows what attributes are legal and then allows + the user to provide the attribute as a keyword argument and the + library will add the correct namespace. + Must overwrite, If attribute already exists. + """ + allowed_attrs = self.allowed_attributes() + if allowed_attrs is None: + if type(attr) == type(()): + prefix, localname = attr + self.setAttrNS(prefix, localname, value) + else: + raise AttributeError("Unable to add simple attribute - use (namespace, localpart)") + else: + # Construct a list of allowed arguments + allowed_args = [ a[1].lower().replace('-','') for a in allowed_attrs] + if check_grammar and attr not in allowed_args: + raise AttributeError("Attribute %s is not allowed in <%s>" % ( attr, self.tagName)) + i = allowed_args.index(attr) + self.setAttrNS(allowed_attrs[i][0], allowed_attrs[i][1], value) + + def setAttrNS(self, namespace, localpart, value): + """ Add an attribute to the element + In case you need to add an attribute the library doesn't know about + then you must provide the full qualified name + It will not check that the attribute is legal according to the schema. + Must overwrite, If attribute already exists. + """ + allowed_attrs = self.allowed_attributes() + prefix = self.get_nsprefix(namespace) +# if allowed_attrs and (namespace, localpart) not in allowed_attrs: +# raise AttributeError, "Attribute %s:%s is not allowed in element <%s>" % ( prefix, localpart, self.tagName) + c = AttrConverters() + self.attributes[(namespace, localpart)] = c.convert((namespace, localpart), value, self) + + def getAttrNS(self, namespace, localpart): + prefix = self.get_nsprefix(namespace) + return self.attributes.get((namespace, localpart)) + + def removeAttrNS(self, namespace, localpart): + del self.attributes[(namespace, localpart)] + + def getAttribute(self, attr): + """ Get an attribute value. The method knows which namespace the attribute is in + """ + allowed_attrs = self.allowed_attributes() + if allowed_attrs is None: + if type(attr) == type(()): + prefix, localname = attr + return self.getAttrNS(prefix, localname) + else: + raise AttributeError("Unable to get simple attribute - use (namespace, localpart)") + else: + # Construct a list of allowed arguments + allowed_args = [ a[1].lower().replace('-','') for a in allowed_attrs] + i = allowed_args.index(attr) + return self.getAttrNS(allowed_attrs[i][0], allowed_attrs[i][1]) + + def write_open_tag(self, level, f): + f.write('<'+self.tagName) + if level == 0: + for namespace, prefix in list(self.namespaces.items()): + f.write(' xmlns:' + prefix + '="'+ _escape(str(namespace))+'"') + for qname in list(self.attributes.keys()): + prefix = self.get_nsprefix(qname[0]) + f.write(' '+_escape(str(prefix+':'+qname[1]))+'='+_quoteattr(str(self.attributes[qname]).encode('utf-8'))) + f.write('>') + + def write_close_tag(self, level, f): + f.write('') + + def toXml(self, level, f): + """ Generate XML stream out of the tree structure """ + f.write('<'+self.tagName) + if level == 0: + for namespace, prefix in list(self.namespaces.items()): + f.write(' xmlns:' + prefix + '="'+ _escape(str(namespace))+'"') + for qname in list(self.attributes.keys()): + prefix = self.get_nsprefix(qname[0]) + f.write(' '+_escape(str(prefix+':'+qname[1]))+'='+_quoteattr(str(self.attributes[qname]).encode('utf-8'))) + if self.childNodes: + f.write('>') + for element in self.childNodes: + element.toXml(level+1,f) + f.write('') + else: + f.write('/>') + + def _getElementsByObj(self, obj, accumulator): + if self.qname == obj.qname: + accumulator.append(self) + for e in self.childNodes: + if e.nodeType == Node.ELEMENT_NODE: + accumulator = e._getElementsByObj(obj, accumulator) + return accumulator + + def getElementsByType(self, element): + """ Gets elements based on the type, which is function from text.py, draw.py etc. """ + obj = element(check_grammar=False) + return self._getElementsByObj(obj,[]) + + def isInstanceOf(self, element): + """ This is a check to see if the object is an instance of a type """ + obj = element(check_grammar=False) + return self.qname == obj.qname + + diff --git a/tablib/packages/odf3/elementtypes.py b/tablib/packages/odf3/elementtypes.py new file mode 100644 index 0000000..b9aa5e4 --- /dev/null +++ b/tablib/packages/odf3/elementtypes.py @@ -0,0 +1,325 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright (C) 2008 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from .namespaces import * + +# Inline element don't cause a box +# They are analogous to the HTML elements SPAN, B, I etc. +inline_elements = ( + (TEXTNS,'a'), + (TEXTNS,'author-initials'), + (TEXTNS,'author-name'), + (TEXTNS,'bibliography-mark'), + (TEXTNS,'bookmark-ref'), + (TEXTNS,'chapter'), + (TEXTNS,'character-count'), + (TEXTNS,'conditional-text'), + (TEXTNS,'creation-date'), + (TEXTNS,'creation-time'), + (TEXTNS,'creator'), + (TEXTNS,'database-display'), + (TEXTNS,'database-name'), + (TEXTNS,'database-next'), + (TEXTNS,'database-row-number'), + (TEXTNS,'database-row-select'), + (TEXTNS,'date'), + (TEXTNS,'dde-connection'), + (TEXTNS,'description'), + (TEXTNS,'editing-cycles'), + (TEXTNS,'editing-duration'), + (TEXTNS,'execute-macro'), + (TEXTNS,'expression'), + (TEXTNS,'file-name'), + (TEXTNS,'hidden-paragraph'), + (TEXTNS,'hidden-text'), + (TEXTNS,'image-count'), + (TEXTNS,'initial-creator'), + (TEXTNS,'keywords'), + (TEXTNS,'measure'), + (TEXTNS,'modification-date'), + (TEXTNS,'modification-time'), + (TEXTNS,'note-ref'), + (TEXTNS,'object-count'), + (TEXTNS,'page-continuation'), + (TEXTNS,'page-count'), + (TEXTNS,'page-number'), + (TEXTNS,'page-variable-get'), + (TEXTNS,'page-variable-set'), + (TEXTNS,'paragraph-count'), + (TEXTNS,'placeholder'), + (TEXTNS,'print-date'), + (TEXTNS,'printed-by'), + (TEXTNS,'print-time'), + (TEXTNS,'reference-ref'), + (TEXTNS,'ruby'), + (TEXTNS,'ruby-base'), + (TEXTNS,'ruby-text'), + (TEXTNS,'script'), + (TEXTNS,'sender-city'), + (TEXTNS,'sender-company'), + (TEXTNS,'sender-country'), + (TEXTNS,'sender-email'), + (TEXTNS,'sender-fax'), + (TEXTNS,'sender-firstname'), + (TEXTNS,'sender-initials'), + (TEXTNS,'sender-lastname'), + (TEXTNS,'sender-phone-private'), + (TEXTNS,'sender-phone-work'), + (TEXTNS,'sender-position'), + (TEXTNS,'sender-postal-code'), + (TEXTNS,'sender-state-or-province'), + (TEXTNS,'sender-street'), + (TEXTNS,'sender-title'), + (TEXTNS,'sequence'), + (TEXTNS,'sequence-ref'), + (TEXTNS,'sheet-name'), + (TEXTNS,'span'), + (TEXTNS,'subject'), + (TEXTNS,'table-count'), + (TEXTNS,'table-formula'), + (TEXTNS,'template-name'), + (TEXTNS,'text-input'), + (TEXTNS,'time'), + (TEXTNS,'title'), + (TEXTNS,'user-defined'), + (TEXTNS,'user-field-get'), + (TEXTNS,'user-field-input'), + (TEXTNS,'variable-get'), + (TEXTNS,'variable-input'), + (TEXTNS,'variable-set'), + (TEXTNS,'word-count'), +) + + +# It is almost impossible to determine what elements are block elements. +# There are so many that don't fit the form +block_elements = ( + (TEXTNS,'h'), + (TEXTNS,'p'), + (TEXTNS,'list'), + (TEXTNS,'list-item'), + (TEXTNS,'section'), +) + +declarative_elements = ( + (OFFICENS,'font-face-decls'), + (PRESENTATIONNS,'date-time-decl'), + (PRESENTATIONNS,'footer-decl'), + (PRESENTATIONNS,'header-decl'), + (TABLENS,'table-template'), + (TEXTNS,'alphabetical-index-entry-template'), + (TEXTNS,'alphabetical-index-source'), + (TEXTNS,'bibliography-entry-template'), + (TEXTNS,'bibliography-source'), + (TEXTNS,'dde-connection-decls'), + (TEXTNS,'illustration-index-entry-template'), + (TEXTNS,'illustration-index-source'), + (TEXTNS,'index-source-styles'), + (TEXTNS,'index-title-template'), + (TEXTNS,'note-continuation-notice-backward'), + (TEXTNS,'note-continuation-notice-forward'), + (TEXTNS,'notes-configuration'), + (TEXTNS,'object-index-entry-template'), + (TEXTNS,'object-index-source'), + (TEXTNS,'sequence-decls'), + (TEXTNS,'table-index-entry-template'), + (TEXTNS,'table-index-source'), + (TEXTNS,'table-of-content-entry-template'), + (TEXTNS,'table-of-content-source'), + (TEXTNS,'user-field-decls'), + (TEXTNS,'user-index-entry-template'), + (TEXTNS,'user-index-source'), + (TEXTNS,'variable-decls'), +) + +empty_elements = ( + (ANIMNS,'animate'), + (ANIMNS,'animateColor'), + (ANIMNS,'animateMotion'), + (ANIMNS,'animateTransform'), + (ANIMNS,'audio'), + (ANIMNS,'param'), + (ANIMNS,'set'), + (ANIMNS,'transitionFilter'), + (CHARTNS,'categories'), + (CHARTNS,'data-point'), + (CHARTNS,'domain'), + (CHARTNS,'error-indicator'), + (CHARTNS,'floor'), + (CHARTNS,'grid'), + (CHARTNS,'legend'), + (CHARTNS,'mean-value'), + (CHARTNS,'regression-curve'), + (CHARTNS,'stock-gain-marker'), + (CHARTNS,'stock-loss-marker'), + (CHARTNS,'stock-range-line'), + (CHARTNS,'symbol-image'), + (CHARTNS,'wall'), + (DR3DNS,'cube'), + (DR3DNS,'extrude'), + (DR3DNS,'light'), + (DR3DNS,'rotate'), + (DR3DNS,'sphere'), + (DRAWNS,'contour-path'), + (DRAWNS,'contour-polygon'), + (DRAWNS,'equation'), + (DRAWNS,'fill-image'), + (DRAWNS,'floating-frame'), + (DRAWNS,'glue-point'), + (DRAWNS,'gradient'), + (DRAWNS,'handle'), + (DRAWNS,'hatch'), + (DRAWNS,'layer'), + (DRAWNS,'marker'), + (DRAWNS,'opacity'), + (DRAWNS,'page-thumbnail'), + (DRAWNS,'param'), + (DRAWNS,'stroke-dash'), + (FORMNS,'connection-resource'), + (FORMNS,'list-value'), + (FORMNS,'property'), + (MANIFESTNS,'algorithm'), + (MANIFESTNS,'key-derivation'), + (METANS,'auto-reload'), + (METANS,'document-statistic'), + (METANS,'hyperlink-behaviour'), + (METANS,'template'), + (NUMBERNS,'am-pm'), + (NUMBERNS,'boolean'), + (NUMBERNS,'day'), + (NUMBERNS,'day-of-week'), + (NUMBERNS,'era'), + (NUMBERNS,'fraction'), + (NUMBERNS,'hours'), + (NUMBERNS,'minutes'), + (NUMBERNS,'month'), + (NUMBERNS,'quarter'), + (NUMBERNS,'scientific-number'), + (NUMBERNS,'seconds'), + (NUMBERNS,'text-content'), + (NUMBERNS,'week-of-year'), + (NUMBERNS,'year'), + (OFFICENS,'dde-source'), + (PRESENTATIONNS,'date-time'), + (PRESENTATIONNS,'footer'), + (PRESENTATIONNS,'header'), + (PRESENTATIONNS,'placeholder'), + (PRESENTATIONNS,'play'), + (PRESENTATIONNS,'show'), + (PRESENTATIONNS,'sound'), + (SCRIPTNS,'event-listener'), + (STYLENS,'column'), + (STYLENS,'column-sep'), + (STYLENS,'drop-cap'), + (STYLENS,'footnote-sep'), + (STYLENS,'list-level-properties'), + (STYLENS,'map'), + (STYLENS,'ruby-properties'), + (STYLENS,'table-column-properties'), + (STYLENS,'tab-stop'), + (STYLENS,'text-properties'), + (SVGNS,'definition-src'), + (SVGNS,'font-face-format'), + (SVGNS,'font-face-name'), + (SVGNS,'stop'), + (TABLENS,'body'), + (TABLENS,'cell-address'), + (TABLENS,'cell-range-source'), + (TABLENS,'change-deletion'), + (TABLENS,'consolidation'), + (TABLENS,'database-source-query'), + (TABLENS,'database-source-sql'), + (TABLENS,'database-source-table'), + (TABLENS,'data-pilot-display-info'), + (TABLENS,'data-pilot-field-reference'), + (TABLENS,'data-pilot-group-member'), + (TABLENS,'data-pilot-layout-info'), + (TABLENS,'data-pilot-member'), + (TABLENS,'data-pilot-sort-info'), + (TABLENS,'data-pilot-subtotal'), + (TABLENS,'dependency'), + (TABLENS,'error-macro'), + (TABLENS,'even-columns'), + (TABLENS,'even-rows'), + (TABLENS,'filter-condition'), + (TABLENS,'first-column'), + (TABLENS,'first-row'), + (TABLENS,'highlighted-range'), + (TABLENS,'insertion-cut-off'), + (TABLENS,'iteration'), + (TABLENS,'label-range'), + (TABLENS,'last-column'), + (TABLENS,'last-row'), + (TABLENS,'movement-cut-off'), + (TABLENS,'named-expression'), + (TABLENS,'named-range'), + (TABLENS,'null-date'), + (TABLENS,'odd-columns'), + (TABLENS,'odd-rows'), + (TABLENS,'operation'), + (TABLENS,'scenario'), + (TABLENS,'sort-by'), + (TABLENS,'sort-groups'), + (TABLENS,'source-range-address'), + (TABLENS,'source-service'), + (TABLENS,'subtotal-field'), + (TABLENS,'table-column'), + (TABLENS,'table-source'), + (TABLENS,'target-range-address'), + (TEXTNS,'alphabetical-index-auto-mark-file'), + (TEXTNS,'alphabetical-index-mark'), + (TEXTNS,'alphabetical-index-mark-end'), + (TEXTNS,'alphabetical-index-mark-start'), + (TEXTNS,'bookmark'), + (TEXTNS,'bookmark-end'), + (TEXTNS,'bookmark-start'), + (TEXTNS,'change'), + (TEXTNS,'change-end'), + (TEXTNS,'change-start'), + (TEXTNS,'dde-connection-decl'), + (TEXTNS,'index-entry-bibliography'), + (TEXTNS,'index-entry-chapter'), + (TEXTNS,'index-entry-link-end'), + (TEXTNS,'index-entry-link-start'), + (TEXTNS,'index-entry-page-number'), + (TEXTNS,'index-entry-tab-stop'), + (TEXTNS,'index-entry-text'), + (TEXTNS,'index-source-style'), + (TEXTNS,'line-break'), + (TEXTNS,'page'), + (TEXTNS,'reference-mark'), + (TEXTNS,'reference-mark-end'), + (TEXTNS,'reference-mark-start'), + (TEXTNS,'s'), + (TEXTNS,'section-source'), + (TEXTNS,'sequence-decl'), + (TEXTNS,'soft-page-break'), + (TEXTNS,'sort-key'), + (TEXTNS,'tab'), + (TEXTNS,'toc-mark'), + (TEXTNS,'toc-mark-end'), + (TEXTNS,'toc-mark-start'), + (TEXTNS,'user-field-decl'), + (TEXTNS,'user-index-mark'), + (TEXTNS,'user-index-mark-end'), + (TEXTNS,'user-index-mark-start'), + (TEXTNS,'variable-decl') +) diff --git a/tablib/packages/odf3/form.py b/tablib/packages/odf3/form.py new file mode 100644 index 0000000..8b5a359 --- /dev/null +++ b/tablib/packages/odf3/form.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from .namespaces import FORMNS +from .element import Element + + +# Autogenerated +def Button(**args): + return Element(qname = (FORMNS,'button'), **args) + +def Checkbox(**args): + return Element(qname = (FORMNS,'checkbox'), **args) + +def Column(**args): + return Element(qname = (FORMNS,'column'), **args) + +def Combobox(**args): + return Element(qname = (FORMNS,'combobox'), **args) + +def ConnectionResource(**args): + return Element(qname = (FORMNS,'connection-resource'), **args) + +def Date(**args): + return Element(qname = (FORMNS,'date'), **args) + +def File(**args): + return Element(qname = (FORMNS,'file'), **args) + +def FixedText(**args): + return Element(qname = (FORMNS,'fixed-text'), **args) + +def Form(**args): + return Element(qname = (FORMNS,'form'), **args) + +def FormattedText(**args): + return Element(qname = (FORMNS,'formatted-text'), **args) + +def Frame(**args): + return Element(qname = (FORMNS,'frame'), **args) + +def GenericControl(**args): + return Element(qname = (FORMNS,'generic-control'), **args) + +def Grid(**args): + return Element(qname = (FORMNS,'grid'), **args) + +def Hidden(**args): + return Element(qname = (FORMNS,'hidden'), **args) + +def Image(**args): + return Element(qname = (FORMNS,'image'), **args) + +def ImageFrame(**args): + return Element(qname = (FORMNS,'image-frame'), **args) + +def Item(**args): + return Element(qname = (FORMNS,'item'), **args) + +def ListProperty(**args): + return Element(qname = (FORMNS,'list-property'), **args) + +def ListValue(**args): + return Element(qname = (FORMNS,'list-value'), **args) + +def Listbox(**args): + return Element(qname = (FORMNS,'listbox'), **args) + +def Number(**args): + return Element(qname = (FORMNS,'number'), **args) + +def Option(**args): + return Element(qname = (FORMNS,'option'), **args) + +def Password(**args): + return Element(qname = (FORMNS,'password'), **args) + +def Properties(**args): + return Element(qname = (FORMNS,'properties'), **args) + +def Property(**args): + return Element(qname = (FORMNS,'property'), **args) + +def Radio(**args): + return Element(qname = (FORMNS,'radio'), **args) + +def Text(**args): + return Element(qname = (FORMNS,'text'), **args) + +def Textarea(**args): + return Element(qname = (FORMNS,'textarea'), **args) + +def Time(**args): + return Element(qname = (FORMNS,'time'), **args) + +def ValueRange(**args): + return Element(qname = (FORMNS,'value-range'), **args) + diff --git a/tablib/packages/odf3/grammar.py b/tablib/packages/odf3/grammar.py new file mode 100644 index 0000000..04b57ff --- /dev/null +++ b/tablib/packages/odf3/grammar.py @@ -0,0 +1,8426 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2010 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +__doc__=""" In principle the OpenDocument schema converted to python structures. +Currently it contains the legal child elements of a given element. +To be used for validation check in the API +""" + +from .namespaces import * + +# The following code is generated from the RelaxNG schema with this notice: + +# OASIS OpenDocument v1.1 +# OASIS Standard, 1 Feb 2007 +# Relax-NG Schema + +# $Id$ + +# © 2002-2007 OASIS Open +# © 1999-2007 Sun Microsystems, Inc. + +# This document and translations of it may be copied and furnished +# to others, and derivative works that comment on or otherwise explain +# it or assist in its implementation may be prepared, copied, +# published and distributed, in whole or in part, without restriction +# of any kind, provided that the above copyright notice and this +# paragraph are included on all such copies and derivative works. +# However, this document itself does not be modified in any way, such +# as by removing the copyright notice or references to OASIS, except +# as needed for the purpose of developing OASIS specifications, in +# which case the procedures for copyrights defined in the OASIS +# Intellectual Property Rights document must be followed, or as +# required to translate it into languages other than English. +# + +allowed_children = { + (DCNS,'creator') : ( + ), + (DCNS,'date') : ( + ), + (DCNS,'description') : ( + ), + (DCNS,'language') : ( + ), + (DCNS,'subject') : ( + ), + (DCNS,'title') : ( + ), +# Completes Dublin Core start +# (DCNS,'contributor') : ( +# ), +# (DCNS,'coverage') : ( +# ), +# (DCNS,'format') : ( +# ), +# (DCNS,'identifier') : ( +# ), +# (DCNS,'publisher') : ( +# ), +# (DCNS,'relation') : ( +# ), +# (DCNS,'rights') : ( +# ), +# (DCNS,'source') : ( +# ), +# (DCNS,'type') : ( +# ), +# Completes Dublin Core end + (MATHNS,'math') : None, + + (XFORMSNS,'model') : None, + + (ANIMNS,'animate') : ( + ), + (ANIMNS,'animateColor') : ( + ), + (ANIMNS,'animateMotion') : ( + ), + (ANIMNS,'animateTransform') : ( + ), + (ANIMNS,'audio') : ( + ), + (ANIMNS,'command') : ( + (ANIMNS,'param'), + ), +# allowed_children + (ANIMNS,'iterate') : ( + (ANIMNS,'animate'), + (ANIMNS,'animateColor'), + (ANIMNS,'animateMotion'), + (ANIMNS,'animateTransform'), + (ANIMNS,'audio'), + (ANIMNS,'command'), + (ANIMNS,'iterate'), + (ANIMNS,'par'), + (ANIMNS,'seq'), + (ANIMNS,'set'), + (ANIMNS,'transitionFilter'), + ), + (ANIMNS,'par') : ( + (ANIMNS,'animate'), + (ANIMNS,'animateColor'), + (ANIMNS,'animateMotion'), + (ANIMNS,'animateTransform'), + (ANIMNS,'audio'), + (ANIMNS,'command'), + (ANIMNS,'iterate'), + (ANIMNS,'par'), + (ANIMNS,'seq'), + (ANIMNS,'set'), + (ANIMNS,'transitionFilter'), + ), +# allowed_children + (ANIMNS,'param') : ( + ), + (ANIMNS,'seq') : ( + (ANIMNS,'animate'), + (ANIMNS,'animateColor'), + (ANIMNS,'animateMotion'), + (ANIMNS,'animateTransform'), + (ANIMNS,'audio'), + (ANIMNS,'command'), + (ANIMNS,'iterate'), + (ANIMNS,'par'), + (ANIMNS,'seq'), + (ANIMNS,'set'), + (ANIMNS,'transitionFilter'), + ), + (ANIMNS,'set') : ( + ), + (ANIMNS,'transitionFilter') : ( + ), + (CHARTNS,'axis') : ( + (CHARTNS,'categories'), + (CHARTNS,'grid'), + (CHARTNS,'title'), + ), +# allowed_children + (CHARTNS,'categories') : ( + ), + (CHARTNS,'chart') : ( + (CHARTNS,'footer'), + (CHARTNS,'legend'), + (CHARTNS,'plot-area'), + (CHARTNS,'subtitle'), + (CHARTNS,'title'), + (TABLENS,'table'), + ), + (CHARTNS,'data-point') : ( + ), + (CHARTNS,'domain') : ( + ), + (CHARTNS,'error-indicator') : ( + ), + (CHARTNS,'floor') : ( + ), + (CHARTNS,'footer') : ( + (TEXTNS,'p'), + ), + (CHARTNS,'grid') : ( + ), + (CHARTNS,'legend') : ( + ), +# allowed_children + (CHARTNS,'mean-value') : ( + ), + (CHARTNS,'plot-area') : ( + (CHARTNS,'axis'), + (CHARTNS,'floor'), + (CHARTNS,'series'), + (CHARTNS,'stock-gain-marker'), + (CHARTNS,'stock-loss-marker'), + (CHARTNS,'stock-range-line'), + (CHARTNS,'wall'), + (DR3DNS,'light'), + ), + (CHARTNS,'regression-curve') : ( + ), + (CHARTNS,'series') : ( + (CHARTNS,'data-point'), + (CHARTNS,'domain'), + (CHARTNS,'error-indicator'), + (CHARTNS,'mean-value'), + (CHARTNS,'regression-curve'), + ), + (CHARTNS,'stock-gain-marker') : ( + ), + (CHARTNS,'stock-loss-marker') : ( + ), +# allowed_children + (CHARTNS,'stock-range-line') : ( + ), + (CHARTNS,'subtitle') : ( + (TEXTNS,'p'), + ), + (CHARTNS,'symbol-image') : ( + ), + (CHARTNS,'title') : ( + (TEXTNS,'p'), + ), + (CHARTNS,'wall') : ( + ), + (CONFIGNS,'config-item') : ( + ), + (CONFIGNS,'config-item-map-entry') : ( + (CONFIGNS,'config-item'), + (CONFIGNS,'config-item-map-indexed'), + (CONFIGNS,'config-item-map-named'), + (CONFIGNS,'config-item-set'), + ), + (CONFIGNS,'config-item-map-indexed') : ( + (CONFIGNS,'config-item-map-entry'), + ), + (CONFIGNS,'config-item-map-named') : ( + (CONFIGNS,'config-item-map-entry'), + ), +# allowed_children + (CONFIGNS,'config-item-set') : ( + (CONFIGNS,'config-item'), + (CONFIGNS,'config-item-map-indexed'), + (CONFIGNS,'config-item-map-named'), + (CONFIGNS,'config-item-set'), + ), + (MANIFESTNS,'algorithm') : ( + ), + (MANIFESTNS,'encryption-data') : ( + (MANIFESTNS,'algorithm'), + (MANIFESTNS,'key-derivation'), + ), + (MANIFESTNS,'file-entry') : ( + (MANIFESTNS,'encryption-data'), + ), + (MANIFESTNS,'key-derivation') : ( + ), + (MANIFESTNS,'manifest') : ( + (MANIFESTNS,'file-entry'), + ), + (NUMBERNS,'am-pm') : ( + ), + (NUMBERNS,'boolean') : ( + ), +# allowed_children + (NUMBERNS,'boolean-style') : ( + (NUMBERNS,'boolean'), + (NUMBERNS,'text'), + (STYLENS,'map'), + (STYLENS,'text-properties'), + ), + (NUMBERNS,'currency-style') : ( + (NUMBERNS,'currency-symbol'), + (NUMBERNS,'number'), + (NUMBERNS,'text'), + (STYLENS,'map'), + (STYLENS,'text-properties'), + ), + (NUMBERNS,'currency-symbol') : ( + ), + (NUMBERNS,'date-style') : ( + (NUMBERNS,'am-pm'), + (NUMBERNS,'day'), + (NUMBERNS,'day-of-week'), + (NUMBERNS,'era'), + (NUMBERNS,'hours'), + (NUMBERNS,'minutes'), + (NUMBERNS,'month'), + (NUMBERNS,'quarter'), + (NUMBERNS,'seconds'), + (NUMBERNS,'text'), + (NUMBERNS,'week-of-year'), + (NUMBERNS,'year'), + (STYLENS,'map'), + (STYLENS,'text-properties'), + ), +# allowed_children + (NUMBERNS,'day') : ( + ), + (NUMBERNS,'day-of-week') : ( + ), + (NUMBERNS,'embedded-text') : ( + ), + (NUMBERNS,'era') : ( + ), + (NUMBERNS,'fraction') : ( + ), + (NUMBERNS,'hours') : ( + ), + (NUMBERNS,'minutes') : ( + ), + (NUMBERNS,'month') : ( + ), + (NUMBERNS,'number') : ( + (NUMBERNS,'embedded-text'), + ), + (NUMBERNS,'number-style') : ( + (NUMBERNS,'fraction'), + (NUMBERNS,'number'), + (NUMBERNS,'scientific-number'), + (NUMBERNS,'text'), + (STYLENS,'map'), + (STYLENS,'text-properties'), + ), +# allowed_children + (NUMBERNS,'percentage-style') : ( + (NUMBERNS,'number'), + (NUMBERNS,'text'), + (STYLENS,'map'), + (STYLENS,'text-properties'), + ), + (NUMBERNS,'quarter') : ( + ), + (NUMBERNS,'scientific-number') : ( + ), + (NUMBERNS,'seconds') : ( + ), + (NUMBERNS,'text') : ( + ), + (NUMBERNS,'text-content') : ( + ), + (NUMBERNS,'text-style') : ( + (NUMBERNS,'text'), + (NUMBERNS,'text-content'), + (STYLENS,'map'), + (STYLENS,'text-properties'), + ), +# allowed_children + (NUMBERNS,'time-style') : ( + (NUMBERNS,'am-pm'), + (NUMBERNS,'hours'), + (NUMBERNS,'minutes'), + (NUMBERNS,'seconds'), + (NUMBERNS,'text'), + (STYLENS,'map'), + (STYLENS,'text-properties'), + ), +# allowed_children + (NUMBERNS,'week-of-year') : ( + ), + (NUMBERNS,'year') : ( + ), + (DR3DNS,'cube') : ( + ), + (DR3DNS,'extrude') : ( + ), + (DR3DNS,'light') : ( + ), + (DR3DNS,'rotate') : ( + ), + (DR3DNS,'scene') : ( + (DR3DNS,'cube'), + (DR3DNS,'extrude'), + (DR3DNS,'light'), + (DR3DNS,'rotate'), + (DR3DNS,'scene'), + (DR3DNS,'sphere'), + (SVGNS,'title'), + (SVGNS,'desc'), + ), + (DR3DNS,'sphere') : ( + ), + (DRAWNS,'a') : ( + (DRAWNS,'frame'), + ), +# allowed_children + (DRAWNS,'applet') : ( + (DRAWNS,'param'), + ), + (DRAWNS,'area-circle') : ( + (OFFICENS,'event-listeners'), + (SVGNS,'desc'), + (SVGNS,'title'), + ), + (DRAWNS,'area-polygon') : ( + (OFFICENS,'event-listeners'), + (SVGNS,'desc'), + (SVGNS,'title'), + ), + (DRAWNS,'area-rectangle') : ( + (OFFICENS,'event-listeners'), + (SVGNS,'desc'), + (SVGNS,'title'), + ), + (DRAWNS,'caption') : ( + (DRAWNS,'glue-point'), + (OFFICENS,'event-listeners'), + (SVGNS,'desc'), + (SVGNS,'title'), + (TEXTNS,'list'), + (TEXTNS,'p'), + ), + (DRAWNS,'circle') : ( + (DRAWNS,'glue-point'), + (OFFICENS,'event-listeners'), + (SVGNS,'desc'), + (SVGNS,'title'), + (TEXTNS,'list'), + (TEXTNS,'p'), + ), +# allowed_children + (DRAWNS,'connector') : ( + (DRAWNS,'glue-point'), + (OFFICENS,'event-listeners'), + (SVGNS,'desc'), + (SVGNS,'title'), + (TEXTNS,'list'), + (TEXTNS,'p'), + ), + (DRAWNS,'contour-path') : ( + ), + (DRAWNS,'contour-polygon') : ( + ), + (DRAWNS,'control') : ( + (DRAWNS,'glue-point'), + (SVGNS,'desc'), + (SVGNS,'title'), + ), + (DRAWNS,'custom-shape') : ( + (DRAWNS,'enhanced-geometry'), + (DRAWNS,'glue-point'), + (OFFICENS,'event-listeners'), + (SVGNS,'desc'), + (SVGNS,'title'), + (TEXTNS,'list'), + (TEXTNS,'p'), + ), +# allowed_children + (DRAWNS,'ellipse') : ( + (DRAWNS,'glue-point'), + (OFFICENS,'event-listeners'), + (SVGNS,'desc'), + (SVGNS,'title'), + (TEXTNS,'list'), + (TEXTNS,'p'), + ), + (DRAWNS,'enhanced-geometry') : ( + (DRAWNS,'equation'), + (DRAWNS,'handle'), + ), + (DRAWNS,'equation') : ( + ), +# allowed_children + (DRAWNS,'fill-image') : ( + ), + (DRAWNS,'floating-frame') : ( + ), + (DRAWNS,'frame') : ( + (DRAWNS,'applet'), + (DRAWNS,'contour-path'), + (DRAWNS,'contour-polygon'), + (DRAWNS,'floating-frame'), + (DRAWNS,'glue-point'), + (DRAWNS,'image'), + (DRAWNS,'image-map'), + (DRAWNS,'object'), + (DRAWNS,'object-ole'), + (DRAWNS,'plugin'), + (DRAWNS,'text-box'), + (OFFICENS,'event-listeners'), + (SVGNS,'desc'), + (SVGNS,'title'), + ), +# allowed_children + (DRAWNS,'g') : ( + (DR3DNS,'scene'), + (DRAWNS,'caption'), + (DRAWNS,'circle'), + (DRAWNS,'connector'), + (DRAWNS,'control'), + (DRAWNS,'custom-shape'), + (DRAWNS,'ellipse'), + (DRAWNS,'frame'), + (DRAWNS,'g'), + (DRAWNS,'glue-point'), + (DRAWNS,'line'), + (DRAWNS,'measure'), + (DRAWNS,'page-thumbnail'), + (DRAWNS,'path'), + (DRAWNS,'polygon'), + (DRAWNS,'polyline'), + (DRAWNS,'rect'), + (DRAWNS,'regular-polygon'), + (SVGNS,'desc'), + (SVGNS,'title'), + (OFFICENS,'event-listeners'), + ), + (DRAWNS,'glue-point') : ( + ), + (DRAWNS,'gradient') : ( + ), + (DRAWNS,'handle') : ( + ), + (DRAWNS,'hatch') : ( + ), +# allowed_children + (DRAWNS,'image') : ( + (OFFICENS,'binary-data'), + (TEXTNS,'list'), + (TEXTNS,'p'), + ), + (DRAWNS,'image-map') : ( + (DRAWNS,'area-circle'), + (DRAWNS,'area-polygon'), + (DRAWNS,'area-rectangle'), + ), + (DRAWNS,'layer') : ( + (SVGNS,'desc'), + (SVGNS,'title'), + ), + (DRAWNS,'layer-set') : ( + (DRAWNS,'layer'), + ), + (DRAWNS,'line') : ( + (DRAWNS,'glue-point'), + (OFFICENS,'event-listeners'), + (SVGNS,'desc'), + (SVGNS,'title'), + (TEXTNS,'list'), + (TEXTNS,'p'), + ), + (DRAWNS,'marker') : ( + ), + (DRAWNS,'measure') : ( + (DRAWNS,'glue-point'), + (OFFICENS,'event-listeners'), + (TEXTNS,'list'), + (TEXTNS,'p'), + (SVGNS,'title'), + (SVGNS,'desc'), + ), + (DRAWNS,'object') : ( + (MATHNS,'math'), + (OFFICENS,'document'), + ), +# allowed_children + (DRAWNS,'object-ole') : ( + (OFFICENS,'binary-data'), + ), + (DRAWNS,'opacity') : ( + ), + (DRAWNS,'page') : ( + (ANIMNS,'animate'), + (ANIMNS,'animateColor'), + (ANIMNS,'animateMotion'), + (ANIMNS,'animateTransform'), + (ANIMNS,'audio'), + (ANIMNS,'command'), + (ANIMNS,'iterate'), + (ANIMNS,'par'), + (ANIMNS,'seq'), + (ANIMNS,'set'), + (ANIMNS,'transitionFilter'), + (DR3DNS,'scene'), + (DRAWNS,'caption'), + (DRAWNS,'circle'), + (DRAWNS,'connector'), + (DRAWNS,'control'), + (DRAWNS,'custom-shape'), + (DRAWNS,'ellipse'), + (DRAWNS,'frame'), + (DRAWNS,'g'), + (DRAWNS,'line'), + (DRAWNS,'measure'), + (DRAWNS,'page-thumbnail'), + (DRAWNS,'path'), + (DRAWNS,'polygon'), + (DRAWNS,'polyline'), + (DRAWNS,'rect'), + (DRAWNS,'regular-polygon'), + (OFFICENS,'forms'), + (PRESENTATIONNS,'animations'), + (PRESENTATIONNS,'notes'), + ), +# allowed_children + (DRAWNS,'page-thumbnail') : ( + (SVGNS,'desc'), + (SVGNS,'title'), + ), + (DRAWNS,'param') : ( + ), + (DRAWNS,'path') : ( + (DRAWNS,'glue-point'), + (OFFICENS,'event-listeners'), + (SVGNS,'desc'), + (SVGNS,'title'), + (TEXTNS,'list'), + (TEXTNS,'p'), + ), + (DRAWNS,'plugin') : ( + (DRAWNS,'param'), + ), + (DRAWNS,'polygon') : ( + (DRAWNS,'glue-point'), + (OFFICENS,'event-listeners'), + (SVGNS,'title'), + (SVGNS,'desc'), + (TEXTNS,'list'), + (TEXTNS,'p'), + ), + (DRAWNS,'polyline') : ( + (DRAWNS,'glue-point'), + (OFFICENS,'event-listeners'), + (SVGNS,'desc'), + (SVGNS,'title'), + (TEXTNS,'list'), + (TEXTNS,'p'), + ), +# allowed_children + (DRAWNS,'rect') : ( + (DRAWNS,'glue-point'), + (OFFICENS,'event-listeners'), + (SVGNS,'desc'), + (SVGNS,'title'), + (TEXTNS,'list'), + (TEXTNS,'p'), + ), + (DRAWNS,'regular-polygon') : ( + (DRAWNS,'glue-point'), + (OFFICENS,'event-listeners'), + (SVGNS,'desc'), + (SVGNS,'title'), + (TEXTNS,'list'), + (TEXTNS,'p'), + ), + (DRAWNS,'stroke-dash') : ( + ), + (DRAWNS,'text-box') : ( + (DR3DNS,'scene'), + (DRAWNS,'a'), + (DRAWNS,'caption'), + (DRAWNS,'circle'), + (DRAWNS,'connector'), + (DRAWNS,'control'), + (DRAWNS,'custom-shape'), + (DRAWNS,'ellipse'), + (DRAWNS,'frame'), + (DRAWNS,'g'), + (DRAWNS,'line'), + (DRAWNS,'measure'), + (DRAWNS,'page-thumbnail'), + (DRAWNS,'path'), + (DRAWNS,'polygon'), + (DRAWNS,'polyline'), + (DRAWNS,'rect'), + (DRAWNS,'regular-polygon'), + (TABLENS,'table'), + (TEXTNS,'alphabetical-index'), + (TEXTNS,'bibliography'), + (TEXTNS,'change'), + (TEXTNS,'change-end'), + (TEXTNS,'change-start'), + (TEXTNS,'h'), + (TEXTNS,'illustration-index'), + (TEXTNS,'list'), + (TEXTNS,'numbered-paragraph'), + (TEXTNS,'object-index'), + (TEXTNS,'p'), + (TEXTNS,'section'), + (TEXTNS,'soft-page-break'), + (TEXTNS,'table-index'), + (TEXTNS,'table-of-content'), + (TEXTNS,'user-index'), + ), +# allowed_children + (FORMNS,'button') : ( + (FORMNS,'properties'), + (OFFICENS,'event-listeners'), + ), + (FORMNS,'checkbox') : ( + (FORMNS,'properties'), + (OFFICENS,'event-listeners'), + ), + (FORMNS,'column') : ( + (FORMNS,'checkbox'), + (FORMNS,'combobox'), + (FORMNS,'date'), + (FORMNS,'formatted-text'), + (FORMNS,'listbox'), + (FORMNS,'number'), + (FORMNS,'text'), + (FORMNS,'textarea'), + ), + (FORMNS,'combobox') : ( + (FORMNS,'item'), + (FORMNS,'properties'), + (OFFICENS,'event-listeners'), + ), + (FORMNS,'connection-resource') : ( + ), + (FORMNS,'date') : ( + (FORMNS,'properties'), + (OFFICENS,'event-listeners'), + ), + (FORMNS,'file') : ( + (FORMNS,'properties'), + (OFFICENS,'event-listeners'), + ), + (FORMNS,'fixed-text') : ( + (FORMNS,'properties'), + (OFFICENS,'event-listeners'), + ), +# allowed_children + (FORMNS,'form') : ( + (FORMNS,'button'), + (FORMNS,'checkbox'), + (FORMNS,'combobox'), + (FORMNS,'connection-resource'), + (FORMNS,'date'), + (FORMNS,'file'), + (FORMNS,'fixed-text'), + (FORMNS,'form'), + (FORMNS,'formatted-text'), + (FORMNS,'frame'), + (FORMNS,'generic-control'), + (FORMNS,'grid'), + (FORMNS,'hidden'), + (FORMNS,'image'), + (FORMNS,'image-frame'), + (FORMNS,'listbox'), + (FORMNS,'number'), + (FORMNS,'password'), + (FORMNS,'properties'), + (FORMNS,'radio'), + (FORMNS,'text'), + (FORMNS,'textarea'), + (FORMNS,'time'), + (FORMNS,'value-range'), + (OFFICENS,'event-listeners'), + ), + (FORMNS,'formatted-text') : ( + (FORMNS,'properties'), + (OFFICENS,'event-listeners'), + ), + (FORMNS,'frame') : ( + (FORMNS,'properties'), + (OFFICENS,'event-listeners'), + ), + (FORMNS,'generic-control') : ( + (FORMNS,'properties'), + (OFFICENS,'event-listeners'), + ), + (FORMNS,'grid') : ( + (FORMNS,'column'), + (FORMNS,'properties'), + (OFFICENS,'event-listeners'), + ), + (FORMNS,'hidden') : ( + (FORMNS,'properties'), + (OFFICENS,'event-listeners'), + ), + (FORMNS,'image') : ( + (FORMNS,'properties'), + (OFFICENS,'event-listeners'), + ), +# allowed_children + (FORMNS,'image-frame') : ( + (FORMNS,'properties'), + (OFFICENS,'event-listeners'), + ), + (FORMNS,'item') : ( + ), + (FORMNS,'list-property') : ( + (FORMNS,'list-value'), + (FORMNS,'list-value'), + (FORMNS,'list-value'), + (FORMNS,'list-value'), + (FORMNS,'list-value'), + (FORMNS,'list-value'), + (FORMNS,'list-value'), + ), + (FORMNS,'list-value') : ( + ), + (FORMNS,'listbox') : ( + (FORMNS,'option'), + (FORMNS,'properties'), + (OFFICENS,'event-listeners'), + ), + (FORMNS,'number') : ( + (FORMNS,'properties'), + (OFFICENS,'event-listeners'), + ), + (FORMNS,'option') : ( + ), + (FORMNS,'password') : ( + (FORMNS,'properties'), + (OFFICENS,'event-listeners'), + ), + (FORMNS,'properties') : ( + (FORMNS,'list-property'), + (FORMNS,'property'), + ), + (FORMNS,'property') : ( + ), + (FORMNS,'radio') : ( + (FORMNS,'properties'), + (OFFICENS,'event-listeners'), + ), + (FORMNS,'text') : ( + (FORMNS,'properties'), + (OFFICENS,'event-listeners'), + ), + (FORMNS,'textarea') : ( + (FORMNS,'properties'), + (OFFICENS,'event-listeners'), + (TEXTNS,'p'), + ), + (FORMNS,'time') : ( + (FORMNS,'properties'), + (OFFICENS,'event-listeners'), + ), + (FORMNS,'value-range') : ( + (FORMNS,'properties'), + (OFFICENS,'event-listeners'), + ), + (METANS,'auto-reload') : ( + ), + (METANS,'creation-date') : ( + ), + (METANS,'date-string') : ( + ), + (METANS,'document-statistic') : ( + ), + (METANS,'editing-cycles') : ( + ), + (METANS,'editing-duration') : ( + ), + (METANS,'generator') : ( + ), + (METANS,'hyperlink-behaviour') : ( + ), + (METANS,'initial-creator') : ( + ), + (METANS,'keyword') : ( + ), + (METANS,'print-date') : ( + ), + (METANS,'printed-by') : ( + ), + (METANS,'template') : ( + ), + (METANS,'user-defined') : ( + ), +# allowed_children + (OFFICENS,'annotation') : ( + (DCNS,'creator'), + (DCNS,'date'), + (METANS,'date-string'), + (TEXTNS,'list'), + (TEXTNS,'p'), + ), + (OFFICENS,'automatic-styles') : ( + (NUMBERNS,'boolean-style'), + (NUMBERNS,'currency-style'), + (NUMBERNS,'date-style'), + (NUMBERNS,'number-style'), + (NUMBERNS,'percentage-style'), + (NUMBERNS,'text-style'), + (NUMBERNS,'time-style'), + (STYLENS,'page-layout'), + (STYLENS,'style'), + (TEXTNS,'list-style'), + ), + (OFFICENS,'binary-data') : ( + ), + (OFFICENS,'body') : ( + (OFFICENS,'chart'), + (OFFICENS,'drawing'), + (OFFICENS,'image'), + (OFFICENS,'presentation'), + (OFFICENS,'spreadsheet'), + (OFFICENS,'text'), + ), + (OFFICENS,'change-info') : ( + (DCNS,'creator'), + (DCNS,'date'), + (TEXTNS,'p'), + ), + (OFFICENS,'chart') : ( + (CHARTNS,'chart'), + (TABLENS,'calculation-settings'), + (TABLENS,'consolidation'), + (TABLENS,'content-validations'), + (TABLENS,'data-pilot-tables'), + (TABLENS,'database-ranges'), + (TABLENS,'dde-links'), + (TABLENS,'label-ranges'), + (TABLENS,'named-expressions'), + (TEXTNS,'alphabetical-index-auto-mark-file'), + (TEXTNS,'dde-connection-decls'), + (TEXTNS,'sequence-decls'), + (TEXTNS,'user-field-decls'), + (TEXTNS,'variable-decls'), + ), + (OFFICENS,'dde-source') : ( + ), + (OFFICENS,'document') : ( + (OFFICENS,'automatic-styles'), + (OFFICENS,'body'), + (OFFICENS,'font-face-decls'), + (OFFICENS,'master-styles'), + (OFFICENS,'meta'), + (OFFICENS,'scripts'), + (OFFICENS,'settings'), + (OFFICENS,'styles'), + ), + (OFFICENS,'document-content') : ( + (OFFICENS,'automatic-styles'), + (OFFICENS,'body'), + (OFFICENS,'font-face-decls'), + (OFFICENS,'scripts'), + ), + (OFFICENS,'document-meta') : ( + (OFFICENS,'meta'), + ), + (OFFICENS,'document-settings') : ( + (OFFICENS,'settings'), + ), + (OFFICENS,'document-styles') : ( + (OFFICENS,'automatic-styles'), + (OFFICENS,'font-face-decls'), + (OFFICENS,'master-styles'), + (OFFICENS,'styles'), + ), + (OFFICENS,'drawing') : ( + (DRAWNS,'page'), + (TABLENS,'calculation-settings'), + (TABLENS,'consolidation'), + (TABLENS,'content-validations'), + (TABLENS,'data-pilot-tables'), + (TABLENS,'database-ranges'), + (TABLENS,'dde-links'), + (TABLENS,'label-ranges'), + (TABLENS,'named-expressions'), + (TEXTNS,'alphabetical-index-auto-mark-file'), + (TEXTNS,'dde-connection-decls'), + (TEXTNS,'sequence-decls'), + (TEXTNS,'user-field-decls'), + (TEXTNS,'variable-decls'), + ), + (OFFICENS,'event-listeners') : ( + (PRESENTATIONNS,'event-listener'), + (SCRIPTNS,'event-listener'), + ), + (OFFICENS,'font-face-decls') : ( + (STYLENS,'font-face'), + ), +# allowed_children + (OFFICENS,'forms') : ( + (XFORMSNS,'model'), + (FORMNS,'form'), + ), + (OFFICENS,'image') : ( + (DRAWNS,'frame'), + ), + (OFFICENS,'master-styles') : ( + (DRAWNS,'layer-set'), + (STYLENS,'handout-master'), + (STYLENS,'master-page'), + (TABLENS,'table-template'), + ), + (OFFICENS,'meta') : ( + (DCNS,'creator'), + (DCNS,'date'), + (DCNS,'description'), + (DCNS,'language'), + (DCNS,'subject'), + (DCNS,'title'), +# Completes Dublin Core start +# (DCNS,'contributor'), +# (DCNS,'coverage'), +# (DCNS,'format'), +# (DCNS,'identifier'), +# (DCNS,'publisher'), +# (DCNS,'relation'), +# (DCNS,'rights'), +# (DCNS,'source'), +# (DCNS,'type'), +# Completes Dublin Core end + (METANS,'auto-reload'), + (METANS,'creation-date'), + (METANS,'document-statistic'), + (METANS,'editing-cycles'), + (METANS,'editing-duration'), + (METANS,'generator'), + (METANS,'hyperlink-behaviour'), + (METANS,'initial-creator'), + (METANS,'keyword'), + (METANS,'print-date'), + (METANS,'printed-by'), + (METANS,'template'), + (METANS,'user-defined'), + ), + (OFFICENS,'presentation') : ( + (DRAWNS,'page'), + (PRESENTATIONNS,'date-time-decl'), + (PRESENTATIONNS,'footer-decl'), + (PRESENTATIONNS,'header-decl'), + (PRESENTATIONNS,'settings'), + (TABLENS,'calculation-settings'), + (TABLENS,'consolidation'), + (TABLENS,'content-validations'), + (TABLENS,'data-pilot-tables'), + (TABLENS,'database-ranges'), + (TABLENS,'dde-links'), + (TABLENS,'label-ranges'), + (TABLENS,'named-expressions'), + (TEXTNS,'alphabetical-index-auto-mark-file'), + (TEXTNS,'dde-connection-decls'), + (TEXTNS,'sequence-decls'), + (TEXTNS,'user-field-decls'), + (TEXTNS,'variable-decls'), + ), +# allowed_children + (OFFICENS,'script') : None, + + (OFFICENS,'scripts') : ( + (OFFICENS,'event-listeners'), + (OFFICENS,'script'), + ), + (OFFICENS,'settings') : ( + (CONFIGNS,'config-item-set'), + ), + (OFFICENS,'spreadsheet') : ( + (TABLENS,'calculation-settings'), + (TABLENS,'consolidation'), + (TABLENS,'content-validations'), + (TABLENS,'data-pilot-tables'), + (TABLENS,'database-ranges'), + (TABLENS,'dde-links'), + (TABLENS,'label-ranges'), + (TABLENS,'named-expressions'), + (TABLENS,'table'), + (TABLENS,'tracked-changes'), + (TEXTNS,'alphabetical-index-auto-mark-file'), + (TEXTNS,'dde-connection-decls'), + (TEXTNS,'sequence-decls'), + (TEXTNS,'user-field-decls'), + (TEXTNS,'variable-decls'), + ), + (OFFICENS,'styles') : ( + (NUMBERNS,'boolean-style'), + (NUMBERNS,'currency-style'), + (NUMBERNS,'date-style'), + (NUMBERNS,'number-style'), + (NUMBERNS,'percentage-style'), + (NUMBERNS,'text-style'), + (NUMBERNS,'time-style'), + (DRAWNS,'fill-image'), + (DRAWNS,'gradient'), + (DRAWNS,'hatch'), + (DRAWNS,'marker'), + (DRAWNS,'opacity'), + (DRAWNS,'stroke-dash'), + (STYLENS,'default-style'), + (STYLENS,'presentation-page-layout'), + (STYLENS,'style'), + (SVGNS,'linearGradient'), + (SVGNS,'radialGradient'), + (TEXTNS,'bibliography-configuration'), + (TEXTNS,'linenumbering-configuration'), + (TEXTNS,'list-style'), + (TEXTNS,'notes-configuration'), + (TEXTNS,'outline-style'), + ), + (OFFICENS,'text') : ( + (DR3DNS,'scene'), + (DRAWNS,'a'), + (DRAWNS,'caption'), + (DRAWNS,'circle'), + (DRAWNS,'connector'), + (DRAWNS,'control'), + (DRAWNS,'custom-shape'), + (DRAWNS,'ellipse'), + (DRAWNS,'frame'), + (DRAWNS,'g'), + (DRAWNS,'line'), + (DRAWNS,'measure'), + (DRAWNS,'page-thumbnail'), + (DRAWNS,'path'), + (DRAWNS,'polygon'), + (DRAWNS,'polyline'), + (DRAWNS,'rect'), + (DRAWNS,'regular-polygon'), + (OFFICENS,'forms'), + (TABLENS,'calculation-settings'), + (TABLENS,'consolidation'), + (TABLENS,'content-validations'), + (TABLENS,'data-pilot-tables'), + (TABLENS,'database-ranges'), + (TABLENS,'dde-links'), + (TABLENS,'label-ranges'), + (TABLENS,'named-expressions'), + (TABLENS,'table'), + (TEXTNS,'alphabetical-index'), + (TEXTNS,'alphabetical-index-auto-mark-file'), + (TEXTNS,'bibliography'), + (TEXTNS,'change'), + (TEXTNS,'change-end'), + (TEXTNS,'change-start'), + (TEXTNS,'dde-connection-decls'), + (TEXTNS,'h'), + (TEXTNS,'illustration-index'), + (TEXTNS,'list'), + (TEXTNS,'numbered-paragraph'), + (TEXTNS,'object-index'), + (TEXTNS,'p'), + (TEXTNS,'page-sequence'), + (TEXTNS,'section'), + (TEXTNS,'sequence-decls'), + (TEXTNS,'soft-page-break'), + (TEXTNS,'table-index'), + (TEXTNS,'table-of-content'), + (TEXTNS,'tracked-changes'), + (TEXTNS,'user-field-decls'), + (TEXTNS,'user-index'), + (TEXTNS,'variable-decls'), + ), + (PRESENTATIONNS,'animation-group') : ( + (PRESENTATIONNS,'dim'), + (PRESENTATIONNS,'hide-shape'), + (PRESENTATIONNS,'hide-text'), + (PRESENTATIONNS,'play'), + (PRESENTATIONNS,'show-shape'), + (PRESENTATIONNS,'show-text'), + ), + (PRESENTATIONNS,'animations') : ( + (PRESENTATIONNS,'animation-group'), + (PRESENTATIONNS,'dim'), + (PRESENTATIONNS,'hide-shape'), + (PRESENTATIONNS,'hide-text'), + (PRESENTATIONNS,'play'), + (PRESENTATIONNS,'show-shape'), + (PRESENTATIONNS,'show-text'), + ), + (PRESENTATIONNS,'date-time') : ( + ), + (PRESENTATIONNS,'date-time-decl') : ( + ), + (PRESENTATIONNS,'dim') : ( + (PRESENTATIONNS,'sound'), + ), + (PRESENTATIONNS,'event-listener') : ( + (PRESENTATIONNS,'sound'), + ), + (PRESENTATIONNS,'footer') : ( + ), + (PRESENTATIONNS,'footer-decl') : ( + ), + (PRESENTATIONNS,'header') : ( + ), + (PRESENTATIONNS,'header-decl') : ( + ), + (PRESENTATIONNS,'hide-shape') : ( + (PRESENTATIONNS,'sound'), + ), + (PRESENTATIONNS,'hide-text') : ( + (PRESENTATIONNS,'sound'), + ), +# allowed_children + (PRESENTATIONNS,'notes') : ( + (DR3DNS,'scene'), + (DRAWNS,'caption'), + (DRAWNS,'circle'), + (DRAWNS,'connector'), + (DRAWNS,'control'), + (DRAWNS,'custom-shape'), + (DRAWNS,'ellipse'), + (DRAWNS,'frame'), + (DRAWNS,'g'), + (DRAWNS,'line'), + (DRAWNS,'measure'), + (DRAWNS,'page-thumbnail'), + (DRAWNS,'path'), + (DRAWNS,'polygon'), + (DRAWNS,'polyline'), + (DRAWNS,'rect'), + (DRAWNS,'regular-polygon'), + (OFFICENS,'forms'), + ), + (PRESENTATIONNS,'placeholder') : ( + ), + (PRESENTATIONNS,'play') : ( + ), + (PRESENTATIONNS,'settings') : ( + (PRESENTATIONNS,'show'), + ), + (PRESENTATIONNS,'show') : ( + ), + (PRESENTATIONNS,'show-shape') : ( + (PRESENTATIONNS,'sound'), + ), + (PRESENTATIONNS,'show-text') : ( + (PRESENTATIONNS,'sound'), + ), + (PRESENTATIONNS,'sound') : ( + ), + (SCRIPTNS,'event-listener') : ( + ), + (STYLENS,'background-image') : ( + (OFFICENS,'binary-data'), + ), + (STYLENS,'chart-properties') : ( + (CHARTNS,'symbol-image'), + ), + (STYLENS,'column') : ( + ), + (STYLENS,'column-sep') : ( + ), + (STYLENS,'columns') : ( + (STYLENS,'column'), + (STYLENS,'column-sep'), + ), + (STYLENS,'default-style') : ( + (STYLENS,'chart-properties'), + (STYLENS,'drawing-page-properties'), + (STYLENS,'graphic-properties'), + (STYLENS,'paragraph-properties'), + (STYLENS,'ruby-properties'), + (STYLENS,'section-properties'), + (STYLENS,'table-cell-properties'), + (STYLENS,'table-column-properties'), + (STYLENS,'table-properties'), + (STYLENS,'table-row-properties'), + (STYLENS,'text-properties'), + ), + (STYLENS,'drawing-page-properties') : ( + (PRESENTATIONNS,'sound'), + ), + (STYLENS,'drop-cap') : ( + ), + (STYLENS,'font-face') : ( + (SVGNS,'definition-src'), + (SVGNS,'font-face-src'), + ), + (STYLENS,'footer') : ( + (STYLENS,'region-center'), + (STYLENS,'region-left'), + (STYLENS,'region-right'), + (TABLENS,'table'), + (TEXTNS,'alphabetical-index'), + (TEXTNS,'alphabetical-index-auto-mark-file'), + (TEXTNS,'bibliography'), + (TEXTNS,'change'), + (TEXTNS,'change-end'), + (TEXTNS,'change-start'), + (TEXTNS,'dde-connection-decls'), + (TEXTNS,'h'), + (TEXTNS,'illustration-index'), + (TEXTNS,'index-title'), + (TEXTNS,'list'), + (TEXTNS,'object-index'), + (TEXTNS,'p'), + (TEXTNS,'section'), + (TEXTNS,'sequence-decls'), + (TEXTNS,'table-index'), + (TEXTNS,'table-of-content'), + (TEXTNS,'tracked-changes'), + (TEXTNS,'user-field-decls'), + (TEXTNS,'user-index'), + (TEXTNS,'variable-decls'), + ), +# allowed_children + (STYLENS,'footer-left') : ( + (STYLENS,'region-center'), + (STYLENS,'region-left'), + (STYLENS,'region-right'), + (TABLENS,'table'), + (TEXTNS,'alphabetical-index'), + (TEXTNS,'alphabetical-index-auto-mark-file'), + (TEXTNS,'bibliography'), + (TEXTNS,'change'), + (TEXTNS,'change-end'), + (TEXTNS,'change-start'), + (TEXTNS,'dde-connection-decls'), + (TEXTNS,'h'), + (TEXTNS,'illustration-index'), + (TEXTNS,'index-title'), + (TEXTNS,'list'), + (TEXTNS,'object-index'), + (TEXTNS,'p'), + (TEXTNS,'section'), + (TEXTNS,'sequence-decls'), + (TEXTNS,'table-index'), + (TEXTNS,'table-of-content'), + (TEXTNS,'tracked-changes'), + (TEXTNS,'user-field-decls'), + (TEXTNS,'user-index'), + (TEXTNS,'variable-decls'), + ), + (STYLENS,'footer-style') : ( + (STYLENS,'header-footer-properties'), + ), + (STYLENS,'footnote-sep') : ( + ), + (STYLENS,'graphic-properties') : ( + (STYLENS,'background-image'), + (STYLENS,'columns'), + (TEXTNS,'list-style'), + ), +# allowed_children + (STYLENS,'handout-master') : ( + (DR3DNS,'scene'), + (DRAWNS,'caption'), + (DRAWNS,'circle'), + (DRAWNS,'connector'), + (DRAWNS,'control'), + (DRAWNS,'custom-shape'), + (DRAWNS,'ellipse'), + (DRAWNS,'frame'), + (DRAWNS,'g'), + (DRAWNS,'line'), + (DRAWNS,'measure'), + (DRAWNS,'page-thumbnail'), + (DRAWNS,'path'), + (DRAWNS,'polygon'), + (DRAWNS,'polyline'), + (DRAWNS,'rect'), + (DRAWNS,'regular-polygon'), + ), + (STYLENS,'header') : ( + (STYLENS,'region-center'), + (STYLENS,'region-left'), + (STYLENS,'region-right'), + (TABLENS,'table'), + (TEXTNS,'alphabetical-index'), + (TEXTNS,'alphabetical-index-auto-mark-file'), + (TEXTNS,'bibliography'), + (TEXTNS,'change'), + (TEXTNS,'change-end'), + (TEXTNS,'change-start'), + (TEXTNS,'dde-connection-decls'), + (TEXTNS,'h'), + (TEXTNS,'illustration-index'), + (TEXTNS,'index-title'), + (TEXTNS,'list'), + (TEXTNS,'object-index'), + (TEXTNS,'p'), + (TEXTNS,'section'), + (TEXTNS,'sequence-decls'), + (TEXTNS,'table-index'), + (TEXTNS,'table-of-content'), + (TEXTNS,'tracked-changes'), + (TEXTNS,'user-field-decls'), + (TEXTNS,'user-index'), + (TEXTNS,'variable-decls'), + ), +# allowed_children + (STYLENS,'header-footer-properties') : ( + (STYLENS,'background-image'), + ), + (STYLENS,'header-left') : ( + (STYLENS,'region-center'), + (STYLENS,'region-left'), + (STYLENS,'region-right'), + (TABLENS,'table'), + (TEXTNS,'alphabetical-index'), + (TEXTNS,'alphabetical-index-auto-mark-file'), + (TEXTNS,'bibliography'), + (TEXTNS,'change'), + (TEXTNS,'change-end'), + (TEXTNS,'change-start'), + (TEXTNS,'dde-connection-decls'), + (TEXTNS,'h'), + (TEXTNS,'illustration-index'), + (TEXTNS,'index-title'), + (TEXTNS,'list'), + (TEXTNS,'object-index'), + (TEXTNS,'p'), + (TEXTNS,'section'), + (TEXTNS,'sequence-decls'), + (TEXTNS,'table-index'), + (TEXTNS,'table-of-content'), + (TEXTNS,'tracked-changes'), + (TEXTNS,'user-field-decls'), + (TEXTNS,'user-index'), + (TEXTNS,'variable-decls'), + ), + (STYLENS,'header-style') : ( + (STYLENS,'header-footer-properties'), + ), + (STYLENS,'list-level-properties') : ( + ), + (STYLENS,'map') : ( + ), + (STYLENS,'master-page') : ( + (DR3DNS,'scene'), + (DRAWNS,'caption'), + (DRAWNS,'circle'), + (DRAWNS,'connector'), + (DRAWNS,'control'), + (DRAWNS,'custom-shape'), + (DRAWNS,'ellipse'), + (DRAWNS,'frame'), + (DRAWNS,'g'), + (DRAWNS,'line'), + (DRAWNS,'measure'), + (DRAWNS,'page-thumbnail'), + (DRAWNS,'path'), + (DRAWNS,'polygon'), + (DRAWNS,'polyline'), + (DRAWNS,'rect'), + (DRAWNS,'regular-polygon'), + (OFFICENS,'forms'), + (PRESENTATIONNS,'notes'), + (STYLENS,'footer'), + (STYLENS,'footer-left'), + (STYLENS,'header'), + (STYLENS,'header-left'), + (STYLENS,'style'), + ), + (STYLENS,'page-layout') : ( + (STYLENS,'footer-style'), + (STYLENS,'header-style'), + (STYLENS,'page-layout-properties'), + ), + (STYLENS,'page-layout-properties') : ( + (STYLENS,'background-image'), + (STYLENS,'columns'), + (STYLENS,'footnote-sep'), + ), +# allowed_children + (STYLENS,'paragraph-properties') : ( + (STYLENS,'background-image'), + (STYLENS,'drop-cap'), + (STYLENS,'tab-stops'), + ), + (STYLENS,'presentation-page-layout') : ( + (PRESENTATIONNS,'placeholder'), + ), + (STYLENS,'region-center') : ( + (TEXTNS,'p'), + ), + (STYLENS,'region-left') : ( + (TEXTNS,'p'), + ), + (STYLENS,'region-right') : ( + (TEXTNS,'p'), + ), + (STYLENS,'ruby-properties') : ( + ), + (STYLENS,'section-properties') : ( + (STYLENS,'background-image'), + (STYLENS,'columns'), + (TEXTNS,'notes-configuration'), + ), + (STYLENS,'style') : ( + (STYLENS,'chart-properties'), + (STYLENS,'drawing-page-properties'), + (STYLENS,'graphic-properties'), + (STYLENS,'map'), + (STYLENS,'paragraph-properties'), + (STYLENS,'ruby-properties'), + (STYLENS,'section-properties'), + (STYLENS,'table-cell-properties'), + (STYLENS,'table-column-properties'), + (STYLENS,'table-properties'), + (STYLENS,'table-row-properties'), + (STYLENS,'text-properties'), + ), + (STYLENS,'tab-stop') : ( + ), + (STYLENS,'tab-stops') : ( + (STYLENS,'tab-stop'), + ), +# allowed_children + (STYLENS,'table-cell-properties') : ( + (STYLENS,'background-image'), + ), + (STYLENS,'table-column-properties') : ( + ), + (STYLENS,'table-properties') : ( + (STYLENS,'background-image'), + ), + (STYLENS,'table-row-properties') : ( + (STYLENS,'background-image'), + ), + (STYLENS,'text-properties') : ( + ), + (SVGNS,'definition-src') : ( + ), + (SVGNS,'desc') : ( + ), + (SVGNS,'font-face-format') : ( + ), + (SVGNS,'font-face-name') : ( + ), + (SVGNS,'font-face-src') : ( + (SVGNS,'font-face-name'), + (SVGNS,'font-face-uri'), + ), + (SVGNS,'font-face-uri') : ( + (SVGNS,'font-face-format'), + ), + (SVGNS,'linearGradient') : ( + (SVGNS,'stop'), + ), + (SVGNS,'radialGradient') : ( + (SVGNS,'stop'), + ), + (SVGNS,'stop') : ( + ), + (SVGNS,'title') : ( + ), + (TABLENS,'body') : ( + ), + (TABLENS,'calculation-settings') : ( + (TABLENS,'iteration'), + (TABLENS,'null-date'), + ), +# allowed_children + (TABLENS,'cell-address') : ( + ), + (TABLENS,'cell-content-change') : ( + (OFFICENS,'change-info'), + (TABLENS,'cell-address'), + (TABLENS,'deletions'), + (TABLENS,'dependencies'), + (TABLENS,'previous'), + ), + (TABLENS,'cell-content-deletion') : ( + (TABLENS,'cell-address'), + (TABLENS,'change-track-table-cell'), + ), + (TABLENS,'cell-range-source') : ( + ), + (TABLENS,'change-deletion') : ( + ), + (TABLENS,'change-track-table-cell') : ( + (TEXTNS,'p'), + ), + (TABLENS,'consolidation') : ( + ), + (TABLENS,'content-validation') : ( + (OFFICENS,'event-listeners'), + (TABLENS,'error-macro'), + (TABLENS,'error-message'), + (TABLENS,'help-message'), + ), +# allowed_children + (TABLENS,'content-validations') : ( + (TABLENS,'content-validation'), + ), + (TABLENS,'covered-table-cell') : ( + (DR3DNS,'scene'), + (DRAWNS,'a'), + (DRAWNS,'caption'), + (DRAWNS,'circle'), + (DRAWNS,'connector'), + (DRAWNS,'control'), + (DRAWNS,'custom-shape'), + (DRAWNS,'ellipse'), + (DRAWNS,'frame'), + (DRAWNS,'g'), + (DRAWNS,'line'), + (DRAWNS,'measure'), + (DRAWNS,'page-thumbnail'), + (DRAWNS,'path'), + (DRAWNS,'polygon'), + (DRAWNS,'polyline'), + (DRAWNS,'rect'), + (DRAWNS,'regular-polygon'), + (OFFICENS,'annotation'), + (TABLENS,'cell-range-source'), + (TABLENS,'detective'), + (TABLENS,'table'), + (TEXTNS,'alphabetical-index'), + (TEXTNS,'bibliography'), + (TEXTNS,'change'), + (TEXTNS,'change-end'), + (TEXTNS,'change-start'), + (TEXTNS,'h'), + (TEXTNS,'illustration-index'), + (TEXTNS,'list'), + (TEXTNS,'numbered-paragraph'), + (TEXTNS,'object-index'), + (TEXTNS,'p'), + (TEXTNS,'section'), + (TEXTNS,'soft-page-break'), + (TEXTNS,'table-index'), + (TEXTNS,'table-of-content'), + (TEXTNS,'user-index'), + ), +# allowed_children + (TABLENS,'cut-offs') : ( + (TABLENS,'insertion-cut-off'), + (TABLENS,'movement-cut-off'), + ), + (TABLENS,'data-pilot-display-info') : ( + ), + (TABLENS,'data-pilot-field') : ( + (TABLENS,'data-pilot-field-reference'), + (TABLENS,'data-pilot-groups'), + (TABLENS,'data-pilot-level'), + ), + (TABLENS,'data-pilot-field-reference') : ( + ), + (TABLENS,'data-pilot-group') : ( + (TABLENS,'data-pilot-group-member'), + ), + (TABLENS,'data-pilot-group-member') : ( + ), + (TABLENS,'data-pilot-groups') : ( + (TABLENS,'data-pilot-group'), + ), + (TABLENS,'data-pilot-layout-info') : ( + ), + (TABLENS,'data-pilot-level') : ( + (TABLENS,'data-pilot-display-info'), + (TABLENS,'data-pilot-layout-info'), + (TABLENS,'data-pilot-members'), + (TABLENS,'data-pilot-sort-info'), + (TABLENS,'data-pilot-subtotals'), + ), + (TABLENS,'data-pilot-member') : ( + ), + (TABLENS,'data-pilot-members') : ( + (TABLENS,'data-pilot-member'), + ), + (TABLENS,'data-pilot-sort-info') : ( + ), + (TABLENS,'data-pilot-subtotal') : ( + ), + (TABLENS,'data-pilot-subtotals') : ( + (TABLENS,'data-pilot-subtotal'), + ), +# allowed_children + (TABLENS,'data-pilot-table') : ( + (TABLENS,'data-pilot-field'), + (TABLENS,'database-source-query'), + (TABLENS,'database-source-sql'), + (TABLENS,'database-source-table'), + (TABLENS,'source-cell-range'), + (TABLENS,'source-service'), + ), + (TABLENS,'data-pilot-tables') : ( + (TABLENS,'data-pilot-table'), + ), + (TABLENS,'database-range') : ( + (TABLENS,'database-source-query'), + (TABLENS,'database-source-sql'), + (TABLENS,'database-source-table'), + (TABLENS,'filter'), + (TABLENS,'sort'), + (TABLENS,'subtotal-rules'), + ), + (TABLENS,'database-ranges') : ( + (TABLENS,'database-range'), + ), + (TABLENS,'database-source-query') : ( + ), + (TABLENS,'database-source-sql') : ( + ), + (TABLENS,'database-source-table') : ( + ), +# allowed_children + (TABLENS,'dde-link') : ( + (OFFICENS,'dde-source'), + (TABLENS,'table'), + ), + (TABLENS,'dde-links') : ( + (TABLENS,'dde-link'), + ), + (TABLENS,'deletion') : ( + (OFFICENS,'change-info'), + (TABLENS,'cut-offs'), + (TABLENS,'deletions'), + (TABLENS,'dependencies'), + ), + (TABLENS,'deletions') : ( + (TABLENS,'cell-content-deletion'), + (TABLENS,'change-deletion'), + ), + (TABLENS,'dependencies') : ( + (TABLENS,'dependency'), + ), + (TABLENS,'dependency') : ( + ), + (TABLENS,'detective') : ( + (TABLENS,'highlighted-range'), + (TABLENS,'operation'), + ), +# allowed_children + (TABLENS,'error-macro') : ( + ), + (TABLENS,'error-message') : ( + (TEXTNS,'p'), + ), + (TABLENS,'even-columns') : ( + ), + (TABLENS,'even-rows') : ( + ), + (TABLENS,'filter') : ( + (TABLENS,'filter-and'), + (TABLENS,'filter-condition'), + (TABLENS,'filter-or'), + ), + (TABLENS,'filter-and') : ( + (TABLENS,'filter-condition'), + (TABLENS,'filter-or'), + ), + (TABLENS,'filter-condition') : ( + ), + (TABLENS,'filter-or') : ( + (TABLENS,'filter-and'), + (TABLENS,'filter-condition'), + ), +# allowed_children + (TABLENS,'first-column') : ( + ), + (TABLENS,'first-row') : ( + ), + (TABLENS,'help-message') : ( + (TEXTNS,'p'), + ), + (TABLENS,'highlighted-range') : ( + ), + (TABLENS,'insertion') : ( + (OFFICENS,'change-info'), + (TABLENS,'deletions'), + (TABLENS,'dependencies'), + ), + (TABLENS,'insertion-cut-off') : ( + ), + (TABLENS,'iteration') : ( + ), + (TABLENS,'label-range') : ( + ), + (TABLENS,'label-ranges') : ( + (TABLENS,'label-range'), + ), + (TABLENS,'last-column') : ( + ), + (TABLENS,'last-row') : ( + ), + (TABLENS,'movement') : ( + (OFFICENS,'change-info'), + (TABLENS,'deletions'), + (TABLENS,'dependencies'), + (TABLENS,'source-range-address'), + (TABLENS,'target-range-address'), + ), + (TABLENS,'movement-cut-off') : ( + ), + (TABLENS,'named-expression') : ( + ), + (TABLENS,'named-expressions') : ( + (TABLENS,'named-expression'), + (TABLENS,'named-range'), + ), +# allowed_children + (TABLENS,'named-range') : ( + ), + (TABLENS,'null-date') : ( + ), + (TABLENS,'odd-columns') : ( + ), + (TABLENS,'odd-rows') : ( + ), + (TABLENS,'operation') : ( + ), + (TABLENS,'previous') : ( + (TABLENS,'change-track-table-cell'), + ), + (TABLENS,'scenario') : ( + ), + (TABLENS,'shapes') : ( + (DR3DNS,'scene'), + (DRAWNS,'caption'), + (DRAWNS,'circle'), + (DRAWNS,'connector'), + (DRAWNS,'control'), + (DRAWNS,'custom-shape'), + (DRAWNS,'ellipse'), + (DRAWNS,'frame'), + (DRAWNS,'g'), + (DRAWNS,'line'), + (DRAWNS,'measure'), + (DRAWNS,'page-thumbnail'), + (DRAWNS,'path'), + (DRAWNS,'polygon'), + (DRAWNS,'polyline'), + (DRAWNS,'rect'), + (DRAWNS,'regular-polygon'), + ), +# allowed_children + (TABLENS,'sort') : ( + (TABLENS,'sort-by'), + ), + (TABLENS,'sort-by') : ( + ), + (TABLENS,'sort-groups') : ( + ), + (TABLENS,'source-cell-range') : ( + (TABLENS,'filter'), + ), + (TABLENS,'source-range-address') : ( + ), + (TABLENS,'source-service') : ( + ), + (TABLENS,'subtotal-field') : ( + ), + (TABLENS,'subtotal-rule') : ( + (TABLENS,'subtotal-field'), + ), + (TABLENS,'subtotal-rules') : ( + (TABLENS,'sort-groups'), + (TABLENS,'subtotal-rule'), + ), +# allowed_children + (TABLENS,'table') : ( + (OFFICENS,'dde-source'), + (OFFICENS,'forms'), + (TEXTNS,'soft-page-break'), + (TABLENS,'scenario'), + (TABLENS,'shapes'), + (TABLENS,'table-column'), + (TABLENS,'table-column-group'), + (TABLENS,'table-columns'), + (TABLENS,'table-header-columns'), + (TABLENS,'table-header-rows'), + (TABLENS,'table-row'), + (TABLENS,'table-row-group'), + (TABLENS,'table-rows'), + (TABLENS,'table-source'), + ), + (TABLENS,'table-cell') : ( + (DR3DNS,'scene'), + (DRAWNS,'a'), + (DRAWNS,'caption'), + (DRAWNS,'circle'), + (DRAWNS,'connector'), + (DRAWNS,'control'), + (DRAWNS,'custom-shape'), + (DRAWNS,'ellipse'), + (DRAWNS,'frame'), + (DRAWNS,'g'), + (DRAWNS,'line'), + (DRAWNS,'measure'), + (DRAWNS,'page-thumbnail'), + (DRAWNS,'path'), + (DRAWNS,'polygon'), + (DRAWNS,'polyline'), + (DRAWNS,'rect'), + (DRAWNS,'regular-polygon'), + (OFFICENS,'annotation'), + (TABLENS,'cell-range-source'), + (TABLENS,'detective'), + (TABLENS,'table'), + (TEXTNS,'alphabetical-index'), + (TEXTNS,'bibliography'), + (TEXTNS,'change'), + (TEXTNS,'change-end'), + (TEXTNS,'change-start'), + (TEXTNS,'h'), + (TEXTNS,'illustration-index'), + (TEXTNS,'list'), + (TEXTNS,'numbered-paragraph'), + (TEXTNS,'object-index'), + (TEXTNS,'p'), + (TEXTNS,'section'), + (TEXTNS,'soft-page-break'), + (TEXTNS,'table-index'), + (TEXTNS,'table-of-content'), + (TEXTNS,'user-index'), + ), +# allowed_children + (TABLENS,'table-column') : ( + ), + (TABLENS,'table-column-group') : ( + (TABLENS,'table-column'), + (TABLENS,'table-column-group'), + (TABLENS,'table-columns'), + (TABLENS,'table-header-columns'), + ), + (TABLENS,'table-columns') : ( + (TABLENS,'table-column'), + ), + (TABLENS,'table-header-columns') : ( + (TABLENS,'table-column'), + ), + (TABLENS,'table-header-rows') : ( + (TABLENS,'table-row'), + (TEXTNS,'soft-page-break'), + ), + (TABLENS,'table-row') : ( + (TABLENS,'covered-table-cell'), + (TABLENS,'table-cell'), + ), + (TABLENS,'table-row-group') : ( + (TABLENS,'table-header-rows'), + (TABLENS,'table-row'), + (TABLENS,'table-row-group'), + (TABLENS,'table-rows'), + (TEXTNS,'soft-page-break'), + ), + (TABLENS,'table-rows') : ( + (TABLENS,'table-row'), + (TEXTNS,'soft-page-break'), + ), +# allowed_children + (TABLENS,'table-source') : ( + ), + (TABLENS,'table-template') : ( + (TABLENS,'body'), + (TABLENS,'even-columns'), + (TABLENS,'even-rows'), + (TABLENS,'first-column'), + (TABLENS,'first-row'), + (TABLENS,'last-column'), + (TABLENS,'last-row'), + (TABLENS,'odd-columns'), + (TABLENS,'odd-rows'), + ), + (TABLENS,'target-range-address') : ( + ), + (TABLENS,'tracked-changes') : ( + (TABLENS,'cell-content-change'), + (TABLENS,'deletion'), + (TABLENS,'insertion'), + (TABLENS,'movement'), + ), +# allowed_children + (TEXTNS,'a') : ( + (DR3DNS,'scene'), + (DRAWNS,'a'), + (DRAWNS,'caption'), + (DRAWNS,'circle'), + (DRAWNS,'connector'), + (DRAWNS,'control'), + (DRAWNS,'custom-shape'), + (DRAWNS,'ellipse'), + (DRAWNS,'frame'), + (DRAWNS,'g'), + (DRAWNS,'line'), + (DRAWNS,'measure'), + (DRAWNS,'page-thumbnail'), + (DRAWNS,'path'), + (DRAWNS,'polygon'), + (DRAWNS,'polyline'), + (DRAWNS,'rect'), + (DRAWNS,'regular-polygon'), + (OFFICENS,'annotation'), + (OFFICENS,'event-listeners'), + (PRESENTATIONNS,'date-time'), + (PRESENTATIONNS,'footer'), + (PRESENTATIONNS,'header'), + (TEXTNS,'a'), + (TEXTNS,'alphabetical-index-mark'), + (TEXTNS,'alphabetical-index-mark-end'), + (TEXTNS,'alphabetical-index-mark-start'), + (TEXTNS,'author-initials'), + (TEXTNS,'author-name'), + (TEXTNS,'bibliography-mark'), + (TEXTNS,'bookmark'), + (TEXTNS,'bookmark-end'), + (TEXTNS,'bookmark-ref'), + (TEXTNS,'bookmark-start'), + (TEXTNS,'change'), + (TEXTNS,'change-end'), + (TEXTNS,'change-start'), + (TEXTNS,'chapter'), + (TEXTNS,'conditional-text'), + (TEXTNS,'creation-date'), + (TEXTNS,'creation-time'), + (TEXTNS,'creator'), + (TEXTNS,'database-display'), + (TEXTNS,'database-name'), + (TEXTNS,'database-next'), + (TEXTNS,'database-row-number'), + (TEXTNS,'database-row-select'), + (TEXTNS,'date'), + (TEXTNS,'dde-connection'), + (TEXTNS,'description'), + (TEXTNS,'editing-cycles'), + (TEXTNS,'editing-duration'), + (TEXTNS,'execute-macro'), + (TEXTNS,'expression'), + (TEXTNS,'file-name'), + (TEXTNS,'hidden-paragraph'), + (TEXTNS,'hidden-text'), + (TEXTNS,'initial-creator'), + (TEXTNS,'keywords'), + (TEXTNS,'line-break'), + (TEXTNS,'measure'), + (TEXTNS,'modification-date'), + (TEXTNS,'modification-time'), + (TEXTNS,'note'), + (TEXTNS,'note-ref'), + (TEXTNS,'page-count'), + (TEXTNS,'paragraph-count'), + (TEXTNS,'word-count'), + (TEXTNS,'character-count'), + (TEXTNS,'table-count'), + (TEXTNS,'image-count'), + (TEXTNS,'object-count'), + (TEXTNS,'page-continuation'), + (TEXTNS,'page-number'), + (TEXTNS,'page-variable-get'), + (TEXTNS,'page-variable-set'), + (TEXTNS,'placeholder'), + (TEXTNS,'print-date'), + (TEXTNS,'print-time'), + (TEXTNS,'printed-by'), + (TEXTNS,'reference-mark'), + (TEXTNS,'reference-mark-end'), + (TEXTNS,'reference-mark-start'), + (TEXTNS,'reference-ref'), + (TEXTNS,'ruby'), + (TEXTNS,'s'), + (TEXTNS,'script'), + (TEXTNS,'sender-city'), + (TEXTNS,'sender-company'), + (TEXTNS,'sender-country'), + (TEXTNS,'sender-email'), + (TEXTNS,'sender-fax'), + (TEXTNS,'sender-firstname'), + (TEXTNS,'sender-initials'), + (TEXTNS,'sender-lastname'), + (TEXTNS,'sender-phone-private'), + (TEXTNS,'sender-phone-work'), + (TEXTNS,'sender-position'), + (TEXTNS,'sender-postal-code'), + (TEXTNS,'sender-state-or-province'), + (TEXTNS,'sender-street'), + (TEXTNS,'sender-title'), + (TEXTNS,'sequence'), + (TEXTNS,'sequence-ref'), + (TEXTNS,'sheet-name'), + (TEXTNS,'soft-page-break'), + (TEXTNS,'span'), + (TEXTNS,'subject'), + (TEXTNS,'tab'), + (TEXTNS,'table-formula'), + (TEXTNS,'template-name'), + (TEXTNS,'text-input'), + (TEXTNS,'time'), + (TEXTNS,'title'), + (TEXTNS,'toc-mark'), + (TEXTNS,'toc-mark-end'), + (TEXTNS,'toc-mark-start'), + (TEXTNS,'user-defined'), + (TEXTNS,'user-field-get'), + (TEXTNS,'user-field-input'), + (TEXTNS,'user-index-mark'), + (TEXTNS,'user-index-mark-end'), + (TEXTNS,'user-index-mark-start'), + (TEXTNS,'variable-get'), + (TEXTNS,'variable-input'), + (TEXTNS,'variable-set'), + ), +# allowed_children + (TEXTNS,'alphabetical-index') : ( + (TEXTNS,'alphabetical-index-source'), + (TEXTNS,'index-body'), + ), + (TEXTNS,'alphabetical-index-auto-mark-file') : ( + ), + (TEXTNS,'alphabetical-index-entry-template') : ( + (TEXTNS,'index-entry-chapter'), + (TEXTNS,'index-entry-page-number'), + (TEXTNS,'index-entry-span'), + (TEXTNS,'index-entry-tab-stop'), + (TEXTNS,'index-entry-text'), + ), + (TEXTNS,'alphabetical-index-mark') : ( + ), + (TEXTNS,'alphabetical-index-mark-end') : ( + ), + (TEXTNS,'alphabetical-index-mark-start') : ( + ), + (TEXTNS,'alphabetical-index-source') : ( + (TEXTNS,'alphabetical-index-entry-template'), + (TEXTNS,'index-title-template'), + ), + (TEXTNS,'author-initials') : ( + ), + (TEXTNS,'author-name') : ( + ), + (TEXTNS,'bibliography') : ( + (TEXTNS,'bibliography-source'), + (TEXTNS,'index-body'), + ), + (TEXTNS,'bibliography-configuration') : ( + (TEXTNS,'sort-key'), + ), + (TEXTNS,'bibliography-entry-template') : ( + (TEXTNS,'index-entry-bibliography'), + (TEXTNS,'index-entry-span'), + (TEXTNS,'index-entry-tab-stop'), + ), +# allowed_children + (TEXTNS,'bibliography-mark') : ( + ), + (TEXTNS,'bibliography-source') : ( + (TEXTNS,'bibliography-entry-template'), + (TEXTNS,'index-title-template'), + ), + (TEXTNS,'bookmark') : ( + ), + (TEXTNS,'bookmark-end') : ( + ), + (TEXTNS,'bookmark-ref') : ( + ), + (TEXTNS,'bookmark-start') : ( + ), + (TEXTNS,'change') : ( + ), + (TEXTNS,'change-end') : ( + ), + (TEXTNS,'change-start') : ( + ), + (TEXTNS,'changed-region') : ( + (TEXTNS,'deletion'), + (TEXTNS,'format-change'), + (TEXTNS,'insertion'), + ), + (TEXTNS,'chapter') : ( + ), + (TEXTNS,'character-count') : ( + ), + (TEXTNS,'conditional-text') : ( + ), + (TEXTNS,'creation-date') : ( + ), + (TEXTNS,'creation-time') : ( + ), + (TEXTNS,'creator') : ( + ), + (TEXTNS,'database-display') : ( + (FORMNS,'connection-resource'), + ), + (TEXTNS,'database-name') : ( + (FORMNS,'connection-resource'), + ), + (TEXTNS,'database-next') : ( + (FORMNS,'connection-resource'), + ), + (TEXTNS,'database-row-number') : ( + (FORMNS,'connection-resource'), + ), + (TEXTNS,'database-row-select') : ( + (FORMNS,'connection-resource'), + ), + (TEXTNS,'date') : ( + ), + (TEXTNS,'dde-connection') : ( + ), + (TEXTNS,'dde-connection-decl') : ( + ), + (TEXTNS,'dde-connection-decls') : ( + (TEXTNS,'dde-connection-decl'), + ), +# allowed_children + (TEXTNS,'deletion') : ( + (DR3DNS,'scene'), + (DRAWNS,'a'), + (DRAWNS,'caption'), + (DRAWNS,'circle'), + (DRAWNS,'connector'), + (DRAWNS,'control'), + (DRAWNS,'custom-shape'), + (DRAWNS,'ellipse'), + (DRAWNS,'frame'), + (DRAWNS,'g'), + (DRAWNS,'line'), + (DRAWNS,'measure'), + (DRAWNS,'page-thumbnail'), + (DRAWNS,'path'), + (DRAWNS,'polygon'), + (DRAWNS,'polyline'), + (DRAWNS,'rect'), + (DRAWNS,'regular-polygon'), + (OFFICENS,'change-info'), + (TABLENS,'table'), + (TEXTNS,'alphabetical-index'), + (TEXTNS,'bibliography'), + (TEXTNS,'change'), + (TEXTNS,'change-end'), + (TEXTNS,'change-start'), + (TEXTNS,'h'), + (TEXTNS,'illustration-index'), + (TEXTNS,'list'), + (TEXTNS,'numbered-paragraph'), + (TEXTNS,'object-index'), + (TEXTNS,'p'), + (TEXTNS,'section'), + (TEXTNS,'soft-page-break'), + (TEXTNS,'table-index'), + (TEXTNS,'table-of-content'), + (TEXTNS,'user-index'), + ), + (TEXTNS,'description') : ( + ), + (TEXTNS,'editing-cycles') : ( + ), + (TEXTNS,'editing-duration') : ( + ), + (TEXTNS,'execute-macro') : ( + (OFFICENS,'event-listeners'), + ), + (TEXTNS,'expression') : ( + ), + (TEXTNS,'file-name') : ( + ), + (TEXTNS,'format-change') : ( + (OFFICENS,'change-info'), + ), +# allowed_children + (TEXTNS,'h') : ( + (DR3DNS,'scene'), + (DRAWNS,'a'), + (DRAWNS,'caption'), + (DRAWNS,'circle'), + (DRAWNS,'connector'), + (DRAWNS,'control'), + (DRAWNS,'custom-shape'), + (DRAWNS,'ellipse'), + (DRAWNS,'frame'), + (DRAWNS,'g'), + (DRAWNS,'line'), + (DRAWNS,'measure'), + (DRAWNS,'page-thumbnail'), + (DRAWNS,'path'), + (DRAWNS,'polygon'), + (DRAWNS,'polyline'), + (DRAWNS,'rect'), + (DRAWNS,'regular-polygon'), + (OFFICENS,'annotation'), + (PRESENTATIONNS,'date-time'), + (PRESENTATIONNS,'footer'), + (PRESENTATIONNS,'header'), + (TEXTNS,'a'), + (TEXTNS,'alphabetical-index-mark'), + (TEXTNS,'alphabetical-index-mark-end'), + (TEXTNS,'alphabetical-index-mark-start'), + (TEXTNS,'author-initials'), + (TEXTNS,'author-name'), + (TEXTNS,'bibliography-mark'), + (TEXTNS,'bookmark'), + (TEXTNS,'bookmark-end'), + (TEXTNS,'bookmark-ref'), + (TEXTNS,'bookmark-start'), + (TEXTNS,'change'), + (TEXTNS,'change-end'), + (TEXTNS,'change-start'), + (TEXTNS,'chapter'), + (TEXTNS,'conditional-text'), + (TEXTNS,'creation-date'), + (TEXTNS,'creation-time'), + (TEXTNS,'creator'), + (TEXTNS,'database-display'), + (TEXTNS,'database-name'), + (TEXTNS,'database-next'), + (TEXTNS,'database-row-number'), + (TEXTNS,'database-row-select'), + (TEXTNS,'date'), + (TEXTNS,'dde-connection'), + (TEXTNS,'description'), + (TEXTNS,'editing-cycles'), + (TEXTNS,'editing-duration'), + (TEXTNS,'execute-macro'), + (TEXTNS,'expression'), + (TEXTNS,'file-name'), + (TEXTNS,'hidden-paragraph'), + (TEXTNS,'hidden-text'), + (TEXTNS,'initial-creator'), + (TEXTNS,'keywords'), + (TEXTNS,'line-break'), + (TEXTNS,'measure'), + (TEXTNS,'modification-date'), + (TEXTNS,'modification-time'), + (TEXTNS,'note'), + (TEXTNS,'note-ref'), + (TEXTNS,'number'), + (TEXTNS,'page-count'), + (TEXTNS,'paragraph-count'), + (TEXTNS,'word-count'), + (TEXTNS,'character-count'), + (TEXTNS,'table-count'), + (TEXTNS,'image-count'), + (TEXTNS,'object-count'), + (TEXTNS,'page-continuation'), + (TEXTNS,'page-number'), + (TEXTNS,'page-variable-get'), + (TEXTNS,'page-variable-set'), + (TEXTNS,'placeholder'), + (TEXTNS,'print-date'), + (TEXTNS,'print-time'), + (TEXTNS,'printed-by'), + (TEXTNS,'reference-mark'), + (TEXTNS,'reference-mark-end'), + (TEXTNS,'reference-mark-start'), + (TEXTNS,'reference-ref'), + (TEXTNS,'ruby'), + (TEXTNS,'s'), + (TEXTNS,'script'), + (TEXTNS,'sender-city'), + (TEXTNS,'sender-company'), + (TEXTNS,'sender-country'), + (TEXTNS,'sender-email'), + (TEXTNS,'sender-fax'), + (TEXTNS,'sender-firstname'), + (TEXTNS,'sender-initials'), + (TEXTNS,'sender-lastname'), + (TEXTNS,'sender-phone-private'), + (TEXTNS,'sender-phone-work'), + (TEXTNS,'sender-position'), + (TEXTNS,'sender-postal-code'), + (TEXTNS,'sender-state-or-province'), + (TEXTNS,'sender-street'), + (TEXTNS,'sender-title'), + (TEXTNS,'sequence'), + (TEXTNS,'sequence-ref'), + (TEXTNS,'sheet-name'), + (TEXTNS,'soft-page-break'), + (TEXTNS,'span'), + (TEXTNS,'subject'), + (TEXTNS,'tab'), + (TEXTNS,'table-formula'), + (TEXTNS,'template-name'), + (TEXTNS,'text-input'), + (TEXTNS,'time'), + (TEXTNS,'title'), + (TEXTNS,'toc-mark'), + (TEXTNS,'toc-mark-end'), + (TEXTNS,'toc-mark-start'), + (TEXTNS,'user-defined'), + (TEXTNS,'user-field-get'), + (TEXTNS,'user-field-input'), + (TEXTNS,'user-index-mark'), + (TEXTNS,'user-index-mark-end'), + (TEXTNS,'user-index-mark-start'), + (TEXTNS,'variable-get'), + (TEXTNS,'variable-input'), + (TEXTNS,'variable-set'), + ), +# allowed_children + (TEXTNS,'hidden-paragraph') : ( + ), + (TEXTNS,'hidden-text') : ( + ), + (TEXTNS,'illustration-index') : ( + (TEXTNS,'illustration-index-source'), + (TEXTNS,'index-body'), + ), + (TEXTNS,'illustration-index-entry-template') : ( + (TEXTNS,'index-entry-page-number'), + (TEXTNS,'index-entry-span'), + (TEXTNS,'index-entry-tab-stop'), + (TEXTNS,'index-entry-text'), + ), + (TEXTNS,'illustration-index-source') : ( + (TEXTNS,'illustration-index-entry-template'), + (TEXTNS,'index-title-template'), + ), + (TEXTNS,'image-count') : ( + ), +# allowed_children + (TEXTNS,'index-body') : ( + (DR3DNS,'scene'), + (DRAWNS,'a'), + (DRAWNS,'caption'), + (DRAWNS,'circle'), + (DRAWNS,'connector'), + (DRAWNS,'control'), + (DRAWNS,'custom-shape'), + (DRAWNS,'ellipse'), + (DRAWNS,'frame'), + (DRAWNS,'g'), + (DRAWNS,'line'), + (DRAWNS,'measure'), + (DRAWNS,'page-thumbnail'), + (DRAWNS,'path'), + (DRAWNS,'polygon'), + (DRAWNS,'polyline'), + (DRAWNS,'rect'), + (DRAWNS,'regular-polygon'), + (TABLENS,'table'), + (TEXTNS,'alphabetical-index'), + (TEXTNS,'bibliography'), + (TEXTNS,'change'), + (TEXTNS,'change-end'), + (TEXTNS,'change-start'), + (TEXTNS,'h'), + (TEXTNS,'illustration-index'), + (TEXTNS,'index-title'), + (TEXTNS,'list'), + (TEXTNS,'numbered-paragraph'), + (TEXTNS,'object-index'), + (TEXTNS,'p'), + (TEXTNS,'section'), + (TEXTNS,'soft-page-break'), + (TEXTNS,'table-index'), + (TEXTNS,'table-of-content'), + (TEXTNS,'user-index'), + ), + (TEXTNS,'index-entry-bibliography') : ( + ), + (TEXTNS,'index-entry-chapter') : ( + ), + (TEXTNS,'index-entry-link-end') : ( + ), + (TEXTNS,'index-entry-link-start') : ( + ), + (TEXTNS,'index-entry-page-number') : ( + ), + (TEXTNS,'index-entry-span') : ( + ), + (TEXTNS,'index-entry-tab-stop') : ( + ), + (TEXTNS,'index-entry-text') : ( + ), + (TEXTNS,'index-source-style') : ( + ), + (TEXTNS,'index-source-styles') : ( + (TEXTNS,'index-source-style'), + ), +# allowed_children + (TEXTNS,'index-title') : ( + (DR3DNS,'scene'), + (DRAWNS,'a'), + (DRAWNS,'caption'), + (DRAWNS,'circle'), + (DRAWNS,'connector'), + (DRAWNS,'control'), + (DRAWNS,'custom-shape'), + (DRAWNS,'ellipse'), + (DRAWNS,'frame'), + (DRAWNS,'g'), + (DRAWNS,'line'), + (DRAWNS,'measure'), + (DRAWNS,'page-thumbnail'), + (DRAWNS,'path'), + (DRAWNS,'polygon'), + (DRAWNS,'polyline'), + (DRAWNS,'rect'), + (DRAWNS,'regular-polygon'), + (TABLENS,'table'), + (TEXTNS,'alphabetical-index'), + (TEXTNS,'bibliography'), + (TEXTNS,'change'), + (TEXTNS,'change-end'), + (TEXTNS,'change-start'), + (TEXTNS,'h'), + (TEXTNS,'illustration-index'), + (TEXTNS,'index-title'), + (TEXTNS,'list'), + (TEXTNS,'numbered-paragraph'), + (TEXTNS,'object-index'), + (TEXTNS,'p'), + (TEXTNS,'section'), + (TEXTNS,'soft-page-break'), + (TEXTNS,'table-index'), + (TEXTNS,'table-of-content'), + (TEXTNS,'user-index'), + ), + (TEXTNS,'index-title-template') : ( + ), + (TEXTNS,'initial-creator') : ( + ), + (TEXTNS,'insertion') : ( + (OFFICENS,'change-info'), + ), + (TEXTNS,'keywords') : ( + ), + (TEXTNS,'line-break') : ( + ), + (TEXTNS,'linenumbering-configuration') : ( + (TEXTNS,'linenumbering-separator'), + ), + (TEXTNS,'linenumbering-separator') : ( + ), + (TEXTNS,'list') : ( + (TEXTNS,'list-header'), + (TEXTNS,'list-item'), + ), + (TEXTNS,'list-header') : ( + (TEXTNS,'h'), + (TEXTNS,'list'), + (TEXTNS,'number'), + (TEXTNS,'p'), + (TEXTNS,'soft-page-break'), + ), + (TEXTNS,'list-item') : ( + (TEXTNS,'h'), + (TEXTNS,'list'), + (TEXTNS,'number'), + (TEXTNS,'p'), + (TEXTNS,'soft-page-break'), + ), + (TEXTNS,'list-level-style-bullet') : ( + (STYLENS,'list-level-properties'), + (STYLENS,'text-properties'), + ), + (TEXTNS,'list-level-style-image') : ( + (OFFICENS,'binary-data'), + (STYLENS,'list-level-properties'), + ), + (TEXTNS,'list-level-style-number') : ( + (STYLENS,'list-level-properties'), + (STYLENS,'text-properties'), + ), + (TEXTNS,'list-style') : ( + (TEXTNS,'list-level-style-bullet'), + (TEXTNS,'list-level-style-image'), + (TEXTNS,'list-level-style-number'), + ), + (TEXTNS,'measure') : ( + ), + (TEXTNS,'modification-date') : ( + ), + (TEXTNS,'modification-time') : ( + ), + (TEXTNS,'note') : ( + (TEXTNS,'note-body'), + (TEXTNS,'note-citation'), + ), +# allowed_children + (TEXTNS,'note-body') : ( + (DR3DNS,'scene'), + (DRAWNS,'a'), + (DRAWNS,'caption'), + (DRAWNS,'circle'), + (DRAWNS,'connector'), + (DRAWNS,'control'), + (DRAWNS,'custom-shape'), + (DRAWNS,'ellipse'), + (DRAWNS,'frame'), + (DRAWNS,'g'), + (DRAWNS,'line'), + (DRAWNS,'measure'), + (DRAWNS,'page-thumbnail'), + (DRAWNS,'path'), + (DRAWNS,'polygon'), + (DRAWNS,'polyline'), + (DRAWNS,'rect'), + (DRAWNS,'regular-polygon'), + (TABLENS,'table'), + (TEXTNS,'alphabetical-index'), + (TEXTNS,'bibliography'), + (TEXTNS,'change'), + (TEXTNS,'change-end'), + (TEXTNS,'change-start'), + (TEXTNS,'h'), + (TEXTNS,'illustration-index'), + (TEXTNS,'list'), + (TEXTNS,'numbered-paragraph'), + (TEXTNS,'object-index'), + (TEXTNS,'p'), + (TEXTNS,'section'), + (TEXTNS,'soft-page-break'), + (TEXTNS,'table-index'), + (TEXTNS,'table-of-content'), + (TEXTNS,'user-index'), + ), + (TEXTNS,'note-citation') : ( + ), + (TEXTNS,'note-continuation-notice-backward') : ( + ), + (TEXTNS,'note-continuation-notice-forward') : ( + ), + (TEXTNS,'note-ref') : ( + ), + (TEXTNS,'notes-configuration') : ( + (TEXTNS,'note-continuation-notice-backward'), + (TEXTNS,'note-continuation-notice-forward'), + ), + (TEXTNS,'number') : ( + ), + (TEXTNS,'numbered-paragraph') : ( + (TEXTNS,'h'), + (TEXTNS,'number'), + (TEXTNS,'p'), + ), + (TEXTNS,'object-count') : ( + ), + (TEXTNS,'object-index') : ( + (TEXTNS,'index-body'), + (TEXTNS,'object-index-source'), + ), + (TEXTNS,'object-index-entry-template') : ( + (TEXTNS,'index-entry-page-number'), + (TEXTNS,'index-entry-span'), + (TEXTNS,'index-entry-tab-stop'), + (TEXTNS,'index-entry-text'), + ), + (TEXTNS,'object-index-source') : ( + (TEXTNS,'index-title-template'), + (TEXTNS,'object-index-entry-template'), + ), + (TEXTNS,'outline-level-style') : ( + (STYLENS,'list-level-properties'), + (STYLENS,'text-properties'), + ), + (TEXTNS,'outline-style') : ( + (TEXTNS,'outline-level-style'), + ), +# allowed_children + (TEXTNS,'p') : ( + (DR3DNS,'scene'), + (DRAWNS,'a'), + (DRAWNS,'caption'), + (DRAWNS,'circle'), + (DRAWNS,'connector'), + (DRAWNS,'control'), + (DRAWNS,'custom-shape'), + (DRAWNS,'ellipse'), + (DRAWNS,'frame'), + (DRAWNS,'g'), + (DRAWNS,'line'), + (DRAWNS,'measure'), + (DRAWNS,'page-thumbnail'), + (DRAWNS,'path'), + (DRAWNS,'polygon'), + (DRAWNS,'polyline'), + (DRAWNS,'rect'), + (DRAWNS,'regular-polygon'), + (OFFICENS,'annotation'), + (PRESENTATIONNS,'date-time'), + (PRESENTATIONNS,'footer'), + (PRESENTATIONNS,'header'), + (TEXTNS,'a'), + (TEXTNS,'alphabetical-index-mark'), + (TEXTNS,'alphabetical-index-mark-end'), + (TEXTNS,'alphabetical-index-mark-start'), + (TEXTNS,'author-initials'), + (TEXTNS,'author-name'), + (TEXTNS,'bibliography-mark'), + (TEXTNS,'bookmark'), + (TEXTNS,'bookmark-end'), + (TEXTNS,'bookmark-ref'), + (TEXTNS,'bookmark-start'), + (TEXTNS,'change'), + (TEXTNS,'change-end'), + (TEXTNS,'change-start'), + (TEXTNS,'chapter'), + (TEXTNS,'character-count'), + (TEXTNS,'conditional-text'), + (TEXTNS,'creation-date'), + (TEXTNS,'creation-time'), + (TEXTNS,'creator'), + (TEXTNS,'database-display'), + (TEXTNS,'database-name'), + (TEXTNS,'database-next'), + (TEXTNS,'database-row-number'), + (TEXTNS,'database-row-select'), + (TEXTNS,'date'), + (TEXTNS,'dde-connection'), + (TEXTNS,'description'), + (TEXTNS,'editing-cycles'), + (TEXTNS,'editing-duration'), + (TEXTNS,'execute-macro'), + (TEXTNS,'expression'), + (TEXTNS,'file-name'), + (TEXTNS,'hidden-paragraph'), + (TEXTNS,'hidden-text'), + (TEXTNS,'image-count'), + (TEXTNS,'initial-creator'), + (TEXTNS,'keywords'), + (TEXTNS,'line-break'), + (TEXTNS,'measure'), + (TEXTNS,'modification-date'), + (TEXTNS,'modification-time'), + (TEXTNS,'note'), + (TEXTNS,'note-ref'), + (TEXTNS,'object-count'), + (TEXTNS,'page-continuation'), + (TEXTNS,'page-count'), + (TEXTNS,'page-number'), + (TEXTNS,'page-variable-get'), + (TEXTNS,'page-variable-set'), + (TEXTNS,'paragraph-count'), + (TEXTNS,'placeholder'), + (TEXTNS,'print-date'), + (TEXTNS,'printed-by'), + (TEXTNS,'print-time'), + (TEXTNS,'reference-mark'), + (TEXTNS,'reference-mark-end'), + (TEXTNS,'reference-mark-start'), + (TEXTNS,'reference-ref'), + (TEXTNS,'ruby'), + (TEXTNS,'s'), + (TEXTNS,'script'), + (TEXTNS,'sender-city'), + (TEXTNS,'sender-company'), + (TEXTNS,'sender-country'), + (TEXTNS,'sender-email'), + (TEXTNS,'sender-fax'), + (TEXTNS,'sender-firstname'), + (TEXTNS,'sender-initials'), + (TEXTNS,'sender-lastname'), + (TEXTNS,'sender-phone-private'), + (TEXTNS,'sender-phone-work'), + (TEXTNS,'sender-position'), + (TEXTNS,'sender-postal-code'), + (TEXTNS,'sender-state-or-province'), + (TEXTNS,'sender-street'), + (TEXTNS,'sender-title'), + (TEXTNS,'sequence'), + (TEXTNS,'sequence-ref'), + (TEXTNS,'sheet-name'), + (TEXTNS,'soft-page-break'), + (TEXTNS,'span'), + (TEXTNS,'subject'), + (TEXTNS,'tab'), + (TEXTNS,'table-count'), + (TEXTNS,'table-formula'), + (TEXTNS,'template-name'), + (TEXTNS,'text-input'), + (TEXTNS,'time'), + (TEXTNS,'title'), + (TEXTNS,'toc-mark'), + (TEXTNS,'toc-mark-end'), + (TEXTNS,'toc-mark-start'), + (TEXTNS,'user-defined'), + (TEXTNS,'user-field-get'), + (TEXTNS,'user-field-input'), + (TEXTNS,'user-index-mark'), + (TEXTNS,'user-index-mark-end'), + (TEXTNS,'user-index-mark-start'), + (TEXTNS,'variable-get'), + (TEXTNS,'variable-input'), + (TEXTNS,'variable-set'), + (TEXTNS,'word-count'), + ), + (TEXTNS,'page') : ( + ), + (TEXTNS,'page-count') : ( + ), + (TEXTNS,'page-continuation') : ( + ), + (TEXTNS,'page-number') : ( + ), + (TEXTNS,'page-sequence') : ( + (TEXTNS,'page'), + ), + (TEXTNS,'page-variable-get') : ( + ), + (TEXTNS,'page-variable-set') : ( + ), + (TEXTNS,'paragraph-count') : ( + ), + (TEXTNS,'placeholder') : ( + ), + (TEXTNS,'print-date') : ( + ), + (TEXTNS,'print-time') : ( + ), + (TEXTNS,'printed-by') : ( + ), + (TEXTNS,'reference-mark') : ( + ), + (TEXTNS,'reference-mark-end') : ( + ), +# allowed_children + (TEXTNS,'reference-mark-start') : ( + ), + (TEXTNS,'reference-ref') : ( + ), + (TEXTNS,'ruby') : ( + (TEXTNS,'ruby-base'), + (TEXTNS,'ruby-text'), + ), + (TEXTNS,'ruby-base') : ( + (DR3DNS,'scene'), + (DRAWNS,'a'), + (DRAWNS,'caption'), + (DRAWNS,'circle'), + (DRAWNS,'connector'), + (DRAWNS,'control'), + (DRAWNS,'custom-shape'), + (DRAWNS,'ellipse'), + (DRAWNS,'frame'), + (DRAWNS,'g'), + (DRAWNS,'line'), + (DRAWNS,'measure'), + (DRAWNS,'page-thumbnail'), + (DRAWNS,'path'), + (DRAWNS,'polygon'), + (DRAWNS,'polyline'), + (DRAWNS,'rect'), + (DRAWNS,'regular-polygon'), + (OFFICENS,'annotation'), + (PRESENTATIONNS,'date-time'), + (PRESENTATIONNS,'footer'), + (PRESENTATIONNS,'header'), + (TEXTNS,'a'), + (TEXTNS,'alphabetical-index-mark'), + (TEXTNS,'alphabetical-index-mark-end'), + (TEXTNS,'alphabetical-index-mark-start'), + (TEXTNS,'author-initials'), + (TEXTNS,'author-name'), + (TEXTNS,'bibliography-mark'), + (TEXTNS,'bookmark'), + (TEXTNS,'bookmark-end'), + (TEXTNS,'bookmark-ref'), + (TEXTNS,'bookmark-start'), + (TEXTNS,'change'), + (TEXTNS,'change-end'), + (TEXTNS,'change-start'), + (TEXTNS,'chapter'), + (TEXTNS,'conditional-text'), + (TEXTNS,'creation-date'), + (TEXTNS,'creation-time'), + (TEXTNS,'creator'), + (TEXTNS,'database-display'), + (TEXTNS,'database-name'), + (TEXTNS,'database-next'), + (TEXTNS,'database-row-number'), + (TEXTNS,'database-row-select'), + (TEXTNS,'date'), + (TEXTNS,'dde-connection'), + (TEXTNS,'description'), + (TEXTNS,'editing-cycles'), + (TEXTNS,'editing-duration'), + (TEXTNS,'execute-macro'), + (TEXTNS,'expression'), + (TEXTNS,'file-name'), + (TEXTNS,'hidden-paragraph'), + (TEXTNS,'hidden-text'), + (TEXTNS,'initial-creator'), + (TEXTNS,'keywords'), + (TEXTNS,'line-break'), + (TEXTNS,'measure'), + (TEXTNS,'modification-date'), + (TEXTNS,'modification-time'), + (TEXTNS,'note'), + (TEXTNS,'note-ref'), + (TEXTNS,'page-count'), + (TEXTNS,'paragraph-count'), + (TEXTNS,'word-count'), + (TEXTNS,'character-count'), + (TEXTNS,'table-count'), + (TEXTNS,'image-count'), + (TEXTNS,'object-count'), + (TEXTNS,'page-continuation'), + (TEXTNS,'page-number'), + (TEXTNS,'page-variable-get'), + (TEXTNS,'page-variable-set'), + (TEXTNS,'placeholder'), + (TEXTNS,'print-date'), + (TEXTNS,'print-time'), + (TEXTNS,'printed-by'), + (TEXTNS,'reference-mark'), + (TEXTNS,'reference-mark-end'), + (TEXTNS,'reference-mark-start'), + (TEXTNS,'reference-ref'), + (TEXTNS,'ruby'), + (TEXTNS,'s'), + (TEXTNS,'script'), + (TEXTNS,'sender-city'), + (TEXTNS,'sender-company'), + (TEXTNS,'sender-country'), + (TEXTNS,'sender-email'), + (TEXTNS,'sender-fax'), + (TEXTNS,'sender-firstname'), + (TEXTNS,'sender-initials'), + (TEXTNS,'sender-lastname'), + (TEXTNS,'sender-phone-private'), + (TEXTNS,'sender-phone-work'), + (TEXTNS,'sender-position'), + (TEXTNS,'sender-postal-code'), + (TEXTNS,'sender-state-or-province'), + (TEXTNS,'sender-street'), + (TEXTNS,'sender-title'), + (TEXTNS,'sequence'), + (TEXTNS,'sequence-ref'), + (TEXTNS,'sheet-name'), + (TEXTNS,'soft-page-break'), + (TEXTNS,'span'), + (TEXTNS,'subject'), + (TEXTNS,'tab'), + (TEXTNS,'table-formula'), + (TEXTNS,'template-name'), + (TEXTNS,'text-input'), + (TEXTNS,'time'), + (TEXTNS,'title'), + (TEXTNS,'toc-mark'), + (TEXTNS,'toc-mark-end'), + (TEXTNS,'toc-mark-start'), + (TEXTNS,'user-defined'), + (TEXTNS,'user-field-get'), + (TEXTNS,'user-field-input'), + (TEXTNS,'user-index-mark'), + (TEXTNS,'user-index-mark-end'), + (TEXTNS,'user-index-mark-start'), + (TEXTNS,'variable-get'), + (TEXTNS,'variable-input'), + (TEXTNS,'variable-set'), + ), +# allowed_children + (TEXTNS,'ruby-text') : ( + ), + (TEXTNS,'s') : ( + ), + (TEXTNS,'script') : ( + ), + (TEXTNS,'section') : ( + (DR3DNS,'scene'), + (DRAWNS,'a'), + (DRAWNS,'caption'), + (DRAWNS,'circle'), + (DRAWNS,'connector'), + (DRAWNS,'control'), + (DRAWNS,'custom-shape'), + (DRAWNS,'ellipse'), + (DRAWNS,'frame'), + (DRAWNS,'g'), + (DRAWNS,'line'), + (DRAWNS,'measure'), + (DRAWNS,'page-thumbnail'), + (DRAWNS,'path'), + (DRAWNS,'polygon'), + (DRAWNS,'polyline'), + (DRAWNS,'rect'), + (DRAWNS,'regular-polygon'), + (OFFICENS,'dde-source'), + (TABLENS,'table'), + (TEXTNS,'alphabetical-index'), + (TEXTNS,'bibliography'), + (TEXTNS,'change'), + (TEXTNS,'change-end'), + (TEXTNS,'change-start'), + (TEXTNS,'h'), + (TEXTNS,'illustration-index'), + (TEXTNS,'list'), + (TEXTNS,'numbered-paragraph'), + (TEXTNS,'object-index'), + (TEXTNS,'p'), + (TEXTNS,'section'), + (TEXTNS,'section-source'), + (TEXTNS,'soft-page-break'), + (TEXTNS,'table-index'), + (TEXTNS,'table-of-content'), + (TEXTNS,'user-index'), + ), + (TEXTNS,'section-source') : ( + ), + (TEXTNS,'sender-city') : ( + ), + (TEXTNS,'sender-company') : ( + ), + (TEXTNS,'sender-country') : ( + ), +# allowed_children + (TEXTNS,'sender-email') : ( + ), + (TEXTNS,'sender-fax') : ( + ), + (TEXTNS,'sender-firstname') : ( + ), + (TEXTNS,'sender-initials') : ( + ), + (TEXTNS,'sender-lastname') : ( + ), + (TEXTNS,'sender-phone-private') : ( + ), + (TEXTNS,'sender-phone-work') : ( + ), + (TEXTNS,'sender-position') : ( + ), + (TEXTNS,'sender-postal-code') : ( + ), + (TEXTNS,'sender-state-or-province') : ( + ), + (TEXTNS,'sender-street') : ( + ), + (TEXTNS,'sender-title') : ( + ), + (TEXTNS,'sequence') : ( + ), + (TEXTNS,'sequence-decl') : ( + ), + (TEXTNS,'sequence-decls') : ( + (TEXTNS,'sequence-decl'), + ), + (TEXTNS,'sequence-ref') : ( + ), + (TEXTNS,'sheet-name') : ( + ), + (TEXTNS,'soft-page-break') : ( + ), + (TEXTNS,'sort-key') : ( + ), +# allowed_children + (TEXTNS,'span') : ( + (DR3DNS,'scene'), + (DRAWNS,'a'), + (DRAWNS,'caption'), + (DRAWNS,'circle'), + (DRAWNS,'connector'), + (DRAWNS,'control'), + (DRAWNS,'custom-shape'), + (DRAWNS,'ellipse'), + (DRAWNS,'frame'), + (DRAWNS,'g'), + (DRAWNS,'line'), + (DRAWNS,'measure'), + (DRAWNS,'page-thumbnail'), + (DRAWNS,'path'), + (DRAWNS,'polygon'), + (DRAWNS,'polyline'), + (DRAWNS,'rect'), + (DRAWNS,'regular-polygon'), + (OFFICENS,'annotation'), + (PRESENTATIONNS,'date-time'), + (PRESENTATIONNS,'footer'), + (PRESENTATIONNS,'header'), + (TEXTNS,'a'), + (TEXTNS,'alphabetical-index-mark'), + (TEXTNS,'alphabetical-index-mark-end'), + (TEXTNS,'alphabetical-index-mark-start'), + (TEXTNS,'author-initials'), + (TEXTNS,'author-name'), + (TEXTNS,'bibliography-mark'), + (TEXTNS,'bookmark'), + (TEXTNS,'bookmark-end'), + (TEXTNS,'bookmark-ref'), + (TEXTNS,'bookmark-start'), + (TEXTNS,'change'), + (TEXTNS,'change-end'), + (TEXTNS,'change-start'), + (TEXTNS,'chapter'), + (TEXTNS,'conditional-text'), + (TEXTNS,'creation-date'), + (TEXTNS,'creation-time'), + (TEXTNS,'creator'), + (TEXTNS,'database-display'), + (TEXTNS,'database-name'), + (TEXTNS,'database-next'), + (TEXTNS,'database-row-number'), + (TEXTNS,'database-row-select'), + (TEXTNS,'date'), + (TEXTNS,'dde-connection'), + (TEXTNS,'description'), + (TEXTNS,'editing-cycles'), + (TEXTNS,'editing-duration'), + (TEXTNS,'execute-macro'), + (TEXTNS,'expression'), + (TEXTNS,'file-name'), + (TEXTNS,'hidden-paragraph'), + (TEXTNS,'hidden-text'), + (TEXTNS,'initial-creator'), + (TEXTNS,'keywords'), + (TEXTNS,'line-break'), + (TEXTNS,'measure'), + (TEXTNS,'modification-date'), + (TEXTNS,'modification-time'), + (TEXTNS,'note'), + (TEXTNS,'note-ref'), + (TEXTNS,'page-count'), + (TEXTNS,'paragraph-count'), + (TEXTNS,'word-count'), + (TEXTNS,'character-count'), + (TEXTNS,'table-count'), + (TEXTNS,'image-count'), + (TEXTNS,'object-count'), + (TEXTNS,'page-continuation'), + (TEXTNS,'page-number'), + (TEXTNS,'page-variable-get'), + (TEXTNS,'page-variable-set'), + (TEXTNS,'placeholder'), + (TEXTNS,'print-date'), + (TEXTNS,'print-time'), + (TEXTNS,'printed-by'), + (TEXTNS,'reference-mark'), + (TEXTNS,'reference-mark-end'), + (TEXTNS,'reference-mark-start'), + (TEXTNS,'reference-ref'), + (TEXTNS,'ruby'), + (TEXTNS,'s'), + (TEXTNS,'script'), + (TEXTNS,'sender-city'), + (TEXTNS,'sender-company'), + (TEXTNS,'sender-country'), + (TEXTNS,'sender-email'), + (TEXTNS,'sender-fax'), + (TEXTNS,'sender-firstname'), + (TEXTNS,'sender-initials'), + (TEXTNS,'sender-lastname'), + (TEXTNS,'sender-phone-private'), + (TEXTNS,'sender-phone-work'), + (TEXTNS,'sender-position'), + (TEXTNS,'sender-postal-code'), + (TEXTNS,'sender-state-or-province'), + (TEXTNS,'sender-street'), + (TEXTNS,'sender-title'), + (TEXTNS,'sequence'), + (TEXTNS,'sequence-ref'), + (TEXTNS,'sheet-name'), + (TEXTNS,'soft-page-break'), + (TEXTNS,'span'), + (TEXTNS,'subject'), + (TEXTNS,'tab'), + (TEXTNS,'table-formula'), + (TEXTNS,'template-name'), + (TEXTNS,'text-input'), + (TEXTNS,'time'), + (TEXTNS,'title'), + (TEXTNS,'toc-mark'), + (TEXTNS,'toc-mark-end'), + (TEXTNS,'toc-mark-start'), + (TEXTNS,'user-defined'), + (TEXTNS,'user-field-get'), + (TEXTNS,'user-field-input'), + (TEXTNS,'user-index-mark'), + (TEXTNS,'user-index-mark-end'), + (TEXTNS,'user-index-mark-start'), + (TEXTNS,'variable-get'), + (TEXTNS,'variable-input'), + (TEXTNS,'variable-set'), + ), +# allowed_children + (TEXTNS,'subject') : ( + ), + (TEXTNS,'tab') : ( + ), + (TEXTNS,'table-count') : ( + ), + (TEXTNS,'table-formula') : ( + ), + (TEXTNS,'table-index') : ( + (TEXTNS,'index-body'), + (TEXTNS,'table-index-source'), + ), + (TEXTNS,'table-index-entry-template') : ( + (TEXTNS,'index-entry-page-number'), + (TEXTNS,'index-entry-span'), + (TEXTNS,'index-entry-tab-stop'), + (TEXTNS,'index-entry-text'), + ), + (TEXTNS,'table-index-source') : ( + (TEXTNS,'index-title-template'), + (TEXTNS,'table-index-entry-template'), + ), + (TEXTNS,'table-of-content') : ( + (TEXTNS,'index-body'), + (TEXTNS,'table-of-content-source'), + ), + (TEXTNS,'table-of-content-entry-template') : ( + (TEXTNS,'index-entry-chapter'), + (TEXTNS,'index-entry-link-end'), + (TEXTNS,'index-entry-link-start'), + (TEXTNS,'index-entry-page-number'), + (TEXTNS,'index-entry-span'), + (TEXTNS,'index-entry-tab-stop'), + (TEXTNS,'index-entry-text'), + ), + (TEXTNS,'table-of-content-source') : ( + (TEXTNS,'index-source-styles'), + (TEXTNS,'index-title-template'), + (TEXTNS,'table-of-content-entry-template'), + ), + (TEXTNS,'template-name') : ( + ), + (TEXTNS,'text-input') : ( + ), + (TEXTNS,'time') : ( + ), + (TEXTNS,'title') : ( + ), + (TEXTNS,'toc-mark') : ( + ), + (TEXTNS,'toc-mark-end') : ( + ), + (TEXTNS,'toc-mark-start') : ( + ), +# allowed_children + (TEXTNS,'tracked-changes') : ( + (TEXTNS,'changed-region'), + ), + (TEXTNS,'user-defined') : ( + ), + (TEXTNS,'user-field-decl') : ( + ), + (TEXTNS,'user-field-decls') : ( + (TEXTNS,'user-field-decl'), + ), + (TEXTNS,'user-field-get') : ( + ), + (TEXTNS,'user-field-input') : ( + ), + (TEXTNS,'user-index') : ( + (TEXTNS,'index-body'), + (TEXTNS,'user-index-source'), + ), + (TEXTNS,'user-index-entry-template') : ( + (TEXTNS,'index-entry-chapter'), + (TEXTNS,'index-entry-page-number'), + (TEXTNS,'index-entry-span'), + (TEXTNS,'index-entry-tab-stop'), + (TEXTNS,'index-entry-text'), + ), +# allowed_children + (TEXTNS,'user-index-mark') : ( + ), + (TEXTNS,'user-index-mark-end') : ( + ), + (TEXTNS,'user-index-mark-start') : ( + ), + (TEXTNS,'user-index-source') : ( + (TEXTNS,'index-source-styles'), + (TEXTNS,'index-title-template'), + (TEXTNS,'user-index-entry-template'), + ), + (TEXTNS,'variable-decl') : ( + ), + (TEXTNS,'variable-decls') : ( + (TEXTNS,'variable-decl'), + ), + (TEXTNS,'variable-get') : ( + ), + (TEXTNS,'variable-input') : ( + ), + (TEXTNS,'variable-set') : ( + ), + (TEXTNS,'word-count') : ( + ), +} + +# +# List of elements that allows text nodes +# +allows_text = ( + (CONFIGNS,'config-item'), + (DCNS,'creator'), + (DCNS,'date'), + (DCNS,'description'), + (DCNS,'language'), + (DCNS,'subject'), + (DCNS,'title'), +# Completes Dublin Core start +# (DCNS,'contributor'), +# (DCNS,'coverage'), +# (DCNS,'format'), +# (DCNS,'identifier'), +# (DCNS,'publisher'), +# (DCNS,'relation'), +# (DCNS,'rights'), +# (DCNS,'source'), +# (DCNS,'type'), +# Completes Dublin Core end + (FORMNS,'item'), + (FORMNS,'option'), + (MATHNS,'math'), + (METANS,'creation-date'), + (METANS,'date-string'), + (METANS,'editing-cycles'), + (METANS,'editing-duration'), +# allows_text + (METANS,'generator'), + (METANS,'initial-creator'), + (METANS,'keyword'), + (METANS,'print-date'), + (METANS,'printed-by'), + (METANS,'user-defined'), + (NUMBERNS,'currency-symbol'), + (NUMBERNS,'embedded-text'), + (NUMBERNS,'text'), + (OFFICENS,'binary-data'), + (OFFICENS,'script'), + (PRESENTATIONNS,'date-time-decl'), + (PRESENTATIONNS,'footer-decl'), + (PRESENTATIONNS,'header-decl'), + (SVGNS,'desc'), + (SVGNS,'title'), + (TEXTNS,'a'), + (TEXTNS,'author-initials'), + (TEXTNS,'author-name'), + (TEXTNS,'bibliography-mark'), + (TEXTNS,'bookmark-ref'), + (TEXTNS,'chapter'), + (TEXTNS,'character-count'), + (TEXTNS,'conditional-text'), + (TEXTNS,'creation-date'), + (TEXTNS,'creation-time'), + (TEXTNS,'creator'), + (TEXTNS,'database-display'), + (TEXTNS,'database-name'), + (TEXTNS,'database-row-number'), + (TEXTNS,'date'), + (TEXTNS,'dde-connection'), + (TEXTNS,'description'), + (TEXTNS,'editing-cycles'), + (TEXTNS,'editing-duration'), + (TEXTNS,'execute-macro'), + (TEXTNS,'expression'), + (TEXTNS,'file-name'), + (TEXTNS,'h'), + (TEXTNS,'hidden-paragraph'), + (TEXTNS,'hidden-text'), + (TEXTNS,'image-count'), +# allowed_children + (TEXTNS,'index-entry-span'), + (TEXTNS,'index-title-template'), + (TEXTNS,'initial-creator'), + (TEXTNS,'keywords'), + (TEXTNS,'linenumbering-separator'), + (TEXTNS,'measure'), + (TEXTNS,'modification-date'), + (TEXTNS,'modification-time'), + (TEXTNS,'note-citation'), + (TEXTNS,'note-continuation-notice-backward'), + (TEXTNS,'note-continuation-notice-forward'), + (TEXTNS,'note-ref'), + (TEXTNS,'number'), + (TEXTNS,'object-count'), + (TEXTNS,'p'), + (TEXTNS,'page-continuation'), + (TEXTNS,'page-count'), + (TEXTNS,'page-number'), + (TEXTNS,'page-variable-get'), + (TEXTNS,'page-variable-set'), + (TEXTNS,'paragraph-count'), + (TEXTNS,'placeholder'), + (TEXTNS,'print-date'), + (TEXTNS,'print-time'), + (TEXTNS,'printed-by'), + (TEXTNS,'reference-ref'), + (TEXTNS,'ruby-base'), + (TEXTNS,'ruby-text'), + (TEXTNS,'script'), + (TEXTNS,'sender-city'), + (TEXTNS,'sender-company'), + (TEXTNS,'sender-country'), + (TEXTNS,'sender-email'), + (TEXTNS,'sender-fax'), + (TEXTNS,'sender-firstname'), + (TEXTNS,'sender-initials'), + (TEXTNS,'sender-lastname'), + (TEXTNS,'sender-phone-private'), + (TEXTNS,'sender-phone-work'), + (TEXTNS,'sender-position'), + (TEXTNS,'sender-postal-code'), + (TEXTNS,'sender-state-or-province'), + (TEXTNS,'sender-street'), + (TEXTNS,'sender-title'), + (TEXTNS,'sequence'), + (TEXTNS,'sequence-ref'), + (TEXTNS,'sheet-name'), +# allowed_children + (TEXTNS,'span'), + (TEXTNS,'subject'), + (TEXTNS,'table-count'), + (TEXTNS,'table-formula'), + (TEXTNS,'template-name'), + (TEXTNS,'text-input'), + (TEXTNS,'time'), + (TEXTNS,'title'), + (TEXTNS,'user-defined'), + (TEXTNS,'user-field-get'), + (TEXTNS,'user-field-input'), + (TEXTNS,'variable-get'), + (TEXTNS,'variable-input'), + (TEXTNS,'variable-set'), + (TEXTNS,'word-count'), +) + +# Only the elements with at least one required attribute is listed + +required_attributes = { + (ANIMNS,'animate'): ( + (SMILNS,'attributeName'), + ), + (ANIMNS,'animateColor'): ( + (SMILNS,'attributeName'), + ), + (ANIMNS,'animateMotion'): ( + (SMILNS,'attributeName'), + ), + (ANIMNS,'animateTransform'): ( + (SVGNS,'type'), + (SMILNS,'attributeName'), + ), + (ANIMNS,'command'): ( + (ANIMNS,'command'), + ), + (ANIMNS,'param'): ( + (ANIMNS,'name'), + (ANIMNS,'value'), + ), + (ANIMNS,'set'): ( + (SMILNS,'attributeName'), + ), +# required_attributes + (ANIMNS,'transitionFilter'): ( + (SMILNS,'type'), + ), + (CHARTNS,'axis'): ( + (CHARTNS,'dimension'), + ), + (CHARTNS,'chart'): ( + (CHARTNS,'class'), + ), + (CHARTNS,'symbol-image'): ( + (XLINKNS,'href'), + ), + (CONFIGNS,'config-item'): ( + (CONFIGNS,'type'), + (CONFIGNS,'name'), + ), + (CONFIGNS,'config-item-map-indexed'): ( + (CONFIGNS,'name'), + ), + (CONFIGNS,'config-item-map-named'): ( + (CONFIGNS,'name'), + ), + (CONFIGNS,'config-item-set'): ( + (CONFIGNS,'name'), + ), +# required_attributes + (NUMBERNS,'boolean-style'): ( + (STYLENS,'name'), + ), + (NUMBERNS,'currency-style'): ( + (STYLENS,'name'), + ), + (NUMBERNS,'date-style'): ( + (STYLENS,'name'), + ), + (NUMBERNS,'embedded-text'): ( + (NUMBERNS,'position'), + ), + (NUMBERNS,'number-style'): ( + (STYLENS,'name'), + ), + (NUMBERNS,'percentage-style'): ( + (STYLENS,'name'), + ), + (NUMBERNS,'text-style'): ( + (STYLENS,'name'), + ), + (NUMBERNS,'time-style'): ( + (STYLENS,'name'), + ), + (DR3DNS,'extrude'): ( + (SVGNS,'d'), + (SVGNS,'viewBox'), + ), + (DR3DNS,'light'): ( + (DR3DNS,'direction'), + ), + (DR3DNS,'rotate'): ( + (SVGNS,'viewBox'), + (SVGNS,'d'), + ), +# required_attributes + (DRAWNS,'a'): ( + (XLINKNS,'href'), + ), + (DRAWNS,'area-circle'): ( + (SVGNS,'cy'), + (SVGNS,'cx'), + (SVGNS,'r'), + ), + (DRAWNS,'area-polygon'): ( + (SVGNS,'height'), + (SVGNS,'width'), + (DRAWNS,'points'), + (SVGNS,'y'), + (SVGNS,'x'), + (SVGNS,'viewBox'), + ), + (DRAWNS,'area-rectangle'): ( + (SVGNS,'y'), + (SVGNS,'x'), + (SVGNS,'height'), + (SVGNS,'width'), + ), + (DRAWNS,'contour-path'): ( + (DRAWNS,'recreate-on-edit'), + (SVGNS,'viewBox'), + (SVGNS,'d'), + ), + (DRAWNS,'contour-polygon'): ( + (DRAWNS,'points'), + (DRAWNS,'recreate-on-edit'), + (SVGNS,'viewBox'), + ), + (DRAWNS,'control'): ( + (DRAWNS,'control'), + ), + (DRAWNS,'fill-image'): ( + (XLINKNS,'href'), + (DRAWNS,'name'), + ), + (DRAWNS,'floating-frame'): ( + (XLINKNS,'href'), + ), + (DRAWNS,'glue-point'): ( + (SVGNS,'y'), + (SVGNS,'x'), + (DRAWNS,'id'), + (DRAWNS,'escape-direction'), + ), +# required_attributes + (DRAWNS,'gradient'): ( + (DRAWNS,'style'), + ), + (DRAWNS,'handle'): ( + (DRAWNS,'handle-position'), + ), + (DRAWNS,'hatch'): ( + (DRAWNS,'style'), + (DRAWNS,'name'), + ), + (DRAWNS,'layer'): ( + (DRAWNS,'name'), + ), + (DRAWNS,'line'): ( + (SVGNS,'y1'), + (SVGNS,'x2'), + (SVGNS,'x1'), + (SVGNS,'y2'), + ), + (DRAWNS,'marker'): ( + (SVGNS,'d'), + (DRAWNS,'name'), + (SVGNS,'viewBox'), + ), + (DRAWNS,'measure'): ( + (SVGNS,'y1'), + (SVGNS,'x2'), + (SVGNS,'x1'), + (SVGNS,'y2'), + ), + (DRAWNS,'opacity'): ( + (DRAWNS,'style'), + ), + (DRAWNS,'page'): ( + (DRAWNS,'master-page-name'), + ), + (DRAWNS,'path'): ( + (SVGNS,'d'), + (SVGNS,'viewBox'), + ), + (DRAWNS,'plugin'): ( + (XLINKNS,'href'), + ), + (DRAWNS,'polygon'): ( + (DRAWNS,'points'), + (SVGNS,'viewBox'), + ), +# required_attributes + (DRAWNS,'polyline'): ( + (DRAWNS,'points'), + (SVGNS,'viewBox'), + ), + (DRAWNS,'regular-polygon'): ( + (DRAWNS,'corners'), + ), + (DRAWNS,'stroke-dash'): ( + (DRAWNS,'name'), + ), + (FORMNS,'button'): ( + (FORMNS,'id'), + ), + (FORMNS,'checkbox'): ( + (FORMNS,'id'), + ), + (FORMNS,'combobox'): ( + (FORMNS,'id'), + ), + (FORMNS,'connection-resource'): ( + (XLINKNS,'href'), + ), + (FORMNS,'date'): ( + (FORMNS,'id'), + ), + (FORMNS,'file'): ( + (FORMNS,'id'), + ), + (FORMNS,'fixed-text'): ( + (FORMNS,'id'), + ), + (FORMNS,'formatted-text'): ( + (FORMNS,'id'), + ), + (FORMNS,'frame'): ( + (FORMNS,'id'), + ), + (FORMNS,'generic-control'): ( + (FORMNS,'id'), + ), + (FORMNS,'grid'): ( + (FORMNS,'id'), + ), + (FORMNS,'hidden'): ( + (FORMNS,'id'), + ), +# required_attributes + (FORMNS,'image'): ( + (FORMNS,'id'), + ), + (FORMNS,'image-frame'): ( + (FORMNS,'id'), + ), + (FORMNS,'list-property'): ( + (FORMNS,'property-name'), + ), + (FORMNS,'list-value'): ( + (OFFICENS,'string-value'), + ), + (FORMNS,'listbox'): ( + (FORMNS,'id'), + ), + (FORMNS,'number'): ( + (FORMNS,'id'), + ), + (FORMNS,'password'): ( + (FORMNS,'id'), + ), + (FORMNS,'property'): ( + (FORMNS,'property-name'), + ), + (FORMNS,'radio'): ( + (FORMNS,'id'), + ), + (FORMNS,'text'): ( + (FORMNS,'id'), + ), + (FORMNS,'textarea'): ( + (FORMNS,'id'), + ), + (FORMNS,'time'): ( + (FORMNS,'id'), + ), + (FORMNS,'value-range'): ( + (FORMNS,'id'), + ), + (MANIFESTNS,'algorithm') : ( + (MANIFESTNS,'algorithm-name'), + (MANIFESTNS,'initialisation-vector'), + ), + (MANIFESTNS,'encryption-data') : ( + (MANIFESTNS,'checksum-type'), + (MANIFESTNS,'checksum'), + ), + (MANIFESTNS,'file-entry') : ( + (MANIFESTNS,'full-path'), + (MANIFESTNS,'media-type'), + ), + (MANIFESTNS,'key-derivation') : ( + (MANIFESTNS,'key-derivation-name'), + (MANIFESTNS,'salt'), + (MANIFESTNS,'iteration-count'), + ), +# required_attributes + (METANS,'template'): ( + (XLINKNS,'href'), + ), + (METANS,'user-defined'): ( + (METANS,'name'), + ), + (OFFICENS,'dde-source'): ( + (OFFICENS,'dde-topic'), + (OFFICENS,'dde-application'), + (OFFICENS,'dde-item'), + ), + (OFFICENS,'document'): ( + (OFFICENS,'mimetype'), + ), + (OFFICENS,'script'): ( + (SCRIPTNS,'language'), + ), + (PRESENTATIONNS,'date-time-decl'): ( + (PRESENTATIONNS,'source'), + (PRESENTATIONNS,'name'), + ), + (PRESENTATIONNS,'dim'): ( + (DRAWNS,'color'), + (DRAWNS,'shape-id'), + ), +# required_attributes + (PRESENTATIONNS,'event-listener'): ( + (PRESENTATIONNS,'action'), + (SCRIPTNS,'event-name'), + ), + (PRESENTATIONNS,'footer-decl'): ( + (PRESENTATIONNS,'name'), + ), + (PRESENTATIONNS,'header-decl'): ( + (PRESENTATIONNS,'name'), + ), + (PRESENTATIONNS,'hide-shape'): ( + (DRAWNS,'shape-id'), + ), + (PRESENTATIONNS,'hide-text'): ( + (DRAWNS,'shape-id'), + ), + (PRESENTATIONNS,'placeholder'): ( + (SVGNS,'y'), + (SVGNS,'x'), + (SVGNS,'height'), + (PRESENTATIONNS,'object'), + (SVGNS,'width'), + ), + (PRESENTATIONNS,'play'): ( + (DRAWNS,'shape-id'), + ), + (PRESENTATIONNS,'show'): ( + (PRESENTATIONNS,'name'), + (PRESENTATIONNS,'pages'), + ), + (PRESENTATIONNS,'show-shape'): ( + (DRAWNS,'shape-id'), + ), + (PRESENTATIONNS,'show-text'): ( + (DRAWNS,'shape-id'), + ), + (PRESENTATIONNS,'sound'): ( + (XLINKNS,'href'), + ), + (SCRIPTNS,'event-listener'): ( + (SCRIPTNS,'language'), + (SCRIPTNS,'event-name'), + ), + (STYLENS,'column'): ( + (STYLENS,'rel-width'), + ), +# required_attributes + (STYLENS,'column-sep'): ( + (STYLENS,'width'), + ), + (STYLENS,'columns'): ( + (FONS,'column-count'), + ), + (STYLENS,'font-face'): ( + (STYLENS,'name'), + ), + (STYLENS,'handout-master'): ( + (STYLENS,'page-layout-name'), + ), + (STYLENS,'map'): ( + (STYLENS,'apply-style-name'), + (STYLENS,'condition'), + ), + (STYLENS,'master-page'): ( + (STYLENS,'page-layout-name'), + (STYLENS,'name'), + ), + (STYLENS,'page-layout'): ( + (STYLENS,'name'), + ), + (STYLENS,'presentation-page-layout'): ( + (STYLENS,'name'), + ), + (STYLENS,'style'): ( + (STYLENS,'name'), + ), + (STYLENS,'tab-stop'): ( + (STYLENS,'position'), + ), + (SVGNS,'definition-src'): ( + (XLINKNS,'href'), + ), + (SVGNS,'font-face-uri'): ( + (XLINKNS,'href'), + ), + (SVGNS,'linearGradient'): ( + (DRAWNS,'name'), + ), + (SVGNS,'radialGradient'): ( + (DRAWNS,'name'), + ), + (SVGNS,'stop'): ( + (SVGNS,'offset'), + ), +# required_attributes + (TABLENS,'body'): ( + (TEXTNS,'style-name'), + ), + (TABLENS,'cell-address'): ( + (TABLENS,'column'), + (TABLENS,'table'), + (TABLENS,'row'), + ), + (TABLENS,'cell-content-change'): ( + (TABLENS,'id'), + ), + (TABLENS,'cell-range-source'): ( + (TABLENS,'last-row-spanned'), + (TABLENS,'last-column-spanned'), + (XLINKNS,'href'), + (TABLENS,'name'), + ), + (TABLENS,'consolidation'): ( + (TABLENS,'function'), + (TABLENS,'source-cell-range-addresses'), + (TABLENS,'target-cell-address'), + ), + (TABLENS,'content-validation'): ( + (TABLENS,'name'), + ), + (TABLENS,'data-pilot-display-info'): ( + (TABLENS,'member-count'), + (TABLENS,'data-field'), + (TABLENS,'enabled'), + (TABLENS,'display-member-mode'), + ), +# required_attributes + (TABLENS,'data-pilot-field'): ( + (TABLENS,'source-field-name'), + ), + (TABLENS,'data-pilot-field-reference'): ( + (TABLENS,'field-name'), + (TABLENS,'type'), + ), + (TABLENS,'data-pilot-group'): ( + (TABLENS,'name'), + ), + (TABLENS,'data-pilot-group-member'): ( + (TABLENS,'name'), + ), + (TABLENS,'data-pilot-groups'): ( + (TABLENS,'source-field-name'), + (TABLENS,'step'), + (TABLENS,'grouped-by'), + ), + (TABLENS,'data-pilot-layout-info'): ( + (TABLENS,'add-empty-lines'), + (TABLENS,'layout-mode'), + ), + (TABLENS,'data-pilot-member'): ( + (TABLENS,'name'), + ), + (TABLENS,'data-pilot-sort-info'): ( + (TABLENS,'order'), + ), + (TABLENS,'data-pilot-subtotal'): ( + (TABLENS,'function'), + ), + (TABLENS,'data-pilot-table'): ( + (TABLENS,'target-range-address'), + (TABLENS,'name'), + ), + (TABLENS,'database-range'): ( + (TABLENS,'target-range-address'), + ), +# required_attributes + (TABLENS,'database-source-query'): ( + (TABLENS,'query-name'), + (TABLENS,'database-name'), + ), + (TABLENS,'database-source-sql'): ( + (TABLENS,'database-name'), + (TABLENS,'sql-statement'), + ), + (TABLENS,'database-source-table'): ( + (TABLENS,'database-table-name'), + (TABLENS,'database-name'), + ), + (TABLENS,'deletion'): ( + (TABLENS,'position'), + (TABLENS,'type'), + (TABLENS,'id'), + ), + (TABLENS,'dependency'): ( + (TABLENS,'id'), + ), + (TABLENS,'even-columns'): ( + (TEXTNS,'style-name'), + ), + (TABLENS,'even-rows'): ( + (TEXTNS,'style-name'), + ), + (TABLENS,'filter-condition'): ( + (TABLENS,'operator'), + (TABLENS,'field-number'), + (TABLENS,'value'), + ), + (TABLENS,'first-column'): ( + (TEXTNS,'style-name'), + ), + (TABLENS,'first-row'): ( + (TEXTNS,'style-name'), + ), + (TABLENS,'insertion'): ( + (TABLENS,'position'), + (TABLENS,'type'), + (TABLENS,'id'), + ), + (TABLENS,'insertion-cut-off'): ( + (TABLENS,'position'), + (TABLENS,'id'), + ), +# required_attributes + (TABLENS,'label-range'): ( + (TABLENS,'label-cell-range-address'), + (TABLENS,'data-cell-range-address'), + (TABLENS,'orientation'), + ), + (TABLENS,'last-column'): ( + (TEXTNS,'style-name'), + ), + (TABLENS,'last-row'): ( + (TEXTNS,'style-name'), + ), + (TABLENS,'movement'): ( + (TABLENS,'id'), + ), + (TABLENS,'named-expression'): ( + (TABLENS,'expression'), + (TABLENS,'name'), + ), + (TABLENS,'named-range'): ( + (TABLENS,'name'), + (TABLENS,'cell-range-address'), + ), + (TABLENS,'odd-columns'): ( + (TEXTNS,'style-name'), + ), + (TABLENS,'odd-rows'): ( + (TEXTNS,'style-name'), + ), + (TABLENS,'operation'): ( + (TABLENS,'index'), + (TABLENS,'name'), + ), +# required_attributes + (TABLENS,'scenario'): ( + (TABLENS,'is-active'), + (TABLENS,'scenario-ranges'), + ), + (TABLENS,'sort-by'): ( + (TABLENS,'field-number'), + ), + (TABLENS,'source-cell-range'): ( + (TABLENS,'cell-range-address'), + ), + (TABLENS,'source-service'): ( + (TABLENS,'source-name'), + (TABLENS,'object-name'), + (TABLENS,'name'), + ), + (TABLENS,'subtotal-field'): ( + (TABLENS,'function'), + (TABLENS,'field-number'), + ), + (TABLENS,'subtotal-rule'): ( + (TABLENS,'group-by-field-number'), + ), + (TABLENS,'table-source'): ( + (XLINKNS,'href'), + ), + (TABLENS,'table-template'): ( + (TEXTNS,'last-row-end-column'), + (TEXTNS,'first-row-end-column'), + (TEXTNS,'name'), + (TEXTNS,'last-row-start-column'), + (TEXTNS,'first-row-start-column'), + ), + (TEXTNS,'a'): ( + (XLINKNS,'href'), + ), +# required_attributes + (TEXTNS,'alphabetical-index'): ( + (TEXTNS,'name'), + ), + (TEXTNS,'alphabetical-index-auto-mark-file'): ( + (XLINKNS,'href'), + ), + (TEXTNS,'alphabetical-index-entry-template'): ( + (TEXTNS,'style-name'), + (TEXTNS,'outline-level'), + ), + (TEXTNS,'alphabetical-index-mark'): ( + (TEXTNS,'string-value'), + ), + (TEXTNS,'alphabetical-index-mark-end'): ( + (TEXTNS,'id'), + ), + (TEXTNS,'alphabetical-index-mark-start'): ( + (TEXTNS,'id'), + ), + (TEXTNS,'bibliography'): ( + (TEXTNS,'name'), + ), + (TEXTNS,'bibliography-entry-template'): ( + (TEXTNS,'style-name'), + (TEXTNS,'bibliography-type'), + ), + (TEXTNS,'bibliography-mark'): ( + (TEXTNS,'bibliography-type'), + ), + (TEXTNS,'bookmark'): ( + (TEXTNS,'name'), + ), +# required_attributes + (TEXTNS,'bookmark-end'): ( + (TEXTNS,'name'), + ), + (TEXTNS,'bookmark-start'): ( + (TEXTNS,'name'), + ), + (TEXTNS,'change'): ( + (TEXTNS,'change-id'), + ), + (TEXTNS,'change-end'): ( + (TEXTNS,'change-id'), + ), + (TEXTNS,'change-start'): ( + (TEXTNS,'change-id'), + ), + (TEXTNS,'changed-region'): ( + (TEXTNS,'id'), + ), + (TEXTNS,'chapter'): ( + (TEXTNS,'display'), + (TEXTNS,'outline-level'), + ), + (TEXTNS,'conditional-text'): ( + (TEXTNS,'string-value-if-true'), + (TEXTNS,'string-value-if-false'), + (TEXTNS,'condition'), + ), + (TEXTNS,'database-display'): ( + (TEXTNS,'column-name'), + (TEXTNS,'table-name'), + ), + (TEXTNS,'database-name'): ( + (TEXTNS,'table-name'), + ), + (TEXTNS,'database-next'): ( + (TEXTNS,'table-name'), + ), + (TEXTNS,'database-row-number'): ( + (TEXTNS,'table-name'), + ), + (TEXTNS,'database-row-select'): ( + (TEXTNS,'table-name'), + ), + (TEXTNS,'dde-connection'): ( + (TEXTNS,'connection-name'), + ), +# required_attributes + (TEXTNS,'dde-connection-decl'): ( + (OFFICENS,'dde-topic'), + (OFFICENS,'dde-application'), + (OFFICENS,'name'), + (OFFICENS,'dde-item'), + ), + (TEXTNS,'h'): ( + (TEXTNS,'outline-level'), + ), + (TEXTNS,'hidden-paragraph'): ( + (TEXTNS,'condition'), + ), + (TEXTNS,'hidden-text'): ( + (TEXTNS,'string-value'), + (TEXTNS,'condition'), + ), + (TEXTNS,'illustration-index'): ( + (TEXTNS,'name'), + ), + (TEXTNS,'illustration-index-entry-template'): ( + (TEXTNS,'style-name'), + ), + (TEXTNS,'index-entry-bibliography'): ( + (TEXTNS,'bibliography-data-field'), + ), + (TEXTNS,'index-source-style'): ( + (TEXTNS,'style-name'), + ), + (TEXTNS,'index-source-styles'): ( + (TEXTNS,'outline-level'), + ), + (TEXTNS,'index-title'): ( + (TEXTNS,'name'), + ), + (TEXTNS,'list-level-style-bullet'): ( + (TEXTNS,'bullet-char'), + (TEXTNS,'level'), + ), + (TEXTNS,'list-level-style-image'): ( + (TEXTNS,'level'), + ), + (TEXTNS,'list-level-style-number'): ( + (TEXTNS,'level'), + ), + (TEXTNS,'list-style'): ( + (STYLENS,'name'), + ), +# required_attributes + (TEXTNS,'measure'): ( + (TEXTNS,'kind'), + ), + (TEXTNS,'note'): ( + (TEXTNS,'note-class'), + ), + (TEXTNS,'note-ref'): ( + (TEXTNS,'note-class'), + ), + (TEXTNS,'notes-configuration'): ( + (TEXTNS,'note-class'), + ), + (TEXTNS,'object-index'): ( + (TEXTNS,'name'), + ), + (TEXTNS,'object-index-entry-template'): ( + (TEXTNS,'style-name'), + ), + (TEXTNS,'outline-level-style'): ( + (TEXTNS,'level'), + ), + (TEXTNS,'page'): ( + (TEXTNS,'master-page-name'), + ), + (TEXTNS,'page-continuation'): ( + (TEXTNS,'select-page'), + ), + (TEXTNS,'placeholder'): ( + (TEXTNS,'placeholder-type'), + ), + (TEXTNS,'reference-mark'): ( + (TEXTNS,'name'), + ), + (TEXTNS,'reference-mark-end'): ( + (TEXTNS,'name'), + ), + (TEXTNS,'reference-mark-start'): ( + (TEXTNS,'name'), + ), + (TEXTNS,'section'): ( + (TEXTNS,'name'), + ), + (TEXTNS,'sequence'): ( + (TEXTNS,'name'), + ), + (TEXTNS,'sequence-decl'): ( + (TEXTNS,'display-outline-level'), + (TEXTNS,'name'), + ), +# required_attributes + (TEXTNS,'sort-key'): ( + (TEXTNS,'key'), + ), + (TEXTNS,'table-index'): ( + (TEXTNS,'name'), + ), + (TEXTNS,'table-index-entry-template'): ( + (TEXTNS,'style-name'), + ), + (TEXTNS,'table-of-content'): ( + (TEXTNS,'name'), + ), + (TEXTNS,'table-of-content-entry-template'): ( + (TEXTNS,'style-name'), + (TEXTNS,'outline-level'), + ), + (TEXTNS,'toc-mark'): ( + (TEXTNS,'string-value'), + ), + (TEXTNS,'toc-mark-end'): ( + (TEXTNS,'id'), + ), + (TEXTNS,'toc-mark-start'): ( + (TEXTNS,'id'), + ), + (TEXTNS,'user-defined'): ( + (TEXTNS,'name'), + ), + (TEXTNS,'user-field-decl'): ( + (TEXTNS,'name'), + ), + (TEXTNS,'user-field-get'): ( + (TEXTNS,'name'), + ), + (TEXTNS,'user-field-input'): ( + (TEXTNS,'name'), + ), + (TEXTNS,'user-index'): ( + (TEXTNS,'name'), + ), + (TEXTNS,'user-index-entry-template'): ( + (TEXTNS,'style-name'), + (TEXTNS,'outline-level'), + ), +# required_attributes + (TEXTNS,'user-index-mark'): ( + (TEXTNS,'index-name'), + (TEXTNS,'string-value'), + ), + (TEXTNS,'user-index-mark-end'): ( + (TEXTNS,'id'), + ), + (TEXTNS,'user-index-mark-start'): ( + (TEXTNS,'index-name'), + (TEXTNS,'id'), + ), + (TEXTNS,'user-index-source'): ( + (TEXTNS,'index-name'), + ), + (TEXTNS,'variable-decl'): ( + (TEXTNS,'name'), + (OFFICENS,'value-type'), + ), + (TEXTNS,'variable-get'): ( + (TEXTNS,'name'), + ), + (TEXTNS,'variable-input'): ( + (TEXTNS,'name'), + (OFFICENS,'value-type'), + ), + (TEXTNS,'variable-set'): ( + (TEXTNS,'name'), + ), +} + +# Empty list means the element has no allowed attributes +# None means anything goes + +allowed_attributes = { + (DCNS,'creator'):( + ), + (DCNS,'date'):( + ), + (DCNS,'description'):( + ), + (DCNS,'language'):( + ), + (DCNS,'subject'):( + ), + (DCNS,'title'):( + ), +# Completes Dublin Core start +# (DCNS,'contributor') : ( +# ), +# (DCNS,'coverage') : ( +# ), +# (DCNS,'format') : ( +# ), +# (DCNS,'identifier') : ( +# ), +# (DCNS,'publisher') : ( +# ), +# (DCNS,'relation') : ( +# ), +# (DCNS,'rights') : ( +# ), +# (DCNS,'source') : ( +# ), +# (DCNS,'type') : ( +# ), +# Completes Dublin Core end + (MATHNS,'math'): None, + (XFORMSNS,'model'): None, +# allowed_attributes + (ANIMNS,'animate'):( + (ANIMNS,'formula'), + (ANIMNS,'sub-item'), + (SMILNS,'accelerate'), + (SMILNS,'accumulate'), + (SMILNS,'additive'), + (SMILNS,'attributeName'), + (SMILNS,'autoReverse'), + (SMILNS,'begin'), + (SMILNS,'by'), + (SMILNS,'calcMode'), + (SMILNS,'decelerate'), + (SMILNS,'dur'), + (SMILNS,'end'), + (SMILNS,'fill'), + (SMILNS,'fillDefault'), + (SMILNS,'from'), + (SMILNS,'keySplines'), + (SMILNS,'keyTimes'), + (SMILNS,'repeatCount'), + (SMILNS,'repeatDur'), + (SMILNS,'restart'), + (SMILNS,'restartDefault'), + (SMILNS,'targetElement'), + (SMILNS,'to'), + (SMILNS,'values'), + ), +# allowed_attributes + (ANIMNS,'animateColor'):( + (ANIMNS,'color-interpolation'), + (ANIMNS,'color-interpolation-direction'), + (ANIMNS,'formula'), + (ANIMNS,'sub-item'), + (SMILNS,'accelerate'), + (SMILNS,'accumulate'), + (SMILNS,'additive'), + (SMILNS,'attributeName'), + (SMILNS,'autoReverse'), + (SMILNS,'begin'), + (SMILNS,'by'), + (SMILNS,'calcMode'), + (SMILNS,'decelerate'), + (SMILNS,'dur'), + (SMILNS,'end'), + (SMILNS,'fill'), + (SMILNS,'fillDefault'), + (SMILNS,'from'), + (SMILNS,'keySplines'), + (SMILNS,'keyTimes'), + (SMILNS,'repeatCount'), + (SMILNS,'repeatDur'), + (SMILNS,'restart'), + (SMILNS,'restartDefault'), + (SMILNS,'targetElement'), + (SMILNS,'to'), + (SMILNS,'values'), + ), +# allowed_attributes + (ANIMNS,'animateMotion'):( + (ANIMNS,'formula'), + (ANIMNS,'sub-item'), + (SMILNS,'accelerate'), + (SMILNS,'accumulate'), + (SMILNS,'additive'), + (SMILNS,'attributeName'), + (SMILNS,'autoReverse'), + (SMILNS,'begin'), + (SMILNS,'by'), + (SMILNS,'calcMode'), + (SMILNS,'decelerate'), + (SMILNS,'dur'), + (SMILNS,'end'), + (SMILNS,'fill'), + (SMILNS,'fillDefault'), + (SMILNS,'from'), + (SMILNS,'keySplines'), + (SMILNS,'keyTimes'), + (SMILNS,'repeatCount'), + (SMILNS,'repeatDur'), + (SMILNS,'restart'), + (SMILNS,'restartDefault'), + (SMILNS,'targetElement'), + (SMILNS,'to'), + (SMILNS,'values'), + (SVGNS,'origin'), + (SVGNS,'path'), + ), +# allowed_attributes + (ANIMNS,'animateTransform'):( + (ANIMNS,'formula'), + (ANIMNS,'sub-item'), + (SMILNS,'accelerate'), + (SMILNS,'accumulate'), + (SMILNS,'additive'), + (SMILNS,'attributeName'), + (SMILNS,'autoReverse'), + (SMILNS,'begin'), + (SMILNS,'by'), + (SMILNS,'decelerate'), + (SMILNS,'dur'), + (SMILNS,'end'), + (SMILNS,'fill'), + (SMILNS,'fillDefault'), + (SMILNS,'from'), + (SMILNS,'repeatCount'), + (SMILNS,'repeatDur'), + (SMILNS,'restart'), + (SMILNS,'restartDefault'), + (SMILNS,'targetElement'), + (SMILNS,'to'), + (SMILNS,'values'), + (SVGNS,'type'), + ), +# allowed_attributes + (ANIMNS,'audio'):( + (ANIMNS,'audio-level'), + (ANIMNS,'id'), + (PRESENTATIONNS,'group-id'), + (PRESENTATIONNS,'master-element'), + (PRESENTATIONNS,'node-type'), + (PRESENTATIONNS,'preset-class'), + (PRESENTATIONNS,'preset-id'), + (PRESENTATIONNS,'preset-sub-type'), + (SMILNS,'begin'), + (SMILNS,'dur'), + (SMILNS,'end'), + (SMILNS,'repeatCount'), + (SMILNS,'repeatDur'), + (XLINKNS,'href'), + ), + (ANIMNS,'command'):( + (PRESENTATIONNS,'node-type'), + (SMILNS,'begin'), + (SMILNS,'end'), + (PRESENTATIONNS,'group-id'), + (PRESENTATIONNS,'preset-class'), + (PRESENTATIONNS,'preset-id'), + (ANIMNS,'sub-item'), + (ANIMNS,'command'), + (PRESENTATIONNS,'preset-sub-type'), + (SMILNS,'targetElement'), + (ANIMNS,'id'), + (PRESENTATIONNS,'master-element'), + ), +# allowed_attributes + (ANIMNS,'iterate'):( + (ANIMNS,'id'), + (ANIMNS,'iterate-interval'), + (ANIMNS,'iterate-type'), + (ANIMNS,'sub-item'), + (PRESENTATIONNS,'group-id'), + (PRESENTATIONNS,'master-element'), + (PRESENTATIONNS,'node-type'), + (PRESENTATIONNS,'preset-class'), + (PRESENTATIONNS,'preset-id'), + (PRESENTATIONNS,'preset-sub-type'), + (SMILNS,'accelerate'), + (SMILNS,'autoReverse'), + (SMILNS,'begin'), + (SMILNS,'decelerate'), + (SMILNS,'dur'), + (SMILNS,'end'), + (SMILNS,'endsync'), + (SMILNS,'fill'), + (SMILNS,'fillDefault'), + (SMILNS,'repeatCount'), + (SMILNS,'repeatDur'), + (SMILNS,'restart'), + (SMILNS,'restartDefault'), + (SMILNS,'targetElement'), + ), + (ANIMNS,'par'):( + (PRESENTATIONNS,'node-type'), + (SMILNS,'decelerate'), + (SMILNS,'begin'), + (SMILNS,'end'), + (PRESENTATIONNS,'group-id'), + (SMILNS,'accelerate'), + (SMILNS,'repeatDur'), + (SMILNS,'repeatCount'), + (SMILNS,'autoReverse'), + (PRESENTATIONNS,'preset-class'), + (SMILNS,'fillDefault'), + (PRESENTATIONNS,'preset-id'), + (PRESENTATIONNS,'preset-sub-type'), + (SMILNS,'restartDefault'), + (SMILNS,'endsync'), + (SMILNS,'dur'), + (SMILNS,'fill'), + (ANIMNS,'id'), + (SMILNS,'restart'), + (PRESENTATIONNS,'master-element'), + ), +# allowed_attributes + (ANIMNS,'param'):( + (ANIMNS,'name'), + (ANIMNS,'value'), + ), + (ANIMNS,'seq'):( + (ANIMNS,'id'), + (PRESENTATIONNS,'group-id'), + (PRESENTATIONNS,'master-element'), + (PRESENTATIONNS,'node-type'), + (PRESENTATIONNS,'preset-class'), + (PRESENTATIONNS,'preset-id'), + (PRESENTATIONNS,'preset-sub-type'), + (SMILNS,'accelerate'), + (SMILNS,'autoReverse'), + (SMILNS,'begin'), + (SMILNS,'decelerate'), + (SMILNS,'dur'), + (SMILNS,'end'), + (SMILNS,'endsync'), + (SMILNS,'fill'), + (SMILNS,'fillDefault'), + (SMILNS,'repeatCount'), + (SMILNS,'repeatDur'), + (SMILNS,'restart'), + (SMILNS,'restartDefault'), + ), + (ANIMNS,'set'):( + (ANIMNS,'sub-item'), + (SMILNS,'accelerate'), + (SMILNS,'accumulate'), + (SMILNS,'autoReverse'), + (SMILNS,'additive'), + (SMILNS,'attributeName'), + (SMILNS,'begin'), + (SMILNS,'decelerate'), + (SMILNS,'dur'), + (SMILNS,'end'), + (SMILNS,'fill'), + (SMILNS,'fillDefault'), + (SMILNS,'repeatCount'), + (SMILNS,'repeatDur'), + (SMILNS,'restart'), + (SMILNS,'restartDefault'), + (SMILNS,'targetElement'), + (SMILNS,'to'), + + ), +# allowed_attributes + (ANIMNS,'transitionFilter'):( + (ANIMNS,'formula'), + (ANIMNS,'sub-item'), + (SMILNS,'accelerate'), + (SMILNS,'accumulate'), + (SMILNS,'additive'), + (SMILNS,'autoReverse'), + (SMILNS,'begin'), + (SMILNS,'by'), + (SMILNS,'calcMode'), + (SMILNS,'decelerate'), + (SMILNS,'direction'), + (SMILNS,'dur'), + (SMILNS,'end'), + (SMILNS,'fadeColor'), + (SMILNS,'fill'), + (SMILNS,'fillDefault'), + (SMILNS,'from'), + (SMILNS,'mode'), + (SMILNS,'repeatCount'), + (SMILNS,'repeatDur'), + (SMILNS,'restart'), + (SMILNS,'restartDefault'), + (SMILNS,'subtype'), + (SMILNS,'targetElement'), + (SMILNS,'to'), + (SMILNS,'type'), + (SMILNS,'values'), + + ), +# allowed_attributes + (CHARTNS,'axis'):( + (CHARTNS,'style-name'), + (CHARTNS,'dimension'), + (CHARTNS,'name'), + ), + (CHARTNS,'categories'):( + (TABLENS,'cell-range-address'), + ), + (CHARTNS,'chart'):( + (CHARTNS,'column-mapping'), + (CHARTNS,'row-mapping'), + (SVGNS,'height'), + (SVGNS,'width'), + (CHARTNS,'style-name'), + (CHARTNS,'class'), + ), + (CHARTNS,'data-point'):( + (CHARTNS,'repeated'), + (CHARTNS,'style-name'), + ), + (CHARTNS,'domain'):( + (TABLENS,'cell-range-address'), + ), + (CHARTNS,'error-indicator'):( + (CHARTNS,'style-name'), + ), + (CHARTNS,'floor'):( + (SVGNS,'width'), + (CHARTNS,'style-name'), + ), +# allowed_attributes + (CHARTNS,'footer'):( + (SVGNS,'y'), + (SVGNS,'x'), + (TABLENS,'cell-range'), + (CHARTNS,'style-name'), + ), + (CHARTNS,'grid'):( + (CHARTNS,'style-name'), + (CHARTNS,'class'), + ), + (CHARTNS,'legend'):( + (CHARTNS,'legend-align'), + (STYLENS,'legend-expansion-aspect-ratio'), + (STYLENS,'legend-expansion'), + (CHARTNS,'legend-position'), + (CHARTNS,'style-name'), + (SVGNS,'y'), + (SVGNS,'x'), + ), + (CHARTNS,'mean-value'):( + (CHARTNS,'style-name'), + ), + (CHARTNS,'plot-area'):( + (DR3DNS,'ambient-color'), + (DR3DNS,'distance'), + (DR3DNS,'vrp'), + (DR3DNS,'focal-length'), + (CHARTNS,'data-source-has-labels'), + (DR3DNS,'lighting-mode'), + (DR3DNS,'shade-mode'), + (DR3DNS,'transform'), + (DR3DNS,'shadow-slant'), + (SVGNS,'height'), + (SVGNS,'width'), + (CHARTNS,'style-name'), + (DR3DNS,'vup'), + (SVGNS,'y'), + (SVGNS,'x'), + (DR3DNS,'vpn'), + (TABLENS,'cell-range-address'), + (DR3DNS,'projection'), + ), + (CHARTNS,'regression-curve'):( + (CHARTNS,'style-name'), + ), + (CHARTNS,'series'):( + (CHARTNS,'style-name'), + (CHARTNS,'attached-axis'), + (CHARTNS,'values-cell-range-address'), + (CHARTNS,'label-cell-address'), + (CHARTNS,'class'), + ), + (CHARTNS,'stock-gain-marker'):( + (CHARTNS,'style-name'), + ), +# allowed_attributes + (CHARTNS,'stock-loss-marker'):( + (CHARTNS,'style-name'), + ), + (CHARTNS,'stock-range-line'):( + (CHARTNS,'style-name'), + ), + (CHARTNS,'subtitle'):( + (SVGNS,'y'), + (SVGNS,'x'), + (TABLENS,'cell-range'), + (CHARTNS,'style-name'), + ), + (CHARTNS,'symbol-image'):( + (XLINKNS,'href'), + ), + (CHARTNS,'title'):( + (SVGNS,'y'), + (SVGNS,'x'), + (TABLENS,'cell-range'), + (CHARTNS,'style-name'), + ), + (CHARTNS,'wall'):( + (SVGNS,'width'), + (CHARTNS,'style-name'), + ), + (CONFIGNS,'config-item'):( + (CONFIGNS,'type'), + (CONFIGNS,'name'), + ), + (CONFIGNS,'config-item-map-entry'):( + (CONFIGNS,'name'), + ), + (CONFIGNS,'config-item-map-indexed'):( + (CONFIGNS,'name'), + ), + (CONFIGNS,'config-item-map-named'):( + (CONFIGNS,'name'), + ), + (CONFIGNS,'config-item-set'):( + (CONFIGNS,'name'), + ), +# allowed_attributes + (NUMBERNS,'am-pm'):( + ), + (NUMBERNS,'boolean'):( + ), + (NUMBERNS,'boolean-style'):( + (NUMBERNS,'transliteration-language'), + (STYLENS,'name'), + (STYLENS,'display-name'), + (NUMBERNS,'language'), + (NUMBERNS,'title'), + (NUMBERNS,'country'), + (NUMBERNS,'transliteration-format'), + (NUMBERNS,'transliteration-style'), + (STYLENS,'volatile'), + (NUMBERNS,'transliteration-country'), + ), + (NUMBERNS,'currency-style'):( + (NUMBERNS,'transliteration-language'), + (STYLENS,'name'), + (STYLENS,'display-name'), + (NUMBERNS,'language'), + (NUMBERNS,'title'), + (NUMBERNS,'country'), + (NUMBERNS,'transliteration-format'), + (NUMBERNS,'transliteration-style'), + (STYLENS,'volatile'), + (NUMBERNS,'transliteration-country'), + (NUMBERNS,'automatic-order'), + ), + (NUMBERNS,'currency-symbol'):( + (NUMBERNS,'country'), + (NUMBERNS,'language'), + ), +# allowed_attributes + (NUMBERNS,'date-style'):( + (NUMBERNS,'transliteration-language'), + (STYLENS,'name'), + (STYLENS,'display-name'), + (NUMBERNS,'language'), + (NUMBERNS,'title'), + (NUMBERNS,'country'), + (NUMBERNS,'transliteration-format'), + (NUMBERNS,'transliteration-style'), + (NUMBERNS,'format-source'), + (STYLENS,'volatile'), + (NUMBERNS,'transliteration-country'), + (NUMBERNS,'automatic-order'), + ), + (NUMBERNS,'day'):( + (NUMBERNS,'style'), + (NUMBERNS,'calendar'), + ), + (NUMBERNS,'day-of-week'):( + (NUMBERNS,'style'), + (NUMBERNS,'calendar'), + ), + (NUMBERNS,'embedded-text'):( + (NUMBERNS,'position'), + ), + (NUMBERNS,'era'):( + (NUMBERNS,'style'), + (NUMBERNS,'calendar'), + ), + (NUMBERNS,'fraction'):( + (NUMBERNS,'grouping'), + (NUMBERNS,'min-denominator-digits'), + (NUMBERNS,'min-numerator-digits'), + (NUMBERNS,'min-integer-digits'), + (NUMBERNS,'denominator-value'), + ), + (NUMBERNS,'hours'):( + (NUMBERNS,'style'), + ), +# allowed_attributes + (NUMBERNS,'minutes'):( + (NUMBERNS,'style'), + ), + (NUMBERNS,'month'):( + (NUMBERNS,'style'), + (NUMBERNS,'calendar'), + (NUMBERNS,'possessive-form'), + (NUMBERNS,'textual'), + ), + (NUMBERNS,'number'):( + (NUMBERNS,'display-factor'), + (NUMBERNS,'decimal-places'), + (NUMBERNS,'decimal-replacement'), + (NUMBERNS,'min-integer-digits'), + (NUMBERNS,'grouping'), + ), + (NUMBERNS,'number-style'):( + (NUMBERNS,'transliteration-language'), + (STYLENS,'name'), + (STYLENS,'display-name'), + (NUMBERNS,'language'), + (NUMBERNS,'title'), + (NUMBERNS,'country'), + (NUMBERNS,'transliteration-format'), + (NUMBERNS,'transliteration-style'), + (STYLENS,'volatile'), + (NUMBERNS,'transliteration-country'), + ), +# allowed_attributes + (NUMBERNS,'percentage-style'):( + (NUMBERNS,'transliteration-language'), + (STYLENS,'name'), + (STYLENS,'display-name'), + (NUMBERNS,'language'), + (NUMBERNS,'title'), + (NUMBERNS,'country'), + (NUMBERNS,'transliteration-format'), + (NUMBERNS,'transliteration-style'), + (STYLENS,'volatile'), + (NUMBERNS,'transliteration-country'), + ), + (NUMBERNS,'quarter'):( + (NUMBERNS,'style'), + (NUMBERNS,'calendar'), + ), + (NUMBERNS,'scientific-number'):( + (NUMBERNS,'min-exponent-digits'), + (NUMBERNS,'decimal-places'), + (NUMBERNS,'min-integer-digits'), + (NUMBERNS,'grouping'), + ), + (NUMBERNS,'seconds'):( + (NUMBERNS,'style'), + (NUMBERNS,'decimal-places'), + ), + (NUMBERNS,'text'):( + ), + (NUMBERNS,'text-content'):( + ), + (NUMBERNS,'text-style'):( + (NUMBERNS,'transliteration-language'), + (STYLENS,'name'), + (STYLENS,'display-name'), + (NUMBERNS,'language'), + (NUMBERNS,'title'), + (NUMBERNS,'country'), + (NUMBERNS,'transliteration-format'), + (NUMBERNS,'transliteration-style'), + (STYLENS,'volatile'), + (NUMBERNS,'transliteration-country'), + ), + (NUMBERNS,'time-style'):( + (NUMBERNS,'transliteration-language'), + (NUMBERNS,'transliteration-format'), + (STYLENS,'name'), + (STYLENS,'display-name'), + (NUMBERNS,'language'), + (NUMBERNS,'title'), + (NUMBERNS,'country'), + (NUMBERNS,'truncate-on-overflow'), + (NUMBERNS,'transliteration-style'), + (NUMBERNS,'format-source'), + (STYLENS,'volatile'), + (NUMBERNS,'transliteration-country'), + ), + (NUMBERNS,'week-of-year'):( + (NUMBERNS,'calendar'), + ), + (NUMBERNS,'year'):( + (NUMBERNS,'style'), + (NUMBERNS,'calendar'), + ), + (DR3DNS,'cube'):( + (DR3DNS,'min-edge'), + (DR3DNS,'max-edge'), + (DRAWNS,'layer'), + (DR3DNS,'transform'), + (DRAWNS,'z-index'), + (DRAWNS,'class-names'), + (DRAWNS,'style-name'), + (PRESENTATIONNS,'style-name'), + (PRESENTATIONNS,'class-names'), + (DRAWNS,'id'), + ), + (DR3DNS,'extrude'):( + (DRAWNS,'layer'), + (SVGNS,'d'), + (DR3DNS,'transform'), + (SVGNS,'viewBox'), + (DRAWNS,'z-index'), + (DRAWNS,'class-names'), + (DRAWNS,'style-name'), + (PRESENTATIONNS,'style-name'), + (PRESENTATIONNS,'class-names'), + (DRAWNS,'id'), + ), + (DR3DNS,'light'):( + (DR3DNS,'diffuse-color'), + (DR3DNS,'direction'), + (DR3DNS,'specular'), + (DR3DNS,'enabled'), + ), + (DR3DNS,'rotate'):( + (DRAWNS,'layer'), + (SVGNS,'d'), + (DR3DNS,'transform'), + (SVGNS,'viewBox'), + (DRAWNS,'z-index'), + (DRAWNS,'class-names'), + (DRAWNS,'style-name'), + (PRESENTATIONNS,'style-name'), + (PRESENTATIONNS,'class-names'), + (DRAWNS,'id'), + ), +# allowed_attributes + (DR3DNS,'scene'):( + (DR3DNS,'ambient-color'), + (DR3DNS,'distance'), + (DR3DNS,'focal-length'), + (DR3DNS,'lighting-mode'), + (DR3DNS,'projection'), + (DR3DNS,'shade-mode'), + (DR3DNS,'shadow-slant'), + (DR3DNS,'transform'), + (DR3DNS,'vpn'), + (DR3DNS,'vrp'), + (DR3DNS,'vup'), + (DRAWNS,'id'), + (DRAWNS,'caption-id'), + (DRAWNS,'layer'), + (DRAWNS,'z-index'), + (DRAWNS,'class-names'), + (DRAWNS,'style-name'), + (PRESENTATIONNS,'class-names'), + (PRESENTATIONNS,'style-name'), + (SVGNS,'height'), + (SVGNS,'width'), + (SVGNS,'x'), + (SVGNS,'y'), + (TABLENS,'end-cell-address'), + (TABLENS,'end-x'), + (TABLENS,'end-y'), + (TABLENS,'table-background'), + (TEXTNS,'anchor-page-number'), + (TEXTNS,'anchor-type'), + ), + (DR3DNS,'sphere'):( + (DRAWNS,'layer'), + (DR3DNS,'center'), + (DR3DNS,'transform'), + (DRAWNS,'z-index'), + (DRAWNS,'class-names'), + (DRAWNS,'style-name'), + (PRESENTATIONNS,'style-name'), + (PRESENTATIONNS,'class-names'), + (DRAWNS,'id'), + (DR3DNS,'size'), + ), + (DRAWNS,'a'):( + (OFFICENS,'name'), + (OFFICENS,'title'), + (XLINKNS,'show'), + (OFFICENS,'target-frame-name'), + (XLINKNS,'actuate'), + (XLINKNS,'href'), + (XLINKNS,'type'), + (OFFICENS,'server-map'), + ), + (DRAWNS,'applet'):( + (DRAWNS,'code'), + (XLINKNS,'show'), + (DRAWNS,'object'), + (XLINKNS,'actuate'), + (XLINKNS,'href'), + (XLINKNS,'type'), + (DRAWNS,'archive'), + (DRAWNS,'may-script'), + ), + (DRAWNS,'area-circle'):( + (OFFICENS,'name'), + (XLINKNS,'show'), + (SVGNS,'cx'), + (XLINKNS,'type'), + (DRAWNS,'nohref'), + (SVGNS,'cy'), + (XLINKNS,'href'), + (SVGNS,'r'), + (OFFICENS,'target-frame-name'), + ), + (DRAWNS,'area-polygon'):( + (OFFICENS,'name'), + (XLINKNS,'show'), + (XLINKNS,'type'), + (SVGNS,'height'), + (DRAWNS,'nohref'), + (SVGNS,'width'), + (XLINKNS,'href'), + (SVGNS,'y'), + (SVGNS,'x'), + (OFFICENS,'target-frame-name'), + (SVGNS,'viewBox'), + (DRAWNS,'points'), + ), + (DRAWNS,'area-rectangle'):( + (OFFICENS,'name'), + (XLINKNS,'show'), + (XLINKNS,'type'), + (SVGNS,'height'), + (DRAWNS,'nohref'), + (SVGNS,'width'), + (XLINKNS,'href'), + (SVGNS,'y'), + (SVGNS,'x'), + (OFFICENS,'target-frame-name'), + ), + (DRAWNS,'caption'):( + (TABLENS,'table-background'), + (DRAWNS,'layer'), + (DRAWNS,'caption-id'), + (TABLENS,'end-cell-address'), + (DRAWNS,'name'), + (DRAWNS,'text-style-name'), + (DRAWNS,'caption-point-y'), + (DRAWNS,'caption-point-x'), + (DRAWNS,'transform'), + (TABLENS,'end-y'), + (DRAWNS,'corner-radius'), + (SVGNS,'width'), + (DRAWNS,'z-index'), + (DRAWNS,'class-names'), + (DRAWNS,'style-name'), + (PRESENTATIONNS,'style-name'), + (PRESENTATIONNS,'class-names'), + (TABLENS,'end-x'), + (TEXTNS,'anchor-page-number'), + (SVGNS,'y'), + (SVGNS,'x'), + (SVGNS,'height'), + (DRAWNS,'id'), + (TEXTNS,'anchor-type'), + ), + (DRAWNS,'circle'):( + (DRAWNS,'end-angle'), + (DRAWNS,'id'), + (DRAWNS,'kind'), + (DRAWNS,'layer'), + (DRAWNS,'name'), + (DRAWNS,'start-angle'), + (DRAWNS,'class-names'), + (DRAWNS,'style-name'), + (DRAWNS,'caption-id'), + (DRAWNS,'text-style-name'), + (DRAWNS,'transform'), + (DRAWNS,'z-index'), + (PRESENTATIONNS,'class-names'), + (PRESENTATIONNS,'style-name'), + (SVGNS,'cx'), + (SVGNS,'cy'), + (SVGNS,'height'), + (SVGNS,'r'), + (SVGNS,'width'), + (SVGNS,'x'), + (SVGNS,'y'), + (TABLENS,'end-cell-address'), + (TABLENS,'end-x'), + (TABLENS,'end-y'), + (TABLENS,'table-background'), + (TEXTNS,'anchor-page-number'), + (TEXTNS,'anchor-type'), + ), + (DRAWNS,'connector'):( + (DRAWNS,'layer'), + (DRAWNS,'end-shape'), + (TEXTNS,'anchor-page-number'), + (SVGNS,'y1'), + (SVGNS,'y2'), + (TABLENS,'table-background'), + (TABLENS,'end-cell-address'), + (DRAWNS,'transform'), + (DRAWNS,'id'), + (TABLENS,'end-y'), + (TABLENS,'end-x'), + (DRAWNS,'class-names'), + (DRAWNS,'style-name'), + (PRESENTATIONNS,'class-names'), + (DRAWNS,'caption-id'), + (DRAWNS,'type'), + (DRAWNS,'start-shape'), + (DRAWNS,'z-index'), + (PRESENTATIONNS,'style-name'), + (DRAWNS,'start-glue-point'), + (SVGNS,'x2'), + (SVGNS,'x1'), + (TEXTNS,'anchor-type'), + (DRAWNS,'line-skew'), + (DRAWNS,'name'), + (DRAWNS,'end-glue-point'), + (DRAWNS,'text-style-name'), + ), + (DRAWNS,'contour-path'):( + (SVGNS,'d'), + (SVGNS,'width'), + (DRAWNS,'recreate-on-edit'), + (SVGNS,'viewBox'), + (SVGNS,'height'), + ), + (DRAWNS,'contour-polygon'):( + (SVGNS,'width'), + (DRAWNS,'points'), + (DRAWNS,'recreate-on-edit'), + (SVGNS,'viewBox'), + (SVGNS,'height'), + ), + (DRAWNS,'control'):( + (DRAWNS,'control'), + (DRAWNS,'layer'), + (DRAWNS,'caption-id'), + (TABLENS,'end-cell-address'), + (DRAWNS,'name'), + (DRAWNS,'text-style-name'), + (TABLENS,'table-background'), + (DRAWNS,'transform'), + (SVGNS,'height'), + (SVGNS,'width'), + (DRAWNS,'z-index'), + (DRAWNS,'class-names'), + (DRAWNS,'style-name'), + (PRESENTATIONNS,'style-name'), + (PRESENTATIONNS,'class-names'), + (TABLENS,'end-x'), + (TEXTNS,'anchor-page-number'), + (SVGNS,'y'), + (SVGNS,'x'), + (TABLENS,'end-y'), + (DRAWNS,'id'), + (TEXTNS,'anchor-type'), + ), + (DRAWNS,'custom-shape'):( + (DRAWNS,'engine'), + (DRAWNS,'caption-id'), + (DRAWNS,'layer'), + (TABLENS,'end-cell-address'), + (DRAWNS,'name'), + (DRAWNS,'text-style-name'), + (TABLENS,'table-background'), + (DRAWNS,'transform'), + (SVGNS,'height'), + (SVGNS,'width'), + (DRAWNS,'z-index'), + (DRAWNS,'class-names'), + (DRAWNS,'style-name'), + (PRESENTATIONNS,'style-name'), + (PRESENTATIONNS,'class-names'), + (TABLENS,'end-x'), + (TEXTNS,'anchor-page-number'), + (SVGNS,'y'), + (SVGNS,'x'), + (TABLENS,'end-y'), + (DRAWNS,'data'), + (DRAWNS,'id'), + (TEXTNS,'anchor-type'), + ), +# allowed_attributes + (DRAWNS,'ellipse'):( + (DRAWNS,'layer'), + (DRAWNS,'start-angle'), + (SVGNS,'cy'), + (SVGNS,'cx'), + (TABLENS,'table-background'), + (TABLENS,'end-cell-address'), + (SVGNS,'rx'), + (DRAWNS,'transform'), + (DRAWNS,'id'), + (SVGNS,'width'), + (TABLENS,'end-y'), + (TABLENS,'end-x'), + (DRAWNS,'class-names'), + (DRAWNS,'style-name'), + (PRESENTATIONNS,'class-names'), + (DRAWNS,'end-angle'), + (DRAWNS,'z-index'), + (DRAWNS,'caption-id'), + (PRESENTATIONNS,'style-name'), + (SVGNS,'height'), + (TEXTNS,'anchor-type'), + (SVGNS,'ry'), + (DRAWNS,'kind'), + (DRAWNS,'name'), + (TEXTNS,'anchor-page-number'), + (SVGNS,'y'), + (SVGNS,'x'), + (DRAWNS,'text-style-name'), + ), +# allowed_attributes + (DRAWNS,'enhanced-geometry'):( + (DRAWNS,'extrusion-rotation-center'), + (DRAWNS,'extrusion-shininess'), + (DRAWNS,'extrusion-rotation-angle'), + (DRAWNS,'extrusion-allowed'), + (DRAWNS,'extrusion-first-light-level'), + (DRAWNS,'extrusion-specularity'), + (DRAWNS,'extrusion-viewpoint'), + (DRAWNS,'extrusion-second-light-level'), + (DRAWNS,'extrusion-origin'), + (DRAWNS,'extrusion-color'), + (SVGNS,'viewBox'), + (DR3DNS,'projection'), + (DRAWNS,'extrusion-metal'), + (DRAWNS,'extrusion-number-of-line-segments'), + (DRAWNS,'text-path-same-letter-heights'), + (DRAWNS,'extrusion-first-light-harsh'), + (DRAWNS,'enhanced-path'), + (DRAWNS,'text-rotate-angle'), + (DRAWNS,'type'), + (DRAWNS,'glue-point-leaving-directions'), + (DRAWNS,'concentric-gradient-fill-allowed'), + (DRAWNS,'text-path-scale'), + (DRAWNS,'extrusion-brightness'), + (DRAWNS,'extrusion-first-light-direction'), + (DRAWNS,'extrusion-light-face'), + (DRAWNS,'text-path-allowed'), + (DRAWNS,'glue-points'), + (DRAWNS,'mirror-vertical'), + (DRAWNS,'extrusion-depth'), + (DRAWNS,'extrusion-diffusion'), + (DRAWNS,'extrusion-second-light-direction'), + (DRAWNS,'extrusion-skew'), + (DR3DNS,'shade-mode'), + (DRAWNS,'path-stretchpoint-y'), + (DRAWNS,'modifiers'), + (DRAWNS,'extrusion'), + (DRAWNS,'path-stretchpoint-x'), + (DRAWNS,'text-areas'), + (DRAWNS,'mirror-horizontal'), + (DRAWNS,'text-path-mode'), + (DRAWNS,'extrusion-second-light-harsh'), + (DRAWNS,'glue-point-type'), + (DRAWNS,'text-path'), + ), +# allowed_attributes + (DRAWNS,'equation'):( + (DRAWNS,'formula'), + (DRAWNS,'name'), + ), + (DRAWNS,'fill-image'):( + (DRAWNS,'name'), + (XLINKNS,'show'), + (XLINKNS,'actuate'), + (SVGNS,'height'), + (SVGNS,'width'), + (XLINKNS,'href'), + (DRAWNS,'display-name'), + (XLINKNS,'type'), + ), + (DRAWNS,'floating-frame'):( + (XLINKNS,'href'), + (XLINKNS,'actuate'), + (DRAWNS,'frame-name'), + (XLINKNS,'type'), + (XLINKNS,'show'), + ), + (DRAWNS,'frame'):( + (DRAWNS,'copy-of'), + (DRAWNS,'id'), + (DRAWNS,'layer'), + (DRAWNS,'name'), + (DRAWNS,'class-names'), + (DRAWNS,'caption-id'), + (DRAWNS,'style-name'), + (DRAWNS,'text-style-name'), + (DRAWNS,'transform'), + (DRAWNS,'z-index'), + (PRESENTATIONNS,'class'), + (PRESENTATIONNS,'class-names'), + (PRESENTATIONNS,'placeholder'), + (PRESENTATIONNS,'style-name'), + (PRESENTATIONNS,'user-transformed'), + (STYLENS,'rel-height'), + (STYLENS,'rel-width'), + (SVGNS,'height'), + (SVGNS,'width'), + (SVGNS,'x'), + (SVGNS,'y'), + (TABLENS,'end-cell-address'), + (TABLENS,'end-x'), + (TABLENS,'end-y'), + (TABLENS,'table-background'), + (TEXTNS,'anchor-page-number'), + (TEXTNS,'anchor-type'), + ), +# allowed_attributes + (DRAWNS,'g'):( + (DRAWNS,'id'), + (DRAWNS,'caption-id'), + (DRAWNS,'name'), + (DRAWNS,'class-names'), + (DRAWNS,'style-name'), + (DRAWNS,'z-index'), + (PRESENTATIONNS,'class-names'), + (PRESENTATIONNS,'style-name'), + (SVGNS,'y'), + (TABLENS,'end-cell-address'), + (TABLENS,'end-x'), + (TABLENS,'end-y'), + (TABLENS,'table-background'), + (TEXTNS,'anchor-page-number'), + (TEXTNS,'anchor-type'), + ), + (DRAWNS,'glue-point'):( + (SVGNS,'y'), + (SVGNS,'x'), + (DRAWNS,'align'), + (DRAWNS,'id'), + (DRAWNS,'escape-direction'), + ), + (DRAWNS,'gradient'):( + (DRAWNS,'style'), + (DRAWNS,'angle'), + (DRAWNS,'name'), + (DRAWNS,'end-color'), + (DRAWNS,'start-color'), + (DRAWNS,'cy'), + (DRAWNS,'cx'), + (DRAWNS,'display-name'), + (DRAWNS,'border'), + (DRAWNS,'end-intensity'), + (DRAWNS,'start-intensity'), + ), + (DRAWNS,'handle'):( + (DRAWNS,'handle-radius-range-minimum'), + (DRAWNS,'handle-switched'), + (DRAWNS,'handle-range-y-maximum'), + (DRAWNS,'handle-mirror-horizontal'), + (DRAWNS,'handle-range-x-maximum'), + (DRAWNS,'handle-mirror-vertical'), + (DRAWNS,'handle-range-y-minimum'), + (DRAWNS,'handle-radius-range-maximum'), + (DRAWNS,'handle-range-x-minimum'), + (DRAWNS,'handle-position'), + (DRAWNS,'handle-polar'), + ), + (DRAWNS,'hatch'):( + (DRAWNS,'distance'), + (DRAWNS,'style'), + (DRAWNS,'name'), + (DRAWNS,'color'), + (DRAWNS,'display-name'), + (DRAWNS,'rotation'), + ), + (DRAWNS,'image'):( + (DRAWNS,'filter-name'), + (XLINKNS,'href'), + (XLINKNS,'type'), + (XLINKNS,'actuate'), + (XLINKNS,'show'), + ), + (DRAWNS,'image-map'):( + ), + (DRAWNS,'layer'):( + (DRAWNS,'protected'), + (DRAWNS,'name'), + (DRAWNS,'display'), + ), +# allowed_attributes + (DRAWNS,'layer-set'):( + ), + (DRAWNS,'line'):( + (DRAWNS,'class-names'), + (DRAWNS,'id'), + (DRAWNS,'caption-id'), + (DRAWNS,'layer'), + (DRAWNS,'name'), + (DRAWNS,'style-name'), + (DRAWNS,'text-style-name'), + (DRAWNS,'transform'), + (DRAWNS,'z-index'), + (PRESENTATIONNS,'class-names'), + (PRESENTATIONNS,'style-name'), + (SVGNS,'x1'), + (SVGNS,'x2'), + (SVGNS,'y1'), + (SVGNS,'y2'), + (TABLENS,'end-cell-address'), + (TABLENS,'end-x'), + (TABLENS,'end-y'), + (TABLENS,'table-background'), + (TEXTNS,'anchor-page-number'), + (TEXTNS,'anchor-type'), + ), + (DRAWNS,'marker'):( + (SVGNS,'d'), + (DRAWNS,'display-name'), + (DRAWNS,'name'), + (SVGNS,'viewBox'), + ), +# allowed_attributes + (DRAWNS,'measure'):( + (TABLENS,'end-cell-address'), + (DRAWNS,'layer'), + (SVGNS,'y2'), + (DRAWNS,'name'), + (DRAWNS,'text-style-name'), + (DRAWNS,'transform'), + (TABLENS,'table-background'), + (SVGNS,'x2'), + (DRAWNS,'z-index'), + (DRAWNS,'class-names'), + (DRAWNS,'style-name'), + (PRESENTATIONNS,'style-name'), + (PRESENTATIONNS,'class-names'), + (TABLENS,'end-x'), + (TEXTNS,'anchor-page-number'), + (SVGNS,'y1'), + (DRAWNS,'caption-id'), + (TABLENS,'end-y'), + (SVGNS,'x1'), + (DRAWNS,'id'), + (TEXTNS,'anchor-type'), + ), + (DRAWNS,'object'):( + (XLINKNS,'type'), + (XLINKNS,'href'), + (DRAWNS,'notify-on-update-of-ranges'), + (XLINKNS,'actuate'), + (XLINKNS,'show'), + ), + (DRAWNS,'object-ole'):( + (XLINKNS,'actuate'), + (XLINKNS,'href'), + (XLINKNS,'type'), + (DRAWNS,'class-id'), + (XLINKNS,'show'), + ), + (DRAWNS,'opacity'):( + (DRAWNS,'style'), + (DRAWNS,'angle'), + (DRAWNS,'name'), + (DRAWNS,'start'), + (DRAWNS,'cy'), + (DRAWNS,'cx'), + (DRAWNS,'end'), + (DRAWNS,'display-name'), + (DRAWNS,'border'), + ), + (DRAWNS,'page'):( + (PRESENTATIONNS,'presentation-page-layout-name'), + (DRAWNS,'name'), + (DRAWNS,'nav-order'), + (PRESENTATIONNS,'use-footer-name'), + (DRAWNS,'style-name'), + (PRESENTATIONNS,'use-header-name'), + (DRAWNS,'master-page-name'), + (DRAWNS,'id'), + (PRESENTATIONNS,'use-date-time-name'), + ), + (DRAWNS,'page-thumbnail'):( + (TABLENS,'table-background'), + (DRAWNS,'caption-id'), + (PRESENTATIONNS,'user-transformed'), + (DRAWNS,'layer'), + (TABLENS,'end-cell-address'), + (DRAWNS,'name'), + (DRAWNS,'id'), + (DRAWNS,'transform'), + (DRAWNS,'page-number'), + (SVGNS,'height'), + (SVGNS,'width'), + (DRAWNS,'z-index'), + (DRAWNS,'class-names'), + (DRAWNS,'style-name'), + (PRESENTATIONNS,'style-name'), + (PRESENTATIONNS,'class-names'), + (TABLENS,'end-x'), + (TEXTNS,'anchor-page-number'), + (SVGNS,'y'), + (SVGNS,'x'), + (TABLENS,'end-y'), + (PRESENTATIONNS,'placeholder'), + (PRESENTATIONNS,'class'), + (TEXTNS,'anchor-type'), + ), + (DRAWNS,'param'):( + (DRAWNS,'name'), + (DRAWNS,'value'), + ), +# allowed_attributes + (DRAWNS,'path'):( + (TABLENS,'table-background'), + (DRAWNS,'layer'), + (TABLENS,'end-cell-address'), + (DRAWNS,'caption-id'), + (SVGNS,'d'), + (DRAWNS,'text-style-name'), + (DRAWNS,'id'), + (DRAWNS,'transform'), + (SVGNS,'height'), + (SVGNS,'width'), + (DRAWNS,'z-index'), + (DRAWNS,'class-names'), + (DRAWNS,'style-name'), + (PRESENTATIONNS,'style-name'), + (PRESENTATIONNS,'class-names'), + (TABLENS,'end-x'), + (TEXTNS,'anchor-type'), + (TEXTNS,'anchor-page-number'), + (SVGNS,'y'), + (SVGNS,'x'), + (TABLENS,'end-y'), + (SVGNS,'viewBox'), + (DRAWNS,'name'), + ), + (DRAWNS,'plugin'):( + (XLINKNS,'type'), + (XLINKNS,'href'), + (DRAWNS,'mime-type'), + (XLINKNS,'actuate'), + (XLINKNS,'show'), + ), + (DRAWNS,'polygon'):( + (DRAWNS,'caption-id'), + (TABLENS,'table-background'), + (DRAWNS,'layer'), + (TABLENS,'end-cell-address'), + (DRAWNS,'name'), + (DRAWNS,'text-style-name'), + (DRAWNS,'id'), + (DRAWNS,'transform'), + (PRESENTATIONNS,'style-name'), + (SVGNS,'height'), + (SVGNS,'width'), + (DRAWNS,'z-index'), + (DRAWNS,'points'), + (DRAWNS,'class-names'), + (DRAWNS,'style-name'), + (PRESENTATIONNS,'class-names'), + (TABLENS,'end-x'), + (TEXTNS,'anchor-page-number'), + (SVGNS,'y'), + (SVGNS,'x'), + (TABLENS,'end-y'), + (SVGNS,'viewBox'), + (TEXTNS,'anchor-type'), + ), +# allowed_attributes + (DRAWNS,'polyline'):( + (TABLENS,'table-background'), + (DRAWNS,'layer'), + (TABLENS,'end-cell-address'), + (DRAWNS,'name'), + (DRAWNS,'text-style-name'), + (DRAWNS,'id'), + (DRAWNS,'caption-id'), + (DRAWNS,'transform'), + (PRESENTATIONNS,'style-name'), + (SVGNS,'height'), + (SVGNS,'width'), + (DRAWNS,'z-index'), + (DRAWNS,'points'), + (DRAWNS,'class-names'), + (DRAWNS,'style-name'), + (PRESENTATIONNS,'class-names'), + (TABLENS,'end-x'), + (TEXTNS,'anchor-page-number'), + (SVGNS,'y'), + (SVGNS,'x'), + (TABLENS,'end-y'), + (SVGNS,'viewBox'), + (TEXTNS,'anchor-type'), + ), + (DRAWNS,'rect'):( + (DRAWNS,'corner-radius'), + (DRAWNS,'caption-id'), + (DRAWNS,'id'), + (DRAWNS,'layer'), + (DRAWNS,'name'), + (DRAWNS,'text-style-name'), + (DRAWNS,'transform'), + (DRAWNS,'z-index'), + (DRAWNS,'class-names'), + (DRAWNS,'style-name'), + (PRESENTATIONNS,'class-names'), + (PRESENTATIONNS,'style-name'), + (SVGNS,'height'), + (SVGNS,'width'), + (SVGNS,'x'), + (SVGNS,'y'), + (TABLENS,'end-cell-address'), + (TABLENS,'end-x'), + (TABLENS,'end-y'), + (TABLENS,'table-background'), + (TEXTNS,'anchor-page-number'), + (TEXTNS,'anchor-type'), + ), +# allowed_attributes + (DRAWNS,'regular-polygon'):( + (TABLENS,'table-background'), + (DRAWNS,'layer'), + (TABLENS,'end-cell-address'), + (DRAWNS,'caption-id'), + (DRAWNS,'name'), + (DRAWNS,'text-style-name'), + (TEXTNS,'anchor-page-number'), + (DRAWNS,'concave'), + (DRAWNS,'sharpness'), + (DRAWNS,'transform'), + (SVGNS,'height'), + (SVGNS,'width'), + (DRAWNS,'z-index'), + (DRAWNS,'class-names'), + (DRAWNS,'style-name'), + (PRESENTATIONNS,'style-name'), + (PRESENTATIONNS,'class-names'), + (TABLENS,'end-x'), + (DRAWNS,'corners'), + (SVGNS,'y'), + (SVGNS,'x'), + (TABLENS,'end-y'), + (DRAWNS,'id'), + (TEXTNS,'anchor-type'), + ), + (DRAWNS,'stroke-dash'):( + (DRAWNS,'distance'), + (DRAWNS,'dots1-length'), + (DRAWNS,'name'), + (DRAWNS,'dots2-length'), + (DRAWNS,'style'), + (DRAWNS,'dots1'), + (DRAWNS,'display-name'), + (DRAWNS,'dots2'), + ), + (DRAWNS,'text-box'):( + (FONS,'min-width'), + (DRAWNS,'corner-radius'), + (FONS,'max-height'), + (FONS,'min-height'), + (DRAWNS,'chain-next-name'), + (FONS,'max-width'), + (TEXTNS,'id'), + ), +# allowed_attributes + (FORMNS,'button'):( + (FORMNS,'tab-stop'), + (FORMNS,'focus-on-click'), + (FORMNS,'image-align'), + (FORMNS,'name'), + (FORMNS,'tab-index'), + (FORMNS,'control-implementation'), + (XFORMSNS,'bind'), + (FORMNS,'button-type'), + (FORMNS,'title'), + (FORMNS,'default-button'), + (FORMNS,'value'), + (FORMNS,'label'), + (FORMNS,'disabled'), + (FORMNS,'printable'), + (FORMNS,'image-data'), + (XLINKNS,'href'), + (FORMNS,'toggle'), + (FORMNS,'xforms-submission'), + (OFFICENS,'target-frame'), + (FORMNS,'id'), + (FORMNS,'image-position'), + ), + (FORMNS,'checkbox'):( + (FORMNS,'tab-stop'), + (FORMNS,'image-align'), + (FORMNS,'name'), + (FORMNS,'tab-index'), + (FORMNS,'control-implementation'), + (XFORMSNS,'bind'), + (FORMNS,'data-field'), + (FORMNS,'title'), + (FORMNS,'is-tristate'), + (FORMNS,'current-state'), + (FORMNS,'value'), + (FORMNS,'label'), + (FORMNS,'disabled'), + (FORMNS,'printable'), + (FORMNS,'state'), + (FORMNS,'visual-effect'), + (FORMNS,'id'), + (FORMNS,'image-position'), + ), + (FORMNS,'column'):( + (FORMNS,'control-implementation'), + (FORMNS,'text-style-name'), + (FORMNS,'name'), + (FORMNS,'label'), + ), + (FORMNS,'combobox'):( + (FORMNS,'convert-empty-to-null'), + (FORMNS,'max-length'), + (FORMNS,'tab-stop'), + (FORMNS,'name'), + (FORMNS,'dropdown'), + (FORMNS,'control-implementation'), + (XFORMSNS,'bind'), + (FORMNS,'data-field'), + (FORMNS,'tab-index'), + (FORMNS,'auto-complete'), + (FORMNS,'value'), + (FORMNS,'disabled'), + (FORMNS,'printable'), + (FORMNS,'readonly'), + (FORMNS,'list-source'), + (FORMNS,'title'), + (FORMNS,'list-source-type'), + (FORMNS,'id'), + (FORMNS,'current-value'), + (FORMNS,'size'), + ), +# allowed_attributes + (FORMNS,'connection-resource'):( + (XLINKNS,'href'), + ), + (FORMNS,'date'):( + (FORMNS,'convert-empty-to-null'), + (FORMNS,'max-length'), + (FORMNS,'tab-stop'), + (FORMNS,'name'), + (FORMNS,'tab-index'), + (FORMNS,'control-implementation'), + (FORMNS,'min-value'), + (FORMNS,'data-field'), + (FORMNS,'max-value'), + (FORMNS,'value'), + (FORMNS,'disabled'), + (FORMNS,'printable'), + (FORMNS,'readonly'), + (XFORMSNS,'bind'), + (FORMNS,'title'), + (FORMNS,'id'), + (FORMNS,'current-value'), + ), + (FORMNS,'file'):( + (FORMNS,'max-length'), + (FORMNS,'tab-stop'), + (FORMNS,'name'), + (FORMNS,'tab-index'), + (FORMNS,'control-implementation'), + (XFORMSNS,'bind'), + (FORMNS,'title'), + (FORMNS,'value'), + (FORMNS,'disabled'), + (FORMNS,'printable'), + (FORMNS,'readonly'), + (FORMNS,'id'), + (FORMNS,'current-value'), + ), + (FORMNS,'fixed-text'):( + (FORMNS,'name'), + (FORMNS,'for'), + (FORMNS,'title'), + (FORMNS,'control-implementation'), + (XFORMSNS,'bind'), + (FORMNS,'multi-line'), + (FORMNS,'label'), + (FORMNS,'disabled'), + (FORMNS,'printable'), + (FORMNS,'id'), + ), +# allowed_attributes + (FORMNS,'form'):( + (XLINKNS,'actuate'), + (XLINKNS,'href'), + (FORMNS,'allow-deletes'), + (FORMNS,'command-type'), + (FORMNS,'apply-filter'), + (XLINKNS,'type'), + (FORMNS,'method'), + (OFFICENS,'target-frame'), + (FORMNS,'navigation-mode'), + (FORMNS,'detail-fields'), + (FORMNS,'master-fields'), + (FORMNS,'allow-updates'), + (FORMNS,'name'), + (FORMNS,'tab-cycle'), + (FORMNS,'control-implementation'), + (FORMNS,'escape-processing'), + (FORMNS,'filter'), + (FORMNS,'command'), + (FORMNS,'datasource'), + (FORMNS,'enctype'), + (FORMNS,'allow-inserts'), + (FORMNS,'ignore-result'), + (FORMNS,'order'), + ), + (FORMNS,'formatted-text'):( + (FORMNS,'convert-empty-to-null'), + (FORMNS,'max-length'), + (FORMNS,'tab-stop'), + (FORMNS,'max-value'), + (FORMNS,'name'), + (FORMNS,'tab-index'), + (FORMNS,'control-implementation'), + (XFORMSNS,'bind'), + (FORMNS,'data-field'), + (FORMNS,'title'), + (FORMNS,'value'), + (FORMNS,'disabled'), + (FORMNS,'printable'), + (FORMNS,'readonly'), + (FORMNS,'min-value'), + (FORMNS,'validation'), + (FORMNS,'id'), + (FORMNS,'current-value'), + ), + (FORMNS,'frame'):( + (FORMNS,'name'), + (FORMNS,'for'), + (FORMNS,'title'), + (FORMNS,'control-implementation'), + (XFORMSNS,'bind'), + (FORMNS,'label'), + (FORMNS,'disabled'), + (FORMNS,'printable'), + (FORMNS,'id'), + ), +# allowed_attributes + (FORMNS,'generic-control'):( + (FORMNS,'control-implementation'), + (XFORMSNS,'bind'), + (FORMNS,'name'), + (FORMNS,'id'), + ), + (FORMNS,'grid'):( + (FORMNS,'tab-stop'), + (FORMNS,'name'), + (FORMNS,'tab-index'), + (FORMNS,'control-implementation'), + (XFORMSNS,'bind'), + (FORMNS,'title'), + (FORMNS,'disabled'), + (FORMNS,'printable'), + (FORMNS,'id'), + ), + (FORMNS,'hidden'):( + (FORMNS,'control-implementation'), + (XFORMSNS,'bind'), + (FORMNS,'name'), + (FORMNS,'value'), + (FORMNS,'id'), + ), + (FORMNS,'image'):( + (FORMNS,'tab-stop'), + (FORMNS,'name'), + (FORMNS,'tab-index'), + (FORMNS,'control-implementation'), + (XFORMSNS,'bind'), + (FORMNS,'button-type'), + (FORMNS,'title'), + (FORMNS,'value'), + (OFFICENS,'target-frame'), + (FORMNS,'disabled'), + (FORMNS,'printable'), + (FORMNS,'image-data'), + (XLINKNS,'href'), + (FORMNS,'id'), + ), + (FORMNS,'image-frame'):( + (FORMNS,'name'), + (FORMNS,'title'), + (FORMNS,'control-implementation'), + (XFORMSNS,'bind'), + (FORMNS,'data-field'), + (FORMNS,'readonly'), + (FORMNS,'disabled'), + (FORMNS,'printable'), + (FORMNS,'image-data'), + (FORMNS,'id'), + ), + (FORMNS,'item'):( + (FORMNS,'label'), + ), + (FORMNS,'list-property'):( + (FORMNS,'property-name'), + (OFFICENS,'value-type'), + ), + (FORMNS,'list-value'):( + (OFFICENS,'string-value'), + ), +# allowed_attributes + (FORMNS,'listbox'):( + (FORMNS,'tab-stop'), + (FORMNS,'bound-column'), + (FORMNS,'multiple'), + (FORMNS,'name'), + (FORMNS,'dropdown'), + (FORMNS,'control-implementation'), + (XFORMSNS,'bind'), + (FORMNS,'data-field'), + (FORMNS,'tab-index'), + (FORMNS,'disabled'), + (FORMNS,'printable'), + (FORMNS,'list-source'), + (FORMNS,'title'), + (FORMNS,'list-source-type'), + (FORMNS,'id'), + (FORMNS,'xforms-list-source'), + (FORMNS,'size'), + ), + (FORMNS,'number'):( + (FORMNS,'convert-empty-to-null'), + (FORMNS,'max-length'), + (FORMNS,'tab-stop'), + (FORMNS,'name'), + (FORMNS,'tab-index'), + (FORMNS,'control-implementation'), + (FORMNS,'min-value'), + (FORMNS,'data-field'), + (FORMNS,'max-value'), + (FORMNS,'value'), + (FORMNS,'disabled'), + (FORMNS,'printable'), + (FORMNS,'readonly'), + (XFORMSNS,'bind'), + (FORMNS,'title'), + (FORMNS,'id'), + (FORMNS,'current-value'), + ), + (FORMNS,'option'):( + (FORMNS,'current-selected'), + (FORMNS,'selected'), + (FORMNS,'value'), + (FORMNS,'label'), + ), + (FORMNS,'password'):( + (FORMNS,'convert-empty-to-null'), + (FORMNS,'max-length'), + (FORMNS,'tab-stop'), + (FORMNS,'name'), + (FORMNS,'tab-index'), + (FORMNS,'control-implementation'), + (XFORMSNS,'bind'), + (FORMNS,'title'), + (FORMNS,'value'), + (FORMNS,'disabled'), + (FORMNS,'printable'), + (FORMNS,'echo-char'), + (FORMNS,'id'), + ), + (FORMNS,'properties'):( + ), + (FORMNS,'property'):( + (OFFICENS,'string-value'), + (OFFICENS,'value'), + (OFFICENS,'boolean-value'), + (FORMNS,'property-name'), + (OFFICENS,'currency'), + (OFFICENS,'date-value'), + (OFFICENS,'value-type'), + (OFFICENS,'time-value'), + ), + (FORMNS,'radio'):( + (FORMNS,'tab-stop'), + (FORMNS,'selected'), + (FORMNS,'image-align'), + (FORMNS,'name'), + (FORMNS,'tab-index'), + (FORMNS,'control-implementation'), + (XFORMSNS,'bind'), + (FORMNS,'data-field'), + (FORMNS,'current-selected'), + (FORMNS,'value'), + (FORMNS,'label'), + (FORMNS,'disabled'), + (FORMNS,'printable'), + (FORMNS,'title'), + (FORMNS,'visual-effect'), + (FORMNS,'id'), + (FORMNS,'image-position'), + ), + (FORMNS,'text'):( + (FORMNS,'convert-empty-to-null'), + (FORMNS,'max-length'), + (FORMNS,'tab-stop'), + (FORMNS,'name'), + (FORMNS,'tab-index'), + (FORMNS,'control-implementation'), + (XFORMSNS,'bind'), + (FORMNS,'data-field'), + (FORMNS,'title'), + (FORMNS,'value'), + (FORMNS,'disabled'), + (FORMNS,'printable'), + (FORMNS,'readonly'), + (FORMNS,'id'), + (FORMNS,'current-value'), + ), + (FORMNS,'textarea'):( + (FORMNS,'convert-empty-to-null'), + (FORMNS,'max-length'), + (FORMNS,'tab-stop'), + (FORMNS,'name'), + (FORMNS,'tab-index'), + (FORMNS,'control-implementation'), + (XFORMSNS,'bind'), + (FORMNS,'data-field'), + (FORMNS,'title'), + (FORMNS,'value'), + (FORMNS,'disabled'), + (FORMNS,'printable'), + (FORMNS,'readonly'), + (FORMNS,'id'), + (FORMNS,'current-value'), + ), + (FORMNS,'time'):( + (FORMNS,'convert-empty-to-null'), + (FORMNS,'max-length'), + (FORMNS,'tab-stop'), + (FORMNS,'name'), + (FORMNS,'tab-index'), + (FORMNS,'control-implementation'), + (FORMNS,'min-value'), + (FORMNS,'data-field'), + (FORMNS,'max-value'), + (FORMNS,'value'), + (FORMNS,'disabled'), + (FORMNS,'printable'), + (FORMNS,'readonly'), + (XFORMSNS,'bind'), + (FORMNS,'title'), + (FORMNS,'id'), + (FORMNS,'current-value'), + ), + (FORMNS,'value-range'):( + (FORMNS,'tab-stop'), + (FORMNS,'max-value'), + (FORMNS,'name'), + (FORMNS,'tab-index'), + (FORMNS,'control-implementation'), + (XFORMSNS,'bind'), + (FORMNS,'title'), + (FORMNS,'value'), + (FORMNS,'disabled'), + (FORMNS,'printable'), + (FORMNS,'orientation'), + (FORMNS,'page-step-size'), + (FORMNS,'delay-for-repeat'), + (FORMNS,'min-value'), + (FORMNS,'id'), + (FORMNS,'step-size'), + ), + (MANIFESTNS,'algorithm') : ( + (MANIFESTNS,'algorithm-name'), + (MANIFESTNS,'initialisation-vector'), + ), + (MANIFESTNS,'encryption-data') : ( + (MANIFESTNS,'checksum-type'), + (MANIFESTNS,'checksum'), + ), + (MANIFESTNS,'file-entry') : ( + (MANIFESTNS,'full-path'), + (MANIFESTNS,'media-type'), + (MANIFESTNS,'size'), + ), + (MANIFESTNS,'key-derivation') : ( + (MANIFESTNS,'key-derivation-name'), + (MANIFESTNS,'salt'), + (MANIFESTNS,'iteration-count'), + ), + (MANIFESTNS,'manifest'):( + ), +# allowed_attributes + (METANS,'auto-reload'):( + (METANS,'delay'), + (XLINKNS,'actuate'), + (XLINKNS,'href'), + (XLINKNS,'type'), + (XLINKNS,'show'), + ), + (METANS,'creation-date'):( + ), + (METANS,'date-string'):( + ), + (METANS,'document-statistic'):( + (METANS,'non-whitespace-character-count'), + (METANS,'ole-object-count'), + (METANS,'table-count'), + (METANS,'row-count'), + (METANS,'character-count'), + (METANS,'sentence-count'), + (METANS,'draw-count'), + (METANS,'paragraph-count'), + (METANS,'word-count'), + (METANS,'object-count'), + (METANS,'syllable-count'), + (METANS,'image-count'), + (METANS,'page-count'), + (METANS,'frame-count'), + (METANS,'cell-count'), + ), + (METANS,'editing-cycles'):( + ), + (METANS,'editing-duration'):( + ), + (METANS,'generator'):( + ), +# allowed_attributes + (METANS,'hyperlink-behaviour'):( + (OFFICENS,'target-frame-name'), + (XLINKNS,'show'), + ), + (METANS,'initial-creator'):( + ), + (METANS,'keyword'):( + ), + (METANS,'print-date'):( + ), + (METANS,'printed-by'):( + ), + (METANS,'template'):( + (METANS,'date'), + (XLINKNS,'actuate'), + (XLINKNS,'href'), + (XLINKNS,'type'), + (XLINKNS,'title'), + ), + (METANS,'user-defined'):( + (METANS,'name'), + (METANS,'value-type'), + ), + (OFFICENS,'annotation'):( + (DRAWNS,'layer'), + (SVGNS,'height'), + (TEXTNS,'anchor-page-number'), + (TABLENS,'table-background'), + (TABLENS,'end-cell-address'), + (DRAWNS,'transform'), + (DRAWNS,'id'), + (SVGNS,'width'), + (DRAWNS,'class-names'), + (DRAWNS,'style-name'), + (PRESENTATIONNS,'class-names'), + (TABLENS,'end-x'), + (DRAWNS,'text-style-name'), + (DRAWNS,'z-index'), + (PRESENTATIONNS,'style-name'), + (TEXTNS,'anchor-type'), + (DRAWNS,'name'), + (DRAWNS,'caption-point-y'), + (DRAWNS,'caption-point-x'), + (DRAWNS,'corner-radius'), + (SVGNS,'y'), + (SVGNS,'x'), + (TABLENS,'end-y'), + (OFFICENS,'display'), + ), + (OFFICENS,'automatic-styles'):( + ), + (OFFICENS,'binary-data'):( + ), + (OFFICENS,'body'):( + ), + (OFFICENS,'change-info'):( + ), + (OFFICENS,'chart'):( + ), + (OFFICENS,'dde-source'):( + (OFFICENS,'dde-application'), + (OFFICENS,'automatic-update'), + (OFFICENS,'conversion-mode'), + (OFFICENS,'dde-item'), + (OFFICENS,'dde-topic'), + (OFFICENS,'name'), + ), + (OFFICENS,'document'):( + (OFFICENS,'mimetype'), + (OFFICENS,'version'), + ), + (OFFICENS,'document-content'):( + (OFFICENS,'version'), + ), + (OFFICENS,'document-meta'):( + (OFFICENS,'version'), + ), + (OFFICENS,'document-settings'):( + (OFFICENS,'version'), + ), + (OFFICENS,'document-styles'):( + (OFFICENS,'version'), + ), + (OFFICENS,'drawing'):( + ), + (OFFICENS,'event-listeners'):( + ), + (OFFICENS,'font-face-decls'):( + ), + (OFFICENS,'forms'):( + (FORMNS,'automatic-focus'), + (FORMNS,'apply-design-mode'), + ), + (OFFICENS,'image'):( + ), +# allowed_attributes + (OFFICENS,'master-styles'):( + ), + (OFFICENS,'meta'):( + ), + (OFFICENS,'presentation'):( + ), + (OFFICENS,'script'):( + (SCRIPTNS,'language'), + ), + (OFFICENS,'scripts'):( + ), + (OFFICENS,'settings'):( + ), + (OFFICENS,'spreadsheet'):( + (TABLENS,'structure-protected'), + (TABLENS,'protection-key'), + ), + (OFFICENS,'styles'):( + ), + (OFFICENS,'text'):( + (TEXTNS,'global'), + (TEXTNS,'use-soft-page-breaks'), + ), + (PRESENTATIONNS,'animation-group'):( + ), + (PRESENTATIONNS,'animations'):( + ), + (PRESENTATIONNS,'date-time'):( + ), + (PRESENTATIONNS,'date-time-decl'):( + (PRESENTATIONNS,'source'), + (STYLENS,'data-style-name'), + (PRESENTATIONNS,'name'), + ), + (PRESENTATIONNS,'dim'):( + (DRAWNS,'color'), + (DRAWNS,'shape-id'), + ), + (PRESENTATIONNS,'event-listener'):( + (PRESENTATIONNS,'direction'), + (XLINKNS,'show'), + (XLINKNS,'type'), + (XLINKNS,'actuate'), + (PRESENTATIONNS,'effect'), + (SCRIPTNS,'event-name'), + (PRESENTATIONNS,'start-scale'), + (XLINKNS,'href'), + (PRESENTATIONNS,'verb'), + (PRESENTATIONNS,'action'), + (PRESENTATIONNS,'speed'), + ), + (PRESENTATIONNS,'footer'):( + ), + (PRESENTATIONNS,'footer-decl'):( + (PRESENTATIONNS,'name'), + ), + (PRESENTATIONNS,'header'):( + ), + (PRESENTATIONNS,'header-decl'):( + (PRESENTATIONNS,'name'), + ), + (PRESENTATIONNS,'hide-shape'):( + (PRESENTATIONNS,'direction'), + (PRESENTATIONNS,'effect'), + (PRESENTATIONNS,'delay'), + (PRESENTATIONNS,'start-scale'), + (PRESENTATIONNS,'path-id'), + (PRESENTATIONNS,'speed'), + (DRAWNS,'shape-id'), + ), +# allowed_attributes + (PRESENTATIONNS,'hide-text'):( + (PRESENTATIONNS,'direction'), + (PRESENTATIONNS,'effect'), + (PRESENTATIONNS,'delay'), + (PRESENTATIONNS,'start-scale'), + (PRESENTATIONNS,'path-id'), + (PRESENTATIONNS,'speed'), + (DRAWNS,'shape-id'), + ), + (PRESENTATIONNS,'notes'):( + (STYLENS,'page-layout-name'), + (DRAWNS,'style-name'), + (PRESENTATIONNS,'use-header-name'), + (PRESENTATIONNS,'use-date-time-name'), + (PRESENTATIONNS,'use-footer-name'), + ), + (PRESENTATIONNS,'placeholder'):( + (SVGNS,'y'), + (SVGNS,'x'), + (SVGNS,'height'), + (PRESENTATIONNS,'object'), + (SVGNS,'width'), + ), + (PRESENTATIONNS,'play'):( + (PRESENTATIONNS,'speed'), + (DRAWNS,'shape-id'), + ), +# allowed_attributes + (PRESENTATIONNS,'settings'):( + (PRESENTATIONNS,'animations'), + (PRESENTATIONNS,'endless'), + (PRESENTATIONNS,'force-manual'), + (PRESENTATIONNS,'full-screen'), + (PRESENTATIONNS,'mouse-as-pen'), + (PRESENTATIONNS,'mouse-visible'), + (PRESENTATIONNS,'pause'), + (PRESENTATIONNS,'show'), + (PRESENTATIONNS,'show-end-of-presentation-slide'), + (PRESENTATIONNS,'show-logo'), + (PRESENTATIONNS,'start-page'), + (PRESENTATIONNS,'start-with-navigator'), + (PRESENTATIONNS,'stay-on-top'), + (PRESENTATIONNS,'transition-on-click'), + ), + (PRESENTATIONNS,'show'):( + (PRESENTATIONNS,'name'), + (PRESENTATIONNS,'pages'), + ), + (PRESENTATIONNS,'show-shape'):( + (PRESENTATIONNS,'direction'), + (PRESENTATIONNS,'effect'), + (PRESENTATIONNS,'delay'), + (PRESENTATIONNS,'start-scale'), + (PRESENTATIONNS,'path-id'), + (PRESENTATIONNS,'speed'), + (DRAWNS,'shape-id'), + ), + (PRESENTATIONNS,'show-text'):( + (PRESENTATIONNS,'direction'), + (PRESENTATIONNS,'effect'), + (PRESENTATIONNS,'delay'), + (PRESENTATIONNS,'start-scale'), + (PRESENTATIONNS,'path-id'), + (PRESENTATIONNS,'speed'), + (DRAWNS,'shape-id'), + ), + (PRESENTATIONNS,'sound'):( + (XLINKNS,'actuate'), + (XLINKNS,'href'), + (XLINKNS,'type'), + (PRESENTATIONNS,'play-full'), + (XLINKNS,'show'), + ), +# allowed_attributes + (SCRIPTNS,'event-listener'):( + (SCRIPTNS,'language'), + (SCRIPTNS,'macro-name'), + (XLINKNS,'actuate'), + (SCRIPTNS,'event-name'), + (XLINKNS,'href'), + (XLINKNS,'type'), + ), + (STYLENS,'background-image'):( + (DRAWNS,'opacity'), + (STYLENS,'repeat'), + (XLINKNS,'show'), + (XLINKNS,'actuate'), + (STYLENS,'filter-name'), + (XLINKNS,'href'), + (STYLENS,'position'), + (XLINKNS,'type'), + ), + (STYLENS,'chart-properties'): ( + (CHARTNS,'connect-bars'), + (CHARTNS,'data-label-number'), + (CHARTNS,'data-label-symbol'), + (CHARTNS,'data-label-text'), + (CHARTNS,'deep'), + (CHARTNS,'display-label'), + (CHARTNS,'error-category'), + (CHARTNS,'error-lower-indicator'), + (CHARTNS,'error-lower-limit'), + (CHARTNS,'error-margin'), + (CHARTNS,'error-percentage'), + (CHARTNS,'error-upper-indicator'), + (CHARTNS,'error-upper-limit'), + (CHARTNS,'gap-width'), + (CHARTNS,'interpolation'), + (CHARTNS,'interval-major'), + (CHARTNS,'interval-minor-divisor'), + (CHARTNS,'japanese-candle-stick'), + (CHARTNS,'label-arrangement'), + (CHARTNS,'lines'), + (CHARTNS,'link-data-style-to-source'), + (CHARTNS,'logarithmic'), + (CHARTNS,'maximum'), + (CHARTNS,'mean-value'), + (CHARTNS,'minimum'), + (CHARTNS,'origin'), + (CHARTNS,'overlap'), + (CHARTNS,'percentage'), + (CHARTNS,'pie-offset'), + (CHARTNS,'regression-type'), + (CHARTNS,'scale-text'), + (CHARTNS,'series-source'), + (CHARTNS,'solid-type'), + (CHARTNS,'spline-order'), + (CHARTNS,'spline-resolution'), + (CHARTNS,'stacked'), + (CHARTNS,'symbol-height'), + (CHARTNS,'symbol-name'), + (CHARTNS,'symbol-type'), + (CHARTNS,'symbol-width'), + (CHARTNS,'text-overlap'), + (CHARTNS,'three-dimensional'), + (CHARTNS,'tick-marks-major-inner'), + (CHARTNS,'tick-marks-major-outer'), + (CHARTNS,'tick-marks-minor-inner'), + (CHARTNS,'tick-marks-minor-outer'), + (CHARTNS,'vertical'), + (CHARTNS,'visible'), + (STYLENS,'direction'), + (STYLENS,'rotation-angle'), + (TEXTNS,'line-break'), + ), + (STYLENS,'column'):( + (FONS,'end-indent'), + (FONS,'space-before'), + (FONS,'start-indent'), + (FONS,'space-after'), + (STYLENS,'rel-width'), + ), + (STYLENS,'column-sep'):( + (STYLENS,'color'), + (STYLENS,'width'), + (STYLENS,'style'), + (STYLENS,'vertical-align'), + (STYLENS,'height'), + ), + (STYLENS,'columns'):( + (FONS,'column-count'), + (FONS,'column-gap'), + ), + (STYLENS,'default-style'):( + (STYLENS,'family'), + ), +# allowed_attributes + (STYLENS,'drawing-page-properties'): ( + (DRAWNS,'fill'), + (DRAWNS,'fill-color'), + (DRAWNS,'secondary-fill-color'), + (DRAWNS,'fill-gradient-name'), + (DRAWNS,'gradient-step-count'), + (DRAWNS,'fill-hatch-name'), + (DRAWNS,'fill-hatch-solid'), + (DRAWNS,'fill-image-name'), + (STYLENS,'repeat'), + (DRAWNS,'fill-image-width'), + (DRAWNS,'fill-image-height'), + (DRAWNS,'fill-image-ref-point-x'), + (DRAWNS,'fill-image-ref-point-y'), + (DRAWNS,'fill-image-ref-point'), + (DRAWNS,'tile-repeat-offset'), + (DRAWNS,'opacity'), + (DRAWNS,'opacity-name'), + (SVGNS,'fill-rule'), + (PRESENTATIONNS,'transition-type'), + (PRESENTATIONNS,'transition-style'), + (PRESENTATIONNS,'transition-speed'), + (SMILNS,'type'), + (SMILNS,'subtype'), + (SMILNS,'direction'), + (SMILNS,'fadeColor'), + (PRESENTATIONNS,'duration'), + (PRESENTATIONNS,'visibility'), + (DRAWNS,'background-size'), + (PRESENTATIONNS,'background-objects-visible'), + (PRESENTATIONNS,'background-visible'), + (PRESENTATIONNS,'display-header'), + (PRESENTATIONNS,'display-footer'), + (PRESENTATIONNS,'display-page-number'), + (PRESENTATIONNS,'display-date-time'), + ), + (STYLENS,'drop-cap'):( + (STYLENS,'distance'), + (STYLENS,'length'), + (STYLENS,'style-name'), + (STYLENS,'lines'), + ), +# allowed_attributes + (STYLENS,'font-face'):( + (STYLENS,'font-adornments'), + (STYLENS,'font-charset'), + (STYLENS,'font-family-generic'), + (STYLENS,'font-pitch'), + (STYLENS,'name'), + (SVGNS,'accent-height'), + (SVGNS,'alphabetic'), + (SVGNS,'ascent'), + (SVGNS,'bbox'), + (SVGNS,'cap-height'), + (SVGNS,'descent'), + (SVGNS,'font-family'), + (SVGNS,'font-size'), + (SVGNS,'font-stretch'), + (SVGNS,'font-style'), + (SVGNS,'font-variant'), + (SVGNS,'font-weight'), + (SVGNS,'hanging'), + (SVGNS,'ideographic'), + (SVGNS,'mathematical'), + (SVGNS,'overline-position'), + (SVGNS,'overline-thickness'), + (SVGNS,'panose-1'), + (SVGNS,'slope'), + (SVGNS,'stemh'), + (SVGNS,'stemv'), + (SVGNS,'strikethrough-position'), + (SVGNS,'strikethrough-thickness'), + (SVGNS,'underline-position'), + (SVGNS,'underline-thickness'), + (SVGNS,'unicode-range'), + (SVGNS,'units-per-em'), + (SVGNS,'v-alphabetic'), + (SVGNS,'v-hanging'), + (SVGNS,'v-ideographic'), + (SVGNS,'v-mathematical'), + (SVGNS,'widths'), + (SVGNS,'x-height'), + ), + (STYLENS,'footer'):( + (STYLENS,'display'), + ), + (STYLENS,'footer-left'):( + (STYLENS,'display'), + ), + (STYLENS,'footer-style'):( + ), + (STYLENS,'footnote-sep'):( + (STYLENS,'distance-after-sep'), + (STYLENS,'color'), + (STYLENS,'rel-width'), + (STYLENS,'width'), + (STYLENS,'distance-before-sep'), + (STYLENS,'line-style'), + (STYLENS,'adjustment'), + ), +# allowed_attributes + (STYLENS,'graphic-properties'): ( + (DR3DNS,'ambient-color'), + (DR3DNS,'back-scale'), + (DR3DNS,'backface-culling'), + (DR3DNS,'close-back'), + (DR3DNS,'close-front'), + (DR3DNS,'depth'), + (DR3DNS,'diffuse-color'), + (DR3DNS,'edge-rounding'), + (DR3DNS,'edge-rounding-mode'), + (DR3DNS,'emissive-color'), + (DR3DNS,'end-angle'), + (DR3DNS,'horizontal-segments'), + (DR3DNS,'lighting-mode'), + (DR3DNS,'normals-direction'), + (DR3DNS,'normals-kind'), + (DR3DNS,'shadow'), + (DR3DNS,'shininess'), + (DR3DNS,'specular-color'), + (DR3DNS,'texture-filter'), + (DR3DNS,'texture-generation-mode-x'), + (DR3DNS,'texture-generation-mode-y'), + (DR3DNS,'texture-kind'), + (DR3DNS,'texture-mode'), + (DR3DNS,'vertical-segments'), + (DRAWNS,'auto-grow-height'), + (DRAWNS,'auto-grow-width'), + (DRAWNS,'blue'), + (DRAWNS,'caption-angle'), + (DRAWNS,'caption-angle-type'), + (DRAWNS,'caption-escape'), + (DRAWNS,'caption-escape-direction'), + (DRAWNS,'caption-fit-line-length'), + (DRAWNS,'caption-gap'), + (DRAWNS,'caption-line-length'), + (DRAWNS,'caption-type'), + (DRAWNS,'color-inversion'), + (DRAWNS,'color-mode'), + (DRAWNS,'contrast'), + (DRAWNS,'decimal-places'), + (DRAWNS,'end-guide'), + (DRAWNS,'end-line-spacing-horizontal'), + (DRAWNS,'end-line-spacing-vertical'), + (DRAWNS,'fill'), + (DRAWNS,'fill-color'), + (DRAWNS,'fill-gradient-name'), + (DRAWNS,'fill-hatch-name'), + (DRAWNS,'fill-hatch-solid'), + (DRAWNS,'fill-image-height'), + (DRAWNS,'fill-image-name'), + (DRAWNS,'fill-image-ref-point'), + (DRAWNS,'fill-image-ref-point-x'), + (DRAWNS,'fill-image-ref-point-y'), + (DRAWNS,'fill-image-width'), +# allowed_attributes + (DRAWNS,'fit-to-contour'), + (DRAWNS,'fit-to-size'), + (DRAWNS,'frame-display-border'), + (DRAWNS,'frame-display-scrollbar'), + (DRAWNS,'frame-margin-horizontal'), + (DRAWNS,'frame-margin-vertical'), + (DRAWNS,'gamma'), + (DRAWNS,'gradient-step-count'), + (DRAWNS,'green'), + (DRAWNS,'guide-distance'), + (DRAWNS,'guide-overhang'), + (DRAWNS,'image-opacity'), + (DRAWNS,'line-distance'), + (DRAWNS,'luminance'), + (DRAWNS,'marker-end'), + (DRAWNS,'marker-end-center'), + (DRAWNS,'marker-end-width'), + (DRAWNS,'marker-start'), + (DRAWNS,'marker-start-center'), + (DRAWNS,'marker-start-width'), + (DRAWNS,'measure-align'), + (DRAWNS,'measure-vertical-align'), + (DRAWNS,'ole-draw-aspect'), + (DRAWNS,'opacity'), + (DRAWNS,'opacity-name'), + (DRAWNS,'parallel'), + (DRAWNS,'placing'), + (DRAWNS,'red'), + (DRAWNS,'secondary-fill-color'), + (DRAWNS,'shadow'), + (DRAWNS,'shadow-color'), + (DRAWNS,'shadow-offset-x'), + (DRAWNS,'shadow-offset-y'), + (DRAWNS,'shadow-opacity'), + (DRAWNS,'show-unit'), + (DRAWNS,'start-guide'), + (DRAWNS,'start-line-spacing-horizontal'), + (DRAWNS,'start-line-spacing-vertical'), + (DRAWNS,'stroke'), + (DRAWNS,'stroke-dash'), + (DRAWNS,'stroke-dash-names'), + (DRAWNS,'stroke-linejoin'), + (DRAWNS,'symbol-color'), + (DRAWNS,'textarea-horizontal-align'), + (DRAWNS,'textarea-vertical-align'), + (DRAWNS,'tile-repeat-offset'), + (DRAWNS,'unit'), + (DRAWNS,'visible-area-height'), + (DRAWNS,'visible-area-left'), + (DRAWNS,'visible-area-top'), + (DRAWNS,'visible-area-width'), + (DRAWNS,'wrap-influence-on-position'), +# allowed_attributes + (FONS,'background-color'), + (FONS,'border'), + (FONS,'border-bottom'), + (FONS,'border-left'), + (FONS,'border-right'), + (FONS,'border-top'), + (FONS,'clip'), + (FONS,'margin'), + (FONS,'margin-bottom'), + (FONS,'margin-left'), + (FONS,'margin-right'), + (FONS,'margin-top'), + (FONS,'max-height'), + (FONS,'max-width'), + (FONS,'min-height'), + (FONS,'min-width'), + (FONS,'padding'), + (FONS,'padding-bottom'), + (FONS,'padding-left'), + (FONS,'padding-right'), + (FONS,'padding-top'), + (FONS,'wrap-option'), + (STYLENS,'border-line-width'), + (STYLENS,'border-line-width-bottom'), + (STYLENS,'border-line-width-left'), + (STYLENS,'border-line-width-right'), + (STYLENS,'border-line-width-top'), + (STYLENS,'editable'), + (STYLENS,'flow-with-text'), + (STYLENS,'horizontal-pos'), + (STYLENS,'horizontal-rel'), + (STYLENS,'mirror'), + (STYLENS,'number-wrapped-paragraphs'), + (STYLENS,'overflow-behavior'), + (STYLENS,'print-content'), + (STYLENS,'protect'), + (STYLENS,'rel-height'), + (STYLENS,'rel-width'), + (STYLENS,'repeat'), + (STYLENS,'run-through'), + (STYLENS,'shadow'), + (STYLENS,'vertical-pos'), + (STYLENS,'vertical-rel'), + (STYLENS,'wrap'), + (STYLENS,'wrap-contour'), + (STYLENS,'wrap-contour-mode'), + (STYLENS,'wrap-dynamic-threshold'), + (STYLENS,'writing-mode'), + (SVGNS,'fill-rule'), + (SVGNS,'height'), + (SVGNS,'stroke-color'), + (SVGNS,'stroke-opacity'), + (SVGNS,'stroke-width'), + (SVGNS,'width'), + (SVGNS,'x'), + (SVGNS,'y'), + (TEXTNS,'anchor-page-number'), + (TEXTNS,'anchor-type'), + (TEXTNS,'animation'), + (TEXTNS,'animation-delay'), + (TEXTNS,'animation-direction'), + (TEXTNS,'animation-repeat'), + (TEXTNS,'animation-start-inside'), + (TEXTNS,'animation-steps'), + (TEXTNS,'animation-stop-inside'), + ), + (STYLENS,'handout-master'):( + (PRESENTATIONNS,'presentation-page-layout-name'), + (STYLENS,'page-layout-name'), + (PRESENTATIONNS,'use-footer-name'), + (DRAWNS,'style-name'), + (PRESENTATIONNS,'use-header-name'), + (PRESENTATIONNS,'use-date-time-name'), + ), +# allowed_attributes + (STYLENS,'header'):( + (STYLENS,'display'), + ), + (STYLENS,'header-footer-properties'): ( + (FONS,'background-color'), + (FONS,'border'), + (FONS,'border-bottom'), + (FONS,'border-left'), + (FONS,'border-right'), + (FONS,'border-top'), + (FONS,'margin'), + (FONS,'margin-bottom'), + (FONS,'margin-left'), + (FONS,'margin-right'), + (FONS,'margin-top'), + (FONS,'min-height'), + (FONS,'padding'), + (FONS,'padding-bottom'), + (FONS,'padding-left'), + (FONS,'padding-right'), + (FONS,'padding-top'), + (STYLENS,'border-line-width'), + (STYLENS,'border-line-width-bottom'), + (STYLENS,'border-line-width-left'), + (STYLENS,'border-line-width-right'), + (STYLENS,'border-line-width-top'), + (STYLENS,'dynamic-spacing'), + (STYLENS,'shadow'), + (SVGNS,'height'), + ), + (STYLENS,'header-left'):( + (STYLENS,'display'), + ), + (STYLENS,'header-style'):( + ), +# allowed_attributes + (STYLENS,'list-level-properties'): ( + (FONS,'height'), + (FONS,'text-align'), + (FONS,'width'), + (STYLENS,'font-name'), + (STYLENS,'vertical-pos'), + (STYLENS,'vertical-rel'), + (SVGNS,'y'), + (TEXTNS,'min-label-distance'), + (TEXTNS,'min-label-width'), + (TEXTNS,'space-before'), + ), + (STYLENS,'map'):( + (STYLENS,'apply-style-name'), + (STYLENS,'base-cell-address'), + (STYLENS,'condition'), + ), + (STYLENS,'master-page'):( + (STYLENS,'page-layout-name'), + (STYLENS,'display-name'), + (DRAWNS,'style-name'), + (STYLENS,'name'), + (STYLENS,'next-style-name'), + ), + (STYLENS,'page-layout'):( + (STYLENS,'name'), + (STYLENS,'page-usage'), + ), +# allowed_attributes + (STYLENS,'page-layout-properties'): ( + (FONS,'background-color'), + (FONS,'border'), + (FONS,'border-bottom'), + (FONS,'border-left'), + (FONS,'border-right'), + (FONS,'border-top'), + (FONS,'margin'), + (FONS,'margin-bottom'), + (FONS,'margin-left'), + (FONS,'margin-right'), + (FONS,'margin-top'), + (FONS,'padding'), + (FONS,'padding-bottom'), + (FONS,'padding-left'), + (FONS,'padding-right'), + (FONS,'padding-top'), + (FONS,'page-height'), + (FONS,'page-width'), + (STYLENS,'border-line-width'), + (STYLENS,'border-line-width-bottom'), + (STYLENS,'border-line-width-left'), + (STYLENS,'border-line-width-right'), + (STYLENS,'border-line-width-top'), + (STYLENS,'first-page-number'), + (STYLENS,'footnote-max-height'), + (STYLENS,'layout-grid-base-height'), + (STYLENS,'layout-grid-color'), + (STYLENS,'layout-grid-display'), + (STYLENS,'layout-grid-lines'), + (STYLENS,'layout-grid-mode'), + (STYLENS,'layout-grid-print'), + (STYLENS,'layout-grid-ruby-below'), + (STYLENS,'layout-grid-ruby-height'), + (STYLENS,'num-format'), + (STYLENS,'num-letter-sync'), + (STYLENS,'num-prefix'), + (STYLENS,'num-suffix'), + (STYLENS,'paper-tray-name'), + (STYLENS,'print'), + (STYLENS,'print-orientation'), + (STYLENS,'print-page-order'), + (STYLENS,'register-truth-ref-style-name'), + (STYLENS,'scale-to'), + (STYLENS,'scale-to-pages'), + (STYLENS,'shadow'), + (STYLENS,'table-centering'), + (STYLENS,'writing-mode'), + ), +# allowed_attributes + (STYLENS,'paragraph-properties'): ( + (FONS,'background-color'), + (FONS,'border'), + (FONS,'border-bottom'), + (FONS,'border-left'), + (FONS,'border-right'), + (FONS,'border-top'), + (FONS,'break-after'), + (FONS,'break-before'), + (FONS,'hyphenation-keep'), + (FONS,'hyphenation-ladder-count'), + (FONS,'keep-together'), + (FONS,'keep-with-next'), + (FONS,'line-height'), + (FONS,'margin'), + (FONS,'margin-bottom'), + (FONS,'margin-left'), + (FONS,'margin-right'), + (FONS,'margin-top'), + (FONS,'orphans'), + (FONS,'padding'), + (FONS,'padding-bottom'), + (FONS,'padding-left'), + (FONS,'padding-right'), + (FONS,'padding-top'), + (FONS,'text-align'), + (FONS,'text-align-last'), + (FONS,'text-indent'), + (FONS,'widows'), + (STYLENS,'auto-text-indent'), + (STYLENS,'background-transparency'), + (STYLENS,'border-line-width'), + (STYLENS,'border-line-width-bottom'), + (STYLENS,'border-line-width-left'), + (STYLENS,'border-line-width-right'), + (STYLENS,'border-line-width-top'), + (STYLENS,'font-independent-line-spacing'), + (STYLENS,'justify-single-word'), + (STYLENS,'line-break'), + (STYLENS,'line-height-at-least'), + (STYLENS,'line-spacing'), + (STYLENS,'page-number'), + (STYLENS,'punctuation-wrap'), + (STYLENS,'register-true'), + (STYLENS,'shadow'), + (STYLENS,'snap-to-layout-grid'), + (STYLENS,'tab-stop-distance'), + (STYLENS,'text-autospace'), + (STYLENS,'vertical-align'), + (STYLENS,'writing-mode'), + (STYLENS,'writing-mode-automatic'), + (TEXTNS,'line-number'), + (TEXTNS,'number-lines'), + ), + (STYLENS,'presentation-page-layout'):( + (STYLENS,'display-name'), + (STYLENS,'name'), + ), +# allowed_attributes + (STYLENS,'region-center'):( + ), + (STYLENS,'region-left'):( + ), + (STYLENS,'region-right'):( + ), + (STYLENS,'ruby-properties'): ( + (STYLENS,'ruby-position'), + (STYLENS,'ruby-align'), + ), + (STYLENS,'section-properties'): ( + (FONS,'background-color'), + (FONS,'margin-left'), + (FONS,'margin-right'), + (STYLENS,'protect'), + (STYLENS,'writing-mode'), + (TEXTNS,'dont-balance-text-columns'), + ), + (STYLENS,'style'):( + (STYLENS,'family'), + (STYLENS,'list-style-name'), + (STYLENS,'name'), + (STYLENS,'auto-update'), + (STYLENS,'default-outline-level'), + (STYLENS,'class'), + (STYLENS,'next-style-name'), + (STYLENS,'data-style-name'), + (STYLENS,'master-page-name'), + (STYLENS,'display-name'), + (STYLENS,'parent-style-name'), + ), +# allowed_attributes + (STYLENS,'tab-stop'):( + (STYLENS,'leader-text-style'), + (STYLENS,'leader-width'), + (STYLENS,'leader-style'), + (STYLENS,'char'), + (STYLENS,'leader-color'), + (STYLENS,'position'), + (STYLENS,'leader-text'), + (STYLENS,'type'), + (STYLENS,'leader-type'), + ), + (STYLENS,'tab-stops'):( + ), + (STYLENS,'table-cell-properties'): ( + (FONS,'background-color'), + (FONS,'border'), + (FONS,'border-bottom'), + (FONS,'border-left'), + (FONS,'border-right'), + (FONS,'border-top'), + (FONS,'padding'), + (FONS,'padding-bottom'), + (FONS,'padding-left'), + (FONS,'padding-right'), + (FONS,'padding-top'), + (FONS,'wrap-option'), + (STYLENS,'border-line-width'), + (STYLENS,'border-line-width-bottom'), + (STYLENS,'border-line-width-left'), + (STYLENS,'border-line-width-right'), + (STYLENS,'border-line-width-top'), + (STYLENS,'cell-protect'), + (STYLENS,'decimal-places'), + (STYLENS,'diagonal-bl-tr'), + (STYLENS,'diagonal-bl-tr-widths'), + (STYLENS,'diagonal-tl-br'), + (STYLENS,'diagonal-tl-br-widths'), + (STYLENS,'direction'), + (STYLENS,'glyph-orientation-vertical'), + (STYLENS,'print-content'), + (STYLENS,'repeat-content'), + (STYLENS,'rotation-align'), + (STYLENS,'rotation-angle'), + (STYLENS,'shadow'), + (STYLENS,'shrink-to-fit'), + (STYLENS,'text-align-source'), + (STYLENS,'vertical-align'), + ), +# allowed_attributes + (STYLENS,'table-column-properties'): ( + (FONS,'break-after'), + (FONS,'break-before'), + (STYLENS,'column-width'), + (STYLENS,'rel-column-width'), + (STYLENS,'use-optimal-column-width'), + ), + (STYLENS,'table-properties'): ( + (FONS,'background-color'), + (FONS,'break-after'), + (FONS,'break-before'), + (FONS,'keep-with-next'), + (FONS,'margin'), + (FONS,'margin-bottom'), + (FONS,'margin-left'), + (FONS,'margin-right'), + (FONS,'margin-top'), + (STYLENS,'may-break-between-rows'), + (STYLENS,'page-number'), + (STYLENS,'rel-width'), + (STYLENS,'shadow'), + (STYLENS,'width'), + (STYLENS,'writing-mode'), + (TABLENS,'align'), + (TABLENS,'border-model'), + (TABLENS,'display'), + ), + (STYLENS,'table-row-properties'): ( + (FONS,'background-color'), + (FONS,'break-after'), + (FONS,'break-before'), + (FONS,'keep-together'), + (STYLENS,'min-row-height'), + (STYLENS,'row-height'), + (STYLENS,'use-optimal-row-height'), + ), +# allowed_attributes + (STYLENS,'text-properties'): ( + (FONS,'background-color'), + (FONS,'color'), + (FONS,'country'), + (FONS,'font-family'), + (FONS,'font-size'), + (FONS,'font-style'), + (FONS,'font-variant'), + (FONS,'font-weight'), + (FONS,'hyphenate'), + (FONS,'hyphenation-push-char-count'), + (FONS,'hyphenation-remain-char-count'), + (FONS,'language'), + (FONS,'letter-spacing'), + (FONS,'text-shadow'), + (FONS,'text-transform'), + (STYLENS,'country-asian'), + (STYLENS,'country-complex'), + (STYLENS,'font-charset'), + (STYLENS,'font-charset-asian'), + (STYLENS,'font-charset-complex'), + (STYLENS,'font-family-asian'), + (STYLENS,'font-family-complex'), + (STYLENS,'font-family-generic'), + (STYLENS,'font-family-generic-asian'), + (STYLENS,'font-family-generic-complex'), + (STYLENS,'font-name'), + (STYLENS,'font-name-asian'), + (STYLENS,'font-name-complex'), + (STYLENS,'font-pitch'), + (STYLENS,'font-pitch-asian'), + (STYLENS,'font-pitch-complex'), + (STYLENS,'font-relief'), + (STYLENS,'font-size-asian'), + (STYLENS,'font-size-complex'), + (STYLENS,'font-size-rel'), + (STYLENS,'font-size-rel-asian'), + (STYLENS,'font-size-rel-complex'), + (STYLENS,'font-style-asian'), + (STYLENS,'font-style-complex'), + (STYLENS,'font-style-name'), + (STYLENS,'font-style-name-asian'), + (STYLENS,'font-style-name-complex'), + (STYLENS,'font-weight-asian'), + (STYLENS,'font-weight-complex'), + (STYLENS,'language-asian'), + (STYLENS,'language-complex'), + (STYLENS,'letter-kerning'), + (STYLENS,'script-type'), + (STYLENS,'text-blinking'), + (STYLENS,'text-combine'), + (STYLENS,'text-combine-end-char'), + (STYLENS,'text-combine-start-char'), + (STYLENS,'text-emphasize'), + (STYLENS,'text-line-through-color'), + (STYLENS,'text-line-through-mode'), + (STYLENS,'text-line-through-style'), + (STYLENS,'text-line-through-text'), + (STYLENS,'text-line-through-text-style'), + (STYLENS,'text-line-through-type'), + (STYLENS,'text-line-through-width'), + (STYLENS,'text-outline'), + (STYLENS,'text-position'), + (STYLENS,'text-rotation-angle'), + (STYLENS,'text-rotation-scale'), + (STYLENS,'text-scale'), + (STYLENS,'text-underline-color'), + (STYLENS,'text-underline-mode'), + (STYLENS,'text-underline-style'), + (STYLENS,'text-underline-type'), + (STYLENS,'text-underline-width'), + (STYLENS,'use-window-font-color'), + (TEXTNS,'condition'), + (TEXTNS,'display'), + ), + (SVGNS,'definition-src'):( + (XLINKNS,'actuate'), + (XLINKNS,'href'), + (XLINKNS,'type'), + ), + (SVGNS,'desc'):( + ), + (SVGNS,'font-face-format'):( + (SVGNS,'string'), + ), +# allowed_attributes + (SVGNS,'font-face-name'):( + (SVGNS,'name'), + ), + (SVGNS,'font-face-src'):( + ), + (SVGNS,'font-face-uri'):( + (XLINKNS,'actuate'), + (XLINKNS,'href'), + (XLINKNS,'type'), + ), + (SVGNS,'linearGradient'):( + (SVGNS,'y2'), + (DRAWNS,'name'), + (SVGNS,'spreadMethod'), + (SVGNS,'gradientUnits'), + (SVGNS,'x2'), + (SVGNS,'gradientTransform'), + (SVGNS,'y1'), + (DRAWNS,'display-name'), + (SVGNS,'x1'), + ), + (SVGNS,'radialGradient'):( + (DRAWNS,'name'), + (SVGNS,'fx'), + (SVGNS,'fy'), + (SVGNS,'spreadMethod'), + (SVGNS,'gradientUnits'), + (SVGNS,'cy'), + (SVGNS,'cx'), + (SVGNS,'gradientTransform'), + (DRAWNS,'display-name'), + (SVGNS,'r'), + ), + (SVGNS,'stop'):( + (SVGNS,'stop-color'), + (SVGNS,'stop-opacity'), + (SVGNS,'offset'), + ), + (SVGNS,'title'):( + ), +# allowed_attributes + (TABLENS,'body'):( + (TEXTNS,'paragraph-style-name'), + (TEXTNS,'style-name'), + ), + (TABLENS,'calculation-settings'):( + (TABLENS,'automatic-find-labels'), + (TABLENS,'case-sensitive'), + (TABLENS,'search-criteria-must-apply-to-whole-cell'), + (TABLENS,'precision-as-shown'), + (TABLENS,'use-regular-expressions'), + (TABLENS,'null-year'), + ), + (TABLENS,'cell-address'):( + (TABLENS,'column'), + (TABLENS,'table'), + (TABLENS,'row'), + ), + (TABLENS,'cell-content-change'):( + (TABLENS,'id'), + (TABLENS,'rejecting-change-id'), + (TABLENS,'acceptance-state'), + ), + (TABLENS,'cell-content-deletion'):( + (TABLENS,'id'), + ), + (TABLENS,'cell-range-source'):( + (TABLENS,'last-row-spanned'), + (TABLENS,'last-column-spanned'), + (TABLENS,'name'), + (TABLENS,'filter-options'), + (XLINKNS,'actuate'), + (TABLENS,'filter-name'), + (XLINKNS,'href'), + (TABLENS,'refresh-delay'), + (XLINKNS,'type'), + ), + (TABLENS,'change-deletion'):( + (TABLENS,'id'), + ), + (TABLENS,'change-track-table-cell'):( + (OFFICENS,'string-value'), + (TABLENS,'cell-address'), + (TABLENS,'number-matrix-columns-spanned'), + (TABLENS,'number-matrix-rows-spanned'), + (TABLENS,'matrix-covered'), + (OFFICENS,'value-type'), + (OFFICENS,'boolean-value'), + (OFFICENS,'currency'), + (OFFICENS,'date-value'), + (OFFICENS,'value'), + (TABLENS,'formula'), + (OFFICENS,'time-value'), + ), + (TABLENS,'consolidation'):( + (TABLENS,'function'), + (TABLENS,'source-cell-range-addresses'), + (TABLENS,'target-cell-address'), + (TABLENS,'link-to-source-data'), + (TABLENS,'use-labels'), + ), + (TABLENS,'content-validation'):( + (TABLENS,'base-cell-address'), + (TABLENS,'display-list'), + (TABLENS,'allow-empty-cell'), + (TABLENS,'name'), + (TABLENS,'condition'), + ), + (TABLENS,'content-validations'):( + ), +# allowed_attributes + (TABLENS,'covered-table-cell'):( + (TABLENS,'protect'), + (OFFICENS,'string-value'), + (OFFICENS,'value'), + (OFFICENS,'boolean-value'), + (OFFICENS,'currency'), + (OFFICENS,'date-value'), + (TABLENS,'style-name'), + (TABLENS,'content-validation-name'), + (OFFICENS,'value-type'), + (TABLENS,'number-columns-repeated'), + (TABLENS,'formula'), + (OFFICENS,'time-value'), + ), + (TABLENS,'cut-offs'):( + ), + (TABLENS,'data-pilot-display-info'):( + (TABLENS,'member-count'), + (TABLENS,'data-field'), + (TABLENS,'enabled'), + (TABLENS,'display-member-mode'), + ), + (TABLENS,'data-pilot-field'):( + (TABLENS,'selected-page'), + (TABLENS,'function'), + (TABLENS,'orientation'), + (TABLENS,'used-hierarchy'), + (TABLENS,'is-data-layout-field'), + (TABLENS,'source-field-name'), + ), + (TABLENS,'data-pilot-field-reference'):( + (TABLENS,'member-name'), + (TABLENS,'field-name'), + (TABLENS,'member-type'), + (TABLENS,'type'), + ), +# allowed_attributes + (TABLENS,'data-pilot-group'):( + (TABLENS,'name'), + ), + (TABLENS,'data-pilot-group-member'):( + (TABLENS,'name'), + ), + (TABLENS,'data-pilot-groups'):( + (TABLENS,'date-end'), + (TABLENS,'end'), + (TABLENS,'start'), + (TABLENS,'source-field-name'), + (TABLENS,'step'), + (TABLENS,'date-start'), + (TABLENS,'grouped-by'), + ), + (TABLENS,'data-pilot-layout-info'):( + (TABLENS,'add-empty-lines'), + (TABLENS,'layout-mode'), + ), + (TABLENS,'data-pilot-level'):( + (TABLENS,'show-empty'), + ), +# allowed_attributes + (TABLENS,'data-pilot-member'):( + (TABLENS,'show-details'), + (TABLENS,'name'), + (TABLENS,'display'), + ), + (TABLENS,'data-pilot-members'):( + ), + (TABLENS,'data-pilot-sort-info'):( + (TABLENS,'data-field'), + (TABLENS,'sort-mode'), + (TABLENS,'order'), + ), + (TABLENS,'data-pilot-subtotal'):( + (TABLENS,'function'), + ), + (TABLENS,'data-pilot-subtotals'):( + ), + (TABLENS,'data-pilot-table'):( + (TABLENS,'buttons'), + (TABLENS,'application-data'), + (TABLENS,'name'), + (TABLENS,'drill-down-on-double-click'), + (TABLENS,'target-range-address'), + (TABLENS,'ignore-empty-rows'), + (TABLENS,'identify-categories'), + (TABLENS,'show-filter-button'), + (TABLENS,'grand-total'), + ), +# allowed_attributes + (TABLENS,'data-pilot-tables'):( + ), + (TABLENS,'database-range'):( + (TABLENS,'orientation'), + (TABLENS,'target-range-address'), + (TABLENS,'contains-header'), + (TABLENS,'on-update-keep-size'), + (TABLENS,'name'), + (TABLENS,'is-selection'), + (TABLENS,'refresh-delay'), + (TABLENS,'display-filter-buttons'), + (TABLENS,'has-persistent-data'), + (TABLENS,'on-update-keep-styles'), + ), + (TABLENS,'database-ranges'):( + ), + (TABLENS,'database-source-query'):( + (TABLENS,'query-name'), + (TABLENS,'database-name'), + ), +# allowed_attributes + (TABLENS,'database-source-sql'):( + (TABLENS,'parse-sql-statement'), + (TABLENS,'database-name'), + (TABLENS,'sql-statement'), + ), + (TABLENS,'database-source-table'):( + (TABLENS,'database-table-name'), + (TABLENS,'database-name'), + ), + (TABLENS,'dde-link'):( + ), + (TABLENS,'dde-links'):( + ), + (TABLENS,'deletion'):( + (TABLENS,'rejecting-change-id'), + (TABLENS,'multi-deletion-spanned'), + (TABLENS,'acceptance-state'), + (TABLENS,'table'), + (TABLENS,'position'), + (TABLENS,'type'), + (TABLENS,'id'), + ), +# allowed_attributes + (TABLENS,'deletions'):( + ), + (TABLENS,'dependencies'):( + ), + (TABLENS,'dependency'):( + (TABLENS,'id'), + ), + (TABLENS,'detective'):( + ), + (TABLENS,'error-macro'):( + (TABLENS,'execute'), + ), + (TABLENS,'error-message'):( + (TABLENS,'display'), + (TABLENS,'message-type'), + (TABLENS,'title'), + ), + (TABLENS,'even-columns'):( + (TEXTNS,'paragraph-style-name'), + (TEXTNS,'style-name'), + ), + (TABLENS,'even-rows'):( + (TEXTNS,'paragraph-style-name'), + (TEXTNS,'style-name'), + ), +# allowed_attributes + (TABLENS,'filter'):( + (TABLENS,'target-range-address'), + (TABLENS,'display-duplicates'), + (TABLENS,'condition-source-range-address'), + (TABLENS,'condition-source'), + ), + (TABLENS,'filter-and'):( + ), + (TABLENS,'filter-condition'):( + (TABLENS,'operator'), + (TABLENS,'field-number'), + (TABLENS,'data-type'), + (TABLENS,'case-sensitive'), + (TABLENS,'value'), + ), + (TABLENS,'filter-or'):( + ), + (TABLENS,'first-column'):( + (TEXTNS,'paragraph-style-name'), + (TEXTNS,'style-name'), + ), + (TABLENS,'first-row'):( + (TEXTNS,'paragraph-style-name'), + (TEXTNS,'style-name'), + ), +# allowed_attributes + (TABLENS,'help-message'):( + (TABLENS,'display'), + (TABLENS,'title'), + ), + (TABLENS,'highlighted-range'):( + (TABLENS,'contains-error'), + (TABLENS,'direction'), + (TABLENS,'marked-invalid'), + (TABLENS,'cell-range-address'), + ), + (TABLENS,'insertion'):( + (TABLENS,'count'), + (TABLENS,'rejecting-change-id'), + (TABLENS,'acceptance-state'), + (TABLENS,'table'), + (TABLENS,'position'), + (TABLENS,'type'), + (TABLENS,'id'), + ), + (TABLENS,'insertion-cut-off'):( + (TABLENS,'position'), + (TABLENS,'id'), + ), + (TABLENS,'iteration'):( + (TABLENS,'status'), + (TABLENS,'maximum-difference'), + (TABLENS,'steps'), + ), +# allowed_attributes + (TABLENS,'label-range'):( + (TABLENS,'label-cell-range-address'), + (TABLENS,'data-cell-range-address'), + (TABLENS,'orientation'), + ), + (TABLENS,'label-ranges'):( + ), + (TABLENS,'last-column'):( + (TEXTNS,'paragraph-style-name'), + (TEXTNS,'style-name'), + ), + (TABLENS,'last-row'):( + (TEXTNS,'paragraph-style-name'), + (TEXTNS,'style-name'), + ), + (TABLENS,'movement'):( + (TABLENS,'id'), + (TABLENS,'rejecting-change-id'), + (TABLENS,'acceptance-state'), + ), + (TABLENS,'movement-cut-off'):( + (TABLENS,'position'), + (TABLENS,'end-position'), + (TABLENS,'start-position'), + ), + (TABLENS,'named-expression'):( + (TABLENS,'base-cell-address'), + (TABLENS,'expression'), + (TABLENS,'name'), + ), + (TABLENS,'named-expressions'):( + ), + (TABLENS,'named-range'):( + (TABLENS,'range-usable-as'), + (TABLENS,'base-cell-address'), + (TABLENS,'name'), + (TABLENS,'cell-range-address'), + ), + (TABLENS,'null-date'):( + (TABLENS,'date-value'), + (TABLENS,'value-type'), + ), + (TABLENS,'odd-columns'):( + (TEXTNS,'paragraph-style-name'), + (TEXTNS,'style-name'), + ), + (TABLENS,'odd-rows'):( + (TEXTNS,'paragraph-style-name'), + (TEXTNS,'style-name'), + ), + (TABLENS,'operation'):( + (TABLENS,'index'), + (TABLENS,'name'), + ), + (TABLENS,'previous'):( + (TABLENS,'id'), + ), + (TABLENS,'scenario'):( + (TABLENS,'comment'), + (TABLENS,'border-color'), + (TABLENS,'copy-back'), + (TABLENS,'is-active'), + (TABLENS,'protected'), + (TABLENS,'copy-formulas'), + (TABLENS,'copy-styles'), + (TABLENS,'scenario-ranges'), + (TABLENS,'display-border'), + ), + (TABLENS,'shapes'):( + ), + (TABLENS,'sort'):( + (TABLENS,'case-sensitive'), + (TABLENS,'algorithm'), + (TABLENS,'target-range-address'), + (TABLENS,'country'), + (TABLENS,'language'), + (TABLENS,'bind-styles-to-content'), + ), + (TABLENS,'sort-by'):( + (TABLENS,'field-number'), + (TABLENS,'data-type'), + (TABLENS,'order'), + ), + (TABLENS,'sort-groups'):( + (TABLENS,'data-type'), + (TABLENS,'order'), + ), + (TABLENS,'source-cell-range'):( + (TABLENS,'cell-range-address'), + ), + (TABLENS,'source-range-address'):( + (TABLENS,'column'), + (TABLENS,'end-column'), + (TABLENS,'start-table'), + (TABLENS,'end-row'), + (TABLENS,'table'), + (TABLENS,'start-row'), + (TABLENS,'row'), + (TABLENS,'end-table'), + (TABLENS,'start-column'), + ), +# allowed_attributes + (TABLENS,'source-service'):( + (TABLENS,'user-name'), + (TABLENS,'source-name'), + (TABLENS,'password'), + (TABLENS,'object-name'), + (TABLENS,'name'), + ), + (TABLENS,'subtotal-field'):( + (TABLENS,'function'), + (TABLENS,'field-number'), + ), + (TABLENS,'subtotal-rule'):( + (TABLENS,'group-by-field-number'), + ), + (TABLENS,'subtotal-rules'):( + (TABLENS,'bind-styles-to-content'), + (TABLENS,'page-breaks-on-group-change'), + (TABLENS,'case-sensitive'), + ), + (TABLENS,'table'):( + (TABLENS,'name'), + (TABLENS,'is-sub-table'), + (TABLENS,'style-name'), + (TABLENS,'protected'), + (TABLENS,'print-ranges'), + (TABLENS,'print'), + (TABLENS,'protection-key'), + ), + (TABLENS,'table-cell'):( + (TABLENS,'protect'), + (TABLENS,'number-matrix-rows-spanned'), + (TABLENS,'number-matrix-columns-spanned'), + (OFFICENS,'string-value'), + (TABLENS,'number-columns-spanned'), + (OFFICENS,'value'), + (OFFICENS,'boolean-value'), + (OFFICENS,'currency'), + (OFFICENS,'date-value'), + (TABLENS,'style-name'), + (TABLENS,'content-validation-name'), + (OFFICENS,'value-type'), + (TABLENS,'number-rows-spanned'), + (TABLENS,'number-columns-repeated'), + (TABLENS,'formula'), + (OFFICENS,'time-value'), + ), +# allowed_attributes + (TABLENS,'table-column'):( + (TABLENS,'style-name'), + (TABLENS,'default-cell-style-name'), + (TABLENS,'visibility'), + (TABLENS,'number-columns-repeated'), + ), + (TABLENS,'table-column-group'):( + (TABLENS,'display'), + ), + (TABLENS,'table-columns'):( + ), + (TABLENS,'table-header-columns'):( + ), + (TABLENS,'table-header-rows'):( + ), + (TABLENS,'table-row'):( + (TABLENS,'number-rows-repeated'), + (TABLENS,'style-name'), + (TABLENS,'visibility'), + (TABLENS,'default-cell-style-name'), + ), + (TABLENS,'table-row-group'):( + (TABLENS,'display'), + ), + (TABLENS,'table-rows'):( + ), + (TABLENS,'table-source'):( + (TABLENS,'filter-options'), + (XLINKNS,'actuate'), + (TABLENS,'filter-name'), + (XLINKNS,'href'), + (TABLENS,'mode'), + (TABLENS,'table-name'), + (XLINKNS,'type'), + (TABLENS,'refresh-delay'), + ), + (TABLENS,'table-template'):( + (TEXTNS,'last-row-end-column'), + (TEXTNS,'first-row-end-column'), + (TEXTNS,'name'), + (TEXTNS,'last-row-start-column'), + (TEXTNS,'first-row-start-column'), + ), + (TABLENS,'target-range-address'):( + (TABLENS,'column'), + (TABLENS,'end-column'), + (TABLENS,'start-table'), + (TABLENS,'end-row'), + (TABLENS,'table'), + (TABLENS,'start-row'), + (TABLENS,'row'), + (TABLENS,'end-table'), + (TABLENS,'start-column'), + ), + (TABLENS,'tracked-changes'):( + (TABLENS,'track-changes'), + ), +# allowed_attributes + (TEXTNS,'a'):( + (TEXTNS,'visited-style-name'), + (OFFICENS,'name'), + (OFFICENS,'title'), + (XLINKNS,'show'), + (OFFICENS,'target-frame-name'), + (XLINKNS,'actuate'), + (TEXTNS,'style-name'), + (XLINKNS,'href'), + (XLINKNS,'type'), + ), + (TEXTNS,'alphabetical-index'):( + (TEXTNS,'protected'), + (TEXTNS,'style-name'), + (TEXTNS,'name'), + (TEXTNS,'protection-key'), + ), + (TEXTNS,'alphabetical-index-auto-mark-file'):( + (XLINKNS,'href'), + (XLINKNS,'type'), + ), + (TEXTNS,'alphabetical-index-entry-template'):( + (TEXTNS,'style-name'), + (TEXTNS,'outline-level'), + ), + (TEXTNS,'alphabetical-index-mark'):( + (TEXTNS,'main-entry'), + (TEXTNS,'key1-phonetic'), + (TEXTNS,'key2'), + (TEXTNS,'key1'), + (TEXTNS,'string-value'), + (TEXTNS,'key2-phonetic'), + (TEXTNS,'string-value-phonetic'), + ), +# allowed_attributes + (TEXTNS,'alphabetical-index-mark-end'):( + (TEXTNS,'id'), + ), + (TEXTNS,'alphabetical-index-mark-start'):( + (TEXTNS,'main-entry'), + (TEXTNS,'key1-phonetic'), + (TEXTNS,'key2'), + (TEXTNS,'key1'), + (TEXTNS,'string-value-phonetic'), + (TEXTNS,'key2-phonetic'), + (TEXTNS,'id'), + ), + (TEXTNS,'alphabetical-index-source'):( + (TEXTNS,'capitalize-entries'), + (FONS,'language'), + (TEXTNS,'relative-tab-stop-position'), + (TEXTNS,'alphabetical-separators'), + (TEXTNS,'combine-entries-with-pp'), + (TEXTNS,'combine-entries-with-dash'), + (TEXTNS,'sort-algorithm'), + (TEXTNS,'ignore-case'), + (TEXTNS,'combine-entries'), + (TEXTNS,'comma-separated'), + (FONS,'country'), + (TEXTNS,'index-scope'), + (TEXTNS,'main-entry-style-name'), + (TEXTNS,'use-keys-as-entries'), + ), +# allowed_attributes + (TEXTNS,'author-initials'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'author-name'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'bibliography'):( + (TEXTNS,'protected'), + (TEXTNS,'style-name'), + (TEXTNS,'name'), + (TEXTNS,'protection-key'), + ), + (TEXTNS,'bibliography-configuration'):( + (TEXTNS,'suffix'), + (FONS,'language'), + (TEXTNS,'numbered-entries'), + (FONS,'country'), + (TEXTNS,'sort-by-position'), + (TEXTNS,'sort-algorithm'), + (TEXTNS,'prefix'), + ), + (TEXTNS,'bibliography-entry-template'):( + (TEXTNS,'style-name'), + (TEXTNS,'bibliography-type'), + ), +# allowed_attributes + (TEXTNS,'bibliography-mark'):( + (TEXTNS,'address'), + (TEXTNS,'annote'), + (TEXTNS,'author'), + (TEXTNS,'bibliography-type'), + (TEXTNS,'booktitle'), + (TEXTNS,'chapter'), + (TEXTNS,'custom1'), + (TEXTNS,'custom2'), + (TEXTNS,'custom3'), + (TEXTNS,'custom4'), + (TEXTNS,'custom5'), + (TEXTNS,'edition'), + (TEXTNS,'editor'), + (TEXTNS,'howpublished'), + (TEXTNS,'identifier'), + (TEXTNS,'institution'), + (TEXTNS,'isbn'), + (TEXTNS,'issn'), + (TEXTNS,'journal'), + (TEXTNS,'month'), + (TEXTNS,'note'), + (TEXTNS,'number'), + (TEXTNS,'organizations'), + (TEXTNS,'pages'), + (TEXTNS,'publisher'), + (TEXTNS,'report-type'), + (TEXTNS,'school'), + (TEXTNS,'series'), + (TEXTNS,'title'), + (TEXTNS,'url'), + (TEXTNS,'volume'), + (TEXTNS,'year'), + ), + (TEXTNS,'bibliography-source'):( + ), + (TEXTNS,'bookmark'):( + (TEXTNS,'name'), + ), + (TEXTNS,'bookmark-end'):( + (TEXTNS,'name'), + ), + (TEXTNS,'bookmark-ref'):( + (TEXTNS,'ref-name'), + (TEXTNS,'reference-format'), + ), + (TEXTNS,'bookmark-start'):( + (TEXTNS,'name'), + ), +# allowed_attributes + (TEXTNS,'change'):( + (TEXTNS,'change-id'), + ), + (TEXTNS,'change-end'):( + (TEXTNS,'change-id'), + ), + (TEXTNS,'change-start'):( + (TEXTNS,'change-id'), + ), + (TEXTNS,'changed-region'):( + (TEXTNS,'id'), + ), + (TEXTNS,'chapter'):( + (TEXTNS,'display'), + (TEXTNS,'outline-level'), + ), + (TEXTNS,'conditional-text'):( + (TEXTNS,'string-value-if-true'), + (TEXTNS,'current-value'), + (TEXTNS,'string-value-if-false'), + (TEXTNS,'condition'), + ), + (TEXTNS,'creation-date'):( + (TEXTNS,'date-value'), + (TEXTNS,'fixed'), + (STYLENS,'data-style-name'), + ), + (TEXTNS,'creation-time'):( + (TEXTNS,'fixed'), + (TEXTNS,'time-value'), + (STYLENS,'data-style-name'), + ), + (TEXTNS,'creator'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'database-display'):( + (TEXTNS,'column-name'), + (TEXTNS,'table-name'), + (TEXTNS,'table-type'), + (TEXTNS,'database-name'), + (STYLENS,'data-style-name'), + ), + (TEXTNS,'database-name'):( + (TEXTNS,'table-name'), + (TEXTNS,'table-type'), + (TEXTNS,'database-name'), + ), + (TEXTNS,'database-next'):( + (TEXTNS,'table-name'), + (TEXTNS,'table-type'), + (TEXTNS,'database-name'), + (TEXTNS,'condition'), + ), + (TEXTNS,'database-row-number'):( + (STYLENS,'num-format'), + (TEXTNS,'database-name'), + (TEXTNS,'value'), + (STYLENS,'num-letter-sync'), + (TEXTNS,'table-name'), + (TEXTNS,'table-type'), + ), + (TEXTNS,'database-row-select'):( + (TEXTNS,'row-number'), + (TEXTNS,'table-name'), + (TEXTNS,'table-type'), + (TEXTNS,'database-name'), + (TEXTNS,'condition'), + ), +# allowed_attributes + (TEXTNS,'date'):( + (TEXTNS,'date-value'), + (TEXTNS,'fixed'), + (TEXTNS,'date-adjust'), + (STYLENS,'data-style-name'), + ), + (TEXTNS,'dde-connection'):( + (TEXTNS,'connection-name'), + ), + (TEXTNS,'dde-connection-decl'):( + (OFFICENS,'automatic-update'), + (OFFICENS,'dde-topic'), + (OFFICENS,'dde-application'), + (OFFICENS,'name'), + (OFFICENS,'dde-item'), + ), + (TEXTNS,'dde-connection-decls'):( + ), + (TEXTNS,'deletion'):( + ), + (TEXTNS,'description'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'editing-cycles'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'editing-duration'):( + (TEXTNS,'duration'), + (TEXTNS,'fixed'), + (STYLENS,'data-style-name'), + ), + (TEXTNS,'execute-macro'):( + (TEXTNS,'name'), + ), + (TEXTNS,'expression'):( + (TEXTNS,'display'), + (OFFICENS,'string-value'), + (OFFICENS,'value'), + (OFFICENS,'boolean-value'), + (OFFICENS,'currency'), + (OFFICENS,'date-value'), + (STYLENS,'data-style-name'), + (OFFICENS,'value-type'), + (TEXTNS,'formula'), + (OFFICENS,'time-value'), + ), + (TEXTNS,'file-name'):( + (TEXTNS,'fixed'), + (TEXTNS,'display'), + ), +# allowed_attributes + (TEXTNS,'format-change'):( + ), + (TEXTNS,'h'):( + (TEXTNS,'restart-numbering'), + (TEXTNS,'cond-style-name'), + (TEXTNS,'is-list-header'), + (TEXTNS,'style-name'), + (TEXTNS,'class-names'), + (TEXTNS,'start-value'), + (TEXTNS,'id'), + (TEXTNS,'outline-level'), + ), + (TEXTNS,'hidden-paragraph'):( + (TEXTNS,'is-hidden'), + (TEXTNS,'condition'), + ), + (TEXTNS,'hidden-text'):( + (TEXTNS,'string-value'), + (TEXTNS,'is-hidden'), + (TEXTNS,'condition'), + ), + (TEXTNS,'illustration-index'):( + (TEXTNS,'protected'), + (TEXTNS,'style-name'), + (TEXTNS,'name'), + (TEXTNS,'protection-key'), + ), + (TEXTNS,'illustration-index-entry-template'):( + (TEXTNS,'style-name'), + ), + (TEXTNS,'illustration-index-source'):( + (TEXTNS,'index-scope'), + (TEXTNS,'caption-sequence-name'), + (TEXTNS,'use-caption'), + (TEXTNS,'caption-sequence-format'), + (TEXTNS,'relative-tab-stop-position'), + ), + (TEXTNS,'index-body'):( + ), + (TEXTNS,'index-entry-bibliography'):( + (TEXTNS,'bibliography-data-field'), + (TEXTNS,'style-name'), + ), + (TEXTNS,'index-entry-chapter'):( + (TEXTNS,'style-name'), + (TEXTNS,'display'), + ), +# allowed_attributes + (TEXTNS,'index-entry-link-end'):( + (TEXTNS,'style-name'), + ), + (TEXTNS,'index-entry-link-start'):( + (TEXTNS,'style-name'), + ), + (TEXTNS,'index-entry-page-number'):( + (TEXTNS,'style-name'), + ), + (TEXTNS,'index-entry-span'):( + (TEXTNS,'style-name'), + ), + (TEXTNS,'index-entry-tab-stop'):( + (STYLENS,'position'), + (TEXTNS,'style-name'), + (STYLENS,'type'), + (STYLENS,'leader-char'), + ), + (TEXTNS,'index-entry-text'):( + (TEXTNS,'style-name'), + ), + (TEXTNS,'index-source-style'):( + (TEXTNS,'style-name'), + ), + (TEXTNS,'index-source-styles'):( + (TEXTNS,'outline-level'), + ), + (TEXTNS,'index-title'):( + (TEXTNS,'protected'), + (TEXTNS,'style-name'), + (TEXTNS,'name'), + (TEXTNS,'protection-key'), + ), + (TEXTNS,'index-title-template'):( + (TEXTNS,'style-name'), + ), + (TEXTNS,'initial-creator'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'insertion'):( + ), +# allowed_attributes + (TEXTNS,'keywords'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'line-break'):( + ), + (TEXTNS,'linenumbering-configuration'):( + (TEXTNS,'number-position'), + (TEXTNS,'number-lines'), + (STYLENS,'num-format'), + (TEXTNS,'count-empty-lines'), + (TEXTNS,'count-in-text-boxes'), + (TEXTNS,'style-name'), + (STYLENS,'num-letter-sync'), + (TEXTNS,'increment'), + (TEXTNS,'offset'), + (TEXTNS,'restart-on-page'), + ), + (TEXTNS,'linenumbering-separator'):( + (TEXTNS,'increment'), + ), + (TEXTNS,'list'):( + (TEXTNS,'style-name'), + (TEXTNS,'continue-numbering'), + ), + (TEXTNS,'list-header'):( + ), + (TEXTNS,'list-item'):( + (TEXTNS,'start-value'), + ), + (TEXTNS,'list-level-style-bullet'):( + (TEXTNS,'level'), + (STYLENS,'num-prefix'), + (STYLENS,'num-suffix'), + (TEXTNS,'bullet-relative-size'), + (TEXTNS,'style-name'), + (TEXTNS,'bullet-char'), + ), + (TEXTNS,'list-level-style-image'):( + (XLINKNS,'show'), + (XLINKNS,'actuate'), + (XLINKNS,'href'), + (XLINKNS,'type'), + (TEXTNS,'level'), + ), + (TEXTNS,'list-level-style-number'):( + (TEXTNS,'level'), + (TEXTNS,'display-levels'), + (STYLENS,'num-format'), + (STYLENS,'num-suffix'), + (TEXTNS,'style-name'), + (STYLENS,'num-prefix'), + (STYLENS,'num-letter-sync'), + (TEXTNS,'start-value'), + ), +# allowed_attributes + (TEXTNS,'list-style'):( + (TEXTNS,'consecutive-numbering'), + (STYLENS,'display-name'), + (STYLENS,'name'), + ), + (TEXTNS,'measure'):( + (TEXTNS,'kind'), + ), + (TEXTNS,'modification-date'):( + (TEXTNS,'date-value'), + (TEXTNS,'fixed'), + (STYLENS,'data-style-name'), + ), + (TEXTNS,'modification-time'):( + (TEXTNS,'fixed'), + (TEXTNS,'time-value'), + (STYLENS,'data-style-name'), + ), + (TEXTNS,'note'):( + (TEXTNS,'note-class'), + (TEXTNS,'id'), + ), + (TEXTNS,'note-body'):( + ), + (TEXTNS,'note-citation'):( + (TEXTNS,'label'), + ), + (TEXTNS,'note-continuation-notice-backward'):( + ), + (TEXTNS,'note-continuation-notice-forward'):( + ), + (TEXTNS,'note-ref'):( + (TEXTNS,'ref-name'), + (TEXTNS,'note-class'), + (TEXTNS,'reference-format'), + ), + (TEXTNS,'notes-configuration'):( + (TEXTNS,'citation-body-style-name'), + (STYLENS,'num-format'), + (TEXTNS,'default-style-name'), + (STYLENS,'num-suffix'), + (TEXTNS,'start-numbering-at'), + (STYLENS,'num-prefix'), + (STYLENS,'num-letter-sync'), + (TEXTNS,'citation-style-name'), + (TEXTNS,'footnotes-position'), + (TEXTNS,'master-page-name'), + (TEXTNS,'start-value'), + (TEXTNS,'note-class'), + ), + (TEXTNS,'number'):( + ), + (TEXTNS,'numbered-paragraph'):( + (TEXTNS,'continue-numbering'), + (TEXTNS,'style-name'), + (TEXTNS,'start-value'), + (TEXTNS,'level'), + ), + (TEXTNS,'object-count'):( + (STYLENS,'num-format'), + (STYLENS,'num-letter-sync'), + ), + (TEXTNS,'object-index'):( + (TEXTNS,'protected'), + (TEXTNS,'style-name'), + (TEXTNS,'name'), + (TEXTNS,'protection-key'), + ), +# allowed_attributes + (TEXTNS,'object-index-entry-template'):( + (TEXTNS,'style-name'), + ), + (TEXTNS,'object-index-source'):( + (TEXTNS,'use-draw-objects'), + (TEXTNS,'use-math-objects'), + (TEXTNS,'relative-tab-stop-position'), + (TEXTNS,'use-chart-objects'), + (TEXTNS,'index-scope'), + (TEXTNS,'use-spreadsheet-objects'), + (TEXTNS,'use-other-objects'), + ), + (TEXTNS,'outline-level-style'):( + (TEXTNS,'level'), + (TEXTNS,'display-levels'), + (STYLENS,'num-format'), + (STYLENS,'num-suffix'), + (TEXTNS,'style-name'), + (STYLENS,'num-prefix'), + (STYLENS,'num-letter-sync'), + (TEXTNS,'start-value'), + ), + (TEXTNS,'outline-style'):( + ), + (TEXTNS,'p'):( + (TEXTNS,'cond-style-name'), + (TEXTNS,'style-name'), + (TEXTNS,'class-names'), + (TEXTNS,'id'), + ), + (TEXTNS,'page'):( + (TEXTNS,'master-page-name'), + ), + (TEXTNS,'page-continuation'):( + (TEXTNS,'string-value'), + (TEXTNS,'select-page'), + ), + (TEXTNS,'page-number'):( + (TEXTNS,'page-adjust'), + (STYLENS,'num-format'), + (TEXTNS,'fixed'), + (STYLENS,'num-letter-sync'), + (TEXTNS,'select-page'), + ), + (TEXTNS,'page-sequence'):( + ), + (TEXTNS,'page-variable-get'):( + (STYLENS,'num-format'), + (STYLENS,'num-letter-sync'), + ), + (TEXTNS,'page-variable-set'):( + (TEXTNS,'active'), + (TEXTNS,'page-adjust'), + ), + (TEXTNS,'placeholder'):( + (TEXTNS,'placeholder-type'), + (TEXTNS,'description'), + ), + (TEXTNS,'print-date'):( + (TEXTNS,'date-value'), + (TEXTNS,'fixed'), + (STYLENS,'data-style-name'), + ), + (TEXTNS,'print-time'):( + (TEXTNS,'fixed'), + (TEXTNS,'time-value'), + (STYLENS,'data-style-name'), + ), + (TEXTNS,'printed-by'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'reference-mark'):( + (TEXTNS,'name'), + ), + (TEXTNS,'reference-mark-end'):( + (TEXTNS,'name'), + ), + (TEXTNS,'reference-mark-start'):( + (TEXTNS,'name'), + ), + (TEXTNS,'ruby'):( + (TEXTNS,'style-name'), + ), + (TEXTNS,'ruby-base'):( + ), + (TEXTNS,'ruby-text'):( + (TEXTNS,'style-name'), + ), + (TEXTNS,'s'):( + (TEXTNS,'c'), + ), + (TEXTNS,'script'):( + (XLINKNS,'href'), + (XLINKNS,'type'), + (SCRIPTNS,'language'), + ), + (TEXTNS,'section'):( + (TEXTNS,'name'), + (TEXTNS,'protection-key'), + (TEXTNS,'style-name'), + (TEXTNS,'protected'), + (TEXTNS,'display'), + (TEXTNS,'condition'), + ), + (TEXTNS,'section-source'):( + (TEXTNS,'filter-name'), + (XLINKNS,'href'), + (XLINKNS,'type'), + (TEXTNS,'section-name'), + (XLINKNS,'show'), + ), + (TEXTNS,'sender-city'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'sender-company'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'sender-country'):( + (TEXTNS,'fixed'), + ), +# allowed_attributes + (TEXTNS,'sender-email'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'sender-fax'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'sender-firstname'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'sender-initials'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'sender-lastname'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'sender-phone-private'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'sender-phone-work'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'sender-position'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'sender-postal-code'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'sender-state-or-province'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'sender-street'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'sender-title'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'sequence'):( + (TEXTNS,'formula'), + (STYLENS,'num-format'), + (STYLENS,'num-letter-sync'), + (TEXTNS,'name'), + (TEXTNS,'ref-name'), + ), + (TEXTNS,'sequence-decl'):( + (TEXTNS,'separation-character'), + (TEXTNS,'display-outline-level'), + (TEXTNS,'name'), + ), + (TEXTNS,'sequence-decls'):( + ), + (TEXTNS,'sequence-ref'):( + (TEXTNS,'ref-name'), + (TEXTNS,'reference-format'), + ), + (TEXTNS,'sheet-name'):( + ), + (TEXTNS,'soft-page-break'):( + ), + (TEXTNS,'sort-key'):( + (TEXTNS,'sort-ascending'), + (TEXTNS,'key'), + ), +# allowed_attributes + (TEXTNS,'span'):( + (TEXTNS,'style-name'), + (TEXTNS,'class-names'), + ), + (TEXTNS,'subject'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'tab'):( + (TEXTNS,'tab-ref'), + ), + (TEXTNS,'table-formula'):( + (TEXTNS,'formula'), + (STYLENS,'data-style-name'), + (TEXTNS,'display'), + ), + (TEXTNS,'table-index'):( + (TEXTNS,'protected'), + (TEXTNS,'style-name'), + (TEXTNS,'name'), + (TEXTNS,'protection-key'), + ), + (TEXTNS,'table-index-entry-template'):( + (TEXTNS,'style-name'), + ), + (TEXTNS,'table-index-source'):( + (TEXTNS,'index-scope'), + (TEXTNS,'caption-sequence-name'), + (TEXTNS,'use-caption'), + (TEXTNS,'caption-sequence-format'), + (TEXTNS,'relative-tab-stop-position'), + ), +# allowed_attributes + (TEXTNS,'table-of-content'):( + (TEXTNS,'protected'), + (TEXTNS,'style-name'), + (TEXTNS,'name'), + (TEXTNS,'protection-key'), + ), + (TEXTNS,'table-of-content-entry-template'):( + (TEXTNS,'style-name'), + (TEXTNS,'outline-level'), + ), + (TEXTNS,'table-of-content-source'):( + (TEXTNS,'index-scope'), + (TEXTNS,'outline-level'), + (TEXTNS,'relative-tab-stop-position'), + (TEXTNS,'use-index-marks'), + (TEXTNS,'use-outline-level'), + (TEXTNS,'use-index-source-styles'), + ), + (TEXTNS,'template-name'):( + (TEXTNS,'display'), + ), + (TEXTNS,'text-input'):( + (TEXTNS,'description'), + ), + (TEXTNS,'time'):( + (TEXTNS,'time-adjust'), + (TEXTNS,'fixed'), + (TEXTNS,'time-value'), + (STYLENS,'data-style-name'), + ), + (TEXTNS,'title'):( + (TEXTNS,'fixed'), + ), + (TEXTNS,'toc-mark'):( + (TEXTNS,'string-value'), + (TEXTNS,'outline-level'), + ), + (TEXTNS,'toc-mark-end'):( + (TEXTNS,'id'), + ), + (TEXTNS,'toc-mark-start'):( + (TEXTNS,'id'), + (TEXTNS,'outline-level'), + ), + (TEXTNS,'tracked-changes'):( + (TEXTNS,'track-changes'), + ), + (TEXTNS,'user-defined'):( + (TEXTNS,'name'), + (OFFICENS,'string-value'), + (OFFICENS,'value'), + (OFFICENS,'boolean-value'), + (OFFICENS,'date-value'), + (STYLENS,'data-style-name'), + (TEXTNS,'fixed'), + (OFFICENS,'time-value'), + ), + (TEXTNS,'user-field-decl'):( + (TEXTNS,'name'), + (OFFICENS,'string-value'), + (OFFICENS,'value'), + (OFFICENS,'boolean-value'), + (OFFICENS,'currency'), + (OFFICENS,'date-value'), + (OFFICENS,'value-type'), + (TEXTNS,'formula'), + (OFFICENS,'time-value'), + ), + (TEXTNS,'user-field-decls'):( + ), + (TEXTNS,'user-field-get'):( + (STYLENS,'data-style-name'), + (TEXTNS,'name'), + (TEXTNS,'display'), + ), +# allowed_attributes + (TEXTNS,'user-field-input'):( + (STYLENS,'data-style-name'), + (TEXTNS,'name'), + (TEXTNS,'description'), + ), + (TEXTNS,'user-index'):( + (TEXTNS,'protected'), + (TEXTNS,'style-name'), + (TEXTNS,'name'), + (TEXTNS,'protection-key'), + ), + (TEXTNS,'user-index-entry-template'):( + (TEXTNS,'style-name'), + (TEXTNS,'outline-level'), + ), + (TEXTNS,'user-index-mark'):( + (TEXTNS,'index-name'), + (TEXTNS,'string-value'), + (TEXTNS,'outline-level'), + ), + (TEXTNS,'user-index-mark-end'):( + (TEXTNS,'id'), + (TEXTNS,'outline-level'), + ), + (TEXTNS,'user-index-mark-start'):( + (TEXTNS,'index-name'), + (TEXTNS,'id'), + (TEXTNS,'outline-level'), + ), +# allowed_attributes + (TEXTNS,'user-index-source'):( + (TEXTNS,'copy-outline-levels'), + (TEXTNS,'index-name'), + (TEXTNS,'index-scope'), + (TEXTNS,'relative-tab-stop-position'), + (TEXTNS,'use-floating-frames'), + (TEXTNS,'use-graphics'), + (TEXTNS,'use-index-marks'), + (TEXTNS,'use-objects'), + (TEXTNS,'use-tables'), + ), + (TEXTNS,'variable-decl'):( + (TEXTNS,'name'), + (OFFICENS,'value-type'), + ), + (TEXTNS,'variable-decls'):( + ), + (TEXTNS,'variable-get'):( + (STYLENS,'data-style-name'), + (TEXTNS,'name'), + (TEXTNS,'display'), + ), + (TEXTNS,'variable-input'):( + (STYLENS,'data-style-name'), + (TEXTNS,'display'), + (TEXTNS,'name'), + (OFFICENS,'value-type'), + (TEXTNS,'description'), + ), + (TEXTNS,'variable-set'):( + (TEXTNS,'name'), + (TEXTNS,'display'), + (OFFICENS,'string-value'), + (OFFICENS,'value'), + (OFFICENS,'boolean-value'), + (OFFICENS,'currency'), + (OFFICENS,'date-value'), + (STYLENS,'data-style-name'), + (OFFICENS,'value-type'), + (TEXTNS,'formula'), + (OFFICENS,'time-value'), + ), +# allowed_attributes +} diff --git a/tablib/packages/odf3/load.py b/tablib/packages/odf3/load.py new file mode 100644 index 0000000..cf275c4 --- /dev/null +++ b/tablib/packages/odf3/load.py @@ -0,0 +1,112 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright (C) 2007-2008 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +# This script is to be embedded in opendocument.py later +# The purpose is to read an ODT/ODP/ODS file and create the datastructure +# in memory. The user should then be able to make operations and then save +# the structure again. + +from xml.sax import make_parser,handler +from xml.sax.xmlreader import InputSource +import xml.sax.saxutils +from .element import Element +from .namespaces import OFFICENS +from io import StringIO + +# +# Parse the XML files +# +class LoadParser(handler.ContentHandler): + """ Extract headings from content.xml of an ODT file """ + triggers = ( + (OFFICENS, 'automatic-styles'), (OFFICENS, 'body'), + (OFFICENS, 'font-face-decls'), (OFFICENS, 'master-styles'), + (OFFICENS, 'meta'), (OFFICENS, 'scripts'), + (OFFICENS, 'settings'), (OFFICENS, 'styles') ) + + def __init__(self, document): + self.doc = document + self.data = [] + self.level = 0 + self.parse = False + + def characters(self, data): + if self.parse == False: + return + self.data.append(data) + + def startElementNS(self, tag, qname, attrs): + if tag in self.triggers: + self.parse = True + if self.doc._parsing != "styles.xml" and tag == (OFFICENS, 'font-face-decls'): + self.parse = False + if self.parse == False: + return + + self.level = self.level + 1 + # Add any accumulated text content + content = ''.join(self.data) + if len(content.strip()) > 0: + self.parent.addText(content, check_grammar=False) + self.data = [] + # Create the element + attrdict = {} + for (att,value) in list(attrs.items()): + attrdict[att] = value + try: + e = Element(qname = tag, qattributes=attrdict, check_grammar=False) + self.curr = e + except AttributeError as v: + print("Error: %s" % v) + + if tag == (OFFICENS, 'automatic-styles'): + e = self.doc.automaticstyles + elif tag == (OFFICENS, 'body'): + e = self.doc.body + elif tag == (OFFICENS, 'master-styles'): + e = self.doc.masterstyles + elif tag == (OFFICENS, 'meta'): + e = self.doc.meta + elif tag == (OFFICENS,'scripts'): + e = self.doc.scripts + elif tag == (OFFICENS,'settings'): + e = self.doc.settings + elif tag == (OFFICENS,'styles'): + e = self.doc.styles + elif self.doc._parsing == "styles.xml" and tag == (OFFICENS, 'font-face-decls'): + e = self.doc.fontfacedecls + elif hasattr(self,'parent'): + self.parent.addElement(e, check_grammar=False) + self.parent = e + + + def endElementNS(self, tag, qname): + if self.parse == False: + return + self.level = self.level - 1 + str = ''.join(self.data) + if len(str.strip()) > 0: + self.curr.addText(str, check_grammar=False) + self.data = [] + self.curr = self.curr.parentNode + self.parent = self.curr + if tag in self.triggers: + self.parse = False diff --git a/tablib/packages/odf3/manifest.py b/tablib/packages/odf3/manifest.py new file mode 100644 index 0000000..20830f9 --- /dev/null +++ b/tablib/packages/odf3/manifest.py @@ -0,0 +1,41 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# +# + +from .namespaces import MANIFESTNS +from .element import Element + +# Autogenerated +def Manifest(**args): + return Element(qname = (MANIFESTNS,'manifest'), **args) + +def FileEntry(**args): + return Element(qname = (MANIFESTNS,'file-entry'), **args) + +def EncryptionData(**args): + return Element(qname = (MANIFESTNS,'encryption-data'), **args) + +def Algorithm(**args): + return Element(qname = (MANIFESTNS,'algorithm'), **args) + +def KeyDerivation(**args): + return Element(qname = (MANIFESTNS,'key-derivation'), **args) + diff --git a/tablib/packages/odf3/math.py b/tablib/packages/odf3/math.py new file mode 100644 index 0000000..498987d --- /dev/null +++ b/tablib/packages/odf3/math.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from .namespaces import MATHNS +from .element import Element + +# ODF 1.0 section 12.5 +# Mathematical content is represented by MathML 2.0 + +# Autogenerated +def Math(**args): + return Element(qname = (MATHNS,'math'), **args) + diff --git a/tablib/packages/odf3/meta.py b/tablib/packages/odf3/meta.py new file mode 100644 index 0000000..94d41b5 --- /dev/null +++ b/tablib/packages/odf3/meta.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from .namespaces import METANS +from .element import Element + +# Autogenerated +def AutoReload(**args): + return Element(qname = (METANS,'auto-reload'), **args) + +def CreationDate(**args): + return Element(qname = (METANS,'creation-date'), **args) + +def DateString(**args): + return Element(qname = (METANS,'date-string'), **args) + +def DocumentStatistic(**args): + return Element(qname = (METANS,'document-statistic'), **args) + +def EditingCycles(**args): + return Element(qname = (METANS,'editing-cycles'), **args) + +def EditingDuration(**args): + return Element(qname = (METANS,'editing-duration'), **args) + +def Generator(**args): + return Element(qname = (METANS,'generator'), **args) + +def HyperlinkBehaviour(**args): + return Element(qname = (METANS,'hyperlink-behaviour'), **args) + +def InitialCreator(**args): + return Element(qname = (METANS,'initial-creator'), **args) + +def Keyword(**args): + return Element(qname = (METANS,'keyword'), **args) + +def PrintDate(**args): + return Element(qname = (METANS,'print-date'), **args) + +def PrintedBy(**args): + return Element(qname = (METANS,'printed-by'), **args) + +def Template(**args): + return Element(qname = (METANS,'template'), **args) + +def UserDefined(**args): + return Element(qname = (METANS,'user-defined'), **args) + diff --git a/tablib/packages/odf3/namespaces.py b/tablib/packages/odf3/namespaces.py new file mode 100644 index 0000000..14f0494 --- /dev/null +++ b/tablib/packages/odf3/namespaces.py @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2010 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# +TOOLSVERSION = "ODFPY/0.9.3" + +ANIMNS = "urn:oasis:names:tc:opendocument:xmlns:animation:1.0" +DBNS = "urn:oasis:names:tc:opendocument:xmlns:database:1.0" +CHARTNS = "urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +CONFIGNS = "urn:oasis:names:tc:opendocument:xmlns:config:1.0" +#DBNS = u"http://openoffice.org/2004/database" +DCNS = "http://purl.org/dc/elements/1.1/" +DOMNS = "http://www.w3.org/2001/xml-events" +DR3DNS = "urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +DRAWNS = "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +FIELDNS = "urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +FONS = "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +FORMNS = "urn:oasis:names:tc:opendocument:xmlns:form:1.0" +GRDDLNS = "http://www.w3.org/2003/g/data-view#" +KOFFICENS = "http://www.koffice.org/2005/" +MANIFESTNS = "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0" +MATHNS = "http://www.w3.org/1998/Math/MathML" +METANS = "urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +NUMBERNS = "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +OFFICENS = "urn:oasis:names:tc:opendocument:xmlns:office:1.0" +OFNS = "urn:oasis:names:tc:opendocument:xmlns:of:1.2" +OOONS = "http://openoffice.org/2004/office" +OOOWNS = "http://openoffice.org/2004/writer" +OOOCNS = "http://openoffice.org/2004/calc" +PRESENTATIONNS = "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" +RDFANS = "http://docs.oasis-open.org/opendocument/meta/rdfa#" +RPTNS = "http://openoffice.org/2005/report" +SCRIPTNS = "urn:oasis:names:tc:opendocument:xmlns:script:1.0" +SMILNS = "urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" +STYLENS = "urn:oasis:names:tc:opendocument:xmlns:style:1.0" +SVGNS = "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +TABLENS = "urn:oasis:names:tc:opendocument:xmlns:table:1.0" +TEXTNS = "urn:oasis:names:tc:opendocument:xmlns:text:1.0" +XFORMSNS = "http://www.w3.org/2002/xforms" +XLINKNS = "http://www.w3.org/1999/xlink" +XMLNS = "http://www.w3.org/XML/1998/namespace" +XSDNS = "http://www.w3.org/2001/XMLSchema" +XSINS = "http://www.w3.org/2001/XMLSchema-instance" + +nsdict = { + ANIMNS: 'anim', + CHARTNS: 'chart', + CONFIGNS: 'config', + DBNS: 'db', + DCNS: 'dc', + DOMNS: 'dom', + DR3DNS: 'dr3d', + DRAWNS: 'draw', + FIELDNS: 'field', + FONS: 'fo', + FORMNS: 'form', + GRDDLNS: 'grddl', + KOFFICENS: 'koffice', + MANIFESTNS: 'manifest', + MATHNS: 'math', + METANS: 'meta', + NUMBERNS: 'number', + OFFICENS: 'office', + OFNS: 'of', + OOONS: 'ooo', + OOOWNS: 'ooow', + OOOCNS: 'oooc', + PRESENTATIONNS: 'presentation', + RDFANS: 'rdfa', + RPTNS: 'rpt', + SCRIPTNS: 'script', + SMILNS: 'smil', + STYLENS: 'style', + SVGNS: 'svg', + TABLENS: 'table', + TEXTNS: 'text', + XFORMSNS: 'xforms', + XLINKNS: 'xlink', + XMLNS: 'xml', + XSDNS: 'xsd', + XSINS: 'xsi', +} diff --git a/tablib/packages/odf3/number.py b/tablib/packages/odf3/number.py new file mode 100644 index 0000000..78e001c --- /dev/null +++ b/tablib/packages/odf3/number.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from .namespaces import NUMBERNS +from .element import Element +from .style import StyleElement + + +# Autogenerated +def AmPm(**args): + return Element(qname = (NUMBERNS,'am-pm'), **args) + +def Boolean(**args): + return Element(qname = (NUMBERNS,'boolean'), **args) + +def BooleanStyle(**args): + return StyleElement(qname = (NUMBERNS,'boolean-style'), **args) + +def CurrencyStyle(**args): + return StyleElement(qname = (NUMBERNS,'currency-style'), **args) + +def CurrencySymbol(**args): + return Element(qname = (NUMBERNS,'currency-symbol'), **args) + +def DateStyle(**args): + return StyleElement(qname = (NUMBERNS,'date-style'), **args) + +def Day(**args): + return Element(qname = (NUMBERNS,'day'), **args) + +def DayOfWeek(**args): + return Element(qname = (NUMBERNS,'day-of-week'), **args) + +def EmbeddedText(**args): + return Element(qname = (NUMBERNS,'embedded-text'), **args) + +def Era(**args): + return Element(qname = (NUMBERNS,'era'), **args) + +def Fraction(**args): + return Element(qname = (NUMBERNS,'fraction'), **args) + +def Hours(**args): + return Element(qname = (NUMBERNS,'hours'), **args) + +def Minutes(**args): + return Element(qname = (NUMBERNS,'minutes'), **args) + +def Month(**args): + return Element(qname = (NUMBERNS,'month'), **args) + +def Number(**args): + return Element(qname = (NUMBERNS,'number'), **args) + +def NumberStyle(**args): + return StyleElement(qname = (NUMBERNS,'number-style'), **args) + +def PercentageStyle(**args): + return StyleElement(qname = (NUMBERNS,'percentage-style'), **args) + +def Quarter(**args): + return Element(qname = (NUMBERNS,'quarter'), **args) + +def ScientificNumber(**args): + return Element(qname = (NUMBERNS,'scientific-number'), **args) + +def Seconds(**args): + return Element(qname = (NUMBERNS,'seconds'), **args) + +def Text(**args): + return Element(qname = (NUMBERNS,'text'), **args) + +def TextContent(**args): + return Element(qname = (NUMBERNS,'text-content'), **args) + +def TextStyle(**args): + return StyleElement(qname = (NUMBERNS,'text-style'), **args) + +def TimeStyle(**args): + return StyleElement(qname = (NUMBERNS,'time-style'), **args) + +def WeekOfYear(**args): + return Element(qname = (NUMBERNS,'week-of-year'), **args) + +def Year(**args): + return Element(qname = (NUMBERNS,'year'), **args) + diff --git a/tablib/packages/odf3/odf2moinmoin.py b/tablib/packages/odf3/odf2moinmoin.py new file mode 100644 index 0000000..c4f5ca1 --- /dev/null +++ b/tablib/packages/odf3/odf2moinmoin.py @@ -0,0 +1,579 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2008 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# See http://trac.edgewall.org/wiki/WikiFormatting +# +# Contributor(s): +# + +import sys, zipfile, xml.dom.minidom +from .namespaces import nsdict +from .elementtypes import * + +IGNORED_TAGS = [ + 'draw:a' + 'draw:g', + 'draw:line', + 'draw:object-ole', + 'office:annotation', + 'presentation:notes', + 'svg:desc', +] + [ nsdict[item[0]]+":"+item[1] for item in empty_elements] + +INLINE_TAGS = [ nsdict[item[0]]+":"+item[1] for item in inline_elements] + + +class TextProps: + """ Holds properties for a text style. """ + + def __init__(self): + + self.italic = False + self.bold = False + self.fixed = False + self.underlined = False + self.strikethrough = False + self.superscript = False + self.subscript = False + + def setItalic(self, value): + if value == "italic": + self.italic = True + elif value == "normal": + self.italic = False + + def setBold(self, value): + if value == "bold": + self.bold = True + elif value == "normal": + self.bold = False + + def setFixed(self, value): + self.fixed = value + + def setUnderlined(self, value): + if value and value != "none": + self.underlined = True + + def setStrikethrough(self, value): + if value and value != "none": + self.strikethrough = True + + def setPosition(self, value): + if value is None or value == '': + return + posisize = value.split(' ') + textpos = posisize[0] + if textpos.find('%') == -1: + if textpos == "sub": + self.superscript = False + self.subscript = True + elif textpos == "super": + self.superscript = True + self.subscript = False + else: + itextpos = int(textpos[:textpos.find('%')]) + if itextpos > 10: + self.superscript = False + self.subscript = True + elif itextpos < -10: + self.superscript = True + self.subscript = False + + def __str__(self): + + return "[italic=%s, bold=i%s, fixed=%s]" % (str(self.italic), + str(self.bold), + str(self.fixed)) + +class ParagraphProps: + """ Holds properties of a paragraph style. """ + + def __init__(self): + + self.blockquote = False + self.headingLevel = 0 + self.code = False + self.title = False + self.indented = 0 + + def setIndented(self, value): + self.indented = value + + def setHeading(self, level): + self.headingLevel = level + + def setTitle(self, value): + self.title = value + + def setCode(self, value): + self.code = value + + + def __str__(self): + + return "[bq=%s, h=%d, code=%s]" % (str(self.blockquote), + self.headingLevel, + str(self.code)) + + +class ListProperties: + """ Holds properties for a list style. """ + + def __init__(self): + self.ordered = False + + def setOrdered(self, value): + self.ordered = value + + + +class ODF2MoinMoin(object): + + + def __init__(self, filepath): + self.footnotes = [] + self.footnoteCounter = 0 + self.textStyles = {"Standard": TextProps()} + self.paragraphStyles = {"Standard": ParagraphProps()} + self.listStyles = {} + self.fixedFonts = [] + self.hasTitle = 0 + self.lastsegment = None + + # Tags + self.elements = { + 'draw:page': self.textToString, + 'draw:frame': self.textToString, + 'draw:image': self.draw_image, + 'draw:text-box': self.textToString, + 'text:a': self.text_a, + 'text:note': self.text_note, + } + for tag in IGNORED_TAGS: + self.elements[tag] = self.do_nothing + + for tag in INLINE_TAGS: + self.elements[tag] = self.inline_markup + self.elements['text:line-break'] = self.text_line_break + self.elements['text:s'] = self.text_s + self.elements['text:tab'] = self.text_tab + + self.load(filepath) + + def processFontDeclarations(self, fontDecl): + """ Extracts necessary font information from a font-declaration + element. + """ + for fontFace in fontDecl.getElementsByTagName("style:font-face"): + if fontFace.getAttribute("style:font-pitch") == "fixed": + self.fixedFonts.append(fontFace.getAttribute("style:name")) + + + + def extractTextProperties(self, style, parent=None): + """ Extracts text properties from a style element. """ + + textProps = TextProps() + + if parent: + parentProp = self.textStyles.get(parent, None) + if parentProp: + textProp = parentProp + + textPropEl = style.getElementsByTagName("style:text-properties") + if not textPropEl: return textProps + + textPropEl = textPropEl[0] + + textProps.setItalic(textPropEl.getAttribute("fo:font-style")) + textProps.setBold(textPropEl.getAttribute("fo:font-weight")) + textProps.setUnderlined(textPropEl.getAttribute("style:text-underline-style")) + textProps.setStrikethrough(textPropEl.getAttribute("style:text-line-through-style")) + textProps.setPosition(textPropEl.getAttribute("style:text-position")) + + if textPropEl.getAttribute("style:font-name") in self.fixedFonts: + textProps.setFixed(True) + + return textProps + + def extractParagraphProperties(self, style, parent=None): + """ Extracts paragraph properties from a style element. """ + + paraProps = ParagraphProps() + + name = style.getAttribute("style:name") + + if name.startswith("Heading_20_"): + level = name[11:] + try: + level = int(level) + paraProps.setHeading(level) + except: + level = 0 + + if name == "Title": + paraProps.setTitle(True) + + paraPropEl = style.getElementsByTagName("style:paragraph-properties") + if paraPropEl: + paraPropEl = paraPropEl[0] + leftMargin = paraPropEl.getAttribute("fo:margin-left") + if leftMargin: + try: + leftMargin = float(leftMargin[:-2]) + if leftMargin > 0.01: + paraProps.setIndented(True) + except: + pass + + textProps = self.extractTextProperties(style) + if textProps.fixed: + paraProps.setCode(True) + + return paraProps + + + def processStyles(self, styleElements): + """ Runs through "style" elements extracting necessary information. + """ + + for style in styleElements: + + name = style.getAttribute("style:name") + + if name == "Standard": continue + + family = style.getAttribute("style:family") + parent = style.getAttribute("style:parent-style-name") + + if family == "text": + self.textStyles[name] = self.extractTextProperties(style, parent) + + elif family == "paragraph": + self.paragraphStyles[name] = \ + self.extractParagraphProperties(style, parent) + self.textStyles[name] = self.extractTextProperties(style, parent) + + def processListStyles(self, listStyleElements): + + for style in listStyleElements: + name = style.getAttribute("style:name") + + prop = ListProperties() + if style.hasChildNodes(): + subitems = [el for el in style.childNodes + if el.nodeType == xml.dom.Node.ELEMENT_NODE + and el.tagName == "text:list-level-style-number"] + if len(subitems) > 0: + prop.setOrdered(True) + + self.listStyles[name] = prop + + + def load(self, filepath): + """ Loads an ODT file. """ + + zip = zipfile.ZipFile(filepath) + + styles_doc = xml.dom.minidom.parseString(zip.read("styles.xml")) + fontfacedecls = styles_doc.getElementsByTagName("office:font-face-decls") + if fontfacedecls: + self.processFontDeclarations(fontfacedecls[0]) + self.processStyles(styles_doc.getElementsByTagName("style:style")) + self.processListStyles(styles_doc.getElementsByTagName("text:list-style")) + + self.content = xml.dom.minidom.parseString(zip.read("content.xml")) + fontfacedecls = self.content.getElementsByTagName("office:font-face-decls") + if fontfacedecls: + self.processFontDeclarations(fontfacedecls[0]) + + self.processStyles(self.content.getElementsByTagName("style:style")) + self.processListStyles(self.content.getElementsByTagName("text:list-style")) + + def compressCodeBlocks(self, text): + """ Removes extra blank lines from code blocks. """ + + return text + lines = text.split("\n") + buffer = [] + numLines = len(lines) + for i in range(numLines): + + if (lines[i].strip() or i == numLines-1 or i == 0 or + not ( lines[i-1].startswith(" ") + and lines[i+1].startswith(" ") ) ): + buffer.append("\n" + lines[i]) + + return ''.join(buffer) + +#----------------------------------- + def do_nothing(self, node): + return '' + + def draw_image(self, node): + """ + """ + + link = node.getAttribute("xlink:href") + if link and link[:2] == './': # Indicates a sub-object, which isn't supported + return "%s\n" % link + if link and link[:9] == 'Pictures/': + link = link[9:] + return "[[Image(%s)]]\n" % link + + def text_a(self, node): + text = self.textToString(node) + link = node.getAttribute("xlink:href") + if link.strip() == text.strip(): + return "[%s] " % link.strip() + else: + return "[%s %s] " % (link.strip(), text.strip()) + + + def text_line_break(self, node): + return "[[BR]]" + + def text_note(self, node): + cite = (node.getElementsByTagName("text:note-citation")[0] + .childNodes[0].nodeValue) + body = (node.getElementsByTagName("text:note-body")[0] + .childNodes[0]) + self.footnotes.append((cite, self.textToString(body))) + return "^%s^" % cite + + def text_s(self, node): + try: + num = int(node.getAttribute("text:c")) + return " "*num + except: + return " " + + def text_tab(self, node): + return " " + + def inline_markup(self, node): + text = self.textToString(node) + + if not text.strip(): + return '' # don't apply styles to white space + + styleName = node.getAttribute("text:style-name") + style = self.textStyles.get(styleName, TextProps()) + + if style.fixed: + return "`" + text + "`" + + mark = [] + if style: + if style.italic: + mark.append("''") + if style.bold: + mark.append("'''") + if style.underlined: + mark.append("__") + if style.strikethrough: + mark.append("~~") + if style.superscript: + mark.append("^") + if style.subscript: + mark.append(",,") + revmark = mark[:] + revmark.reverse() + return "%s%s%s" % (''.join(mark), text, ''.join(revmark)) + +#----------------------------------- + def listToString(self, listElement, indent = 0): + + self.lastsegment = listElement.tagName + buffer = [] + + styleName = listElement.getAttribute("text:style-name") + props = self.listStyles.get(styleName, ListProperties()) + + i = 0 + for item in listElement.childNodes: + buffer.append(" "*indent) + i += 1 + if props.ordered: + number = str(i) + number = " " + number + ". " + buffer.append(" 1. ") + else: + buffer.append(" * ") + subitems = [el for el in item.childNodes + if el.tagName in ["text:p", "text:h", "text:list"]] + for subitem in subitems: + if subitem.tagName == "text:list": + buffer.append("\n") + buffer.append(self.listToString(subitem, indent+3)) + else: + buffer.append(self.paragraphToString(subitem, indent+3)) + self.lastsegment = subitem.tagName + self.lastsegment = item.tagName + buffer.append("\n") + + return ''.join(buffer) + + def tableToString(self, tableElement): + """ MoinMoin uses || to delimit table cells + """ + + self.lastsegment = tableElement.tagName + buffer = [] + + for item in tableElement.childNodes: + self.lastsegment = item.tagName + if item.tagName == "table:table-header-rows": + buffer.append(self.tableToString(item)) + if item.tagName == "table:table-row": + buffer.append("\n||") + for cell in item.childNodes: + buffer.append(self.inline_markup(cell)) + buffer.append("||") + self.lastsegment = cell.tagName + return ''.join(buffer) + + + def toString(self): + """ Converts the document to a string. + FIXME: Result from second call differs from first call + """ + body = self.content.getElementsByTagName("office:body")[0] + text = body.childNodes[0] + + buffer = [] + + paragraphs = [el for el in text.childNodes + if el.tagName in ["draw:page", "text:p", "text:h","text:section", + "text:list", "table:table"]] + + for paragraph in paragraphs: + if paragraph.tagName == "text:list": + text = self.listToString(paragraph) + elif paragraph.tagName == "text:section": + text = self.textToString(paragraph) + elif paragraph.tagName == "table:table": + text = self.tableToString(paragraph) + else: + text = self.paragraphToString(paragraph) + if text: + buffer.append(text) + + if self.footnotes: + + buffer.append("----") + for cite, body in self.footnotes: + buffer.append("%s: %s" % (cite, body)) + + + buffer.append("") + return self.compressCodeBlocks('\n'.join(buffer)) + + + def textToString(self, element): + + buffer = [] + + for node in element.childNodes: + + if node.nodeType == xml.dom.Node.TEXT_NODE: + buffer.append(node.nodeValue) + + elif node.nodeType == xml.dom.Node.ELEMENT_NODE: + tag = node.tagName + + if tag in ("draw:text-box", "draw:frame"): + buffer.append(self.textToString(node)) + + elif tag in ("text:p", "text:h"): + text = self.paragraphToString(node) + if text: + buffer.append(text) + elif tag == "text:list": + buffer.append(self.listToString(node)) + else: + method = self.elements.get(tag) + if method: + buffer.append(method(node)) + else: + buffer.append(" {" + tag + "} ") + + return ''.join(buffer) + + def paragraphToString(self, paragraph, indent = 0): + + dummyParaProps = ParagraphProps() + + style_name = paragraph.getAttribute("text:style-name") + paraProps = self.paragraphStyles.get(style_name, dummyParaProps) + text = self.inline_markup(paragraph) + + if paraProps and not paraProps.code: + text = text.strip() + + if paragraph.tagName == "text:p" and self.lastsegment == "text:p": + text = "\n" + text + + self.lastsegment = paragraph.tagName + + if paraProps.title: + self.hasTitle = 1 + return "= " + text + " =\n" + + outlinelevel = paragraph.getAttribute("text:outline-level") + if outlinelevel: + + level = int(outlinelevel) + if self.hasTitle: level += 1 + + if level >= 1: + return "=" * level + " " + text + " " + "=" * level + "\n" + + elif paraProps.code: + return "{{{\n" + text + "\n}}}\n" + + if paraProps.indented: + return self.wrapParagraph(text, indent = indent, blockquote = True) + + else: + return self.wrapParagraph(text, indent = indent) + + + def wrapParagraph(self, text, indent = 0, blockquote=False): + + counter = 0 + buffer = [] + LIMIT = 50 + + if blockquote: + buffer.append(" ") + + return ''.join(buffer) + text + # Unused from here + for token in text.split(): + + if counter > LIMIT - indent: + buffer.append("\n" + " "*indent) + if blockquote: + buffer.append(" ") + counter = 0 + + buffer.append(token + " ") + counter += len(token) + + return ''.join(buffer) diff --git a/tablib/packages/odf3/odf2xhtml.py b/tablib/packages/odf3/odf2xhtml.py new file mode 100644 index 0000000..7c54bb4 --- /dev/null +++ b/tablib/packages/odf3/odf2xhtml.py @@ -0,0 +1,1582 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2010 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# +#import pdb +#pdb.set_trace() +from xml.sax import handler +from xml.sax.saxutils import escape, quoteattr +from xml.dom import Node + +from .opendocument import load + +from .namespaces import ANIMNS, CHARTNS, CONFIGNS, DCNS, DR3DNS, DRAWNS, FONS, \ + FORMNS, MATHNS, METANS, NUMBERNS, OFFICENS, PRESENTATIONNS, SCRIPTNS, \ + SMILNS, STYLENS, SVGNS, TABLENS, TEXTNS, XLINKNS + +# Handling of styles +# +# First there are font face declarations. These set up a font style that will be +# referenced from a text-property. The declaration describes the font making +# it possible for the application to find a similar font should the system not +# have that particular one. The StyleToCSS stores these attributes to be used +# for the CSS2 font declaration. +# +# Then there are default-styles. These set defaults for various style types: +# "text", "paragraph", "section", "ruby", "table", "table-column", "table-row", +# "table-cell", "graphic", "presentation", "drawing-page", "chart". +# Since CSS2 can't refer to another style, ODF2XHTML add these to all +# styles unless overridden. +# +# The real styles are declared in the element. They have a +# family referring to the default-styles, and may have a parent style. +# +# Styles have scope. The same name can be used for both paragraph and +# character etc. styles Since CSS2 has no scope we use a prefix. (Not elegant) +# In ODF a style can have a parent, these parents can be chained. + +class StyleToCSS: + """ The purpose of the StyleToCSS class is to contain the rules to convert + ODF styles to CSS2. Since it needs the generic fonts, it would probably + make sense to also contain the Styles in a dict as well.. + """ + + def __init__(self): + # Font declarations + self.fontdict = {} + + # Fill-images from presentations for backgrounds + self.fillimages = {} + + self.ruleconversions = { + (DRAWNS,'fill-image-name'): self.c_drawfillimage, + (FONS,"background-color"): self.c_fo, + (FONS,"border"): self.c_fo, + (FONS,"border-bottom"): self.c_fo, + (FONS,"border-left"): self.c_fo, + (FONS,"border-right"): self.c_fo, + (FONS,"border-top"): self.c_fo, + (FONS,"color"): self.c_fo, + (FONS,"font-family"): self.c_fo, + (FONS,"font-size"): self.c_fo, + (FONS,"font-style"): self.c_fo, + (FONS,"font-variant"): self.c_fo, + (FONS,"font-weight"): self.c_fo, + (FONS,"line-height"): self.c_fo, + (FONS,"margin"): self.c_fo, + (FONS,"margin-bottom"): self.c_fo, + (FONS,"margin-left"): self.c_fo, + (FONS,"margin-right"): self.c_fo, + (FONS,"margin-top"): self.c_fo, + (FONS,"min-height"): self.c_fo, + (FONS,"padding"): self.c_fo, + (FONS,"padding-bottom"): self.c_fo, + (FONS,"padding-left"): self.c_fo, + (FONS,"padding-right"): self.c_fo, + (FONS,"padding-top"): self.c_fo, + (FONS,"page-width"): self.c_page_width, + (FONS,"page-height"): self.c_page_height, + (FONS,"text-align"): self.c_text_align, + (FONS,"text-indent") :self.c_fo, + (TABLENS,'border-model') :self.c_border_model, + (STYLENS,'column-width') : self.c_width, + (STYLENS,"font-name"): self.c_fn, + (STYLENS,'horizontal-pos'): self.c_hp, + (STYLENS,'text-position'): self.c_text_position, + (STYLENS,'text-line-through-style'): self.c_text_line_through_style, + (STYLENS,'text-underline-style'): self.c_text_underline_style, + (STYLENS,'width') : self.c_width, + # FIXME Should do style:vertical-pos here + } + + def save_font(self, name, family, generic): + """ It is possible that the HTML browser doesn't know how to + show a particular font. Fortunately ODF provides generic fallbacks. + Unfortunately they are not the same as CSS2. + CSS2: serif, sans-serif, cursive, fantasy, monospace + ODF: roman, swiss, modern, decorative, script, system + This method put the font and fallback into a dictionary + """ + htmlgeneric = "sans-serif" + if generic == "roman": htmlgeneric = "serif" + elif generic == "swiss": htmlgeneric = "sans-serif" + elif generic == "modern": htmlgeneric = "monospace" + elif generic == "decorative": htmlgeneric = "sans-serif" + elif generic == "script": htmlgeneric = "monospace" + elif generic == "system": htmlgeneric = "serif" + self.fontdict[name] = (family, htmlgeneric) + + def c_drawfillimage(self, ruleset, sdict, rule, val): + """ Fill a figure with an image. Since CSS doesn't let you resize images + this should really be implemented as an absolutely position + with a width and a height + """ + sdict['background-image'] = "url('%s')" % self.fillimages[val] + + def c_fo(self, ruleset, sdict, rule, val): + """ XSL formatting attributes """ + selector = rule[1] + sdict[selector] = val + + def c_border_model(self, ruleset, sdict, rule, val): + """ Convert to CSS2 border model """ + if val == 'collapsing': + sdict['border-collapse'] ='collapse' + else: + sdict['border-collapse'] ='separate' + + def c_width(self, ruleset, sdict, rule, val): + """ Set width of box """ + sdict['width'] = val + + def c_text_align(self, ruleset, sdict, rule, align): + """ Text align """ + if align == "start": align = "left" + if align == "end": align = "right" + sdict['text-align'] = align + + def c_fn(self, ruleset, sdict, rule, fontstyle): + """ Generate the CSS font family + A generic font can be found in two ways. In a + element or as a font-family-generic attribute in text-properties. + """ + generic = ruleset.get((STYLENS,'font-family-generic') ) + if generic is not None: + self.save_font(fontstyle, fontstyle, generic) + family, htmlgeneric = self.fontdict.get(fontstyle, (fontstyle, 'serif')) + sdict['font-family'] = '%s, %s' % (family, htmlgeneric) + + def c_text_position(self, ruleset, sdict, rule, tp): + """ Text position. This is used e.g. to make superscript and subscript + This attribute can have one or two values. + + The first value must be present and specifies the vertical + text position as a percentage that relates to the current font + height or it takes one of the values sub or super. Negative + percentages or the sub value place the text below the + baseline. Positive percentages or the super value place + the text above the baseline. If sub or super is specified, + the application can choose an appropriate text position. + + The second value is optional and specifies the font height + as a percentage that relates to the current font-height. If + this value is not specified, an appropriate font height is + used. Although this value may change the font height that + is displayed, it never changes the current font height that + is used for additional calculations. + """ + textpos = tp.split(' ') + if len(textpos) == 2 and textpos[0] != "0%": + # Bug in OpenOffice. If vertical-align is 0% - ignore the text size. + sdict['font-size'] = textpos[1] + if textpos[0] == "super": + sdict['vertical-align'] = "33%" + elif textpos[0] == "sub": + sdict['vertical-align'] = "-33%" + else: + sdict['vertical-align'] = textpos[0] + + def c_hp(self, ruleset, sdict, rule, hpos): + #FIXME: Frames wrap-style defaults to 'parallel', graphics to 'none'. + # It is properly set in the parent-styles, but the program doesn't + # collect the information. + wrap = ruleset.get((STYLENS,'wrap'),'parallel') + # Can have: from-left, left, center, right, from-inside, inside, outside + if hpos == "center": + sdict['margin-left'] = "auto" + sdict['margin-right'] = "auto" +# else: +# # force it to be *something* then delete it +# sdict['margin-left'] = sdict['margin-right'] = '' +# del sdict['margin-left'], sdict['margin-right'] + + if hpos in ("right","outside"): + if wrap in ( "left", "parallel","dynamic"): + sdict['float'] = "right" + elif wrap == "run-through": + sdict['position'] = "absolute" # Simulate run-through + sdict['top'] = "0" + sdict['right'] = "0"; + else: # No wrapping + sdict['margin-left'] = "auto" + sdict['margin-right'] = "0px" + elif hpos in ("left", "inside"): + if wrap in ( "right", "parallel","dynamic"): + sdict['float'] = "left" + elif wrap == "run-through": + sdict['position'] = "absolute" # Simulate run-through + sdict['top'] = "0" + sdict['left'] = "0" + else: # No wrapping + sdict['margin-left'] = "0px" + sdict['margin-right'] = "auto" + elif hpos in ("from-left", "from-inside"): + if wrap in ( "right", "parallel"): + sdict['float'] = "left" + else: + sdict['position'] = "relative" # No wrapping + if (SVGNS,'x') in ruleset: + sdict['left'] = ruleset[(SVGNS,'x')] + + def c_page_width(self, ruleset, sdict, rule, val): + """ Set width of box + HTML doesn't really have a page-width. It is always 100% of the browser width + """ + sdict['width'] = val + + def c_text_underline_style(self, ruleset, sdict, rule, val): + """ Set underline decoration + HTML doesn't really have a page-width. It is always 100% of the browser width + """ + if val and val != "none": + sdict['text-decoration'] = "underline" + + def c_text_line_through_style(self, ruleset, sdict, rule, val): + """ Set underline decoration + HTML doesn't really have a page-width. It is always 100% of the browser width + """ + if val and val != "none": + sdict['text-decoration'] = "line-through" + + def c_page_height(self, ruleset, sdict, rule, val): + """ Set height of box """ + sdict['height'] = val + + def convert_styles(self, ruleset): + """ Rule is a tuple of (namespace, name). If the namespace is '' then + it is already CSS2 + """ + sdict = {} + for rule,val in list(ruleset.items()): + if rule[0] == '': + sdict[rule[1]] = val + continue + method = self.ruleconversions.get(rule, None ) + if method: + method(ruleset, sdict, rule, val) + return sdict + + +class TagStack: + def __init__(self): + self.stack = [] + + def push(self, tag, attrs): + self.stack.append( (tag, attrs) ) + + def pop(self): + item = self.stack.pop() + return item + + def stackparent(self): + item = self.stack[-1] + return item[1] + + def rfindattr(self, attr): + """ Find a tag with the given attribute """ + for tag, attrs in self.stack: + if attr in attrs: + return attrs[attr] + return None + def count_tags(self, tag): + c = 0 + for ttag, tattrs in self.stack: + if ttag == tag: c = c + 1 + return c + +special_styles = { + 'S-Emphasis':'em', + 'S-Citation':'cite', + 'S-Strong_20_Emphasis':'strong', + 'S-Variable':'var', + 'S-Definition':'dfn', + 'S-Teletype':'tt', + 'P-Heading_20_1':'h1', + 'P-Heading_20_2':'h2', + 'P-Heading_20_3':'h3', + 'P-Heading_20_4':'h4', + 'P-Heading_20_5':'h5', + 'P-Heading_20_6':'h6', +# 'P-Caption':'caption', + 'P-Addressee':'address', +# 'P-List_20_Heading':'dt', +# 'P-List_20_Contents':'dd', + 'P-Preformatted_20_Text':'pre', +# 'P-Table_20_Heading':'th', +# 'P-Table_20_Contents':'td', +# 'P-Text_20_body':'p' +} + +#----------------------------------------------------------------------------- +# +# ODFCONTENTHANDLER +# +#----------------------------------------------------------------------------- +class ODF2XHTML(handler.ContentHandler): + """ The ODF2XHTML parses an ODF file and produces XHTML""" + + def __init__(self, generate_css=True, embedable=False): + # Tags + self.generate_css = generate_css + self.elements = { + (DCNS, 'title'): (self.s_processcont, self.e_dc_title), + (DCNS, 'language'): (self.s_processcont, self.e_dc_contentlanguage), + (DCNS, 'creator'): (self.s_processcont, self.e_dc_creator), + (DCNS, 'description'): (self.s_processcont, self.e_dc_metatag), + (DCNS, 'date'): (self.s_processcont, self.e_dc_metatag), + (DRAWNS, 'custom-shape'): (self.s_custom_shape, self.e_custom_shape), + (DRAWNS, 'frame'): (self.s_draw_frame, self.e_draw_frame), + (DRAWNS, 'image'): (self.s_draw_image, None), + (DRAWNS, 'fill-image'): (self.s_draw_fill_image, None), + (DRAWNS, "layer-set"):(self.s_ignorexml, None), + (DRAWNS, 'object'): (self.s_draw_object, None), + (DRAWNS, 'object-ole'): (self.s_draw_object_ole, None), + (DRAWNS, 'page'): (self.s_draw_page, self.e_draw_page), + (DRAWNS, 'text-box'): (self.s_draw_textbox, self.e_draw_textbox), + (METANS, 'creation-date'):(self.s_processcont, self.e_dc_metatag), + (METANS, 'generator'):(self.s_processcont, self.e_dc_metatag), + (METANS, 'initial-creator'): (self.s_processcont, self.e_dc_metatag), + (METANS, 'keyword'): (self.s_processcont, self.e_dc_metatag), + (NUMBERNS, "boolean-style"):(self.s_ignorexml, None), + (NUMBERNS, "currency-style"):(self.s_ignorexml, None), + (NUMBERNS, "date-style"):(self.s_ignorexml, None), + (NUMBERNS, "number-style"):(self.s_ignorexml, None), + (NUMBERNS, "text-style"):(self.s_ignorexml, None), + (OFFICENS, "annotation"):(self.s_ignorexml, None), + (OFFICENS, "automatic-styles"):(self.s_office_automatic_styles, None), + (OFFICENS, "document"):(self.s_office_document_content, self.e_office_document_content), + (OFFICENS, "document-content"):(self.s_office_document_content, self.e_office_document_content), + (OFFICENS, "forms"):(self.s_ignorexml, None), + (OFFICENS, "master-styles"):(self.s_office_master_styles, None), + (OFFICENS, "meta"):(self.s_ignorecont, None), + (OFFICENS, "presentation"):(self.s_office_presentation, self.e_office_presentation), + (OFFICENS, "spreadsheet"):(self.s_office_spreadsheet, self.e_office_spreadsheet), + (OFFICENS, "styles"):(self.s_office_styles, None), + (OFFICENS, "text"):(self.s_office_text, self.e_office_text), + (OFFICENS, "scripts"):(self.s_ignorexml, None), + (OFFICENS, "settings"):(self.s_ignorexml, None), + (PRESENTATIONNS, "notes"):(self.s_ignorexml, None), +# (STYLENS, "default-page-layout"):(self.s_style_default_page_layout, self.e_style_page_layout), + (STYLENS, "default-page-layout"):(self.s_ignorexml, None), + (STYLENS, "default-style"):(self.s_style_default_style, self.e_style_default_style), + (STYLENS, "drawing-page-properties"):(self.s_style_handle_properties, None), + (STYLENS, "font-face"):(self.s_style_font_face, None), +# (STYLENS, "footer"):(self.s_style_footer, self.e_style_footer), +# (STYLENS, "footer-style"):(self.s_style_footer_style, None), + (STYLENS, "graphic-properties"):(self.s_style_handle_properties, None), + (STYLENS, "handout-master"):(self.s_ignorexml, None), +# (STYLENS, "header"):(self.s_style_header, self.e_style_header), +# (STYLENS, "header-footer-properties"):(self.s_style_handle_properties, None), +# (STYLENS, "header-style"):(self.s_style_header_style, None), + (STYLENS, "master-page"):(self.s_style_master_page, None), + (STYLENS, "page-layout-properties"):(self.s_style_handle_properties, None), + (STYLENS, "page-layout"):(self.s_style_page_layout, self.e_style_page_layout), +# (STYLENS, "page-layout"):(self.s_ignorexml, None), + (STYLENS, "paragraph-properties"):(self.s_style_handle_properties, None), + (STYLENS, "style"):(self.s_style_style, self.e_style_style), + (STYLENS, "table-cell-properties"):(self.s_style_handle_properties, None), + (STYLENS, "table-column-properties"):(self.s_style_handle_properties, None), + (STYLENS, "table-properties"):(self.s_style_handle_properties, None), + (STYLENS, "text-properties"):(self.s_style_handle_properties, None), + (SVGNS, 'desc'): (self.s_ignorexml, None), + (TABLENS, 'covered-table-cell'): (self.s_ignorexml, None), + (TABLENS, 'table-cell'): (self.s_table_table_cell, self.e_table_table_cell), + (TABLENS, 'table-column'): (self.s_table_table_column, None), + (TABLENS, 'table-row'): (self.s_table_table_row, self.e_table_table_row), + (TABLENS, 'table'): (self.s_table_table, self.e_table_table), + (TEXTNS, 'a'): (self.s_text_a, self.e_text_a), + (TEXTNS, "alphabetical-index-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, "bibliography-configuration"):(self.s_ignorexml, None), + (TEXTNS, "bibliography-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, 'bookmark'): (self.s_text_bookmark, None), + (TEXTNS, 'bookmark-start'): (self.s_text_bookmark, None), + (TEXTNS, 'bookmark-ref'): (self.s_text_bookmark_ref, self.e_text_a), + (TEXTNS, 'bookmark-ref-start'): (self.s_text_bookmark_ref, None), + (TEXTNS, 'h'): (self.s_text_h, self.e_text_h), + (TEXTNS, "illustration-index-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, 'line-break'):(self.s_text_line_break, None), + (TEXTNS, "linenumbering-configuration"):(self.s_ignorexml, None), + (TEXTNS, "list"):(self.s_text_list, self.e_text_list), + (TEXTNS, "list-item"):(self.s_text_list_item, self.e_text_list_item), + (TEXTNS, "list-level-style-bullet"):(self.s_text_list_level_style_bullet, self.e_text_list_level_style_bullet), + (TEXTNS, "list-level-style-number"):(self.s_text_list_level_style_number, self.e_text_list_level_style_number), + (TEXTNS, "list-style"):(None, None), + (TEXTNS, "note"):(self.s_text_note, None), + (TEXTNS, "note-body"):(self.s_text_note_body, self.e_text_note_body), + (TEXTNS, "note-citation"):(None, self.e_text_note_citation), + (TEXTNS, "notes-configuration"):(self.s_ignorexml, None), + (TEXTNS, "object-index-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, 'p'): (self.s_text_p, self.e_text_p), + (TEXTNS, 's'): (self.s_text_s, None), + (TEXTNS, 'span'): (self.s_text_span, self.e_text_span), + (TEXTNS, 'tab'): (self.s_text_tab, None), + (TEXTNS, "table-index-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, "table-of-content-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, "user-index-source"):(self.s_text_x_source, self.e_text_x_source), + } + if embedable: + self.make_embedable() + self._resetobject() + + def set_plain(self): + """ Tell the parser to not generate CSS """ + self.generate_css = False + + def set_embedable(self): + """ Tells the converter to only output the parts inside the """ + self.elements[(OFFICENS, "text")] = (None,None) + self.elements[(OFFICENS, "spreadsheet")] = (None,None) + self.elements[(OFFICENS, "presentation")] = (None,None) + self.elements[(OFFICENS, "document-content")] = (None,None) + + + def add_style_file(self, stylefilename, media=None): + """ Add a link to an external style file. + Also turns of the embedding of styles in the HTML + """ + self.use_internal_css = False + self.stylefilename = stylefilename + if media: + self.metatags.append('\n' % (stylefilename,media)) + else: + self.metatags.append('\n' % (stylefilename)) + + def _resetfootnotes(self): + # Footnotes and endnotes + self.notedict = {} + self.currentnote = 0 + self.notebody = '' + + def _resetobject(self): + self.lines = [] + self._wfunc = self._wlines + self.xmlfile = '' + self.title = '' + self.language = '' + self.creator = '' + self.data = [] + self.tagstack = TagStack() + self.htmlstack = [] + self.pstack = [] + self.processelem = True + self.processcont = True + self.listtypes = {} + self.headinglevels = [0, 0,0,0,0,0, 0,0,0,0,0] # level 0 to 10 + self.use_internal_css = True + self.cs = StyleToCSS() + self.anchors = {} + + # Style declarations + self.stylestack = [] + self.styledict = {} + self.currentstyle = None + + self._resetfootnotes() + + # Tags from meta.xml + self.metatags = [] + + + def writeout(self, s): + if s != '': + self._wfunc(s) + + def writedata(self): + d = ''.join(self.data) + if d != '': + self.writeout(escape(d)) + + def opentag(self, tag, attrs={}, block=False): + """ Create an open HTML tag """ + self.htmlstack.append((tag,attrs,block)) + a = [] + for key,val in list(attrs.items()): + a.append('''%s=%s''' % (key, quoteattr(val))) + if len(a) == 0: + self.writeout("<%s>" % tag) + else: + self.writeout("<%s %s>" % (tag, " ".join(a))) + if block == True: + self.writeout("\n") + + def closetag(self, tag, block=True): + """ Close an open HTML tag """ + self.htmlstack.pop() + self.writeout("" % tag) + if block == True: + self.writeout("\n") + + def emptytag(self, tag, attrs={}): + a = [] + for key,val in list(attrs.items()): + a.append('''%s=%s''' % (key, quoteattr(val))) + self.writeout("<%s %s/>\n" % (tag, " ".join(a))) + +#-------------------------------------------------- +# Interface to parser +#-------------------------------------------------- + def characters(self, data): + if self.processelem and self.processcont: + self.data.append(data) + + def startElementNS(self, tag, qname, attrs): + self.pstack.append( (self.processelem, self.processcont) ) + if self.processelem: + method = self.elements.get(tag, (None, None) )[0] + if method: + self.handle_starttag(tag, method, attrs) + else: + self.unknown_starttag(tag,attrs) + self.tagstack.push( tag, attrs ) + + def endElementNS(self, tag, qname): + stag, attrs = self.tagstack.pop() + if self.processelem: + method = self.elements.get(tag, (None, None) )[1] + if method: + self.handle_endtag(tag, attrs, method) + else: + self.unknown_endtag(tag, attrs) + self.processelem, self.processcont = self.pstack.pop() + +#-------------------------------------------------- + def handle_starttag(self, tag, method, attrs): + method(tag,attrs) + + def handle_endtag(self, tag, attrs, method): + method(tag, attrs) + + def unknown_starttag(self, tag, attrs): + pass + + def unknown_endtag(self, tag, attrs): + pass + + def s_ignorexml(self, tag, attrs): + """ Ignore this xml element and all children of it + It will automatically stop ignoring + """ + self.processelem = False + + def s_ignorecont(self, tag, attrs): + """ Stop processing the text nodes """ + self.processcont = False + + def s_processcont(self, tag, attrs): + """ Start processing the text nodes """ + self.processcont = True + + def classname(self, attrs): + """ Generate a class name from a style name """ + c = attrs.get((TEXTNS,'style-name'),'') + c = c.replace(".","_") + return c + + def get_anchor(self, name): + """ Create a unique anchor id for a href name """ + if name not in self.anchors: + self.anchors[name] = "anchor%03d" % (len(self.anchors) + 1) + return self.anchors.get(name) + + +#-------------------------------------------------- + + def purgedata(self): + self.data = [] + +#----------------------------------------------------------------------------- +# +# Handle meta data +# +#----------------------------------------------------------------------------- + def e_dc_title(self, tag, attrs): + """ Get the title from the meta data and create a HTML + """ + self.title = ''.join(self.data) + #self.metatags.append('<title>%s\n' % escape(self.title)) + self.data = [] + + def e_dc_metatag(self, tag, attrs): + """ Any other meta data is added as a element + """ + self.metatags.append('\n' % (tag[1], quoteattr(''.join(self.data)))) + self.data = [] + + def e_dc_contentlanguage(self, tag, attrs): + """ Set the content language. Identifies the targeted audience + """ + self.language = ''.join(self.data) + self.metatags.append('\n' % escape(self.language)) + self.data = [] + + def e_dc_creator(self, tag, attrs): + """ Set the content creator. Identifies the targeted audience + """ + self.creator = ''.join(self.data) + self.metatags.append('\n' % escape(self.creator)) + self.data = [] + + def s_custom_shape(self, tag, attrs): + """ A is made into a
      in HTML which is then styled + """ + anchor_type = attrs.get((TEXTNS,'anchor-type'),'notfound') + htmltag = 'div' + name = "G-" + attrs.get( (DRAWNS,'style-name'), "") + if name == 'G-': + name = "PR-" + attrs.get( (PRESENTATIONNS,'style-name'), "") + name = name.replace(".","_") + if anchor_type == "paragraph": + style = 'position:absolute;' + elif anchor_type == 'char': + style = "position:absolute;" + elif anchor_type == 'as-char': + htmltag = 'div' + style = '' + else: + style = "position: absolute;" + if (SVGNS,"width") in attrs: + style = style + "width:" + attrs[(SVGNS,"width")] + ";" + if (SVGNS,"height") in attrs: + style = style + "height:" + attrs[(SVGNS,"height")] + ";" + if (SVGNS,"x") in attrs: + style = style + "left:" + attrs[(SVGNS,"x")] + ";" + if (SVGNS,"y") in attrs: + style = style + "top:" + attrs[(SVGNS,"y")] + ";" + if self.generate_css: + self.opentag(htmltag, {'class': name, 'style': style}) + else: + self.opentag(htmltag) + + def e_custom_shape(self, tag, attrs): + """ End the + """ + self.closetag('div') + + def s_draw_frame(self, tag, attrs): + """ A is made into a
      in HTML which is then styled + """ + anchor_type = attrs.get((TEXTNS,'anchor-type'),'notfound') + htmltag = 'div' + name = "G-" + attrs.get( (DRAWNS,'style-name'), "") + if name == 'G-': + name = "PR-" + attrs.get( (PRESENTATIONNS,'style-name'), "") + name = name.replace(".","_") + if anchor_type == "paragraph": + style = 'position:relative;' + elif anchor_type == 'char': + style = "position:relative;" + elif anchor_type == 'as-char': + htmltag = 'div' + style = '' + else: + style = "position:absolute;" + if (SVGNS,"width") in attrs: + style = style + "width:" + attrs[(SVGNS,"width")] + ";" + if (SVGNS,"height") in attrs: + style = style + "height:" + attrs[(SVGNS,"height")] + ";" + if (SVGNS,"x") in attrs: + style = style + "left:" + attrs[(SVGNS,"x")] + ";" + if (SVGNS,"y") in attrs: + style = style + "top:" + attrs[(SVGNS,"y")] + ";" + if self.generate_css: + self.opentag(htmltag, {'class': name, 'style': style}) + else: + self.opentag(htmltag) + + def e_draw_frame(self, tag, attrs): + """ End the + """ + self.closetag('div') + + def s_draw_fill_image(self, tag, attrs): + name = attrs.get( (DRAWNS,'name'), "NoName") + imghref = attrs[(XLINKNS,"href")] + imghref = self.rewritelink(imghref) + self.cs.fillimages[name] = imghref + + def rewritelink(self, imghref): + """ Intended to be overloaded if you don't store your pictures + in a Pictures subfolder + """ + return imghref + + def s_draw_image(self, tag, attrs): + """ A becomes an element + """ + parent = self.tagstack.stackparent() + anchor_type = parent.get((TEXTNS,'anchor-type')) + imghref = attrs[(XLINKNS,"href")] + imghref = self.rewritelink(imghref) + htmlattrs = {'alt':"", 'src':imghref } + if self.generate_css: + if anchor_type != "char": + htmlattrs['style'] = "display: block;" + self.emptytag('img', htmlattrs) + + def s_draw_object(self, tag, attrs): + """ A is embedded object in the document (e.g. spreadsheet in presentation). + """ + objhref = attrs[(XLINKNS,"href")] + # Remove leading "./": from "./Object 1" to "Object 1" +# objhref = objhref [2:] + + # Not using os.path.join since it fails to find the file on Windows. +# objcontentpath = '/'.join([objhref, 'content.xml']) + + for c in self.document.childnodes: + if c.folder == objhref: + self._walknode(c.topnode) + + def s_draw_object_ole(self, tag, attrs): + """ A is embedded OLE object in the document (e.g. MS Graph). + """ + class_id = attrs[(DRAWNS,"class-id")] + if class_id and class_id.lower() == "00020803-0000-0000-c000-000000000046": ## Microsoft Graph 97 Chart + tagattrs = { 'name':'object_ole_graph', 'class':'ole-graph' } + self.opentag('a', tagattrs) + self.closetag('a', tagattrs) + + def s_draw_page(self, tag, attrs): + """ A is a slide in a presentation. We use a
      element in HTML. + Therefore if you convert a ODP file, you get a series of
      s. + Override this for your own purpose. + """ + name = attrs.get( (DRAWNS,'name'), "NoName") + stylename = attrs.get( (DRAWNS,'style-name'), "") + stylename = stylename.replace(".","_") + masterpage = attrs.get( (DRAWNS,'master-page-name'),"") + masterpage = masterpage.replace(".","_") + if self.generate_css: + self.opentag('fieldset', {'class':"DP-%s MP-%s" % (stylename, masterpage) }) + else: + self.opentag('fieldset') + self.opentag('legend') + self.writeout(escape(name)) + self.closetag('legend') + + def e_draw_page(self, tag, attrs): + self.closetag('fieldset') + + def s_draw_textbox(self, tag, attrs): + style = '' + if (FONS,"min-height") in attrs: + style = style + "min-height:" + attrs[(FONS,"min-height")] + ";" + self.opentag('div') +# self.opentag('div', {'style': style}) + + def e_draw_textbox(self, tag, attrs): + """ End the + """ + self.closetag('div') + + def html_body(self, tag, attrs): + self.writedata() + if self.generate_css and self.use_internal_css: + self.opentag('style', {'type':"text/css"}, True) + self.writeout('/**/\n') + self.closetag('style') + self.purgedata() + self.closetag('head') + self.opentag('body', block=True) + + default_styles = """ +img { width: 100%; height: 100%; } +* { padding: 0; margin: 0; background-color:white; } +body { margin: 0 1em; } +ol, ul { padding-left: 2em; } +""" + + def generate_stylesheet(self): + for name in self.stylestack: + styles = self.styledict.get(name) + # Preload with the family's default style + if '__style-family' in styles and styles['__style-family'] in self.styledict: + familystyle = self.styledict[styles['__style-family']].copy() + del styles['__style-family'] + for style, val in list(styles.items()): + familystyle[style] = val + styles = familystyle + # Resolve the remaining parent styles + while '__parent-style-name' in styles and styles['__parent-style-name'] in self.styledict: + parentstyle = self.styledict[styles['__parent-style-name']].copy() + del styles['__parent-style-name'] + for style, val in list(styles.items()): + parentstyle[style] = val + styles = parentstyle + self.styledict[name] = styles + # Write the styles to HTML + self.writeout(self.default_styles) + for name in self.stylestack: + styles = self.styledict.get(name) + css2 = self.cs.convert_styles(styles) + self.writeout("%s {\n" % name) + for style, val in list(css2.items()): + self.writeout("\t%s: %s;\n" % (style, val) ) + self.writeout("}\n") + + def generate_footnotes(self): + if self.currentnote == 0: + return + if self.generate_css: + self.opentag('ol', {'style':'border-top: 1px solid black'}, True) + else: + self.opentag('ol') + for key in range(1,self.currentnote+1): + note = self.notedict[key] +# for key,note in self.notedict.items(): + self.opentag('li', { 'id':"footnote-%d" % key }) +# self.opentag('sup') +# self.writeout(escape(note['citation'])) +# self.closetag('sup', False) + self.writeout(note['body']) + self.closetag('li') + self.closetag('ol') + + def s_office_automatic_styles(self, tag, attrs): + if self.xmlfile == 'styles.xml': + self.autoprefix = "A" + else: + self.autoprefix = "" + + def s_office_document_content(self, tag, attrs): + """ First tag in the content.xml file""" + self.writeout('\n') + self.opentag('html', {'xmlns':"http://www.w3.org/1999/xhtml"}, True) + self.opentag('head', block=True) + self.emptytag('meta', { 'http-equiv':"Content-Type", 'content':"text/html;charset=UTF-8"}) + for metaline in self.metatags: + self.writeout(metaline) + self.writeout('%s\n' % escape(self.title)) + + def e_office_document_content(self, tag, attrs): + """ Last tag """ + self.closetag('html') + + def s_office_master_styles(self, tag, attrs): + """ """ + + def s_office_presentation(self, tag, attrs): + """ For some odd reason, OpenOffice Impress doesn't define a default-style + for the 'paragraph'. We therefore force a standard when we see + it is a presentation + """ + self.styledict['p'] = {(FONS,'font-size'): "24pt" } + self.styledict['presentation'] = {(FONS,'font-size'): "24pt" } + self.html_body(tag, attrs) + + def e_office_presentation(self, tag, attrs): + self.generate_footnotes() + self.closetag('body') + + def s_office_spreadsheet(self, tag, attrs): + self.html_body(tag, attrs) + + def e_office_spreadsheet(self, tag, attrs): + self.generate_footnotes() + self.closetag('body') + + def s_office_styles(self, tag, attrs): + self.autoprefix = "" + + def s_office_text(self, tag, attrs): + """ OpenDocument text """ + self.styledict['frame'] = { (STYLENS,'wrap'): 'parallel'} + self.html_body(tag, attrs) + + def e_office_text(self, tag, attrs): + self.generate_footnotes() + self.closetag('body') + + def s_style_handle_properties(self, tag, attrs): + """ Copy all attributes to a struct. + We will later convert them to CSS2 + """ + for key,attr in list(attrs.items()): + self.styledict[self.currentstyle][key] = attr + + + familymap = {'frame':'frame', 'paragraph':'p', 'presentation':'presentation', + 'text':'span','section':'div', + 'table':'table','table-cell':'td','table-column':'col', + 'table-row':'tr','graphic':'graphic' } + + def s_style_default_style(self, tag, attrs): + """ A default style is like a style on an HTML tag + """ + family = attrs[(STYLENS,'family')] + htmlfamily = self.familymap.get(family,'unknown') + self.currentstyle = htmlfamily +# self.stylestack.append(self.currentstyle) + self.styledict[self.currentstyle] = {} + + def e_style_default_style(self, tag, attrs): + self.currentstyle = None + + def s_style_font_face(self, tag, attrs): + """ It is possible that the HTML browser doesn't know how to + show a particular font. Luckily ODF provides generic fallbacks + Unfortunately they are not the same as CSS2. + CSS2: serif, sans-serif, cursive, fantasy, monospace + ODF: roman, swiss, modern, decorative, script, system + """ + name = attrs[(STYLENS,"name")] + family = attrs[(SVGNS,"font-family")] + generic = attrs.get( (STYLENS,'font-family-generic'),"" ) + self.cs.save_font(name, family, generic) + + def s_style_footer(self, tag, attrs): + self.opentag('div', { 'id':"footer" }) + self.purgedata() + + def e_style_footer(self, tag, attrs): + self.writedata() + self.closetag('div') + self.purgedata() + + def s_style_footer_style(self, tag, attrs): + self.currentstyle = "@print #footer" + self.stylestack.append(self.currentstyle) + self.styledict[self.currentstyle] = {} + + def s_style_header(self, tag, attrs): + self.opentag('div', { 'id':"header" }) + self.purgedata() + + def e_style_header(self, tag, attrs): + self.writedata() + self.closetag('div') + self.purgedata() + + def s_style_header_style(self, tag, attrs): + self.currentstyle = "@print #header" + self.stylestack.append(self.currentstyle) + self.styledict[self.currentstyle] = {} + + def s_style_default_page_layout(self, tag, attrs): + """ Collect the formatting for the default page layout style. + """ + self.currentstyle = "@page" + self.stylestack.append(self.currentstyle) + self.styledict[self.currentstyle] = {} + + def s_style_page_layout(self, tag, attrs): + """ Collect the formatting for the page layout style. + This won't work in CSS 2.1, as page identifiers are not allowed. + It is legal in CSS3, but the rest of the application doesn't specify when to use what page layout + """ + name = attrs[(STYLENS,'name')] + name = name.replace(".","_") + self.currentstyle = ".PL-" + name + self.stylestack.append(self.currentstyle) + self.styledict[self.currentstyle] = {} + + def e_style_page_layout(self, tag, attrs): + """ End this style + """ + self.currentstyle = None + + def s_style_master_page(self, tag, attrs): + """ Collect the formatting for the page layout style. + """ + name = attrs[(STYLENS,'name')] + name = name.replace(".","_") + + self.currentstyle = ".MP-" + name + self.stylestack.append(self.currentstyle) + self.styledict[self.currentstyle] = {('','position'):'relative'} + # Then load the pagelayout style if we find it + pagelayout = attrs.get( (STYLENS,'page-layout-name'), None) + if pagelayout: + pagelayout = ".PL-" + pagelayout + if pagelayout in self.styledict: + styles = self.styledict[pagelayout] + for style, val in list(styles.items()): + self.styledict[self.currentstyle][style] = val + else: + self.styledict[self.currentstyle]['__parent-style-name'] = pagelayout + self.s_ignorexml(tag, attrs) + + # Short prefixes for class selectors + _familyshort = {'drawing-page':'DP', 'paragraph':'P', 'presentation':'PR', + 'text':'S', 'section':'D', + 'table':'T', 'table-cell':'TD', 'table-column':'TC', + 'table-row':'TR', 'graphic':'G' } + + def s_style_style(self, tag, attrs): + """ Collect the formatting for the style. + Styles have scope. The same name can be used for both paragraph and + character styles Since CSS has no scope we use a prefix. (Not elegant) + In ODF a style can have a parent, these parents can be chained. + We may not have encountered the parent yet, but if we have, we resolve it. + """ + name = attrs[(STYLENS,'name')] + name = name.replace(".","_") + family = attrs[(STYLENS,'family')] + htmlfamily = self.familymap.get(family,'unknown') + sfamily = self._familyshort.get(family,'X') + name = "%s%s-%s" % (self.autoprefix, sfamily, name) + parent = attrs.get( (STYLENS,'parent-style-name') ) + self.currentstyle = special_styles.get(name,"."+name) + self.stylestack.append(self.currentstyle) + if self.currentstyle not in self.styledict: + self.styledict[self.currentstyle] = {} + + self.styledict[self.currentstyle]['__style-family'] = htmlfamily + + # Then load the parent style if we find it + if parent: + parent = "%s-%s" % (sfamily, parent) + parent = special_styles.get(parent, "."+parent) + if parent in self.styledict: + styles = self.styledict[parent] + for style, val in list(styles.items()): + self.styledict[self.currentstyle][style] = val + else: + self.styledict[self.currentstyle]['__parent-style-name'] = parent + + def e_style_style(self, tag, attrs): + """ End this style + """ + self.currentstyle = None + + def s_table_table(self, tag, attrs): + """ Start a table + """ + c = attrs.get( (TABLENS,'style-name'), None) + if c and self.generate_css: + c = c.replace(".","_") + self.opentag('table',{ 'class': "T-%s" % c }) + else: + self.opentag('table') + self.purgedata() + + def e_table_table(self, tag, attrs): + """ End a table + """ + self.writedata() + self.closetag('table') + self.purgedata() + + def s_table_table_cell(self, tag, attrs): + """ Start a table cell """ + #FIXME: number-columns-repeated § 8.1.3 + #repeated = int(attrs.get( (TABLENS,'number-columns-repeated'), 1)) + htmlattrs = {} + rowspan = attrs.get( (TABLENS,'number-rows-spanned') ) + if rowspan: + htmlattrs['rowspan'] = rowspan + colspan = attrs.get( (TABLENS,'number-columns-spanned') ) + if colspan: + htmlattrs['colspan'] = colspan + + c = attrs.get( (TABLENS,'style-name') ) + if c: + htmlattrs['class'] = 'TD-%s' % c.replace(".","_") + self.opentag('td', htmlattrs) + self.purgedata() + + def e_table_table_cell(self, tag, attrs): + """ End a table cell """ + self.writedata() + self.closetag('td') + self.purgedata() + + def s_table_table_column(self, tag, attrs): + """ Start a table column """ + c = attrs.get( (TABLENS,'style-name'), None) + repeated = int(attrs.get( (TABLENS,'number-columns-repeated'), 1)) + htmlattrs = {} + if c: + htmlattrs['class'] = "TC-%s" % c.replace(".","_") + for x in range(repeated): + self.emptytag('col', htmlattrs) + self.purgedata() + + def s_table_table_row(self, tag, attrs): + """ Start a table row """ + #FIXME: table:number-rows-repeated + c = attrs.get( (TABLENS,'style-name'), None) + htmlattrs = {} + if c: + htmlattrs['class'] = "TR-%s" % c.replace(".","_") + self.opentag('tr', htmlattrs) + self.purgedata() + + def e_table_table_row(self, tag, attrs): + """ End a table row """ + self.writedata() + self.closetag('tr') + self.purgedata() + + def s_text_a(self, tag, attrs): + """ Anchors start """ + self.writedata() + href = attrs[(XLINKNS,"href")].split("|")[0] + if href[0] == "#": + href = "#" + self.get_anchor(href[1:]) + self.opentag('a', {'href':href}) + self.purgedata() + + def e_text_a(self, tag, attrs): + """ End an anchor or bookmark reference """ + self.writedata() + self.closetag('a', False) + self.purgedata() + + def s_text_bookmark(self, tag, attrs): + """ Bookmark definition """ + name = attrs[(TEXTNS,'name')] + html_id = self.get_anchor(name) + self.writedata() + self.opentag('span', {'id':html_id}) + self.closetag('span', False) + self.purgedata() + + def s_text_bookmark_ref(self, tag, attrs): + """ Bookmark reference """ + name = attrs[(TEXTNS,'ref-name')] + html_id = "#" + self.get_anchor(name) + self.writedata() + self.opentag('a', {'href':html_id}) + self.purgedata() + + def s_text_h(self, tag, attrs): + """ Headings start """ + level = int(attrs[(TEXTNS,'outline-level')]) + if level > 6: level = 6 # Heading levels go only to 6 in XHTML + if level < 1: level = 1 + self.headinglevels[level] = self.headinglevels[level] + 1 + name = self.classname(attrs) + for x in range(level + 1,10): + self.headinglevels[x] = 0 + special = special_styles.get("P-"+name) + if special or not self.generate_css: + self.opentag('h%s' % level) + else: + self.opentag('h%s' % level, {'class':"P-%s" % name }) + self.purgedata() + + def e_text_h(self, tag, attrs): + """ Headings end + Side-effect: If there is no title in the metadata, then it is taken + from the first heading of any level. + """ + self.writedata() + level = int(attrs[(TEXTNS,'outline-level')]) + if level > 6: level = 6 # Heading levels go only to 6 in XHTML + if level < 1: level = 1 + lev = self.headinglevels[1:level+1] + outline = '.'.join(map(str,lev) ) + heading = ''.join(self.data) + if self.title == '': self.title = heading + anchor = self.get_anchor("%s.%s" % ( outline, heading)) + self.opentag('a', {'id': anchor} ) + self.closetag('a', False) + self.closetag('h%s' % level) + self.purgedata() + + def s_text_line_break(self, tag, attrs): + """ Force a line break (
      ) """ + self.writedata() + self.emptytag('br') + self.purgedata() + + def s_text_list(self, tag, attrs): + """ Start a list (
        or
          ) + To know which level we're at, we have to count the number + of elements on the tagstack. + """ + name = attrs.get( (TEXTNS,'style-name') ) + level = self.tagstack.count_tags(tag) + 1 + if name: + name = name.replace(".","_") + else: + # FIXME: If a list is contained in a table cell or text box, + # the list level must return to 1, even though the table or + # textbox itself may be nested within another list. + name = self.tagstack.rfindattr( (TEXTNS,'style-name') ) + list_class = "%s_%d" % (name, level) + if self.generate_css: + self.opentag('%s' % self.listtypes.get(list_class,'ul'), {'class': list_class }) + else: + self.opentag('%s' % self.listtypes.get(list_class,'ul')) + self.purgedata() + + def e_text_list(self, tag, attrs): + """ End a list """ + self.writedata() + name = attrs.get( (TEXTNS,'style-name') ) + level = self.tagstack.count_tags(tag) + 1 + if name: + name = name.replace(".","_") + else: + # FIXME: If a list is contained in a table cell or text box, + # the list level must return to 1, even though the table or + # textbox itself may be nested within another list. + name = self.tagstack.rfindattr( (TEXTNS,'style-name') ) + list_class = "%s_%d" % (name, level) + self.closetag(self.listtypes.get(list_class,'ul')) + self.purgedata() + + def s_text_list_item(self, tag, attrs): + """ Start list item """ + self.opentag('li') + self.purgedata() + + def e_text_list_item(self, tag, attrs): + """ End list item """ + self.writedata() + self.closetag('li') + self.purgedata() + + def s_text_list_level_style_bullet(self, tag, attrs): + """ CSS doesn't have the ability to set the glyph + to a particular character, so we just go through + the available glyphs + """ + name = self.tagstack.rfindattr( (STYLENS,'name') ) + level = attrs[(TEXTNS,'level')] + self.prevstyle = self.currentstyle + list_class = "%s_%s" % (name, level) + self.listtypes[list_class] = 'ul' + self.currentstyle = ".%s_%s" % ( name.replace(".","_"), level) + self.stylestack.append(self.currentstyle) + self.styledict[self.currentstyle] = {} + + level = int(level) + listtype = ("square", "disc", "circle")[level % 3] + self.styledict[self.currentstyle][('','list-style-type')] = listtype + + def e_text_list_level_style_bullet(self, tag, attrs): + self.currentstyle = self.prevstyle + del self.prevstyle + + def s_text_list_level_style_number(self, tag, attrs): + name = self.tagstack.stackparent()[(STYLENS,'name')] + level = attrs[(TEXTNS,'level')] + num_format = attrs.get( (STYLENS,'name'),"1") + list_class = "%s_%s" % (name, level) + self.prevstyle = self.currentstyle + self.currentstyle = ".%s_%s" % ( name.replace(".","_"), level) + self.listtypes[list_class] = 'ol' + self.stylestack.append(self.currentstyle) + self.styledict[self.currentstyle] = {} + if num_format == "1": listtype = "decimal" + elif num_format == "I": listtype = "upper-roman" + elif num_format == "i": listtype = "lower-roman" + elif num_format == "A": listtype = "upper-alpha" + elif num_format == "a": listtype = "lower-alpha" + else: listtype = "decimal" + self.styledict[self.currentstyle][('','list-style-type')] = listtype + + def e_text_list_level_style_number(self, tag, attrs): + self.currentstyle = self.prevstyle + del self.prevstyle + + def s_text_note(self, tag, attrs): + self.writedata() + self.purgedata() + self.currentnote = self.currentnote + 1 + self.notedict[self.currentnote] = {} + self.notebody = [] + + def e_text_note(self, tag, attrs): + pass + + def collectnote(self,s): + if s != '': + self.notebody.append(s) + + def s_text_note_body(self, tag, attrs): + self._orgwfunc = self._wfunc + self._wfunc = self.collectnote + + def e_text_note_body(self, tag, attrs): + self._wfunc = self._orgwfunc + self.notedict[self.currentnote]['body'] = ''.join(self.notebody) + self.notebody = '' + del self._orgwfunc + + def e_text_note_citation(self, tag, attrs): + mark = ''.join(self.data) + self.notedict[self.currentnote]['citation'] = mark + self.opentag('a',{ 'href': "#footnote-%s" % self.currentnote }) + self.opentag('sup') +# self.writeout( escape(mark) ) + # Since HTML only knows about endnotes, there is too much risk that the + # marker is reused in the source. Therefore we force numeric markers + self.writeout(str(self.currentnote)) + self.closetag('sup') + self.closetag('a') + + def s_text_p(self, tag, attrs): + """ Paragraph + """ + htmlattrs = {} + specialtag = "p" + c = attrs.get( (TEXTNS,'style-name'), None) + if c: + c = c.replace(".","_") + specialtag = special_styles.get("P-"+c) + if specialtag is None: + specialtag = 'p' + if self.generate_css: + htmlattrs['class'] = "P-%s" % c + self.opentag(specialtag, htmlattrs) + self.purgedata() + + def e_text_p(self, tag, attrs): + """ End Paragraph + """ + specialtag = "p" + c = attrs.get( (TEXTNS,'style-name'), None) + if c: + c = c.replace(".","_") + specialtag = special_styles.get("P-"+c) + if specialtag is None: + specialtag = 'p' + self.writedata() + self.closetag(specialtag) + self.purgedata() + + def s_text_s(self, tag, attrs): + """ Generate a number of spaces. ODF has an element; HTML uses   + We use   so we can send the output through an XML parser if we desire to + """ + c = attrs.get( (TEXTNS,'c'),"1") + for x in range(int(c)): + self.writeout(' ') + + def s_text_span(self, tag, attrs): + """ The element matches the element in HTML. It is + typically used to properties of the text. + """ + self.writedata() + c = attrs.get( (TEXTNS,'style-name'), None) + htmlattrs = {} + if c: + c = c.replace(".","_") + special = special_styles.get("S-"+c) + if special is None and self.generate_css: + htmlattrs['class'] = "S-%s" % c + self.opentag('span', htmlattrs) + self.purgedata() + + def e_text_span(self, tag, attrs): + """ End the """ + self.writedata() + self.closetag('span', False) + self.purgedata() + + def s_text_tab(self, tag, attrs): + """ Move to the next tabstop. We ignore this in HTML + """ + self.writedata() + self.writeout(' ') + self.purgedata() + + def s_text_x_source(self, tag, attrs): + """ Various indexes and tables of contents. We ignore those. + """ + self.writedata() + self.purgedata() + self.s_ignorexml(tag, attrs) + + def e_text_x_source(self, tag, attrs): + """ Various indexes and tables of contents. We ignore those. + """ + self.writedata() + self.purgedata() + + +#----------------------------------------------------------------------------- +# +# Reading the file +# +#----------------------------------------------------------------------------- + + def load(self, odffile): + """ Loads a document into the parser and parses it. + The argument can either be a filename or a document in memory. + """ + self.lines = [] + self._wfunc = self._wlines + if isinstance(odffile, str): + self.document = load(odffile) + else: + self.document = odffile + self._walknode(self.document.topnode) + + def _walknode(self, node): + if node.nodeType == Node.ELEMENT_NODE: + self.startElementNS(node.qname, node.tagName, node.attributes) + for c in node.childNodes: + self._walknode(c) + self.endElementNS(node.qname, node.tagName) + if node.nodeType == Node.TEXT_NODE or node.nodeType == Node.CDATA_SECTION_NODE: + self.characters(str(node)) + + + def odf2xhtml(self, odffile): + """ Load a file and return the XHTML + """ + self.load(odffile) + return self.xhtml() + + def _wlines(self,s): + if s != '': self.lines.append(s) + + def xhtml(self): + """ Returns the xhtml + """ + return ''.join(self.lines) + + def _writecss(self, s): + if s != '': self._csslines.append(s) + + def _writenothing(self, s): + pass + + def css(self): + """ Returns the CSS content """ + self._csslines = [] + self._wfunc = self._writecss + self.generate_stylesheet() + res = ''.join(self._csslines) + self._wfunc = self._wlines + del self._csslines + return res + + def save(self, outputfile, addsuffix=False): + """ Save the HTML under the filename. + If the filename is '-' then save to stdout + We have the last style filename in self.stylefilename + """ + if outputfile == '-': + outputfp = sys.stdout + else: + if addsuffix: + outputfile = outputfile + ".html" + outputfp = file(outputfile, "w") + outputfp.write(self.xhtml().encode('us-ascii','xmlcharrefreplace')) + outputfp.close() + + +class ODF2XHTMLembedded(ODF2XHTML): + """ The ODF2XHTML parses an ODF file and produces XHTML""" + + def __init__(self, lines, generate_css=True, embedable=False): + self._resetobject() + self.lines = lines + + # Tags + self.generate_css = generate_css + self.elements = { +# (DCNS, 'title'): (self.s_processcont, self.e_dc_title), +# (DCNS, 'language'): (self.s_processcont, self.e_dc_contentlanguage), +# (DCNS, 'creator'): (self.s_processcont, self.e_dc_metatag), +# (DCNS, 'description'): (self.s_processcont, self.e_dc_metatag), +# (DCNS, 'date'): (self.s_processcont, self.e_dc_metatag), + (DRAWNS, 'frame'): (self.s_draw_frame, self.e_draw_frame), + (DRAWNS, 'image'): (self.s_draw_image, None), + (DRAWNS, 'fill-image'): (self.s_draw_fill_image, None), + (DRAWNS, "layer-set"):(self.s_ignorexml, None), + (DRAWNS, 'page'): (self.s_draw_page, self.e_draw_page), + (DRAWNS, 'object'): (self.s_draw_object, None), + (DRAWNS, 'object-ole'): (self.s_draw_object_ole, None), + (DRAWNS, 'text-box'): (self.s_draw_textbox, self.e_draw_textbox), +# (METANS, 'creation-date'):(self.s_processcont, self.e_dc_metatag), +# (METANS, 'generator'):(self.s_processcont, self.e_dc_metatag), +# (METANS, 'initial-creator'): (self.s_processcont, self.e_dc_metatag), +# (METANS, 'keyword'): (self.s_processcont, self.e_dc_metatag), + (NUMBERNS, "boolean-style"):(self.s_ignorexml, None), + (NUMBERNS, "currency-style"):(self.s_ignorexml, None), + (NUMBERNS, "date-style"):(self.s_ignorexml, None), + (NUMBERNS, "number-style"):(self.s_ignorexml, None), + (NUMBERNS, "text-style"):(self.s_ignorexml, None), +# (OFFICENS, "automatic-styles"):(self.s_office_automatic_styles, None), +# (OFFICENS, "document-content"):(self.s_office_document_content, self.e_office_document_content), + (OFFICENS, "forms"):(self.s_ignorexml, None), +# (OFFICENS, "master-styles"):(self.s_office_master_styles, None), + (OFFICENS, "meta"):(self.s_ignorecont, None), +# (OFFICENS, "presentation"):(self.s_office_presentation, self.e_office_presentation), +# (OFFICENS, "spreadsheet"):(self.s_office_spreadsheet, self.e_office_spreadsheet), +# (OFFICENS, "styles"):(self.s_office_styles, None), +# (OFFICENS, "text"):(self.s_office_text, self.e_office_text), + (OFFICENS, "scripts"):(self.s_ignorexml, None), + (PRESENTATIONNS, "notes"):(self.s_ignorexml, None), +## (STYLENS, "default-page-layout"):(self.s_style_default_page_layout, self.e_style_page_layout), +# (STYLENS, "default-page-layout"):(self.s_ignorexml, None), +# (STYLENS, "default-style"):(self.s_style_default_style, self.e_style_default_style), +# (STYLENS, "drawing-page-properties"):(self.s_style_handle_properties, None), +# (STYLENS, "font-face"):(self.s_style_font_face, None), +## (STYLENS, "footer"):(self.s_style_footer, self.e_style_footer), +## (STYLENS, "footer-style"):(self.s_style_footer_style, None), +# (STYLENS, "graphic-properties"):(self.s_style_handle_properties, None), +# (STYLENS, "handout-master"):(self.s_ignorexml, None), +## (STYLENS, "header"):(self.s_style_header, self.e_style_header), +## (STYLENS, "header-footer-properties"):(self.s_style_handle_properties, None), +## (STYLENS, "header-style"):(self.s_style_header_style, None), +# (STYLENS, "master-page"):(self.s_style_master_page, None), +# (STYLENS, "page-layout-properties"):(self.s_style_handle_properties, None), +## (STYLENS, "page-layout"):(self.s_style_page_layout, self.e_style_page_layout), +# (STYLENS, "page-layout"):(self.s_ignorexml, None), +# (STYLENS, "paragraph-properties"):(self.s_style_handle_properties, None), +# (STYLENS, "style"):(self.s_style_style, self.e_style_style), +# (STYLENS, "table-cell-properties"):(self.s_style_handle_properties, None), +# (STYLENS, "table-column-properties"):(self.s_style_handle_properties, None), +# (STYLENS, "table-properties"):(self.s_style_handle_properties, None), +# (STYLENS, "text-properties"):(self.s_style_handle_properties, None), + (SVGNS, 'desc'): (self.s_ignorexml, None), + (TABLENS, 'covered-table-cell'): (self.s_ignorexml, None), + (TABLENS, 'table-cell'): (self.s_table_table_cell, self.e_table_table_cell), + (TABLENS, 'table-column'): (self.s_table_table_column, None), + (TABLENS, 'table-row'): (self.s_table_table_row, self.e_table_table_row), + (TABLENS, 'table'): (self.s_table_table, self.e_table_table), + (TEXTNS, 'a'): (self.s_text_a, self.e_text_a), + (TEXTNS, "alphabetical-index-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, "bibliography-configuration"):(self.s_ignorexml, None), + (TEXTNS, "bibliography-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, 'h'): (self.s_text_h, self.e_text_h), + (TEXTNS, "illustration-index-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, 'line-break'):(self.s_text_line_break, None), + (TEXTNS, "linenumbering-configuration"):(self.s_ignorexml, None), + (TEXTNS, "list"):(self.s_text_list, self.e_text_list), + (TEXTNS, "list-item"):(self.s_text_list_item, self.e_text_list_item), + (TEXTNS, "list-level-style-bullet"):(self.s_text_list_level_style_bullet, self.e_text_list_level_style_bullet), + (TEXTNS, "list-level-style-number"):(self.s_text_list_level_style_number, self.e_text_list_level_style_number), + (TEXTNS, "list-style"):(None, None), + (TEXTNS, "note"):(self.s_text_note, None), + (TEXTNS, "note-body"):(self.s_text_note_body, self.e_text_note_body), + (TEXTNS, "note-citation"):(None, self.e_text_note_citation), + (TEXTNS, "notes-configuration"):(self.s_ignorexml, None), + (TEXTNS, "object-index-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, 'p'): (self.s_text_p, self.e_text_p), + (TEXTNS, 's'): (self.s_text_s, None), + (TEXTNS, 'span'): (self.s_text_span, self.e_text_span), + (TEXTNS, 'tab'): (self.s_text_tab, None), + (TEXTNS, "table-index-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, "table-of-content-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, "user-index-source"):(self.s_text_x_source, self.e_text_x_source), + (TEXTNS, "page-number"):(None, None), + } + diff --git a/tablib/packages/odf3/odfmanifest.py b/tablib/packages/odf3/odfmanifest.py new file mode 100644 index 0000000..b6508c5 --- /dev/null +++ b/tablib/packages/odf3/odfmanifest.py @@ -0,0 +1,115 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +# This script lists the content of the manifest.xml file +import zipfile +from xml.sax import make_parser,handler +from xml.sax.xmlreader import InputSource +import xml.sax.saxutils +from io import StringIO + +MANIFESTNS="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0" + +#----------------------------------------------------------------------------- +# +# ODFMANIFESTHANDLER +# +#----------------------------------------------------------------------------- + +class ODFManifestHandler(handler.ContentHandler): + """ The ODFManifestHandler parses a manifest file and produces a list of + content """ + + def __init__(self): + self.manifest = {} + + # Tags + # FIXME: Also handle encryption data + self.elements = { + (MANIFESTNS, 'file-entry'): (self.s_file_entry, self.donothing), + } + + def handle_starttag(self, tag, method, attrs): + method(tag,attrs) + + def handle_endtag(self, tag, method): + method(tag) + + def startElementNS(self, tag, qname, attrs): + method = self.elements.get(tag, (None, None))[0] + if method: + self.handle_starttag(tag, method, attrs) + else: + self.unknown_starttag(tag,attrs) + + def endElementNS(self, tag, qname): + method = self.elements.get(tag, (None, None))[1] + if method: + self.handle_endtag(tag, method) + else: + self.unknown_endtag(tag) + + def unknown_starttag(self, tag, attrs): + pass + + def unknown_endtag(self, tag): + pass + + def donothing(self, tag, attrs=None): + pass + + def s_file_entry(self, tag, attrs): + m = attrs.get((MANIFESTNS, 'media-type'),"application/octet-stream") + p = attrs.get((MANIFESTNS, 'full-path')) + self.manifest[p] = { 'media-type':m, 'full-path':p } + + +#----------------------------------------------------------------------------- +# +# Reading the file +# +#----------------------------------------------------------------------------- + +def manifestlist(manifestxml): + odhandler = ODFManifestHandler() + parser = make_parser() + parser.setFeature(handler.feature_namespaces, 1) + parser.setContentHandler(odhandler) + parser.setErrorHandler(handler.ErrorHandler()) + + inpsrc = InputSource() + inpsrc.setByteStream(StringIO(manifestxml)) + parser.parse(inpsrc) + + return odhandler.manifest + +def odfmanifest(odtfile): + z = zipfile.ZipFile(odtfile) + manifest = z.read('META-INF/manifest.xml') + z.close() + return manifestlist(manifest) + +if __name__ == "__main__": + import sys + result = odfmanifest(sys.argv[1]) + for file in list(result.values()): + print("%-40s %-40s" % (file['media-type'], file['full-path'])) + diff --git a/tablib/packages/odf3/office.py b/tablib/packages/odf3/office.py new file mode 100644 index 0000000..eca47ad --- /dev/null +++ b/tablib/packages/odf3/office.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from .namespaces import OFFICENS +from .element import Element +from .draw import StyleRefElement + +# Autogenerated +def Annotation(**args): + return StyleRefElement(qname = (OFFICENS,'annotation'), **args) + +def AutomaticStyles(**args): + return Element(qname = (OFFICENS, 'automatic-styles'), **args) + +def BinaryData(**args): + return Element(qname = (OFFICENS,'binary-data'), **args) + +def Body(**args): + return Element(qname = (OFFICENS, 'body'), **args) + +def ChangeInfo(**args): + return Element(qname = (OFFICENS,'change-info'), **args) + +def Chart(**args): + return Element(qname = (OFFICENS,'chart'), **args) + +def DdeSource(**args): + return Element(qname = (OFFICENS,'dde-source'), **args) + +def Document(version="1.1", **args): + return Element(qname = (OFFICENS,'document'), version=version, **args) + +def DocumentContent(version="1.1", **args): + return Element(qname = (OFFICENS, 'document-content'), version=version, **args) + +def DocumentMeta(version="1.1", **args): + return Element(qname = (OFFICENS, 'document-meta'), version=version, **args) + +def DocumentSettings(version="1.1", **args): + return Element(qname = (OFFICENS, 'document-settings'), version=version, **args) + +def DocumentStyles(version="1.1", **args): + return Element(qname = (OFFICENS, 'document-styles'), version=version, **args) + +def Drawing(**args): + return Element(qname = (OFFICENS,'drawing'), **args) + +def EventListeners(**args): + return Element(qname = (OFFICENS,'event-listeners'), **args) + +def FontFaceDecls(**args): + return Element(qname = (OFFICENS, 'font-face-decls'), **args) + +def Forms(**args): + return Element(qname = (OFFICENS,'forms'), **args) + +def Image(**args): + return Element(qname = (OFFICENS,'image'), **args) + +def MasterStyles(**args): + return Element(qname = (OFFICENS, 'master-styles'), **args) + +def Meta(**args): + return Element(qname = (OFFICENS, 'meta'), **args) + +def Presentation(**args): + return Element(qname = (OFFICENS,'presentation'), **args) + +def Script(**args): + return Element(qname = (OFFICENS, 'script'), **args) + +def Scripts(**args): + return Element(qname = (OFFICENS, 'scripts'), **args) + +def Settings(**args): + return Element(qname = (OFFICENS, 'settings'), **args) + +def Spreadsheet(**args): + return Element(qname = (OFFICENS, 'spreadsheet'), **args) + +def Styles(**args): + return Element(qname = (OFFICENS, 'styles'), **args) + +def Text(**args): + return Element(qname = (OFFICENS, 'text'), **args) + +# Autogenerated end diff --git a/tablib/packages/odf3/opendocument.py b/tablib/packages/odf3/opendocument.py new file mode 100644 index 0000000..c0d556f --- /dev/null +++ b/tablib/packages/odf3/opendocument.py @@ -0,0 +1,654 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2010 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +__doc__="""Use OpenDocument to generate your documents.""" + +import zipfile, time, sys, mimetypes, copy +from io import StringIO +from .namespaces import * +from . import manifest, meta +from .office import * +from . import element +from .attrconverters import make_NCName +from xml.sax.xmlreader import InputSource +from .odfmanifest import manifestlist + +__version__= TOOLSVERSION + +_XMLPROLOGUE = "\n" + +UNIXPERMS = 0o100644 << 16 # -rw-r--r-- + +IS_FILENAME = 0 +IS_IMAGE = 1 +# We need at least Python 2.2 +assert sys.version_info[0]>=2 and sys.version_info[1] >= 2 + +#sys.setrecursionlimit(100) +#The recursion limit is set conservative so mistakes like +# s=content() s.addElement(s) won't eat up too much processor time. + +odmimetypes = { + 'application/vnd.oasis.opendocument.text': '.odt', + 'application/vnd.oasis.opendocument.text-template': '.ott', + 'application/vnd.oasis.opendocument.graphics': '.odg', + 'application/vnd.oasis.opendocument.graphics-template': '.otg', + 'application/vnd.oasis.opendocument.presentation': '.odp', + 'application/vnd.oasis.opendocument.presentation-template': '.otp', + 'application/vnd.oasis.opendocument.spreadsheet': '.ods', + 'application/vnd.oasis.opendocument.spreadsheet-template': '.ots', + 'application/vnd.oasis.opendocument.chart': '.odc', + 'application/vnd.oasis.opendocument.chart-template': '.otc', + 'application/vnd.oasis.opendocument.image': '.odi', + 'application/vnd.oasis.opendocument.image-template': '.oti', + 'application/vnd.oasis.opendocument.formula': '.odf', + 'application/vnd.oasis.opendocument.formula-template': '.otf', + 'application/vnd.oasis.opendocument.text-master': '.odm', + 'application/vnd.oasis.opendocument.text-web': '.oth', +} + +class OpaqueObject: + def __init__(self, filename, mediatype, content=None): + self.mediatype = mediatype + self.filename = filename + self.content = content + +class OpenDocument: + """ A class to hold the content of an OpenDocument document + Use the xml method to write the XML + source to the screen or to a file + d = OpenDocument(mimetype) + fd.write(d.xml()) + """ + thumbnail = None + + def __init__(self, mimetype, add_generator=True): + self.mimetype = mimetype + self.childobjects = [] + self._extra = [] + self.folder = "" # Always empty for toplevel documents + self.topnode = Document(mimetype=self.mimetype) + self.topnode.ownerDocument = self + + self.clear_caches() + + self.Pictures = {} + self.meta = Meta() + self.topnode.addElement(self.meta) + if add_generator: + self.meta.addElement(meta.Generator(text=TOOLSVERSION)) + self.scripts = Scripts() + self.topnode.addElement(self.scripts) + self.fontfacedecls = FontFaceDecls() + self.topnode.addElement(self.fontfacedecls) + self.settings = Settings() + self.topnode.addElement(self.settings) + self.styles = Styles() + self.topnode.addElement(self.styles) + self.automaticstyles = AutomaticStyles() + self.topnode.addElement(self.automaticstyles) + self.masterstyles = MasterStyles() + self.topnode.addElement(self.masterstyles) + self.body = Body() + self.topnode.addElement(self.body) + + def rebuild_caches(self, node=None): + if node is None: node = self.topnode + self.build_caches(node) + for e in node.childNodes: + if e.nodeType == element.Node.ELEMENT_NODE: + self.rebuild_caches(e) + + def clear_caches(self): + self.element_dict = {} + self._styles_dict = {} + self._styles_ooo_fix = {} + + def build_caches(self, element): + """ Called from element.py + """ + if element.qname not in self.element_dict: + self.element_dict[element.qname] = [] + self.element_dict[element.qname].append(element) + if element.qname == (STYLENS, 'style'): + self.__register_stylename(element) # Add to style dictionary + styleref = element.getAttrNS(TEXTNS,'style-name') + if styleref is not None and styleref in self._styles_ooo_fix: + element.setAttrNS(TEXTNS,'style-name', self._styles_ooo_fix[styleref]) + + def __register_stylename(self, element): + ''' Register a style. But there are three style dictionaries: + office:styles, office:automatic-styles and office:master-styles + Chapter 14 + ''' + name = element.getAttrNS(STYLENS, 'name') + if name is None: + return + if element.parentNode.qname in ((OFFICENS,'styles'), (OFFICENS,'automatic-styles')): + if name in self._styles_dict: + newname = 'M'+name # Rename style + self._styles_ooo_fix[name] = newname + # From here on all references to the old name will refer to the new one + name = newname + element.setAttrNS(STYLENS, 'name', name) + self._styles_dict[name] = element + + def toXml(self, filename=''): + xml=StringIO() + xml.write(_XMLPROLOGUE) + self.body.toXml(0, xml) + if not filename: + return xml.getvalue() + else: + f=file(filename,'w') + f.write(xml.getvalue()) + f.close() + + def xml(self): + """ Generates the full document as an XML file + Always written as a bytestream in UTF-8 encoding + """ + self.__replaceGenerator() + xml=StringIO() + xml.write(_XMLPROLOGUE) + self.topnode.toXml(0, xml) + return xml.getvalue() + + + def contentxml(self): + """ Generates the content.xml file + Always written as a bytestream in UTF-8 encoding + """ + xml=StringIO() + xml.write(_XMLPROLOGUE) + x = DocumentContent() + x.write_open_tag(0, xml) + if self.scripts.hasChildNodes(): + self.scripts.toXml(1, xml) + if self.fontfacedecls.hasChildNodes(): + self.fontfacedecls.toXml(1, xml) + a = AutomaticStyles() + stylelist = self._used_auto_styles([self.styles, self.automaticstyles, self.body]) + if len(stylelist) > 0: + a.write_open_tag(1, xml) + for s in stylelist: + s.toXml(2, xml) + a.write_close_tag(1, xml) + else: + a.toXml(1, xml) + self.body.toXml(1, xml) + x.write_close_tag(0, xml) + return xml.getvalue() + + def __manifestxml(self): + """ Generates the manifest.xml file + The self.manifest isn't avaible unless the document is being saved + """ + xml=StringIO() + xml.write(_XMLPROLOGUE) + self.manifest.toXml(0,xml) + return xml.getvalue() + + def metaxml(self): + """ Generates the meta.xml file """ + self.__replaceGenerator() + x = DocumentMeta() + x.addElement(self.meta) + xml=StringIO() + xml.write(_XMLPROLOGUE) + x.toXml(0,xml) + return xml.getvalue() + + def settingsxml(self): + """ Generates the settings.xml file """ + x = DocumentSettings() + x.addElement(self.settings) + xml=StringIO() + xml.write(_XMLPROLOGUE) + x.toXml(0,xml) + return xml.getvalue() + + def _parseoneelement(self, top, stylenamelist): + """ Finds references to style objects in master-styles + and add the style name to the style list if not already there. + Recursive + """ + for e in top.childNodes: + if e.nodeType == element.Node.ELEMENT_NODE: + for styleref in ( (DRAWNS,'style-name'), + (DRAWNS,'text-style-name'), + (PRESENTATIONNS,'style-name'), + (STYLENS,'data-style-name'), + (STYLENS,'list-style-name'), + (STYLENS,'page-layout-name'), + (STYLENS,'style-name'), + (TABLENS,'default-cell-style-name'), + (TABLENS,'style-name'), + (TEXTNS,'style-name') ): + if e.getAttrNS(styleref[0],styleref[1]): + stylename = e.getAttrNS(styleref[0],styleref[1]) + if stylename not in stylenamelist: + stylenamelist.append(stylename) + stylenamelist = self._parseoneelement(e, stylenamelist) + return stylenamelist + + def _used_auto_styles(self, segments): + """ Loop through the masterstyles elements, and find the automatic + styles that are used. These will be added to the automatic-styles + element in styles.xml + """ + stylenamelist = [] + for top in segments: + stylenamelist = self._parseoneelement(top, stylenamelist) + stylelist = [] + for e in self.automaticstyles.childNodes: + if e.getAttrNS(STYLENS,'name') in stylenamelist: + stylelist.append(e) + return stylelist + + def stylesxml(self): + """ Generates the styles.xml file """ + xml=StringIO() + xml.write(_XMLPROLOGUE) + x = DocumentStyles() + x.write_open_tag(0, xml) + if self.fontfacedecls.hasChildNodes(): + self.fontfacedecls.toXml(1, xml) + self.styles.toXml(1, xml) + a = AutomaticStyles() + a.write_open_tag(1, xml) + for s in self._used_auto_styles([self.masterstyles]): + s.toXml(2, xml) + a.write_close_tag(1, xml) + if self.masterstyles.hasChildNodes(): + self.masterstyles.toXml(1, xml) + x.write_close_tag(0, xml) + return xml.getvalue() + + def addPicture(self, filename, mediatype=None, content=None): + """ Add a picture + It uses the same convention as OOo, in that it saves the picture in + the zipfile in the subdirectory 'Pictures' + If passed a file ptr, mediatype must be set + """ + if content is None: + if mediatype is None: + mediatype, encoding = mimetypes.guess_type(filename) + if mediatype is None: + mediatype = '' + try: ext = filename[filename.rindex('.'):] + except: ext='' + else: + ext = mimetypes.guess_extension(mediatype) + manifestfn = "Pictures/%0.0f%s" % ((time.time()*10000000000), ext) + self.Pictures[manifestfn] = (IS_FILENAME, filename, mediatype) + else: + manifestfn = filename + self.Pictures[manifestfn] = (IS_IMAGE, content, mediatype) + return manifestfn + + def addPictureFromFile(self, filename, mediatype=None): + """ Add a picture + It uses the same convention as OOo, in that it saves the picture in + the zipfile in the subdirectory 'Pictures'. + If mediatype is not given, it will be guessed from the filename + extension. + """ + if mediatype is None: + mediatype, encoding = mimetypes.guess_type(filename) + if mediatype is None: + mediatype = '' + try: ext = filename[filename.rindex('.'):] + except ValueError: ext='' + else: + ext = mimetypes.guess_extension(mediatype) + manifestfn = "Pictures/%0.0f%s" % ((time.time()*10000000000), ext) + self.Pictures[manifestfn] = (IS_FILENAME, filename, mediatype) + return manifestfn + + def addPictureFromString(self, content, mediatype): + """ Add a picture + It uses the same convention as OOo, in that it saves the picture in + the zipfile in the subdirectory 'Pictures'. The content variable + is a string that contains the binary image data. The mediatype + indicates the image format. + """ + ext = mimetypes.guess_extension(mediatype) + manifestfn = "Pictures/%0.0f%s" % ((time.time()*10000000000), ext) + self.Pictures[manifestfn] = (IS_IMAGE, content, mediatype) + return manifestfn + + def addThumbnail(self, filecontent=None): + """ Add a fixed thumbnail + The thumbnail in the library is big, so this is pretty useless. + """ + if filecontent is None: + from . import thumbnail + self.thumbnail = thumbnail.thumbnail() + else: + self.thumbnail = filecontent + + def addObject(self, document, objectname=None): + """ Adds an object (subdocument). The object must be an OpenDocument class + The return value will be the folder in the zipfile the object is stored in + """ + self.childobjects.append(document) + if objectname is None: + document.folder = "%s/Object %d" % (self.folder, len(self.childobjects)) + else: + document.folder = objectname + return ".%s" % document.folder + + def _savePictures(self, object, folder): + hasPictures = False + for arcname, picturerec in list(object.Pictures.items()): + what_it_is, fileobj, mediatype = picturerec + self.manifest.addElement(manifest.FileEntry(fullpath="%s%s" % ( folder ,arcname), mediatype=mediatype)) + hasPictures = True + if what_it_is == IS_FILENAME: + self._z.write(fileobj, arcname, zipfile.ZIP_STORED) + else: + zi = zipfile.ZipInfo(str(arcname), self._now) + zi.compress_type = zipfile.ZIP_STORED + zi.external_attr = UNIXPERMS + self._z.writestr(zi, fileobj) + # According to section 17.7.3 in ODF 1.1, the pictures folder should not have a manifest entry +# if hasPictures: +# self.manifest.addElement(manifest.FileEntry(fullpath="%sPictures/" % folder, mediatype="")) + # Look in subobjects + subobjectnum = 1 + for subobject in object.childobjects: + self._savePictures(subobject,'%sObject %d/' % (folder, subobjectnum)) + subobjectnum += 1 + + def __replaceGenerator(self): + """ Section 3.1.1: The application MUST NOT export the original identifier + belonging to the application that created the document. + """ + for m in self.meta.childNodes[:]: + if m.qname == (METANS, 'generator'): + self.meta.removeChild(m) + self.meta.addElement(meta.Generator(text=TOOLSVERSION)) + + def save(self, outputfile, addsuffix=False): + """ Save the document under the filename. + If the filename is '-' then save to stdout + """ + if outputfile == '-': + outputfp = zipfile.ZipFile(sys.stdout,"w") + else: + if addsuffix: + outputfile = outputfile + odmimetypes.get(self.mimetype,'.xxx') + outputfp = zipfile.ZipFile(outputfile, "w") + self.__zipwrite(outputfp) + outputfp.close() + + def write(self, outputfp): + """ User API to write the ODF file to an open file descriptor + Writes the ZIP format + """ + zipoutputfp = zipfile.ZipFile(outputfp,"w") + self.__zipwrite(zipoutputfp) + + def __zipwrite(self, outputfp): + """ Write the document to an open file pointer + This is where the real work is done + """ + self._z = outputfp + self._now = time.localtime()[:6] + self.manifest = manifest.Manifest() + + # Write mimetype + zi = zipfile.ZipInfo('mimetype', self._now) + zi.compress_type = zipfile.ZIP_STORED + zi.external_attr = UNIXPERMS + self._z.writestr(zi, self.mimetype) + + self._saveXmlObjects(self,"") + + # Write pictures + self._savePictures(self,"") + + # Write the thumbnail + if self.thumbnail is not None: + self.manifest.addElement(manifest.FileEntry(fullpath="Thumbnails/", mediatype='')) + self.manifest.addElement(manifest.FileEntry(fullpath="Thumbnails/thumbnail.png", mediatype='')) + zi = zipfile.ZipInfo("Thumbnails/thumbnail.png", self._now) + zi.compress_type = zipfile.ZIP_DEFLATED + zi.external_attr = UNIXPERMS + self._z.writestr(zi, self.thumbnail) + + # Write any extra files + for op in self._extra: + if op.filename == "META-INF/documentsignatures.xml": continue # Don't save signatures + self.manifest.addElement(manifest.FileEntry(fullpath=op.filename, mediatype=op.mediatype)) + zi = zipfile.ZipInfo(op.filename.encode('utf-8'), self._now) + zi.compress_type = zipfile.ZIP_DEFLATED + zi.external_attr = UNIXPERMS + if op.content is not None: + self._z.writestr(zi, op.content) + # Write manifest + zi = zipfile.ZipInfo("META-INF/manifest.xml", self._now) + zi.compress_type = zipfile.ZIP_DEFLATED + zi.external_attr = UNIXPERMS + self._z.writestr(zi, self.__manifestxml() ) + del self._z + del self._now + del self.manifest + + + def _saveXmlObjects(self, object, folder): + if self == object: + self.manifest.addElement(manifest.FileEntry(fullpath="/", mediatype=object.mimetype)) + else: + self.manifest.addElement(manifest.FileEntry(fullpath=folder, mediatype=object.mimetype)) + # Write styles + self.manifest.addElement(manifest.FileEntry(fullpath="%sstyles.xml" % folder, mediatype="text/xml")) + zi = zipfile.ZipInfo("%sstyles.xml" % folder, self._now) + zi.compress_type = zipfile.ZIP_DEFLATED + zi.external_attr = UNIXPERMS + self._z.writestr(zi, object.stylesxml() ) + + # Write content + self.manifest.addElement(manifest.FileEntry(fullpath="%scontent.xml" % folder, mediatype="text/xml")) + zi = zipfile.ZipInfo("%scontent.xml" % folder, self._now) + zi.compress_type = zipfile.ZIP_DEFLATED + zi.external_attr = UNIXPERMS + self._z.writestr(zi, object.contentxml() ) + + # Write settings + if object.settings.hasChildNodes(): + self.manifest.addElement(manifest.FileEntry(fullpath="%ssettings.xml" % folder, mediatype="text/xml")) + zi = zipfile.ZipInfo("%ssettings.xml" % folder, self._now) + zi.compress_type = zipfile.ZIP_DEFLATED + zi.external_attr = UNIXPERMS + self._z.writestr(zi, object.settingsxml() ) + + # Write meta + if self == object: + self.manifest.addElement(manifest.FileEntry(fullpath="meta.xml", mediatype="text/xml")) + zi = zipfile.ZipInfo("meta.xml", self._now) + zi.compress_type = zipfile.ZIP_DEFLATED + zi.external_attr = UNIXPERMS + self._z.writestr(zi, object.metaxml() ) + + # Write subobjects + subobjectnum = 1 + for subobject in object.childobjects: + self._saveXmlObjects(subobject, '%sObject %d/' % (folder, subobjectnum)) + subobjectnum += 1 + +# Document's DOM methods + def createElement(self, element): + """ Inconvenient interface to create an element, but follows XML-DOM. + Does not allow attributes as argument, therefore can't check grammar. + """ + return element(check_grammar=False) + + def createTextNode(self, data): + """ Method to create a text node """ + return element.Text(data) + + def createCDATASection(self, data): + """ Method to create a CDATA section """ + return element.CDATASection(cdata) + + def getMediaType(self): + """ Returns the media type """ + return self.mimetype + + def getStyleByName(self, name): + """ Finds a style object based on the name """ + ncname = make_NCName(name) + if self._styles_dict == {}: + self.rebuild_caches() + return self._styles_dict.get(ncname, None) + + def getElementsByType(self, element): + """ Gets elements based on the type, which is function from text.py, draw.py etc. """ + obj = element(check_grammar=False) + if self.element_dict == {}: + self.rebuild_caches() + return self.element_dict.get(obj.qname, []) + +# Convenience functions +def OpenDocumentChart(): + """ Creates a chart document """ + doc = OpenDocument('application/vnd.oasis.opendocument.chart') + doc.chart = Chart() + doc.body.addElement(doc.chart) + return doc + +def OpenDocumentDrawing(): + """ Creates a drawing document """ + doc = OpenDocument('application/vnd.oasis.opendocument.graphics') + doc.drawing = Drawing() + doc.body.addElement(doc.drawing) + return doc + +def OpenDocumentImage(): + """ Creates an image document """ + doc = OpenDocument('application/vnd.oasis.opendocument.image') + doc.image = Image() + doc.body.addElement(doc.image) + return doc + +def OpenDocumentPresentation(): + """ Creates a presentation document """ + doc = OpenDocument('application/vnd.oasis.opendocument.presentation') + doc.presentation = Presentation() + doc.body.addElement(doc.presentation) + return doc + +def OpenDocumentSpreadsheet(): + """ Creates a spreadsheet document """ + doc = OpenDocument('application/vnd.oasis.opendocument.spreadsheet') + doc.spreadsheet = Spreadsheet() + doc.body.addElement(doc.spreadsheet) + return doc + +def OpenDocumentText(): + """ Creates a text document """ + doc = OpenDocument('application/vnd.oasis.opendocument.text') + doc.text = Text() + doc.body.addElement(doc.text) + return doc + +def OpenDocumentTextMaster(): + """ Creates a text master document """ + doc = OpenDocument('application/vnd.oasis.opendocument.text-master') + doc.text = Text() + doc.body.addElement(doc.text) + return doc + +def __loadxmlparts(z, manifest, doc, objectpath): + from .load import LoadParser + from xml.sax import make_parser, handler + + for xmlfile in (objectpath+'settings.xml', objectpath+'meta.xml', objectpath+'content.xml', objectpath+'styles.xml'): + if xmlfile not in manifest: + continue + try: + xmlpart = z.read(xmlfile) + doc._parsing = xmlfile + + parser = make_parser() + parser.setFeature(handler.feature_namespaces, 1) + parser.setContentHandler(LoadParser(doc)) + parser.setErrorHandler(handler.ErrorHandler()) + + inpsrc = InputSource() + inpsrc.setByteStream(StringIO(xmlpart)) + parser.parse(inpsrc) + del doc._parsing + except KeyError as v: pass + +def load(odffile): + """ Load an ODF file into memory + Returns a reference to the structure + """ + z = zipfile.ZipFile(odffile) + mimetype = z.read('mimetype') + doc = OpenDocument(mimetype, add_generator=False) + + # Look in the manifest file to see if which of the four files there are + manifestpart = z.read('META-INF/manifest.xml') + manifest = manifestlist(manifestpart) + __loadxmlparts(z, manifest, doc, '') + for mentry,mvalue in list(manifest.items()): + if mentry[:9] == "Pictures/" and len(mentry) > 9: + doc.addPicture(mvalue['full-path'], mvalue['media-type'], z.read(mentry)) + elif mentry == "Thumbnails/thumbnail.png": + doc.addThumbnail(z.read(mentry)) + elif mentry in ('settings.xml', 'meta.xml', 'content.xml', 'styles.xml'): + pass + # Load subobjects into structure + elif mentry[:7] == "Object " and len(mentry) < 11 and mentry[-1] == "/": + subdoc = OpenDocument(mvalue['media-type'], add_generator=False) + doc.addObject(subdoc, "/" + mentry[:-1]) + __loadxmlparts(z, manifest, subdoc, mentry) + elif mentry[:7] == "Object ": + pass # Don't load subobjects as opaque objects + else: + if mvalue['full-path'][-1] == '/': + doc._extra.append(OpaqueObject(mvalue['full-path'], mvalue['media-type'], None)) + else: + doc._extra.append(OpaqueObject(mvalue['full-path'], mvalue['media-type'], z.read(mentry))) + # Add the SUN junk here to the struct somewhere + # It is cached data, so it can be out-of-date + z.close() + b = doc.getElementsByType(Body) + if mimetype[:39] == 'application/vnd.oasis.opendocument.text': + doc.text = b[0].firstChild + elif mimetype[:43] == 'application/vnd.oasis.opendocument.graphics': + doc.graphics = b[0].firstChild + elif mimetype[:47] == 'application/vnd.oasis.opendocument.presentation': + doc.presentation = b[0].firstChild + elif mimetype[:46] == 'application/vnd.oasis.opendocument.spreadsheet': + doc.spreadsheet = b[0].firstChild + elif mimetype[:40] == 'application/vnd.oasis.opendocument.chart': + doc.chart = b[0].firstChild + elif mimetype[:40] == 'application/vnd.oasis.opendocument.image': + doc.image = b[0].firstChild + elif mimetype[:42] == 'application/vnd.oasis.opendocument.formula': + doc.formula = b[0].firstChild + return doc + +# vim: set expandtab sw=4 : diff --git a/tablib/packages/odf3/presentation.py b/tablib/packages/odf3/presentation.py new file mode 100644 index 0000000..71c3d83 --- /dev/null +++ b/tablib/packages/odf3/presentation.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from .namespaces import PRESENTATIONNS +from .element import Element + +# ODF 1.0 section 9.6 and 9.7 +# Autogenerated +def AnimationGroup(**args): + return Element(qname = (PRESENTATIONNS,'animation-group'), **args) + +def Animations(**args): + return Element(qname = (PRESENTATIONNS,'animations'), **args) + +def DateTime(**args): + return Element(qname = (PRESENTATIONNS,'date-time'), **args) + +def DateTimeDecl(**args): + return Element(qname = (PRESENTATIONNS,'date-time-decl'), **args) + +def Dim(**args): + return Element(qname = (PRESENTATIONNS,'dim'), **args) + +def EventListener(**args): + return Element(qname = (PRESENTATIONNS,'event-listener'), **args) + +def Footer(**args): + return Element(qname = (PRESENTATIONNS,'footer'), **args) + +def FooterDecl(**args): + return Element(qname = (PRESENTATIONNS,'footer-decl'), **args) + +def Header(**args): + return Element(qname = (PRESENTATIONNS,'header'), **args) + +def HeaderDecl(**args): + return Element(qname = (PRESENTATIONNS,'header-decl'), **args) + +def HideShape(**args): + return Element(qname = (PRESENTATIONNS,'hide-shape'), **args) + +def HideText(**args): + return Element(qname = (PRESENTATIONNS,'hide-text'), **args) + +def Notes(**args): + return Element(qname = (PRESENTATIONNS,'notes'), **args) + +def Placeholder(**args): + return Element(qname = (PRESENTATIONNS,'placeholder'), **args) + +def Play(**args): + return Element(qname = (PRESENTATIONNS,'play'), **args) + +def Settings(**args): + return Element(qname = (PRESENTATIONNS,'settings'), **args) + +def Show(**args): + return Element(qname = (PRESENTATIONNS,'show'), **args) + +def ShowShape(**args): + return Element(qname = (PRESENTATIONNS,'show-shape'), **args) + +def ShowText(**args): + return Element(qname = (PRESENTATIONNS,'show-text'), **args) + +def Sound(**args): + return Element(qname = (PRESENTATIONNS,'sound'), **args) + diff --git a/tablib/packages/odf3/script.py b/tablib/packages/odf3/script.py new file mode 100644 index 0000000..210e4eb --- /dev/null +++ b/tablib/packages/odf3/script.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from .namespaces import SCRIPTNS +from .element import Element + +# ODF 1.0 section 12.4.1 +# The element binds an event to a macro. + +# Autogenerated +def EventListener(**args): + return Element(qname = (SCRIPTNS,'event-listener'), **args) + diff --git a/tablib/packages/odf3/style.py b/tablib/packages/odf3/style.py new file mode 100644 index 0000000..ebaf3fb --- /dev/null +++ b/tablib/packages/odf3/style.py @@ -0,0 +1,148 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from .namespaces import STYLENS +from .element import Element + +def StyleElement(**args): + e = Element(**args) + if args.get('check_grammar', True) == True: + if 'displayname' not in args: + e.setAttrNS(STYLENS,'display-name', args.get('name')) + return e + +# Autogenerated +def BackgroundImage(**args): + return Element(qname = (STYLENS,'background-image'), **args) + +def ChartProperties(**args): + return Element(qname = (STYLENS,'chart-properties'), **args) + +def Column(**args): + return Element(qname = (STYLENS,'column'), **args) + +def ColumnSep(**args): + return Element(qname = (STYLENS,'column-sep'), **args) + +def Columns(**args): + return Element(qname = (STYLENS,'columns'), **args) + +def DefaultStyle(**args): + return Element(qname = (STYLENS,'default-style'), **args) + +def DrawingPageProperties(**args): + return Element(qname = (STYLENS,'drawing-page-properties'), **args) + +def DropCap(**args): + return Element(qname = (STYLENS,'drop-cap'), **args) + +def FontFace(**args): + return Element(qname = (STYLENS,'font-face'), **args) + +def Footer(**args): + return Element(qname = (STYLENS,'footer'), **args) + +def FooterLeft(**args): + return Element(qname = (STYLENS,'footer-left'), **args) + +def FooterStyle(**args): + return Element(qname = (STYLENS,'footer-style'), **args) + +def FootnoteSep(**args): + return Element(qname = (STYLENS,'footnote-sep'), **args) + +def GraphicProperties(**args): + return Element(qname = (STYLENS,'graphic-properties'), **args) + +def HandoutMaster(**args): + return Element(qname = (STYLENS,'handout-master'), **args) + +def Header(**args): + return Element(qname = (STYLENS,'header'), **args) + +def HeaderFooterProperties(**args): + return Element(qname = (STYLENS,'header-footer-properties'), **args) + +def HeaderLeft(**args): + return Element(qname = (STYLENS,'header-left'), **args) + +def HeaderStyle(**args): + return Element(qname = (STYLENS,'header-style'), **args) + +def ListLevelProperties(**args): + return Element(qname = (STYLENS,'list-level-properties'), **args) + +def Map(**args): + return Element(qname = (STYLENS,'map'), **args) + +def MasterPage(**args): + return StyleElement(qname = (STYLENS,'master-page'), **args) + +def PageLayout(**args): + return Element(qname = (STYLENS,'page-layout'), **args) + +def PageLayoutProperties(**args): + return Element(qname = (STYLENS,'page-layout-properties'), **args) + +def ParagraphProperties(**args): + return Element(qname = (STYLENS,'paragraph-properties'), **args) + +def PresentationPageLayout(**args): + return StyleElement(qname = (STYLENS,'presentation-page-layout'), **args) + +def RegionCenter(**args): + return Element(qname = (STYLENS,'region-center'), **args) + +def RegionLeft(**args): + return Element(qname = (STYLENS,'region-left'), **args) + +def RegionRight(**args): + return Element(qname = (STYLENS,'region-right'), **args) + +def RubyProperties(**args): + return Element(qname = (STYLENS,'ruby-properties'), **args) + +def SectionProperties(**args): + return Element(qname = (STYLENS,'section-properties'), **args) + +def Style(**args): + return StyleElement(qname = (STYLENS,'style'), **args) + +def TabStop(**args): + return Element(qname = (STYLENS,'tab-stop'), **args) + +def TabStops(**args): + return Element(qname = (STYLENS,'tab-stops'), **args) + +def TableCellProperties(**args): + return Element(qname = (STYLENS,'table-cell-properties'), **args) + +def TableColumnProperties(**args): + return Element(qname = (STYLENS,'table-column-properties'), **args) + +def TableProperties(**args): + return Element(qname = (STYLENS,'table-properties'), **args) + +def TableRowProperties(**args): + return Element(qname = (STYLENS,'table-row-properties'), **args) + +def TextProperties(**args): + return Element(qname = (STYLENS,'text-properties'), **args) + diff --git a/tablib/packages/odf3/svg.py b/tablib/packages/odf3/svg.py new file mode 100644 index 0000000..1881dbf --- /dev/null +++ b/tablib/packages/odf3/svg.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from .namespaces import SVGNS +from .element import Element +from .draw import DrawElement + +# Autogenerated +def DefinitionSrc(**args): + return Element(qname = (SVGNS,'definition-src'), **args) + +def Desc(**args): + return Element(qname = (SVGNS,'desc'), **args) + +def FontFaceFormat(**args): + return Element(qname = (SVGNS,'font-face-format'), **args) + +def FontFaceName(**args): + return Element(qname = (SVGNS,'font-face-name'), **args) + +def FontFaceSrc(**args): + return Element(qname = (SVGNS,'font-face-src'), **args) + +def FontFaceUri(**args): + return Element(qname = (SVGNS,'font-face-uri'), **args) + +def Lineargradient(**args): + return DrawElement(qname = (SVGNS,'linearGradient'), **args) + +def Radialgradient(**args): + return DrawElement(qname = (SVGNS,'radialGradient'), **args) + +def Stop(**args): + return Element(qname = (SVGNS,'stop'), **args) + +def Title(**args): + return Element(qname = (SVGNS,'title'), **args) diff --git a/tablib/packages/odf3/table.py b/tablib/packages/odf3/table.py new file mode 100644 index 0000000..5d27881 --- /dev/null +++ b/tablib/packages/odf3/table.py @@ -0,0 +1,307 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from .namespaces import TABLENS +from .element import Element + + +# Autogenerated +def Body(**args): + return Element(qname = (TABLENS,'body'), **args) + +def CalculationSettings(**args): + return Element(qname = (TABLENS,'calculation-settings'), **args) + +def CellAddress(**args): + return Element(qname = (TABLENS,'cell-address'), **args) + +def CellContentChange(**args): + return Element(qname = (TABLENS,'cell-content-change'), **args) + +def CellContentDeletion(**args): + return Element(qname = (TABLENS,'cell-content-deletion'), **args) + +def CellRangeSource(**args): + return Element(qname = (TABLENS,'cell-range-source'), **args) + +def ChangeDeletion(**args): + return Element(qname = (TABLENS,'change-deletion'), **args) + +def ChangeTrackTableCell(**args): + return Element(qname = (TABLENS,'change-track-table-cell'), **args) + +def Consolidation(**args): + return Element(qname = (TABLENS,'consolidation'), **args) + +def ContentValidation(**args): + return Element(qname = (TABLENS,'content-validation'), **args) + +def ContentValidations(**args): + return Element(qname = (TABLENS,'content-validations'), **args) + +def CoveredTableCell(**args): + return Element(qname = (TABLENS,'covered-table-cell'), **args) + +def CutOffs(**args): + return Element(qname = (TABLENS,'cut-offs'), **args) + +def DataPilotDisplayInfo(**args): + return Element(qname = (TABLENS,'data-pilot-display-info'), **args) + +def DataPilotField(**args): + return Element(qname = (TABLENS,'data-pilot-field'), **args) + +def DataPilotFieldReference(**args): + return Element(qname = (TABLENS,'data-pilot-field-reference'), **args) + +def DataPilotGroup(**args): + return Element(qname = (TABLENS,'data-pilot-group'), **args) + +def DataPilotGroupMember(**args): + return Element(qname = (TABLENS,'data-pilot-group-member'), **args) + +def DataPilotGroups(**args): + return Element(qname = (TABLENS,'data-pilot-groups'), **args) + +def DataPilotLayoutInfo(**args): + return Element(qname = (TABLENS,'data-pilot-layout-info'), **args) + +def DataPilotLevel(**args): + return Element(qname = (TABLENS,'data-pilot-level'), **args) + +def DataPilotMember(**args): + return Element(qname = (TABLENS,'data-pilot-member'), **args) + +def DataPilotMembers(**args): + return Element(qname = (TABLENS,'data-pilot-members'), **args) + +def DataPilotSortInfo(**args): + return Element(qname = (TABLENS,'data-pilot-sort-info'), **args) + +def DataPilotSubtotal(**args): + return Element(qname = (TABLENS,'data-pilot-subtotal'), **args) + +def DataPilotSubtotals(**args): + return Element(qname = (TABLENS,'data-pilot-subtotals'), **args) + +def DataPilotTable(**args): + return Element(qname = (TABLENS,'data-pilot-table'), **args) + +def DataPilotTables(**args): + return Element(qname = (TABLENS,'data-pilot-tables'), **args) + +def DatabaseRange(**args): + return Element(qname = (TABLENS,'database-range'), **args) + +def DatabaseRanges(**args): + return Element(qname = (TABLENS,'database-ranges'), **args) + +def DatabaseSourceQuery(**args): + return Element(qname = (TABLENS,'database-source-query'), **args) + +def DatabaseSourceSql(**args): + return Element(qname = (TABLENS,'database-source-sql'), **args) + +def DatabaseSourceTable(**args): + return Element(qname = (TABLENS,'database-source-table'), **args) + +def DdeLink(**args): + return Element(qname = (TABLENS,'dde-link'), **args) + +def DdeLinks(**args): + return Element(qname = (TABLENS,'dde-links'), **args) + +def Deletion(**args): + return Element(qname = (TABLENS,'deletion'), **args) + +def Deletions(**args): + return Element(qname = (TABLENS,'deletions'), **args) + +def Dependencies(**args): + return Element(qname = (TABLENS,'dependencies'), **args) + +def Dependency(**args): + return Element(qname = (TABLENS,'dependency'), **args) + +def Detective(**args): + return Element(qname = (TABLENS,'detective'), **args) + +def ErrorMacro(**args): + return Element(qname = (TABLENS,'error-macro'), **args) + +def ErrorMessage(**args): + return Element(qname = (TABLENS,'error-message'), **args) + +def EvenColumns(**args): + return Element(qname = (TABLENS,'even-columns'), **args) + +def EvenRows(**args): + return Element(qname = (TABLENS,'even-rows'), **args) + +def Filter(**args): + return Element(qname = (TABLENS,'filter'), **args) + +def FilterAnd(**args): + return Element(qname = (TABLENS,'filter-and'), **args) + +def FilterCondition(**args): + return Element(qname = (TABLENS,'filter-condition'), **args) + +def FilterOr(**args): + return Element(qname = (TABLENS,'filter-or'), **args) + +def FirstColumn(**args): + return Element(qname = (TABLENS,'first-column'), **args) + +def FirstRow(**args): + return Element(qname = (TABLENS,'first-row'), **args) + +def HelpMessage(**args): + return Element(qname = (TABLENS,'help-message'), **args) + +def HighlightedRange(**args): + return Element(qname = (TABLENS,'highlighted-range'), **args) + +def Insertion(**args): + return Element(qname = (TABLENS,'insertion'), **args) + +def InsertionCutOff(**args): + return Element(qname = (TABLENS,'insertion-cut-off'), **args) + +def Iteration(**args): + return Element(qname = (TABLENS,'iteration'), **args) + +def LabelRange(**args): + return Element(qname = (TABLENS,'label-range'), **args) + +def LabelRanges(**args): + return Element(qname = (TABLENS,'label-ranges'), **args) + +def LastColumn(**args): + return Element(qname = (TABLENS,'last-column'), **args) + +def LastRow(**args): + return Element(qname = (TABLENS,'last-row'), **args) + +def Movement(**args): + return Element(qname = (TABLENS,'movement'), **args) + +def MovementCutOff(**args): + return Element(qname = (TABLENS,'movement-cut-off'), **args) + +def NamedExpression(**args): + return Element(qname = (TABLENS,'named-expression'), **args) + +def NamedExpressions(**args): + return Element(qname = (TABLENS,'named-expressions'), **args) + +def NamedRange(**args): + return Element(qname = (TABLENS,'named-range'), **args) + +def NullDate(**args): + return Element(qname = (TABLENS,'null-date'), **args) + +def OddColumns(**args): + return Element(qname = (TABLENS,'odd-columns'), **args) + +def OddRows(**args): + return Element(qname = (TABLENS,'odd-rows'), **args) + +def Operation(**args): + return Element(qname = (TABLENS,'operation'), **args) + +def Previous(**args): + return Element(qname = (TABLENS,'previous'), **args) + +def Scenario(**args): + return Element(qname = (TABLENS,'scenario'), **args) + +def Shapes(**args): + return Element(qname = (TABLENS,'shapes'), **args) + +def Sort(**args): + return Element(qname = (TABLENS,'sort'), **args) + +def SortBy(**args): + return Element(qname = (TABLENS,'sort-by'), **args) + +def SortGroups(**args): + return Element(qname = (TABLENS,'sort-groups'), **args) + +def SourceCellRange(**args): + return Element(qname = (TABLENS,'source-cell-range'), **args) + +def SourceRangeAddress(**args): + return Element(qname = (TABLENS,'source-range-address'), **args) + +def SourceService(**args): + return Element(qname = (TABLENS,'source-service'), **args) + +def SubtotalField(**args): + return Element(qname = (TABLENS,'subtotal-field'), **args) + +def SubtotalRule(**args): + return Element(qname = (TABLENS,'subtotal-rule'), **args) + +def SubtotalRules(**args): + return Element(qname = (TABLENS,'subtotal-rules'), **args) + +def Table(**args): + return Element(qname = (TABLENS,'table'), **args) + +def TableCell(**args): + return Element(qname = (TABLENS,'table-cell'), **args) + +def TableColumn(**args): + return Element(qname = (TABLENS,'table-column'), **args) + +def TableColumnGroup(**args): + return Element(qname = (TABLENS,'table-column-group'), **args) + +def TableColumns(**args): + return Element(qname = (TABLENS,'table-columns'), **args) + +def TableHeaderColumns(**args): + return Element(qname = (TABLENS,'table-header-columns'), **args) + +def TableHeaderRows(**args): + return Element(qname = (TABLENS,'table-header-rows'), **args) + +def TableRow(**args): + return Element(qname = (TABLENS,'table-row'), **args) + +def TableRowGroup(**args): + return Element(qname = (TABLENS,'table-row-group'), **args) + +def TableRows(**args): + return Element(qname = (TABLENS,'table-rows'), **args) + +def TableSource(**args): + return Element(qname = (TABLENS,'table-source'), **args) + +def TableTemplate(**args): + return Element(qname = (TABLENS,'table-template'), **args) + +def TargetRangeAddress(**args): + return Element(qname = (TABLENS,'target-range-address'), **args) + +def TrackedChanges(**args): + return Element(qname = (TABLENS,'tracked-changes'), **args) + diff --git a/tablib/packages/odf3/teletype.py b/tablib/packages/odf3/teletype.py new file mode 100644 index 0000000..8dc5a57 --- /dev/null +++ b/tablib/packages/odf3/teletype.py @@ -0,0 +1,137 @@ +# -*- coding: utf-8 -*- +# +# Create and extract text from ODF, handling whitespace correctly. +# Copyright (C) 2008 J. David Eisenberg +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + +""" +Class for handling whitespace properly in OpenDocument. + +While it is possible to use getTextContent() and setTextContent() +to extract or create ODF content, these won't extract or create +the appropriate , , or +elements. This module takes care of that problem. +""" + +from odf.element import Node +import odf.opendocument +from odf.text import S,LineBreak,Tab + +class WhitespaceText(object): + + def __init__(self): + self.textBuffer = [] + self.spaceCount = 0 + + def addTextToElement(self, odfElement, s): + """ Process an input string, inserting + elements for '\t', + elements for '\n', and + elements for runs of more than one blank. + These will be added to the given element. + """ + i = 0 + ch = ' ' + + # When we encounter a tab or newline, we can immediately + # dump any accumulated text and then emit the appropriate + # ODF element. + # + # When we encounter a space, we add it to the text buffer, + # and then collect more spaces. If there are more spaces + # after the first one, we dump the text buffer and then + # then emit the appropriate element. + + while i < len(s): + ch = s[i] + if ch == '\t': + self._emitTextBuffer(odfElement) + odfElement.addElement(Tab()) + i += 1 + elif ch == '\n': + self._emitTextBuffer(odfElement); + odfElement.addElement(LineBreak()) + i += 1 + elif ch == ' ': + self.textBuffer.append(' ') + i += 1 + self.spaceCount = 0 + while i < len(s) and (s[i] == ' '): + self.spaceCount += 1 + i += 1 + if self.spaceCount > 0: + self._emitTextBuffer(odfElement) + self._emitSpaces(odfElement) + else: + self.textBuffer.append(ch) + i += 1 + + self._emitTextBuffer(odfElement) + + def _emitTextBuffer(self, odfElement): + """ Creates a Text Node whose contents are the current textBuffer. + Side effect: clears the text buffer. + """ + if len(self.textBuffer) > 0: + odfElement.addText(''.join(self.textBuffer)) + self.textBuffer = [] + + + def _emitSpaces(self, odfElement): + """ Creates a element for the current spaceCount. + Side effect: sets spaceCount back to zero + """ + if self.spaceCount > 0: + spaceElement = S(c=self.spaceCount) + odfElement.addElement(spaceElement) + self.spaceCount = 0 + +def addTextToElement(odfElement, s): + wst = WhitespaceText() + wst.addTextToElement(odfElement, s) + +def extractText(odfElement): + """ Extract text content from an Element, with whitespace represented + properly. Returns the text, with tabs, spaces, and newlines + correctly evaluated. This method recursively descends through the + children of the given element, accumulating text and "unwrapping" + , , and elements along the way. + """ + result = []; + + if len(odfElement.childNodes) != 0: + for child in odfElement.childNodes: + if child.nodeType == Node.TEXT_NODE: + result.append(child.data) + elif child.nodeType == Node.ELEMENT_NODE: + subElement = child + tagName = subElement.qname; + if tagName == ("urn:oasis:names:tc:opendocument:xmlns:text:1.0", "line-break"): + result.append("\n") + elif tagName == ("urn:oasis:names:tc:opendocument:xmlns:text:1.0", "tab"): + result.append("\t") + elif tagName == ("urn:oasis:names:tc:opendocument:xmlns:text:1.0", "s"): + c = subElement.getAttribute('c') + if c: + spaceCount = int(c) + else: + spaceCount = 1 + + result.append(" " * spaceCount) + else: + result.append(extractText(subElement)) + return ''.join(result) diff --git a/tablib/packages/odf3/text.py b/tablib/packages/odf3/text.py new file mode 100644 index 0000000..9191fb7 --- /dev/null +++ b/tablib/packages/odf3/text.py @@ -0,0 +1,562 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from .namespaces import TEXTNS +from .element import Element +from .style import StyleElement + +# Autogenerated +def A(**args): + return Element(qname = (TEXTNS,'a'), **args) + +def AlphabeticalIndex(**args): + return Element(qname = (TEXTNS,'alphabetical-index'), **args) + +def AlphabeticalIndexAutoMarkFile(**args): + return Element(qname = (TEXTNS,'alphabetical-index-auto-mark-file'), **args) + +def AlphabeticalIndexEntryTemplate(**args): + return Element(qname = (TEXTNS,'alphabetical-index-entry-template'), **args) + +def AlphabeticalIndexMark(**args): + return Element(qname = (TEXTNS,'alphabetical-index-mark'), **args) + +def AlphabeticalIndexMarkEnd(**args): + return Element(qname = (TEXTNS,'alphabetical-index-mark-end'), **args) + +def AlphabeticalIndexMarkStart(**args): + return Element(qname = (TEXTNS,'alphabetical-index-mark-start'), **args) + +def AlphabeticalIndexSource(**args): + return Element(qname = (TEXTNS,'alphabetical-index-source'), **args) + +def AuthorInitials(**args): + return Element(qname = (TEXTNS,'author-initials'), **args) + +def AuthorName(**args): + return Element(qname = (TEXTNS,'author-name'), **args) + +def Bibliography(**args): + return Element(qname = (TEXTNS,'bibliography'), **args) + +def BibliographyConfiguration(**args): + return Element(qname = (TEXTNS,'bibliography-configuration'), **args) + +def BibliographyEntryTemplate(**args): + return Element(qname = (TEXTNS,'bibliography-entry-template'), **args) + +def BibliographyMark(**args): + return Element(qname = (TEXTNS,'bibliography-mark'), **args) + +def BibliographySource(**args): + return Element(qname = (TEXTNS,'bibliography-source'), **args) + +def Bookmark(**args): + return Element(qname = (TEXTNS,'bookmark'), **args) + +def BookmarkEnd(**args): + return Element(qname = (TEXTNS,'bookmark-end'), **args) + +def BookmarkRef(**args): + return Element(qname = (TEXTNS,'bookmark-ref'), **args) + +def BookmarkStart(**args): + return Element(qname = (TEXTNS,'bookmark-start'), **args) + +def Change(**args): + return Element(qname = (TEXTNS,'change'), **args) + +def ChangeEnd(**args): + return Element(qname = (TEXTNS,'change-end'), **args) + +def ChangeStart(**args): + return Element(qname = (TEXTNS,'change-start'), **args) + +def ChangedRegion(**args): + return Element(qname = (TEXTNS,'changed-region'), **args) + +def Chapter(**args): + return Element(qname = (TEXTNS,'chapter'), **args) + +def CharacterCount(**args): + return Element(qname = (TEXTNS,'character-count'), **args) + +def ConditionalText(**args): + return Element(qname = (TEXTNS,'conditional-text'), **args) + +def CreationDate(**args): + return Element(qname = (TEXTNS,'creation-date'), **args) + +def CreationTime(**args): + return Element(qname = (TEXTNS,'creation-time'), **args) + +def Creator(**args): + return Element(qname = (TEXTNS,'creator'), **args) + +def DatabaseDisplay(**args): + return Element(qname = (TEXTNS,'database-display'), **args) + +def DatabaseName(**args): + return Element(qname = (TEXTNS,'database-name'), **args) + +def DatabaseNext(**args): + return Element(qname = (TEXTNS,'database-next'), **args) + +def DatabaseRowNumber(**args): + return Element(qname = (TEXTNS,'database-row-number'), **args) + +def DatabaseRowSelect(**args): + return Element(qname = (TEXTNS,'database-row-select'), **args) + +def Date(**args): + return Element(qname = (TEXTNS,'date'), **args) + +def DdeConnection(**args): + return Element(qname = (TEXTNS,'dde-connection'), **args) + +def DdeConnectionDecl(**args): + return Element(qname = (TEXTNS,'dde-connection-decl'), **args) + +def DdeConnectionDecls(**args): + return Element(qname = (TEXTNS,'dde-connection-decls'), **args) + +def Deletion(**args): + return Element(qname = (TEXTNS,'deletion'), **args) + +def Description(**args): + return Element(qname = (TEXTNS,'description'), **args) + +def EditingCycles(**args): + return Element(qname = (TEXTNS,'editing-cycles'), **args) + +def EditingDuration(**args): + return Element(qname = (TEXTNS,'editing-duration'), **args) + +def ExecuteMacro(**args): + return Element(qname = (TEXTNS,'execute-macro'), **args) + +def Expression(**args): + return Element(qname = (TEXTNS,'expression'), **args) + +def FileName(**args): + return Element(qname = (TEXTNS,'file-name'), **args) + +def FormatChange(**args): + return Element(qname = (TEXTNS,'format-change'), **args) + +def H(**args): + return Element(qname = (TEXTNS, 'h'), **args) + +def HiddenParagraph(**args): + return Element(qname = (TEXTNS,'hidden-paragraph'), **args) + +def HiddenText(**args): + return Element(qname = (TEXTNS,'hidden-text'), **args) + +def IllustrationIndex(**args): + return Element(qname = (TEXTNS,'illustration-index'), **args) + +def IllustrationIndexEntryTemplate(**args): + return Element(qname = (TEXTNS,'illustration-index-entry-template'), **args) + +def IllustrationIndexSource(**args): + return Element(qname = (TEXTNS,'illustration-index-source'), **args) + +def ImageCount(**args): + return Element(qname = (TEXTNS,'image-count'), **args) + +def IndexBody(**args): + return Element(qname = (TEXTNS,'index-body'), **args) + +def IndexEntryBibliography(**args): + return Element(qname = (TEXTNS,'index-entry-bibliography'), **args) + +def IndexEntryChapter(**args): + return Element(qname = (TEXTNS,'index-entry-chapter'), **args) + +def IndexEntryLinkEnd(**args): + return Element(qname = (TEXTNS,'index-entry-link-end'), **args) + +def IndexEntryLinkStart(**args): + return Element(qname = (TEXTNS,'index-entry-link-start'), **args) + +def IndexEntryPageNumber(**args): + return Element(qname = (TEXTNS,'index-entry-page-number'), **args) + +def IndexEntrySpan(**args): + return Element(qname = (TEXTNS,'index-entry-span'), **args) + +def IndexEntryTabStop(**args): + return Element(qname = (TEXTNS,'index-entry-tab-stop'), **args) + +def IndexEntryText(**args): + return Element(qname = (TEXTNS,'index-entry-text'), **args) + +def IndexSourceStyle(**args): + return Element(qname = (TEXTNS,'index-source-style'), **args) + +def IndexSourceStyles(**args): + return Element(qname = (TEXTNS,'index-source-styles'), **args) + +def IndexTitle(**args): + return Element(qname = (TEXTNS,'index-title'), **args) + +def IndexTitleTemplate(**args): + return Element(qname = (TEXTNS,'index-title-template'), **args) + +def InitialCreator(**args): + return Element(qname = (TEXTNS,'initial-creator'), **args) + +def Insertion(**args): + return Element(qname = (TEXTNS,'insertion'), **args) + +def Keywords(**args): + return Element(qname = (TEXTNS,'keywords'), **args) + +def LineBreak(**args): + return Element(qname = (TEXTNS,'line-break'), **args) + +def LinenumberingConfiguration(**args): + return Element(qname = (TEXTNS,'linenumbering-configuration'), **args) + +def LinenumberingSeparator(**args): + return Element(qname = (TEXTNS,'linenumbering-separator'), **args) + +def List(**args): + return Element(qname = (TEXTNS,'list'), **args) + +def ListHeader(**args): + return Element(qname = (TEXTNS,'list-header'), **args) + +def ListItem(**args): + return Element(qname = (TEXTNS,'list-item'), **args) + +def ListLevelStyleBullet(**args): + return Element(qname = (TEXTNS,'list-level-style-bullet'), **args) + +def ListLevelStyleImage(**args): + return Element(qname = (TEXTNS,'list-level-style-image'), **args) + +def ListLevelStyleNumber(**args): + return Element(qname = (TEXTNS,'list-level-style-number'), **args) + +def ListStyle(**args): + return StyleElement(qname = (TEXTNS,'list-style'), **args) + +def Measure(**args): + return Element(qname = (TEXTNS,'measure'), **args) + +def ModificationDate(**args): + return Element(qname = (TEXTNS,'modification-date'), **args) + +def ModificationTime(**args): + return Element(qname = (TEXTNS,'modification-time'), **args) + +def Note(**args): + return Element(qname = (TEXTNS,'note'), **args) + +def NoteBody(**args): + return Element(qname = (TEXTNS,'note-body'), **args) + +def NoteCitation(**args): + return Element(qname = (TEXTNS,'note-citation'), **args) + +def NoteContinuationNoticeBackward(**args): + return Element(qname = (TEXTNS,'note-continuation-notice-backward'), **args) + +def NoteContinuationNoticeForward(**args): + return Element(qname = (TEXTNS,'note-continuation-notice-forward'), **args) + +def NoteRef(**args): + return Element(qname = (TEXTNS,'note-ref'), **args) + +def NotesConfiguration(**args): + return Element(qname = (TEXTNS,'notes-configuration'), **args) + +def Number(**args): + return Element(qname = (TEXTNS,'number'), **args) + +def NumberedParagraph(**args): + return Element(qname = (TEXTNS,'numbered-paragraph'), **args) + +def ObjectCount(**args): + return Element(qname = (TEXTNS,'object-count'), **args) + +def ObjectIndex(**args): + return Element(qname = (TEXTNS,'object-index'), **args) + +def ObjectIndexEntryTemplate(**args): + return Element(qname = (TEXTNS,'object-index-entry-template'), **args) + +def ObjectIndexSource(**args): + return Element(qname = (TEXTNS,'object-index-source'), **args) + +def OutlineLevelStyle(**args): + return Element(qname = (TEXTNS,'outline-level-style'), **args) + +def OutlineStyle(**args): + return Element(qname = (TEXTNS,'outline-style'), **args) + +def P(**args): + return Element(qname = (TEXTNS, 'p'), **args) + +def Page(**args): + return Element(qname = (TEXTNS,'page'), **args) + +def PageContinuation(**args): + return Element(qname = (TEXTNS,'page-continuation'), **args) + +def PageCount(**args): + return Element(qname = (TEXTNS,'page-count'), **args) + +def PageNumber(**args): + return Element(qname = (TEXTNS,'page-number'), **args) + +def PageSequence(**args): + return Element(qname = (TEXTNS,'page-sequence'), **args) + +def PageVariableGet(**args): + return Element(qname = (TEXTNS,'page-variable-get'), **args) + +def PageVariableSet(**args): + return Element(qname = (TEXTNS,'page-variable-set'), **args) + +def ParagraphCount(**args): + return Element(qname = (TEXTNS,'paragraph-count'), **args) + +def Placeholder(**args): + return Element(qname = (TEXTNS,'placeholder'), **args) + +def PrintDate(**args): + return Element(qname = (TEXTNS,'print-date'), **args) + +def PrintTime(**args): + return Element(qname = (TEXTNS,'print-time'), **args) + +def PrintedBy(**args): + return Element(qname = (TEXTNS,'printed-by'), **args) + +def ReferenceMark(**args): + return Element(qname = (TEXTNS,'reference-mark'), **args) + +def ReferenceMarkEnd(**args): + return Element(qname = (TEXTNS,'reference-mark-end'), **args) + +def ReferenceMarkStart(**args): + return Element(qname = (TEXTNS,'reference-mark-start'), **args) + +def ReferenceRef(**args): + return Element(qname = (TEXTNS,'reference-ref'), **args) + +def Ruby(**args): + return Element(qname = (TEXTNS,'ruby'), **args) + +def RubyBase(**args): + return Element(qname = (TEXTNS,'ruby-base'), **args) + +def RubyText(**args): + return Element(qname = (TEXTNS,'ruby-text'), **args) + +def S(**args): + return Element(qname = (TEXTNS,'s'), **args) + +def Script(**args): + return Element(qname = (TEXTNS,'script'), **args) + +def Section(**args): + return Element(qname = (TEXTNS,'section'), **args) + +def SectionSource(**args): + return Element(qname = (TEXTNS,'section-source'), **args) + +def SenderCity(**args): + return Element(qname = (TEXTNS,'sender-city'), **args) + +def SenderCompany(**args): + return Element(qname = (TEXTNS,'sender-company'), **args) + +def SenderCountry(**args): + return Element(qname = (TEXTNS,'sender-country'), **args) + +def SenderEmail(**args): + return Element(qname = (TEXTNS,'sender-email'), **args) + +def SenderFax(**args): + return Element(qname = (TEXTNS,'sender-fax'), **args) + +def SenderFirstname(**args): + return Element(qname = (TEXTNS,'sender-firstname'), **args) + +def SenderInitials(**args): + return Element(qname = (TEXTNS,'sender-initials'), **args) + +def SenderLastname(**args): + return Element(qname = (TEXTNS,'sender-lastname'), **args) + +def SenderPhonePrivate(**args): + return Element(qname = (TEXTNS,'sender-phone-private'), **args) + +def SenderPhoneWork(**args): + return Element(qname = (TEXTNS,'sender-phone-work'), **args) + +def SenderPosition(**args): + return Element(qname = (TEXTNS,'sender-position'), **args) + +def SenderPostalCode(**args): + return Element(qname = (TEXTNS,'sender-postal-code'), **args) + +def SenderStateOrProvince(**args): + return Element(qname = (TEXTNS,'sender-state-or-province'), **args) + +def SenderStreet(**args): + return Element(qname = (TEXTNS,'sender-street'), **args) + +def SenderTitle(**args): + return Element(qname = (TEXTNS,'sender-title'), **args) + +def Sequence(**args): + return Element(qname = (TEXTNS,'sequence'), **args) + +def SequenceDecl(**args): + return Element(qname = (TEXTNS,'sequence-decl'), **args) + +def SequenceDecls(**args): + return Element(qname = (TEXTNS,'sequence-decls'), **args) + +def SequenceRef(**args): + return Element(qname = (TEXTNS,'sequence-ref'), **args) + +def SheetName(**args): + return Element(qname = (TEXTNS,'sheet-name'), **args) + +def SoftPageBreak(**args): + return Element(qname = (TEXTNS,'soft-page-break'), **args) + +def SortKey(**args): + return Element(qname = (TEXTNS,'sort-key'), **args) + +def Span(**args): + return Element(qname = (TEXTNS,'span'), **args) + +def Subject(**args): + return Element(qname = (TEXTNS,'subject'), **args) + +def Tab(**args): + return Element(qname = (TEXTNS,'tab'), **args) + +def TableCount(**args): + return Element(qname = (TEXTNS,'table-count'), **args) + +def TableFormula(**args): + return Element(qname = (TEXTNS,'table-formula'), **args) + +def TableIndex(**args): + return Element(qname = (TEXTNS,'table-index'), **args) + +def TableIndexEntryTemplate(**args): + return Element(qname = (TEXTNS,'table-index-entry-template'), **args) + +def TableIndexSource(**args): + return Element(qname = (TEXTNS,'table-index-source'), **args) + +def TableOfContent(**args): + return Element(qname = (TEXTNS,'table-of-content'), **args) + +def TableOfContentEntryTemplate(**args): + return Element(qname = (TEXTNS,'table-of-content-entry-template'), **args) + +def TableOfContentSource(**args): + return Element(qname = (TEXTNS,'table-of-content-source'), **args) + +def TemplateName(**args): + return Element(qname = (TEXTNS,'template-name'), **args) + +def TextInput(**args): + return Element(qname = (TEXTNS,'text-input'), **args) + +def Time(**args): + return Element(qname = (TEXTNS,'time'), **args) + +def Title(**args): + return Element(qname = (TEXTNS,'title'), **args) + +def TocMark(**args): + return Element(qname = (TEXTNS,'toc-mark'), **args) + +def TocMarkEnd(**args): + return Element(qname = (TEXTNS,'toc-mark-end'), **args) + +def TocMarkStart(**args): + return Element(qname = (TEXTNS,'toc-mark-start'), **args) + +def TrackedChanges(**args): + return Element(qname = (TEXTNS,'tracked-changes'), **args) + +def UserDefined(**args): + return Element(qname = (TEXTNS,'user-defined'), **args) + +def UserFieldDecl(**args): + return Element(qname = (TEXTNS,'user-field-decl'), **args) + +def UserFieldDecls(**args): + return Element(qname = (TEXTNS,'user-field-decls'), **args) + +def UserFieldGet(**args): + return Element(qname = (TEXTNS,'user-field-get'), **args) + +def UserFieldInput(**args): + return Element(qname = (TEXTNS,'user-field-input'), **args) + +def UserIndex(**args): + return Element(qname = (TEXTNS,'user-index'), **args) + +def UserIndexEntryTemplate(**args): + return Element(qname = (TEXTNS,'user-index-entry-template'), **args) + +def UserIndexMark(**args): + return Element(qname = (TEXTNS,'user-index-mark'), **args) + +def UserIndexMarkEnd(**args): + return Element(qname = (TEXTNS,'user-index-mark-end'), **args) + +def UserIndexMarkStart(**args): + return Element(qname = (TEXTNS,'user-index-mark-start'), **args) + +def UserIndexSource(**args): + return Element(qname = (TEXTNS,'user-index-source'), **args) + +def VariableDecl(**args): + return Element(qname = (TEXTNS,'variable-decl'), **args) + +def VariableDecls(**args): + return Element(qname = (TEXTNS,'variable-decls'), **args) + +def VariableGet(**args): + return Element(qname = (TEXTNS,'variable-get'), **args) + +def VariableInput(**args): + return Element(qname = (TEXTNS,'variable-input'), **args) + +def VariableSet(**args): + return Element(qname = (TEXTNS,'variable-set'), **args) + +def WordCount(**args): + return Element(qname = (TEXTNS,'word-count'), **args) + diff --git a/tablib/packages/odf3/thumbnail.py b/tablib/packages/odf3/thumbnail.py new file mode 100644 index 0000000..d6388cc --- /dev/null +++ b/tablib/packages/odf3/thumbnail.py @@ -0,0 +1,427 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# This contains a 128x128 px thumbnail in PNG format +# Taken from http://www.zwahlendesign.ch/en/node/20 +# openoffice_icons/openoffice_icons_linux/openoffice11.png +# License: Freeware +import base64 + +iconstr = """\ +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 +N38FAAAAAElFTkSuQmCC\ +""" + +def thumbnail(): + icon = base64.decodestring(iconstr) + return icon + +if __name__ == "__main__": + icon = thumbnail() + f = file("thumbnail.png","wb") + f.write(icon) + f.close() diff --git a/tablib/packages/odf3/userfield.py b/tablib/packages/odf3/userfield.py new file mode 100644 index 0000000..fd36dec --- /dev/null +++ b/tablib/packages/odf3/userfield.py @@ -0,0 +1,169 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2009 Søren Roug, European Environment Agency +# +# This is free software. You may redistribute it under the terms +# of the Apache license and the GNU General Public License Version +# 2 or at your option any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): Michael Howitz, gocept gmbh & co. kg +# +# $Id: userfield.py 447 2008-07-10 20:01:30Z roug $ + +"""Class to show and manipulate user fields in odf documents.""" + +import sys +import zipfile + +from odf.text import UserFieldDecl +from odf.namespaces import OFFICENS +from odf.opendocument import load + +OUTENCODING = "utf-8" + + +# OpenDocument v.1.0 section 6.7.1 +VALUE_TYPES = { + 'float': (OFFICENS, 'value'), + 'percentage': (OFFICENS, 'value'), + 'currency': (OFFICENS, 'value'), + 'date': (OFFICENS, 'date-value'), + 'time': (OFFICENS, 'time-value'), + 'boolean': (OFFICENS, 'boolean-value'), + 'string': (OFFICENS, 'string-value'), + } + + +class UserFields(object): + """List, view and manipulate user fields.""" + + # these attributes can be a filename or a file like object + src_file = None + dest_file = None + + def __init__(self, src=None, dest=None): + """Constructor + + src ... source document name, file like object or None for stdin + dest ... destination document name, file like object or None for stdout + + """ + self.src_file = src + self.dest_file = dest + self.document = None + + def loaddoc(self): + if isinstance(self.src_file, str): + # src_file is a filename, check if it is a zip-file + if not zipfile.is_zipfile(self.src_file): + raise TypeError("%s is no odt file." % self.src_file) + elif self.src_file is None: + # use stdin if no file given + self.src_file = sys.stdin + + self.document = load(self.src_file) + + def savedoc(self): + # write output + if self.dest_file is None: + # use stdout if no filename given + self.document.save('-') + else: + self.document.save(self.dest_file) + + def list_fields(self): + """List (extract) all known user-fields. + + Returns list of user-field names. + + """ + return [x[0] for x in self.list_fields_and_values()] + + def list_fields_and_values(self, field_names=None): + """List (extract) user-fields with type and value. + + field_names ... list of field names to show or None for all. + + Returns list of tuples (, , ). + + """ + self.loaddoc() + found_fields = [] + all_fields = self.document.getElementsByType(UserFieldDecl) + for f in all_fields: + value_type = f.getAttribute('valuetype') + if value_type == 'string': + value = f.getAttribute('stringvalue') + else: + value = f.getAttribute('value') + field_name = f.getAttribute('name') + + if field_names is None or field_name in field_names: + found_fields.append((field_name.encode(OUTENCODING), + value_type.encode(OUTENCODING), + value.encode(OUTENCODING))) + return found_fields + + def list_values(self, field_names): + """Extract the contents of given field names from the file. + + field_names ... list of field names + + Returns list of field values. + + """ + return [x[2] for x in self.list_fields_and_values(field_names)] + + def get(self, field_name): + """Extract the contents of this field from the file. + + Returns field value or None if field does not exist. + + """ + values = self.list_values([field_name]) + if not values: + return None + return values[0] + + def get_type_and_value(self, field_name): + """Extract the type and contents of this field from the file. + + Returns tuple (, ) or None if field does not exist. + + """ + fields = self.list_fields_and_values([field_name]) + if not fields: + return None + field_name, value_type, value = fields[0] + return value_type, value + + def update(self, data): + """Set the value of user fields. The field types will be the same. + + data ... dict, with field name as key, field value as value + + Returns None + + """ + self.loaddoc() + all_fields = self.document.getElementsByType(UserFieldDecl) + for f in all_fields: + field_name = f.getAttribute('name') + if field_name in data: + value_type = f.getAttribute('valuetype') + value = data.get(field_name) + if value_type == 'string': + f.setAttribute('stringvalue', value) + else: + f.setAttribute('value', value) + self.savedoc() + diff --git a/tablib/packages/odf3/xforms.py b/tablib/packages/odf3/xforms.py new file mode 100644 index 0000000..bbc05ac --- /dev/null +++ b/tablib/packages/odf3/xforms.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2007 Søren Roug, European Environment Agency +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Contributor(s): +# + +from .namespaces import XFORMSNS +from .element import Element + +# ODF 1.0 section 11.2 +# XForms is designed to be embedded in another XML format. +# Autogenerated +def Model(**args): + return Element(qname = (XFORMSNS,'model'), **args) + +def Instance(**args): + return Element(qname = (XFORMSNS,'instance'), **args) + +def Bind(**args): + return Element(qname = (XFORMSNS,'bind'), **args) From cb4c67767a710701c0415dd164c0c3253ea74f8d Mon Sep 17 00:00:00 2001 From: Mark Rogers Date: Sun, 15 May 2011 08:35:29 -0500 Subject: [PATCH 14/32] py3k tests now pass --- tablib/formats/_ods.py | 21 ++++++++++++--------- tablib/packages/odf3/attrconverters.py | 2 +- tablib/packages/odf3/element.py | 10 ++++++++-- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/tablib/formats/_ods.py b/tablib/formats/_ods.py index f1b0dfa..7b576c1 100644 --- a/tablib/formats/_ods.py +++ b/tablib/formats/_ods.py @@ -47,7 +47,7 @@ def export_book(databook): stream = BytesIO() - wb.save(stream) + wb.save(unicode(stream)) return stream.getvalue() @@ -63,6 +63,11 @@ def dset_sheet(dataset, ws): row_number = i + 1 odf_row = table.TableRow(stylename=bold) for j, col in enumerate(row): + try: + col = unicode(col, errors='ignore') + except TypeError: + ## col is already unicode + pass ws.addElement(table.TableColumn()) # bold headers @@ -70,14 +75,14 @@ def dset_sheet(dataset, ws): odf_row.setAttribute('stylename', bold) ws.addElement(odf_row) cell = table.TableCell() - cell.addElement(text.P(stylename="Bold", text=unicode(col, errors='ignore'))) + cell.addElement(text.P(stylename="Bold", text=col)) odf_row.addElement(cell) # bold separators elif len(row) < dataset.width: ws.addElement(odf_row) cell = table.TableCell() - cell.addElement(text.P(text=unicode(col, errors='ignore'))) + cell.addElement(text.P(text=col)) odf_row.addElement(cell) # wrap the rest @@ -86,17 +91,15 @@ def dset_sheet(dataset, ws): if '\n' in col: ws.addElement(odf_row) cell = table.TableCell() - cell.addElement(text.P(text=unicode(col, errors='ignore'))) + cell.addElement(text.P(text=col)) odf_row.addElement(cell) else: ws.addElement(odf_row) cell = table.TableCell() - cell.addElement(text.P(text=unicode(col, errors='ignore'))) + cell.addElement(text.P(text=col)) odf_row.addElement(cell) except TypeError: ws.addElement(odf_row) cell = table.TableCell() - cell.addElement(text.P(text=unicode(col, errors='ignore'))) - odf_row.addElement(cell) - - + cell.addElement(text.P(text=col)) + odf_row.addElement(cell) \ No newline at end of file diff --git a/tablib/packages/odf3/attrconverters.py b/tablib/packages/odf3/attrconverters.py index 6af6ec1..c6cb8bf 100644 --- a/tablib/packages/odf3/attrconverters.py +++ b/tablib/packages/odf3/attrconverters.py @@ -158,7 +158,7 @@ def cnv_NCName(attribute, arg, element): """ NCName is defined in http://www.w3.org/TR/REC-xml-names/#NT-NCName Essentially an XML name minus ':' """ - if type(arg) in str: + if isinstance(arg, str): return make_NCName(arg) else: return arg.getAttrNS(STYLENS, 'name') diff --git a/tablib/packages/odf3/element.py b/tablib/packages/odf3/element.py index 00ea088..bd4b5d1 100644 --- a/tablib/packages/odf3/element.py +++ b/tablib/packages/odf3/element.py @@ -38,6 +38,12 @@ def _escape(data, entities={}): the optional entities parameter. The keys and values must all be strings; each key will be replaced with its corresponding value. """ + try: + data = data.decode('utf-8') + except TypeError: + ## Make sure our stream is a string + ## If it comes through as bytes it fails + pass data = data.replace("&", "&") data = data.replace("<", "<") data = data.replace(">", ">") @@ -198,7 +204,7 @@ def _append_child(self, node): childNodes.append(node) node.__dict__["parentNode"] = self -class Childless: +class Childless(object): """ Mixin that makes childless-ness easy to implement and avoids the complexity of the Node methods that deal with children. """ @@ -255,7 +261,7 @@ class Text(Childless, Node): if self.data: f.write(_escape(str(self.data).encode('utf-8'))) -class CDATASection(Childless, Text): +class CDATASection(Text, Childless): nodeType = Node.CDATA_SECTION_NODE def toXml(self,level,f): From eed6df45e0f497f6e79551be272f1e3a5fac6fc4 Mon Sep 17 00:00:00 2001 From: Mark Rogers Date: Sun, 15 May 2011 09:00:47 -0500 Subject: [PATCH 15/32] Bolding still doesn't work :( --- tablib/core.py | 6 +++--- tablib/formats/_ods.py | 15 +++++++++------ 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/tablib/core.py b/tablib/core.py index 678e515..eba792c 100644 --- a/tablib/core.py +++ b/tablib/core.py @@ -403,14 +403,14 @@ class Dataset(object): @property def ods(): - """An Excel Spreadsheet representation of the :class:`Dataset` object, with :ref:`separators`. Cannot be set. + """An OpenDocument Spreadsheet representation of the :class:`Dataset` object, with :ref:`separators`. Cannot be set. .. admonition:: Binary Warning :class:`Dataset.xlsx` contains binary data, so make sure to write in binary mode:: - with open('output.xlsx', 'wb') as f: - f.write(data.xlsx)' + with open('output.ods', 'wb') as f: + f.write(data.ods)' """ pass diff --git a/tablib/formats/_ods.py b/tablib/formats/_ods.py index 7b576c1..87bcd42 100644 --- a/tablib/formats/_ods.py +++ b/tablib/formats/_ods.py @@ -16,14 +16,17 @@ from tablib.compat import opendocument, style, table, text, unicode title = 'ods' extentions = ('ods',) -bold = style.Style(name='Bold', family="text") +bold = style.Style(name="bold", family="paragraph") bold.addElement(style.TextProperties(fontweight="bold")) +#bold = style.Style(name='Bold', family="text") +#bold.addElement(style.TextProperties(attributes={'fontweight':"bold"})) + def export_set(dataset): """Returns ODF representation of Dataset.""" wb = opendocument.OpenDocumentSpreadsheet() - wb.automaticstyles.addElement(bold) + wb.styles.addElement(bold) ws = table.Table(name=dataset.title if dataset.title else 'Tablib Dataset') wb.spreadsheet.addElement(ws) @@ -38,7 +41,7 @@ def export_book(databook): """Returns ODF representation of DataBook.""" wb = opendocument.OpenDocumentSpreadsheet() - wb.automaticstyles.addElement(bold) + wb.styles.addElement(bold) for i, dset in enumerate(databook._datasets): ws = table.Table(name=dset.title if dset.title else 'Sheet%s' % (i)) @@ -47,7 +50,7 @@ def export_book(databook): stream = BytesIO() - wb.save(unicode(stream)) + wb.save(stream) return stream.getvalue() @@ -61,7 +64,7 @@ def dset_sheet(dataset, ws): for i, row in enumerate(_package): row_number = i + 1 - odf_row = table.TableRow(stylename=bold) + odf_row = table.TableRow(stylename=bold, defaultcellstylename='bold') for j, col in enumerate(row): try: col = unicode(col, errors='ignore') @@ -75,7 +78,7 @@ def dset_sheet(dataset, ws): odf_row.setAttribute('stylename', bold) ws.addElement(odf_row) cell = table.TableCell() - cell.addElement(text.P(stylename="Bold", text=col)) + cell.addElement(text.P(stylename=bold, text=col)) odf_row.addElement(cell) # bold separators From f6fa3f2abc9f7328d28fb211019a1e5cd18c77f0 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Sun, 15 May 2011 13:28:10 -0400 Subject: [PATCH 16/32] change (c) attribution --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 5a42816..d4f8552 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -41,7 +41,7 @@ master_doc = 'index' # General information about the project. project = u'Tablib' -copyright = u'2011, Kenneth Reitz. Styles (modified) © Armin Ronacher' +copyright = u'2011, Kenneth Reitz.' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the From d826f6d0aec97d864a6eef72bdae005b5ad84aaf Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Sun, 15 May 2011 13:28:15 -0400 Subject: [PATCH 17/32] Orgs --- docs/index.rst | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 77ce7cf..d78b926 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,20 +3,20 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Tablib: Pythonic Tabular Datasets +Tablib: Pythonic Tabular Datasets ================================= Release |version|. .. Contents: -.. +.. .. .. toctree:: .. :maxdepth: 2 -.. +.. .. Indices and tables .. ================== -.. +.. .. * :ref:`genindex` .. * :ref:`modindex` .. * :ref:`search` @@ -26,6 +26,18 @@ Tablib is an :ref:`MIT Licensed ` format-agnostic tabular dataset library, I recommend you start with :ref:`Installation `. +Testimonials +------------ + +`The Library of Congress `_, +`National Geographic `, +`Digg, Inc `_, +`Northrop Grumman `_, +`Discovery Channel `_, +`The Sunlight Foundation `_, and +`NetApp, Inc `_ use Tablib internally. + + User's Guide ------------ From ea63779bafb4cca25a0e5c5c25e1a76a06e82304 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Sun, 15 May 2011 13:29:54 -0400 Subject: [PATCH 18/32] syntax fix --- docs/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index d78b926..a9d5145 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -30,7 +30,7 @@ Testimonials ------------ `The Library of Congress `_, -`National Geographic `, +`National Geographic `_, `Digg, Inc `_, `Northrop Grumman `_, `Discovery Channel `_, From e920244a1b035e465d16c59bb70a19226091b573 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Sun, 15 May 2011 17:08:26 -0400 Subject: [PATCH 19/32] testimonials --- docs/index.rst | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index a9d5145..e7419cf 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -38,9 +38,27 @@ Testimonials `NetApp, Inc `_ use Tablib internally. +**Dave Coutts** + It's turning into one of my most used modules of 2010. You really hit a sweat spot for managing tabular data with a minimal amount of code and effort. + +**Brad Montgomery** + I think you nailed the "Python Zen" with tablib. Thanks again for an awesome lib! + +**Greg Thorton** + Tablib by @kennethreitz saved my life. I had to consolidate like 5 huge poorly maintained lists of domains and data. It was a breeze! + +**Mark Rogers** + So, thanks to tablib I'm not angry about Excel... In fact, spreadsheet creation is done, so I'm happy. + +**Joshua Ourisman** + Tablib has made it so much easier to deal with the inevitable 'I want an Excel file!' requests from clients... + +**Jonas Obrist** + <3 tablib + User's Guide ------------ - +Dave Coutts** This part of the documentation, which is mostly prose, begins with some background information about Tablib, then focuses on step-by-step instructions for getting the most out of your datasets. .. toctree:: From 6975685b89c99abd8bc0cf61fbd968620ceabff5 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Sun, 15 May 2011 19:53:18 -0400 Subject: [PATCH 20/32] theme update --- docs/_themes/kr/static/flasky.css_t | 90 ++++++++++++++++++++--------- docs/index.rst | 15 +++-- 2 files changed, 69 insertions(+), 36 deletions(-) diff --git a/docs/_themes/kr/static/flasky.css_t b/docs/_themes/kr/static/flasky.css_t index 5c2cb7e..7477b3f 100644 --- a/docs/_themes/kr/static/flasky.css_t +++ b/docs/_themes/kr/static/flasky.css_t @@ -8,11 +8,11 @@ {% set page_width = '940px' %} {% set sidebar_width = '220px' %} - + @import url("basic.css"); - + /* -- page layout ----------------------------------------------------------- */ - + body { font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro'; font-size: 17px; @@ -43,7 +43,7 @@ div.sphinxsidebar { hr { border: 1px solid #B1B4B6; } - + div.body { background-color: #ffffff; color: #3E4349; @@ -54,7 +54,7 @@ img.floatingflask { padding: 0 0 10px 10px; float: right; } - + div.footer { width: {{ page_width }}; margin: 20px auto 30px auto; @@ -70,7 +70,7 @@ div.footer a { div.related { display: none; } - + div.sphinxsidebar a { color: #444; text-decoration: none; @@ -80,7 +80,7 @@ div.sphinxsidebar a { div.sphinxsidebar a:hover { border-bottom: 1px solid #999; } - + div.sphinxsidebar { font-size: 14px; line-height: 1.5; @@ -95,7 +95,7 @@ div.sphinxsidebarwrapper p.logo { margin: 0; text-align: center; } - + div.sphinxsidebar h3, div.sphinxsidebar h4 { font-family: 'Garamond', 'Georgia', serif; @@ -109,7 +109,7 @@ div.sphinxsidebar h4 { div.sphinxsidebar h4 { font-size: 20px; } - + div.sphinxsidebar h3 a { color: #444; } @@ -120,7 +120,7 @@ div.sphinxsidebar p.logo a:hover, div.sphinxsidebar h3 a:hover { border: none; } - + div.sphinxsidebar p { color: #555; margin: 10px 0; @@ -131,25 +131,25 @@ div.sphinxsidebar ul { padding: 0; color: #000; } - + div.sphinxsidebar input { border: 1px solid #ccc; font-family: 'Georgia', serif; font-size: 1em; } - + /* -- body styles ----------------------------------------------------------- */ - + a { color: #004B6B; text-decoration: underline; } - + a:hover { color: #6D4100; text-decoration: underline; } - + div.body h1, div.body h2, div.body h3, @@ -161,25 +161,25 @@ div.body h6 { margin: 30px 0px 10px 0px; padding: 0; } - + div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } div.body h2 { font-size: 180%; } div.body h3 { font-size: 150%; } div.body h4 { font-size: 130%; } div.body h5 { font-size: 100%; } div.body h6 { font-size: 100%; } - + a.headerlink { color: #ddd; padding: 0 4px; text-decoration: none; } - + a.headerlink:hover { color: #444; background: #eaeaea; } - + div.body p, div.body dd, div.body li { line-height: 1.4em; } @@ -226,20 +226,20 @@ div.note { background-color: #eee; border: 1px solid #ccc; } - + div.seealso { background-color: #ffc; border: 1px solid #ff6; } - + div.topic { background-color: #eee; } - + p.admonition-title { display: inline; } - + p.admonition-title:after { content: ":"; } @@ -333,7 +333,7 @@ ul, ol { margin: 10px 0 10px 30px; padding: 0; } - + pre { background: #eee; padding: 7px 30px; @@ -350,7 +350,7 @@ dl dl pre { margin-left: -90px; padding-left: 90px; } - + tt { background-color: #ecf0f3; color: #222; @@ -388,7 +388,7 @@ a:hover tt { @media screen and (max-width: 600px) { - + div.sphinxsidebar { display: none; } @@ -423,8 +423,42 @@ a:hover tt { width: auto; } - - + + } + +/* scrollbars */ + +::-webkit-scrollbar { + width: 6px; + height: 6px; +} + +::-webkit-scrollbar-button:start:decrement, +::-webkit-scrollbar-button:end:increment { + display: block; + height: 10px; +} + +::-webkit-scrollbar-button:vertical:increment { + background-color: #fff; +} + +::-webkit-scrollbar-track-piece { + background-color: #eee; + -webkit-border-radius: 3px; +} + +::-webkit-scrollbar-thumb:vertical { + height: 50px; + background-color: #ccc; + -webkit-border-radius: 3px; +} + +::-webkit-scrollbar-thumb:horizontal { + width: 50px; + background-color: #ccc; + -webkit-border-radius: 3px; +} diff --git a/docs/index.rst b/docs/index.rst index e7419cf..255bb51 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -38,27 +38,26 @@ Testimonials `NetApp, Inc `_ use Tablib internally. -**Dave Coutts** - It's turning into one of my most used modules of 2010. You really hit a sweat spot for managing tabular data with a minimal amount of code and effort. - -**Brad Montgomery** - I think you nailed the "Python Zen" with tablib. Thanks again for an awesome lib! **Greg Thorton** Tablib by @kennethreitz saved my life. I had to consolidate like 5 huge poorly maintained lists of domains and data. It was a breeze! +**Dave Coutts** + It's turning into one of my most used modules of 2010. You really hit a sweat spot for managing tabular data with a minimal amount of code and effort. + **Mark Rogers** So, thanks to tablib I'm not angry about Excel... In fact, spreadsheet creation is done, so I'm happy. **Joshua Ourisman** Tablib has made it so much easier to deal with the inevitable 'I want an Excel file!' requests from clients... -**Jonas Obrist** - <3 tablib +**Brad Montgomery** + I think you nailed the "Python Zen" with tablib. Thanks again for an awesome lib! + User's Guide ------------ -Dave Coutts** + This part of the documentation, which is mostly prose, begins with some background information about Tablib, then focuses on step-by-step instructions for getting the most out of your datasets. .. toctree:: From c9766a48b07daa8e72d5109d644c05e115a55318 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 16 May 2011 02:08:37 -0400 Subject: [PATCH 21/32] docs update --- docs/_themes/kr/layout.html | 6 ++++-- docs/conf.py | 8 ++++++-- docs/index.rst | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/docs/_themes/kr/layout.html b/docs/_themes/kr/layout.html index 7e76548..344ec29 100644 --- a/docs/_themes/kr/layout.html +++ b/docs/_themes/kr/layout.html @@ -9,10 +9,12 @@ {% endblock %} {%- block relbar2 %}{% endblock %} {%- block footer %} -