diff --git a/i18n/manuskript_fr.qm b/i18n/manuskript_fr.qm index cf7ab55..fc9623e 100644 Binary files a/i18n/manuskript_fr.qm and b/i18n/manuskript_fr.qm differ diff --git a/i18n/manuskript_fr.ts b/i18n/manuskript_fr.ts index 1aedafe..7ffe3b4 100644 --- a/i18n/manuskript_fr.ts +++ b/i18n/manuskript_fr.ts @@ -1,5 +1,6 @@ - + + MainWindow @@ -208,7 +209,7 @@ Étapes de résolution - + Outline Plan @@ -358,7 +359,7 @@ Et si...? - + Index cards Cartes @@ -373,7 +374,7 @@ F9 - + Tree Arbre @@ -398,7 +399,7 @@ Réglages - + Compile Compilation @@ -448,167 +449,167 @@ Source de conflit - + The file {} does not exist. Try again. Le fichier {} n'existe pas. Essayez encore. - + Project {} saved. Le projet {} a été enregistré. - + Project {} loaded. Le projet {} a été chargé. - + Project {} loaded with some errors: Le projet {} a été chargé, avec des erreurs: - + * {} wasn't found in project file. * {} n'a pas été trouvé dans le fichier du projet. - + Project {} loaded with some errors. Le projet {} a été chargé avec des erreurs. - + (~{} pages) (~{} pages) - + Words: {}{} Mots: {}{} - + Book summary - + Project tree - + Metadata Métadonnées - + Enter infos about your book, and yourself. Entrez toutes les informations relatives au livre, ainsi qu'à vous. - + The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard could wasn't abled to kill a baby?' (Harry Potter) La situation de base, sous la forme d'une question: "Et si...?" Par exemple: "Et si le plus dangereux magiciens mauvais n'était pas capable de tuer un bébé?" (Harry Potter) - + Take time to think about a one sentance (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. Prenez le temps de réfléchir à un résumé de votre livre, en une phrase (~50 mots). Puis augmentez cette phrase en un paragraphe, puis en une page, puis en un résumé complet. - + Create your characters. Créez ici vos personnage. - + Develop plots. Développez vos intrigues. - + Create the outline of your masterpiece. Créez le plan de votre chef-d'œuvre. - + Write. Écrivez. - + Debug infos. Sometimes useful. Des infos pour débugger des fois pendant qu'on code c'est utile. - + Dictionary Dictionnaire - + Install PyEnchant to use spellcheck Installez PyEnchant pour profiter du correcteur orthographique - + Nothing Rien - + POV POV - + Label Label - + Progress Progrès - + Icon color Couleur de l'icone - + Text color Couleur du texte - + Background color Couleur de l'arrière-plan - + Icon Icone - + Text Texte - + Background Arrière-plan - + Border Bordure - + Corner Coin @@ -1465,32 +1466,32 @@ des lignes: Bloquer ! - + ~{} h. ~{} h. - + ~{} mn. ~{} mn. - + {}:{} {}:{} - + {} s. {} s. - + {} remaining {} restant - + {} words remaining {} mots restants @@ -1833,7 +1834,7 @@ des lignes: references - + Unknown reference: {}. Référence inconnue: {}. @@ -1843,7 +1844,7 @@ des lignes: Texte: <b>{}</b> - + Character: <b>{}</b> Personnage: <b>{}</b> @@ -1968,7 +1969,7 @@ des lignes: Étapes de résolution - + Plot: <b>{}</b> Intrigue: <b>{}</b> @@ -1978,10 +1979,15 @@ des lignes: Passion - + World: <b>{name}</b>{path} Monde: <b>{name}</b>{path} + + + <b>Unknown reference:</b> {}. + <b>Référence inconnue:</b> {}. + revisions diff --git a/libs/odf/GPL-LICENSE-2.txt b/libs/odf/GPL-LICENSE-2.txt new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/libs/odf/GPL-LICENSE-2.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/libs/odf/__init__.py b/libs/odf/__init__.py new file mode 100644 index 0000000..17c80e0 --- /dev/null +++ b/libs/odf/__init__.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2007 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): +# + diff --git a/libs/odf/anim.py b/libs/odf/anim.py new file mode 100644 index 0000000..27dca36 --- /dev/null +++ b/libs/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/libs/odf/attrconverters.py b/libs/odf/attrconverters.py new file mode 100644 index 0000000..cbdd8f3 --- /dev/null +++ b/libs/odf/attrconverters.py @@ -0,0 +1,1612 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2013 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 sys, os.path +sys.path.append(os.path.dirname(__file__)) +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_angle(attribute, arg, element): + if sys.version_info[0]==2: + return unicode(arg) + else: + return str(arg) + +def cnv_anyURI(attribute, arg, element): + return str(arg) + +def cnv_boolean(attribute, arg, element): + """ XML Schema Part 2: Datatypes Second Edition + An instance of a datatype that is defined as boolean can have the + following legal literals {true, false, 1, 0} + """ + if str(arg).lower() in ("0","false","no"): + return "false" + if str(arg).lower() in ("1","true","yes"): + return "true" + raise ValueError( "'%s' not allowed as Boolean value for %s" % (str(arg), attribute[1])) + +# 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_draw_aspect(attribute, arg, element): + if str(arg) not in ("content", "thumbnail", "icon", "print-view"): + raise ValueError( "'%s' not allowed" % str(arg)) + 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) + +pattern_language = re.compile(r'[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*') + +def cnv_language(attribute, arg, element): + global pattern_language + if not pattern_language.match(arg): + raise ValueError( "'%s' is not a valid language token" % arg) + return 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_list_linkage_type(attribute, arg, element): + if arg not in ('selection','selection-indices'): + raise ValueError( "'%s' is not either 'selection' or 'selection-indices'" % arg) + return str(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) + return str(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 (sys.version_info[0]==3 and isinstance(arg, str)) or (sys.version_info[0]==2 and 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 (sys.version_info[0]==3 and isinstance(arg, str)) or (sys.version_info[0]==2 and 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_rowOrCol(attribute, arg, element): + if str(arg) not in ("row","column"): + raise ValueError( "'%s' not allowed" % str(arg)) + return str(arg) + +def cnv_string(attribute, arg, element): + if sys.version_info[0]==2: + return unicode(arg) + else: + return str(arg) + +def cnv_stroke_linecap(attribute, arg, element): + if str(arg) not in ("butt", "square", "round"): + raise ValueError( "'%s' not allowed" % str(arg)) + 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) + +def cnv_xlinktype(attribute, arg, element): + if arg != "simple": + raise ValueError( "Value of '%s' must be 'simple'" % attribute[1]) + return 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'angle-offset'), None): cnv_angle, + ((CHARTNS,u'automatic-content'), None): cnv_boolean, + ((CHARTNS,u'auto-position'), None): cnv_boolean, + ((CHARTNS,u'auto-size'), None): cnv_boolean, + ((CHARTNS,u'axis-label-position'), None): cnv_string, # Multi-value + ((CHARTNS,u'axis-position'), None): cnv_string, # Multi-value + ((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-equation'), None): cnv_boolean, + ((CHARTNS,u'display-label'), None): cnv_boolean, + ((CHARTNS,u'display-r-square'), 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-lower-range'), None): cnv_string, + ((CHARTNS,u'error-upper-indicator'), None): cnv_boolean, + ((CHARTNS,u'error-upper-limit'), None): cnv_string, + ((CHARTNS,u'error-upper-range'), None): cnv_string, + ((CHARTNS,u'gap-width'), None): cnv_string, + ((CHARTNS,u'group-bars-per-axis'), None): cnv_boolean, + ((CHARTNS,u'hole-size'), None): cnv_percent, + ((CHARTNS,u'include-hidden-cells'), None): cnv_boolean, + ((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'label-position'), None): cnv_string, # Multi-value + ((CHARTNS,u'label-position-negative'), None): cnv_string, # Multi-value + ((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'reverse-direction'), None): cnv_boolean, + ((CHARTNS,u'right-angled-axes'), None): cnv_boolean, + ((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'sort-by-x-values'), None): cnv_boolean, + ((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-mark-position'), None): cnv_string, # Multi-value + ((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'treat-empty-cells'), None): cnv_string, # Multi-value + ((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'draw-aspect'), None): cnv_draw_aspect, + ((DRAWNS,u'end-angle'), None): cnv_angle, + ((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_string, # ODF 1.2 says 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_angle, + ((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'script'), None): cnv_token, + ((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'linked-cell'), None): cnv_string, + ((FORMNS,u'list-linkage-type'), None): cnv_list_linkage_type, + ((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'repeat'), None): cnv_boolean, + ((FORMNS,u'selected'), None): cnv_boolean, + ((FORMNS,u'size'), None): cnv_nonNegativeInteger, + ((FORMNS,u'source-cell-range'), None): cnv_string, + ((FORMNS,u'spin-button'), None): cnv_boolean, + ((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, + ((GRDDLNS,u'transformation'), None): cnv_string, + ((MANIFESTNS,u'algorithm-name'), None): cnv_string, + ((MANIFESTNS,u'checksum'), None): cnv_string, + ((MANIFESTNS,u'checksum-type'), None): cnv_string, + ((MANIFESTNS,u'full-path'), None): cnv_string, + ((MANIFESTNS,u'initialisation-vector'), None): cnv_string, + ((MANIFESTNS,u'iteration-count'), None): cnv_nonNegativeInteger, + ((MANIFESTNS,u'key-derivation-name'), None): cnv_string, + ((MANIFESTNS,u'media-type'), None): cnv_string, + ((MANIFESTNS,u'preferred-view-mode'), None): cnv_string, + ((MANIFESTNS,u'salt'), None): cnv_string, + ((MANIFESTNS,u'size'), None): cnv_nonNegativeInteger, + ((MANIFESTNS,u'version'), None): cnv_string, + ((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'rfc-language-tag'), None): cnv_language, + ((NUMBERNS,u'script'), None): cnv_token, + ((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'join-border'), None): cnv_boolean, + ((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-base-width'), 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'layout-grid-snap-to'), None): cnv_boolean, + ((STYLENS,u'layout-grid-standard-mode'), None): cnv_boolean, + ((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-level'), 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'percentage-data-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'), (STYLENS,u'section-properties')): cnv_boolean, + ((STYLENS,u'protect'), (STYLENS,u'graphic-properties')): 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'rfc-language-tag'), None): cnv_language, + ((STYLENS,u'rfc-language-tag-asian'), None): cnv_language, + ((STYLENS,u'rfc-language-tag-complex'), None): cnv_language, + ((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-asian'), None): cnv_string, + ((STYLENS,u'script-complex'), 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-overline-color'), None): cnv_string, + ((STYLENS,u'text-overline-mode'), None): cnv_string, + ((STYLENS,u'text-overline-style'), None): cnv_string, + ((STYLENS,u'text-overline-type'), None): cnv_string, + ((STYLENS,u'text-overline-width'), None): cnv_string, + ((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-linecap'), None): cnv_stroke_linecap, + ((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'embedded-number-behavior'), None): cnv_string, + ((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'first-row-end-column'), None): cnv_rowOrCol, + ((TABLENS,u'first-row-start-column'), None): cnv_rowOrCol, + ((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-end-column'), None): cnv_rowOrCol, + ((TABLENS,u'last-row-spanned'), None): cnv_positiveInteger, + ((TABLENS,u'last-row-start-column'), None): cnv_rowOrCol, + ((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'paragraph-style-name'), None): cnv_StyleNameRef, + ((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'protection-key-digest-algorithm'), None): cnv_anyURI, + ((TABLENS,u'query-name'), None): cnv_string, + ((TABLENS,u'range-usable-as'), None): cnv_string, + ((TABLENS,u'rfc-language-tag'), None): cnv_language, + ((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'script'), 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'template-name'), 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-banding-columns-styles'), None): cnv_boolean, + ((TABLENS,u'use-banding-rows-styles'), None): cnv_boolean, + ((TABLENS,u'use-first-column-styles'), None): cnv_boolean, + ((TABLENS,u'use-first-row-styles'), None): cnv_boolean, + ((TABLENS,u'use-labels'), None): cnv_string, + ((TABLENS,u'use-last-column-styles'), None): cnv_boolean, + ((TABLENS,u'use-last-row-styles'), None): cnv_boolean, + ((TABLENS,u'use-regular-expressions'), None): cnv_boolean, + ((TABLENS,u'use-wildcards'), 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-list'), None): cnv_IDREF, + ((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'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'label-followed-by'), 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'list-id'), None): cnv_NCName, + ((TEXTNS,u'list-level-position-and-space-mode'), None): cnv_string, + ((TEXTNS,u'list-tab-stop-position'), None): cnv_length, + ((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'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'protection-key-digest-algorithm'), None): cnv_anyURI, + ((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'style-override'), 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, + ((XHTMLNS,u'about'), None): cnv_anyURI, + ((XHTMLNS,u'content'), None): cnv_string, + ((XHTMLNS,u'datatype'), None): cnv_anyURI, + ((XHTMLNS,u'property'), None): cnv_anyURI, + ((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_xlinktype, + ((XMLNS,u'id'), None): cnv_NCName, +} + +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) + if sys.version_info[0]==2: + return unicode(value) + else: + return str(value) + diff --git a/libs/odf/chart.py b/libs/odf/chart.py new file mode 100644 index 0000000..b05dcce --- /dev/null +++ b/libs/odf/chart.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2013 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 __future__ import absolute_import +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 DataLabel(**args): + return Element(qname = (CHARTNS,'data-label'), **args) + +def DataPoint(**args): + return Element(qname = (CHARTNS,'data-point'), **args) + +def Domain(**args): + return Element(qname = (CHARTNS,'domain'), **args) + +def Equation(**args): + return Element(qname = (CHARTNS,'equation'), **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 LabelSeparator(**args): + return Element(qname = (CHARTNS,'label-separator'), **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/libs/odf/config.py b/libs/odf/config.py new file mode 100644 index 0000000..f33f361 --- /dev/null +++ b/libs/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/libs/odf/dc.py b/libs/odf/dc.py new file mode 100644 index 0000000..7c96776 --- /dev/null +++ b/libs/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/libs/odf/dr3d.py b/libs/odf/dr3d.py new file mode 100644 index 0000000..989e114 --- /dev/null +++ b/libs/odf/dr3d.py @@ -0,0 +1,45 @@ +# -*- 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): +# +import sys, os.path +sys.path.append(os.path.dirname(__file__)) + +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/libs/odf/draw.py b/libs/odf/draw.py new file mode 100644 index 0000000..122d40f --- /dev/null +++ b/libs/odf/draw.py @@ -0,0 +1,188 @@ +# -*- 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): +# + +import sys, os.path +sys.path.append(os.path.dirname(__file__)) +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 'displayname' not in args: + e.setAttrNS(DRAWNS,'display-name', name) + return e + +# Autogenerated +def A(**args): + args.setdefault('type', 'simple') + 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): + args.setdefault('type', 'simple') + return DrawElement(qname = (DRAWNS,'fill-image'), **args) + +def FloatingFrame(**args): + args.setdefault('type', 'simple') + 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): + args.setdefault('type', 'simple') + 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/libs/odf/easyliststyle.py b/libs/odf/easyliststyle.py new file mode 100644 index 0000000..0576406 --- /dev/null +++ b/libs/odf/easyliststyle.py @@ -0,0 +1,104 @@ +# -*- 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, sys, os.path +sys.path.append(os.path.dirname(__file__)) +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/libs/odf/element.py b/libs/odf/element.py new file mode 100644 index 0000000..09e7de5 --- /dev/null +++ b/libs/odf/element.py @@ -0,0 +1,541 @@ +#!/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 sys, os.path +sys.path.append(os.path.dirname(__file__)) +import xml.dom +from xml.dom.minicompat import * +from namespaces import nsdict +import grammar +from attrconverters import AttrConverters + +if sys.version_info[0] == 3: + unicode=str # unicode function does not exist + +# 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(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(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 + + 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))) + +class CDATASection(Text, Childless): + 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 namespace 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): + """ + gets an attribute, given a namespace and a key + @param namespace a unicode string or a bytes: the namespace + @param localpart a unicode string or a bytes: + the key to get the attribute + @return an attribute as a unicode string or a bytes: if both paramters + are byte strings, it will be a bytes; if both attributes are + unicode strings, it will be a unicode string + """ + prefix = self.get_nsprefix(namespace) + result = self.attributes.get((namespace, localpart)) + + assert( + (type(namespace), type(namespace), type(namespace) == \ + type(b""), type(b""), type(b"")) or + (type(namespace), type(namespace), type(namespace) == \ + type(u""), type(u""), type(u"")) + ) + + return result + + 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(u' xmlns:' + prefix + u'="'+ _escape(str(namespace))+'"') + for qname in self.attributes.keys(): + prefix = self.get_nsprefix(qname[0]) + f.write(u' '+_escape(str(prefix+u':'+qname[1]))+u'='+_quoteattr(unicode(self.attributes[qname]))) + f.write(u'>') + + def write_close_tag(self, level, f): + f.write('') + + def toXml(self, level, f): + """ + Generate an XML stream out of the tree structure + @param level integer: level in the XML tree; zero at root of the tree + @param f an open writable file able to accept unicode strings + """ + f.write(u'<'+self.tagName) + if level == 0: + for namespace, prefix in self.namespaces.items(): + f.write(u' xmlns:' + prefix + u'="'+ _escape(str(namespace))+u'"') + for qname in self.attributes.keys(): + prefix = self.get_nsprefix(qname[0]) + f.write(u' '+_escape(unicode(prefix+':'+qname[1]))+u'='+_quoteattr(unicode(self.attributes[qname]))) + if self.childNodes: + f.write(u'>') + for element in self.childNodes: + element.toXml(level+1,f) + f.write(u'') + else: + f.write(u'/>') + + 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/libs/odf/elementtypes.py b/libs/odf/elementtypes.py new file mode 100644 index 0000000..7c19412 --- /dev/null +++ b/libs/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/libs/odf/form.py b/libs/odf/form.py new file mode 100644 index 0000000..7969b84 --- /dev/null +++ b/libs/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/libs/odf/grammar.py b/libs/odf/grammar.py new file mode 100644 index 0000000..dca6519 --- /dev/null +++ b/libs/odf/grammar.py @@ -0,0 +1,9194 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2013 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 +""" +import sys, os.path +sys.path.append(os.path.dirname(__file__)) +from namespaces import * + +# The following code is generated from the RelaxNG schema with this notice: + +# Open Document Format for Office Applications (OpenDocument) Version 1.2 +# OASIS Standard, 29 September 2011 +# Relax-NG Schema +# Source: http://docs.oasis-open.org/office/v1.2/os/ +# Copyright (c) OASIS Open 2002-2011. All Rights Reserved. + +# All capitalized terms in the following text have the meanings assigned to them +# in the OASIS Intellectual Property Rights Policy (the "OASIS IPR Policy"). The +# full Policy may be found at the OASIS website. + +# 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 section are included on all such copies and derivative works. +# However, this document itself may not be modified in any way, including by +# removing the copyright notice or references to OASIS, except as needed for the +# purpose of developing any document or deliverable produced by an OASIS +# Technical Committee (in which case the rules applicable to copyrights, as set +# forth in the OASIS IPR Policy, must be followed) or as required to translate it +# into languages other than English. + +# The limited permissions granted above are perpetual and will not be revoked by +# OASIS or its successors or assigns. + +# This document and the information contained herein is provided on an "AS IS" +# basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT +# LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT +# INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR +# FITNESS FOR A PARTICULAR PURPOSE. + +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-label') : ( + (TEXTNS,u'p'), + ), + (CHARTNS,u'data-point') : ( + (CHARTNS,u'data-label'), + ), + (CHARTNS,u'domain') : ( + ), +# allowed_children + (CHARTNS,u'equation') : ( + (TEXTNS,u'p'), + ), + (CHARTNS,u'error-indicator') : ( + ), + (CHARTNS,u'floor') : ( + ), + (CHARTNS,u'footer') : ( + (TEXTNS,u'p'), + ), + (CHARTNS,u'grid') : ( + ), + (CHARTNS,u'label-separator') : ( + (TEXTNS,u'p'), + ), + (CHARTNS,u'legend') : ( + (TEXTNS,u'p'), + ), +# 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'equation'), + ), + (CHARTNS,u'series') : ( + (CHARTNS,u'data-label'), + (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'), + (DRAWNS,u'glue-point'), + (SVGNS,u'title'), + (SVGNS,u'desc'), + ), + (DR3DNS,u'sphere') : ( + ), + (DRAWNS,u'a') : ( + (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 + (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'), + (TABLENS,u'table'), + ), +# allowed_children + (DRAWNS,u'g') : ( + (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'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'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'layer-set'), + (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'), + (SVGNS,u'desc'), + (SVGNS,u'title'), + ), +# 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'time'), + ), + (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'), + ), +# allowed_children + (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'), + ), +# allowed_children + (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'), + ), +# allowed_children + (OFFICENS,u'annotation-end') : ( + ), + (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'), + ), + (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-page-layout'), + (STYLENS,u'default-style'), + (STYLENS,u'presentation-page-layout'), + (STYLENS,u'style'), + (SVGNS,u'linearGradient'), + (SVGNS,u'radialGradient'), + (TABLENS,u'table-template'), + (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'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'), + ), + (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'), + ), +# allowed_children + (STYLENS,u'chart-properties') : ( + (CHARTNS,u'label-separator'), + (CHARTNS,u'symbol-image'), + ), + (STYLENS,u'column') : ( + ), + (STYLENS,u'column-sep') : ( + ), + (STYLENS,u'columns') : ( + (STYLENS,u'column'), + (STYLENS,u'column-sep'), + ), +# allowed_children + (STYLENS,u'default-page-layout') : ( + (STYLENS,u'page-layout-properties'), + (STYLENS,u'header-style'), + (STYLENS,u'footer-style'), + ), + (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'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'), + ), + (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'), + ), +# allowed_children + (STYLENS,u'list-level-label-alignment') : ( + ), + (STYLENS,u'list-level-properties') : ( + (STYLENS,u'list-level-label-alignment'), + ), + (STYLENS,u'map') : ( + ), + (STYLENS,u'master-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'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'layer-set'), + (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'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') : ( + ), +# allowed_children + (TABLENS,u'background') : ( + ), + (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') : ( + ), +# allowed_children + (TABLENS,u'desc') : ( + ), + (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-set-item'), + ), + (TABLENS,u'filter-or') : ( + (TABLENS,u'filter-and'), + (TABLENS,u'filter-condition'), + ), +# allowed_children + (TABLENS,u'filter-set-item') : ( + ), +# 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'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'), + ), +# 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'), + (TABLENS,u'desc'), + (TABLENS,u'named-expressions'), + (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'title'), + (TEXTNS,u'soft-page-break'), + ), + (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'background'), + (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') : ( + ), +# allowed_children + (TABLENS,u'title') : ( + ), + (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'annotation-end'), + (OFFICENS,u'event-listeners'), + (PRESENTATIONNS,u'date-time'), + (PRESENTATIONNS,u'footer'), + (PRESENTATIONNS,u'header'), + (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'meta'), + (TEXTNS,u'meta-field'), + (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'), + + ), +# 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'), + (OFFICENS,u'annotation-end'), + (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'meta'), + (TEXTNS,u'meta-field'), + (TEXTNS,u'modification-date'), + (TEXTNS,u'modification-time'), + (TEXTNS,u'note'), + (TEXTNS,u'note-ref'), + (TEXTNS,u'number'), + (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'), + + ), +# 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-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'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') : ( + ), +# allowed_children + (TEXTNS,u'meta') : ( + (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'annotation-end'), + (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'meta'), + (TEXTNS,u'meta-field'), + (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'), + ), +# allowed_children + (TEXTNS,u'meta-field') : ( + (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'annotation-end'), + (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'meta'), + (TEXTNS,u'meta-field'), + (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'), + ), +# allowed_children + (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-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'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'), + (OFFICENS,u'annotation-end'), + (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'meta'), + (TEXTNS,u'meta-field'), + (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'), + (OFFICENS,u'annotation-end'), + (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'meta'), + (TEXTNS,u'meta-field'), + (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'), + + ), +# 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'), + (OFFICENS,u'annotation-end'), + (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'meta'), + (TEXTNS,u'meta-field'), + (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-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'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'), + (TABLENS,u'desc'), + (TABLENS,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'), +# allows_text + (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'meta'), + (TEXTNS,u'meta-field'), + (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'), +# allows_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'), +# allows_text + (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'), + ), +# required_attributes + (CHARTNS,u'error-indicator'): ( + (CHARTNS,u'dimension'), + ), + (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'), + (XLINKNS,u'type'), + ), + (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'), + ), +# required_attributes + (DRAWNS,u'connector'): ( + (SVGNS,u'viewBox'), + ), + (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'), + (XLINKNS,u'type'), + (DRAWNS,u'name'), + ), + (DRAWNS,u'floating-frame'): ( + (XLINKNS,u'href'), + (XLINKNS,u'type'), + ), + (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'), + (XLINKNS,u'type'), + ), + (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'): ( + (XMLNS,u'id'), + ), + (FORMNS,u'checkbox'): ( + (XMLNS,u'id'), + ), + (FORMNS,u'combobox'): ( + (XMLNS,u'id'), + ), +# required_attributes + (FORMNS,u'connection-resource'): ( + (XLINKNS,u'href'), + ), + (FORMNS,u'date'): ( + (XMLNS,u'id'), + ), + (FORMNS,u'file'): ( + (XMLNS,u'id'), + ), + (FORMNS,u'fixed-text'): ( + (XMLNS,u'id'), + ), + (FORMNS,u'formatted-text'): ( + (XMLNS,u'id'), + ), + (FORMNS,u'frame'): ( + (XMLNS,u'id'), + ), + (FORMNS,u'generic-control'): ( + (XMLNS,u'id'), + ), + (FORMNS,u'grid'): ( + (XMLNS,u'id'), + ), + (FORMNS,u'hidden'): ( + (XMLNS,u'id'), + ), +# required_attributes + (FORMNS,u'image'): ( + (XMLNS,u'id'), + ), + (FORMNS,u'image-frame'): ( + (XMLNS,u'id'), + ), + (FORMNS,u'list-property'): ( + (FORMNS,u'property-name'), + ), + (FORMNS,u'list-value'): ( + (OFFICENS,u'string-value'), + ), + (FORMNS,u'listbox'): ( + (XMLNS,u'id'), + ), + (FORMNS,u'number'): ( + (XMLNS,u'id'), + ), + (FORMNS,u'password'): ( + (XMLNS,u'id'), + ), + (FORMNS,u'property'): ( + (FORMNS,u'property-name'), + ), + (FORMNS,u'radio'): ( + (XMLNS,u'id'), + ), + (FORMNS,u'text'): ( + (XMLNS,u'id'), + ), + (FORMNS,u'textarea'): ( + (XMLNS,u'id'), + ), + (FORMNS,u'time'): ( + (XMLNS,u'id'), + ), + (FORMNS,u'value-range'): ( + (XMLNS,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'), + (XLINKNS,u'type'), + ), + (METANS,u'user-defined'): ( + (METANS,u'name'), + ), +# required_attributes + (OFFICENS,u'annotation-end'): ( + (OFFICENS,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'version'), + ), +# required_attributes + (OFFICENS,u'document-content'): ( + (OFFICENS,u'version'), + ), +# required_attributes + (OFFICENS,u'document-meta'): ( + (OFFICENS,u'version'), + ), +# required_attributes + (OFFICENS,u'document-settings'): ( + (OFFICENS,u'version'), + ), +# required_attributes + (OFFICENS,u'document-styles'): ( + (OFFICENS,u'version'), + ), + (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'), + (XLINKNS,u'type'), + ), + (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'), + ), +# required_attributes + (STYLENS,u'list-level-label-alignment'): ( + (TEXTNS,u'label-followed-by'), + ), + (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'), + (XLINKNS,u'type'), + ), + (SVGNS,u'font-face-uri'): ( + (XLINKNS,u'href'), + (XLINKNS,u'type'), + ), + (SVGNS,u'linearGradient'): ( + (DRAWNS,u'name'), + ), + (SVGNS,u'radialGradient'): ( + (DRAWNS,u'name'), + ), + (SVGNS,u'stop'): ( + (SVGNS,u'offset'), + ), +# required_attributes + (TABLENS,u'background'): ( + (TABLENS,u'style-name'), + ), + (TABLENS,u'body'): ( + (TABLENS,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'), + (XLINKNS,u'type'), + (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'), + ), +# required_attributes + (TABLENS,u'even-columns'): ( + (TABLENS,u'style-name'), + ), + (TABLENS,u'even-rows'): ( + (TABLENS,u'style-name'), + ), + (TABLENS,u'filter-condition'): ( + (TABLENS,u'operator'), + (TABLENS,u'field-number'), + (TABLENS,u'value'), + ), +# required_attributes + (TABLENS,u'filter-set-item'): ( + (TABLENS,u'value'), + ), + (TABLENS,u'first-column'): ( + (TABLENS,u'style-name'), + ), + (TABLENS,u'first-row'): ( + (TABLENS,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'): ( + (TABLENS,u'style-name'), + ), + (TABLENS,u'last-row'): ( + (TABLENS,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'): ( + (TABLENS,u'style-name'), + ), + (TABLENS,u'odd-rows'): ( + (TABLENS,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'), + (XLINKNS,u'type'), + ), + (TABLENS,u'table-template'): ( +# (TABLENS,u'last-row-end-column'), # Deprecated +# (TABLENS,u'first-row-end-column'), # Deprecated + (TABLENS,u'name'), +# (TABLENS,u'last-row-start-column'), # Deprecated +# (TABLENS,u'first-row-start-column'), # Deprecated + ), + (TEXTNS,u'a'): ( + (XLINKNS,u'href'), + (XLINKNS,u'type'), + ), +# required_attributes + (TEXTNS,u'alphabetical-index'): ( + (TEXTNS,u'name'), + ), + (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'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'): ( + (XMLNS,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'), + ), + (TEXTNS,u'meta-field'): ( + (XMLNS,u'id'), + ), +# 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'), + ), +# required_attributes + (TEXTNS,u'numbered-paragraph'): ( + (TEXTNS,u'list-id'), + ), + (TEXTNS,u'object-index'): ( + (TEXTNS,u'name'), + ), + (TEXTNS,u'object-index-entry-template'): ( + (TEXTNS,u'style-name'), + ), +# required_attributes + (TEXTNS,u'outline-style'): ( + (STYLENS,u'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'fill'), + (SMILNS,u'fillDefault'), + (SMILNS,u'repeatCount'), + (SMILNS,u'repeatDur'), + (SMILNS,u'restart'), + (SMILNS,u'restartDefault'), + (XLINKNS,u'href'), + (XMLNS,u'id'), + ), + (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'), + (XMLNS,u'id'), + ), +# 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'), + (XMLNS,u'id'), + ), + (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'), + (XMLNS,u'id'), + ), +# 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'), + (XMLNS,u'id'), + ), + (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'class'), + (CHARTNS,u'column-mapping'), + (CHARTNS,u'row-mapping'), + (CHARTNS,u'style-name'), + (SVGNS,u'height'), + (SVGNS,u'width'), + (XLINKNS,u'href'), + (XLINKNS,u'type'), + (XMLNS,u'id'), + ), + (CHARTNS,u'data-label'):( + (CHARTNS,u'style-name'), + (SVGNS,u'x'), + (SVGNS,u'y'), + ), + (CHARTNS,u'data-point'):( + (CHARTNS,u'repeated'), + (CHARTNS,u'style-name'), + (XMLNS,u'id'), + ), + (CHARTNS,u'domain'):( + (TABLENS,u'cell-range-address'), + ), +# allowed_attributes + (CHARTNS,u'equation'):( + (CHARTNS,u'automatic-content'), + (CHARTNS,u'display-equation'), + (CHARTNS,u'display-r-square'), + (CHARTNS,u'style-name'), + (SVGNS,u'x'), + (SVGNS,u'y'), + ), + (CHARTNS,u'error-indicator'):( + (CHARTNS,u'dimension'), + (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'), + ), +# allowed_attributes + (CHARTNS,u'label-separator'):( + ), + (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'):( + (CHARTNS,u'data-source-has-labels'), + (CHARTNS,u'style-name'), + (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'), + (SVGNS,u'height'), + (SVGNS,u'width'), + (SVGNS,u'x'), + (SVGNS,u'y'), + (TABLENS,u'cell-range-address'), + (XMLNS,u'id'), + ), + (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'), + (XMLNS,u'id'), + ), + (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'country'), + (NUMBERNS,u'language'), + (NUMBERNS,u'rfc-language-tag'), + (NUMBERNS,u'script'), + (NUMBERNS,u'title'), + (NUMBERNS,u'transliteration-country'), + (NUMBERNS,u'transliteration-format'), + (NUMBERNS,u'transliteration-language'), + (NUMBERNS,u'transliteration-style'), + (STYLENS,u'display-name'), + (STYLENS,u'name'), + (STYLENS,u'volatile'), + ), + (NUMBERNS,u'currency-style'):( + (NUMBERNS,u'rfc-language-tag'), + (NUMBERNS,u'script'), + (NUMBERNS,u'automatic-order'), + (NUMBERNS,u'country'), + (NUMBERNS,u'language'), + (NUMBERNS,u'rfc-language-tag'), + (NUMBERNS,u'script'), + (NUMBERNS,u'title'), + (NUMBERNS,u'transliteration-country'), + (NUMBERNS,u'transliteration-format'), + (NUMBERNS,u'transliteration-language'), + (NUMBERNS,u'transliteration-style'), + (STYLENS,u'display-name'), + (STYLENS,u'name'), + (STYLENS,u'volatile'), + ), + (NUMBERNS,u'currency-symbol'):( + (NUMBERNS,u'country'), + (NUMBERNS,u'language'), + (NUMBERNS,u'rfc-language-tag'), + (NUMBERNS,u'script'), + ), +# allowed_attributes + (NUMBERNS,u'date-style'):( + (NUMBERNS,u'automatic-order'), + (NUMBERNS,u'country'), + (NUMBERNS,u'format-source'), + (NUMBERNS,u'language'), + (NUMBERNS,u'rfc-language-tag'), + (NUMBERNS,u'script'), + (NUMBERNS,u'title'), + (NUMBERNS,u'transliteration-country'), + (NUMBERNS,u'transliteration-format'), + (NUMBERNS,u'transliteration-language'), + (NUMBERNS,u'transliteration-style'), + (STYLENS,u'display-name'), + (STYLENS,u'name'), + (STYLENS,u'volatile'), + ), + (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'rfc-language-tag'), + (NUMBERNS,u'script'), + (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'country'), + (NUMBERNS,u'language'), + (NUMBERNS,u'rfc-language-tag'), + (NUMBERNS,u'script'), + (NUMBERNS,u'title'), + (NUMBERNS,u'transliteration-country'), + (NUMBERNS,u'transliteration-format'), + (NUMBERNS,u'transliteration-language'), + (NUMBERNS,u'transliteration-style'), + (STYLENS,u'display-name'), + (STYLENS,u'name'), + (STYLENS,u'volatile'), + ), + (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'country'), + (NUMBERNS,u'language'), + (NUMBERNS,u'rfc-language-tag'), + (NUMBERNS,u'script'), + (NUMBERNS,u'title'), + (NUMBERNS,u'transliteration-country'), + (NUMBERNS,u'transliteration-format'), + (NUMBERNS,u'transliteration-language'), + (NUMBERNS,u'transliteration-style'), + (STYLENS,u'display-name'), + (STYLENS,u'name'), + (STYLENS,u'volatile'), + ), + (NUMBERNS,u'time-style'):( + (NUMBERNS,u'country'), + (NUMBERNS,u'format-source'), + (NUMBERNS,u'language'), + (NUMBERNS,u'rfc-language-tag'), + (NUMBERNS,u'script'), + (NUMBERNS,u'title'), + (NUMBERNS,u'transliteration-country'), + (NUMBERNS,u'transliteration-format'), + (NUMBERNS,u'transliteration-language'), + (NUMBERNS,u'transliteration-style'), + (NUMBERNS,u'truncate-on-overflow'), + (STYLENS,u'display-name'), + (STYLENS,u'name'), + (STYLENS,u'volatile'), + ), + (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'), + (XMLNS,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'), + (XMLNS,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'), + (XMLNS,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'), + (XMLNS,u'id'), + ), +# allowed_attributes + (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'), + (XMLNS,u'id'), + ), + (DRAWNS,u'a'):( + (OFFICENS,u'name'), + (OFFICENS,u'server-map'), + (OFFICENS,u'target-frame-name'), + (OFFICENS,u'title'), + (XLINKNS,u'actuate'), + (XLINKNS,u'href'), + (XLINKNS,u'show'), + (XLINKNS,u'type'), + (XMLNS,u'id'), + ), + (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'), + (XMLNS,u'id'), + ), +# allowed_attributes + (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'), + (XMLNS,u'id'), + ), +# allowed_attributes + (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'), + (XMLNS,u'id'), + ), +# allowed_attributes + (DRAWNS,u'connector'):( + (DRAWNS,u'caption-id'), + (DRAWNS,u'class-names'), + (DRAWNS,u'end-glue-point'), + (DRAWNS,u'end-shape'), + (DRAWNS,u'id'), + (DRAWNS,u'layer'), + (DRAWNS,u'line-skew'), + (DRAWNS,u'name'), + (DRAWNS,u'start-glue-point'), + (DRAWNS,u'start-shape'), + (DRAWNS,u'style-name'), + (DRAWNS,u'text-style-name'), + (DRAWNS,u'transform'), + (DRAWNS,u'type'), + (DRAWNS,u'z-index'), + (PRESENTATIONNS,u'class-names'), + (PRESENTATIONNS,u'style-name'), + (SVGNS,u'd'), + (SVGNS,u'viewBox'), + (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'), + (XMLNS,u'id'), + ), +# allowed_attributes + (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'), + (XMLNS,u'id'), + ), + (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'), + (XMLNS,u'id'), + ), +# 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'), + (XMLNS,u'id'), + ), +# allowed_attributes + (DRAWNS,u'enhanced-geometry'):( + (DR3DNS,u'projection'), + (DR3DNS,u'shade-mode'), + (DRAWNS,u'concentric-gradient-fill-allowed'), + (DRAWNS,u'enhanced-path'), + (DRAWNS,u'extrusion'), + (DRAWNS,u'extrusion-allowed'), + (DRAWNS,u'extrusion-brightness'), + (DRAWNS,u'extrusion-color'), + (DRAWNS,u'extrusion-depth'), + (DRAWNS,u'extrusion-diffusion'), + (DRAWNS,u'extrusion-first-light-direction'), + (DRAWNS,u'extrusion-first-light-harsh'), + (DRAWNS,u'extrusion-first-light-level'), + (DRAWNS,u'extrusion-light-face'), + (DRAWNS,u'extrusion-metal'), + (DRAWNS,u'extrusion-number-of-line-segments'), + (DRAWNS,u'extrusion-origin'), + (DRAWNS,u'extrusion-rotation-angle'), + (DRAWNS,u'extrusion-rotation-center'), + (DRAWNS,u'extrusion-second-light-direction'), + (DRAWNS,u'extrusion-second-light-harsh'), + (DRAWNS,u'extrusion-second-light-level'), + (DRAWNS,u'extrusion-shininess'), + (DRAWNS,u'extrusion-skew'), + (DRAWNS,u'extrusion-specularity'), + (DRAWNS,u'extrusion-viewpoint'), + (DRAWNS,u'glue-point-leaving-directions'), + (DRAWNS,u'glue-points'), + (DRAWNS,u'glue-point-type'), + (DRAWNS,u'mirror-horizontal'), + (DRAWNS,u'mirror-vertical'), + (DRAWNS,u'modifiers'), + (DRAWNS,u'path-stretchpoint-x'), + (DRAWNS,u'path-stretchpoint-y'), + (DRAWNS,u'text-areas'), + (DRAWNS,u'text-path'), + (DRAWNS,u'text-path-allowed'), + (DRAWNS,u'text-path-mode'), + (DRAWNS,u'text-path-same-letter-heights'), + (DRAWNS,u'text-path-scale'), + (DRAWNS,u'text-rotate-angle'), + (DRAWNS,u'type'), + (SVGNS,u'viewBox'), + ), +# 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'), + (XMLNS,u'id'), + ), + (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'), + (XMLNS,u'id'), + ), +# 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'), + (XMLNS,u'id'), + ), + (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'), + (XMLNS,u'id'), + ), + (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'), + (XMLNS,u'id'), + ), + (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'), + (XMLNS,u'id'), + ), + (DRAWNS,u'object'):( + (XLINKNS,u'type'), + (XLINKNS,u'href'), + (DRAWNS,u'notify-on-update-of-ranges'), + (XLINKNS,u'actuate'), + (XLINKNS,u'show'), + (XMLNS,u'id'), + ), + (DRAWNS,u'object-ole'):( + (XLINKNS,u'actuate'), + (XLINKNS,u'href'), + (XLINKNS,u'type'), + (DRAWNS,u'class-id'), + (XLINKNS,u'show'), + (XMLNS,u'id'), + ), + (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'), + (XMLNS,u'id'), + ), + (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'), + (XMLNS,u'id'), + ), + (DRAWNS,u'param'):( + (DRAWNS,u'name'), + (DRAWNS,u'value'), + ), +# allowed_attributes + (DRAWNS,u'path'):( + (DRAWNS,u'caption-id'), + (DRAWNS,u'class-names'), + (DRAWNS,u'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'd'), + (SVGNS,u'height'), + (SVGNS,u'viewBox'), + (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'), + (XMLNS,u'id'), + ), +# allowed_attributes + (DRAWNS,u'plugin'):( + (DRAWNS,u'mime-type'), + (XLINKNS,u'type'), + (XLINKNS,u'href'), + (XLINKNS,u'actuate'), + (XLINKNS,u'show'), + (XMLNS,u'id'), + ), + (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'), + (XMLNS,u'id'), + ), +# 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'), + (XMLNS,u'id'), + ), +# allowed_attributes + (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'rx'), + (SVGNS,u'ry'), + (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'), + (XMLNS,u'id'), + ), +# 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'), + (XMLNS,u'id'), + ), + (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'), + (XMLNS,u'id'), + ), +# allowed_attributes + (FORMNS,u'button'):( + (XMLNS,u'id'), # First choice + (FORMNS,u'id'), + (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'delay-for-repeat'), + (FORMNS,u'repeat'), + (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'image-position'), + ), + (FORMNS,u'checkbox'):( + (XMLNS,u'id'), # First choice + (FORMNS,u'id'), + (FORMNS,u'linked-cell'), + (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'image-position'), + ), + (FORMNS,u'column'):( + (FORMNS,u'control-implementation'), + (FORMNS,u'text-style-name'), + (FORMNS,u'name'), + (FORMNS,u'label'), + ), +# allowed_attributes + (FORMNS,u'combobox'):( + (XMLNS,u'id'), # First choice + (FORMNS,u'auto-complete'), + (FORMNS,u'control-implementation'), + (FORMNS,u'convert-empty-to-null'), + (FORMNS,u'current-value'), + (FORMNS,u'data-field'), + (FORMNS,u'disabled'), + (FORMNS,u'dropdown'), + (FORMNS,u'id'), + (FORMNS,u'linked-cell'), + (FORMNS,u'list-source'), + (FORMNS,u'list-source-type'), + (FORMNS,u'max-length'), + (FORMNS,u'name'), + (FORMNS,u'printable'), + (FORMNS,u'readonly'), + (FORMNS,u'size'), + (FORMNS,u'source-cell-range'), + (FORMNS,u'tab-index'), + (FORMNS,u'tab-stop'), + (FORMNS,u'title'), + (FORMNS,u'value'), + (XFORMSNS,u'bind'), + ), +# allowed_attributes + (FORMNS,u'connection-resource'):( + (XLINKNS,u'href'), + ), + (FORMNS,u'date'):( + (XMLNS,u'id'), # First choice + (FORMNS,u'control-implementation'), + (FORMNS,u'convert-empty-to-null'), + (FORMNS,u'current-value'), + (FORMNS,u'data-field'), + (FORMNS,u'delay-for-repeat'), + (FORMNS,u'disabled'), + (FORMNS,u'id'), + (FORMNS,u'linked-cell'), + (FORMNS,u'max-length'), + (FORMNS,u'max-value'), + (FORMNS,u'min-value'), + (FORMNS,u'name'), + (FORMNS,u'printable'), + (FORMNS,u'readonly'), + (FORMNS,u'repeat'), + (FORMNS,u'spin-button'), + (FORMNS,u'tab-index'), + (FORMNS,u'tab-stop'), + (FORMNS,u'title'), + (FORMNS,u'value'), + (XFORMSNS,u'bind'), + ), + (FORMNS,u'file'):( + (XMLNS,u'id'), # First choice + (FORMNS,u'id'), + (FORMNS,u'linked-cell'), + (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'current-value'), + ), + (FORMNS,u'fixed-text'):( + (XMLNS,u'id'), # First choice + (FORMNS,u'id'), + (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'), + ), +# 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'), + ), +# allowed_attributes + (FORMNS,u'formatted-text'):( + (XMLNS,u'id'), # First choice + (FORMNS,u'control-implementation'), + (FORMNS,u'convert-empty-to-null'), + (FORMNS,u'current-value'), + (FORMNS,u'data-field'), + (FORMNS,u'delay-for-repeat'), + (FORMNS,u'disabled'), + (FORMNS,u'id'), + (FORMNS,u'linked-cell'), + (FORMNS,u'max-length'), + (FORMNS,u'max-value'), + (FORMNS,u'min-value'), + (FORMNS,u'name'), + (FORMNS,u'printable'), + (FORMNS,u'readonly'), + (FORMNS,u'repeat'), + (FORMNS,u'spin-button'), + (FORMNS,u'tab-index'), + (FORMNS,u'tab-stop'), + (FORMNS,u'title'), + (FORMNS,u'validation'), + (FORMNS,u'value'), + (XFORMSNS,u'bind'), + ), + (FORMNS,u'frame'):( + (XMLNS,u'id'), # First choice + (FORMNS,u'id'), + (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'), + ), +# allowed_attributes + (FORMNS,u'generic-control'):( + (XMLNS,u'id'), # First choice + (FORMNS,u'id'), + (FORMNS,u'control-implementation'), + (XFORMSNS,u'bind'), + (FORMNS,u'name'), + ), + (FORMNS,u'grid'):( + (XMLNS,u'id'), # First choice + (FORMNS,u'id'), + (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'hidden'):( + (XMLNS,u'id'), # First choice + (FORMNS,u'id'), + (FORMNS,u'control-implementation'), + (XFORMSNS,u'bind'), + (FORMNS,u'name'), + (FORMNS,u'value'), + ), + (FORMNS,u'image'):( + (XMLNS,u'id'), # First choice + (FORMNS,u'id'), + (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'image-frame'):( + (XMLNS,u'id'), # First choice + (FORMNS,u'id'), + (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'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'):( + (XMLNS,u'id'), # First choice + (FORMNS,u'bound-column'), + (FORMNS,u'control-implementation'), + (FORMNS,u'data-field'), + (FORMNS,u'disabled'), + (FORMNS,u'dropdown'), + (FORMNS,u'id'), + (FORMNS,u'linked-cell'), + (FORMNS,u'list-linkage-type'), + (FORMNS,u'list-source'), + (FORMNS,u'list-source-type'), + (FORMNS,u'multiple'), + (FORMNS,u'name'), + (FORMNS,u'printable'), + (FORMNS,u'size'), + (FORMNS,u'source-cell-range'), + (FORMNS,u'tab-index'), + (FORMNS,u'tab-stop'), + (FORMNS,u'title'), + (FORMNS,u'xforms-list-source'), + (XFORMSNS,u'bind'), + ), + (FORMNS,u'number'):( + (XMLNS,u'id'), # First choice + (FORMNS,u'control-implementation'), + (FORMNS,u'convert-empty-to-null'), + (FORMNS,u'current-value'), + (FORMNS,u'data-field'), + (FORMNS,u'delay-for-repeat'), + (FORMNS,u'disabled'), + (FORMNS,u'id'), + (FORMNS,u'linked-cell'), + (FORMNS,u'max-length'), + (FORMNS,u'max-value'), + (FORMNS,u'min-value'), + (FORMNS,u'name'), + (FORMNS,u'printable'), + (FORMNS,u'readonly'), + (FORMNS,u'repeat'), + (FORMNS,u'spin-button'), + (FORMNS,u'tab-index'), + (FORMNS,u'tab-stop'), + (FORMNS,u'title'), + (FORMNS,u'value'), + (XFORMSNS,u'bind'), + ), + (FORMNS,u'option'):( + (FORMNS,u'current-selected'), + (FORMNS,u'selected'), + (FORMNS,u'value'), + (FORMNS,u'label'), + ), + (FORMNS,u'password'):( + (XMLNS,u'id'), # First choice + (FORMNS,u'id'), + (FORMNS,u'linked-cell'), + (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'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'):( + (XMLNS,u'id'), # First choice + (FORMNS,u'id'), + (FORMNS,u'linked-cell'), + (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'image-position'), + ), + (FORMNS,u'text'):( + (XMLNS,u'id'), # First choice + (FORMNS,u'id'), + (FORMNS,u'linked-cell'), + (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'current-value'), + ), + (FORMNS,u'textarea'):( + (XMLNS,u'id'), # First choice + (FORMNS,u'id'), + (FORMNS,u'linked-cell'), + (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'current-value'), + ), + (FORMNS,u'time'):( + (XMLNS,u'id'), # First choice + (FORMNS,u'control-implementation'), + (FORMNS,u'convert-empty-to-null'), + (FORMNS,u'current-value'), + (FORMNS,u'data-field'), + (FORMNS,u'delay-for-repeat'), + (FORMNS,u'disabled'), + (FORMNS,u'id'), + (FORMNS,u'linked-cell'), + (FORMNS,u'max-length'), + (FORMNS,u'max-value'), + (FORMNS,u'min-value'), + (FORMNS,u'name'), + (FORMNS,u'printable'), + (FORMNS,u'readonly'), + (FORMNS,u'repeat'), + (FORMNS,u'spin-button'), + (FORMNS,u'tab-index'), + (FORMNS,u'tab-stop'), + (FORMNS,u'title'), + (FORMNS,u'value'), + (XFORMSNS,u'bind'), + ), + (FORMNS,u'value-range'):( + (XMLNS,u'id'), # First choice + (FORMNS,u'id'), + (FORMNS,u'linked-cell'), + (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'repeat'), + (FORMNS,u'min-value'), + (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,'preferred-view-mode'), + (MANIFESTNS,'size'), + (MANIFESTNS,'version'), + ), + (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'), + ), +# allowed_attributes + (OFFICENS,u'annotation'):( + (DRAWNS,u'caption-point-x'), + (DRAWNS,u'caption-point-y'), + (DRAWNS,u'class-names'), + (DRAWNS,u'corner-radius'), + (DRAWNS,u'id'), + (DRAWNS,u'layer'), + (DRAWNS,u'name'), + (DRAWNS,u'style-name'), + (DRAWNS,u'text-style-name'), + (DRAWNS,u'transform'), + (DRAWNS,u'z-index'), + (OFFICENS,u'display'), + (OFFICENS,u'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'), + (XMLNS,u'id'), + ), + (OFFICENS,u'annotation-end'): ( + (OFFICENS,u'name'), + ), + (OFFICENS,u'automatic-styles'):( + ), + (OFFICENS,u'binary-data'):( + ), + (OFFICENS,u'body'):( + ), + (OFFICENS,u'change-info'):( + ), + (OFFICENS,u'chart'):( + ), +# allowed_attributes + (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'), + (GRDDLNS,u'transformation'), + ), + (OFFICENS,u'document-content'):( + (OFFICENS,u'version'), + (GRDDLNS,u'transformation'), + ), + (OFFICENS,u'document-meta'):( + (OFFICENS,u'version'), + (GRDDLNS,u'transformation'), + ), + (OFFICENS,u'document-settings'):( + (OFFICENS,u'version'), + (GRDDLNS,u'transformation'), + ), + (OFFICENS,u'document-styles'):( + (OFFICENS,u'version'), + (GRDDLNS,u'transformation'), + ), + (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'), + (TABLENS,u'protection-key-digest-algorithm'), + ), + (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'), + (XMLNS,u'id'), + ), +# 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'), + ), +# allowed_attributes + (STYLENS,u'chart-properties'): ( + (CHARTNS,u'angle-offset'), + (CHARTNS,u'auto-position'), + (CHARTNS,u'auto-size'), + (CHARTNS,u'axis-label-position'), + (CHARTNS,u'axis-position'), + (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-lower-range'), + (CHARTNS,u'error-margin'), + (CHARTNS,u'error-percentage'), + (CHARTNS,u'error-upper-indicator'), + (CHARTNS,u'error-upper-limit'), + (CHARTNS,u'error-upper-range'), + (CHARTNS,u'gap-width'), + (CHARTNS,u'group-bars-per-axis'), + (CHARTNS,u'hole-size'), + (CHARTNS,u'include-hidden-cells'), + (CHARTNS,u'interpolation'), + (CHARTNS,u'interval-major'), + (CHARTNS,u'interval-minor-divisor'), + (CHARTNS,u'japanese-candle-stick'), + (CHARTNS,u'label-arrangement'), + (CHARTNS,u'label-position'), + (CHARTNS,u'label-position-negative'), + (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'reverse-direction'), + (CHARTNS,u'right-angled-axes'), + (CHARTNS,u'scale-text'), + (CHARTNS,u'series-source'), + (CHARTNS,u'solid-type'), + (CHARTNS,u'sort-by-x-values'), + (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-mark-position'), + (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'treat-empty-cells'), + (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'), + ), +# allowed_attributes + (STYLENS,u'default-page-layout'):( + ), + (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'draw-aspect'), + (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'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'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'shrink-to-fit'), + (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-linecap'), + (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'):( + ), + (STYLENS,u'list-level-label-alignment'):( + (FONS,u'text-indent'), + (TEXTNS,u'label-followed-by'), + (TEXTNS,u'list-tab-stop-position'), + (FONS,u'margin-left'), + ), +# 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'list-level-position-and-space-mode'), + (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-base-width'), + (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'layout-grid-snap-to'), + (STYLENS,u'layout-grid-standard-mode'), + (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'join-border'), + (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'editable'), + (STYLENS,u'protect'), + (STYLENS,u'writing-mode'), + (TEXTNS,u'dont-balance-text-columns'), + ), + (STYLENS,u'style'):( + (STYLENS,u'auto-update'), + (STYLENS,u'class'), + (STYLENS,u'data-style-name'), + (STYLENS,u'default-outline-level'), + (STYLENS,u'display-name'), + (STYLENS,u'family'), + (STYLENS,u'list-level'), + (STYLENS,u'list-style-name'), + (STYLENS,u'master-page-name'), + (STYLENS,u'name'), + (STYLENS,u'next-style-name'), + (STYLENS,u'parent-style-name'), + (STYLENS,u'percentage-data-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'), + (STYLENS,u'writing-mode'), + ), +# 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'script'), + (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'rfc-language-tag'), + (STYLENS,u'rfc-language-tag-asian'), + (STYLENS,u'rfc-language-tag-complex'), + (STYLENS,u'script-asian'), + (STYLENS,u'script-complex'), + (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-overline-color'), + (STYLENS,u'text-overline-mode'), + (STYLENS,u'text-overline-style'), + (STYLENS,u'text-overline-type'), + (STYLENS,u'text-overline-width'), + (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'background'):( + (TABLENS,u'style-name'), + ), + (TABLENS,u'body'):( + (TABLENS,u'paragraph-style-name'), + (TABLENS,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'use-wildcards'), + (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'), + ), +# allowed_attributes + (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'):( + (OFFICENS,u'boolean-value'), + (OFFICENS,u'currency'), + (OFFICENS,u'date-value'), + (OFFICENS,u'string-value'), + (OFFICENS,u'time-value'), + (OFFICENS,u'value'), + (OFFICENS,u'value-type'), + (TABLENS,u'content-validation-name'), + (TABLENS,u'formula'), + (TABLENS,u'number-columns-repeated'), + (TABLENS,u'protect'), + (TABLENS,u'protected'), + (TABLENS,u'style-name'), + (XHTMLNS,u'about'), + (XHTMLNS,u'content'), + (XHTMLNS,u'datatype'), + (XHTMLNS,u'property'), + (XMLNS,u'id'), + ), + (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'desc'):( + ), + (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'):( + (TABLENS,u'paragraph-style-name'), + (TABLENS,u'style-name'), + ), + (TABLENS,u'even-rows'):( + (TABLENS,u'paragraph-style-name'), + (TABLENS,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'):( + ), +# allowed_attributes + (TABLENS,u'filter-set-item'):( + (TABLENS,u'value'), + ), + (TABLENS,u'first-column'):( + (TABLENS,u'paragraph-style-name'), + (TABLENS,u'style-name'), + ), + (TABLENS,u'first-row'):( + (TABLENS,u'paragraph-style-name'), + (TABLENS,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'):( + (TABLENS,u'paragraph-style-name'), + (TABLENS,u'style-name'), + ), + (TABLENS,u'last-row'):( + (TABLENS,u'paragraph-style-name'), + (TABLENS,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'):( + (TABLENS,u'paragraph-style-name'), + (TABLENS,u'style-name'), + ), + (TABLENS,u'odd-rows'):( + (TABLENS,u'paragraph-style-name'), + (TABLENS,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'):( + ), +# allowed_attributes + (TABLENS,u'sort'):( + (TABLENS,u'case-sensitive'), + (TABLENS,u'embedded-number-behavior'), + (TABLENS,u'algorithm'), + (TABLENS,u'target-range-address'), + (TABLENS,u'country'), + (TABLENS,u'language'), + (TABLENS,u'bind-styles-to-content'), + (TABLENS,u'rfc-language-tag'), + (TABLENS,u'script'), + ), + (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'is-sub-table'), + (TABLENS,u'name'), + (TABLENS,u'print'), + (TABLENS,u'print-ranges'), + (TABLENS,u'protected'), + (TABLENS,u'protection-key'), + (TABLENS,u'protection-key-digest-algorithm'), + (TABLENS,u'style-name'), + (TABLENS,u'template-name'), + (TABLENS,u'use-banding-columns-styles'), + (TABLENS,u'use-banding-rows-styles'), + (TABLENS,u'use-first-column-styles'), + (TABLENS,u'use-first-row-styles'), + (TABLENS,u'use-last-column-styles'), + (TABLENS,u'use-last-row-styles'), + (XMLNS,u'id'), + ), + (TABLENS,u'table-cell'):( + (OFFICENS,u'boolean-value'), + (OFFICENS,u'currency'), + (OFFICENS,u'date-value'), + (OFFICENS,u'string-value'), + (OFFICENS,u'time-value'), + (OFFICENS,u'value'), + (OFFICENS,u'value-type'), + (TABLENS,u'content-validation-name'), + (TABLENS,u'formula'), + (TABLENS,u'number-columns-repeated'), + (TABLENS,u'number-columns-spanned'), + (TABLENS,u'number-matrix-columns-spanned'), + (TABLENS,u'number-matrix-rows-spanned'), + (TABLENS,u'number-rows-spanned'), + (TABLENS,u'protect'), + (TABLENS,u'protected'), + (TABLENS,u'style-name'), + (XHTMLNS,u'about'), + (XHTMLNS,u'content'), + (XHTMLNS,u'datatype'), + (XHTMLNS,u'property'), + (XMLNS,u'id'), + ), +# allowed_attributes + (TABLENS,u'table-column'):( + (TABLENS,u'style-name'), + (TABLENS,u'default-cell-style-name'), + (TABLENS,u'visibility'), + (TABLENS,u'number-columns-repeated'), + (XMLNS,u'id'), + ), + (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'), + (XMLNS,u'id'), + ), + (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'), + ), +# allowed_attributes + (TABLENS,u'table-template'):( + (TABLENS,u'last-row-end-column'), + (TABLENS,u'first-row-end-column'), + (TABLENS,u'name'), + (TABLENS,u'last-row-start-column'), + (TABLENS,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'title'):( + ), + (TABLENS,u'tracked-changes'):( + (TABLENS,u'track-changes'), + ), +# allowed_attributes + (TEXTNS,u'a'):( + (OFFICENS,u'name'), + (OFFICENS,u'target-frame-name'), + (OFFICENS,u'title'), + (TEXTNS,u'style-name'), + (TEXTNS,u'visited-style-name'), + (XLINKNS,u'actuate'), + (XLINKNS,u'href'), + (XLINKNS,u'show'), + (XLINKNS,u'type'), + ), + (TEXTNS,u'alphabetical-index'):( + (TEXTNS,u'name'), + (TEXTNS,u'protected'), + (TEXTNS,u'protection-key'), + (TEXTNS,u'protection-key-digest-algorithm'), + (TEXTNS,u'style-name'), + (XMLNS,u'id'), + ), + (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'):( + (FONS,u'country'), + (FONS,u'language'), + (FONS,u'script'), + (STYLENS,u'rfc-language-tag'), + (TEXTNS,u'alphabetical-separators'), + (TEXTNS,u'capitalize-entries'), + (TEXTNS,u'combine-entries'), + (TEXTNS,u'combine-entries-with-dash'), + (TEXTNS,u'combine-entries-with-pp'), + (TEXTNS,u'comma-separated'), + (TEXTNS,u'ignore-case'), + (TEXTNS,u'index-scope'), + (TEXTNS,u'main-entry-style-name'), + (TEXTNS,u'relative-tab-stop-position'), + (TEXTNS,u'sort-algorithm'), + (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'protection-key-digest-algorithm'), + (XMLNS,u'id'), + ), + (TEXTNS,u'bibliography-configuration'):( + (FONS,u'country'), + (FONS,u'language'), + (FONS,u'script'), + (STYLENS,u'rfc-language-tag'), + (TEXTNS,u'numbered-entries'), + (TEXTNS,u'prefix'), + (TEXTNS,u'sort-algorithm'), + (TEXTNS,u'sort-by-position'), + (TEXTNS,u'suffix'), + ), + (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'), + (XMLNS,u'id'), + ), + (TEXTNS,u'bookmark-end'):( + (TEXTNS,u'name'), + ), + (TEXTNS,u'bookmark-ref'):( + (TEXTNS,u'ref-name'), + (TEXTNS,u'reference-format'), + ), + (TEXTNS,u'bookmark-start'):( + (XHTMLNS,u'about'), + (XHTMLNS,u'content'), + (XHTMLNS,u'datatype'), + (XHTMLNS,u'property'), + (TEXTNS,u'name'), + (XMLNS,u'id'), + ), +# 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'), + (XMLNS,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'), + (XHTMLNS,u'about'), + (XHTMLNS,u'content'), + (XHTMLNS,u'datatype'), + (XHTMLNS,u'property'), + (XMLNS,u'id'), + ), + (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'protection-key-digest-algorithm'), + (XMLNS,u'id'), + ), + (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'outline-level'), + (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'protection-key-digest-algorithm'), + (XMLNS,u'id'), + ), + (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'continue-list'), + (XMLNS,u'id'), + ), + (TEXTNS,u'list-header'):( + (XMLNS,u'id'), + ), +# allowed_attributes + (TEXTNS,u'list-item'):( + (TEXTNS,u'start-value'), + (TEXTNS,u'style-override'), + (XMLNS,u'id'), + ), + (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'), + ), +# allowed_attributes + (TEXTNS,u'meta'):( + (XHTMLNS,u'about'), + (XHTMLNS,u'content'), + (XMLNS,u'id'), + (XHTMLNS,u'property'), + (XHTMLNS,u'datatype'), + ), +# allowed_attributes + (TEXTNS,u'meta-field'):( + (STYLENS,u'data-style-name'), + (XMLNS,u'id'), + ), + (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'level'), + (TEXTNS,u'list-id'), + (TEXTNS,u'start-value'), + (TEXTNS,u'style-name'), + (XMLNS,u'id'), + ), + (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'), + (TEXTNS,u'protection-key-digest-algorithm'), + (XMLNS,u'id'), + ), +# 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'):( + (STYLENS,u'name'), + ), +# allowed_attributes + (TEXTNS,u'p'):( + (TEXTNS,u'class-names'), + (TEXTNS,u'cond-style-name'), + (TEXTNS,u'id'), + (TEXTNS,u'style-name'), + (XHTMLNS,u'about'), + (XHTMLNS,u'content'), + (XHTMLNS,u'datatype'), + (XHTMLNS,u'property'), + (XMLNS,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'), + ), +# allowed_attributes + (TEXTNS,u'section'):( + (TEXTNS,u'condition'), + (TEXTNS,u'display'), + (TEXTNS,u'name'), + (TEXTNS,u'protected'), + (TEXTNS,u'protection-key'), + (TEXTNS,u'protection-key-digest-algorithm'), + (TEXTNS,u'style-name'), + (XMLNS,u'id'), + ), + (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'protection-key-digest-algorithm'), + (XMLNS,u'id'), + ), + (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'protection-key-digest-algorithm'), + (XMLNS,u'id'), + ), + (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'protection-key-digest-algorithm'), + (XMLNS,u'id'), + ), + (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'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-index-source-styles'), + (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/libs/odf/load.py b/libs/odf/load.py new file mode 100644 index 0000000..35bdb82 --- /dev/null +++ b/libs/odf/load.py @@ -0,0 +1,115 @@ +#!/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 +try: + from cStringIO import StringIO +except ImportError: + 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 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/libs/odf/manifest.py b/libs/odf/manifest.py new file mode 100644 index 0000000..1d5524f --- /dev/null +++ b/libs/odf/manifest.py @@ -0,0 +1,44 @@ +#!/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): +# +# + +import sys, os.path +sys.path.append(os.path.dirname(__file__)) + +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/libs/odf/math.py b/libs/odf/math.py new file mode 100644 index 0000000..5dc38df --- /dev/null +++ b/libs/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/libs/odf/meta.py b/libs/odf/meta.py new file mode 100644 index 0000000..68b1d19 --- /dev/null +++ b/libs/odf/meta.py @@ -0,0 +1,67 @@ +# -*- 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): + args.setdefault('type', 'simple') + return Element(qname = (METANS,'template'), **args) + +def UserDefined(**args): + return Element(qname = (METANS,'user-defined'), **args) + diff --git a/libs/odf/namespaces.py b/libs/odf/namespaces.py new file mode 100644 index 0000000..9568e98 --- /dev/null +++ b/libs/odf/namespaces.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2013 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/1.3.1dev" + +ANIMNS = u"urn:oasis:names:tc:opendocument:xmlns:animation:1.0" +CHARTNS = u"urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +CHARTOOONS = u"http://openoffice.org/2010/chart" +CONFIGNS = u"urn:oasis:names:tc:opendocument:xmlns:config:1.0" +CSS3TNS = u"http://www.w3.org/TR/css3-text/" +#DBNS = u"http://openoffice.org/2004/database" +DBNS = u"urn:oasis:names:tc:opendocument:xmlns:database:1.0" +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" +FORMXNS = u"urn:openoffice:names:experimental:ooxml-odf-interop: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" +OOOCNS = u"http://openoffice.org/2004/calc" +OOONS = u"http://openoffice.org/2004/office" +OOOWNS = u"http://openoffice.org/2004/writer" +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" +TABLEOOONS = u"http://openoffice.org/2009/table" +TEXTNS = u"urn:oasis:names:tc:opendocument:xmlns:text:1.0" +XFORMSNS = u"http://www.w3.org/2002/xforms" +XHTMLNS = u"http://www.w3.org/1999/xhtml" +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', + CHARTOOONS: u'chartooo', + CONFIGNS: u'config', + CSS3TNS: u'css3t', + DBNS: u'db', + DCNS: u'dc', + DOMNS: u'dom', + DR3DNS: u'dr3d', + DRAWNS: u'draw', + FIELDNS: u'field', + FONS: u'fo', + FORMNS: u'form', + FORMXNS: u'formx', + 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', + TABLEOOONS: u'tableooo', + TEXTNS: u'text', + XFORMSNS: u'xforms', + XLINKNS: u'xlink', + XHTMLNS: u'xhtml', + XMLNS: u'xml', + XSDNS: u'xsd', + XSINS: u'xsi', +} diff --git a/libs/odf/number.py b/libs/odf/number.py new file mode 100644 index 0000000..12d81cb --- /dev/null +++ b/libs/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/libs/odf/odf2moinmoin.py b/libs/odf/odf2moinmoin.py new file mode 100644 index 0000000..167fcda --- /dev/null +++ b/libs/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/libs/odf/odf2xhtml.py b/libs/odf/odf2xhtml.py new file mode 100644 index 0000000..8c5fbb2 --- /dev/null +++ b/libs/odf/odf2xhtml.py @@ -0,0 +1,1617 @@ +#!/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() + +import sys, os.path +sys.path.append(os.path.dirname(__file__)) +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'] = "0cm" + 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'] = "0cm" + 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 = {} + procedures=[] + for rule,val in ruleset.items(): + if rule[0] == '': + sdict[rule[1]] = val + continue + method = self.ruleconversions.get(rule, None ) + if method: + procedures.append([method, ruleset, sdict, rule, val]) + # this ensures that the procedures for horizontal position + # are run last! It is important since Python3 makes the order + # of dictionaries unpredictable + for p in filter(lambda x: x[0] != self.c_hp, procedures): + method, ruleset, sdict, rule, val = p + method(ruleset, sdict, rule, val) + for p in filter(lambda x: x[0] == self.c_hp, procedures): + method, ruleset, sdict, rule, val = p + 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.set_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 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 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 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 pagelayout in self.styledict: + 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 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 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 + if sys.version_info[0]==3: + self.writeout(self.currentnote) + else: + 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 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. + @param odffile if the type is unicode string: name of a file; else + it must be an open file type + """ + assert(type(odffile)==type(u"") or 'rb' in repr(odffile) or 'BufferedReader' in repr(odffile) or 'BytesIO' in repr(odffile)) + + self.lines = [] + self._wfunc = self._wlines + if type(odffile)==type(u""): + 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: + if sys.version_info[0]==3: + self.characters(str(node)) + else: + self.characters(unicode(node)) + + + def odf2xhtml(self, odffile): + """ + Load a file and return the XHTML + @param odffile if the type is unicode string: name of a file; else + it must be an open file type + @return XHTML code as a a unicode string + """ + assert(type(odffile)==type(u"") or 'rb' in repr(odffile) or 'BufferedReader' in repr(odffile) or 'BytesIO' in repr(odffile)) + + + self.load(odffile) + + result=self.xhtml() + assert(type(result)==type(u"")) + return result + + 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/libs/odf/odfmanifest.py b/libs/odf/odfmanifest.py new file mode 100644 index 0000000..70649ca --- /dev/null +++ b/libs/odf/odfmanifest.py @@ -0,0 +1,120 @@ +#!/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 __future__ import print_function +# 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 +try: + from cStringIO import StringIO +except ImportError: + 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() + if not isinstance(manifestxml, str): + manifestxml=manifestxml.decode("utf-8") + 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/libs/odf/office.py b/libs/odf/office.py new file mode 100644 index 0000000..2d6b752 --- /dev/null +++ b/libs/odf/office.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2013 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 AnnotationEnd(**args): + return StyleRefElement(qname = (OFFICENS,'annotation-end'), **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.2", **args): + return Element(qname = (OFFICENS,'document'), version=version, **args) + +def DocumentContent(version="1.2", **args): + return Element(qname = (OFFICENS, 'document-content'), version=version, **args) + +def DocumentMeta(version="1.2", **args): + return Element(qname = (OFFICENS, 'document-meta'), version=version, **args) + +def DocumentSettings(version="1.2", **args): + return Element(qname = (OFFICENS, 'document-settings'), version=version, **args) + +def DocumentStyles(version="1.2", **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/libs/odf/opendocument.py b/libs/odf/opendocument.py new file mode 100644 index 0000000..e8736cf --- /dev/null +++ b/libs/odf/opendocument.py @@ -0,0 +1,1011 @@ +# -*- 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): +# +# Copyright (C) 2014 Georges Khaznadar +# migration to Python3, JavaDOC comments and automatic +# build of documentation +# + +__doc__="""Use OpenDocument to generate your documents.""" + +import zipfile, time, sys, mimetypes, copy, os.path + +# to allow Python3 to access modules in the same path +sys.path.append(os.path.dirname(__file__)) + +# using BytesIO provides a cleaner interface than StringIO +# with both Python2 and Python3: the programmer must care to +# convert strings or unicode to bytes, which is valid for Python 2 and 3. +from io import StringIO, BytesIO + +from namespaces import * +import manifest +import meta +from office import * +import element +from attrconverters import make_NCName +from xml.sax.xmlreader import InputSource +from odfmanifest import manifestlist + +if sys.version_info[0] == 3: + unicode=str # unicode function does not exist + +__version__= TOOLSVERSION + +_XMLPROLOGUE = u"\n" + +##### +# file permission as an integer value. +# The following syntax would be invalid for Python3: +# UNIXPERMS = 0100644 << 16L # -rw-r--r-- +# +# So it has been precomputed: +# 2175008768 is the same value as 0100644 << 16L == -rw-r--r-- +#### +UNIXPERMS = 2175008768 + +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. + +############### +# mime-types => file extensions +############### +odmimetypes = { + u'application/vnd.oasis.opendocument.text': u'.odt', + u'application/vnd.oasis.opendocument.text-template': u'.ott', + u'application/vnd.oasis.opendocument.graphics': u'.odg', + u'application/vnd.oasis.opendocument.graphics-template': u'.otg', + u'application/vnd.oasis.opendocument.presentation': u'.odp', + u'application/vnd.oasis.opendocument.presentation-template': u'.otp', + u'application/vnd.oasis.opendocument.spreadsheet': u'.ods', + u'application/vnd.oasis.opendocument.spreadsheet-template': u'.ots', + u'application/vnd.oasis.opendocument.chart': u'.odc', + u'application/vnd.oasis.opendocument.chart-template': u'.otc', + u'application/vnd.oasis.opendocument.image': u'.odi', + u'application/vnd.oasis.opendocument.image-template': u'.oti', + u'application/vnd.oasis.opendocument.formula': u'.odf', + u'application/vnd.oasis.opendocument.formula-template': u'.otf', + u'application/vnd.oasis.opendocument.text-master': u'.odm', + u'application/vnd.oasis.opendocument.text-web': u'.oth', +} + +class OpaqueObject: + """ + just a record to bear a filename, a mediatype and a bytes content + """ + def __init__(self, filename, mediatype, content=None): + """ + the constructor + @param filename a unicode string + @param mediatype a unicode string + @param content a byte string or None + """ + assert(type(filename)==type(u"")) + assert(type(mediatype)==type(u"")) + assert(type(content)==type(b"") or 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. + Example of use: d = OpenDocument(mimetype); fd.write(d.xml()) + """ + thumbnail = None + + def __init__(self, mimetype, add_generator=True): + """ + the constructor + @param mimetype a unicode string + @param add_generator a boolean + """ + assert(type(mimetype)==type(u"")) + assert(isinstance(add_generator,True.__class__)) + + self.mimetype = mimetype + self.childobjects = [] + self._extra = [] + self.folder = u"" # 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): + """ + Clears internal caches + """ + self.element_dict = {} + self._styles_dict = {} + self._styles_ooo_fix = {} + + def build_caches(self, elt): + """ + Builds internal caches; called from element.py + @param elt an element.Element instance + """ + # assert(isinstance(elt, element.Element)) + # why do I need this more intricated assertion? + # with Python3, the type of elt pops out as odf.element.Element + # in one test ??? + import odf.element + assert(isinstance(elt, element.Element) or isinstance(elt, odf.element.Element) ) + + if elt.qname not in self.element_dict: + self.element_dict[elt.qname] = [] + self.element_dict[elt.qname].append(elt) + if elt.qname == (STYLENS, u'style'): + self.__register_stylename(elt) # Add to style dictionary + styleref = elt.getAttrNS(TEXTNS,u'style-name') + if styleref is not None and styleref in self._styles_ooo_fix: + elt.setAttrNS(TEXTNS,u'style-name', self._styles_ooo_fix[styleref]) + + def __register_stylename(self, elt): + ''' + Register a style. But there are three style dictionaries: + office:styles, office:automatic-styles and office:master-styles + Chapter 14. + @param elt an element.Element instance + ''' + assert(isinstance(elt, element.Element)) + + name = elt.getAttrNS(STYLENS, u'name') + if name is None: + return + if elt.parentNode.qname in ((OFFICENS,u'styles'), (OFFICENS,u'automatic-styles')): + if name in self._styles_dict: + newname = u'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 + elt.setAttrNS(STYLENS, u'name', name) + self._styles_dict[name] = elt + + def toXml(self, filename=u''): + """ + converts the document to a valid Xml format. + @param filename unicode string: the name of a file, defaults to + an empty string. + @return if filename is not empty, the XML code will be written into it + and the method returns None; otherwise the method returns a StringIO + containing valid XML. + Then a ".getvalue()" should return a unicode string. + """ + assert(type(filename)==type(u"")) + + result=None + xml=StringIO() + if sys.version_info[0]==2: + xml.write(_XMLPROLOGUE) + else: + xml.write(_XMLPROLOGUE) + self.body.toXml(0, xml) + if not filename: + result=xml.getvalue() + else: + f=codecs.open(filename,'w', encoding='utf-8') + f.write(xml.getvalue()) + f.close() + return result + + def xml(self): + """ + Generates the full document as an XML "file" + @return a bytestream in UTF-8 encoding + """ + self.__replaceGenerator() + xml=StringIO() + if sys.version_info[0]==2: + xml.write(_XMLPROLOGUE) + else: + xml.write(_XMLPROLOGUE) + self.topnode.toXml(0, xml) + return xml.getvalue().encode("utf-8") + + + def contentxml(self): + """ + Generates the content.xml file + @return 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().encode("utf-8") + + def __manifestxml(self): + """ + Generates the manifest.xml file; + The self.manifest isn't avaible unless the document is being saved + @return a unicode string + """ + xml=StringIO() + xml.write(_XMLPROLOGUE) + self.manifest.toXml(0,xml) + result=xml.getvalue() + assert(type(result)==type(u"")) + return result + + def metaxml(self): + """ + Generates the meta.xml file + @return a unicode string + """ + self.__replaceGenerator() + x = DocumentMeta() + x.addElement(self.meta) + xml=StringIO() + xml.write(_XMLPROLOGUE) + x.toXml(0,xml) + result=xml.getvalue() + assert(type(result)==type(u"")) + return result + + def settingsxml(self): + """ + Generates the settings.xml file + @return a unicode string + """ + x = DocumentSettings() + x.addElement(self.settings) + xml=StringIO() + if sys.version_info[0]==2: + xml.write(_XMLPROLOGUE) + else: + xml.write(_XMLPROLOGUE) + x.toXml(0,xml) + result=xml.getvalue() + assert(type(result)==type(u"")) + return result + + 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 + @return the list of style names as unicode strings + """ + for e in top.childNodes: + if e.nodeType == element.Node.ELEMENT_NODE: + for styleref in ( + (CHARTNS,u'style-name'), + (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: + # due to the polymorphism of e.getAttrNS(), + # a unicode type is enforced for elements + stylenamelist.append(unicode(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 + @return a list of element.Element instances + """ + 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) + + # check the type of the returned data + ok=True + for e in stylelist: ok = ok and isinstance(e, element.Element) + assert(ok) + + return stylelist + + def stylesxml(self): + """ + Generates the styles.xml file + @return valid XML code as a unicode string + """ + 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) + result = xml.getvalue() + + assert(type(result)==type(u"")) + + return result + + 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 + @param filename unicode string: name of a file for Pictures + @param mediatype unicode string: name of a media, None by default + @param content bytes: content of media, None by default + @return a unicode string: the file name of the media, eventually + created on the fly + """ + if content is None: + if mediatype is None: + mediatype, encoding = mimetypes.guess_type(filename) + if mediatype is None: + mediatype = u'' + try: ext = filename[filename.rindex(u'.'):] + except: ext=u'' + else: + ext = mimetypes.guess_extension(mediatype) + manifestfn = u"Pictures/%0.0f%s" % ((time.time()*10000000000), ext) + self.Pictures[manifestfn] = (IS_FILENAME, filename, mediatype) + content=b"" # this value is only use by the assert further + filename=u"" # this value is only use by the assert further + else: + manifestfn = filename + self.Pictures[manifestfn] = (IS_IMAGE, content, mediatype) + + assert(type(filename)==type(u"")) + assert(type(mediatype)==type(u"")) + assert(type(content) == type(b"")) + + 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. + @param filesname unicode string: name of an image file + @param mediatype unicode string: type of media, dfaults to None + @return a unicode string, the name of the created file + """ + if mediatype is None: + mediatype, encoding = mimetypes.guess_type(filename) + if mediatype is None: + mediatype = u'' + try: ext = filename[filename.rindex(u'.'):] + except ValueError: ext=u'' + else: + ext = mimetypes.guess_extension(mediatype) + manifestfn = u"Pictures/%0.0f%s" % ((time.time()*10000000000), ext) + self.Pictures[manifestfn] = (IS_FILENAME, filename, mediatype) + + assert(type(filename)==type(u"")) + assert(type(mediatype)==type(u"")) + + return manifestfn + + def addPictureFromString(self, content, mediatype): + """ + Add a picture from contents given as a Byte string. + 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. + @param content bytes: content of media + @param mediatype unicode string: name of a media + @return a unicode string, the name of the created file + """ + assert(type(content)==type(b"")) + assert(type(mediatype)==type(u"")) + + ext = mimetypes.guess_extension(mediatype) + manifestfn = u"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. + @param filecontent bytes: the content of a file; defaults to None + """ + assert(type(filecontent)==type(b"")) + + 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 + @param document OpenDocument instance + @param objectname unicode string: the name of an object to add + @return a unicode string: the folder name in the zipfile the object is + stored in. + """ + assert(isinstance(document, OpenDocument)) + assert(type(objectname)==type(u"") or objectname == None) + + self.childobjects.append(document) + if objectname is None: + document.folder = u"%s/Object %d" % (self.folder, len(self.childobjects)) + else: + document.folder = objectname + return u".%s" % document.folder + + def _savePictures(self, anObject, folder): + """ + saves pictures contained in an object + @param anObject instance of OpenDocument containing pictures + @param folder unicode string: place to save pictures + """ + assert(isinstance(anObject, OpenDocument)) + assert(type(folder)==type(u"")) + + hasPictures = False + for arcname, picturerec in anObject.Pictures.items(): + what_it_is, fileobj, mediatype = picturerec + self.manifest.addElement(manifest.FileEntry(fullpath=u"%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 anObject.childobjects: + self._savePictures(subobject, u'%sObject %d/' % (folder, subobjectnum)) + subobjectnum += 1 + + def __replaceGenerator(self): + """ + Removes a previous 'generator' stance and declares TOOLSVERSION + as the new generator. + 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 + @param outputfile unicode string: the special name '-' is for stdout; + as an alternative, it can be an io.ByteIO instance which contains + the ZIP content. + @param addsuffix boolean: whether to add a suffix or not; defaults to False + """ + assert(type(outputfile)==type(u"") or 'wb' in repr(outputfile) or 'BufferedWriter' in repr(outputfile) or 'BytesIO' in repr(outputfile)) + assert(type(addsuffix)==type(True)) + + if outputfile == u'-': + outputfp = zipfile.ZipFile(sys.stdout,"w") + else: + if addsuffix: + outputfile = outputfile + odmimetypes.get(self.mimetype,u'.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 + @param outputfp open file descriptor + """ + assert('wb' in repr(outputfp) or 'BufferedWriter' in repr(outputfp) or 'BytesIO' in repr(outputfp)) + + 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 + @param outputfp instance of zipfile.ZipFile + """ + assert(isinstance(outputfp, zipfile.ZipFile)) + + 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.encode("utf-8")) + + self._saveXmlObjects(self,u"") + + # Write pictures + self._savePictures(self,u"") + + # Write the thumbnail + if self.thumbnail is not None: + self.manifest.addElement(manifest.FileEntry(fullpath=u"Thumbnails/", mediatype=u'')) + self.manifest.addElement(manifest.FileEntry(fullpath=u"Thumbnails/thumbnail.png", mediatype=u'')) + zi = zipfile.ZipInfo(u"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 == u"META-INF/documentsignatures.xml": continue # Don't save signatures + self.manifest.addElement(manifest.FileEntry(fullpath=op.filename, mediatype=op.mediatype)) + if sys.version_info[0]==3: + zi = zipfile.ZipInfo(op.filename, self._now) + else: + 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(u"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, anObject, folder): + """ + save xml objects of an opendocument to some folder + @param anObject instance of OpenDocument + @param folder unicode string place to save xml objects + """ + assert(isinstance(anObject, OpenDocument)) + assert(type(folder)==type(u"")) + + if self == anObject: + self.manifest.addElement(manifest.FileEntry(fullpath=u"/", mediatype=anObject.mimetype)) + else: + self.manifest.addElement(manifest.FileEntry(fullpath=folder, mediatype=anObject.mimetype)) + # Write styles + self.manifest.addElement(manifest.FileEntry(fullpath=u"%sstyles.xml" % folder, mediatype=u"text/xml")) + zi = zipfile.ZipInfo(u"%sstyles.xml" % folder, self._now) + zi.compress_type = zipfile.ZIP_DEFLATED + zi.external_attr = UNIXPERMS + self._z.writestr(zi, anObject.stylesxml().encode("utf-8") ) + + # Write content + self.manifest.addElement(manifest.FileEntry(fullpath=u"%scontent.xml" % folder, mediatype=u"text/xml")) + zi = zipfile.ZipInfo(u"%scontent.xml" % folder, self._now) + zi.compress_type = zipfile.ZIP_DEFLATED + zi.external_attr = UNIXPERMS + self._z.writestr(zi, anObject.contentxml() ) + + # Write settings + if anObject.settings.hasChildNodes(): + self.manifest.addElement(manifest.FileEntry(fullpath=u"%ssettings.xml" % folder, mediatype=u"text/xml")) + zi = zipfile.ZipInfo(u"%ssettings.xml" % folder, self._now) + zi.compress_type = zipfile.ZIP_DEFLATED + zi.external_attr = UNIXPERMS + self._z.writestr(zi, anObject.settingsxml() ) + + # Write meta + if self == anObject: + self.manifest.addElement(manifest.FileEntry(fullpath=u"meta.xml", mediatype=u"text/xml")) + zi = zipfile.ZipInfo(u"meta.xml", self._now) + zi.compress_type = zipfile.ZIP_DEFLATED + zi.external_attr = UNIXPERMS + self._z.writestr(zi, anObject.metaxml() ) + + # Write subobjects + subobjectnum = 1 + for subobject in anObject.childobjects: + self._saveXmlObjects(subobject, u'%sObject %d/' % (folder, subobjectnum)) + subobjectnum += 1 + +# Document's DOM methods + def createElement(self, elt): + """ + Inconvenient interface to create an element, but follows XML-DOM. + Does not allow attributes as argument, therefore can't check grammar. + @param elt element.Element instance + @return an element.Element instance whose grammar is not checked + """ + assert(isinstance(elt, element.Element)) + + # this old code is ambiguous: is 'element' the module or is it the + # local variable? To disambiguate this, the local variable has been + # renamed to 'elt' + #return element(check_grammar=False) + return elt(check_grammar=False) + + def createTextNode(self, data): + """ + Method to create a text node + @param data unicode string to include in the Text element + @return an instance of element.Text + """ + assert(type(data)==type(u"")) + + return element.Text(data) + + def createCDATASection(self, data): + """ + Method to create a CDATA section + @param data unicode string to include in the CDATA element + @return an instance of element.CDATASection + """ + assert(type(data)==type(u"")) + + return element.CDATASection(cdata) + + def getMediaType(self): + """ + Returns the media type + @result a unicode string + """ + assert (type(self.mimetype)==type(u"")) + + return self.mimetype + + def getStyleByName(self, name): + """ + Finds a style object based on the name + @param name unicode string the name of style to search + @return a syle as an element.Element instance + """ + assert(type(name)==type(u"")) + + ncname = make_NCName(name) + if self._styles_dict == {}: + self.rebuild_caches() + result=self._styles_dict.get(ncname, None) + + assert(isinstance(result, element.Element)) + return result + + def getElementsByType(self, elt): + """ + Gets elements based on the type, which is function from + text.py, draw.py etc. + @param elt instance of a function which returns an element.Element + @return a list of istances of element.Element + """ + import types + assert(isinstance (elt, types.FunctionType)) + + obj = elt(check_grammar=False) + assert (isinstance(obj, element.Element)) + + if self.element_dict == {}: + self.rebuild_caches() + + # This previous code was ambiguous + # was "element" the module name or the local variable? + # the local variable is renamed to "elt" to disambiguate the code + #return self.element_dict.get(obj.qname, []) + + result=self.element_dict.get(obj.qname, []) + + ok=True + for e in result: ok = ok and isinstance(e, element.Element) + assert(ok) + + return result + +# Convenience functions +def OpenDocumentChart(): + """ + Creates a chart document + @return an OpenDocument instance with chart mimetype + """ + doc = OpenDocument(u'application/vnd.oasis.opendocument.chart') + doc.chart = Chart() + doc.body.addElement(doc.chart) + return doc + +def OpenDocumentDrawing(): + """ + Creates a drawing document + @return an OpenDocument instance with drawing mimetype + """ + doc = OpenDocument(u'application/vnd.oasis.opendocument.graphics') + doc.drawing = Drawing() + doc.body.addElement(doc.drawing) + return doc + +def OpenDocumentImage(): + """ + Creates an image document + @return an OpenDocument instance with image mimetype + """ + doc = OpenDocument(u'application/vnd.oasis.opendocument.image') + doc.image = Image() + doc.body.addElement(doc.image) + return doc + +def OpenDocumentPresentation(): + """ + Creates a presentation document + @return an OpenDocument instance with presentation mimetype + """ + doc = OpenDocument(u'application/vnd.oasis.opendocument.presentation') + doc.presentation = Presentation() + doc.body.addElement(doc.presentation) + return doc + +def OpenDocumentSpreadsheet(): + """ + Creates a spreadsheet document + @return an OpenDocument instance with spreadsheet mimetype + """ + doc = OpenDocument(u'application/vnd.oasis.opendocument.spreadsheet') + doc.spreadsheet = Spreadsheet() + doc.body.addElement(doc.spreadsheet) + return doc + +def OpenDocumentText(): + """ + Creates a text document + @return an OpenDocument instance with text mimetype + """ + doc = OpenDocument(u'application/vnd.oasis.opendocument.text') + doc.text = Text() + doc.body.addElement(doc.text) + return doc + +def OpenDocumentTextMaster(): + """ + Creates a text master document + @return an OpenDocument instance with master mimetype + """ + doc = OpenDocument(u'application/vnd.oasis.opendocument.text-master') + doc.text = Text() + doc.body.addElement(doc.text) + return doc + +def __loadxmlparts(z, manifest, doc, objectpath): + """ + Parses a document from its zipfile + @param z an instance of zipfile.ZipFile + @param manifest Manifest data structured in a dictionary + @param doc instance of OpenDocument to feed in + @param objectpath unicode string: path to an object + """ + assert(isinstance(z, zipfile.ZipFile)) + assert(type(manifest)==type(dict())) + assert(isinstance(doc, OpenDocument)) + assert(type(objectpath)==type(u"")) + + from load import LoadParser + from xml.sax import make_parser, handler + + for xmlfile in (objectpath+u'settings.xml', objectpath+u'meta.xml', objectpath+u'content.xml', objectpath+u'styles.xml'): + if xmlfile not in manifest: + continue + ########################################################## + # this one is added to debug the bad behavior with Python2 + # which raises exceptions of type SAXParseException + from xml.sax._exceptions import SAXParseException + ########################################################## + try: + xmlpart = z.read(xmlfile).decode("utf-8") + doc._parsing = xmlfile + + parser = make_parser() + parser.setFeature(handler.feature_namespaces, 1) + parser.setContentHandler(LoadParser(doc)) + parser.setErrorHandler(handler.ErrorHandler()) + + inpsrc = InputSource() + ################# + # There may be a SAXParseException triggered because of + # a missing xmlns prefix like meta, config, etc. + # So i add such declarations when needed (GK, 2014/10/21). + # Is there any option to prevent xmlns checks by SAX? + xmlpart=__fixXmlPart(xmlpart) + + inpsrc.setByteStream(BytesIO(xmlpart.encode("utf-8"))) + parser.parse(inpsrc) + del doc._parsing + except KeyError as v: pass + except SAXParseException: + print (u"====== SAX FAILED TO PARSE ==========\n", xmlpart) + +def __fixXmlPart(xmlpart): + """ + fixes an xml code when it does not contain a set of requested + "xmlns:whatever" declarations. + added by G.K. on 2014/10/21 + @param xmlpart unicode string: some XML code + @return fixed XML code + """ + result=xmlpart + requestedPrefixes = (u'meta', u'config', u'dc', u'style', + u'svg', u'fo',u'draw', u'table',u'form') + for prefix in requestedPrefixes: + if u' xmlns:{prefix}'.format(prefix=prefix) not in xmlpart: + pos=result.index(u" xmlns:") + toInsert=u' xmlns:{prefix}="urn:oasis:names:tc:opendocument:xmlns:{prefix}:1.0"'.format(prefix=prefix) + result=result[:pos]+toInsert+result[pos:] + return result + + +def __detectmimetype(zipfd, odffile): + """ + detects the mime-type of an ODF file + @param zipfd an open zipfile.ZipFile instance + @param odffile this parameter is not used + @return a mime-type as a unicode string + """ + assert(isinstance(zipfd, zipfile.ZipFile)) + assert(type(odffile)==type(u"") or 'rb' in repr(odffile) \ + or 'BufferedReader' in repr(odffile) or 'BytesIO' in repr(odffile)) + + try: + mimetype = zipfd.read('mimetype').decode("utf-8") + return mimetype + except: + pass + # Fall-through to next mechanism + manifestpart = zipfd.read('META-INF/manifest.xml') + manifest = manifestlist(manifestpart) + for mentry,mvalue in manifest.items(): + if mentry == "/": + assert(type(mvalue['media-type'])==type(u"")) + return mvalue['media-type'] + + # Fall-through to last mechanism + return u'application/vnd.oasis.opendocument.text' + +def load(odffile): + """ + Load an ODF file into memory + @param odffile unicode string: name of a file, or as an alternative, + an open readable stream + @return a reference to the structure (an OpenDocument instance) + """ + assert(type(odffile)==type(u"") or 'rb' in repr(odffile) \ + or 'BufferedReader' in repr(odffile) or 'BytesIO' in repr(odffile)) + + z = zipfile.ZipFile(odffile) + mimetype = __detectmimetype(z, odffile) + 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, u'') + for mentry,mvalue in manifest.items(): + if mentry[:9] == u"Pictures/" and len(mentry) > 9: + doc.addPicture(mvalue['full-path'], mvalue['media-type'], z.read(mentry)) + elif mentry == u"Thumbnails/thumbnail.png": + doc.addThumbnail(z.read(mentry)) + elif mentry in (u'settings.xml', u'meta.xml', u'content.xml', u'styles.xml'): + pass + # Load subobjects into structure + elif mentry[:7] == u"Object " and len(mentry) < 11 and mentry[-1] == u"/": + subdoc = OpenDocument(mvalue['media-type'], add_generator=False) + doc.addObject(subdoc, u"/" + mentry[:-1]) + __loadxmlparts(z, manifest, subdoc, mentry) + elif mentry[:7] == u"Object ": + pass # Don't load subobjects as opaque objects + else: + if mvalue['full-path'][-1] == u'/': + 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] == u'application/vnd.oasis.opendocument.text': + doc.text = b[0].firstChild + elif mimetype[:43] == u'application/vnd.oasis.opendocument.graphics': + doc.graphics = b[0].firstChild + elif mimetype[:47] == u'application/vnd.oasis.opendocument.presentation': + doc.presentation = b[0].firstChild + elif mimetype[:46] == u'application/vnd.oasis.opendocument.spreadsheet': + doc.spreadsheet = b[0].firstChild + elif mimetype[:40] == u'application/vnd.oasis.opendocument.chart': + doc.chart = b[0].firstChild + elif mimetype[:40] == u'application/vnd.oasis.opendocument.image': + doc.image = b[0].firstChild + elif mimetype[:42] == u'application/vnd.oasis.opendocument.formula': + doc.formula = b[0].firstChild + + return doc + +# vim: set expandtab sw=4 : diff --git a/libs/odf/presentation.py b/libs/odf/presentation.py new file mode 100644 index 0000000..04e2b76 --- /dev/null +++ b/libs/odf/presentation.py @@ -0,0 +1,86 @@ +# -*- 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): + args.setdefault('type', 'simple') + return Element(qname = (PRESENTATIONNS,'sound'), **args) + diff --git a/libs/odf/script.py b/libs/odf/script.py new file mode 100644 index 0000000..adbc73f --- /dev/null +++ b/libs/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/libs/odf/style.py b/libs/odf/style.py new file mode 100644 index 0000000..b9f00f9 --- /dev/null +++ b/libs/odf/style.py @@ -0,0 +1,154 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2013 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 DefaultPageLayout(**args): + return Element(qname = (STYLENS,'default-page-layout'), **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 ListLevelLabelAlignment(**args): + return Element(qname = (STYLENS,'list-level-label-alignment'), **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/libs/odf/svg.py b/libs/odf/svg.py new file mode 100644 index 0000000..79629b9 --- /dev/null +++ b/libs/odf/svg.py @@ -0,0 +1,56 @@ +# -*- 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): + args.setdefault('type', 'simple') + 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): + args.setdefault('type', 'simple') + 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/libs/odf/table.py b/libs/odf/table.py new file mode 100644 index 0000000..904f2a7 --- /dev/null +++ b/libs/odf/table.py @@ -0,0 +1,321 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2013 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 Background(**args): + return Element(qname = (TABLENS,'background'), **args) + +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): + args.setdefault('type', 'simple') + 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 Desc(**args): + return Element(qname = (TABLENS,'desc'), **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 FilterSetItem(**args): + return Element(qname = (TABLENS,'filter-set-item'), **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): + args.setdefault('type', 'simple') + 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 Title(**args): + return Element(qname = (TABLENS,'title'), **args) + +def TrackedChanges(**args): + return Element(qname = (TABLENS,'tracked-changes'), **args) + diff --git a/libs/odf/teletype.py b/libs/odf/teletype.py new file mode 100644 index 0000000..53b58fd --- /dev/null +++ b/libs/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/libs/odf/text.py b/libs/odf/text.py new file mode 100644 index 0000000..75d166c --- /dev/null +++ b/libs/odf/text.py @@ -0,0 +1,573 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2006-2013 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 re, sys, os.path +sys.path.append(os.path.dirname(__file__)) + + +from namespaces import TEXTNS +from element import Element +from style import StyleElement + +# Autogenerated +def A(**args): + args.setdefault('type', 'simple') + return Element(qname = (TEXTNS,'a'), **args) + +def AlphabeticalIndex(**args): + return Element(qname = (TEXTNS,'alphabetical-index'), **args) + +def AlphabeticalIndexAutoMarkFile(**args): + args.setdefault('type', 'simple') + 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 Meta(**args): + return Element(qname = (TEXTNS,'meta'), **args) + +def MetaField(**args): + return Element(qname = (TEXTNS,'meta-field'), **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/libs/odf/thumbnail.py b/libs/odf/thumbnail.py new file mode 100644 index 0000000..3781145 --- /dev/null +++ b/libs/odf/thumbnail.py @@ -0,0 +1,80 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# This contains a 104x128 px thumbnail in PNG format +# Downloaded from http://da.libreoffice.org/assets/Uploads/Da-Projekt_Billeder/IconLibreOffice.png +# Copyright information: Unless otherwise specified, all text and images on the +# http://da.libreoffice.org website are licensed under the Creative Commons +# Attribution-Share Alike 3.0 License. (As of 2013-01-09) + +# Alternative download: http://commons.wikimedia.org/wiki/File:LibreOffice_icon_3.3.1_48_px.svg +import base64 + +iconstr = """\ +iVBORw0KGgoAAAANSUhEUgAAAGgAAACACAYAAADnCyxOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz +AAAG7AAABuwBHnU4NQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAwBSURB +VHic7Z1bbFTHHca/2UsxYDs4IRiv7Y0xUNRUCCmAFBXiCwaiRhFIxjdsjG18g8YvlfoQqepDH/yA +hKI+EUIIKqVxwiVAuapUlh+qqi+8VH2hfUgDUpuHVnhjs17vnsv0oZ3lnNkzs2fXu2eX3flJR7ue +nbN7znz7/ec/M+esCaUUk5OTtQDOAOgAUAdnqKBc9lqm5bl8Lwrg7wD+BODWJ5988lDymY6cPHmy +F8AIpfRHAL6X6f5ZQAE8JYQ80DTtF5999tkiGR8fXw/gLwBCHhxAITkD4MPz588bbipPTEx8H8Bf +4Y0wKRBC/qbr+m4fgGmUvjgA8DMADyYmJta4qUwI6UCBxAEASuk2v9//Sx+Adwt1EAXgAIC7bkSi +lM5TSlHg7VCAUvqG9cCmp6dBqayLeLmYm5vD7OystagdwN3x8fH3P/300yXRfpWVlb9bWFh4Qgh5 +Q1THAzb7+BJKKUzTLJmtra0N+/bt40+TiSR00kcffRQzTXPCNE0tx42eET7eVgxN0xCNRrG0tISl +pSXEYjHEYjEsLy9jeXkZ8Xgc8XgciUQCiUQCmqbZNl3Xoes6DMOAYRjJBuM/J99QStHe3o729nY+ +fLRTSu+OjY0JRbp48eJD0zR7NU3TChXmyOjoqK21pqenYZomotEompqa8t6A+cAwDEQiEZimmSwj +hGB2dhZzc3N89TkA71+4cEEY7oaGhjoBfBkMBoN5OWAJthDHf7MJIS/lFggEUFNTA5/PZzu3jo4O +tLW18W3QDkDqpEuXLt0wTbM/Ho977qSUEOcU7l5G/H4/ampqQAhJno9pmujo6EBLS4tjuBsdHRWK +dPny5euGYRyLx+Oe9kkpDioVgYAXIvFOOnDgAFpbW/nq7QCkIs3MzFyllB6PxWJ6fo44FWGSUCqw +cMc7af/+/di7d6+Tk+6dOHFCKNLnn3/+pWEYQ9FoVPckxPEHUIpiBQIBvPrqqykiHTx4EHv27OHP +tQ2AVKQrV67MGIYxEo1G8+6kkg5xVmQivf322xmLdO3atd/quj76/PlzV3N72SJMEkqRYDCI1157 +DYQQW/l7772HXbt22cZplNI2Sum9kZERoUhfffXVbzRNG1tYWDA8C3GMUhZp/fr1AOwR49ChQ9i5 +c6dt7IT/O0km0s2bN39tGMbEwsJCXpxkc1AhRvqFgDmJP/fDhw9jx44dMAwjxUnDw8MykS4ahnEy +Eonk3EllkSQ4sWrVKrz++uu286SUoqurC9u3b3d0kkykW7duXdB1/Sfz8/OmqE42CGcS+DhdijCR +rI4xTRM9PT148803YRi2qNUG4P7w8PBa0fvduXPnPKX0g2fPnuVMJGGSwH2DSpaKigps2LAhRaTe +3l5s27YNuq5b26WVUnpvaGhIKNLt27fPUUqnnj17ZuY8xDEHWR/LYauoqEBtbS3f96C/vx9bt27l +ndQKQCrSnTt3PqaUTkUikRV/y8veQQyrSFYGBwfR3NwMTdNSnHT8+PF0In3w3XffrchJwjS7HPog +ntWrV2Pjxo28GBgaGsKmTZug67aJg1YAUpFu3759zjTNqcXFxay/7cKZhHJzEGP16tWoq6tDIpGw +tcfIyAjC4XA2In0MYOr58+dZNWhZzSS4Zc2aNQiFQkgkErbysbGxZDkf7gYHB4Ui3bx5MylSTpIE +BbB27VqEQiHE43Fbg01OTqKurg6aZlsWagUgFenGjRsfA/ggFotl1MgqSZBQWVmJUCiE5eVlW9uc +OnUKtbW1Tk66f+zYMZlI50zTnIrFYjTrJEGFOTtVVVWor69HLBZLESkUCvFOagGQTqSzAKbi8bir +BhYmCYoXVFdXo7GxEbFYLFlGCMHk5CTq6+v5xCGtSNevXz8LYCqRSKRt6JJfUc0V1dXVCIfDNicB +wPj4OOrr6/nUvIVSen9gYEAo0rVr185SSqcSiYQ03EkX7NRm36qqqtDY2Gjrk4D/ZXcNDQ2OTkon +EoApXddFzoiU7FU9+YKFu3g8bisfGxtDY2MjP3fXQim939/fLxTp6tWrZymlU4ZhODnpYdkt2OUC +Fu747O7EiRMIh8P8dFELADciHTJN84ml+F8AfqWyuCypqqpCOBxOGScNDw+jqamJH6akFenKlSt3 +5+fnf0gp3U8pfd/n8/1gZmbmz6Svry+pRDQaxenTp2EYBqLRKN566608nmJpsLi4iCdPnoC/Kvjy +5cv45ptvbNfkAfgjgB9/8cUXUbfvrxy0QpiTuAQBg4OD2LRpE++kdwA8OHr0qNBJPMI+SOEeljjw +s+ADAwNobm7mv+xMpEo37y28aEQ5KDNY4sBlcTh69Ciam5v5tn2HUnq/r68vrUiODlICZQcTiZ/H +7Ovrw5YtW5yclFYk4UyCEig7qqur0dDQkBKNuru7kyLxTurt7RWKVDaX/nrJK6+8gsbGxpTrDLu6 +urB161a++jsAhCIJszj+G6C2zGZcWLizvk4IwZEjR0QiPXASSU315ABR+7G5O75Njxw54hTu9lJK +H/T09NhEEq6oKoFyA0vBAbuQnZ2d2LJlC199LwCbSMpBHuAkEgB0dnYmx0m8k7q7uysBNZPgGUwk +6+VshBB0dXVh8+bNfPW9AM4Bae7yVuQWlt0BSOmTmpub+eoD3d3dPSrEeYxMpKamJl6DU9I0W5Ef +1q1bh3A4nBLuuru7+apNAT5zUw7yhnXr1oFSiqdPn8I0zeQPcHDt3qDS7AJSU1PjOE6yEAjwJcpF +3lJTU4Ovv/4aPp8v2ebW0KdCXJHBt7tKs4sAmTGEDlJZnHewJMFJJDWTUATIkjO1HlQEyH6fIiXE +OT1X5Be+a7FeqiW8JkHhHVb3ZJQklLJQxXSTtJMGjICoYqlTTOcq6/vVZGkRkFGSoLI477G2Nd+1 +qHFQESBr84ASovDIkjPloCJA1gcJBVJ4h2yCQIW4IkB2PYhwwY49V+SfrJYblDjeYU0MpMsN1jUJ +hXeIxAHULZBFQUbjIOUg71HjoCJH1tYqzS4CnG6WY6iBahEgTbPT7aBYOZksDqadSVDC5J507el6 +HKQoDK7TbDWTUBhcp9miqxsV+UXW1upfAxQBst9IEiYJykHekdVygxLJO1wv2ClhCoermQTV7xQG +mTHUVE+RwNqdN4kaBxUZrkOcCnfeYTWFclCRIrpYR6XZecZNJJLVsQmkpnpyj5t2zCjE8Tuqvii/ +8MsMGa+oKiflDydxpA6y7mjdQTkp91jFsbat6wU7/iJG5aTcIQtrvBGkl13xOyuRVo6TONa/eaTL +Dfw9+yrcrQwncZzuBXY1DgKQ/E9ShBDbpkTKHFFYY23sykF8Bd5BDCVSZojEYQ6SdSVpB6qifkeJ +5A6ZOE7TbDzSJIHFR5U4ZIcbcfg+yPVMAiEkaT/mFieUk5xxI47MBAzpZKn1g5RI7nErjlO9tDMJ +TvZTIrknU3H4EJeRg6yqKpHSk61zrM9THCT7QOtlqEokOdmKw/dBPGlnEtgPnvKDVP55OQ9mV9Ln +ZDQO4ne2jnIZykl2ViIOAP7/fqcgDHGsgdlsghIplZWK43RfUEYXjRiGoUQSkCtx+Lk4aRbHrwGx +Psjn8ymRLORKHNa+MqQO0nU96SImDnu0JgRs30wTh5dRsFyLw9rXdZJgxTAMm8IiJwF2l7h1kqhe +seJWHKc6QKo4pmlC13VbfZ60d3nzFsy1SC8L+RDHKcXOeKpHiZRfcdg40/pZrkOcNQ0sV5Hy7RzZ +7Y9AmhVV1gexVdVyE8kLcZwGqhk5iIlSbiJ5IY51Kk1EyjjICp+nl4tIXoqT0YoqXzEYDCISicDn +88Hn88Hv9yefE0Lg9/uTZX6/P1lGCEnWYY/sOYDkexTjJV1ODc83plMfYp0ZYI8shFlnZFgZex4M +BlOSBCvSEPf48eO8nby1EZyeW8tkr1nLGOyErQNpUVk2r3uJ9PfiNE3z8FAK1wg8IuG9/GxGioP8 +fj8qKio8OyDFC/x+f0oZ2b179z8BhLw6CFG4Svfotq4oJGXzWOjwBuDfAUrp7wGMePmpxRLKMqUA +IW/WB+BDAN96/cmKtHwL4KeEUopdu3bVAjgD4CCADYU9rrLnHwD+AODnjx49+s9/AexyD6bH7vMJ +AAAAAElFTkSuQmCC\ +""" + +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/libs/odf/userfield.py b/libs/odf/userfield.py new file mode 100644 index 0000000..1b34788 --- /dev/null +++ b/libs/odf/userfield.py @@ -0,0 +1,180 @@ +#!/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 +import io, sys + +if sys.version_info[0]==3: + unicode=str + +OUTENCODING = "utf-8" + + +# OpenDocument v.1.0 section 6.7.1 +VALUE_TYPES = { + u'float': (OFFICENS, u'value'), + u'percentage': (OFFICENS, u'value'), + u'currency': (OFFICENS, u'value'), + u'date': (OFFICENS, u'date-value'), + u'time': (OFFICENS, u'time-value'), + u'boolean': (OFFICENS, u'boolean-value'), + u'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 + + @param src open file in binary mode: source document, + or filename as a unicode string, or None for stdin. + @param dest opendile in binary mode: destination document, + or filename as a unicode string, or None for stdout. + """ + assert(src==None or 'rb' in repr(src) or 'BufferedReader' in repr(src) or 'BytesIO' in repr(src) or type(src)==type(u"")) + assert(dest==None or 'wb' in repr(dest) or 'BufferedWriter' in repr(dest) or 'BytesIO' in repr(dest) or type(dest)==type(u"")) + self.src_file = src + self.dest_file = dest + self.document = None + + def loaddoc(self): + if (sys.version_info[0]==3 and (isinstance(self.src_file, str) or (isinstance(self.src_file, io.IOBase)))) or (sys.version_info[0]==2 and 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(u"%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(u'-') + else: + self.document.save(self.dest_file) + + def list_fields(self): + """List (extract) all known user-fields. + + @return list of user-field names as unicode strings. + """ + 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. + + @param field_names list of field names as unicode strings + to show, or None for all. + + @return list of tuples (, , ) + as type (unicode string, stringified type, unicode string). + + """ + self.loaddoc() + found_fields = [] + all_fields = self.document.getElementsByType(UserFieldDecl) + for f in all_fields: + value_type = f.getAttribute(u'valuetype') + if value_type == u'string': + value = f.getAttribute(u'stringvalue') + else: + value = f.getAttribute(u'value') + field_name = f.getAttribute(u'name') + + if field_names is None or field_name in field_names: + found_fields.append((field_name, + value_type, + value)) + return found_fields + + def list_values(self, field_names): + """Extract the contents of given field names from the file. + + @param field_names list of field names as unicode strings + + @return list of field values as unicode strings. + + """ + 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. + @param field_name unicode string: name of a field + @return field value as a unicode string or None if field does not exist. + + """ + assert(type(field_name)==type(u"")) + 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. + @param field_name unicode string: name of a field + @return tuple (, ) as a pair of unicode strings + or None if field does not exist. + + """ + assert(type(field_name)==type(u"")) + 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(u'name') + if field_name in data: + value_type = f.getAttribute(u'valuetype') + value = data.get(field_name) + if value_type == u'string': + f.setAttribute(u'stringvalue', value) + else: + f.setAttribute(u'value', value) + self.savedoc() + diff --git a/libs/odf/xforms.py b/libs/odf/xforms.py new file mode 100644 index 0000000..f28b96e --- /dev/null +++ b/libs/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) diff --git a/src/exporter/odt.py b/src/exporter/odt.py index 5534fa5..0480a04 100644 --- a/src/exporter/odt.py +++ b/src/exporter/odt.py @@ -6,6 +6,14 @@ from enums import * from functions import * from exporter.basic import basicExporter +import sys, os +sys.path.append(os.path.join(appPath(), "libs")) + +from odf.opendocument import OpenDocumentText +from odf.style import Style, TextProperties +from odf.text import H, P, Span + + class odtExporter(basicExporter): requires = ["filename"] @@ -17,45 +25,51 @@ class odtExporter(basicExporter): mw = mainWindow() root = mw.mdlOutline.rootItem - doc = QTextDocument() - cursor = QTextCursor(doc) - + doc = OpenDocumentText() def appendItem(item): if item.isFolder(): - cursor.setPosition(doc.characterCount() - 1) - title = "{t}
      \n".format( - l = str(item.level() + 1), - t = item.title()) - cursor.insertHtml(title) + self.addHeading(item.title(), item.level() + 1, doc) for c in item.children(): appendItem(c) else: text = self.formatText(item.text(), item.type()) - cursor.setPosition(doc.characterCount() - 1) - cursor.insertHtml(text) + if text: + for l in text.split("\n"): + self.addParagraph(l, doc) for c in root.children(): appendItem(c) - dw = QTextDocumentWriter(filename, "odt") - dw.write(doc) + doc.save(filename) def formatText(self, text, _type): if not text: return text - if _type == "t2t": - text = self.runT2T(text) + #if _type == "t2t": + #text = self.runT2T(text) - elif _type == "txt": - text = text.replace("\n", "
      ") + #elif _type == "txt": + #text = text.replace("\n", "
      ") elif _type == "html": - text = self.htmlBody(text) + doc = QTextDocument() + doc.setHtml(text) + text = doc.toPlainText() + #text = self.htmlBody(text) - return text + "
      " + return text + + def addHeading(self, text, level, doc): + doc.text.addElement(H(outlinelevel=int(level), text=text)) + return doc + + def addParagraph(self, text, doc): + p = P(stylename="Text Body", text=text) + doc.text.addElement(p) + return doc \ No newline at end of file diff --git a/src/exporter/odt_old.py b/src/exporter/odt_old.py new file mode 100644 index 0000000..5534fa5 --- /dev/null +++ b/src/exporter/odt_old.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python +#--!-- coding: utf8 --!-- + +from qt import * +from enums import * +from functions import * +from exporter.basic import basicExporter + +class odtExporter(basicExporter): + + requires = ["filename"] + + def __init__(self): + pass + + def doCompile(self, filename): + mw = mainWindow() + root = mw.mdlOutline.rootItem + + doc = QTextDocument() + cursor = QTextCursor(doc) + + + def appendItem(item): + if item.isFolder(): + + cursor.setPosition(doc.characterCount() - 1) + title = "{t}
      \n".format( + l = str(item.level() + 1), + t = item.title()) + cursor.insertHtml(title) + + for c in item.children(): + appendItem(c) + + else: + text = self.formatText(item.text(), item.type()) + cursor.setPosition(doc.characterCount() - 1) + cursor.insertHtml(text) + + for c in root.children(): + appendItem(c) + + dw = QTextDocumentWriter(filename, "odt") + dw.write(doc) + + def formatText(self, text, _type): + + if not text: + return text + + if _type == "t2t": + text = self.runT2T(text) + + elif _type == "txt": + text = text.replace("\n", "
      ") + + elif _type == "html": + text = self.htmlBody(text) + + return text + "
      " diff --git a/src/models/references.py b/src/models/references.py index 037d06e..3b65bf9 100644 --- a/src/models/references.py +++ b/src/models/references.py @@ -381,13 +381,15 @@ def tooltip(ref): elif _type == PersoLetter: m = mainWindow().mdlPersos - name = m.item(int(_ref), Perso.name.value).text() - return qApp.translate("references", "Character: {}").format(name) + item = m.item(int(_ref), Perso.name.value) + if item: + return qApp.translate("references", "Character: {}").format(item.text()) elif _type == PlotLetter: m = mainWindow().mdlPlots name = m.getPlotNameByID(_ref) - return qApp.translate("references", "Plot: {}").format(name) + if name: + return qApp.translate("references", "Plot: {}").format(name) elif _type == WorldLetter: m = mainWindow().mdlWorld @@ -399,7 +401,7 @@ def tooltip(ref): name=name, path=" ({})".format(path) if path else "") - return qApp.translate("references", "Unknown reference: {}.").format(ref) + return qApp.translate("references", "Unknown reference: {}.").format(ref) ############################################################################### # FUNCTIONS diff --git a/src/models/worldModel.py b/src/models/worldModel.py index f837ca0..a07ea39 100644 --- a/src/models/worldModel.py +++ b/src/models/worldModel.py @@ -105,7 +105,7 @@ class worldModel(QStandardItemModel): return r r = browse(self.invisibleRootItem()) - return r if r else -1 + return r if r else None def path(self, item): "Returns the path to the item in the form of 'ancestor > ... > grand-parent > parent'." diff --git a/src/ui/views/textEditCompleter.py b/src/ui/views/textEditCompleter.py index 27cf0d8..cae17a1 100644 --- a/src/ui/views/textEditCompleter.py +++ b/src/ui/views/textEditCompleter.py @@ -154,9 +154,10 @@ class textEditCompleter(textEditView): self.refRects = refs def paintEvent(self, event): - #event = QPaintEvent(self.viewport().geometry()) QTextEdit.paintEvent(self, event) - painter = QPainter(self.viewport()) - painter.setPen(Qt.gray) - for r in self.refRects: - painter.drawRect(r) \ No newline at end of file + + # Debug: paint rects + #painter = QPainter(self.viewport()) + #painter.setPen(Qt.gray) + #for r in self.refRects: + #painter.drawRect(r) \ No newline at end of file