mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.8 KiB
96 lines
2.8 KiB
#!/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)
|
|
|