git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9995 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			308 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			308 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.
 | |
| # 
 | |
| ##############################################################################
 | |
| 
 | |
| from string import join, split, find
 | |
| from cgi import escape
 | |
| import re, sys, ST
 | |
| 
 | |
| class HTMLClass:
 | |
| 
 | |
|     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',
 | |
|         'StructuredTextInnerLink':'innerLink',
 | |
|         'StructuredTextNamedLink':'namedLink',
 | |
|         'StructuredTextUnderline':'underline',
 | |
|         'StructuredTextTable':'table',
 | |
|         '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):
 | |
|         output(doc.getNodeValue())
 | |
| 
 | |
|     def document(self, doc, level, output):
 | |
|         output('<html>\n')
 | |
|         children=doc.getChildNodes()
 | |
|         if (children and
 | |
|              children[0].getNodeName() == 'StructuredTextSection'):
 | |
|             output('<head>\n<title>%s</title>\n</head>\n' %
 | |
|                      children[0].getChildNodes()[0].getNodeValue())
 | |
|         output('<body>\n')
 | |
|         for c in children:
 | |
|             getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|         output('</body>\n')
 | |
|         output('</html>\n')
 | |
| 
 | |
|     def section(self, doc, level, output):
 | |
|         children=doc.getChildNodes()
 | |
|         for c in children:
 | |
|             getattr(self, self.element_types[c.getNodeName()])(c, level+1, output)
 | |
|         
 | |
|     def sectionTitle(self, doc, level, output):
 | |
|         output('<h%d>' % (level))
 | |
|         for c in doc.getChildNodes():
 | |
|             getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|         output('</h%d>\n' % (level))
 | |
| 
 | |
|     def description(self, doc, level, output):
 | |
|         p=doc.getPreviousSibling()
 | |
|         if p is None or  p.getNodeName() is not doc.getNodeName():            
 | |
|             output('<dl>\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('</dl>\n')
 | |
|         
 | |
|     def descriptionTitle(self, doc, level, output):
 | |
|         output('<dt>')
 | |
|         for c in doc.getChildNodes():
 | |
|             getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|         output('</dt>\n')
 | |
|         
 | |
|     def descriptionBody(self, doc, level, output):
 | |
|         output('<dd>')
 | |
|         for c in doc.getChildNodes():
 | |
|             getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|         output('</dd>\n')
 | |
| 
 | |
|     def bullet(self, doc, level, output):
 | |
|         p=doc.getPreviousSibling()
 | |
|         if p is None or p.getNodeName() is not doc.getNodeName():
 | |
|             output('\n<ul>\n')
 | |
|         output('<li>')
 | |
|         for c in doc.getChildNodes():
 | |
|             getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|         n=doc.getNextSibling()
 | |
|         output('</li>\n')
 | |
|         if n is None or n.getNodeName() is not doc.getNodeName():            
 | |
|             output('\n</ul>\n')
 | |
| 
 | |
|     def numbered(self, doc, level, output):
 | |
|         p=doc.getPreviousSibling()
 | |
|         if p is None or p.getNodeName() is not doc.getNodeName():            
 | |
|             output('\n<ol>\n')
 | |
|         output('<li>')
 | |
|         for c in doc.getChildNodes():
 | |
|             getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|         n=doc.getNextSibling()
 | |
|         output('</li>\n')
 | |
|         if n is None or n.getNodeName() is not doc.getNodeName():
 | |
|             output('\n</ol>\n')
 | |
| 
 | |
|     def example(self, doc, level, output):
 | |
|         i=0
 | |
|         for c in doc.getChildNodes():
 | |
|             if i==0:
 | |
|                 output('\n<pre>\n')
 | |
|                 output(escape(c.getNodeValue()))
 | |
|                 output('\n</pre>\n')
 | |
|             else:
 | |
|                 getattr(self, self.element_types[c.getNodeName()])(
 | |
|                     c, level, output)
 | |
| 
 | |
|     def paragraph(self, doc, level, output):
 | |
|         i=0
 | |
|         output('<p>')
 | |
|         for c in doc.getChildNodes():
 | |
|             if c.getNodeName() in ['StructuredTextParagraph']:
 | |
|                 getattr(self, self.element_types[c.getNodeName()])(
 | |
|                     c, level, output)
 | |
|             else:
 | |
|                 getattr(self, self.element_types[c.getNodeName()])(
 | |
|                     c, level, output)
 | |
|         output('</p>\n')
 | |
| 
 | |
|     def link(self, doc, level, output):
 | |
|         output('<a href="%s">' % doc.href)
 | |
|         for c in doc.getChildNodes():
 | |
|             getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|         output('</a>')
 | |
| 
 | |
|     def emphasis(self, doc, level, output):
 | |
|         output('<em>')
 | |
|         for c in doc.getChildNodes():
 | |
|             getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|         output('</em>')
 | |
| 
 | |
|     def literal(self, doc, level, output):
 | |
|         output('<code>')
 | |
|         for c in doc.getChildNodes():
 | |
|             output(escape(c.getNodeValue()))
 | |
|         output('</code>')
 | |
| 
 | |
|     def strong(self, doc, level, output):
 | |
|         output('<strong>')
 | |
|         for c in doc.getChildNodes():
 | |
|             getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|         output('</strong>')
 | |
|      
 | |
|     def underline(self, doc, level, output):
 | |
|         output("<u>")
 | |
|         for c in doc.getChildNodes():
 | |
|             getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|         output("</u>")
 | |
|           
 | |
|     def innerLink(self, doc, level, output):
 | |
|         output('<a href="#');
 | |
|         for c in doc.getChildNodes():
 | |
|             getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|         output('">[')
 | |
|         for c in doc.getChildNodes():
 | |
|             getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|         output(']</a>')
 | |
|     
 | |
|     def namedLink(self, doc, level, output):
 | |
|         output('<a name="')
 | |
|         for c in doc.getChildNodes():
 | |
|             getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|         output('">[')
 | |
|         for c in doc.getChildNodes():
 | |
|             getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|         output(']</a>')
 | |
|     
 | |
|     def sgml(self,doc,level,output):
 | |
|         for c in doc.getChildNodes():
 | |
|             getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
| 
 | |
|     def xref(self, doc, level, output):
 | |
|         val = doc.getNodeValue()
 | |
|         output('<a href="#%s">[%s]</a>' % (val, val) )
 | |
|     
 | |
|     def table(self,doc,level,output):
 | |
|         """
 | |
|         A StructuredTextTable holds StructuredTextRow(s) which
 | |
|         holds StructuredTextColumn(s). A StructuredTextColumn
 | |
|         is a type of StructuredTextParagraph and thus holds
 | |
|         the actual data.
 | |
|         """
 | |
|         output("<table border=1 cellpadding=2>\n")
 | |
|         for row in doc.getRows()[0]:
 | |
|             output("<tr>\n")
 | |
|             for column in row.getColumns()[0]:
 | |
|                 if hasattr(column,"getAlign"):
 | |
|                     str = "<%s colspan=%s align=%s valign=%s>" % (column.getType(),
 | |
|                                                                   column.getSpan(),
 | |
|                                                                   column.getAlign(),
 | |
|                                                                   column.getValign())
 | |
|                 else:
 | |
|                     str = "<td colspan=%s>" % column.getSpan()
 | |
|                 output(str)
 | |
|                 for c in column.getChildNodes():
 | |
|                     getattr(self, self.element_types[c.getNodeName()])(c, level, output)
 | |
|                 if hasattr(column,"getType"):
 | |
|                     output("</"+column.getType()+">\n")
 | |
|                 else:
 | |
|                     output("</td>\n")
 | |
|             output("</tr>\n")
 | |
|         output("</table>\n")
 | |
|           
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 |