diff --git a/tools/list_distros.py b/tools/list_distros.py new file mode 100644 index 00000000..db9647a3 --- /dev/null +++ b/tools/list_distros.py @@ -0,0 +1,85 @@ +""" +List distributions supported by neofetch +""" +from __future__ import annotations + +import string +import textwrap +from dataclasses import dataclass + +from pathlib import Path + +import regex + +RE_SPLIT = regex.compile('EOF[ \n]*?;;') +RE_COLORS = regex.compile("""(?<=set_colors )[a-z\\d ]+(?=\n)""") + + +@dataclass +class AsciiArt: + match: str + color: str + ascii: str + + def get_friendly_name(self) -> str: + return self.match.split("|")[0].strip(string.punctuation + '* ')\ + .replace('"', '').replace('*', '') + + +def substr(s: str, start: str, end: str | None = None): + """ + Get substring between start and end + """ + start = s.index(start) + len(start) + + if end is None: + return s[start:] + + return s[start:s.index(end, start)] + + +def parse_ascii_distros() -> list[AsciiArt]: + """ + Parse ascii distros from neofetch script + """ + nf = (Path(__file__).parent.parent / 'neofetch').read_text() + + # Get the content of "get_distro_ascii" function + nf = nf[nf.index('get_distro_ascii() {\n'):] + nf = nf[:nf.index('\n}\n')] + + # Remove trailing spaces + while ' \n' in nf: + nf = nf.replace(' \n', '\n') + + # Split by blocks + blocks = [sub.strip() for b in regex.split('case .*? in\n', nf) for sub in RE_SPLIT.split(b)] + + # Parse blocks + def parse_block(block: str) -> AsciiArt: + try: + # Get ascii art + assert "'EOF'\n" in block + art = substr(block, "'EOF'\n") + + # Join \ + block = block.replace('\\\n', ' ') + + # Get switch-case matching parameter + match = block.split('\n')[0].strip() + assert match.endswith(')') + match = match[:-1] + + # Get colors + color = RE_COLORS.findall(block)[0] + if len(color) == 0: + raise Exception(block) + + return AsciiArt(match, color, art) + + except AssertionError: + pass + + out = [parse_block(block) for block in blocks] + return [v for v in out if v] +