import re, string, types script = 'http://www.zentralblatt-math.org/zmath/en/search/' def cgiquery(**kw): list = [] for (name, value) in kw.items(): elt = "%s=" % name kind = type(value) if kind in (types.IntType, types.FloatType, types.LongType, types.StringType): elt = "%s%s" % (elt, value) else: elt = "%s%s" % (elt, value.__repr__()) list.append(elt) return string.joinfields(list, "&") def scriptlink(script, query): return "%s?%s" % (script, query) def anchor(href, text, color=None, url=None): if url: for ch in '%_^}{': text = text.replace(ch, '\\%s' % (ch)) if color: return r"{\href{%s}{%s}{%s}}" % (href, text, color) return r"\href{%s}{%s}" % (href, text) def au_ar(item, pre, what, what_iso, post): list = [pre] aulist = [] for i in range(min(len(item[what]), len(item[what_iso]))): link = item[what_iso][i][0] author = item[what][i] cgivars = cgiquery(q="author:%s*"%(link), type="pdf", format="short") ref = scriptlink(script, cgivars) aulist.append(anchor(ref, author, "\\Blue")) list.append(string.join(aulist, '; ')) list.append(post) return list def pdfamstex(result, format): complete = 0 if format == 'complete': complete = 1 list = ['\\batchmode\\input zb-pdf.tex\n'] for item in result: # *an list.append("\\par\\vskip1em\\hrule\\vskip0.5em\\penalty-500\\parindent0pt\\line{{\\bf ") if complete: list.append(item['an_formatted']) else: cgivars = cgiquery(type="pdf", format="complete", q="an:%s"%(item['an_display'])) # XXX link als variable: ref = scriptlink(script, cgivars) list.append(anchor(ref, item['an_formatted'], "\\Blue")) list.append("\\hss}}\\penalty10000\\vskip0.5em \n") # *au, list.extend(au_ar(item, '\\par{\\bf ', 'au', 'au_iso', '}\n')) # ar, if complete and item['ar']: list.extend(au_ar(item, '(', 'ar', 'ar_iso', ')\n')) # *ti, list.append("\\par{\\bf ") list.append(item['ti']) list.append("}\n") # *la, if item['la']: list.append(" (") list.append(item['language']) list.append(")\n") # *so, if item['so']: list.append("\\par ") list.append(item['so']) list.append(" ") list.append(item['is']) # ia if complete and item['ia']: list.append("\\par ") for url in item['ia']: if url.startswith('doi:'): url = 'http://dx.doi.org/' + url[4:] if url.endswith('[serial]'): url = url[:-8] list.append(anchor(url, url, "\\Red", url=True)) list.append("\\newl ") list.append("\\vskip1em\n") # ab, if complete and item['ab']: list.append("\\vskip.5em\n") list.append(item['ab']) # XXX Zitate verlinken list.append("\\vskip.5em\n") # rv, if complete and item['rv']: list.append("\\par{\\it ") list.append(item['rv']) # XXX verlinken... list.append("}\n") # ut, if complete and item['ut']: list.append("\\par {\\it Keywords} : ") list.append(string.join(item['ut'], '; ')) # cc, if complete and item['cc']: list.append("\\par {\\it Classification} :\\par\\penalty10000{\\parindent1cm\\zblCCstar") cclist = [] for (cc, text) in item['cc_text']: cc = cc.replace('*', '') cgivars = cgiquery(type="pdf", format="short", q='cc:%s'%(cc)) ref = scriptlink(script, cgivars) ccref = anchor(ref, cc, "\\Red") cclist.append("%s %s" % (ccref, text)) list.append(string.join(cclist, '\\par\n')) list.append("}\n") # cit list.append('\n\\bye') return string.join(list, '') def amstex(result, format): complete = 0 if format == 'complete': complete = 1 list = ['\\batchmode\\input zb-www.tex\n'] for item in result: # *an list.append("\\par\\vskip1em\\hrule\\vskip0.5em\\penalty-500\\parindent0pt\\line{{\\bf Zbl.~Math.~") list.append(item['an_formatted']) list.append("\\hss}}\penalty10000\\vskip1em\\hrule\penalty10000\\vskip1em \n") # *au, list.append('\\par{\\bf ') list.append(string.join(item['au'], '; ')) list.append('}\n') # ar, if complete and item['ar']: list.append('\\par{\\bf ') list.append(string.join(item['ar'], '; ')) list.append('}\n') # *ti, list.append("\\par{\\bf ") list.append(item['ti']) list.append("}\n") # *la, if item['la']: list.append(" (") list.append(item['language']) list.append(")\n") # *so, if item['so']: list.append("\\par ") list.append(item['so']) # ia if complete and item['ia']: list.append("\\par ") for url in item['ia']: list.append('%s ' % (url)) list.append("\\vskip1em\n") # ab, if complete and item['ab']: list.append("\\vskip.5em\n") list.append(item['ab']) list.append("\\vskip.5em\n") # rv, if complete and item['rv']: list.append("\\par{\\it ") list.append(item['rv']) list.append("}\n") # ut, if complete and item['ut']: list.append("\par {\\it Keywords:}\par\penalty10000{\parindent1cm ") list.append(string.join(item['ut'], '; ')) list.append("}\n") # cc, if complete and item['cc']: list.append("\\par {\\it Classification} :\\par\\penalty10000{\\parindent1cm\\zblCCstar") cclist = [] for (cc, text) in item['cc_text']: cclist.append("%s %s" % (cc, text)) list.append(string.join(cclist, '\\par\n')) list.append("}\n") # cit list.append('\n\\bye') return string.join(list, '') def result2tex(result, type, format): if type == 'pdf': return pdfamstex(result, format) return amstex(result, format) def parse_so(so): pat_sl = "([a-zA-Z, \.\(\)]+)" pat_vol = "([0-9]+), " pat_no ="No. *([0-9\-]+), " # pat_pp = "([0-9]+\-[0-9]+|[0-9]+ ?p\.)" pat_pp = "([0-9]+\-[0-9]+|[0-9]+ ?p\.|[0-9]+, [0-9]+ ?p\.)" pat_garbage = "([ a-zA-Z\.0-9,]+?)" pat_py="\(([0-9][0-9][0-9][0-9])\)" pat = pat_sl + pat_vol + pat_no + pat_pp + pat_garbage + pat_py pat_so1=re.compile(pat) pat = pat_sl + pat_vol + pat_pp + pat_garbage + pat_py pat_so2=re.compile(pat) m = pat_so1.match(so) if m: return m.groups() m = pat_so2.match(so) if m: return (m.group(1), m.group(2), None, m.group(3), m.group(4), m.group(5)) return ("", "", "", "", "", "")