1
0
forked from docs/doc-exports

Compare commits

...

11 Commits

5 changed files with 57 additions and 11 deletions

View File

@ -423,7 +423,7 @@ class OTCDocConvertor:
] ]
self.rawize_me(soup, rawize_strings) 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 # immediately following non word chars
# (https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#toc-entry-44) # (https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#toc-entry-44)
# NOTE(gtema): # NOTE(gtema):
@ -431,12 +431,26 @@ class OTCDocConvertor:
# escapings above # escapings above
# 2. we are not escaping asterisks at the end of the paragraphs (pandoc # 2. we are not escaping asterisks at the end of the paragraphs (pandoc
# deals correctly with that) # deals correctly with that)
re_escape = re.compile(r"([-:/'\"<\([{])(\*+)(.)") re_escape = re.compile(r"([-/'\"<\([{])(\*+)(.)")
for p in soup.body.find_all(string=re_escape): for p in soup.body.find_all(string=re_escape):
if p.string and p.parent.name == "p": if p.string and p.parent.name == "p":
p.string.replace_with( p.string.replace_with(
re.sub(re_escape, r"\1``\2``\3", p.string)) 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 # Drop parent link at the bottom of the page
for parent in soup.body.find_all("p", class_="familylinks"): for parent in soup.body.find_all("p", class_="familylinks"):
parent.decompose() parent.decompose()

View File

@ -65,7 +65,7 @@ class TestConvertor(TestCase):
Turbo instance, including the permissions for verifying VPCs, subnets, Turbo instance, including the permissions for verifying VPCs, subnets,
and security groups, creating virtual IP addresses and ports, and and security groups, creating virtual IP addresses and ports, and
creating security group rules. You must add the following creating security group rules. You must add the following
action:<ul><li>"vpc:*:*"</li></ul></li></ul></td> action:<ul><li>"vpc:``*``:``*``"</li></ul></li></ul></td>
""" """
soup = bs4.BeautifulSoup(test_data, 'lxml') soup = bs4.BeautifulSoup(test_data, 'lxml')
res = self.convertor.streamline_html(soup, "dummy") res = self.convertor.streamline_html(soup, "dummy")
@ -76,7 +76,7 @@ class TestConvertor(TestCase):
<ul><li>"dss:*:get",</li><li>"dss:*:list",</li><li>"dss:*:count"</li></ul> <ul><li>"dss:*:get",</li><li>"dss:*:list",</li><li>"dss:*:count"</li></ul>
""" """
expected = """ expected = """
<ul><li>"dss:*:get",</li><li>"dss:*:list",</li><li>"dss:*:count"</li></ul> <ul><li>"dss:``*``:get",</li><li>"dss:``*``:list",</li><li>"dss:``*``:count"</li></ul>
""" """
soup = bs4.BeautifulSoup(test_data, 'lxml') soup = bs4.BeautifulSoup(test_data, 'lxml')
res = self.convertor.streamline_html(soup, "dummy") res = self.convertor.streamline_html(soup, "dummy")
@ -87,7 +87,7 @@ class TestConvertor(TestCase):
<ul><li>"vpc:*:*"</li></ul> <ul><li>"vpc:*:*"</li></ul>
""" """
expected = """ expected = """
<ul><li>"vpc:*:*"</li></ul> <ul><li>"vpc:``*``:``*``"</li></ul>
""" """
soup = bs4.BeautifulSoup(test_data, 'lxml') soup = bs4.BeautifulSoup(test_data, 'lxml')
res = self.convertor.streamline_html(soup, "dummy") res = self.convertor.streamline_html(soup, "dummy")
@ -163,3 +163,31 @@ class TestConvertor(TestCase):
str(res.find('td')), str(res.find('td')),
expected.strip(), expected.strip(),
) )
def test_streamline_html_escape_12(self):
test_data= """
<p id="dli_03_0101__en-us_topic_0000001174688342_p1256384461610">DLI:*:*:database:databases.dbname</p>
""" # noqa
expected = """
<p id="dli_03_0101__en-us_topic_0000001174688342_p1256384461610">DLI:``*``:``*``:database:databases.dbname</p>
""" # 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= """
<p id="dli_03_0101__en-us_topic_0000001174688342_p4564244131615">DLI:*:*:queue:queues.*</p>
""" # noqa
expected = """
<p id="dli_03_0101__en-us_topic_0000001174688342_p4564244131615">DLI:``*``:``*``:queue:queues.*</p>
""" # noqa
soup = bs4.BeautifulSoup(test_data, 'lxml')
res = self.convertor.streamline_html(soup, "dummy")
self.assertEqual(
str(res.find('p')),
expected.strip(),
)

View File

@ -1,4 +1,5 @@
bs4 bs4>=0.0.1
lxml beautifulsoup4>=4.0 # MIT
Jinja2 lxml>=4.9 # BSD-3-Clause
requests Jinja2>=3.1 # BSD-3-Clause
requests>=2.28 # Apache-2.0

View File

@ -1 +1,2 @@
flake8 flake8>=6.0 # MIT
stestr>=4.0 # Apache-2.0

View File

@ -1,6 +1,6 @@
[tox] [tox]
minversion = 3.6 minversion = 3.6
envlist = pep8 envlist = py3,pep8
skipsdist = True skipsdist = True
ignore_basepython_conflict = True ignore_basepython_conflict = True
@ -15,6 +15,8 @@ setenv =
deps = deps =
-r{toxinidir}/requirements.txt -r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt -r{toxinidir}/test-requirements.txt
commands = stestr run {posargs}
stestr slowest
[testenv:pep8] [testenv:pep8]
commands = commands =