For future reference, this has been resolved with revision
a1619d2857e5 in the mercurial repository.

As mentioned before, simply include just the gluon/template.py file
from web2py, then use it similar to the following example.

example.py
~~~~~
from template import render

renderedText = render(
        filename='/path/to/view.html',
        context=dict( foo=bar )
)
~~~~~

View content is usually escaped, but if you run it standalone, you can
break out of escaping with the helper NOESCAPE().

Here's an example:

view.html
~~~~~
<html>
  <body>
    {{= NOESCAPE( foo ) }}
  </body>
</html>
~~~~~


Thanks for everyone's help on this!

On Jun 6, 3:05 pm, Massimo Di Pierro <massimo.dipie...@gmail.com>
wrote:
> somebody email me the patch. :-)
>
> On Jun 6, 1:26 pm, Thadeus Burgess <thade...@thadeusb.com> wrote:
>
>
>
>
>
>
>
> > What you have looked good. The exception looks like its pandocs fault not
> > the template system.
>
> > --
> > Thadeus
>
> > On Mon, Jun 6, 2011 at 1:03 PM, Ryan Seto <mr.werew...@gmail.com> wrote:
> > > I see.
>
> > > Would you like me to try and come up with a patch for this?
>
> > > On Mon, Jun 6, 2011 at 1:53 PM, Thadeus Burgess <thade...@thadeusb.com>
> > > wrote:
> > > > Yes..
>
> > > > You need some sort of response class that has a .write method... this 
> > > > can
> > > be
> > > > a hacked up cStringIO or other.
>
> > > > Alternatively you can perform the same thing manually by passing in
> > > writer,
> > > > which instead of the template engine writing ``response.write("%s")`` it
> > > > could write whatever you want as a callable function.
>
> > > > So for example, say you defined your ``CustomResponse`` class as earlier
> > > in
> > > > the list...
>
> > > > context['response'] = CustomReponse()
> > > > exec(parse_template(...)) in context
> > > > print context['response'].body.getvalue()
>
> > > > SO yeah... in the end if we implemented your suggestion of overriding 
> > > > the
> > > > response class on import, then the render function would work as
> > > expected.
>
> > > > --
> > > > Thadeus
>
> > > > On Mon, Jun 6, 2011 at 12:26 PM, Ryan Seto <mr.werew...@gmail.com>
> > > wrote:
>
> > > >> Hm, that doesn't seem to be it either.  I don't get a requirement for
> > > >> the globals module, but what I get back is this:
>
> > > >> ~~~~~
> > > >> >>> print parse_template('view.html', path='templates',
> > > >> >>> context=dict(content='test'))
> > > >> response.write(content)
> > > >> response.write('\r\n', escape=False)
> > > >> ~~~~~
>
> > > >> Am I supposed to execute what parse_template returns?
>
> > > >> Thank you for your help.
>
> > > >> On Mon, Jun 6, 2011 at 11:53 AM, Thadeus Burgess <thade...@thadeusb.com
>
> > > >> wrote:
> > > >> > What you really want is template.parse_template. Still requires
> > > >> > restricted
> > > >> > but only for the exception raising.
>
> > > >> > Very simple.
>
> > > >> > from template import parse_template
>
> > > >> > print parse_template('main.html', path='/path/to/custom/views/',
> > > >> > context=dict())
>
> > > >> > --
> > > >> > Thadeus
>
> > > >> > On Mon, Jun 6, 2011 at 12:55 AM, Massimo Di Pierro
> > > >> > <massimo.dipie...@gmail.com> wrote:
>
> > > >> >> It is LGPL not GPL. very different. ;-)
>
> > > >> >> On Jun 6, 12:36 am, Karel Antonio Verdecia Ortiz <kverde...@uci.cu>
> > > >> >> wrote:
> > > >> >> > Hi,
>
> > > >> >> > I've been using the web2py template engine for a while. I don't
> > > >> >> > remember
> > > >> >> > if I had to make some change to the template.py module nor the
> > > >> >> > version
> > > >> >> > of the web2py this module comes from so I attach it in this email.
> > > >> >> > This
> > > >> >> > was the way I could make it work (there is probably a simpler 
> > > >> >> > one):
>
> > > >> >> >          from template import TemplateParser
>
> > > >> >> >          context = {}
> > > >> >> >          output = cStringIO.StringIO()
> > > >> >> >          def response_writer(data, escape=False):
> > > >> >> >              output.write(unicode(data))
> > > >> >> >          context['response_writer'] = response_writer
> > > >> >> >          source = self._template()
> > > >> >> >          exec(str(TemplateParser(source, context=context,
> > > >> >> >              writer='response_writer'))) in context
> > > >> >> >          content = output.getvalue()
>
> > > >> >> > I have a question about this module. It's GPL3 license. If I 
> > > >> >> > modify
> > > >> >> > it
> > > >> >> > an ditribute it in an application, do this application have to be
> > > >> >> > GPL3
> > > >> >> > licensed?
>
> > > >> >> > I apologize if my english if very bad. My language is spanish.
>
> > > >> >> > El 06/06/11 00:59, Ryan Seto escribi�:
>
> > > >> >> > > Thanks! That does solve the import restricted dependency.
>
> > > >> >> > > The import globals for the Response() object is still an issue.
>
> > > >> >> > > I tried fiddling with my copy to build a mock Response() object
> > > if
> > > >> >> > > we
> > > >> >> > > can't import globals.
>
> > > >> >> > > This is what I have so far:
>
> > > >> >> > > gluon/template.py | line 867
> > > >> >> > > ~~~~~
> > > >> >> > >      # Here to avoid circular Imports
> > > >> >> > >      try:
> > > >> >> > >          from globals import Response
> > > >> >> > >      except:
> > > >> >> > >          import cStringIO
> > > >> >> > >          from xml.sax.saxutils import escape, quoteattr
> > > >> >> > >          class Response():
> > > >> >> > >              def __init__(self):
> > > >> >> > >                  self.body = cStringIO.StringIO()
> > > >> >> > >              def write(self, data, escape=True):
> > > >> >> > >                  if not escape:
> > > >> >> > >                      self.body.write(str(data))
> > > >> >> > >                  elif hasattr(data,'xml') and 
> > > >> >> > > callable(data.xml):
> > > >> >> > >                      self.body.write(data.xml())
> > > >> >> > >                  else:
> > > >> >> > >                      # otherwise, make it a string
> > > >> >> > >                      if not isinstance(data, (str, unicode)):
> > > >> >> > >                          data = str(data)
> > > >> >> > >                      elif isinstance(data, unicode):
> > > >> >> > >                          data = data.encode('utf8',
> > > >> >> > > 'xmlcharrefreplace')
> > > >> >> > >                      self.body.write(data)
> > > >> >> > > ~~~~~
>
> > > >> >> > > I was planning to escape the data with the escape and quoteattr
> > > >> >> > > provided from xml.sax.saxutils, but I wasn't successful with
> > > that,
> > > >> >> > > so
> > > >> >> > > I left it out for now.
>
> > > >> >> > > Here's my code snippet:
>
> > > >> >> > > nixie/util/text.py | line 19
> > > >> >> > > ~~~~~
> > > >> >> > > import os, subprocess, paths, template
>
> > > >> >> > > def render(inFile):
> > > >> >> > >      content = pandoc(str(inFile))
> > > >> >> > >      templateFile = os.path.join(paths.get_prog_root(),
> > > >> >> > > 'templates',
> > > >> >> > > 'view.html')
> > > >> >> > >      styles = []
> > > >> >> > >      styles.append(os.path.join(paths.get_prog_root(), 'css',
> > > >> >> > > 'style.css'))
> > > >> >> > >      return template.render(
> > > >> >> > >              filename=templateFile,
> > > >> >> > >              context=dict(content=content, styles=styles)
> > > >> >> > >          )
> > > >> >> > > ~~~~~
>
> > > >> >> > > templates/view.html
> > > >> >> > > ~~~~~
> > > >> >> > > <html>
> > > >> >> > > <head>
> > > >> >> > >    {{for css in styles:}}
> > > >> >> > >      <link rel="stylesheet" href="{{=css}}" type="text/css" />
> > > >> >> > >    {{pass}}
> > > >> >> > > </head>
> > > >> >> > > <body>
> > > >> >> > >    {{=content}}
> > > >> >> > > </body>
> > > >> >> > > </html>
> > > >> >> > > ~~~~~
>
> > > >> >> > > When I run this, I get an error message that doesn't really help
> > > me
> > > >> >> > > much.  Here's the output:
>
> > > >> >> > > ~~~~~
> > > >> >> > > C:\projects\nixie>c:\Python26\python.exe Nixie.py README.txt
> > > >> >> > > Traceback (most recent call last):
> > > >> >> > >    File "C:\projects\nixie\nixie\qt\NixieAccessManager.py", line
> > > >> >> > > 41,
> > > >> >> > > in
> > > >> >> > > createRequest
> > > >> >> > >      reply = NixieReply(request.url(), self.GetOperation,
> > > >> >> > > parent=self)
> > > >> >> > >    File "C:\projects\nixie\nixie\qt\NixieReply.py", line 30, in
> > > >> >> > > __init__
> > > >> >> > >      self.content = text.render(url.toLocalFile())
> > > >> >> > >    File "C:\projects\nixie\nixie\util\text.py", line 22, in
> > > render
> > > >> >> > >      content = pandoc(str(inFile))
> > > >> >> > >    File "C:\projects\nixie\nixie\util\text.py", line 63, in
> > > pandoc
> > > >> >> > >      cwd = cwd
> > > >> >> > >    File "c:\Python26\lib\subprocess.py", line 623, in __init__
> > > >> >> > >      errread, errwrite)
> > > >> >> > >    File "c:\Python26\lib\subprocess.py", line 833, in
> > > >> >> > > _execute_child
> > > >> >> > >      startupinfo)
> > > >> >> > > WindowsError: [Error 123] The filename, directory name, or 
> > > >> >> > > volume
> > > >> >> > > label syntax is incorrect
> > > >> >> > > ~~~~~
>
> > > >> >> > > Although it looks like pandoc(str(inFile)) might be the culprit
> > > >> >> > > from
> > > >> >> > > the stack trace, if I just use the output from
> > > pandoc(str(inFile)),
> > > >> >> > > everything works fine, so I doubt that this is the cause.
>
> > > >> >> > > I really appreciate your help.  I've started trying Pandoc
> > > >> >> > > (http://johnmacfarlane.net/pandoc/) instead of the
> > > python-markdown
> > > >> >> > > module, and I noticed that Pandoc comes with it's own template
> > > >> >> > > system.
> > > >> >> > >   So, it may make more sense for me to use Pandoc's templates
> > > >> >> > > instead,
> > > >> >> > > if I decide to go with it.
>
> > > >> >> > > On Sun, Jun 5, 2011 at 10:45 PM, Massimo Di Pierro
> > > >> >> > > <massimo.dipie...@gmail.com>  wrote:
> > > >> >> > >> check trunk. I removed it. I am sure we can do better.
>
> > > >> >> > >> On Jun 5, 2011, at 9:26 PM, Ryan Seto wrote:
>
> > > >> >> > >>> Thank you very much for your prompt response.
>
> > > >> >> > >>> It looks like the file gluon/template.py does pull in some
> > > extra
> > > >> >> > >>> dependencies, however.
>
> > > >> >> > >>> It tries to import restricted on line 20 and import globals on
> > > >> >> > >>> line
> > > >> >> > >>> 863.
>
> > > >> >> > >>> The restricted module dependency may be easy to remove, since
> > > it
> > > >> >> > >>> appears that it only uses it for raising exceptions.  However,
> > > it
> > > >> >> > >>> looks
>
> ...
>
> read more »

Reply via email to