def check_src(language): ''' Check external source files referenced in title attributes of code blocks. ''' prefix_len = len(SOURCE_DIR + '/') def _unprefix(filename): return filename[prefix_len:] content = get_all_docs(language, remove_code_blocks=False) referenced = match_body(content, r'{:\s+title="([^"]+)\s*"[^}]*}') | \ match_body(content, r'<!--\s+used="([^"]+)"\s+-->') actual = { _unprefix(filename) for filename in glob.iglob('{}/**/*.*'.format(SOURCE_DIR), recursive=True) if not _ignore_file(filename) } report('Source Files', 'unused', actual - referenced) report('Source Files', 'missing', referenced - actual)
def check_gloss(language): ''' Check for unused and undefined glossary entries and alphabetical order. ''' content = get_all_docs(language) used = match_body(content, r'\[.+?\]\(#(g:.+?)\)') defined = _match_lines(content, r'\*\*.+?\*\*{:#(g:.+?)}') report('Glossary Entries', 'unused', defined - used) report('Glossary Entries', 'missing', used - defined) keys = _get_lines(content, r'\*\*(.+?)\*\*{:#g:.+?}') report('Glossary Entries', 'out of order', _out_of_order(keys))
def check_links(language): ''' Check that external links are defined and used. ''' content = get_all_docs(language) used = match_body(content, r'\[.+?\]\[(.+?)\]') with open(LINK_FILE, 'r') as reader: body = reader.read() matches = re.findall(r'^\[(.+?)\]', body, flags=re.DOTALL + re.MULTILINE) links = Counter(matches) duplicate = {key for key in links if links[key] > 1} defined = set(links.keys()) report('External Links', 'unused', defined - used) report('External Links', 'undefined', used - defined) report('External Links', 'duplicated', duplicate)