def test_match_optional(): optional_a = pg.Optional("a") match, rest = optional_a("abc", 'optional_a') assert match == ['', "a"] assert rest == "bc" match, rest = optional_a("bc", 'optional_a') assert match == [] assert rest == "bc" letter_a = pg.NamedPattern( 'letter_a', "a") optional_a = pg.Optional(letter_a) match, rest = optional_a("abc", 'optional_a') assert match == ['letter_a', "a"] assert rest == "bc" optional_ignore = pg.Optional(pg.Ignore("a")) match, rest = optional_ignore("abc", 'optional_ignore') assert match == [] assert rest == "bc"
def attribute_list(): return pg.AllOf( pg.Ignore("("), attribute, pg.Optional( pg.Many( pg.AllOf(pg.Ignore(","), pg.Ignore(pg.Optional(" ")), attribute))), pg.Ignore(")"))
def ordered_list(): return pg.AllOf( pg.Ignore(pg.Optional(pg.Many("\n"))), pg.Indented(pg.AllOf( numbered_bullet, pg.Optional(pg.Many(numbered_bullet, ordered_list))), optional=True))
def document(): return pg.AllOf( pg.Optional(pg.Ignore(newlines_or_eof)), pg.Optional(doctype), pg.OneOf( extends, pg.Many( pg.AllOf(pg.OneOf(element, code_block, comment), pg.Optional(pg.Ignore(pg.Many("\n")))))))
def title_level_2(): return pg.AllOf( pg.Ignore("## "), pg.Words(), pg.Ignore( pg.AllOf( pg.Optional(" "), pg.Optional("##"), "\n")))
def nested_list(): return pg.AllOf( pg.Ignore( pg.Optional( pg.Many("\n"))), pg.Indented( pg.AllOf( list_item, pg.Optional( pg.Many( list_item, nested_list))), optional=True))
def indented_bullets(): return pg.Indented( pg.AllOf( bullet, pg.Optional( indented_bullets)), optional=True)
def test_match_indented_nested_bullets(): bullet = pg.NamedPattern( 'bullet', pg.AllOf( pg.Ignore( pg.Optional( pg.Many("\n"))), pg.Ignore("* "), pg.Words())) @pg.lazy def indented_bullets(): return pg.Indented( pg.AllOf( bullet, pg.Optional( indented_bullets)), optional=True) data = """ * Line One * Line Two """ expected = [ 'indented_bullets', ['bullet', "Line One"], ['indented_bullets', ['bullet', "Line Two"]]] match, rest = indented_bullets(data, 'indented_bullets') assert match == expected assert rest == "\n"
def test_indented_bullet(): paragraph = pg.NamedPattern( 'paragraph', pg.AllOf( pg.Ignore(pg.Optional("\n")), pg.Words())) indented_paragraphs = pg.Indented( pg.Many(paragraph), initial_indent="* ") data = """ * Paragraph One Paragraph Two """.strip() expected = [ 'indented_paragraphs', ['paragraph', "Paragraph One"], ['paragraph', "Paragraph Two"]] match, rest = indented_paragraphs(data, "indented_paragraphs") assert match == expected
def test_reprs(): # Pattern matchers assert repr(pg.Some("a")) == "<Some pattern='a'>" assert repr(pg.Ignore("#")) == "<Ignore pattern=<Text pattern='#'>>" assert repr(pg.Not("#")) == "<Not pattern=<Text pattern='#'>>" assert repr(pg.Optional("#")) == "<Optional pattern=<Text pattern='#'>>" # Option matchers assert repr(pg.OneOf("abc", pg.Not("#"))) == "<OneOf options=(<Text pattern='abc'>, <Not pattern=<Text pattern='#'>>)>" assert repr(pg.Many("abc", pg.Not("#"))) == "<Many options=(<Text pattern='abc'>, <Not pattern=<Text pattern='#'>>)>" assert repr(pg.Words()) == "<Words letters='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz .,'>"
def numbered_bullet_with_paragraph(): return pg.Indented( pg.AllOf( paragraph, pg.Optional( pg.AllOf( linebreaks, paragraph))), initial_indent=pg.AllOf( pg.Optional( linebreaks), pg.OneOf( pg.AllOf( pg.Ignore(digits), pg.Ignore("."), pg.Many('\t')), pg.AllOf( digits, ".", " "))))
def horizontal_rule(): return pg.AllOf( pg.OneOf( "---", "___", "***", "- - -", "_ _ _", "* * *"), pg.Optional( pg.Ignore( pg.Many( pg.Not("\n")))))
def test_match_optional(): optional_a = pg.Optional("a") match, rest = pg.match_optional("abc", optional_a, 'optional_a') assert match == ['', "a"] assert rest == "bc" match, rest = pg.match_optional("bc", optional_a, 'optional_a') assert match == [] assert rest == "bc" def letter_a(): return "a" optional_a = pg.Optional(letter_a) match, rest = pg.match_optional("abc", optional_a, 'optional_a') assert match == ['letter_a', "a"] assert rest == "bc" optional_ignore = pg.Optional(pg.Ignore("a")) match, rest = pg.match_optional("abc", optional_ignore, 'optional_ignore') assert match == [] assert rest == "bc"
def test_match_ignore(): ignore_a = pg.Ignore("a") match, rest = pg.match_ignore("a", ignore_a, "ignore_a") assert match == [] assert rest == "" ignore_a = pg.Ignore(pg.AllOf(pg.Optional("#"), "abc")) match, rest = pg.match_ignore("#abc", ignore_a, "ignore_a") assert match == [] assert rest == "" with py.test.raises(pg.NoPatternFound): match, rest = pg.match_ignore("123", ignore_a, "ignore_a")
def test_optional(): optional_a = pg.NamedPattern( 'optional_a', pg.Optional("a")) result = pg.parse_string("a", optional_a) expected = ['', "a"] assert expected == result letters = pg.NamedPattern( 'letters', pg.Words()) body = pg.NamedPattern( 'body', pg.AllOf(optional_a, letters)) result = pg.parse_string("abc", body) expected = [ 'body', "a", ['letters', "bc"]] assert expected == result
def sub_element(): return pg.AllOf(pg.Ignore(": "), open_tag, pg.Optional(sub_element))
def comment(): return pg.AllOf(pg.Optional(pg.Ignore(pg.Many(" "))), pg.Ignore("// "), pg.Join(pg.Many(pg.Not(newline_or_eof))), pg.Ignore(newline_or_eof))
def element(): return pg.AllOf(open_tag, pg.Optional(sub_element), pg.Ignore(newlines_or_eof), pg.Optional(nested_elements))
def custom_tag(tag_name): return pg.NamedPattern( tag_name, pg.AllOf(pg.Ignore(tag_name), pg.Ignore(" "), identifier_parts, pg.Ignore(newline_or_eof), pg.Optional(nested_elements)))
span_text = pg.Many( plain, emphasis, link, code) def code_line(): return pg.Escaped( pg.Join( pg.Many( pg.Not("\n")))) code_paragraph = pg.AllOf( pg.Ignore( pg.Optional( pg.Many("\n"))), pg.Many( code_line)) def code_block(): return pg.AllOf( pg.Indented( code_paragraph)) def horizontal_rule(): return pg.AllOf( pg.OneOf( "---", "___", "***", "- - -",
def numbered_bullet(): return pg.AllOf(pg.Ignore(pg.Optional(pg.Many("\n"))), pg.Ignore(pg.Words(letters="1234567890")), pg.Ignore(". "), pg.Words())
def extends(): return pg.AllOf(pg.Ignore("extends"), pg.Ignore(" "), filename_parts, pg.Ignore(newlines_or_eof), pg.Optional(pg.Many(pg.OneOf(replace, append))))
def open_tag(): return pg.AllOf( alphanumerics, pg.Optional(pg.Many(pg.OneOf(tag_id, tag_class, attribute_list))), pg.Optional(pg.OneOf(content, code)))
def bullet(): return pg.AllOf(pg.Ignore(pg.Optional(pg.Many("\n"))), pg.Ignore("* "), pg.Words())
def optional_a(): return pg.Optional("a")
def paragraph(): return pg.AllOf(pg.Ignore(pg.Optional("\n")), pg.Words())
def test_indented(): list_item = pg.NamedPattern( 'list_item', pg.AllOf( pg.Ignore( pg.Optional( pg.Many("\n"))), pg.Ignore("* "), pg.Words())) @pg.lazy def nested_list(): return pg.AllOf( pg.Ignore( pg.Optional( pg.Many("\n"))), pg.Indented( pg.AllOf( list_item, pg.Optional( pg.Many( list_item, nested_list))), optional=True)) data = """ * A bullet """ expected = [ 'nested_list', ['list_item', "A bullet"]] result = pg.parse_string(data, nested_list) assert expected == result data = """ * A bullet * A bullet in a sublist """ expected = [ 'nested_list', ['list_item', "A bullet"], ['nested_list', ['list_item', "A bullet in a sublist"]]] result = pg.parse_string(data, nested_list) assert expected == result data = """ * A bullet * A bullet in a sublist * Another bullet in a sublist * Another bullet in the first list """ expected = [ 'nested_list', ['list_item', "A bullet"], ['nested_list', ['list_item', "A bullet in a sublist"], ['list_item', "Another bullet in a sublist"]], ['list_item', "Another bullet in the first list"]] result = pg.parse_string(data, nested_list) assert expected == result
def list_item(): return pg.AllOf(pg.Ignore(pg.Optional(pg.Many("\n"))), pg.Ignore("* "), pg.Words())
def quoted_string(): return pg.OneOf( pg.AllOf(pg.Ignore("'"), pg.Optional(pg.Join(pg.Many(pg.Not("'")))), pg.Ignore("'")), pg.AllOf(pg.Ignore('"'), pg.Optional(pg.Join(pg.Many(pg.Not('"')))), pg.Ignore('"')))