mirror of
https://github.com/olivierkes/manuskript.git
synced 2024-05-23 22:29:42 +12:00
Trying things with odt export
This commit is contained in:
parent
c6aebf901f
commit
4beaaef168
Binary file not shown.
|
@ -1,5 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!DOCTYPE TS><TS version="2.0" language="fr" sourcelanguage="en">
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="fr" sourcelanguage="en">
|
||||||
<context>
|
<context>
|
||||||
<name>MainWindow</name>
|
<name>MainWindow</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -208,7 +209,7 @@
|
||||||
<translation>Étapes de résolution</translation>
|
<translation>Étapes de résolution</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1140"/>
|
<location filename="../src/mainWindow.py" line="960"/>
|
||||||
<source>Outline</source>
|
<source>Outline</source>
|
||||||
<translation>Plan</translation>
|
<translation>Plan</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -358,7 +359,7 @@
|
||||||
<translation>Et si...?</translation>
|
<translation>Et si...?</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1139"/>
|
<location filename="../src/mainWindow.py" line="959"/>
|
||||||
<source>Index cards</source>
|
<source>Index cards</source>
|
||||||
<translation>Cartes</translation>
|
<translation>Cartes</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -373,7 +374,7 @@
|
||||||
<translation>F9</translation>
|
<translation>F9</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1138"/>
|
<location filename="../src/mainWindow.py" line="958"/>
|
||||||
<source>Tree</source>
|
<source>Tree</source>
|
||||||
<translation>Arbre</translation>
|
<translation>Arbre</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -398,7 +399,7 @@
|
||||||
<translation>Réglages</translation>
|
<translation>Réglages</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1134"/>
|
<location filename="../src/mainWindow.py" line="954"/>
|
||||||
<source>Compile</source>
|
<source>Compile</source>
|
||||||
<translation>Compilation</translation>
|
<translation>Compilation</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -448,167 +449,167 @@
|
||||||
<translation>Source de conflit</translation>
|
<translation>Source de conflit</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="397"/>
|
<location filename="../src/mainWindow.py" line="288"/>
|
||||||
<source>The file {} does not exist. Try again.</source>
|
<source>The file {} does not exist. Try again.</source>
|
||||||
<translation type="unfinished">Le fichier {} n'existe pas. Essayez encore.</translation>
|
<translation type="unfinished">Le fichier {} n'existe pas. Essayez encore.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="586"/>
|
<location filename="../src/mainWindow.py" line="464"/>
|
||||||
<source>Project {} saved.</source>
|
<source>Project {} saved.</source>
|
||||||
<translation type="unfinished">Le projet {} a été enregistré.</translation>
|
<translation type="unfinished">Le projet {} a été enregistré.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="663"/>
|
<location filename="../src/mainWindow.py" line="533"/>
|
||||||
<source>Project {} loaded.</source>
|
<source>Project {} loaded.</source>
|
||||||
<translation type="unfinished">Le projet {} a été chargé.</translation>
|
<translation type="unfinished">Le projet {} a été chargé.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="666"/>
|
<location filename="../src/mainWindow.py" line="536"/>
|
||||||
<source>Project {} loaded with some errors:</source>
|
<source>Project {} loaded with some errors:</source>
|
||||||
<translation type="unfinished">Le projet {} a été chargé, avec des erreurs:</translation>
|
<translation type="unfinished">Le projet {} a été chargé, avec des erreurs:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="668"/>
|
<location filename="../src/mainWindow.py" line="538"/>
|
||||||
<source> * {} wasn't found in project file.</source>
|
<source> * {} wasn't found in project file.</source>
|
||||||
<translation type="unfinished">* {} n'a pas été trouvé dans le fichier du projet.</translation>
|
<translation type="unfinished">* {} n'a pas été trouvé dans le fichier du projet.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="669"/>
|
<location filename="../src/mainWindow.py" line="539"/>
|
||||||
<source>Project {} loaded with some errors.</source>
|
<source>Project {} loaded with some errors.</source>
|
||||||
<translation type="unfinished">Le projet {} a été chargé avec des erreurs.</translation>
|
<translation type="unfinished">Le projet {} a été chargé avec des erreurs.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="957"/>
|
<location filename="../src/mainWindow.py" line="780"/>
|
||||||
<source> (~{} pages)</source>
|
<source> (~{} pages)</source>
|
||||||
<translation type="unfinished"> (~{} pages)</translation>
|
<translation type="unfinished"> (~{} pages)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="961"/>
|
<location filename="../src/mainWindow.py" line="784"/>
|
||||||
<source>Words: {}{}</source>
|
<source>Words: {}{}</source>
|
||||||
<translation type="unfinished">Mots: {}{}</translation>
|
<translation type="unfinished">Mots: {}{}</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="967"/>
|
<location filename="../src/mainWindow.py" line="790"/>
|
||||||
<source>Book summary</source>
|
<source>Book summary</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="968"/>
|
<location filename="../src/mainWindow.py" line="791"/>
|
||||||
<source>Project tree</source>
|
<source>Project tree</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="969"/>
|
<location filename="../src/mainWindow.py" line="792"/>
|
||||||
<source>Metadata</source>
|
<source>Metadata</source>
|
||||||
<translation type="unfinished">Métadonnées</translation>
|
<translation type="unfinished">Métadonnées</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="999"/>
|
<location filename="../src/mainWindow.py" line="822"/>
|
||||||
<source>Enter infos about your book, and yourself.</source>
|
<source>Enter infos about your book, and yourself.</source>
|
||||||
<translation type="unfinished">Entrez toutes les informations relatives au livre, ainsi qu'à vous.</translation>
|
<translation type="unfinished">Entrez toutes les informations relatives au livre, ainsi qu'à vous.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1002"/>
|
<location filename="../src/mainWindow.py" line="825"/>
|
||||||
<source>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)</source>
|
<source>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)</source>
|
||||||
<translation type="unfinished">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)</translation>
|
<translation type="unfinished">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)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1005"/>
|
<location filename="../src/mainWindow.py" line="828"/>
|
||||||
<source>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.</source>
|
<source>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.</source>
|
||||||
<translation type="unfinished">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.</translation>
|
<translation type="unfinished">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.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1008"/>
|
<location filename="../src/mainWindow.py" line="831"/>
|
||||||
<source>Create your characters.</source>
|
<source>Create your characters.</source>
|
||||||
<translation type="unfinished">Créez ici vos personnage.</translation>
|
<translation type="unfinished">Créez ici vos personnage.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1011"/>
|
<location filename="../src/mainWindow.py" line="834"/>
|
||||||
<source>Develop plots.</source>
|
<source>Develop plots.</source>
|
||||||
<translation type="unfinished">Développez vos intrigues.</translation>
|
<translation type="unfinished">Développez vos intrigues.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1014"/>
|
<location filename="../src/mainWindow.py" line="837"/>
|
||||||
<source>Create the outline of your masterpiece.</source>
|
<source>Create the outline of your masterpiece.</source>
|
||||||
<translation type="unfinished">Créez le plan de votre chef-d'œuvre.</translation>
|
<translation type="unfinished">Créez le plan de votre chef-d'œuvre.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1017"/>
|
<location filename="../src/mainWindow.py" line="840"/>
|
||||||
<source>Write.</source>
|
<source>Write.</source>
|
||||||
<translation type="unfinished">Écrivez.</translation>
|
<translation type="unfinished">Écrivez.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1020"/>
|
<location filename="../src/mainWindow.py" line="843"/>
|
||||||
<source>Debug infos. Sometimes useful.</source>
|
<source>Debug infos. Sometimes useful.</source>
|
||||||
<translation type="unfinished">Des infos pour débugger des fois pendant qu'on code c'est utile.</translation>
|
<translation type="unfinished">Des infos pour débugger des fois pendant qu'on code c'est utile.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1034"/>
|
<location filename="../src/mainWindow.py" line="857"/>
|
||||||
<source>Dictionary</source>
|
<source>Dictionary</source>
|
||||||
<translation type="unfinished">Dictionnaire</translation>
|
<translation type="unfinished">Dictionnaire</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1047"/>
|
<location filename="../src/mainWindow.py" line="870"/>
|
||||||
<source>Install PyEnchant to use spellcheck</source>
|
<source>Install PyEnchant to use spellcheck</source>
|
||||||
<translation type="unfinished">Installez PyEnchant pour profiter du correcteur orthographique</translation>
|
<translation type="unfinished">Installez PyEnchant pour profiter du correcteur orthographique</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1130"/>
|
<location filename="../src/mainWindow.py" line="950"/>
|
||||||
<source>Nothing</source>
|
<source>Nothing</source>
|
||||||
<translation type="unfinished">Rien</translation>
|
<translation type="unfinished">Rien</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1131"/>
|
<location filename="../src/mainWindow.py" line="951"/>
|
||||||
<source>POV</source>
|
<source>POV</source>
|
||||||
<translation type="unfinished">POV</translation>
|
<translation type="unfinished">POV</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1132"/>
|
<location filename="../src/mainWindow.py" line="952"/>
|
||||||
<source>Label</source>
|
<source>Label</source>
|
||||||
<translation type="unfinished">Label</translation>
|
<translation type="unfinished">Label</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1133"/>
|
<location filename="../src/mainWindow.py" line="953"/>
|
||||||
<source>Progress</source>
|
<source>Progress</source>
|
||||||
<translation type="unfinished">Progrès</translation>
|
<translation type="unfinished">Progrès</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1157"/>
|
<location filename="../src/mainWindow.py" line="977"/>
|
||||||
<source>Icon color</source>
|
<source>Icon color</source>
|
||||||
<translation type="unfinished">Couleur de l'icone</translation>
|
<translation type="unfinished">Couleur de l'icone</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1158"/>
|
<location filename="../src/mainWindow.py" line="978"/>
|
||||||
<source>Text color</source>
|
<source>Text color</source>
|
||||||
<translation type="unfinished">Couleur du texte</translation>
|
<translation type="unfinished">Couleur du texte</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1159"/>
|
<location filename="../src/mainWindow.py" line="979"/>
|
||||||
<source>Background color</source>
|
<source>Background color</source>
|
||||||
<translation type="unfinished">Couleur de l'arrière-plan</translation>
|
<translation type="unfinished">Couleur de l'arrière-plan</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1150"/>
|
<location filename="../src/mainWindow.py" line="970"/>
|
||||||
<source>Icon</source>
|
<source>Icon</source>
|
||||||
<translation type="unfinished">Icone</translation>
|
<translation type="unfinished">Icone</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1151"/>
|
<location filename="../src/mainWindow.py" line="971"/>
|
||||||
<source>Text</source>
|
<source>Text</source>
|
||||||
<translation type="unfinished">Texte</translation>
|
<translation type="unfinished">Texte</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1152"/>
|
<location filename="../src/mainWindow.py" line="972"/>
|
||||||
<source>Background</source>
|
<source>Background</source>
|
||||||
<translation type="unfinished">Arrière-plan</translation>
|
<translation type="unfinished">Arrière-plan</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1153"/>
|
<location filename="../src/mainWindow.py" line="973"/>
|
||||||
<source>Border</source>
|
<source>Border</source>
|
||||||
<translation type="unfinished">Bordure</translation>
|
<translation type="unfinished">Bordure</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/mainWindow.py" line="1154"/>
|
<location filename="../src/mainWindow.py" line="974"/>
|
||||||
<source>Corner</source>
|
<source>Corner</source>
|
||||||
<translation type="unfinished">Coin</translation>
|
<translation type="unfinished">Coin</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -1465,32 +1466,32 @@ des lignes:</translation>
|
||||||
<translation>Bloquer !</translation>
|
<translation>Bloquer !</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/ui/editors/locker.py" line="81"/>
|
<location filename="../src/ui/editors/locker.py" line="97"/>
|
||||||
<source>~{} h.</source>
|
<source>~{} h.</source>
|
||||||
<translation>~{} h.</translation>
|
<translation>~{} h.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/ui/editors/locker.py" line="83"/>
|
<location filename="../src/ui/editors/locker.py" line="99"/>
|
||||||
<source>~{} mn.</source>
|
<source>~{} mn.</source>
|
||||||
<translation>~{} mn.</translation>
|
<translation>~{} mn.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/ui/editors/locker.py" line="87"/>
|
<location filename="../src/ui/editors/locker.py" line="103"/>
|
||||||
<source>{}:{}</source>
|
<source>{}:{}</source>
|
||||||
<translation>{}:{}</translation>
|
<translation>{}:{}</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/ui/editors/locker.py" line="89"/>
|
<location filename="../src/ui/editors/locker.py" line="105"/>
|
||||||
<source>{} s.</source>
|
<source>{} s.</source>
|
||||||
<translation>{} s.</translation>
|
<translation>{} s.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/ui/editors/locker.py" line="91"/>
|
<location filename="../src/ui/editors/locker.py" line="107"/>
|
||||||
<source>{} remaining</source>
|
<source>{} remaining</source>
|
||||||
<translation>{} restant</translation>
|
<translation>{} restant</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/ui/editors/locker.py" line="96"/>
|
<location filename="../src/ui/editors/locker.py" line="112"/>
|
||||||
<source>{} words remaining</source>
|
<source>{} words remaining</source>
|
||||||
<translation>{} mots restants</translation>
|
<translation>{} mots restants</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -1833,7 +1834,7 @@ des lignes:</translation>
|
||||||
<context>
|
<context>
|
||||||
<name>references</name>
|
<name>references</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/models/references.py" line="408"/>
|
<location filename="../src/models/references.py" line="379"/>
|
||||||
<source>Unknown reference: {}.</source>
|
<source>Unknown reference: {}.</source>
|
||||||
<translation>Référence inconnue: {}.</translation>
|
<translation>Référence inconnue: {}.</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -1843,7 +1844,7 @@ des lignes:</translation>
|
||||||
<translation>Texte: <b>{}</b></translation>
|
<translation>Texte: <b>{}</b></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/models/references.py" line="391"/>
|
<location filename="../src/models/references.py" line="392"/>
|
||||||
<source>Character: <b>{}</b></source>
|
<source>Character: <b>{}</b></source>
|
||||||
<translation>Personnage: <b>{}</b></translation>
|
<translation>Personnage: <b>{}</b></translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -1968,7 +1969,7 @@ des lignes:</translation>
|
||||||
<translation>Étapes de résolution</translation>
|
<translation>Étapes de résolution</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/models/references.py" line="396"/>
|
<location filename="../src/models/references.py" line="398"/>
|
||||||
<source>Plot: <b>{}</b></source>
|
<source>Plot: <b>{}</b></source>
|
||||||
<translation>Intrigue: <b>{}</b></translation>
|
<translation>Intrigue: <b>{}</b></translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -1978,10 +1979,15 @@ des lignes:</translation>
|
||||||
<translation>Passion</translation>
|
<translation>Passion</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/models/references.py" line="404"/>
|
<location filename="../src/models/references.py" line="406"/>
|
||||||
<source>World: <b>{name}</b>{path}</source>
|
<source>World: <b>{name}</b>{path}</source>
|
||||||
<translation>Monde: <b>{name}</b>{path}</translation>
|
<translation>Monde: <b>{name}</b>{path}</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/models/references.py" line="410"/>
|
||||||
|
<source><b>Unknown reference:</b> {}.</source>
|
||||||
|
<translation><b>Référence inconnue:</b> {}.</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>revisions</name>
|
<name>revisions</name>
|
||||||
|
|
339
libs/odf/GPL-LICENSE-2.txt
Normal file
339
libs/odf/GPL-LICENSE-2.txt
Normal file
|
@ -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.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 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.
|
19
libs/odf/__init__.py
Normal file
19
libs/odf/__init__.py
Normal file
|
@ -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):
|
||||||
|
#
|
||||||
|
|
61
libs/odf/anim.py
Normal file
61
libs/odf/anim.py
Normal file
|
@ -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)
|
||||||
|
|
1612
libs/odf/attrconverters.py
Normal file
1612
libs/odf/attrconverters.py
Normal file
File diff suppressed because it is too large
Load diff
96
libs/odf/chart.py
Normal file
96
libs/odf/chart.py
Normal file
|
@ -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)
|
||||||
|
|
39
libs/odf/config.py
Normal file
39
libs/odf/config.py
Normal file
|
@ -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)
|
||||||
|
|
72
libs/odf/dc.py
Normal file
72
libs/odf/dc.py
Normal file
|
@ -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)
|
45
libs/odf/dr3d.py
Normal file
45
libs/odf/dr3d.py
Normal file
|
@ -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)
|
||||||
|
|
188
libs/odf/draw.py
Normal file
188
libs/odf/draw.py
Normal file
|
@ -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)
|
||||||
|
|
104
libs/odf/easyliststyle.py
Normal file
104
libs/odf/easyliststyle.py
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Create a <text:list-style> 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 <text:list-style> 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 <text:list-style> element for you.
|
||||||
|
Each item in the string (or array) represents a list level
|
||||||
|
* style for levels 1-10.</p>
|
||||||
|
*
|
||||||
|
* <p>If an item contains <code>1</code>, <code>I</code>,
|
||||||
|
* <code>i</code>, <code>A</code>, or <code>a</code>, then it is presumed
|
||||||
|
* to be a numbering style; otherwise it is a bulleted style.</p>
|
||||||
|
"""
|
||||||
|
|
||||||
|
_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 :
|
541
libs/odf/element.py
Normal file
541
libs/odf/element.py
Normal file
|
@ -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 <rubbish> 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. (<![CDATA[)
|
||||||
|
"""
|
||||||
|
if self.data:
|
||||||
|
f.write('<![CDATA[%s]]>' % self.data.replace(']]>',']]>]]><![CDATA['))
|
||||||
|
|
||||||
|
class Element(Node):
|
||||||
|
""" Creates a arbitrary element and is intended to be subclassed not used on its own.
|
||||||
|
This element is the base of every element it defines a class which resembles
|
||||||
|
a xml-element. The main advantage of this kind of implementation is that you don't
|
||||||
|
have to create a toXML method for every different object. Every element
|
||||||
|
consists of an attribute, optional subelements, optional text and optional cdata.
|
||||||
|
"""
|
||||||
|
|
||||||
|
nodeType = Node.ELEMENT_NODE
|
||||||
|
namespaces = {} # Due to shallow copy this is a static variable
|
||||||
|
|
||||||
|
_child_node_types = (Node.ELEMENT_NODE,
|
||||||
|
Node.PROCESSING_INSTRUCTION_NODE,
|
||||||
|
Node.COMMENT_NODE,
|
||||||
|
Node.TEXT_NODE,
|
||||||
|
Node.CDATA_SECTION_NODE,
|
||||||
|
Node.ENTITY_REFERENCE_NODE)
|
||||||
|
|
||||||
|
def __init__(self, attributes=None, text=None, cdata=None, qname=None, qattributes=None, check_grammar=True, **args):
|
||||||
|
if qname is not None:
|
||||||
|
self.qname = qname
|
||||||
|
assert(hasattr(self, 'qname'))
|
||||||
|
self.ownerDocument = None
|
||||||
|
self.childNodes=[]
|
||||||
|
self.allowed_children = grammar.allowed_children.get(self.qname)
|
||||||
|
prefix = self.get_nsprefix(self.qname[0])
|
||||||
|
self.tagName = prefix + ":" + self.qname[1]
|
||||||
|
if text is not None:
|
||||||
|
self.addText(text)
|
||||||
|
if cdata is not None:
|
||||||
|
self.addCDATA(cdata)
|
||||||
|
|
||||||
|
allowed_attrs = self.allowed_attributes()
|
||||||
|
if allowed_attrs is not None:
|
||||||
|
allowed_args = [ a[1].lower().replace('-','') for a in allowed_attrs]
|
||||||
|
self.attributes={}
|
||||||
|
# Load the attributes from the 'attributes' argument
|
||||||
|
if attributes:
|
||||||
|
for attr, value in attributes.items():
|
||||||
|
self.setAttribute(attr, value)
|
||||||
|
# Load the qualified attributes
|
||||||
|
if qattributes:
|
||||||
|
for attr, value in qattributes.items():
|
||||||
|
self.setAttrNS(attr[0], attr[1], value)
|
||||||
|
if allowed_attrs is not None:
|
||||||
|
# Load the attributes from the 'args' argument
|
||||||
|
for arg in args.keys():
|
||||||
|
self.setAttribute(arg, args[arg])
|
||||||
|
else:
|
||||||
|
for arg in args.keys(): # If any attribute is allowed
|
||||||
|
self.attributes[arg]=args[arg]
|
||||||
|
if not check_grammar:
|
||||||
|
return
|
||||||
|
# Test that all mandatory attributes have been added.
|
||||||
|
required = grammar.required_attributes.get(self.qname)
|
||||||
|
if required:
|
||||||
|
for r in required:
|
||||||
|
if self.getAttrNS(r[0],r[1]) is None:
|
||||||
|
raise AttributeError( "Required attribute missing: %s in <%s>" % (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
|
||||||
|
|
||||||
|
|
325
libs/odf/elementtypes.py
Normal file
325
libs/odf/elementtypes.py
Normal file
|
@ -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')
|
||||||
|
)
|
115
libs/odf/form.py
Normal file
115
libs/odf/form.py
Normal file
|
@ -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)
|
||||||
|
|
9194
libs/odf/grammar.py
Normal file
9194
libs/odf/grammar.py
Normal file
File diff suppressed because it is too large
Load diff
115
libs/odf/load.py
Normal file
115
libs/odf/load.py
Normal file
|
@ -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
|
44
libs/odf/manifest.py
Normal file
44
libs/odf/manifest.py
Normal file
|
@ -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)
|
||||||
|
|
30
libs/odf/math.py
Normal file
30
libs/odf/math.py
Normal file
|
@ -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)
|
||||||
|
|
67
libs/odf/meta.py
Normal file
67
libs/odf/meta.py
Normal file
|
@ -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)
|
||||||
|
|
107
libs/odf/namespaces.py
Normal file
107
libs/odf/namespaces.py
Normal file
|
@ -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',
|
||||||
|
}
|
104
libs/odf/number.py
Normal file
104
libs/odf/number.py
Normal file
|
@ -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)
|
||||||
|
|
579
libs/odf/odf2moinmoin.py
Normal file
579
libs/odf/odf2moinmoin.py
Normal file
|
@ -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)
|
1617
libs/odf/odf2xhtml.py
Normal file
1617
libs/odf/odf2xhtml.py
Normal file
File diff suppressed because it is too large
Load diff
120
libs/odf/odfmanifest.py
Normal file
120
libs/odf/odfmanifest.py
Normal file
|
@ -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']))
|
||||||
|
|
107
libs/odf/office.py
Normal file
107
libs/odf/office.py
Normal file
|
@ -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
|
1011
libs/odf/opendocument.py
Normal file
1011
libs/odf/opendocument.py
Normal file
File diff suppressed because it is too large
Load diff
86
libs/odf/presentation.py
Normal file
86
libs/odf/presentation.py
Normal file
|
@ -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)
|
||||||
|
|
30
libs/odf/script.py
Normal file
30
libs/odf/script.py
Normal file
|
@ -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 <script:event-listener> element binds an event to a macro.
|
||||||
|
|
||||||
|
# Autogenerated
|
||||||
|
def EventListener(**args):
|
||||||
|
return Element(qname = (SCRIPTNS,'event-listener'), **args)
|
||||||
|
|
154
libs/odf/style.py
Normal file
154
libs/odf/style.py
Normal file
|
@ -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)
|
||||||
|
|
56
libs/odf/svg.py
Normal file
56
libs/odf/svg.py
Normal file
|
@ -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)
|
321
libs/odf/table.py
Normal file
321
libs/odf/table.py
Normal file
|
@ -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)
|
||||||
|
|
137
libs/odf/teletype.py
Normal file
137
libs/odf/teletype.py
Normal file
|
@ -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 <text:s>, <text:tab>, or <text:line-break>
|
||||||
|
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
|
||||||
|
<text:tab> elements for '\t',
|
||||||
|
<text:line-break> elements for '\n', and
|
||||||
|
<text:s> 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 <text:s> 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 <text:s> 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"
|
||||||
|
<text:s>, <text:tab>, and <text:line-break> 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)
|
573
libs/odf/text.py
Normal file
573
libs/odf/text.py
Normal file
|
@ -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)
|
||||||
|
|
80
libs/odf/thumbnail.py
Normal file
80
libs/odf/thumbnail.py
Normal file
|
@ -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()
|
180
libs/odf/userfield.py
Normal file
180
libs/odf/userfield.py
Normal file
|
@ -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 (<field name>, <field type>, <value>)
|
||||||
|
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 (<type>, <field-value>) 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()
|
||||||
|
|
34
libs/odf/xforms.py
Normal file
34
libs/odf/xforms.py
Normal file
|
@ -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)
|
|
@ -6,6 +6,14 @@ from enums import *
|
||||||
from functions import *
|
from functions import *
|
||||||
from exporter.basic import basicExporter
|
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):
|
class odtExporter(basicExporter):
|
||||||
|
|
||||||
requires = ["filename"]
|
requires = ["filename"]
|
||||||
|
@ -17,45 +25,51 @@ class odtExporter(basicExporter):
|
||||||
mw = mainWindow()
|
mw = mainWindow()
|
||||||
root = mw.mdlOutline.rootItem
|
root = mw.mdlOutline.rootItem
|
||||||
|
|
||||||
doc = QTextDocument()
|
doc = OpenDocumentText()
|
||||||
cursor = QTextCursor(doc)
|
|
||||||
|
|
||||||
|
|
||||||
def appendItem(item):
|
def appendItem(item):
|
||||||
if item.isFolder():
|
if item.isFolder():
|
||||||
|
|
||||||
cursor.setPosition(doc.characterCount() - 1)
|
self.addHeading(item.title(), item.level() + 1, doc)
|
||||||
title = "<h{l}>{t}</h{l}><br>\n".format(
|
|
||||||
l = str(item.level() + 1),
|
|
||||||
t = item.title())
|
|
||||||
cursor.insertHtml(title)
|
|
||||||
|
|
||||||
for c in item.children():
|
for c in item.children():
|
||||||
appendItem(c)
|
appendItem(c)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
text = self.formatText(item.text(), item.type())
|
text = self.formatText(item.text(), item.type())
|
||||||
cursor.setPosition(doc.characterCount() - 1)
|
if text:
|
||||||
cursor.insertHtml(text)
|
for l in text.split("\n"):
|
||||||
|
self.addParagraph(l, doc)
|
||||||
|
|
||||||
for c in root.children():
|
for c in root.children():
|
||||||
appendItem(c)
|
appendItem(c)
|
||||||
|
|
||||||
dw = QTextDocumentWriter(filename, "odt")
|
doc.save(filename)
|
||||||
dw.write(doc)
|
|
||||||
|
|
||||||
def formatText(self, text, _type):
|
def formatText(self, text, _type):
|
||||||
|
|
||||||
if not text:
|
if not text:
|
||||||
return text
|
return text
|
||||||
|
|
||||||
if _type == "t2t":
|
#if _type == "t2t":
|
||||||
text = self.runT2T(text)
|
#text = self.runT2T(text)
|
||||||
|
|
||||||
elif _type == "txt":
|
#elif _type == "txt":
|
||||||
text = text.replace("\n", "<br>")
|
#text = text.replace("\n", "<br>")
|
||||||
|
|
||||||
elif _type == "html":
|
elif _type == "html":
|
||||||
text = self.htmlBody(text)
|
doc = QTextDocument()
|
||||||
|
doc.setHtml(text)
|
||||||
|
text = doc.toPlainText()
|
||||||
|
#text = self.htmlBody(text)
|
||||||
|
|
||||||
return text + "<br>"
|
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
|
61
src/exporter/odt_old.py
Normal file
61
src/exporter/odt_old.py
Normal file
|
@ -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 = "<h{l}>{t}</h{l}><br>\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", "<br>")
|
||||||
|
|
||||||
|
elif _type == "html":
|
||||||
|
text = self.htmlBody(text)
|
||||||
|
|
||||||
|
return text + "<br>"
|
|
@ -381,13 +381,15 @@ def tooltip(ref):
|
||||||
|
|
||||||
elif _type == PersoLetter:
|
elif _type == PersoLetter:
|
||||||
m = mainWindow().mdlPersos
|
m = mainWindow().mdlPersos
|
||||||
name = m.item(int(_ref), Perso.name.value).text()
|
item = m.item(int(_ref), Perso.name.value)
|
||||||
return qApp.translate("references", "Character: <b>{}</b>").format(name)
|
if item:
|
||||||
|
return qApp.translate("references", "Character: <b>{}</b>").format(item.text())
|
||||||
|
|
||||||
elif _type == PlotLetter:
|
elif _type == PlotLetter:
|
||||||
m = mainWindow().mdlPlots
|
m = mainWindow().mdlPlots
|
||||||
name = m.getPlotNameByID(_ref)
|
name = m.getPlotNameByID(_ref)
|
||||||
return qApp.translate("references", "Plot: <b>{}</b>").format(name)
|
if name:
|
||||||
|
return qApp.translate("references", "Plot: <b>{}</b>").format(name)
|
||||||
|
|
||||||
elif _type == WorldLetter:
|
elif _type == WorldLetter:
|
||||||
m = mainWindow().mdlWorld
|
m = mainWindow().mdlWorld
|
||||||
|
@ -399,7 +401,7 @@ def tooltip(ref):
|
||||||
name=name,
|
name=name,
|
||||||
path=" <span style='color:gray;'>({})</span>".format(path) if path else "")
|
path=" <span style='color:gray;'>({})</span>".format(path) if path else "")
|
||||||
|
|
||||||
return qApp.translate("references", "Unknown reference: {}.").format(ref)
|
return qApp.translate("references", "<b>Unknown reference:</b> {}.").format(ref)
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# FUNCTIONS
|
# FUNCTIONS
|
||||||
|
|
|
@ -105,7 +105,7 @@ class worldModel(QStandardItemModel):
|
||||||
return r
|
return r
|
||||||
|
|
||||||
r = browse(self.invisibleRootItem())
|
r = browse(self.invisibleRootItem())
|
||||||
return r if r else -1
|
return r if r else None
|
||||||
|
|
||||||
def path(self, item):
|
def path(self, item):
|
||||||
"Returns the path to the item in the form of 'ancestor > ... > grand-parent > parent'."
|
"Returns the path to the item in the form of 'ancestor > ... > grand-parent > parent'."
|
||||||
|
|
|
@ -154,9 +154,10 @@ class textEditCompleter(textEditView):
|
||||||
self.refRects = refs
|
self.refRects = refs
|
||||||
|
|
||||||
def paintEvent(self, event):
|
def paintEvent(self, event):
|
||||||
#event = QPaintEvent(self.viewport().geometry())
|
|
||||||
QTextEdit.paintEvent(self, event)
|
QTextEdit.paintEvent(self, event)
|
||||||
painter = QPainter(self.viewport())
|
|
||||||
painter.setPen(Qt.gray)
|
# Debug: paint rects
|
||||||
for r in self.refRects:
|
#painter = QPainter(self.viewport())
|
||||||
painter.drawRect(r)
|
#painter.setPen(Qt.gray)
|
||||||
|
#for r in self.refRects:
|
||||||
|
#painter.drawRect(r)
|
Loading…
Reference in a new issue