[Zope] filtering results

Cliff Ford Cliff.Ford at ed.ac.uk
Sat Apr 8 11:18:53 EDT 2006


This is my implementation of an external method that calls HTML Tidy. I 
hope it is of some use.

This is a fragment of a form processing script that calls an External 
Method, passing the body content of a html page:

if request.submit == 'Tidy':
     (messages, buffer) = context.calltidy(body)
     request.set('messages', messages)
     request.set('body', buffer)
     return

The body and any HTML Tidy messages are passed back to the form for 
display. The external method module name is caltidy and the function 
name is tidy.

This is the external method that calls HTML Tidy. It prepends a suitable 
head and appends a suitable tail to the body (shich happens to be part 
of a table) to make a valid html document, then chops them off the 
result for return to the caller:

# call htmltidy
import os
import string

# path to executable
#exe = '/usr/local/zopeinst/Extensions/htmltidy/tidy'
exe = '/disk/home/www/zopeinst/Extensions/htmltidy/tidy'

# path to HTML Tidy configuration file
#config = '/usr/local/zopeinst/Extensions/htmltidy/config.txt'
config = '/disk/home/www/zopeinst/Extensions/htmltidy/config.txt'
errors = ''
#

dummyhead = """
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Testing</title>
</head>
<body>
<table summary="dummy table"><tr><td>
<!-- dummyhead -->
"""
dummytail = """
<!-- dummytail -->
</td></tr></table>
</body>
</html>
.
"""
parsefailed = """
Tidy has not changed the source. This will happen if the input
contains any tags not recognised by the html specification. Do
not use Tidy on pages containing dtml! Correct only the errors
listed below and then run Tidy again. Tidy will convert font tags
to style classes, which will be ignored unless you create a local
style sheet. Tidy will also correct many other faults that lead
to the warnings below. The first line of your text is line 11.

"""

def tidy(input):
     combo = dummyhead + input + dummytail
     command = "%s -config %s 2>&1 << .\n%s" % (exe, config, combo)
     buffer = ''
     # get results from tidy into buffer
     for line in os.popen(command).readlines():
         buffer += line
     # if anything goes wrong with the tidy call the line count is zero
     try:
         # chop the dummy head
         (head, buffer) = string.split(buffer, '<!-- dummyhead -->')
         # keep the warnings part of the head
         (head, tail) = string.split(head, '<!DOCTYPE')
         # and chop the dummy tail
         (buffer, tail) = string.split(buffer, '<!-- dummytail -->')
         return (head, buffer)
     except:
         return (parsefailed + buffer, input)

Cliff

gf wrote:
> Hi,
> I am a Zope newbie. I apologize if the terminology I use below is not
> correct, but I hope that you get the gist of what I am about to ask.
> 
> I would like to be able to 'filter' results before returning them to
> the user.  In other words, if a user requests a given object, it is
> passed through a filter before being passed on to him or her. As a
> simple example, I may want to tidy the html before the user sees it,
> or eliminate or add certain tags or words.
> 
> I have put together a simple 'html tidy' external method that takes
> raw html and produces a tidied version, but I don't know how I can
> apply it.
> 
> Thank you for any comments, suggestions, or simple examples you may be
> able to provide.
> 
> Best  Regards,
> gyro
> _______________________________________________
> Zope maillist  -  Zope at zope.org
> http://mail.zope.org/mailman/listinfo/zope
> **   No cross posts or HTML encoding!  **
> (Related lists - 
>  http://mail.zope.org/mailman/listinfo/zope-announce
>  http://mail.zope.org/mailman/listinfo/zope-dev )
> 


More information about the Zope mailing list