__version__ = '0.1'
# needed for inheritance and adding in folders
from OFS.Folder import Folder
# usual cut and paste imports
from Globals import DTMLFile
from Globals import MessageDialog
from Persistence import Persistent
# usual imports
import Globals
import AccessControl.Role
import string
from ts_regex import gsub
from Dictionary import DictOrg
from urllib import quote
# dtml files for adding forms
manage_addZDictionaryForm = DTMLFile('dtml/ZDictionaryAdd', globals())
def manage_addZDictionary(self, id, title='', REQUEST=None):
''' Adds a new ZDictionary object '''
self._setObject(id, ZDictionary(id, title))
if REQUEST is not None:
return self.manage_main(self, REQUEST)
class ZDictionary(Folder):
meta_type = 'ZDictionary'
defnForm = DTMLFile('dtml/ZDictionaryDefn', globals())
matchForm = DTMLFile('dtml/ZDictionaryMatch', globals())
searchForm = DTMLFile('dtml/ZDictionarySearch', globals())
_properties = (
{'id':'title', 'type': 'string', 'mode': 'w'},
{'id':'database', 'type': 'string', 'mode': 'w'},
)
__ac_permissions__ = (
('View', ('searchForm','defnForm','matchForm',)),
('Search ZDictionary', ('manage_search','manage_match',)),
('Manage properties', ('manage_addProperty', 'manage_editProperties', 'manage_delProperties', 'manage_changeProperties',)),
)
manage_options = (
( {'label':'Search', 'action':'searchForm', 'help':'ZDictionary.stx'},
{'label':'Properties', 'action':'manage_propertiesForm', 'help':'ZDictionary.stx'}, ) +
(Folder.manage_options[0],) +
AccessControl.Role.RoleManager.manage_options
)
def __init__(self, id, title):
self.id = id
self.title = title
self._set_properties()
def _set_properties(self):
self.database = '*'
def _match_htmlify(self, d):
i = 0
out = {}
for data in d:
lines = string.split(data, '\r\n')
if i == 0: del lines[0]
for line in lines:
temp = string.split(line, ' "')
if len(line) > 1:
l = out.get(temp[0], [])
l.append(temp[1][:-1])
out[temp[0]] = l
i = i + 1
print out
return out
def _std_htmlify(self, d):
gunk = '\\na-zA-Z0-9@.%%\\-\\/?&+=~ '
protocol = 'http'
i = 0
out = []
for data in d:
# urlify urls
data = gsub('%s:\([%s]+\)' % (protocol, gunk), '%s://\\1' % (protocol, protocol), data)
data = gsub('{\([%s]+\)}' % gunk, '\\1', data)
lines = string.split(data, '\r\n')
if i == 0: del lines[0]
temp = string.split(lines[0], '"')
del lines[0]
temp = map(lambda x: string.strip(x), temp)
out.append(
{'definition':string.join(lines, '
'),
'term':temp[1],
'from':temp[2],
'from_detail':temp[3] }
)
i = i + 1
return out
def _signature(self, terms, options):
''' this puts the signature of the query in the cache in a unique form so we can pull it out again later '''
_s = ''
for i in terms: _s = '%s%s' % (_s, i)
# do I have to make sure keys are sorted?
k = options.keys()
k.sort()
for _k in k:
_s = '%s%s%s' % (_s, _k, options[_k])
return _s
def _call(self, terms, options):
if not hasattr(self, '_v_cache'):
self._v_cache = {}
sig = self._signature(terms, options)
_d = None
# is it in the cache?
if not self._v_cache.has_key(sig):
# nope, well lets go and get it
d = DictOrg(terms=terms, options=options)
d.run()
d.parse()
self._v_cache[self._signature(terms, options)] = d.data # put it in the cache
_d = d.data
else:
# hooray, just pull it from the cache
_d = self._v_cache[sig]
return _d
def manage_search(self, searchterm=None):
''' this calls DictOrg with the information '''
options = { 'd':self.database, }
return self._std_htmlify(self._call([searchterm,], options))
def manage_match(self, matchterm=None, matchtype=None):
''' this calls a match with the information '''
options = { 'd':self.database, 'm':matchtype}
return self._match_htmlify(self._call([matchterm,], options))