Skip to content

Commit

Permalink
Merge PR #12272: Cleanup formatting in .. coqtop:: directives
Browse files Browse the repository at this point in the history
Reviewed-by: Zimmi48
Reviewed-by: cpitclaudel
  • Loading branch information
cpitclaudel committed May 8, 2020
2 parents 343591c + 71d0315 commit 3d01f12
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 20 deletions.
26 changes: 10 additions & 16 deletions doc/tools/coqrst/coqdoc/main.py
Expand Up @@ -48,28 +48,22 @@ def coqdoc(coq_code, coqdoc_bin=None):
finally:
os.remove(filename)

def is_whitespace_string(elem):
return isinstance(elem, NavigableString) and elem.strip() == ""

def strip_soup(soup, pred):
"""Strip elements matching pred from front and tail of soup."""
while soup.contents and pred(soup.contents[-1]):
soup.contents.pop()

skip = 0
for elem in soup.contents:
if not pred(elem):
break
skip += 1

soup.contents[:] = soup.contents[skip:]
def first_string_node(node):
"""Return the first string node, or None if does not exist"""
while node.children:
node = next(node.children)
if isinstance(node, NavigableString):
return node

def lex(source):
"""Convert source into a stream of (css_classes, token_string)."""
coqdoc_output = coqdoc(source)
soup = BeautifulSoup(coqdoc_output, "html.parser")
root = soup.find(class_='code')
strip_soup(root, is_whitespace_string)
# strip the leading '\n'
first = first_string_node(root)
if first and first.string[0] == '\n':
first.string.replace_with(first.string[1:])
for elem in root.children:
if isinstance(elem, NavigableString):
yield [], elem
Expand Down
12 changes: 8 additions & 4 deletions doc/tools/coqrst/coqdomain.py
Expand Up @@ -905,9 +905,13 @@ def is_coqtop_block(node):
return isinstance(node, nodes.Element) and 'coqtop_options' in node

@staticmethod
def split_sentences(source):
"""Split Coq sentences in source. Could be improved."""
return re.split(r"(?<=(?<!\.)\.)\s+", source)
def split_lines(source):
"""Split Coq input in chunks
A chunk is a minimal sequence of consecutive lines of the input that
ends with a '.'
"""
return re.split(r"(?<=(?<!\.)\.)\s+\n", source)

@staticmethod
def parse_options(node):
Expand Down Expand Up @@ -986,7 +990,7 @@ def add_coq_output_1(self, repl, node):
repl.sendone('Unset Coqtop Exit On Error.')
if options['warn']:
repl.sendone('Set Warnings "default".')
for sentence in self.split_sentences(node.rawsource):
for sentence in self.split_lines(node.rawsource):
pairs.append((sentence, repl.sendone(sentence)))
if options['abort']:
repl.sendone('Abort All.')
Expand Down

0 comments on commit 3d01f12

Please sign in to comment.