123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- #!/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)
|