mirror of
https://github.com/wxWidgets/wxWidgets.git
synced 2026-08-20 22:06:25 +08:00
Merged wxPython 2.4.x to the 2.5 branch (Finally!!!)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@19793 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -1,2 +1,3 @@
|
||||
.DS_Store
|
||||
build
|
||||
dist
|
||||
|
||||
@@ -74,7 +74,7 @@ class DoodleWindow(wxWindow):
|
||||
dc.SetBackground(wxBrush(self.GetBackgroundColour()))
|
||||
dc.Clear()
|
||||
self.DrawLines(dc)
|
||||
self.reInitBuffer = false
|
||||
self.reInitBuffer = False
|
||||
|
||||
|
||||
def SetColour(self, colour):
|
||||
@@ -125,14 +125,14 @@ class DoodleWindow(wxWindow):
|
||||
def OnCheckMenuColours(self, event):
|
||||
text = self.menuColours[event.GetId()]
|
||||
if text == self.colour:
|
||||
event.Check(true)
|
||||
event.Check(True)
|
||||
else:
|
||||
event.Check(false)
|
||||
event.Check(False)
|
||||
def OnCheckMenuThickness(self, event):
|
||||
if event.GetId() == self.thickness:
|
||||
event.Check(true)
|
||||
event.Check(True)
|
||||
else:
|
||||
event.Check(false)
|
||||
event.Check(False)
|
||||
|
||||
|
||||
def OnLeftDown(self, event):
|
||||
@@ -180,7 +180,7 @@ class DoodleWindow(wxWindow):
|
||||
Called when the window is resized. We set a flag so the idle
|
||||
handler will resize the buffer.
|
||||
"""
|
||||
self.reInitBuffer = true
|
||||
self.reInitBuffer = True
|
||||
|
||||
|
||||
def OnIdle(self, event):
|
||||
@@ -192,7 +192,7 @@ class DoodleWindow(wxWindow):
|
||||
"""
|
||||
if self.reInitBuffer:
|
||||
self.InitBuffer()
|
||||
self.Refresh(FALSE)
|
||||
self.Refresh(False)
|
||||
|
||||
|
||||
def OnPaint(self, event):
|
||||
@@ -251,6 +251,6 @@ class DoodleFrame(wxFrame):
|
||||
if __name__ == '__main__':
|
||||
app = wxPySimpleApp()
|
||||
frame = DoodleFrame(None)
|
||||
frame.Show(true)
|
||||
frame.Show(True)
|
||||
app.MainLoop()
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ class DoodleFrame(wxFrame):
|
||||
|
||||
# Tell the frame that it should layout itself in response to
|
||||
# size events.
|
||||
self.SetAutoLayout(true)
|
||||
self.SetAutoLayout(True)
|
||||
self.SetSizer(box)
|
||||
|
||||
|
||||
@@ -213,7 +213,7 @@ class ControlPanel(wxPanel):
|
||||
box.Add(tGrid, 0, wxALL, spacing)
|
||||
box.Add(ci, 0, wxEXPAND|wxALL, spacing)
|
||||
self.SetSizer(box)
|
||||
self.SetAutoLayout(true)
|
||||
self.SetAutoLayout(True)
|
||||
|
||||
# Resize this window so it is just large enough for the
|
||||
# minimum requirements of the sizer.
|
||||
@@ -348,7 +348,7 @@ instructions: </p>
|
||||
lc.height.AsIs()
|
||||
button.SetConstraints(lc)
|
||||
|
||||
self.SetAutoLayout(true)
|
||||
self.SetAutoLayout(True)
|
||||
self.Layout()
|
||||
self.CentreOnParent(wxBOTH)
|
||||
|
||||
@@ -358,9 +358,9 @@ instructions: </p>
|
||||
class DoodleApp(wxApp):
|
||||
def OnInit(self):
|
||||
frame = DoodleFrame(None)
|
||||
frame.Show(true)
|
||||
frame.Show(True)
|
||||
self.SetTopWindow(frame)
|
||||
return true
|
||||
return True
|
||||
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
|
||||
@@ -12,8 +12,6 @@ from wxPython.wx import *
|
||||
from StatusBar import *
|
||||
from FrogEditor import FrogEditor
|
||||
|
||||
TRUE = 1
|
||||
FALSE = 0
|
||||
|
||||
ABOUT_TEXT = """FrogEdit : Copyright 2001 Adam Feuer and Steve Howell
|
||||
wxEditor component : Copyright 1999 - 2001 Dirk Holtwic, Robin Dunn, Adam Feuer, Steve Howell
|
||||
@@ -95,7 +93,7 @@ class FrogEditFrame(wxFrame):
|
||||
|
||||
def SetUpSplitter(self, splitter, win, log):
|
||||
splitter.SplitHorizontally(win, log)
|
||||
splitter.SetSashPosition(360, true)
|
||||
splitter.SetSashPosition(360, True)
|
||||
splitter.SetMinimumPaneSize(40)
|
||||
|
||||
def MakeToolbar(self, win):
|
||||
@@ -109,7 +107,7 @@ class FrogEditFrame(wxFrame):
|
||||
borderWidth = 5
|
||||
mainBox.Add(self.edl, 1, wxALL|wxGROW, borderWidth)
|
||||
win.SetSizer(mainBox)
|
||||
win.SetAutoLayout(true)
|
||||
win.SetAutoLayout(True)
|
||||
|
||||
##-------------- Init Menus
|
||||
|
||||
@@ -180,9 +178,9 @@ class FrogEditFrame(wxFrame):
|
||||
result = dialog.ShowModal()
|
||||
dialog.Destroy()
|
||||
if result == wxID_OK:
|
||||
return TRUE
|
||||
return True
|
||||
else:
|
||||
return FALSE
|
||||
return False
|
||||
|
||||
def SelectFileDialog(self, defaultDir=None, defaultFile=None, wildCard=None):
|
||||
if defaultDir == None:
|
||||
@@ -247,9 +245,9 @@ class FrogEditFrame(wxFrame):
|
||||
f.close()
|
||||
self.edl.UnTouchBuffer()
|
||||
self.sb.setFileName(fileName)
|
||||
return TRUE
|
||||
return True
|
||||
except:
|
||||
return FALSE
|
||||
return False
|
||||
|
||||
def OpenFile(self, fileName):
|
||||
try:
|
||||
@@ -262,9 +260,9 @@ class FrogEditFrame(wxFrame):
|
||||
self.edl.SetText(contents)
|
||||
self.fileName = fileName
|
||||
self.sb.setFileName(fileName)
|
||||
return TRUE
|
||||
return True
|
||||
except:
|
||||
return FALSE
|
||||
return False
|
||||
|
||||
|
||||
|
||||
@@ -288,7 +286,7 @@ class FrogEditFrame(wxFrame):
|
||||
return
|
||||
fileName = self.SelectFileDialog(self.GetCurrentDir())
|
||||
if fileName is not None:
|
||||
if self.OpenFile(fileName) is FALSE:
|
||||
if self.OpenFile(fileName) is False:
|
||||
self.OpenFileError(fileName)
|
||||
self.edl.SetFocus()
|
||||
|
||||
@@ -296,7 +294,7 @@ class FrogEditFrame(wxFrame):
|
||||
if self.fileName is None:
|
||||
return self.OnSaveFileAs(event)
|
||||
wxLogMessage("Saving %s..." % self.fileName)
|
||||
if self.SaveFile(self.fileName) is not TRUE:
|
||||
if self.SaveFile(self.fileName) is not True:
|
||||
self.SaveFileError(self.fileName)
|
||||
self.edl.SetFocus()
|
||||
|
||||
@@ -305,7 +303,7 @@ class FrogEditFrame(wxFrame):
|
||||
if fileName is not None:
|
||||
self.fileName = fileName
|
||||
wxLogMessage("Saving %s..." % self.fileName)
|
||||
if self.SaveFile(self.fileName) is not TRUE:
|
||||
if self.SaveFile(self.fileName) is not True:
|
||||
self.SaveFileError(self.fileName)
|
||||
self.edl.SetFocus()
|
||||
|
||||
@@ -331,7 +329,7 @@ class FrogEditFrame(wxFrame):
|
||||
|
||||
def LoadInitialFile(self, fileName):
|
||||
if fileName is not None:
|
||||
if self.OpenFile(fileName) is FALSE:
|
||||
if self.OpenFile(fileName) is False:
|
||||
self.OpenFileError(fileName)
|
||||
|
||||
|
||||
@@ -354,7 +352,7 @@ class FrogEditLauncher:
|
||||
def Main(self):
|
||||
app = wxPySimpleApp()
|
||||
win = self.MakeAppFrame()
|
||||
win.Show(true)
|
||||
win.Show(True)
|
||||
win.LoadInitialFile(self.GetArgvFilename())
|
||||
app.MainLoop()
|
||||
|
||||
|
||||
+1734
-1734
File diff suppressed because it is too large
Load Diff
@@ -1,3 +0,0 @@
|
||||
|
||||
This sample is a simple StructuredText viewer/editor.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,332 +0,0 @@
|
||||
##############################################################################
|
||||
#
|
||||
# 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()
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,134 +0,0 @@
|
||||
##############################################################################
|
||||
#
|
||||
# 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 re, ST, STDOM
|
||||
from string import split, join, replace, expandtabs, strip, find
|
||||
|
||||
from DocumentClass import *
|
||||
|
||||
class StructuredTextImage(StructuredTextMarkup):
|
||||
"A simple embedded image"
|
||||
|
||||
class DocumentWithImages(DocumentClass):
|
||||
"""
|
||||
|
||||
"""
|
||||
|
||||
|
||||
text_types = [
|
||||
'doc_img',
|
||||
] + DocumentClass.text_types
|
||||
|
||||
|
||||
def doc_img(
|
||||
self, s,
|
||||
expr1=re.compile('\"([ _a-zA-Z0-9*.:/;,\-\n\~]+)\":img:([a-zA-Z0-9\-.:/;,\n\~]+)').search,
|
||||
expr2=re.compile('\"([ _a-zA-Z0-9*.:/;,\-\n\~]+)\":img:([a-zA-Z0-9\-.:/;,\n\~]+):([a-zA-Z0-9\-.:/;,\n\~]+)').search
|
||||
):
|
||||
|
||||
|
||||
r = expr2(s)
|
||||
if r:
|
||||
startt, endt = r.span(1)
|
||||
startk, endk = r.span(2)
|
||||
starth, endh = r.span(3)
|
||||
start, end = r.span()
|
||||
return (StructuredTextImage(s[startt:endt], href=s[starth:endh], key=s[startk:endk]),
|
||||
start, end)
|
||||
|
||||
|
||||
else:
|
||||
|
||||
r=expr1(s)
|
||||
|
||||
if r:
|
||||
startt, endt = r.span(1)
|
||||
starth, endh = r.span(2)
|
||||
start, end = r.span()
|
||||
return (StructuredTextImage(s[startt:endt], href=s[starth:endh]),
|
||||
start, end)
|
||||
|
||||
return None
|
||||
|
||||
@@ -1,307 +0,0 @@
|
||||
##############################################################################
|
||||
#
|
||||
# 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")
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,128 +0,0 @@
|
||||
##############################################################################
|
||||
#
|
||||
# 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
|
||||
import re, sys, ST
|
||||
import time
|
||||
|
||||
from HTMLClass import HTMLClass
|
||||
|
||||
ets = HTMLClass.element_types
|
||||
ets.update({'StructuredTextImage': 'image'})
|
||||
|
||||
class HTMLWithImages(HTMLClass):
|
||||
|
||||
element_types = ets
|
||||
|
||||
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 bgcolor="#FFFFFF">\n')
|
||||
for c in children:
|
||||
getattr(self, self.element_types[c.getNodeName()])(c, level, output)
|
||||
output('</body>\n')
|
||||
output('</html>\n')
|
||||
|
||||
def image(self, doc, level, output):
|
||||
if hasattr(doc, 'key'):
|
||||
output('<a name="%s"></a>\n' % doc.key)
|
||||
output('<img src="%s" alt="%s">\n' % (doc.href, doc.getNodeValue()))
|
||||
if doc.getNodeValue() and hasattr(doc, 'key'):
|
||||
output('<p><b>Figure %s</b> %s</p>\n' % (doc.key, doc.getNodeValue()))
|
||||
|
||||
def xref(self, doc, level, output):
|
||||
val = doc.getNodeValue()
|
||||
output('<a href="#%s">Figure %s</a>' % (val, val) )
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,283 +0,0 @@
|
||||
import re, STDOM
|
||||
from string import split, join, replace, expandtabs, strip, find
|
||||
|
||||
#####################################################################
|
||||
# Updated functions #
|
||||
#####################################################################
|
||||
|
||||
def indention(str,front = re.compile("^\s+").match):
|
||||
"""
|
||||
Convert all tabs to the appropriate number of spaces.
|
||||
Find the number of leading spaces. If none, return 0
|
||||
"""
|
||||
|
||||
if front(str):
|
||||
start,end = front(str).span()
|
||||
return end-start-1
|
||||
else:
|
||||
return 0 # no leading spaces
|
||||
|
||||
def insert(struct, top, level):
|
||||
"""
|
||||
find what will be the parant paragraph of
|
||||
a sentence and return that paragraph's
|
||||
sub-paragraphs. The new paragraph will be
|
||||
appended to those sub-paragraphs
|
||||
"""
|
||||
#print "struct", struct, top-1
|
||||
if not top-1 in range(len(struct)):
|
||||
if struct:
|
||||
return struct[len(struct)-1].getSubparagraphs()
|
||||
return struct
|
||||
run = struct[top-1]
|
||||
i = 0
|
||||
while i+1 < level:
|
||||
run = run.getSubparagraphs()[len(run.getSubparagraphs())-1]
|
||||
i = i + 1
|
||||
#print "parent for level ", level, " was => ", run.getColorizableTexts()
|
||||
return run.getSubparagraphs()
|
||||
|
||||
def display(struct):
|
||||
"""
|
||||
runs through the structure and prints out
|
||||
the paragraphs. If the insertion works
|
||||
correctly, display's results should mimic
|
||||
the orignal paragraphs.
|
||||
"""
|
||||
|
||||
if struct.getColorizableTexts():
|
||||
print join(struct.getColorizableTexts()),"\n"
|
||||
if struct.getSubparagraphs():
|
||||
for x in struct.getSubparagraphs():
|
||||
display(x)
|
||||
|
||||
def display2(struct):
|
||||
"""
|
||||
runs through the structure and prints out
|
||||
the paragraphs. If the insertion works
|
||||
correctly, display's results should mimic
|
||||
the orignal paragraphs.
|
||||
"""
|
||||
|
||||
if struct.getNodeValue():
|
||||
print struct.getNodeValue(),"\n"
|
||||
if struct.getSubparagraphs():
|
||||
for x in struct.getSubparagraphs():
|
||||
display(x)
|
||||
|
||||
def findlevel(levels,indent):
|
||||
"""
|
||||
remove all level information of levels
|
||||
with a greater level of indentation.
|
||||
Then return which level should insert this
|
||||
paragraph
|
||||
"""
|
||||
|
||||
keys = levels.keys()
|
||||
for key in keys:
|
||||
if levels[key] > indent:
|
||||
del(levels[key])
|
||||
keys = levels.keys()
|
||||
if not(keys):
|
||||
return 0
|
||||
else:
|
||||
for key in keys:
|
||||
if levels[key] == indent:
|
||||
return key
|
||||
highest = 0
|
||||
for key in keys:
|
||||
if key > highest:
|
||||
highest = key
|
||||
return highest-1
|
||||
|
||||
#####################################################################
|
||||
|
||||
# Golly, the capitalization of this function always makes me think it's a class
|
||||
def StructuredText(paragraphs, paragraph_delimiter=re.compile('\n\s*\n')):
|
||||
"""
|
||||
StructuredText accepts paragraphs, which is a list of
|
||||
lines to be parsed. StructuredText creates a structure
|
||||
which mimics the structure of the paragraphs.
|
||||
Structure => [paragraph,[sub-paragraphs]]
|
||||
"""
|
||||
|
||||
currentlevel = 0
|
||||
currentindent = 0
|
||||
levels = {0:0}
|
||||
level = 0 # which header are we under
|
||||
struct = [] # the structure to be returned
|
||||
run = struct
|
||||
|
||||
paragraphs = filter(
|
||||
strip,
|
||||
paragraph_delimiter.split(expandtabs('\n\n'+paragraphs+'\n\n'))
|
||||
)
|
||||
|
||||
if not paragraphs: return []
|
||||
|
||||
ind = [] # structure based on indention levels
|
||||
for paragraph in paragraphs:
|
||||
ind.append([indention(paragraph), paragraph])
|
||||
|
||||
currentindent = indention(paragraphs[0])
|
||||
levels[0] = currentindent
|
||||
|
||||
#############################################################
|
||||
# updated #
|
||||
#############################################################
|
||||
|
||||
for indent,paragraph in ind :
|
||||
if indent == 0:
|
||||
level = level + 1
|
||||
currentlevel = 0
|
||||
currentindent = 0
|
||||
levels = {0:0}
|
||||
struct.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
|
||||
elif indent > currentindent:
|
||||
currentlevel = currentlevel + 1
|
||||
currentindent = indent
|
||||
levels[currentlevel] = indent
|
||||
run = insert(struct,level,currentlevel)
|
||||
run.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
|
||||
elif indent < currentindent:
|
||||
result = findlevel(levels,indent)
|
||||
if result > 0:
|
||||
currentlevel = result
|
||||
currentindent = indent
|
||||
if not level:
|
||||
struct.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
|
||||
else:
|
||||
run = insert(struct,level,currentlevel)
|
||||
run.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
|
||||
else:
|
||||
if insert(struct,level,currentlevel):
|
||||
run = insert(struct,level,currentlevel)
|
||||
else:
|
||||
run = struct
|
||||
currentindet = indent
|
||||
run.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
|
||||
|
||||
return StructuredTextDocument(struct)
|
||||
|
||||
Basic = StructuredText
|
||||
|
||||
class StructuredTextParagraph(STDOM.Element):
|
||||
|
||||
indent=0
|
||||
|
||||
def __init__(self, src, subs=None, **kw):
|
||||
if subs is None: subs=[]
|
||||
self._src=src
|
||||
self._subs=list(subs)
|
||||
|
||||
self._attributes=kw.keys()
|
||||
for k, v in kw.items(): setattr(self, k, v)
|
||||
|
||||
def getChildren(self, type=type, lt=type([])):
|
||||
src=self._src
|
||||
if type(src) is not lt: src=[src]
|
||||
return src+self._subs
|
||||
|
||||
def getAttribute(self, name):
|
||||
return getattr(self, name, None)
|
||||
|
||||
def getAttributeNode(self, name):
|
||||
if hasattr(self, name):
|
||||
return STDOM.Attr(name, getattr(self, name))
|
||||
|
||||
def getAttributes(self):
|
||||
d={}
|
||||
for a in self._attributes:
|
||||
d[a]=getattr(self, a, '')
|
||||
return STDOM.NamedNodeMap(d)
|
||||
|
||||
def getSubparagraphs(self):
|
||||
return self._subs
|
||||
|
||||
def setSubparagraphs(self, subs):
|
||||
self._subs=subs
|
||||
|
||||
def getColorizableTexts(self):
|
||||
return (self._src,)
|
||||
|
||||
def setColorizableTexts(self, src):
|
||||
self._src=src[0]
|
||||
|
||||
def __repr__(self):
|
||||
r=[]; a=r.append
|
||||
a((' '*(self.indent or 0))+
|
||||
('%s(' % self.__class__.__name__)
|
||||
+str(self._src)+', ['
|
||||
)
|
||||
for p in self._subs: a(`p`)
|
||||
a((' '*(self.indent or 0))+'])')
|
||||
return join(r,'\n')
|
||||
|
||||
"""
|
||||
create aliases for all above functions in the pythony way.
|
||||
"""
|
||||
|
||||
def _get_Children(self, type=type, lt=type([])):
|
||||
return self.getChildren(type,lt)
|
||||
|
||||
def _get_Attribute(self, name):
|
||||
return self.getAttribute(name)
|
||||
|
||||
def _get_AttributeNode(self, name):
|
||||
return self.getAttributeNode(name)
|
||||
|
||||
def _get_Attributes(self):
|
||||
return self.getAttributes()
|
||||
|
||||
def _get_Subparagraphs(self):
|
||||
return self.getSubparagraphs()
|
||||
|
||||
def _set_Subparagraphs(self, subs):
|
||||
return self.setSubparagraphs(subs)
|
||||
|
||||
def _get_ColorizableTexts(self):
|
||||
return self.getColorizableTexts()
|
||||
|
||||
def _set_ColorizableTexts(self, src):
|
||||
return self.setColorizableTexts(src)
|
||||
|
||||
class StructuredTextDocument(StructuredTextParagraph):
|
||||
"""
|
||||
A StructuredTextDocument holds StructuredTextParagraphs
|
||||
as its subparagraphs.
|
||||
"""
|
||||
_attributes=()
|
||||
|
||||
def __init__(self, subs=None, **kw):
|
||||
apply(StructuredTextParagraph.__init__,
|
||||
(self, '', subs),
|
||||
kw)
|
||||
|
||||
def getChildren(self):
|
||||
return self._subs
|
||||
|
||||
def getColorizableTexts(self):
|
||||
return ()
|
||||
|
||||
def setColorizableTexts(self, src):
|
||||
pass
|
||||
|
||||
def __repr__(self):
|
||||
r=[]; a=r.append
|
||||
a('%s([' % self.__class__.__name__)
|
||||
for p in self._subs: a(`p`+',')
|
||||
a('])')
|
||||
return join(r,'\n')
|
||||
|
||||
"""
|
||||
create aliases for all above functions in the pythony way.
|
||||
"""
|
||||
|
||||
def _get_Children(self):
|
||||
return self.getChildren()
|
||||
|
||||
def _get_ColorizableTexts(self):
|
||||
return self.getColorizableTexts()
|
||||
|
||||
def _set_ColorizableTexts(self, src):
|
||||
return self.setColorizableTexts(src)
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,116 +0,0 @@
|
||||
Using Structured Text
|
||||
|
||||
The goal of StructuredText is to make it possible to express
|
||||
structured text using a relatively simple plain text format. Simple
|
||||
structures, like bullets or headings are indicated through
|
||||
conventions that are natural, for some definition of
|
||||
"natural". Hierarchical structures are indicated through
|
||||
indentation. The use of indentation to express hierarchical
|
||||
structure is inspired by the Python programming language.
|
||||
|
||||
Use of StructuredText consists of one to three logical steps. In the
|
||||
first step, a text string is converted to a network of objects using
|
||||
the 'StructuredText.Basic' facility, as in the following
|
||||
example::
|
||||
|
||||
raw=open("mydocument.txt").read()
|
||||
import StructuredText
|
||||
st=StructuredText.Basic(raw)
|
||||
|
||||
The output of 'StructuredText.Basic' is simply a
|
||||
StructuredTextDocument object containing StructuredTextParagraph
|
||||
objects arranged in a hierarchy. Paragraphs are delimited by strings
|
||||
of two or more whitespace characters beginning and ending with
|
||||
newline characters. Hierarchy is indicated by indentation. The
|
||||
indentation of a paragraph is the minimum number of leading spaces
|
||||
in a line containing non-white-space characters after converting tab
|
||||
characters to spaces (assuming a tab stop every eight characters).
|
||||
|
||||
StructuredTextNode objects support the read-only subset of the
|
||||
Document Object Model (DOM) API. It should be possible to process
|
||||
'StructuredTextNode' hierarchies using XML tools such as XSLT.
|
||||
|
||||
The second step in using StructuredText is to apply additional
|
||||
structuring rules based on text content. A variety of differentText
|
||||
rules can be used. Typically, these are used to implement a
|
||||
structured text language for producing documents, but any sort of
|
||||
structured text language could be implemented in the second
|
||||
step. For example, it is possible to use StructuredText to implement
|
||||
structured text formats for representing structured data. The second
|
||||
step, which could consist of multiple processing steps, is
|
||||
performed by processing, or "coloring", the hierarchy of generic
|
||||
StructuredTextParagraph objects into a network of more specialized
|
||||
objects. Typically, the objects produced should also implement the DOM
|
||||
API to allow processing with XML tools.
|
||||
|
||||
A document processor is provided to convert a StructuredTextDocument
|
||||
object containing only StructuredStructuredTextParagraph objects
|
||||
into a StructuredTextDocument object containing a richer collection
|
||||
of objects such as bullets, headings, emphasis, and so on using
|
||||
hints in the text. Hints are selected based on conventions of the
|
||||
sort typically seen in electronic mail or news-group postings. It
|
||||
should be noted, however, that these conventions are somewhat
|
||||
culturally dependent, fortunately, the document processor is easily
|
||||
customized to implement alternative rules. Here's an example of
|
||||
using the DOC processor to convert the output of the previous example::
|
||||
|
||||
doc=StructuredText.Document(st)
|
||||
|
||||
The final step is to process the colored networks produced from the
|
||||
second step to produce additional outputs. The final step could be
|
||||
performed by Python programs, or by XML tools. A Python outputter is
|
||||
provided for the document processor output that produces Hypertext Markup
|
||||
Language (HTML) text::
|
||||
|
||||
html=StructuredText.HTML(doc)
|
||||
|
||||
Customizing the document processor
|
||||
|
||||
The document processor is driven by two tables. The first table,
|
||||
named 'paragraph_types', is a sequence of callable objects or method
|
||||
names for coloring paragraphs. If a table entry is a string, then it
|
||||
is the name of a method of the document processor to be used. For
|
||||
each input paragraph, the objects in the table are called until one
|
||||
returns a value (not 'None'). The value returned replaces the
|
||||
original input paragraph in the output. If none of the objects in
|
||||
the paragraph types table return a value, then a copy of the
|
||||
original paragraph is used. The new object returned by calling a
|
||||
paragraph type should implement the ReadOnlyDOM,
|
||||
StructuredTextColorizable, and StructuredTextSubparagraphContainer
|
||||
interfaces. See the 'Document.py' source file for examples.
|
||||
|
||||
A paragraph type may return a list or tuple of replacement
|
||||
paragraphs, this allowing a paragraph to be split into multiple
|
||||
paragraphs.
|
||||
|
||||
The second table, 'text_types', is a sequence of callable objects or
|
||||
method names for coloring text. The callable objects in this table
|
||||
are used in sequence to transform the input text into new text or
|
||||
objects. The callable objects are passed a string and return
|
||||
nothing ('None') or a three-element tuple consisting of:
|
||||
|
||||
- a replacement object,
|
||||
|
||||
- a starting position, and
|
||||
|
||||
- an ending position
|
||||
|
||||
The text from the starting position is (logically) replaced with the
|
||||
replacement object. The replacement object is typically an object
|
||||
that implements that implements the ReadOnlyDOM, and
|
||||
StructuredTextColorizable interfaces. The replacement object can
|
||||
also be a string or a list of strings or objects. Replacement is
|
||||
done from beginning to end and text after the replacement ending
|
||||
position will be passed to the character type objects for processing.
|
||||
|
||||
Example: adding wiki links
|
||||
|
||||
We want to add support for Wiki links. A Wiki link is a string of
|
||||
text containing mixed-case letters, such that at least two of the
|
||||
letters are upper case and such that the first letter is upper case.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
import string
|
||||
|
||||
try:
|
||||
del string
|
||||
import locale
|
||||
locale.setlocale(locale.LC_ALL,"")
|
||||
except:
|
||||
pass
|
||||
|
||||
import string
|
||||
|
||||
letters = string.letters
|
||||
punctuations = string.punctuation
|
||||
|
||||
lettpunc = letters + punctuations
|
||||
@@ -1,148 +0,0 @@
|
||||
##############################################################################
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
""" Alias module for StructuredTextClassic compatibility which makes
|
||||
use of StructuredTextNG """
|
||||
|
||||
|
||||
import HTMLClass, DocumentClass, ClassicDocumentClass
|
||||
from ST import Basic
|
||||
|
||||
import re, string,sys
|
||||
from STletters import letters
|
||||
|
||||
Document = ClassicDocumentClass.DocumentClass()
|
||||
HTMLNG = HTMLClass.HTMLClass()
|
||||
|
||||
def HTML(aStructuredString, level=0):
|
||||
st = Basic(aStructuredString)
|
||||
doc = Document(st)
|
||||
return HTMLNG(doc)
|
||||
|
||||
def StructuredText(aStructuredString, level=0):
|
||||
return HTML(aStructuredString,level)
|
||||
|
||||
def html_with_references(text, level=1):
|
||||
text = re.sub(
|
||||
r'[\000\n]\.\. \[([0-9_%s-]+)\]' % letters,
|
||||
r'\n <a name="\1">[\1]</a>',
|
||||
text)
|
||||
|
||||
text = re.sub(
|
||||
r'([\000- ,])\[(?P<ref>[0-9_%s-]+)\]([\000- ,.:])' % letters,
|
||||
r'\1<a href="#\2">[\2]</a>\3',
|
||||
text)
|
||||
|
||||
text = re.sub(
|
||||
r'([\000- ,])\[([^]]+)\.html\]([\000- ,.:])',
|
||||
r'\1<a href="\2.html">[\2]</a>\3',
|
||||
text)
|
||||
|
||||
return HTML(text,level=level)
|
||||
|
||||
def html_quote(v,
|
||||
character_entities=(
|
||||
(re.compile('&'), '&'),
|
||||
(re.compile("<"), '<' ),
|
||||
(re.compile(">"), '>' ),
|
||||
(re.compile('"'), '"')
|
||||
)): #"
|
||||
text=str(v)
|
||||
for re,name in character_entities:
|
||||
text=re.sub(name,text)
|
||||
return text
|
||||
|
||||
|
||||
if __name__=='__main__':
|
||||
import getopt
|
||||
|
||||
opts,args = getopt.getopt(sys.argv[1:],'',[])
|
||||
|
||||
for k,v in opts:
|
||||
pass
|
||||
|
||||
|
||||
for f in args:
|
||||
print HTML(open(f).read())
|
||||
@@ -1,158 +0,0 @@
|
||||
#!/usr/bin/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 Html import HTML
|
||||
from string import split
|
||||
from ST import DOC
|
||||
import re
|
||||
|
||||
"""
|
||||
This is the new structured text type.
|
||||
"""
|
||||
|
||||
class Zwiki_Title:
|
||||
def __init__(self,str=''):
|
||||
self.expr1 = re.compile('([A-Z]+[A-Z]+[a-zA-Z]*)').search
|
||||
self.expr2 = re.compile('([A-Z]+[a-z]+[A-Z]+[a-zA-Z]*)').search
|
||||
self.str = [str]
|
||||
self.typ = "Zwiki_Title"
|
||||
|
||||
def type(self):
|
||||
return '%s' % self.typ
|
||||
|
||||
def string(self):
|
||||
return self.str
|
||||
|
||||
def __getitem__(self,index):
|
||||
return self.str[index]
|
||||
|
||||
def __call__(self,raw_string,subs):
|
||||
|
||||
"""
|
||||
The raw_string is checked to see if it matches the rules
|
||||
for this structured text expression. If the raw_string does,
|
||||
it is parsed for the sub-string which matches and a doc_inner_link
|
||||
instance is returned whose string is the matching substring.
|
||||
If raw_string does not match, nothing is returned.
|
||||
"""
|
||||
|
||||
if self.expr1(raw_string):
|
||||
start,end = self.expr1(raw_string).span()
|
||||
result = Zwiki_Title(raw_string[start:end])
|
||||
result.start,result.end = self.expr1(raw_string).span()
|
||||
return result
|
||||
elif self.expr2(raw_string):
|
||||
start,end = self.expr2(raw_string).span()
|
||||
result = Zwiki_Title(raw_string[start:end])
|
||||
result.start,result.end = self.expr2(raw_string).span()
|
||||
return result
|
||||
else:
|
||||
return None
|
||||
|
||||
def span(self):
|
||||
return self.start,self.end
|
||||
|
||||
class Zwiki_doc(DOC):
|
||||
|
||||
def __init__(self):
|
||||
DOC.__init__(self)
|
||||
"""
|
||||
Add the new type to self.types
|
||||
"""
|
||||
self.types.append(Zwiki_Title())
|
||||
|
||||
class Zwiki_parser(HTML):
|
||||
def __init__(self):
|
||||
HTML.__init__(self)
|
||||
self.types["Zwiki_Title"] = self.zwiki_title
|
||||
|
||||
def zwiki_title(self,object):
|
||||
result = ""
|
||||
for x in object.string():
|
||||
result = result + x
|
||||
result = "<a href=%s>%s</a>" % (result,result)
|
||||
#result = "<dtml-wikiname %s>" % result
|
||||
self.string = self.string + result
|
||||
@@ -1,112 +0,0 @@
|
||||
##############################################################################
|
||||
#
|
||||
# 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 HTMLClass, DocumentClass
|
||||
import ClassicDocumentClass
|
||||
from StructuredText import html_with_references, HTML
|
||||
from ST import Basic
|
||||
import DocBookClass
|
||||
import HTMLWithImages
|
||||
import DocumentWithImages
|
||||
|
||||
ClassicHTML=HTML
|
||||
HTMLNG=HTMLClass.HTMLClass()
|
||||
|
||||
def HTML(src, level=0, type=type, StringType=type('')):
|
||||
if type(src) is StringType:
|
||||
return ClassicHTML(src, level)
|
||||
return HTMLNG(src, level)
|
||||
|
||||
Classic=ClassicDocumentClass.DocumentClass()
|
||||
Document=DocumentClass.DocumentClass()
|
||||
DocumentWithImages=DocumentWithImages.DocumentWithImages()
|
||||
HTMLWithImages=HTMLWithImages.HTMLWithImages()
|
||||
|
||||
DocBookBook=DocBookClass.DocBookBook()
|
||||
DocBookChapter=DocBookClass.DocBookChapter()
|
||||
DocBookChapterWithFigures=DocBookClass.DocBookChapterWithFigures()
|
||||
DocBookArticle=DocBookClass.DocBookArticle()
|
||||
|
||||
|
||||
@@ -1,201 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
#----------------------------------------------------------------------
|
||||
|
||||
import sys, os
|
||||
import StructuredText
|
||||
from wxPython.wx import *
|
||||
|
||||
|
||||
USE_WXHTML = 1
|
||||
|
||||
|
||||
if not USE_WXHTML:
|
||||
try: # try to load the IE ActiveX control
|
||||
from wxPython.lib.activexwrapper import MakeActiveXClass
|
||||
import win32com.client.gencache
|
||||
browserModule = win32com.client.gencache.EnsureModule(
|
||||
"{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}", 0, 1, 1)
|
||||
except:
|
||||
USE_WXHTML = 1
|
||||
|
||||
if not USE_WXHTML:
|
||||
BrowserClass = MakeActiveXClass(browserModule.WebBrowser)
|
||||
|
||||
class MyHtmlWindow(BrowserClass):
|
||||
def SetPage(self, html):
|
||||
import tempfile
|
||||
filename = tempfile.mktemp('.html')
|
||||
f = open(filename, 'w')
|
||||
f.write(html)
|
||||
f.close()
|
||||
self.Navigate(os.path.abspath(filename))
|
||||
self.filename = filename
|
||||
|
||||
def OnDocumentComplete(self, pDisp=None, URL=None):
|
||||
os.unlink(self.filename)
|
||||
|
||||
else:
|
||||
from wxPython.html import *
|
||||
MyHtmlWindow = wxHtmlWindow
|
||||
|
||||
|
||||
|
||||
class StxFrame(wxFrame):
|
||||
title = "StxViewer"
|
||||
def __init__(self, stxFile):
|
||||
wxFrame.__init__(self, None, -1, self.title, size=(650, 700),
|
||||
style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)
|
||||
|
||||
##self.CreateStatusBar()
|
||||
|
||||
menu = wxMenu()
|
||||
menu.Append(10, "&Open\tCtrl-O", "Open a Structured Text file")
|
||||
EVT_MENU(self, 10, self.OnOpen)
|
||||
menu.Append(20, "&Close", "Close the current file")
|
||||
EVT_MENU(self, 20, self.OnClose)
|
||||
menu.Append(30, "&Save\tCtrl-S", "Save the current file")
|
||||
EVT_MENU(self, 30, self.OnSave)
|
||||
menu.Append(40, "Save &as", "Save the current file to a new name")
|
||||
EVT_MENU(self, 40, self.OnSaveAs)
|
||||
menu.Append(45, "Save as &html", "Save the current file as HTML")
|
||||
EVT_MENU(self, 45, self.OnSaveAsHTML)
|
||||
menu.AppendSeparator()
|
||||
menu.Append(50, "&Refresh\tCtrl-R", "Reload the file from disk")
|
||||
EVT_MENU(self, 50, self.OnRefresh)
|
||||
menu.AppendSeparator()
|
||||
menu.Append(60, "E&xit\tCtrl-X", "Close the application")
|
||||
EVT_MENU(self, 60, self.OnExit)
|
||||
|
||||
|
||||
menuBar = wxMenuBar()
|
||||
menuBar.Append(menu, "&File")
|
||||
self.SetMenuBar(menuBar)
|
||||
|
||||
|
||||
nb = wxNotebook(self, -1)
|
||||
EVT_NOTEBOOK_PAGE_CHANGED(self, -1, self.OnPageChanged)
|
||||
|
||||
self.htmlWin = MyHtmlWindow(nb, -1)
|
||||
nb.AddPage(self.htmlWin, "View")
|
||||
|
||||
self.editWin = wxTextCtrl(nb, -1, "", style=wxTE_MULTILINE)
|
||||
self.editWin.SetFont(wxFont(10, wxTELETYPE, wxNORMAL, wxNORMAL))
|
||||
nb.AddPage(self.editWin, "Edit")
|
||||
|
||||
self.viewHtml = wxTextCtrl(nb, -1, "", style=wxTE_MULTILINE|wxTE_READONLY)
|
||||
self.viewHtml.SetFont(wxFont(10, wxTELETYPE, wxNORMAL, wxNORMAL))
|
||||
nb.AddPage(self.viewHtml, "HTML")
|
||||
|
||||
self.LoadStxFile(stxFile)
|
||||
|
||||
|
||||
def LoadStxFile(self, stxFile):
|
||||
self.file = stxFile
|
||||
if stxFile is not None:
|
||||
text = open(stxFile).read()
|
||||
self.SetTitle(self.title + ': ' + stxFile)
|
||||
else:
|
||||
text = ""
|
||||
self.SetTitle(self.title)
|
||||
self.LoadStxText(text)
|
||||
|
||||
|
||||
def LoadStxText(self, text):
|
||||
# Old ST
|
||||
html = str(StructuredText.html_with_references(text))
|
||||
|
||||
# NG Version
|
||||
#st = StructuredText.Basic(text)
|
||||
#doc = StructuredText.Document(st)
|
||||
#html = StructuredText.HTMLNG(doc)
|
||||
|
||||
self.htmlWin.SetPage(html)
|
||||
self.editWin.SetValue(text)
|
||||
self.viewHtml.SetValue(html)
|
||||
self.html = html
|
||||
|
||||
|
||||
def OnPageChanged(self, evt):
|
||||
if evt.GetOldSelection() == 1: # if it was on the edit page
|
||||
text = self.editWin.GetValue()
|
||||
self.LoadStxText(text)
|
||||
|
||||
|
||||
def OnOpen(self, evt):
|
||||
dlg = wxFileDialog(self, defaultDir=os.getcwd(),
|
||||
wildcard = "STX files (*.stx)|*.stx|"
|
||||
"Text files (*.txt)|*.txt|"
|
||||
"All files (*.*)|*.*",
|
||||
style=wxOPEN)
|
||||
if dlg.ShowModal() == wxID_OK:
|
||||
self.LoadStxFile(dlg.GetPath())
|
||||
dlg.Destroy()
|
||||
|
||||
|
||||
|
||||
def OnClose(self, evt):
|
||||
self.LoadStxFile(None)
|
||||
|
||||
|
||||
def OnSave(self, evt):
|
||||
if not self.file:
|
||||
self.OnSaveAs(evt)
|
||||
else:
|
||||
text = self.editWin.GetValue()
|
||||
open(self.file, 'w').write(text)
|
||||
self.LoadStxFile(self.file)
|
||||
|
||||
|
||||
def OnSaveAs(self, evt):
|
||||
dlg = wxFileDialog(self, "Save as...", defaultDir=os.getcwd(),
|
||||
wildcard = "STX files (*.stx)|*.stx|"
|
||||
"Text files (*.txt)|*.txt|"
|
||||
"All files (*.*)|*.*",
|
||||
style=wxSAVE)
|
||||
if dlg.ShowModal() == wxID_OK:
|
||||
file = dlg.GetPath()
|
||||
text = self.editWin.GetValue()
|
||||
open(file, 'w').write(text)
|
||||
self.LoadStxFile(file)
|
||||
dlg.Destroy()
|
||||
|
||||
|
||||
def OnSaveAsHTML(self, evt):
|
||||
dlg = wxFileDialog(self, "Save as...", defaultDir=os.getcwd(),
|
||||
wildcard = "HTML files (*.html)|*.html|"
|
||||
"All files (*.*)|*.*",
|
||||
style=wxSAVE)
|
||||
if dlg.ShowModal() == wxID_OK:
|
||||
file = dlg.GetPath()
|
||||
text = self.editWin.GetValue()
|
||||
self.LoadStxText(text)
|
||||
open(file, 'w').write(self.html)
|
||||
dlg.Destroy()
|
||||
|
||||
|
||||
|
||||
def OnRefresh(self, evt):
|
||||
self.LoadStxFile(self.file)
|
||||
|
||||
|
||||
def OnExit(self, evt):
|
||||
self.Close(true)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
app = wxPySimpleApp()
|
||||
wxInitAllImageHandlers()
|
||||
|
||||
if len(sys.argv) > 1:
|
||||
filename = sys.argv[1]
|
||||
else:
|
||||
filename = None
|
||||
|
||||
frame = StxFrame(filename)
|
||||
frame.Show(true)
|
||||
app.MainLoop()
|
||||
|
||||
|
||||
|
||||
@@ -1,127 +0,0 @@
|
||||
Structured Text Manipulation
|
||||
|
||||
Parse a structured text string into a form that can be used with
|
||||
structured formats, like html.
|
||||
|
||||
Structured text is text that uses indentation and simple
|
||||
symbology to indicate the structure of a document.
|
||||
|
||||
A structured string consists of a sequence of paragraphs separated by
|
||||
one or more blank lines. Each paragraph has a level which is defined
|
||||
as the minimum indentation of the paragraph. A paragraph is a
|
||||
sub-paragraph of another paragraph if the other paragraph is the last
|
||||
preceding paragraph that has a lower level.
|
||||
|
||||
Special symbology is used to indicate special constructs:
|
||||
|
||||
- A single-line paragraph whose immediately succeeding paragraphs are lower
|
||||
level is treated as a header.
|
||||
|
||||
- A paragraph that begins with a '-', '*', or 'o' is treated as an
|
||||
unordered list (bullet) element.
|
||||
|
||||
- A paragraph that begins with a sequence of digits followed by a
|
||||
white-space character is treated as an ordered list element.
|
||||
|
||||
- A paragraph that begins with a sequence of sequences, where each
|
||||
sequence is a sequence of digits or a sequence of letters followed
|
||||
by a period, is treated as an ordered list element. If the sequence is
|
||||
made up of lower-case i's and v's, a lower-case roman-numeral list is
|
||||
generated. If the sequence is made up of upper-case I's and V's, an
|
||||
upper-case roman-numeral list is generated. If the sequence is made
|
||||
up of other lower case letters (typically a,b,c) a lowercase alphabetic
|
||||
list is generated. If the sequence is made of of other upper case
|
||||
letters (typically, A,B,C) an uppercase alphabetic list is generated.
|
||||
If the sequence is something else (typically, 1,2,3), a arabic-numeral
|
||||
list is generated.
|
||||
|
||||
- A paragraph with a first line that contains some text, followed by
|
||||
some white-space and '--' is treated as a descriptive list element.
|
||||
The leading text is treated as the element title.
|
||||
|
||||
- Sub-paragraphs of a paragraph that ends in the word 'example' or the
|
||||
word 'examples', or '::' is treated as example code and is output as is.
|
||||
|
||||
- Text enclosed single quotes (with white-space to the left of the
|
||||
first quote and whitespace or puctuation to the right of the second quote)
|
||||
is treated as example code.
|
||||
|
||||
- Text surrounded by '*' characters (with white-space to the left of the
|
||||
first '*' and whitespace or puctuation to the right of the second '*')
|
||||
is *emphasized*.
|
||||
|
||||
- Text surrounded by '**' characters (with white-space to the left of the
|
||||
first '**' and whitespace or puctuation to the right of the second '**')
|
||||
is made **strong**.
|
||||
|
||||
- Text surrounded by '_' underscore characters (with whitespace to the left
|
||||
and whitespace or punctuation to the right) is made _underlined_.
|
||||
|
||||
- Text encloded by double quotes followed by a colon, a URL, and concluded
|
||||
by punctuation plus white space, *or* just white space, is treated as a
|
||||
hyper link. For example:
|
||||
|
||||
'"Zope":http://www.zope.org/ is ...'
|
||||
|
||||
Is interpreted as '<a href="http://www.zope.org/">Zope</a> is ...'
|
||||
Note: This works for relative as well as absolute URLs.
|
||||
|
||||
- Text enclosed by double quotes followed by a comma, one or more spaces,
|
||||
an absolute URL and concluded by punctuation plus white space, or just
|
||||
white space, is treated as a hyper link. For example:
|
||||
|
||||
"mail me", mailto:amos@digicool.com.
|
||||
|
||||
Is interpreted as '<a href="mailto:amos@digicool.com">mail me</a>.'
|
||||
|
||||
- Text enclosed in brackets which consists only of letters, digits,
|
||||
underscores and dashes is treated as hyper links within the document.
|
||||
For example:
|
||||
|
||||
As demonstrated by Smith [12] this technique is quite effective.
|
||||
|
||||
Is interpreted as '... by Smith <a href="#12">[12]</a> this ...'. Together
|
||||
with the next rule this allows easy coding of references or end notes.
|
||||
|
||||
- Text enclosed in brackets which is preceded by the start of a line, two
|
||||
periods and a space is treated as a named link. For example:
|
||||
|
||||
.. [12] "Effective Techniques" Smith, Joe ...
|
||||
|
||||
Is interpreted as '<a name="12">[12]</a> "Effective Techniques" ...'.
|
||||
Together with the previous rule this allows easy coding of references or
|
||||
end notes.
|
||||
|
||||
|
||||
- A paragraph that has blocks of text enclosed in '||' is treated as a
|
||||
table. The text blocks correspond to table cells and table rows are
|
||||
denoted by newlines. By default the cells are center aligned. A cell
|
||||
can span more than one column by preceding a block of text with an
|
||||
equivalent number of cell separators '||'. Newlines and '|' cannot
|
||||
be a part of the cell text. For example:
|
||||
|
||||
|||| **Ingredients** ||
|
||||
|| *Name* || *Amount* ||
|
||||
||Spam||10||
|
||||
||Eggs||3||
|
||||
|
||||
is interpreted as::
|
||||
|
||||
<TABLE BORDER=1 CELLPADDING=2>
|
||||
<TR>
|
||||
<TD ALIGN=CENTER COLSPAN=2> <strong>Ingredients</strong> </TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD ALIGN=CENTER COLSPAN=1> <em>Name</em> </TD>
|
||||
<TD ALIGN=CENTER COLSPAN=1> <em>Amount</em> </TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD ALIGN=CENTER COLSPAN=1>Spam</TD>
|
||||
<TD ALIGN=CENTER COLSPAN=1>10</TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD ALIGN=CENTER COLSPAN=1>Eggs</TD>
|
||||
<TD ALIGN=CENTER COLSPAN=1>3</TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
|
||||
@@ -89,12 +89,12 @@ class main_window(wxFrame):
|
||||
# Install the tree and the editor.
|
||||
# ------------------------------------------------------------------------------------
|
||||
splitter.SplitVertically (self.tree, self.editor)
|
||||
splitter.SetSashPosition (180, true)
|
||||
splitter.SetSashPosition (180, True)
|
||||
|
||||
self.Show(true)
|
||||
self.Show(True)
|
||||
|
||||
# Some global state variables.
|
||||
self.projectdirty = false
|
||||
self.projectdirty = False
|
||||
|
||||
# ----------------------------------------------------------------------------------------
|
||||
# Some nice little handlers.
|
||||
@@ -118,9 +118,9 @@ class main_window(wxFrame):
|
||||
self.tree.Expand (self.root)
|
||||
|
||||
self.editor.Clear()
|
||||
self.editor.Enable (false)
|
||||
self.editor.Enable (False)
|
||||
|
||||
self.projectdirty = false
|
||||
self.projectdirty = False
|
||||
except IOError:
|
||||
pass
|
||||
|
||||
@@ -139,7 +139,7 @@ class main_window(wxFrame):
|
||||
(child,iter) = self.tree.GetNextChild(self.root,iter)
|
||||
output.write (self.tree.GetItemText(child) + "\n")
|
||||
output.close()
|
||||
self.projectdirty = false
|
||||
self.projectdirty = False
|
||||
except IOError:
|
||||
dlg_m = wxMessageDialog (self, 'There was an error saving the project file.',
|
||||
'Error!', wxOK)
|
||||
@@ -151,7 +151,7 @@ class main_window(wxFrame):
|
||||
# ----------------------------------------------------------------------------------------
|
||||
|
||||
def OnProjectOpen(self, event):
|
||||
open_it = true
|
||||
open_it = True
|
||||
if self.projectdirty:
|
||||
dlg=wxMessageDialog(self, 'The project has been changed. Save?', 'wxProject',
|
||||
wxYES_NO | wxCANCEL)
|
||||
@@ -159,7 +159,7 @@ class main_window(wxFrame):
|
||||
if result == wxID_YES:
|
||||
self.project_save()
|
||||
if result == wxID_CANCEL:
|
||||
open_it = false
|
||||
open_it = False
|
||||
dlg.Destroy()
|
||||
if open_it:
|
||||
dlg = wxFileDialog(self, "Choose a project to open", ".", "", "*.wxp", wxOPEN)
|
||||
@@ -168,7 +168,7 @@ class main_window(wxFrame):
|
||||
dlg.Destroy()
|
||||
|
||||
def OnProjectNew(self, event):
|
||||
open_it = true
|
||||
open_it = True
|
||||
if self.projectdirty:
|
||||
dlg=wxMessageDialog(self, 'The project has been changed. Save?', 'wxProject',
|
||||
wxYES_NO | wxCANCEL)
|
||||
@@ -176,7 +176,7 @@ class main_window(wxFrame):
|
||||
if result == wxID_YES:
|
||||
self.project_save()
|
||||
if result == wxID_CANCEL:
|
||||
open_it = false
|
||||
open_it = False
|
||||
dlg.Destroy()
|
||||
|
||||
if open_it:
|
||||
@@ -202,7 +202,7 @@ class main_window(wxFrame):
|
||||
dlg.Destroy()
|
||||
|
||||
def OnProjectExit(self, event):
|
||||
close = true
|
||||
close = True
|
||||
if self.projectdirty:
|
||||
dlg=wxMessageDialog(self, 'The project has been changed. Save?', 'wxProject',
|
||||
wxYES_NO | wxCANCEL)
|
||||
@@ -210,7 +210,7 @@ class main_window(wxFrame):
|
||||
if result == wxID_YES:
|
||||
self.project_save()
|
||||
if result == wxID_CANCEL:
|
||||
close = false
|
||||
close = False
|
||||
dlg.Destroy()
|
||||
if close:
|
||||
self.Close()
|
||||
@@ -243,10 +243,10 @@ class main_window(wxFrame):
|
||||
event.Veto()
|
||||
|
||||
def OnTreeLabelEditEnd(self, event):
|
||||
self.projectdirty = true
|
||||
self.projectdirty = True
|
||||
|
||||
def OnTreeItemActivated(self, event):
|
||||
go_ahead = true
|
||||
go_ahead = True
|
||||
if self.activeitem != self.root:
|
||||
if self.editor.IsModified():
|
||||
dlg=wxMessageDialog(self, 'The edited file has changed. Save it?',
|
||||
@@ -255,7 +255,7 @@ class main_window(wxFrame):
|
||||
if result == wxID_YES:
|
||||
self.editor.SaveFile (self.tree.GetItemText (self.activeitem))
|
||||
if result == wxID_CANCEL:
|
||||
go_ahead = false
|
||||
go_ahead = False
|
||||
dlg.Destroy()
|
||||
if go_ahead:
|
||||
self.tree.SetItemBold (self.activeitem, 0)
|
||||
@@ -279,7 +279,7 @@ class App(wxApp):
|
||||
self.SetTopWindow(frame)
|
||||
if (projfile != 'Unnamed'):
|
||||
frame.project_open (projfile)
|
||||
return true
|
||||
return True
|
||||
|
||||
app = App(0)
|
||||
app.MainLoop()
|
||||
|
||||
Reference in New Issue
Block a user