call the python script class PythonScript; try to handle unicode correctly

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@1869 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2007-08-03 09:50:32 +00:00
parent 273a618a28
commit 0af3bb6512
5 changed files with 51 additions and 51 deletions

View file

@ -1,22 +1,22 @@
============ ==============
Python Pages Python Scripts
============ ==============
Persistent Python Page - Content Type Persistent Python Scripts
Examples: Examples:
>>> from cybertools.pyscript.tests import Root >>> from cybertools.pyscript.tests import Root
>>> from cybertools.pyscript.script import PythonPage >>> from cybertools.pyscript.script import PythonScript
>>> pp = PythonPage() >>> pp = PythonScript()
>>> pp.__parent__ = Root() >>> pp.__parent__ = Root()
>>> pp.__name__ = 'pp' >>> pp.__name__ = 'pp'
>>> request = None >>> request = None
Test that can produce the correct filename Test that can produce the correct filename
>>> pp._PythonPage__filename() >>> pp._PythonScript__filename()
u'/pp' u'/pp'
A simple test that checks that any lone-standing triple-quotes are A simple test that checks that any lone-standing triple-quotes are
@ -24,50 +24,49 @@ being printed.
>>> pp.setSource(u"'''<html>...</html>'''\nreturn printed") >>> pp.setSource(u"'''<html>...</html>'''\nreturn printed")
>>> pp(request) >>> pp(request)
'<html>...</html>\n' u'<html>...</html>\n'
Make sure that strings with prefixes work. Make sure that strings with prefixes work.
>>> pp.setSource(ur"ur'''test\r'''" + "\nreturn printed") >>> pp.setSource(ur"ur'''test\\r'''" + "\nreturn printed")
>>> pp(request) >>> pp(request)
'test\\r\n' u'test\\r\n'
Make sure that Windows (\r\n) line ends also work. Make sure that Windows (\r\n) line ends also work.
>>> pp.setSource(u"if 1 == 1:\r\n\r\n '''<html>...</html>'''\nreturn printed") >>> pp.setSource(u"if 1 == 1:\r\n\r\n '''<html>...</html>'''\nreturn printed")
>>> pp(request) >>> pp(request)
'<html>...</html>\n' u'<html>...</html>\n'
Make sure that unicode strings work as expected. Make sure that unicode strings work as expected.
>>> #pp.setSource(u"u'''\u0442\u0435\u0441\u0442'''") >>> pp.setSource(u"u'''\u0442\u0435\u0441\u0442'''\nreturn printed")
>>> #pp(request) >>> pp(request)
u'\u0442\u0435\u0441\u0442\n'
u'\u0442\u0435\u0441\u0442\n'
Make sure that multi-line strings work. Make sure that multi-line strings work.
>>> pp.setSource(u"u'''test\ntest\ntest'''\nreturn printed") >>> pp.setSource(u"u'''test\ntest\ntest'''\nreturn printed")
>>> pp(request) >>> pp(request)
'test\n...test\n...test\n' u'test\n...test\n...test\n'
Here you can see a simple Python command... Here you can see a simple Python command...
>>> pp.setSource(u"print u'<html>...</html>'\nreturn printed") >>> pp.setSource(u"print u'<html>...</html>'\nreturn printed")
>>> pp(request) >>> pp(request)
'<html>...</html>\n' u'<html>...</html>\n'
... and here a triple quote with some variable replacement. ... and here a triple quote with some variable replacement.
>>> pp.setSource(u"'''<html>%s</html>''' %x\nreturn printed") >>> pp.setSource(u"'''<html>%s</html>''' %x\nreturn printed")
>>> pp(request, x='test') >>> pp(request, x='test')
'<html>test</html>\n' u'<html>test</html>\n'
Make sure that the context of the page is available. Make sure that the context of the page is available.
>>> pp.setSource(u"'''<html>%s</html>''' %context.__name__\nreturn printed") >>> pp.setSource(u"'''<html>%s</html>''' %context.__name__\nreturn printed")
>>> pp(request) >>> pp(request)
'<html>root</html>\n' u'<html>root</html>\n'
Make sure that faulty syntax is interpreted correctly. Make sure that faulty syntax is interpreted correctly.

View file

@ -20,17 +20,20 @@ from zope.app.form.browser.editview import EditView
from zope.app.i18n import ZopeMessageFactory as _ from zope.app.i18n import ZopeMessageFactory as _
class PythonPageEval(object): class PythonScriptEval(object):
"""Evaluate the Python Page.""" """Evaluate the Python Script."""
def index(self, **kw): def index(self, **kw):
"""Call a Python Page""" """Call a Python Page"""
self.request.response.setHeader('content-type', self.request.response.setHeader('content-type',
self.context.contentType) self.context.contentType)
return str(self.context(self.request, **kw)) result = self.context(self.request, **kw)
if type(result) is unicode:
return result
return unicode(result)
class PythonPageEditView(EditView): class PythonScriptEditView(EditView):
"""Edit View Class for Python Page.""" """Edit View Class for Python Page."""
syntaxError = None syntaxError = None

View file

@ -4,19 +4,19 @@
i18n_domain="zope"> i18n_domain="zope">
<interface <interface
interface=".interfaces.IPythonPage" interface=".interfaces.IPythonScript"
type="zope.app.content.interfaces.IContentType" type="zope.app.content.interfaces.IContentType"
/> />
<class class=".script.PythonPage"> <class class=".script.PythonScript">
<factory <factory
id="cybertools.pyscript.PythonPage" id="cybertools.pyscript.PythonScript"
title="Python Page" title="Python Page"
description="A simple, content-based Python Page" description="A simple, content-based Python Script"
/> />
<require <require
permission="zope.View" permission="zope.View"
interface=".interfaces.IPythonPage" interface=".interfaces.IPythonScript"
/> />
<require <require
permission="zope.ManageContent" permission="zope.ManageContent"
@ -32,34 +32,34 @@
<browser:page <browser:page
name="index.html" name="index.html"
for=".interfaces.IPythonPage" for=".interfaces.IPythonScript"
class=".browser.PythonPageEval" class=".browser.PythonScriptEval"
attribute="index" attribute="index"
permission="zope.View" permission="zope.View"
/> />
<browser:addform <browser:addform
label="Add Python Page" label="Add Python Script"
name="AddPythonPage.html" name="AddPythonScript.html"
schema=".interfaces.IPythonPage" schema=".interfaces.IPythonScript"
content_factory=".script.PythonPage" content_factory=".script.PythonScript"
permission="zope.ManageContent" permission="zope.ManageContent"
/> />
<browser:addMenuItem <browser:addMenuItem
class=".script.PythonPage" class=".script.PythonScript"
title="Python Page" title="Python Page"
description="An Python Page" description="An Python Page"
permission="zope.ManageContent" permission="zope.ManageContent"
view="AddPythonPage.html" view="AddPythonScript.html"
/> />
<browser:editform <browser:editform
for=".interfaces.IPythonPage" for=".interfaces.IPythonScript"
schema=".interfaces.IPythonPage" schema=".interfaces.IPythonScript"
name="edit.html" name="edit.html"
label="Edit Python Page" label="Edit Python Page"
class=".browser.PythonPageEditView" class=".browser.PythonScriptEditView"
template="edit.pt" template="edit.pt"
permission="zope.ManageContent" permission="zope.ManageContent"
menu="zmi_views" title="Edit" menu="zmi_views" title="Edit"
@ -70,7 +70,7 @@
<configure package="zope.app.preview"> <configure package="zope.app.preview">
<browser:page <browser:page
for="cybertools.pyscript.interfaces.IPythonPage" for="cybertools.pyscript.interfaces.IPythonScript"
name="preview.html" name="preview.html"
template="preview.pt" template="preview.pt"
permission="zope.ManageContent" permission="zope.ManageContent"

View file

@ -27,8 +27,8 @@ from zope import schema
from zope.app.i18n import ZopeMessageFactory as _ from zope.app.i18n import ZopeMessageFactory as _
class IPythonPage(Interface): class IPythonScript(Interface):
"""Python Page """Python Script, derived from zope.app.pythonpage.PythonPage.
The Python Page acts as a simple content type that allows you to execute The Python Page acts as a simple content type that allows you to execute
Python in content space. Additionally, if you have a free-standing Python in content space. Additionally, if you have a free-standing

View file

@ -31,20 +31,20 @@ from zope.app.container.contained import Contained
from zope.interface import implements from zope.interface import implements
from zope.app.i18n import ZopeMessageFactory as _ from zope.app.i18n import ZopeMessageFactory as _
from cybertools.pyscript.interfaces import IPythonPage from cybertools.pyscript.interfaces import IPythonScript
class PythonPage(Contained, Persistent): class PythonScript(Contained, Persistent):
"""Persistent Python Page - Content Type """Persistent Python Page - Content Type
""" """
implements(IPythonPage) implements(IPythonScript)
_v_compiled = None _v_compiled = None
def __init__(self, source=u'', contentType=u'text/plain'): def __init__(self, source=u'', contentType=u'text/plain'):
"""Initialize the object.""" """Initialize the object."""
super(PythonPage, self).__init__() super(PythonScript, self).__init__()
self.source = source self.source = source
self.contentType = contentType self.contentType = contentType
@ -80,7 +80,7 @@ class PythonPage(Contained, Persistent):
source = source.encode('ascii') source = source.encode('ascii')
except UnicodeEncodeError: except UnicodeEncodeError:
return self._tripleQuotedString.sub(_print_usrc, source) return self._tripleQuotedString.sub(_print_usrc, source)
return self._tripleQuotedString.sub(r"\1print u\2\3", source) return self._tripleQuotedString.sub(r"\1print \2\3", source)
def getSource(self): def getSource(self):
@ -102,7 +102,7 @@ class PythonPage(Contained, Persistent):
self._v_compiled(kw) self._v_compiled(kw)
result = kw['script_result'] result = kw['script_result']
if result == output: if result == output:
result = result.getvalue() result = result.getvalue().decode('unicode-escape')
return result return result
@ -122,9 +122,7 @@ class Function(object):
def __call__(self, globals): def __call__(self, globals):
globals['__builtins__'] = SafeBuiltins globals['__builtins__'] = SafeBuiltins
#fct = new.function(self.code, globals)
exec self.code in globals, None exec self.code in globals, None
#return fct()
def _print_usrc(match): def _print_usrc(match):
@ -132,4 +130,4 @@ def _print_usrc(match):
raw = match.group(2) raw = match.group(2)
if raw: if raw:
return match.group(1)+'print '+`string` return match.group(1)+'print '+`string`
return match.group(1)+'print u'+match.group(3).encode('unicode-escape') return match.group(1)+'print '+match.group(3).encode('unicode-escape')