| @@ -61,29 +61,33 @@ class Dictionary(Command): | |||
| return self.define(term.capitalize(), lang, tries - 1) | |||
| return "no definition found." | |||
| languages = self.get_languages(entry) | |||
| level, languages = self.get_languages(entry) | |||
| if not languages: | |||
| return u"couldn't parse {0}!".format(page.url) | |||
| result = [] | |||
| for lang, section in sorted(languages.items()): | |||
| this = u"({0}) {1}".format(lang, self.get_definition(section)) | |||
| result.append(this) | |||
| definition = self.get_definition(section, level) | |||
| result.append(u"({0}) {1}".format(lang, definition)) | |||
| return u"; ".join(result) | |||
| def get_languages(self, entry): | |||
| def get_languages(self, entry, level=2): | |||
| regex = r"(?:\A|\n)==\s*([a-zA-Z0-9_ ]*?)\s*==(?:\Z|\n)" | |||
| split = re.split(regex, entry) | |||
| if len(split) % 2 == 0: | |||
| return None | |||
| if level == 2: | |||
| return self.get_languages(entry, level=3) | |||
| else: | |||
| return 3, None | |||
| return 2, None | |||
| split.pop(0) | |||
| languages = {} | |||
| for i in xrange(0, len(split), 2): | |||
| languages[split[i]] = split[i + 1] | |||
| return languages | |||
| return level, languages | |||
| def get_definition(self, section): | |||
| def get_definition(self, section, level): | |||
| parts_of_speech = { | |||
| "v.": "Verb", | |||
| "n.": "Noun", | |||
| @@ -101,21 +105,25 @@ class Dictionary(Command): | |||
| "prop. n.": "Proper noun", | |||
| "abbr.": "\{\{abbreviation\}\}", | |||
| } | |||
| blocks = "=" * (level + 1) | |||
| defs = [] | |||
| for part, fullname in parts_of_speech.iteritems(): | |||
| if re.search("===\s*" + fullname + "\s*===", section): | |||
| regex = "===\s*" + fullname + "\s*===(.*?)(?:(?:===)|\Z)" | |||
| body = re.findall(regex, section, re.DOTALL) | |||
| if body: | |||
| definition = self.parse_body(body[0]) | |||
| if definition: | |||
| msg = u"\x02{0}\x0F {1}" | |||
| defs.append(msg.format(part, definition)) | |||
| if re.search("{0}\s*{1}\s*{0}".format(blocks, fullname), section): | |||
| regex = "{0}\s*{1}\s*{0}(.*?)(?:(?:{0})|\Z)" | |||
| regex = regex.format(blocks, fullname) | |||
| bodies = re.findall(regex, section, re.DOTALL) | |||
| if bodies: | |||
| for body in bodies: | |||
| definition = self.parse_body(body) | |||
| if definition: | |||
| msg = u"\x02{0}\x0F {1}" | |||
| defs.append(msg.format(part, definition)) | |||
| return "; ".join(defs) | |||
| def parse_body(self, body): | |||
| substitutions = [ | |||
| ("<!--(.*?)-->", ""), | |||
| ("\[\[(.*?)\|(.*?)\]\]", r"\2"), | |||
| ("\{\{alternative spelling of\|(.*?)\}\}", r"Alternative spelling of \1."), | |||
| ("\{\{synonym of\|(.*?)\}\}", r"Synonym of \1."), | |||