From 4beaaef16873840422739e75dba5fd0aa5a0b584 Mon Sep 17 00:00:00 2001
From: Olivier Keshavjee
Date: Fri, 10 Jul 2015 12:29:25 +0200
Subject: [PATCH] Trying things with odt export
---
i18n/manuskript_fr.qm | Bin 39888 -> 40016 bytes
i18n/manuskript_fr.ts | 102 +-
libs/odf/GPL-LICENSE-2.txt | 339 ++
libs/odf/__init__.py | 19 +
libs/odf/anim.py | 61 +
libs/odf/attrconverters.py | 1612 +++++
libs/odf/chart.py | 96 +
libs/odf/config.py | 39 +
libs/odf/dc.py | 72 +
libs/odf/dr3d.py | 45 +
libs/odf/draw.py | 188 +
libs/odf/easyliststyle.py | 104 +
libs/odf/element.py | 541 ++
libs/odf/elementtypes.py | 325 +
libs/odf/form.py | 115 +
libs/odf/grammar.py | 9194 +++++++++++++++++++++++++++++
libs/odf/load.py | 115 +
libs/odf/manifest.py | 44 +
libs/odf/math.py | 30 +
libs/odf/meta.py | 67 +
libs/odf/namespaces.py | 107 +
libs/odf/number.py | 104 +
libs/odf/odf2moinmoin.py | 579 ++
libs/odf/odf2xhtml.py | 1617 +++++
libs/odf/odfmanifest.py | 120 +
libs/odf/office.py | 107 +
libs/odf/opendocument.py | 1011 ++++
libs/odf/presentation.py | 86 +
libs/odf/script.py | 30 +
libs/odf/style.py | 154 +
libs/odf/svg.py | 56 +
libs/odf/table.py | 321 +
libs/odf/teletype.py | 137 +
libs/odf/text.py | 573 ++
libs/odf/thumbnail.py | 80 +
libs/odf/userfield.py | 180 +
libs/odf/xforms.py | 34 +
src/exporter/odt.py | 50 +-
src/exporter/odt_old.py | 61 +
src/models/references.py | 10 +-
src/models/worldModel.py | 2 +-
src/ui/views/textEditCompleter.py | 11 +-
42 files changed, 18462 insertions(+), 76 deletions(-)
create mode 100644 libs/odf/GPL-LICENSE-2.txt
create mode 100644 libs/odf/__init__.py
create mode 100644 libs/odf/anim.py
create mode 100644 libs/odf/attrconverters.py
create mode 100644 libs/odf/chart.py
create mode 100644 libs/odf/config.py
create mode 100644 libs/odf/dc.py
create mode 100644 libs/odf/dr3d.py
create mode 100644 libs/odf/draw.py
create mode 100644 libs/odf/easyliststyle.py
create mode 100644 libs/odf/element.py
create mode 100644 libs/odf/elementtypes.py
create mode 100644 libs/odf/form.py
create mode 100644 libs/odf/grammar.py
create mode 100644 libs/odf/load.py
create mode 100644 libs/odf/manifest.py
create mode 100644 libs/odf/math.py
create mode 100644 libs/odf/meta.py
create mode 100644 libs/odf/namespaces.py
create mode 100644 libs/odf/number.py
create mode 100644 libs/odf/odf2moinmoin.py
create mode 100644 libs/odf/odf2xhtml.py
create mode 100644 libs/odf/odfmanifest.py
create mode 100644 libs/odf/office.py
create mode 100644 libs/odf/opendocument.py
create mode 100644 libs/odf/presentation.py
create mode 100644 libs/odf/script.py
create mode 100644 libs/odf/style.py
create mode 100644 libs/odf/svg.py
create mode 100644 libs/odf/table.py
create mode 100644 libs/odf/teletype.py
create mode 100644 libs/odf/text.py
create mode 100644 libs/odf/thumbnail.py
create mode 100644 libs/odf/userfield.py
create mode 100644 libs/odf/xforms.py
create mode 100644 src/exporter/odt_old.py
diff --git a/i18n/manuskript_fr.qm b/i18n/manuskript_fr.qm
index cf7ab55cc1d7d4f1c2effe192e8709e6a1b6a75f..fc9623ee8280bcab8bd6953692f8adda5533a233 100644
GIT binary patch
delta 1902
zcmXAp4Nz3q703VY?YnRH?PnK+&7!-jNd%0*E*dx0B8f&2scWMwAgE|amTwmU`EUV|
z2qn9ygxn}ZC1w&Gm7uM$D6zJtT4^P5VkafGMD1jZqef^ZtvberwkNYQyYt(<@4j=-
z`JewiS5AvphQv3fB=-WCNuN4mGO$Ggq&6??BIjKTw5yO+XuG%J`gbm=G_Y{`)inGE+qjr1^71LNLIAl?JlvA+XBBkvO}LLVO#9pONvdf5(DafukOZC~16FLN}IZr$TlyxE3eG-V?7Us`0v3d*b58cG-NlMz?i@g15
zz&0=P&eM8l1|L-QnEP?i)(#|oi9_)!;Fs}yon&8J>cr)Hk-+OO;HGpFXjq1?{qF$6
z_d=q67qBB%cxev3=DIDkT`Hx{%n%NENObqGFjPp%G|uL~lady9ED&dXMmf&+ir%$;
zU~!gMTy>FN_lYGxmR~R=2EG~t%A>@sC6s%1jQILM6*crd@o?<~&~c6@GKbK}JurKWzyrS1vU}?ouV!4FGl5cr&vI<9s)BT02!Ajokn&KH@jTN!7@yII8&(zs?-i
z7K#0tPVwHBV*f_jlvYUT$7pxUIFFJYrGJpBuaE+*>!td_LDIQb>gY3)@m`dI{(k|r
zUg85{JMnwsDdJ<|ZQ>7<#}iVplD5|^BZ|ZTkr6+Tf(NRB`Y|aK@RA=t<9+f{;eCEf
zc8mUn+@_9=sEUy;`Llr4ere>}_o?+Bo~?GY1f}t&8er;a>EZK7$ryiOs^$>&YJjN*
zJwV|@7G<`R?bBFXCuLGn&*FB>1om`oqhI+A$=xekJ4oMEAvtyztvCIYPiQRj`{fsdq(zK6%<>JgXEu!kIWf#)
zCa;=7HLQJB-q1i@3%TS9a{=9w3w)vC6b|x@ip4rAxAX_-8e8PHgzMCiy>jSX+FQ1U
z_bHX;QT0=I>AXe9)w424)s4?^o7SzZ&QPCN{!bFu$k%C|v$m=K*OdiqYSWnKL;)*H
zGzlvrfbDsjxlslRIaRYbxSW{H2eom@!Uw=2Ks$1ZE>zn*ep&BGzNTxNc?VeXTiuSM+iCSHT~|>*
zX_2XWV;{VtjLvaa_Q#cYq{HiISks_tCg4XX8;?&7)?z>^PjpN_5vsy@_D
zSw$vETcLM;NzXgY`k#GzjiQ443{K$=-))GUQ!DGcZ@fh_txCW9D9OI&C4G-+l7{Yt
zzNg`7x<7XPzMW5ykBjvCMmJCshxr7({3f>DbKGsX>$
zd?T=Q$gm`jW`YKWCHYjMX0{>o^dX9%@OERWxJls`jn4@oK529ahq=woU|D;^%qmvnO90_X7-%y
zHy!Y)Q;>o}r1F=W;@l~4{`ecy(THXwX=waFrmrofFg4p>?ys!(Pp|eB`Ko>XS9}Xn
aoQ0{=8=I5(%7!UI0zVNk^`x)1Jof)VF(>r^
delta 1904
zcmXAq3s6*L7>3_-_MEe4cMq(9uq_H(DHsauF626znm0tu#gtoSYN6b3%2ienR19|k
zmH7)nG8>Id1JcaIYl>+}kyO$JFHNJ4SL~uW;wAf>o!OaZ_Uym^|9$WKe*fv|;CuG-
z8wXoA0tli{G0_SvuLXn#KLgEDC9-z$1a=7Vy!49^Mi}bw<
zc=th!-wec@bu*)biM+{L4l(s8;JXB3!4kmF4zX4MjOh^B2B7jwhz;~Ssmaadi&z40
zit&fou@4w_+s#QS5YK!K3?Bl`BL#3igy-g&zzcR*+I|DpHDK)TkwEBLO#k_PKzk0+
z>&5}OLF@=`^2&x?C<9i!3%hL4hf*(+LD$iJ<2Ic&!_D;l=)UO#RDXj@!X=>O2VBmj!npx1Oj!@qv~#aU(0-Py
zT-E6eGIuAp)lR;v{^r&{#2!f9lYa@K5A$S3lI%lG#f3Nj4FQMB(3pUrBb}9fQfdM=di~>jxWm*
z4aOy^$il@ybgn9D?f@|7M^$3`0U)c8Z4u3!59_9VD%lm;>Yl3c21__MIj52OcgOgehPm=)^FEqG1DgUiPV+>i!4oOyS
z6zi94e9lQ0qz?98x=lEp8wb3WD|G$29jNMM3)Cj7mvF1B02s1gxcBl-3i&)yRqi4i
zTSe7AJCJ-&^z{m)S?U%?)KGnCPgt8ekWXo5-D<;IRbnEenEB|$#MVq8BTh^@N}B*;
z=1p3h)gfm7WuV_P-LyV0W^X2O{f3I!Czes}dc<<}I$-V)Yu=+~Rvr~=TVDkH7rL4C
zGK-RJeAW|IE{F3=Z?QHxuwu;}vESk(kMktoJPJtJamjD-=Ok>SWUMA7=enfe_4Itj
zG09v=!Ai=IESN?mEtV|1exmqBNK>8EvA^2Q%xjW;6wRj;=4NW0H1|1b>WvqrHS5QZu*vP}kQpRt_Gc_eYtt_4QSX^`o0M%}DOz)gtbVeATw1Eg
zUJ<^OzjQe?)*D#;haBnaLH=)-r#NR3FR&xp5t>-pxrxzGm9c(p;N1KV<=uCT6v5&0
zfs>c$%4w1h4`~Mis^t?tD=G5Pa@QBVROd#y>nmz`e53qr(;6VWO}<}T3XD+61ATYs
zayg?BPKQ$;f3pR;Kt8pTmFo<1ESmgK(q)-T<2Xji%{OYQ>no_z`I@a?(LA{xX+HWV
z42Vl}GwHGB;BIQZa<=B!w+TSR4$Y|qKhm{AbIq}uF5>&_iq32tsvX-&Zs_m289qw;
z`X~QUiC?oYWs%Wa>$p$a7`wGK@n6!6uGW5hcpOP*VJ*rC4X^F`f@EKFg!L+>m?gTZ
zpliUiL%Q0X)Kpc5ZbK@WGjyhI0Sj)$3B%C>j}M-;AC>My=S
zci({W?oNu}{8yDtdb&!SMarh-!)bT|mFBu_MIi7+1>Uvh^Ig!t+XWgD-IBzEE
zO`Mqp>CGYI^n?5;Riy>`i9U2e4DQm;d7r$jvFJ;-QIPT
-
+
+
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(''+self.tagName+'>')
+
+ 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''+self.tagName+'>')
+ 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("%s>" % 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('%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