init - 初始化项目
This commit is contained in:
96
doc/tools/scan_tutorials.py
Normal file
96
doc/tools/scan_tutorials.py
Normal file
@@ -0,0 +1,96 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
from pathlib import Path
|
||||
import re
|
||||
|
||||
# Tasks
|
||||
# 1. Find all tutorials
|
||||
# 2. Generate tree (@subpage)
|
||||
# 3. Check prev/next nodes
|
||||
|
||||
class Tutorial(object):
|
||||
def __init__(self, path):
|
||||
self.path = path
|
||||
self.title = None # doxygen title
|
||||
self.children = [] # ordered titles
|
||||
self.prev = None
|
||||
self.next = None
|
||||
with open(path, "rt") as f:
|
||||
self.parse(f)
|
||||
|
||||
def parse(self, f):
|
||||
rx_title = re.compile(r"\{#(\w+)\}")
|
||||
rx_subpage = re.compile(r"@subpage\s+(\w+)")
|
||||
rx_prev = re.compile(r"@prev_tutorial\{(\w+)\}")
|
||||
rx_next = re.compile(r"@next_tutorial\{(\w+)\}")
|
||||
for line in f:
|
||||
if self.title is None:
|
||||
m = rx_title.search(line)
|
||||
if m:
|
||||
self.title = m.group(1)
|
||||
continue
|
||||
if self.prev is None:
|
||||
m = rx_prev.search(line)
|
||||
if m:
|
||||
self.prev = m.group(1)
|
||||
continue
|
||||
if self.next is None:
|
||||
m = rx_next.search(line)
|
||||
if m:
|
||||
self.next = m.group(1)
|
||||
continue
|
||||
m = rx_subpage.search(line)
|
||||
if m:
|
||||
self.children.append(m.group(1))
|
||||
continue
|
||||
|
||||
def verify_prev_next(self, storage):
|
||||
res = True
|
||||
|
||||
if self.title is None:
|
||||
print("[W] No title")
|
||||
res = False
|
||||
|
||||
prev = None
|
||||
for one in self.children:
|
||||
c = storage[one]
|
||||
if c.prev is not None and c.prev != prev:
|
||||
print("[W] Wrong prev_tutorial: expected {} / actual {}".format(c.prev, prev))
|
||||
res = False
|
||||
prev = c.title
|
||||
|
||||
next = None
|
||||
for one in reversed(self.children):
|
||||
c = storage[one]
|
||||
if c.next is not None and c.next != next:
|
||||
print("[W] Wrong next_tutorial: expected {} / actual {}".format(c.next, next))
|
||||
res = False
|
||||
next = c.title
|
||||
|
||||
if len(self.children) == 0 and self.prev is None and self.next is None:
|
||||
print("[W] No prev and next tutorials")
|
||||
res = False
|
||||
|
||||
return res
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
p = Path('tutorials')
|
||||
print("Looking for tutorials in: '{}'".format(p))
|
||||
|
||||
all_tutorials = dict()
|
||||
for f in p.glob('**/*'):
|
||||
if f.suffix.lower() in ('.markdown', '.md'):
|
||||
t = Tutorial(f)
|
||||
all_tutorials[t.title] = t
|
||||
|
||||
res = 0
|
||||
print("Found: {}".format(len(all_tutorials)))
|
||||
print("------")
|
||||
for title, t in all_tutorials.items():
|
||||
if not t.verify_prev_next(all_tutorials):
|
||||
print("[E] Verification failed: {}".format(t.path))
|
||||
print("------")
|
||||
res = 1
|
||||
|
||||
exit(res)
|
||||
Reference in New Issue
Block a user