def check_footnotes(footnotes): """ Complain if there are any footnotes that don't refer to anything. """ for i, line in enumerate(lines, start=1): for match in re.finditer(cls.FOOTNOTE_REGEX, line): refs = parse_range(match.group(1)) unknown_refs = set(refs) - set(footnotes) if unknown_refs: raise ParseError( template=f"unknown {plural(unknown_refs):footnote/s} [{format_range(unknown_refs)}]", culprit=inform.get_culprit(i), unknown_refs=unknown_refs, )
def prune_footnotes(self): """ Remove footnotes that aren't referenced in the protocol. This can happen if a particular footnote applies to a part of a protocol that wasn't included. """ def union(it): return set.union(set(), *it) formatted_steps = self._format_steps().format_text(inf) referenced_ids = union( parse_range(m.group(1)) for m in re.finditer(self.FOOTNOTE_REGEX, formatted_steps) ) self.footnotes = { k: v for k, v in self.footnotes.items() if k in referenced_ids } self.renumber_footnotes()
def merge_footnotes(m): ref_ids = set() for ref_str in re.findall(self.FOOTNOTE_REGEX, m.group()): ref_ids |= parse_range(ref_str) return f'[{format_range(ref_ids)}]'
def renumber_footnote(m): ii = parse_range(m.group(1)) jj = [new_ids[i] for i in ii] return f'[{format_range(jj)}]'
def parse_dependencies(dependencies): return parse_range(dependencies) if dependencies else []
def parse_ids(ids): if ids is None: return [] return parse_range(ids, cast=parse_id)