From 4706f21e46846a0839b3c22f211237bd7551a898 Mon Sep 17 00:00:00 2001 From: bl-ue <54780737+bl-ue@users.noreply.github.com> Date: Thu, 1 Apr 2021 11:54:56 -0400 Subject: [PATCH] scripts: add set-more-info-link.py (#5654) * scripts: add set-more-info-link.py * scripts/set-more-info-link.py: use current tldr repo if the script is being run from scripts/ * scripts/set-more-info-link.py: allow passing .md extension * scripts/set-more-info-link.py: differentiate between links added and updated * set-more-info-link.py: make omitting .md optional, rather than adding it optional * set-more-info-link.py: make IGNORE_FILES a tuple rather than a str --- scripts/set-more-info-link.py | 145 ++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 scripts/set-more-info-link.py diff --git a/scripts/set-more-info-link.py b/scripts/set-more-info-link.py new file mode 100644 index 000000000..fcd1e9ee5 --- /dev/null +++ b/scripts/set-more-info-link.py @@ -0,0 +1,145 @@ +import argparse +import os +import re +import subprocess +import sys + +labels = { + 'en': 'More information:', + 'bs': 'Više informacija:', + 'da': 'Mere information:', + 'de': 'Mehr Informationen:', + 'es': 'Más información:', + 'fa': ' اطلاعات بیشتر:', + 'fr': 'Plus d\'informations\xa0:', + 'hbs': 'Više informacija:', + 'hi': 'अधिक जानकारी:', + 'id': 'Informasi lebih lanjut:', + 'it': 'Maggiori informazioni:', + 'ja': '詳しくはこちら:', + 'ko': '더 많은 정보:', + 'ml': 'കൂടുതൽ വിവരങ്ങൾ:', + 'nl': 'Meer informatie:', + 'no': 'Mer informasjon:', + 'pl': 'Więcej informacji:', + 'pt_BR': 'Mais informações:', + 'pt_PT': 'Mais informações:', + 'ru': 'Больше информации:', + 'sv': 'Mer information:', + 'ta': 'மேலும் தகவல்:', + 'th': 'ดูเพิ่มเติม:', + 'tr': 'Daha fazla bilgi için:', + 'zh_TW': '更多資訊:', + 'zh': '更多信息:', +} + +IGNORE_FILES = ( + '.DS_Store', +) + + +def get_tldr_root(): + # if this script is running from tldr/scripts, the parent's parent is the root + f = os.path.normpath(__file__) + if f.endswith('tldr/scripts/set-more-info-link.py'): + return os.path.dirname(os.path.dirname(f)) + + if 'TLDR_ROOT' in os.environ: + return os.environ['TLDR_ROOT'] + else: + print( + '\x1b[31mPlease set TLDR_ROOT to the location of a clone of https://github.com/tldr-pages/tldr.') + sys.exit(1) + + +def set_link(file, link): + with open(file) as f: + lines = f.readlines() + + desc_start = 0 + desc_end = 0 + + # find start and end of description + for i, line in enumerate(lines): + if line.startswith('>') and desc_start == 0: + desc_start = i + if not lines[i + 1].startswith('>') and desc_start != 0: + desc_end = i + break + + # compute locale + pages_dir = os.path.basename(os.path.dirname(os.path.dirname(file))) + if '.' in pages_dir: + _, locale = pages_dir.split('.') + else: + locale = 'en' + + # build new line + new_line = f'> {labels[locale]} <{link}>.\n' + + if lines[desc_end] == new_line: + # return empty status to indicate that no changes were made + return '' + + if re.search(r'^>.*<.+>', lines[desc_end]): + # overwrite last line + lines[desc_end] = new_line + status = '\x1b[34mlink updated' + else: + # add new line + lines.insert(desc_end + 1, new_line) + status = '\x1b[36mlink added' + + with open(file, 'w') as f: + f.writelines(lines) + + return status + + +def main(): + parser = argparse.ArgumentParser( + description='Sets the "More information" link for all translations of a page') + parser.add_argument('-p', '--page', type=str, required=True, + help='page name in the format "platform/command.md"') + parser.add_argument('-s', '--stage', action='store_true', default=False, + help='stage modified pages (requires `git` to be on $PATH and TLDR_ROOT to be a Git repository)') + parser.add_argument('link', type=str) + args = parser.parse_args() + + root = get_tldr_root() + pages_dirs = [d for d in os.listdir(root) if d.startswith('pages')] + + target_paths = [] + rel_paths = [] + + if not args.page.lower().endswith('.md'): + args.page = f'{args.page}.md' + + for pages_dir in pages_dirs: + pages_dir_path = os.path.join(root, pages_dir) + platforms = [i for i in os.listdir( + pages_dir_path) if i not in IGNORE_FILES] + for platform in platforms: + platform_path = os.path.join(pages_dir_path, platform) + pages = os.listdir(platform_path) + commands = [ + f'{platform}/{p}' for p in pages if p not in IGNORE_FILES] + if args.page in commands: + path = os.path.join(pages_dir_path, args.page) + target_paths.append(path) + + target_paths.sort() + + for path in target_paths: + rel_path = path.replace(f'{root}/', '') + rel_paths.append(rel_path) + status = set_link(path, args.link) + if status != '': + print(f'\x1b[32m{rel_path} {status}\x1b[0m') + + if args.stage: + subprocess.call(['git', 'add', *rel_paths], cwd=root) + + +if __name__ == '__main__': + main()