class LinkTitle(modgrammar.Grammar): """Defines the grammar for a link title.""" grammar = (modgrammar.WORD(startchars='^")' + modgrammar.util.EOL_CHARS, escapes=True, fullmatch=True)) def grammar_elem_init(self, sessiondata): """Saves the text for later use.""" self.text = self[0].string
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 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 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 SelfIdentifyingHeader(modgrammar.Grammar): grammar_whitespace_mode = 'explicit' grammar = (modgrammar.LITERAL("#JSGF"), modgrammar.WHITESPACE, modgrammar.WORD("A-Za-z0-9._\-"), modgrammar.OPTIONAL(modgrammar.WHITESPACE, modgrammar.WORD("A-Za-z0-9._\-")), modgrammar.OPTIONAL(modgrammar.WHITESPACE, modgrammar.WORD("A-Za-z0-9._\-")), modgrammar.LITERAL(";"), modgrammar.LITERAL('\n')) def grammar_elem_init(self, session_data): self.version = self[2].string if self[3] is not None: self.encoding = self[3][1].string else: self.encoding = None if self[4] is not None: self.locale = self[4][1].string else: self.locale = None
class OrderedListItem(modgrammar.Grammar): """Defines the grammar for an unordered list item.""" grammar = (modgrammar.BOL, modgrammar.WORD(startchars="0-9", fullmatch=True), 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 SimpleText(modgrammar.Grammar): """Defines the grammar for simple text.""" grammar = (modgrammar.REPEAT(SingleWhitespace, min=0, max=3, collapse=True), modgrammar.WORD(startchars="^\s#>*[`", restchars="^*[<`" + modgrammar.util.EOL_CHARS, escapes=True, fullmatch=True)) def grammar_elem_init(self, sessiondata): """Saves the text for later use.""" spaces = "" for elem in self.find_all(SingleWhitespace): spaces += elem.string self.text = spaces + self[1].string self.tag = "text"
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 Word3(mg.Grammar): '''A word with & and - included.''' # hyphenated word or abbreviations grammar = (Word2, mg.OPTIONAL(mg.WORD("&-"), Word2))
class Year(mg.Grammar): '''parse a 4 digit year.''' grammar = (mg.WORD('0-9', count=4))
class TwoDigit(mg.Grammar): '''Parse a two digit number.''' grammar = (mg.WORD('0-9', count=2)) grammar_collapse = True
class Digit(mg.Grammar): '''Parse single digit number.''' grammar = (mg.WORD("0-9", count=1)) grammar_collapse = True
class String(mg.Grammar): grammar = mg.WORD(STRING_CHARS) def value(self): return self.string.strip()
class PosInteger(mg.Grammar): grammar = mg.WORD(NZ_DIGIT_CHARS, DIGIT_CHARS) def value(self): return int(self.string)
class NonNegInteger(mg.Grammar): grammar = mg.WORD(DIGIT_CHARS) def value(self): return int(self.string)
class JavaIdentifier(modgrammar.Grammar): grammar_whitespace_mode = 'explicit' grammar = (modgrammar.WORD("A-Za-z$", "A-Za-z0-9_$")) def grammar_elem_init(self, session_data): self.value = self[0].string
class Phrase(mg.Grammar): grammar = mg.WORD(PHRASE_CHARS) def value(self): return self.string.strip()