Created by
Dénes Türei
| #!/usr/bin/env python3
#
# Denes Turei (turei.denes@gmail.com) 2022
#
"""
Collect the MS2 identification rules from the module `lipyd.ms2`.
"""
import re
import docutils.core
from lipyd import ms2
REINDENT = re.compile(r'\n( {8}| {4})')
RECRLF = re.compile(r'[\r\n]{1,2}')
HEADER = [['Class', 'Ion mode', 'Subclass', 'Rules']]
def principle(docs: str) -> list[list[str, str]]:
docs = REINDENT.sub(r'\n', docs)
dtree = docutils.core.publish_doctree(docs)
def _principle(dtree: docutils.nodes.document, section: str = ''):
rules = []
for elem, next_elem in zip(dtree, dtree[1:]):
if elem.tagname == 'section':
section = elem[0].astext()
rules += _principle(elem, section = section)
elif elem.astext().strip() == 'Principle:':
rules.append([
section,
'; '.join(
f'{i + 1}) {RECRLF.sub(" ", li.astext())}'
for i, li in enumerate(next_elem)
)
])
return rules
return _principle(dtree)
def collect() -> list[list[str]]:
ms2_rules = [
name.split('_', maxsplit = 1) + rules
for namespace in (ms2, ms2.Scan)
for name, obj in namespace.__dict__.items()
if obj.__doc__ and 'Principle' in obj.__doc__
for rules in principle(obj.__doc__)
]
return ms2_rules
def export(ms2_rules: list[list[str]], path: str = 'ms2_rules.csv'):
with open(path, 'w') as fp:
_ = fp.write('\n'.join('\t'.join(r) for r in HEADER + ms2_rules))
def main():
ms2_rules = collect()
export(ms2_rules)
if __name__ == '__main__':
main()
|