From: <mat...@us...> - 2008-12-05 17:43:06
|
Author: matt_harrison Date: 2008-12-05 18:42:53 +0100 (Fri, 05 Dec 2008) New Revision: 5794 Added: trunk/sandbox/rst2odp/INSTALL trunk/sandbox/rst2odp/LICENSE trunk/sandbox/rst2odp/MANIFEST.in trunk/sandbox/rst2odp/README trunk/sandbox/rst2odp/bin/rst2odp trunk/sandbox/rst2odp/odplib/ trunk/sandbox/rst2odp/odplib/__init__.py trunk/sandbox/rst2odp/odplib/data/ trunk/sandbox/rst2odp/odplib/data/auto_list.xml trunk/sandbox/rst2odp/odplib/data/settings.xml trunk/sandbox/rst2odp/odplib/data/styles.xml trunk/sandbox/rst2odp/odplib/imagescale.py trunk/sandbox/rst2odp/odplib/preso.py trunk/sandbox/rst2odp/odplib/zipwrap.py trunk/sandbox/rst2odp/setup.py Removed: trunk/sandbox/rst2odp/rst2odp/imagescale.py Log: Initial version of 3rd version of rst2odp. This one appears to work and is built off of odplib. Added: trunk/sandbox/rst2odp/INSTALL =================================================================== --- trunk/sandbox/rst2odp/INSTALL 2008-12-05 17:24:30 UTC (rev 5793) +++ trunk/sandbox/rst2odp/INSTALL 2008-12-05 17:42:53 UTC (rev 5794) @@ -0,0 +1 @@ +Install with your preferred python mechanism ;) \ No newline at end of file Added: trunk/sandbox/rst2odp/LICENSE =================================================================== --- trunk/sandbox/rst2odp/LICENSE 2008-12-05 17:24:30 UTC (rev 5793) +++ trunk/sandbox/rst2odp/LICENSE 2008-12-05 17:42:53 UTC (rev 5794) @@ -0,0 +1,204 @@ + + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2008 Matt Harrison + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. Added: trunk/sandbox/rst2odp/MANIFEST.in =================================================================== --- trunk/sandbox/rst2odp/MANIFEST.in 2008-12-05 17:24:30 UTC (rev 5793) +++ trunk/sandbox/rst2odp/MANIFEST.in 2008-12-05 17:42:53 UTC (rev 5794) @@ -0,0 +1,7 @@ +include README +include LICENSE +include INSTALL +include odplib/data/settings.xml +include odplib/data/styles.xml +include odplib/data/auto_list.xml +include odplib/zipwrap \ No newline at end of file Added: trunk/sandbox/rst2odp/README =================================================================== --- trunk/sandbox/rst2odp/README 2008-12-05 17:24:30 UTC (rev 5793) +++ trunk/sandbox/rst2odp/README 2008-12-05 17:42:53 UTC (rev 5794) @@ -0,0 +1,21 @@ +Converts rst to OpenOffice impress (rst2odp). Also includes a python +library (``odplib/preso.py``) for creating impress files + +Requires docutils, pygments, PIL + +Usually it is run like so + +rst2odp path/to/rstfile.rst output.odp + +Styling is supported with the ``--template-file`` switch, just pass it +an .otp file + +todo: +----- + +* Image scaling +* Support for background image per slide +* Support for no title +* Enumerated list +* Simple animations +* ??? Added: trunk/sandbox/rst2odp/bin/rst2odp =================================================================== --- trunk/sandbox/rst2odp/bin/rst2odp 2008-12-05 17:24:30 UTC (rev 5793) +++ trunk/sandbox/rst2odp/bin/rst2odp 2008-12-05 17:42:53 UTC (rev 5794) @@ -0,0 +1,614 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright 2008 Matt Harrison +# Licensed under Apache License, Version 2.0 (current) +import sys +import os + +import docutils +from docutils import io, writers, nodes +from docutils.readers import standalone +from docutils.core import Publisher, default_description, \ + default_usage +from docutils.parsers import rst + +import odplib.preso as preso + + +__version__ = "0.1" +__author__ = "matt harrison" +__email__ = "mat...@gm..." + + +S5_COLORS = dict( + black='#000000', + gray='#545454', + silver='#c0c0c0', + white='#ffffff', + maroon='#b03060', + red='#ff0000', + magenta='#ff00ff', + fuchsia='#ff00ff', + pink='#ff1493', + orange='#ffa500', + yellow='#ffff00', + lime='#32cd32', + green='#00ff00', + olive='#6b8e23', + teal='#008080', + cyan='#00ffff', + aqua='#00ffff', + blue='#0000ff', + navy='#000080', + purple='#a020f0' +) + +S5_SIZES = dict( + huge='66pt', + big='44pt', + normal='28pt', + small='22pt', + tiny='18pt' +) + +class SyntaxHighlightCodeBlock(rst.Directive): + required_arguments = 1 + optional_arguments = 0 + has_content = True + # + # See visit_literal_block for code that processes the node + # created here. + def run(self): + language = self.arguments[0] + code_block = nodes.literal_block(classes=["code-block", language], + language=language) + lines = self.content + content = '\n'.join(lines) + text_node = nodes.Text(content) + code_block.append(text_node) + # Mark this node for high-lighting so that visit_literal_block + # will be able to hight-light those produced here and + # *not* high-light regular literal blocks (:: in reST). + code_block['hilight'] = True + return [code_block] + +rst.directives.register_directive('code-block', SyntaxHighlightCodeBlock) + +class Writer(writers.Writer): + settings_spec = ( + 'ODP Specific Options', # option group title + None, # Description + ( # options (help string, list of options, dictions of OptionParser.add_option dicts) + ('Specify a template (.otp) to use for styling', + ['--template-file'], + {'action': 'store', + 'dest': 'template_file'}), + ) + ) + def __init__(self): + writers.Writer.__init__(self) + self.translator_class = ODPTranslator + + def translate(self): + self.visitor = self.translator_class(self.document) + self.document.walkabout(self.visitor) + self.parts['whole'] = self.visitor.get_whole() + self.output = self.parts['whole'] + self.parts['encoding'] = self.document.settings.output_encoding + self.parts['version'] = docutils.__version__ + +class ODPTranslator(nodes.GenericNodeVisitor): + def __init__(self, document): + nodes.GenericNodeVisitor.__init__(self, document) + self.settings = document.settings + self.preso = preso.Preso() + + self.in_node = {} # map of tagname to True if we are in/under this + self._reset() + + def _reset(self): + # state we keep track of + self.cur_slide = None + self.bullet_list = None + self.bullet_depth = 0 + self.footer = None + + def _init_slide(self, force=False): + if force or self.cur_slide is None: + self._reset() + self.cur_slide = self.preso.add_slide() + + def at(self, nodename): + """ + shortcut for at/under this node + """ + return self.in_node.get(nodename, False) + + def get_whole(self): + return self.preso.get_data(self.settings.template_file) + + def dispatch_visit(self, node): + # Easier just to throw nodes I'm in in a dict, than keeping + # state for each one + self.in_node[node.tagname] = True + nodes.GenericNodeVisitor.dispatch_visit(self, node) + + def dispatch_departure(self, node): + self.in_node[node.tagname] = False + nodes.GenericNodeVisitor.dispatch_departure(self, node) + + def default_visit(self, node): + print "NODE", node, node.tagname + raise NotImplementedError + + def default_departure(self, node): + print "NODE", node, node.tagname + raise NotImplementedError + + + def _dumb_visit(self, node): + pass + _dumb_depart = _dumb_visit + + + def visit_document(self, node): + print "DOC", node + + depart_document = _dumb_depart + + def visit_title(self, node): + self._init_slide() + if self.at('topic'): + return + else: + self.cur_slide.add_title_frame() + + def depart_title(self, node): + if self.at('topic'): + return + else: + # not in a title element anymore + self.cur_slide.cur_element = None + + def visit_Text(self, node): + if self.bullet_list and not self.at('handout'): # !!!need to deal w/ bullets in handout + self.bullet_list.write(node.astext()) + elif self.at('footer'): + self.footer.write(node.astext()) + elif self.at('comment'): + pass + elif self.at('topic'): + pass + elif self.at('literal_block'): + pass + elif self.at('reference'): + pass + else: + self.cur_slide.write(node.astext()) + depart_Text = _dumb_depart + + def visit_paragraph(self, node): + classes = node.attributes.get('classes', []) + if 'handout' in classes: + + self.in_node['handout'] = True + self.cur_slide.push_element() + if not self.cur_slide.notes_frame: + self.cur_slide.add_notes_frame() + else: + self.cur_slide.cur_element = self.cur_slide.notes_frame + self.cur_slide.add_node('text:line-break', {}) + self.cur_slide.pop_node() # close line-break + + if 'center' in classes: + attribs = {'fo:text-align':'center', + 'fo:margin-left':'1.2cm', + 'fo:margin-right':'-.9cm', + } + style = preso.ParagraphStyle(**attribs) + self.cur_slide.push_style(style) + + elif 'left' in classes: + pass # default + elif 'right' in classes: + attribs = {'fo:text-align':'end', + } + style = preso.ParagraphStyle(**attribs) + self.cur_slide.push_style(style) + # text styles + attribs = self._get_text_attribs(node) + if attribs: + style = preso.TextStyle(**attribs) + self.cur_slide.push_style(style) + if self.bullet_list: + pass + elif self.at('topic'): + return + elif self.at('block_quote'): + return # block quote adds paragraph style + elif not self.cur_slide.text_frames: + self.cur_slide.add_text_frame() + + def depart_paragraph(self, node): + classes = node.attributes.get('classes', []) + if 'center' in classes or 'right' in classes: + self.cur_slide.pop_node() + if 'handout' in classes: + self.in_node['handout'] = False + self.cur_slide.pop_element() + + if self._get_text_attribs(node): + # pop off text:span + self.cur_slide.pop_node() + self.cur_slide.pop_style() + + elif self.at('topic'): + return + elif self.at('block_quote'): + return # block quote adds paragraph style + else: + self.cur_slide.parent_of('text:p') + + def visit_bullet_list(self, node): + if self.at('topic'): + return + self.bullet_depth += 1 + if not self.bullet_list: + self.bullet_list = preso.OutlineList(self.cur_slide) + self.cur_slide.add_bullet_list(self.bullet_list) + else: + # indent one more + self.bullet_list.indent() + + def depart_bullet_list(self, node): + if self.at('topic'): + return + self.bullet_depth -= 1 + if self.bullet_depth == 0: + #self.cur_slide.add_bullet_list(self.bullet_list) + self.bullet_list = None + self.cur_slide.pop_element() + else: + self.bullet_list.dedent() + + def visit_list_item(self, node): + if self.at('topic'): + return + self.bullet_list.new_item() + + def depart_list_item(self, node): + if self.at('topic'): + return + + visit_decoration = _dumb_visit + depart_decoration = _dumb_depart + + def visit_footer(self, node): + self.footer = preso.Footer(self.cur_slide) + + def depart_footer(self, node): + self.preso.add_footer(self.footer) + self.footer = None + + visit_docinfo = _dumb_visit + depart_docinfo = _dumb_depart + + # bibliographic elements + def visit_author(self, node): + self.visit_attribution(node) + + def depart_author(self, node): + self.depart_attribution(node) + + def visit_date(self, node): + self.visit_attribution(node) + + def depart_date(self, node): + self.depart_attribution(node) + + def visit_comment(self, node): + pass + def depart_comment(self, node): + pass + + visit_topic = _dumb_visit + depart_topic = _dumb_depart + + def visit_reference(self, node): + """ + <draw:text-box> + <text:p text:style-name="P4"> + <text:a xlink:href="http://www.yahoo.com/">Yahoo corp</text:a> + </text:p> + </draw:text-box> + """ + if node.has_key('refid'): + return + elif self.at('topic'): + return + else: + # needs to be in a p + # need to hack a bit, since .write usually inserts text:p and text:span + if not self.cur_slide.cur_element._in_p(): + self.cur_slide.add_node('text:p', {}) + self.cur_slide.add_node('text:a', attrib={'xlink:href': '%s' % node['refuri'], + 'xlink:type': 'simple'}) + self.cur_slide.write(node.astext(), add_p_style=False, add_t_style=False) + + def depart_reference(self, node): + if node.has_key('refid'): + return + elif self.at('topic'): + return + else: + self.cur_slide.parent_of('text:a') + + def visit_container(self, node): + if not self.at('handout'): + self.in_node['handout'] = 'handout' in node.attributes.get('classes', []) + if self.at('handout'): + self.cur_slide.push_element() + if self.cur_slide.notes_frame is None: + self.cur_slide.add_notes_frame() + else: + self.cur_slide.cur_element = self.cur_slide.notes_frame + self.cur_slide.add_node('text:line-break', {}) + self.cur_slide.pop_node() # close line-break + + def depart_container(self, node): + if self.at('handout'): + self.cur_slide.pop_element() + self.in_node['handout'] = False + + visit_substitution_definition = _dumb_visit + depart_substitution_definition = _dumb_depart + + def visit_section(self, node): + self._init_slide(force=True) + + def depart_section(self, node): + self._reset() + + def visit_literal(self, node): + style = preso.TextStyle(**{ + 'fo:font-family':"Courier New", + 'style:font-family-generic':"swiss", + 'style:font-pitch':"fixed"}) + self.cur_slide.push_style(style) + + def depart_literal(self, node): + # pop off the text:span + self.cur_slide.pop_style() + self.cur_slide.pop_node() + + def visit_inline(self,node): + attribs = self._get_text_attribs(node) + if attribs: + style = preso.TextStyle(**attribs) + + self.cur_slide.push_style(style) + + def depart_inline(self, node): + # pop off the text:span + attribs = self._get_text_attribs(node) + if attribs: + self.cur_slide.pop_style() + self.cur_slide.pop_node() + + def visit_emphasis(self, node): + attribs = {'fo:font-style':'italic'} + style = preso.TextStyle(**attribs) + self.cur_slide.push_style(style) + + def depart_emphasis(self, node): + # pop off the text:span + self.cur_slide.pop_style() + self.cur_slide.pop_node() + + def visit_strong(self, node): + attribs = {'fo:font-weight':'bold'} + style = preso.TextStyle(**attribs) + self.cur_slide.push_style(style) + + def depart_strong(self, node): + # pop off the text:span + self.cur_slide.pop_style() + self.cur_slide.pop_node() + + def visit_block_quote(self, node): + attribs = {'fo:text-align':'start', + 'fo:margin-left':'1.2cm', + 'fo:margin-right':'-.9cm', + } + style = preso.ParagraphStyle(**attribs) + self.cur_slide.push_style(style) + + def depart_block_quote(self, node): + # pop off the text:p + self.cur_slide.pop_style() + self.cur_slide.pop_node() + + def visit_attribution(self, node): + #jump out of current paragraph + self.cur_slide.parent_of('text:p') + # right justify + attribs = {'fo:text-align':'end', + 'fo:margin-right':'.9cm' + } + style = preso.ParagraphStyle(**attribs) + self.cur_slide.push_style(style) + + # italics + style = preso.TextStyle(**{'fo:font-size':S5_SIZES['small'], + 'fo:font-style':'italic'}) + self.cur_slide.push_style(style) + + def depart_attribution(self, node): + # pop off the text:p and text:span + self.cur_slide.pop_style() + self.cur_slide.pop_node() + self.cur_slide.pop_style() + self.cur_slide.pop_node() + + def visit_line_block(self, node): + # align right + #jump out of current paragraph + self.cur_slide.parent_of('text:p') + # right justify + attribs = {'fo:text-align':'end', + 'fo:margin-right':'.9cm' + } + style = preso.ParagraphStyle(**attribs) + self.cur_slide.push_style(style) + attribs = self._get_text_attribs(node) + if attribs: + style = preso.TextStyle(**attribs) + self.cur_slide.push_style(style) + + def depart_line_block(self, node): + attribs = self._get_text_attribs(node) + if attribs: + self.cur_slide.pop_style() + self.cur_slide.pop_node() + # pop off text:p + self.cur_slide.pop_style() + self.cur_slide.pop_node() + + + def visit_line(self, node): + pass + + def depart_line(self, node): + + self.cur_slide.add_node('text:line-break', {}) + self.cur_slide.pop_node() + + @preso.cwd_decorator + def visit_image(self, node): + source = node.attributes['uri'] + p = preso.Picture(os.path.abspath(source)) + self.cur_slide.add_picture(p) + + def depart_image(self, node): + pass + + def visit_literal_block(self, node): + attributes = node.attributes + # left align + style = preso.ParagraphStyle(**{'fo:text-align':'start'}) + self.cur_slide.push_style(style) + # text styles + attribs = self._get_text_attribs(node) + if attribs: + style = preso.TextStyle(**attribs) + self.cur_slide.push_style(style) + + if attributes['classes'] and 'code-block' in attributes['classes']: + input = node.astext() + language = node.attributes['language'] + self.cur_slide.add_code(input, language) + else: + style = preso.TextStyle(**{ + 'fo:font-family':"Courier New", + 'style:font-family-generic':"swiss", + 'style:font-pitch':"fixed"}) + self.cur_slide.push_style(style) + input = node.astext() + chunks = input.split('\n') + for chunk in chunks: + + self.cur_slide.write(chunk) + self.cur_slide.add_node('text:line-break', {}) + self.cur_slide.pop_node() + + + def depart_literal_block(self, node): + # pop text-align + self.cur_slide.pop_style() + self.cur_slide.pop_node() + attributes = node.attributes + if attributes['classes'] and 'code-block' in attributes['classes']: + pass + else: + self.cur_slide.pop_style() + self.cur_slide.pop_node() + + def visit_footnote(self, node): + # shift to bottom of page? + pass + + def depart_footnote(self, node): + pass + + def visit_label(self, node): + # part of footnote + pass + + def depart_label(self, node): + pass + + def visit_enumerated_list(self, node): + # !!! fixme + self.visit_bullet_list(node) + + def depart_enumerated_list(self, node): + self.depart_bullet_list(node) + + + def _get_text_attribs(self, node): + classes = node.attributes.get('classes', []) + attribs = {} + for c in classes: + if c in S5_COLORS: + attribs['fo:color'] = S5_COLORS[c] + elif c in S5_SIZES: + attribs['fo:font-size'] = S5_SIZES[c] + return attribs + +class BinaryFileOutput(io.FileOutput): + """ + A version of docutils.io.FileOutput which writes to a binary file. + """ + def open(self): + try: + self.destination = open(self.destination_path, 'wb') + + except IOError, error: + if not self.handle_io_errors: + raise + print >>sys.stderr, '%s: %s' % (error.__class__.__name__, + error) + print >>sys.stderr, ('Unable to open destination file for writing ' + '(%r). Exiting.' % self.destination_path) + sys.exit(1) + self.opened = 1 + + +def main(prog_args): + argv = None + reader = standalone.Reader() + reader_name = 'standalone' + writer = Writer() + writer_name = 'pseudoxml' + parser = None + parser_name = 'restructuredtext' + settings = None + settings_spec = None + settings_overrides = None + config_section = None + enable_exit_status = 1 + usage = default_usage + publisher = Publisher(reader, parser, writer, settings, + destination_class=BinaryFileOutput) + publisher.set_components(reader_name, parser_name, writer_name) + description = ('Generates OpenDocument/OpenOffice/ODF slides from ' + 'standalone reStructuredText sources. ' + default_description) + + output = publisher.publish(argv, usage, description, + settings_spec, settings_overrides, + config_section=config_section, + enable_exit_status=enable_exit_status) + + +if __name__ == "__main__": + sys.exit(main(sys.argv) or 0) Property changes on: trunk/sandbox/rst2odp/bin/rst2odp ___________________________________________________________________ Name: svn:executable + * Added: trunk/sandbox/rst2odp/odplib/__init__.py =================================================================== Added: trunk/sandbox/rst2odp/odplib/data/auto_list.xml =================================================================== --- trunk/sandbox/rst2odp/odplib/data/auto_list.xml 2008-12-05 17:24:30 UTC (rev 5793) +++ trunk/sandbox/rst2odp/odplib/data/auto_list.xml 2008-12-05 17:42:53 UTC (rev 5794) @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8"?> +<office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:fo! rm:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" xmlns:field="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:field:1.0" office:version="1.1"> + <text:list-style style:name="L2"> + <text:list-level-style-bullet text:level="1" text:bullet-char="●"> + <style:list-level-properties text:space-before="0.3cm" text:min-label-width="0.9cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="2" text:bullet-char="–"> + <style:list-level-properties text:space-before="1.6cm" text:min-label-width="0.8cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="75%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="3" text:bullet-char="●"> + <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="4" text:bullet-char="–"> + <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="75%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="5" text:bullet-char="●"> + <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="6" text:bullet-char="●"> + <style:list-level-properties text:space-before="6.6cm" text:min-label-width="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="7" text:bullet-char="●"> + <style:list-level-properties text:space-before="7.8cm" text:min-label-width="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="8" text:bullet-char="●"> + <style:list-level-properties text:space-before="9cm" text:min-label-width="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="9" text:bullet-char="●"> + <style:list-level-properties text:space-before="10.2cm" text:min-label-width="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + </text:list-style> + </office:document-content> \ No newline at end of file Added: trunk/sandbox/rst2odp/odplib/data/settings.xml =================================================================== --- trunk/sandbox/rst2odp/odplib/data/settings.xml 2008-12-05 17:24:30 UTC (rev 5793) +++ trunk/sandbox/rst2odp/odplib/data/settings.xml 2008-12-05 17:42:53 UTC (rev 5794) @@ -0,0 +1,101 @@ +<?xml version="1.0" encoding="UTF-8"?> +<office:document-settings xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" office:version="1.1"> + <office:settings> + <config:config-item-set config:name="ooo:view-settings"> + <config:config-item config:name="VisibleAreaTop" config:type="int">-298</config:config-item> + <config:config-item config:name="VisibleAreaLeft" config:type="int">-484</config:config-item> + <config:config-item config:name="VisibleAreaWidth" config:type="int">28992</config:config-item> + <config:config-item config:name="VisibleAreaHeight" config:type="int">21651</config:config-item> + <config:config-item-map-indexed config:name="Views"> + <config:config-item-map-entry> + <config:config-item config:name="ViewId" config:type="string">view1</config:config-item> + <config:config-item config:name="GridIsVisible" config:type="boolean">false</config:config-item> + <config:config-item config:name="GridIsFront" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsSnapToGrid" config:type="boolean">true</config:config-item> + <config:config-item config:name="IsSnapToPageMargins" config:type="boolean">true</config:config-item> + <config:config-item config:name="IsSnapToSnapLines" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsSnapToObjectFrame" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsSnapToObjectPoints" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsPlusHandlesAlwaysVisible" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsFrameDragSingles" config:type="boolean">true</config:config-item> + <config:config-item config:name="EliminatePolyPointLimitAngle" config:type="int">1500</config:config-item> + <config:config-item config:name="IsEliminatePolyPoints" config:type="boolean">false</config:config-item> + <config:config-item config:name="VisibleLayers" config:type="base64Binary">//////////////////////////////////////////8=</config:config-item> + <config:config-item config:name="PrintableLayers" config:type="base64Binary">//////////////////////////////////////////8=</config:config-item> + <config:config-item config:name="LockedLayers" config:type="base64Binary"/> + <config:config-item config:name="NoAttribs" config:type="boolean">false</config:config-item> + <config:config-item config:name="NoColors" config:type="boolean">true</config:config-item> + <config:config-item config:name="RulerIsVisible" config:type="boolean">false</config:config-item> + <config:config-item config:name="PageKind" config:type="short">0</config:config-item> + <config:config-item config:name="SelectedPage" config:type="short">2</config:config-item> + <config:config-item config:name="IsLayerMode" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsBigHandles" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsDoubleClickTextEdit" config:type="boolean">true</config:config-item> + <config:config-item config:name="IsClickChangeRotation" config:type="boolean">false</config:config-item> + <config:config-item config:name="SlidesPerRow" config:type="short">4</config:config-item> + <config:config-item config:name="EditModeStandard" config:type="int">0</config:config-item> + <config:config-item config:name="EditModeNotes" config:type="int">0</config:config-item> + <config:config-item config:name="EditModeHandout" config:type="int">1</config:config-item> + <config:config-item config:name="VisibleAreaTop" config:type="int">-298</config:config-item> + <config:config-item config:name="VisibleAreaLeft" config:type="int">-484</config:config-item> + <config:config-item config:name="VisibleAreaWidth" config:type="int">28993</config:config-item> + <config:config-item config:name="VisibleAreaHeight" config:type="int">21652</config:config-item> + <config:config-item config:name="GridCoarseWidth" config:type="int">1270</config:config-item> + <config:config-item config:name="GridCoarseHeight" config:type="int">1270</config:config-item> + <config:config-item config:name="GridFineWidth" config:type="int">635</config:config-item> + <config:config-item config:name="GridFineHeight" config:type="int">635</config:config-item> + <config:config-item config:name="GridSnapWidthXNumerator" config:type="int">635</config:config-item> + <config:config-item config:name="GridSnapWidthXDenominator" config:type="int">1</config:config-item> + <config:config-item config:name="GridSnapWidthYNumerator" config:type="int">635</config:config-item> + <config:config-item config:name="GridSnapWidthYDenominator" config:type="int">1</config:config-item> + <config:config-item config:name="IsAngleSnapEnabled" config:type="boolean">false</config:config-item> + <config:config-item config:name="SnapAngle" config:type="int">1500</config:config-item> + <config:config-item config:name="ZoomOnPage" config:type="boolean">true</config:config-item> + </config:config-item-map-entry> + </config:config-item-map-indexed> + </config:config-item-set> + <config:config-item-set config:name="ooo:configuration-settings"> + <config:config-item config:name="ApplyUserData" config:type="boolean">true</config:config-item> + <config:config-item config:name="BitmapTableURL" config:type="string">$(user)/config/standard.sob</config:config-item> + <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item> + <config:config-item config:name="ColorTableURL" config:type="string">$(user)/config/standard.soc</config:config-item> + <config:config-item config:name="DashTableURL" config:type="string">$(user)/config/standard.sod</config:config-item> + <config:config-item config:name="DefaultTabStop" config:type="int">1270</config:config-item> + <config:config-item-map-indexed config:name="ForbiddenCharacters"> + <config:config-item-map-entry> + <config:config-item config:name="Language" config:type="string">en</config:config-item> + <config:config-item config:name="Country" config:type="string">US</config:config-item> + <config:config-item config:name="Variant" config:type="string"/> + <config:config-item config:name="BeginLine" config:type="string"/> + <config:config-item config:name="EndLine" config:type="string"/> + </config:config-item-map-entry> + </config:config-item-map-indexed> + <config:config-item config:name="GradientTableURL" config:type="string">$(user)/config/standard.sog</config:config-item> + <config:config-item config:name="HatchTableURL" config:type="string">$(user)/config/standard.soh</config:config-item> + <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsPrintBooklet" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsPrintBookletBack" config:type="boolean">true</config:config-item> + <config:config-item config:name="IsPrintBookletFront" config:type="boolean">true</config:config-item> + <config:config-item config:name="IsPrintDate" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsPrintDrawing" config:type="boolean">true</config:config-item> + <config:config-item config:name="IsPrintFitPage" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsPrintHandout" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsPrintHiddenPages" config:type="boolean">true</config:config-item> + <config:config-item config:name="IsPrintNotes" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsPrintOutline" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsPrintPageName" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsPrintTilePage" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsPrintTime" config:type="boolean">false</config:config-item> + <config:config-item config:name="LineEndTableURL" config:type="string">$(user)/config/standard.soe</config:config-item> + <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item> + <config:config-item config:name="PageNumberFormat" config:type="int">4</config:config-item> + <config:config-item config:name="ParagraphSummation" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintQuality" config:type="int">0</config:config-item> + <config:config-item config:name="PrinterIndependentLayout" config:type="string">low-resolution</config:config-item> + <config:config-item config:name="PrinterName" config:type="string"/> + <config:config-item config:name="PrinterSetup" config:type="base64Binary"/> + <config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item> + <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</config:config-item> +</config:config-item-set> +</office:settings> +</office:document-settings> \ No newline at end of file Added: trunk/sandbox/rst2odp/odplib/data/styles.xml =================================================================== --- trunk/sandbox/rst2odp/odplib/data/styles.xml 2008-12-05 17:24:30 UTC (rev 5793) +++ trunk/sandbox/rst2odp/odplib/data/styles.xml 2008-12-05 17:42:53 UTC (rev 5794) @@ -0,0 +1,693 @@ +<?xml version="1.0" encoding="UTF-8"?> +<office:document-styles xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:presentation="urn:oasis:names:tc:opendocument:xmlns:presentation:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:for! m:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:smil="urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" office:version="1.1"> + <office:styles> + <draw:marker draw:name="Arrow" svg:viewBox="0 0 20 30" svg:d="m10 0-10 30h20z"/> + <style:default-style style:family="graphic"> + <style:paragraph-properties style:text-autospace="ideograph-alpha" style:punctuation-wrap="simple" style:line-break="strict" style:writing-mode="lr-tb" style:font-independent-line-spacing="false"> + <style:tab-stops/> + </style:paragraph-properties> + <style:text-properties style:use-window-font-color="true" fo:font-family="'Times New Roman'" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="24pt" fo:language="en" fo:country="US" style:font-family-asian="'DejaVu Sans'" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="24pt" style:language-asian="zxx" style:country-asian="none" style:font-family-complex="'DejaVu Sans'" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="24pt" style:language-complex="zxx" style:country-complex="none"/> + </style:default-style> + <style:style style:name="standard" style:family="graphic"> + <style:graphic-properties draw:stroke="solid" svg:stroke-width="0cm" svg:stroke-color="#000000" draw:marker-start-width="0.3cm" draw:marker-start-center="false" draw:marker-end-width="0.3cm" draw:marker-end-center="false" draw:fill="solid" draw:fill-color="#99ccff" fo:padding-top="0.125cm" fo:padding-bottom="0.125cm" fo:padding-left="0.25cm" fo:padding-right="0.25cm" draw:shadow="hidden" draw:shadow-offset-x="0.3cm" draw:shadow-offset-y="0.3cm" draw:shadow-color="#808080"> + <text:list-style style:name="standard"> + <text:list-level-style-bullet text:level="1" text:bullet-char="●"> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="2" text:bullet-char="●"> + <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="3" text:bullet-char="●"> + <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="4" text:bullet-char="●"> + <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="5" text:bullet-char="●"> + <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="6" text:bullet-char="●"> + <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="7" text:bullet-char="●"> + <style:list-level-properties text:space-before="3.6cm" text:min-label-width="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="8" text:bullet-char="●"> + <style:list-level-properties text:space-before="4.2cm" text:min-label-width="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="9" text:bullet-char="●"> + <style:list-level-properties text:space-before="4.8cm" text:min-label-width="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="10" text:bullet-char="●"> + <style:list-level-properties text:space-before="5.4cm" text:min-label-width="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + </text:list-style> + </style:graphic-properties> + <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" fo:line-height="100%" text:enable-numbering="false" fo:text-indent="0cm"/> + <style:text-properties style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" fo:font-family="Arial" style:font-family-generic="roman" style:font-pitch="variable" fo:font-size="18pt" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:letter-kerning="true" style:font-family-asian="'DejaVu Sans'" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="18pt" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-family-complex="'DejaVu Sans'" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="18pt" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:font-relief="none"/> + </style:style> + <style:style style:name="objectwitharrow" style:family="graphic" style:parent-style-name="standard"> + <style:graphic-properties draw:stroke="solid" svg:stroke-width="0.15cm" svg:stroke-color="#000000" draw:marker-start="Arrow" draw:marker-start-width="0.7cm" draw:marker-start-center="true" draw:marker-end-width="0.3cm"/> + </style:style> + <style:style style:name="objectwithshadow" style:family="graphic" style:parent-style-name="standard"> + <style:graphic-properties draw:shadow="visible" draw:shadow-offset-x="0.3cm" draw:shadow-offset-y="0.3cm" draw:shadow-color="#808080"/> + </style:style> + <style:style style:name="objectwithoutfill" style:family="graphic" style:parent-style-name="standard"> + <style:graphic-properties draw:fill="none"/> + </style:style> + <style:style style:name="text" style:family="graphic" style:parent-style-name="standard"> + <style:graphic-properties draw:stroke="none" draw:fill="none"/> + </style:style> + <style:style style:name="textbody" style:family="graphic" style:parent-style-name="standard"> + <style:graphic-properties draw:stroke="none" draw:fill="none"/> + <style:text-properties fo:font-size="16pt"/> + </style:style> + <style:style style:name="textbodyjustfied" style:family="graphic" style:parent-style-name="standard"> + <style:graphic-properties draw:stroke="none" draw:fill="none"/> + <style:paragraph-properties fo:text-align="justify"/> + </style:style> + <style:style style:name="textbodyindent" style:family="graphic" style:parent-style-name="standard"> + <style:graphic-properties draw:stroke="none" draw:fill="none"> + <text:list-style style:name="textbodyindent"> + <text:list-level-style-bullet text:level="1" text:bullet-char="●"> + <style:list-level-properties text:space-before="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="2" text:bullet-char="●"> + <style:list-level-properties text:space-before="0.6cm" text:min-label-width="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="3" text:bullet-char="●"> + <style:list-level-properties text:space-before="1.2cm" text:min-label-width="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="4" text:bullet-char="●"> + <style:list-level-properties text:space-before="1.8cm" text:min-label-width="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="5" text:bullet-char="●"> + <style:list-level-properties text:space-before="2.4cm" text:min-label-width="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + <text:list-level-style-bullet text:level="6" text:bullet-char="●"> + <style:list-level-properties text:space-before="3cm" text:min-label-width="0.6cm"/> + <style:text-properties fo:font-family="StarSymbol" style:use-window-font-color="true" fo:font-size="45%"/> + </text:list-level-style-bullet> + <text:list-level-sty... [truncated message content] |