forked from Mirrors/apostrophe
Adjust regex tests for CommonMark, improve inline regexp
parent
23cddba0d0
commit
7c3d4d9364
|
@ -22,10 +22,14 @@ from uberwriter import markup_regex
|
||||||
|
|
||||||
|
|
||||||
class TestRegex(unittest.TestCase):
|
class TestRegex(unittest.TestCase):
|
||||||
"""Test cases from Windows CommunityToolkit
|
"""Test cases based on CommonMark's specs and demo:
|
||||||
https://github.com/windows-toolkit/WindowsCommunityToolkit/blob/master/UnitTests/Markdown/Parse/
|
- https://spec.commonmark.org/
|
||||||
|
- https://spec.commonmark.org/dingus/
|
||||||
|
|
||||||
TODO: use decorators. This needs decorators everywhere
|
CommonMark is the Markdown variant chosen as first-class. It's great and encouraged that
|
||||||
|
others are supported as well, but when in conflict or undecided, CommonMark should be picked.
|
||||||
|
|
||||||
|
TODO: Use decorators. This needs decorators everywhere.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def test_bold(self):
|
def test_bold(self):
|
||||||
|
@ -36,39 +40,37 @@ class TestRegex(unittest.TestCase):
|
||||||
"This is __bold__ text": "bold",
|
"This is __bold__ text": "bold",
|
||||||
"before**middle**end": "middle",
|
"before**middle**end": "middle",
|
||||||
"before** middle **end": " middle ",
|
"before** middle **end": " middle ",
|
||||||
"before******after": "**"
|
"empty * * bold": None
|
||||||
}
|
}
|
||||||
|
|
||||||
for test, result in test_texts.items():
|
for test, result in test_texts.items():
|
||||||
with self.subTest(name=test):
|
with self.subTest(name=test):
|
||||||
match = re.search(markup_regex.BOLD, test)
|
match = re.search(markup_regex.BOLD, test)
|
||||||
if not match:
|
if not match:
|
||||||
self.assertFalse(result)
|
self.assertFalse(result, msg=test)
|
||||||
else:
|
else:
|
||||||
self.assertEqual(match.group("text"), result)
|
self.assertEqual(match.group("text"), result, msg=test)
|
||||||
|
|
||||||
def test_header(self):
|
def test_header(self):
|
||||||
test_texts = {
|
test_texts = {
|
||||||
"#Header 1": "Header 1",
|
"# Header 1": "Header 1",
|
||||||
"##Header 2": "Header 2",
|
"## Header 2": "Header 2",
|
||||||
"###Header 3": "Header 3",
|
"### Header 3": "Header 3",
|
||||||
"####Header 4": "Header 4",
|
"#### Header 4": "Header 4",
|
||||||
"#####Header 5": "Header 5",
|
"##### Header 5": "Header 5",
|
||||||
"######Header 6": "Header 6",
|
"###### Header 6": "Header 6",
|
||||||
"#######Header 6": "#Header 6",
|
"#": None,
|
||||||
"#": "",
|
"#######": None,
|
||||||
"## # # ##": "# #",
|
"before\n# Header\nafter": "Header"
|
||||||
"#######": "",
|
|
||||||
"before\n#Header\nafter": "Header"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for test, result in test_texts.items():
|
for test, result in test_texts.items():
|
||||||
with self.subTest(name=test):
|
with self.subTest(name=test):
|
||||||
match = re.search(markup_regex.HEADER, test)
|
match = re.search(markup_regex.HEADER, test)
|
||||||
if not match:
|
if not match:
|
||||||
self.assertFalse(result)
|
self.assertFalse(result, msg=test)
|
||||||
else:
|
else:
|
||||||
self.assertEqual(match.group("text"), result)
|
self.assertEqual(match.group("text"), result, msg=test)
|
||||||
|
|
||||||
def test_header_under(self):
|
def test_header_under(self):
|
||||||
test_texts = {
|
test_texts = {
|
||||||
|
@ -76,16 +78,16 @@ class TestRegex(unittest.TestCase):
|
||||||
"Header 1##\n=": "Header 1##",
|
"Header 1##\n=": "Header 1##",
|
||||||
"Header 2\n-- \n": "Header 2",
|
"Header 2\n-- \n": "Header 2",
|
||||||
"Header 1\n=f": None,
|
"Header 1\n=f": None,
|
||||||
"Header 1\n =": None
|
"Header 1\n =": "Header 1"
|
||||||
}
|
}
|
||||||
|
|
||||||
for test, result in test_texts.items():
|
for test, result in test_texts.items():
|
||||||
with self.subTest(name=test):
|
with self.subTest(name=test):
|
||||||
match = re.search(markup_regex.HEADER_UNDER, test)
|
match = re.search(markup_regex.HEADER_UNDER, test)
|
||||||
if not match:
|
if not match:
|
||||||
self.assertFalse(result)
|
self.assertFalse(result, msg=test)
|
||||||
else:
|
else:
|
||||||
self.assertEqual(match.group("text"), result)
|
self.assertEqual(match.group("text"), result, msg=test)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
|
@ -1,15 +1,15 @@
|
||||||
import re
|
import re
|
||||||
|
|
||||||
ITALIC = re.compile(
|
ITALIC = re.compile(
|
||||||
r"(\*|_)(?P<text>.+?)\1")
|
r"(\*|_)(?P<text>.*?\S.*?)\1")
|
||||||
BOLD = re.compile(
|
BOLD = re.compile(
|
||||||
r"(\*\*|__)(?P<text>.+?)\1")
|
r"(\*\*|__)(?P<text>.*?\S.*?)\1")
|
||||||
BOLD_ITALIC = re.compile(
|
BOLD_ITALIC = re.compile(
|
||||||
r"((\*\*|__)([*_])|([*_])(\*\*|__))(?P<text>.+?)(?:\5\4|\3\2)")
|
r"((\*\*|__)([*_])|([*_])(\*\*|__))(?P<text>.*?\S.*?)(?:\5\4|\3\2)")
|
||||||
STRIKETHROUGH = re.compile(
|
STRIKETHROUGH = re.compile(
|
||||||
r"~~(?P<text>.+?)~~")
|
r"~~(?P<text>.*?\S.*?)~~")
|
||||||
CODE = re.compile(
|
CODE = re.compile(
|
||||||
r"`(?P<text>[^`].*?)`")
|
r"`(?P<text>[^`].+?)`")
|
||||||
LINK = re.compile(
|
LINK = re.compile(
|
||||||
r"\[(?P<text>.*)\]\((?P<url>.+?)(?: \"(?P<title>.+)\")?\)")
|
r"\[(?P<text>.*)\]\((?P<url>.+?)(?: \"(?P<title>.+)\")?\)")
|
||||||
IMAGE = re.compile(
|
IMAGE = re.compile(
|
||||||
|
@ -23,9 +23,9 @@ ORDERED_LIST = re.compile(
|
||||||
BLOCK_QUOTE = re.compile(
|
BLOCK_QUOTE = re.compile(
|
||||||
r"^ {0,3}(?:> ?)+(?P<text>.+)", re.M)
|
r"^ {0,3}(?:> ?)+(?P<text>.+)", re.M)
|
||||||
HEADER = re.compile(
|
HEADER = re.compile(
|
||||||
r"^ {0,3}(?P<level>#{1,6})(?P<text>[^\n]+)", re.M)
|
r"^ {0,3}(?P<level>#{1,6}) (?P<text>[^\n]+)", re.M)
|
||||||
HEADER_UNDER = re.compile(
|
HEADER_UNDER = re.compile(
|
||||||
r"(?:^\n*|\n\n)(?P<text>[^\s].+)\n[=\-]+(?: +?\n|$)")
|
r"(?:^\n*|\n\n)(?P<text>[^\s].+)\n {0,3}[=\-]+(?: +?\n|$)")
|
||||||
CODE_BLOCK = re.compile(
|
CODE_BLOCK = re.compile(
|
||||||
r"(?:^|\n) {0,3}(?P<block>([`~]{3})(?P<text>.+?) {0,3}\2)(?:\s+?\n|$)", re.S)
|
r"(?:^|\n) {0,3}(?P<block>([`~]{3})(?P<text>.+?) {0,3}\2)(?:\s+?\n|$)", re.S)
|
||||||
TABLE = re.compile(
|
TABLE = re.compile(
|
||||||
|
|
Loading…
Reference in New Issue