-
Notifications
You must be signed in to change notification settings - Fork 673
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add a circleci integration: check unclosed tags (#3786)
* test * upload code and test file * Update rocksdb-overview.md * Update check-tags.py * Update config.yml * fix import * test * Update check-tags.py * test * final test * delete git remote add * add exit code 0 and 1 * suceess! more test * move it in front * Revert "move it in front" This reverts commit 6056fb3. * Update experimental-features-4.0.md * modify outputs * test toc * cover more edge cases: tags with attricutes and self closed tags * fix tag_is_wrapped judgement * specify which file is being checked * add git fetch upstream back to fix unsynced issue * add ; * fix edited files * fix left/right backticks judgement * control exit using status_code * clean up output info * clean up output info * add filter frontmatter func * clean up code comments * Apply suggestions from code review * minor fix * remove chinese code comments * filter copyable shortcodes * fix match regex string and add a filter case; fix some tag issues in upstream
- Loading branch information
Showing
6 changed files
with
134 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,124 @@ | ||
import re | ||
import sys | ||
|
||
# reference: https://stackoverflow.com/questions/35761133/python-how-to-check-for-open-and-close-tags | ||
def stack_tag(tag, stack): | ||
t = tag[1:-1] | ||
first_space = t.find(' ') | ||
#print(t) | ||
if t[-1:] == '/': | ||
self_closed_tag = True | ||
elif t[:1] != '/': | ||
# Add tag to stack | ||
if first_space == -1: | ||
stack.append(t) | ||
# print("TRACE open", stack) | ||
else: | ||
stack.append(t[:first_space]) | ||
# print("TRACE open", stack) | ||
else: | ||
if first_space != -1: | ||
t = t[1:first_space] | ||
else: | ||
t = t[1:] | ||
|
||
if len(stack) == 0: | ||
# print("No blocks are open; tried to close", t) | ||
closed_tag = True | ||
else: | ||
if stack[-1] == t: | ||
# Close the block | ||
stack.pop() | ||
# print("TRACE close", t, stack) | ||
else: | ||
# print("Tried to close", t, "but most recent open block is", stack[-1]) | ||
if t in stack: | ||
stack.remove(t) | ||
# print("Prior block closed; continuing") | ||
|
||
# if len(stack): | ||
# print("Blocks still open at EOF:", stack) | ||
return stack | ||
|
||
def tag_is_wrapped(pos, content): | ||
tag_start = pos[0] | ||
tag_end = pos[1] | ||
content_previous = content[:tag_start][::-1] # reverse content_previous | ||
content_later = content[tag_end:] | ||
|
||
left_wraps_findall = re.findall(r'`', content_previous) | ||
left_single_backtick = len(left_wraps_findall) % 2 | ||
right_wraps_findall = re.findall(r'`', content_later) | ||
right_single_backtick = len(right_wraps_findall) % 2 | ||
# print(left_single_backtick, right_single_backtick) | ||
|
||
if left_single_backtick != 0 and right_single_backtick != 0: | ||
# print(content_previous.find('`'), content_later.find('`')) | ||
# print(content_previous) | ||
# print(content_later) | ||
return True | ||
else: | ||
# print(content_previous.find('`'), content_later.find('`')) | ||
# print(content_previous) | ||
# print(content_later) | ||
return False | ||
|
||
def filter_content(content): | ||
content_findall = re.findall(r'\n---\n', content) | ||
if len(content_findall): | ||
content_finditer = re.finditer(r'\n---\n', content) | ||
for i in content_finditer: | ||
meta_pos = i.span()[1] | ||
# print(content[meta_pos:]) | ||
return content[meta_pos:] | ||
else: | ||
return content | ||
|
||
status_code = 0 | ||
|
||
# print(sys.argv[1:]) | ||
for filename in sys.argv[1:]: | ||
#print("Checking " + filename + "......\n") | ||
file = open(filename, "r" ) | ||
content = file.read() | ||
file.close() | ||
|
||
content = filter_content(content) | ||
result_findall = re.findall(r'<([^\n`>]*)>', content) | ||
if len(result_findall) == 0: | ||
# print("The edited markdown file " + filename + " has no tags!\n") | ||
status_code = 0 | ||
else: | ||
result_finditer = re.finditer(r'<([^\n`>]*)>', content) | ||
stack = [] | ||
for i in result_finditer: | ||
# print(i.group(), i.span()) | ||
tag = i.group() | ||
pos = i.span() | ||
|
||
if tag[:4] == '<!--' and tag[-3:] == '-->': | ||
continue | ||
elif content[pos[0]-2:pos[0]] == '{{' and content[pos[1]:pos[1]+2] == '}}': | ||
# print(tag) # filter copyable shortcodes | ||
continue | ||
elif tag[:5] == '<http': # or tag[:4] == '<ftp' | ||
# filter urls | ||
continue | ||
elif tag_is_wrapped(pos, content): | ||
# print(content[int(pos[0])-1:int(pos[1]+1)]) | ||
# print(tag, 'is wrapped by backticks!') | ||
continue | ||
|
||
stack = stack_tag(tag, stack) | ||
|
||
if len(stack): | ||
stack = ['<' + i + '>' for i in stack] | ||
print("ERROR: " + filename + ' has unclosed tags: ' + ', '.join(stack) + '.\n') | ||
status_code = 1 | ||
else: | ||
# print("The edited markdown file has tags. But all tags are closed, congratulations!\n") | ||
status_code = 0 | ||
|
||
if status_code: | ||
print("HINT: Unclosed tags will cause website build failure. Please fix the reported unclosed tags. You can use backticks `` to wrap them or close them. Thanks.") | ||
exit(1) |