git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9995 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			333 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			333 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| ##############################################################################
 | |
| # 
 | |
| # Zope Public License (ZPL) Version 1.0
 | |
| # -------------------------------------
 | |
| # 
 | |
| # Copyright (c) Digital Creations.  All rights reserved.
 | |
| # 
 | |
| # This license has been certified as Open Source(tm).
 | |
| # 
 | |
| # Redistribution and use in source and binary forms, with or without
 | |
| # modification, are permitted provided that the following conditions are
 | |
| # met:
 | |
| # 
 | |
| # 1. Redistributions in source code must retain the above copyright
 | |
| #    notice, this list of conditions, and the following disclaimer.
 | |
| # 
 | |
| # 2. Redistributions in binary form must reproduce the above copyright
 | |
| #    notice, this list of conditions, and the following disclaimer in
 | |
| #    the documentation and/or other materials provided with the
 | |
| #    distribution.
 | |
| # 
 | |
| # 3. Digital Creations requests that attribution be given to Zope
 | |
| #    in any manner possible. Zope includes a "Powered by Zope"
 | |
| #    button that is installed by default. While it is not a license
 | |
| #    violation to remove this button, it is requested that the
 | |
| #    attribution remain. A significant investment has been put
 | |
| #    into Zope, and this effort will continue if the Zope community
 | |
| #    continues to grow. This is one way to assure that growth.
 | |
| # 
 | |
| # 4. All advertising materials and documentation mentioning
 | |
| #    features derived from or use of this software must display
 | |
| #    the following acknowledgement:
 | |
| # 
 | |
| #      "This product includes software developed by Digital Creations
 | |
| #      for use in the Z Object Publishing Environment
 | |
| #      (http://www.zope.org/)."
 | |
| # 
 | |
| #    In the event that the product being advertised includes an
 | |
| #    intact Zope distribution (with copyright and license included)
 | |
| #    then this clause is waived.
 | |
| # 
 | |
| # 5. Names associated with Zope or Digital Creations must not be used to
 | |
| #    endorse or promote products derived from this software without
 | |
| #    prior written permission from Digital Creations.
 | |
| # 
 | |
| # 6. Modified redistributions of any form whatsoever must retain
 | |
| #    the following acknowledgment:
 | |
| # 
 | |
| #      "This product includes software developed by Digital Creations
 | |
| #      for use in the Z Object Publishing Environment
 | |
| #      (http://www.zope.org/)."
 | |
| # 
 | |
| #    Intact (re-)distributions of any official Zope release do not
 | |
| #    require an external acknowledgement.
 | |
| # 
 | |
| # 7. Modifications are encouraged but must be packaged separately as
 | |
| #    patches to official Zope releases.  Distributions that do not
 | |
| #    clearly separate the patches from the original work must be clearly
 | |
| #    labeled as unofficial distributions.  Modifications which do not
 | |
| #    carry the name Zope may be packaged in any form, as long as they
 | |
| #    conform to all of the clauses above.
 | |
| # 
 | |
| # 
 | |
| # Disclaimer
 | |
| # 
 | |
| #   THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
 | |
| #   EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | |
| #   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 | |
| #   PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
 | |
| #   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | |
| #   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | |
| #   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 | |
| #   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 | |
| #   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 | |
| #   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 | |
| #   OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | |
| #   SUCH DAMAGE.
 | |
| # 
 | |
| # 
 | |
| # This software consists of contributions made by Digital Creations and
 | |
| # many individuals on behalf of Digital Creations.  Specific
 | |
| # attributions are listed in the accompanying credits file.
 | |
| # 
 | |
| ##############################################################################
 | |
| 
 | |
| import string
 | |
| from string import join, split, find, lstrip
 | |
| 
 | |
| class DocBookClass:
 | |
| 
 | |
|    element_types={
 | |
|       '#text': '_text',
 | |
|       'StructuredTextDocument': 'document',
 | |
|       'StructuredTextParagraph': 'paragraph',
 | |
|       'StructuredTextExample': 'example',
 | |
|       'StructuredTextBullet': 'bullet',
 | |
|       'StructuredTextNumbered': 'numbered',
 | |
|       'StructuredTextDescription': 'description',
 | |
|       'StructuredTextDescriptionTitle': 'descriptionTitle',
 | |
|       'StructuredTextDescriptionBody': 'descriptionBody',
 | |
|       'StructuredTextSection': 'section',
 | |
|       'StructuredTextSectionTitle': 'sectionTitle',
 | |
|       'StructuredTextLiteral': 'literal',
 | |
|       'StructuredTextEmphasis': 'emphasis',
 | |
|       'StructuredTextStrong': 'strong',
 | |
|       'StructuredTextLink': 'link',
 | |
|       'StructuredTextXref': 'xref',
 | |
|       'StructuredTextSGML': 'sgml',
 | |
|       }      
 | |
| 
 | |
|    def dispatch(self, doc, level, output):
 | |
|       getattr(self, self.element_types[doc.getNodeName()])(doc, level, output)
 | |
|       
 | |
|    def __call__(self, doc, level=1):
 | |
|       r=[]
 | |
|       self.dispatch(doc, level-1, r.append)
 | |
|       return join(r,'')
 | |
| 
 | |
|    def _text(self, doc, level, output):
 | |
|       if doc.getNodeName() == 'StructuredTextLiteral':
 | |
|          output(doc.getNodeValue())
 | |
|       else:
 | |
|          output(lstrip(doc.getNodeValue()))         
 | |
| 
 | |
|    def document(self, doc, level, output):
 | |
|       output('<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V4.1//EN">\n')
 | |
|       output('<book>\n')
 | |
|       children=doc.getChildNodes()
 | |
|       if (children and
 | |
|           children[0].getNodeName() == 'StructuredTextSection'):
 | |
|          output('<title>%s</title>' % children[0].getChildNodes()[0].getNodeValue())
 | |
|       for c in children:
 | |
|          getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|       output('</book>\n')
 | |
| 
 | |
|    def section(self, doc, level, output):
 | |
|       output('\n<section>\n')
 | |
|       children=doc.getChildNodes()
 | |
|       for c in children:
 | |
|          getattr(self, self.element_types[c.getNodeName()])(c, level+1, output)
 | |
|       output('\n</section>\n')
 | |
|       
 | |
|    def sectionTitle(self, doc, level, output):
 | |
|       output('<title>')
 | |
|       for c in doc.getChildNodes():
 | |
|          try:
 | |
|             getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|          except:
 | |
|             print "failed", c.getNodeName(), c
 | |
|       output('</title>\n')
 | |
| 
 | |
|    def description(self, doc, level, output):
 | |
|       p=doc.getPreviousSibling()
 | |
|       if p is None or  p.getNodeName() is not doc.getNodeName():         
 | |
|          output('<variablelist>\n')
 | |
|       for c in doc.getChildNodes():
 | |
|          getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|       n=doc.getNextSibling()
 | |
|       if n is None or n.getNodeName() is not doc.getNodeName():         
 | |
|          output('</variablelist>\n')
 | |
|       
 | |
|    def descriptionTitle(self, doc, level, output):
 | |
|       output('<varlistentry><term>\n')
 | |
|       for c in doc.getChildNodes():
 | |
|          getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|       output('</term>\n')
 | |
|       
 | |
|    def descriptionBody(self, doc, level, output):
 | |
|       output('<listitem><para>\n')
 | |
|       for c in doc.getChildNodes():
 | |
|          getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|       output('</para></listitem>\n')
 | |
|       output('</varlistentry>\n')
 | |
| 
 | |
|    def bullet(self, doc, level, output):
 | |
|       p=doc.getPreviousSibling()
 | |
|       if p is None or p.getNodeName() is not doc.getNodeName():         
 | |
|          output('<itemizedlist>\n')
 | |
|       output('<listitem><para>\n')
 | |
| 
 | |
|       for c in doc.getChildNodes():
 | |
|          getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|       n=doc.getNextSibling()
 | |
|       output('</para></listitem>\n')
 | |
|       if n is None or n.getNodeName() is not doc.getNodeName():         
 | |
|          output('</itemizedlist>\n')
 | |
| 
 | |
|    def numbered(self, doc, level, output):
 | |
|       p=doc.getPreviousSibling()
 | |
|       if p is None or p.getNodeName() is not doc.getNodeName():         
 | |
|          output('<orderedlist>\n')
 | |
|       output('<listitem><para>\n')
 | |
|       for c in doc.getChildNodes():
 | |
|          getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|       n=doc.getNextSibling()
 | |
|       output('</para></listitem>\n')
 | |
|       if n is None or n.getNodeName() is not doc.getNodeName():         
 | |
|          output('</orderedlist>\n')
 | |
| 
 | |
|    def example(self, doc, level, output):
 | |
|       i=0
 | |
|       for c in doc.getChildNodes():
 | |
|          if i==0:
 | |
|             output('<programlisting>\n<![CDATA[\n')
 | |
|             ##
 | |
|             ## eek.  A ']]>' in your body will break this...
 | |
|             ##
 | |
|             output(prestrip(c.getNodeValue()))
 | |
|             output('\n]]></programlisting>\n')
 | |
|          else:
 | |
|             getattr(self, self.element_types[c.getNodeName()])(
 | |
|                c, level, output)
 | |
| 
 | |
|    def paragraph(self, doc, level, output):
 | |
|       output('<para>\n\n')      
 | |
|       for c in doc.getChildNodes():
 | |
|          getattr(self, self.element_types[c.getNodeName()])(
 | |
|             c, level, output)
 | |
|       output('</para>\n\n')
 | |
|             
 | |
|    def link(self, doc, level, output):
 | |
|       output('<ulink url="%s">' % doc.href)
 | |
|       for c in doc.getChildNodes():
 | |
|          getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|       output('</ulink>')
 | |
| 
 | |
|    def emphasis(self, doc, level, output):
 | |
|       output('<emphasis>')
 | |
|       for c in doc.getChildNodes():
 | |
|          getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|       output('</emphasis> ')
 | |
| 
 | |
|    def literal(self, doc, level, output):
 | |
|       output('<literal>')
 | |
|       for c in doc.getChildNodes():
 | |
|          output(c.getNodeValue())
 | |
|       output('</literal>')
 | |
| 
 | |
|    def strong(self, doc, level, output):
 | |
|       output('<emphasis>')
 | |
|       for c in doc.getChildNodes():
 | |
|          getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|       output('</emphasis>')
 | |
| 
 | |
|    def xref(self, doc, level, output):
 | |
|       output('<xref linkend="%s"/>' % doc.getNodeValue())
 | |
| 
 | |
|    def sgml(self, doc, level, output):
 | |
|       output(doc.getNodeValue())
 | |
| 
 | |
| 
 | |
| def prestrip(v):
 | |
|    v=string.replace(v, '\r\n', '\n')
 | |
|    v=string.replace(v, '\r', '\n')
 | |
|    v=string.replace(v, '\t', '        ')
 | |
|    lines=string.split(v, '\n')
 | |
|    indent=len(lines[0])
 | |
|    for line in lines:
 | |
|       if not len(line): continue
 | |
|       i=len(line)-len(string.lstrip(line))
 | |
|       if i < indent:
 | |
|          indent=i
 | |
|    nlines=[]
 | |
|    for line in lines:
 | |
|       nlines.append(line[indent:])
 | |
|    return string.join(nlines, '\n')
 | |
| 
 | |
| 
 | |
| class DocBookChapter(DocBookClass):
 | |
| 
 | |
|    def document(self, doc, level, output):
 | |
|       output('<chapter>\n')
 | |
|       children=doc.getChildNodes()
 | |
|       if (children and
 | |
|           children[0].getNodeName() == 'StructuredTextSection'):
 | |
|          output('<title>%s</title>' % children[0].getChildNodes()[0].getNodeValue())
 | |
|       for c in children[0].getChildNodes()[1:]:
 | |
|          getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|       output('</chapter>\n')
 | |
| 
 | |
| ets = DocBookClass.element_types
 | |
| ets.update({'StructuredTextImage': 'image'})      
 | |
| 
 | |
| class DocBookChapterWithFigures(DocBookChapter):
 | |
| 
 | |
|     element_types = ets
 | |
| 
 | |
|     def image(self, doc, level, output):
 | |
|        if hasattr(doc, 'key'):
 | |
|           output('<figure id="%s"><title>%s</title>\n' % (doc.key, doc.getNodeValue()) )
 | |
|        else:
 | |
|           output('<figure><title>%s</title>\n' % doc.getNodeValue())
 | |
| ##        for c in doc.getChildNodes():
 | |
| ##            getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|        output('<graphic fileref="%s"></graphic>\n</figure>\n' % doc.href)    
 | |
| 
 | |
| class DocBookArticle(DocBookClass):
 | |
| 
 | |
|    def document(self, doc, level, output):
 | |
|       output('<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.1//EN">\n')
 | |
|       output('<article>\n')
 | |
|       children=doc.getChildNodes()
 | |
|       if (children and
 | |
|           children[0].getNodeName() == 'StructuredTextSection'):
 | |
|          output('<articleinfo>\n<title>%s</title>\n</articleinfo>\n' %
 | |
|                 children[0].getChildNodes()[0].getNodeValue())
 | |
|       for c in children:
 | |
|          getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|       output('</article>\n')
 | |
| 
 | |
| 
 | |
| class DocBookBook:
 | |
| 
 | |
|    def __init__(self, title=''):
 | |
|       self.title = title
 | |
|       self.chapters = []
 | |
| 
 | |
|    def addChapter(self, chapter):
 | |
|       self.chapters.append(chapter)
 | |
| 
 | |
|    def read(self):
 | |
|       out = '<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V4.1//EN">\n<book>\n'
 | |
|       out = out + '<title>%s</title>\n' % self.title
 | |
|       for chapter in self.chapters:
 | |
|          out = out + chapter + '\n</book>\n'
 | |
| 
 | |
|       return out
 | |
| 
 | |
|    def __str__(self):
 | |
|       return self.read()
 | |
|          
 | |
| 
 |