class OptionalGroup(modgrammar.Grammar): grammar_whitespace_mode = 'explicit' grammar = (modgrammar.L('['), modgrammar.OPTIONAL(modgrammar.WHITESPACE), modgrammar.REF("RuleExpansion", module=sys.modules[__name__]), modgrammar.OPTIONAL(modgrammar.WHITESPACE), modgrammar.L(']')) def grammar_elem_init(self, session_data): self.model = model.OptionalGroup(self[2].model)
class Italic(modgrammar.Grammar): """Defines the grammar for italic text.""" grammar = (modgrammar.L("*"), modgrammar.WORD("^*" + modgrammar.util.EOL_CHARS, fullmatch=True), modgrammar.L("*")) def grammar_elem_init(self, sessiondata): """Saves the text for later use.""" self.text = self[1].string self.tag = "i"
class InlineCode(modgrammar.Grammar): """Defines the grammar for inline code segments.""" grammar = (modgrammar.L("`"), modgrammar.WORD("^`" + modgrammar.util.EOL_CHARS, fullmatch=True), modgrammar.L("`")) def grammar_elem_init(self, sessiondata): """Saves the text for later use.""" self.text = html.escape(self[1].string) self.tag = "code"
class Heading(modgrammar.Grammar): """Defines the grammar for a heading.""" grammar = (modgrammar.BOL, modgrammar.REPEAT(modgrammar.L("#"), min=1, max=6), modgrammar.L(" "), modgrammar.REST_OF_LINE, modgrammar.EOL) def grammar_elem_init(self, sessiondata): """Saves the headline for later use.""" self.text = self[3].string hashtags = self[1].string self.tag = "h" + str(len(hashtags))
class UnorderedListItem(modgrammar.Grammar): """Defines the grammar for an unordered list item.""" grammar = (modgrammar.BOL, modgrammar.OR(modgrammar.L("* "), modgrammar.L("- "), modgrammar.L("+ ")), modgrammar.REPEAT(modgrammar.OR(Bold, Italic, InlineCode, Link, AutomaticLink, SimpleText), collapse=True)) def grammar_elem_init(self, sessiondata): """Saves the text for later use.""" self.tag = "li"
class AutomaticLink(modgrammar.Grammar): """Defines the grammar for an automatic link.""" grammar = (modgrammar.L("<"), modgrammar.WORD(startchars="^[>\s`*", escapes=True, fullmatch=True), modgrammar.L(">")) def grammar_elem_init(self, sessiondata): """Saves the text for later use.""" self.text = self[1].string self.attributes = {"href": self[1].string} self.tag = "a"
class RuleReference(modgrammar.Grammar): grammar_whitespace_mode = 'explicit' grammar = (modgrammar.L('<'), modgrammar.OPTIONAL(Package, modgrammar.L('.')), JavaIdentifier, modgrammar.L('>')) def grammar_elem_init(self, session_data): if self[1] is not None: value = self[1].string + self[2].string else: value = self[2].string self.model = model.RuleReference(value)
class QuoteLine(modgrammar.Grammar): """Defines the grammar for a single line quote.""" grammar = (modgrammar.BOL, modgrammar.L(">"), modgrammar.REPEAT(modgrammar.OR(Bold, Italic, InlineCode, Link, AutomaticLink, SimpleText), collapse=True), modgrammar.EOL) grammar_collapse = False
class Link(modgrammar.Grammar): """Defines the grammar for a link.""" grammar = (modgrammar.L("["), modgrammar.WORD(startchars="^]`*" + modgrammar.util.EOL_CHARS, fullmatch=True), modgrammar.L("]("), modgrammar.WORD(startchars="^\s)", escapes=True, fullmatch=True), modgrammar.OPTIONAL(modgrammar.L(' "'), LinkTitle, modgrammar.L('"')), modgrammar.L(")")) def grammar_elem_init(self, sessiondata): """Saves the text for later use.""" self.text = self[1].string self.attributes = {"href": self[3].string} link_title = self.find(LinkTitle) if link_title is not None: self.attributes["title"] = link_title.text self.tag = "a"
class CodeBlock(modgrammar.Grammar): """Defines the grammar for a code block.""" grammar = (modgrammar.REPEAT(modgrammar.BOL, modgrammar.L(" ") | modgrammar.L("\t"), modgrammar.REST_OF_LINE, modgrammar.EOL, collapse=True)) def grammar_elem_init(self, sessiondata): """Saves the text for later use.""" self.tag = "code" text = "" for elem in self.find_all(modgrammar.REST_OF_LINE): if text != "": text += "\n" text += html.escape(elem.string) self.text = text self.options = {"indentation": False}
class Edition(mg.Grammar): '''Parse an edition comment.''' grammar = (mg.OPTIONAL(WhiteSpace), mg.OR(Digit, TwoDigit), mg.OR(mg.L('nd'), mg.L('rd'), mg.L('st'), mg.L('th')), mg.OPTIONAL(mg.OR(mg.L('facsimile'), mg.L('revised'))), mg.L('edition'), mg.L(';')) def grammar_elem_init(self, sessiondata): '''initialize the element.''' self.edition_num = self[1].string
class UnaryOperator(modgrammar.Grammar): grammar_whitespace_mode = 'explicit' grammar = (modgrammar.OPTIONAL(modgrammar.WHITESPACE), modgrammar.L('*') | modgrammar.L('+') | modgrammar.LIST_OF(Tag, sep=" ", min=1)) def grammar_elem_init(self, session_data): self.is_kleene_star = False self.is_plus = False self.tags = [] if self[1].string == '*': self.is_kleene_star = True elif self[1].string == '+': self.is_plus = True else: for i in range(0, len(self[1].elements), 2): self.tags.append(self[1][i].model)
class Tag(modgrammar.Grammar): grammar_whitespace_mode = 'explicit' grammar = (modgrammar.L('{'), modgrammar.ZERO_OR_MORE(modgrammar.ANY_EXCEPT('^}')), modgrammar.L('}')) def grammar_elem_init(self, session_data): self.model = model.Tag(name=self[1].string)
class Compilers(mg.Grammar): '''Parse a compilers comment.''' grammar = (mg.OPTIONAL(WhiteSpace), mg.L('compiled by'), NameList, mg.L(';'))
class Other(mg.Grammar): '''Parse an 'other' commment.''' grammar = (mg.OPTIONAL(WhiteSpace), mg.L('other'), Words, mg.L(';'))
class AJBNum(mg.Grammar): '''Parse an AJB number.''' grammar = (mg.L('AJB'), Volume, '.', Section, '.', Item)
class Name(mg.Grammar): '''Parse a name from a comment.''' # accept hypenated first initial and hyphenated last name grammar = (mg.OPTIONAL(Initial, mg.OPTIONAL(mg.L('-'), Initial)), mg.OPTIONAL(mg.REPEAT(Initial, mg.OPTIONAL(mg.L('-'), Initial))), Words)
class Language(mg.Grammar): '''Parse a language comment''' grammar = (mg.OPTIONAL(WhiteSpace), mg.L('in'), LanguageList, mg.OPTIONAL(mg.L('with'), Words, mg.L('references')), mg.L(';'))
class Reprint(mg.Grammar): '''Parse a reprint comment.''' grammar = (mg.OPTIONAL(WhiteSpace), mg.L('reprint of'), mg.OR(AJBNum, Year), mg.L(';'))
class Reference(mg.Grammar): '''Parse a reference comment.''' grammar = (mg.OPTIONAL(WhiteSpace), mg.L('reference'), AJBNum, mg.L(';'))
class FromLanguage(mg.Grammar): '''Parse a from language comment.''' grammar = (mg.L('from'), Word)
class ToLanguage(mg.Grammar): '''Parse a to language comment.''' grammar = (mg.L('into'), Word)
class Publisher(mg.Grammar): '''Parse a publisher comment of the form City: Name''' grammar = (Words, mg.L(':'), Words)
class AlternativeWeight(modgrammar.Grammar): grammar_whitespace_mode = 'explicit' grammar = (modgrammar.L("/"), modgrammar.WORD("0-9.", "0-9.ef"), modgrammar.LITERAL("/"), modgrammar.WHITESPACE) def grammar_elem_init(self, session_data): self.value = self[1].string
class Publishers(mg.Grammar): '''Parse a publisher comment.''' grammar = (mg.OPTIONAL(WhiteSpace), mg.L('also published'), PublisherList, mg.L(';'))
class Translation(mg.Grammar): '''Parse a translation comment.''' grammar = (mg.OPTIONAL(WhiteSpace), mg.L('translated'), mg.OPTIONAL(FromLanguage), mg.OPTIONAL(ToLanguage), mg.OPTIONAL(mg.L('by'), NameList), mg.L(';'))
class Contributors(mg.Grammar): '''Parse a contributors comment.''' grammar = (mg.OPTIONAL(WhiteSpace), mg.L('contributors'), NameList, mg.L(';'))
class MetaCharacter(modgrammar.Grammar): grammar_whitespace_mode = 'explicit' grammar = (modgrammar.OR(modgrammar.L(';'), modgrammar.L('='), modgrammar.L('|'), modgrammar.L('*'), modgrammar.L('+'), modgrammar.L('<'), modgrammar.L('>'), modgrammar.L('('), modgrammar.L(')'), modgrammar.L('['), modgrammar.L(']'), modgrammar.L('{'), modgrammar.L('}'), modgrammar.L('/*'), modgrammar.L('*/'), modgrammar.L('//'), modgrammar.L(" "), modgrammar.L('"')))
class Editors(mg.Grammar): '''Parse an editors comment.''' grammar = (mg.OPTIONAL(WhiteSpace), mg.L('edited by'), NameList, mg.L(';'))