diff --git a/otc_doc_convertor/convertor.py b/otc_doc_convertor/convertor.py index 11aa39d3..21aca83c 100644 --- a/otc_doc_convertor/convertor.py +++ b/otc_doc_convertor/convertor.py @@ -423,7 +423,7 @@ class OTCDocConvertor: ] self.rawize_me(soup, rawize_strings) - # Pandoc seem to be not escaping properly asterists which are + # Pandoc seem to be not escaping properly asterisks which are # immediately following non word chars # (https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#toc-entry-44) # NOTE(gtema): @@ -431,12 +431,26 @@ class OTCDocConvertor: # escapings above # 2. we are not escaping asterisks at the end of the paragraphs (pandoc # deals correctly with that) - re_escape = re.compile(r"([-:/'\"<\([{])(\*+)(.)") + re_escape = re.compile(r"([-/'\"<\([{])(\*+)(.)") for p in soup.body.find_all(string=re_escape): if p.string and p.parent.name == "p": p.string.replace_with( re.sub(re_escape, r"\1``\2``\3", p.string)) + # Special case for multiple asterisks and colons like ecs:*:* + re_escape = re.compile(r"([:])(\*+)") + re_escape_new = re.compile(r"([:])(\*)[^$]") + for p in soup.body.find_all(string=re_escape): + if p.string and (p.parent.name == "p" or p.parent.name == "li"): + string = p.string + while re.search(re_escape, string): + if re.search(re_escape_new, string): + string = re.sub( + re_escape, r"\1``\2``", string, count=1) + else: + break + p.string.replace_with(string) + # Drop parent link at the bottom of the page for parent in soup.body.find_all("p", class_="familylinks"): parent.decompose() diff --git a/otc_doc_convertor/tests/unit/test_convertor.py b/otc_doc_convertor/tests/unit/test_convertor.py index 9304d6e5..f87c30ab 100644 --- a/otc_doc_convertor/tests/unit/test_convertor.py +++ b/otc_doc_convertor/tests/unit/test_convertor.py @@ -65,7 +65,7 @@ class TestConvertor(TestCase): Turbo instance, including the permissions for verifying VPCs, subnets, and security groups, creating virtual IP addresses and ports, and creating security group rules. You must add the following - action: + action: """ soup = bs4.BeautifulSoup(test_data, 'lxml') res = self.convertor.streamline_html(soup, "dummy") @@ -76,7 +76,7 @@ class TestConvertor(TestCase): """ expected = """ - + """ soup = bs4.BeautifulSoup(test_data, 'lxml') res = self.convertor.streamline_html(soup, "dummy") @@ -87,7 +87,7 @@ class TestConvertor(TestCase): """ expected = """ - + """ soup = bs4.BeautifulSoup(test_data, 'lxml') res = self.convertor.streamline_html(soup, "dummy") @@ -163,3 +163,31 @@ class TestConvertor(TestCase): str(res.find('td')), expected.strip(), ) + + def test_streamline_html_escape_12(self): + test_data= """ +

DLI:*:*:database:databases.dbname

+ """ # noqa + expected = """ +

DLI:``*``:``*``:database:databases.dbname

+ """ # noqa + soup = bs4.BeautifulSoup(test_data, 'lxml') + res = self.convertor.streamline_html(soup, "dummy") + self.assertEqual( + str(res.find('p')), + expected.strip(), + ) + + def test_streamline_html_escape_13(self): + test_data= """ +

DLI:*:*:queue:queues.*

+ """ # noqa + expected = """ +

DLI:``*``:``*``:queue:queues.*

+ """ # noqa + soup = bs4.BeautifulSoup(test_data, 'lxml') + res = self.convertor.streamline_html(soup, "dummy") + self.assertEqual( + str(res.find('p')), + expected.strip(), + ) diff --git a/requirements.txt b/requirements.txt index 9b964d63..958e2d6b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ -bs4 -lxml -Jinja2 -requests +bs4>=0.0.1 +beautifulsoup4>=4.0 # MIT +lxml>=4.9 # BSD-3-Clause +Jinja2>=3.1 # BSD-3-Clause +requests>=2.28 # Apache-2.0 diff --git a/test-requirements.txt b/test-requirements.txt index 39304807..af86c65a 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1 +1,2 @@ -flake8 +flake8>=6.0 # MIT +stestr>=4.0 # Apache-2.0 diff --git a/tox.ini b/tox.ini index f922100e..ba947e39 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,6 @@ [tox] minversion = 3.6 -envlist = pep8 +envlist = py3,pep8 skipsdist = True ignore_basepython_conflict = True @@ -15,6 +15,8 @@ setenv = deps = -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt +commands = stestr run {posargs} + stestr slowest [testenv:pep8] commands =