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