from site import Site from retrieval import Retrieval, Factory from tools import Query, convert import string, re, sys class Authors(Site): def __init__(self, name, database, location): self.edbmdb = None Site.__init__(self, name, database, location) return def edbminit(self, path, force=0): if self.edbmdb == None or force: self.edbmdb = Retrieval(path) return def edbmopen(self, name, format=''): return self.edbmdb.open(name, format, self.Factory) def edbmfind(self, db, query, first, last): try: return db.find(query, first, last) except Exception: return None _edbm_fields = { 'an' : 'accno', 'au' : 'author', 'ai' : 'authorid', 'nm' : 'name', } _edbm_indices = { 'an' : 'an', 'accno' : 'an', 'au' : 'au', 'author' : 'au', 'ai' : 'ai', 'authorid' : 'ai', 'nm' : 'nm', 'name' : 'nm', } _edbm_options = { 'and' : '&', 'or' : '|', 'not' : '^', 'with' : '', 'without' : '0', 'only' : '1', } def form2query(self, request): form = request.form if form.has_key('q'): return form['q'] list = [] if form.has_key('form'): operator = '&' for i in range(5): for name in self._edbm_fields.keys(): if form.has_key('a%d_fi' % (i)) and form['a%d_fi' % (i)] == name: value = form['a%d_va' % (i)].strip() operator = self._edbm_options.get(form['a%d_op' % (i)], '&') if value: list.append('%s:%s' % (name, value)) list.append(operator) py = '' if form.has_key('py1') and form['py1']: py = re.sub(r'\s+', ' ', form['py1'].strip()) if form.has_key('py2') and form['py2']: py = '%s-%s' % (py, re.sub(r'\s+', ' ', form['py2'].strip())) py = re.sub(r'[^-\d]', '', py) elif form.has_key('py2') and form['py2']: py = re.sub(r'\s+', ' ', form['py2'].strip()) py = re.sub(r'[^-\d]', '', py) dt = [] for t in ['j','b','a']: if form.has_key('dt_%s' % (t)) and form['dt_%s' % (t)]: dt.append(t) dt = string.join(dt, '|') co = '' if form.has_key('co') and form['co']: co = self._edbm_options.get(form['co'], '1') if py or dt or co: list.append('(') if py: list.append('py:%s' % (py)) if dt: list.append('dt:%s' % (dt)) if co: list.append('co:%s' % (co)) list.append(')') else: list = list[:-1] else: for name in self._edbm_fields.keys(): value = '' if form.has_key(name): value = form[name] elif form.has_key(self._edbm_fields[name]): value = form[self._edbm_fields[name]] if value: if type(value) in (types.StringType, types.InstanceType,): value = re.sub(r'\s+', ' ', value.strip()) else: value = re.sub(r'\s+', ' ', string.join(value).strip()) if value: if list: list.append('&') list.append('%s:%s' % (name, value)) query = string.join(list, ' ').strip() query = re.sub(r'\s+', ' ', query) return query def query2edbm(self, query, init='au'): query = Query(query, init).parse() if query: return str(query) return '' class Factory(Factory): def make_au_iso(self, item, name, value): return convert.tex2utf8(item[name[:-4]]) make_sp_iso = make_nm_iso = make_au_iso