1c9f6b0acSPatrick Sanan#!/usr/bin/env python 2c9f6b0acSPatrick Sanan""" A brittle approach to making "Edit this Page" links work on man pages """ 3c9f6b0acSPatrick Sanan 4c9f6b0acSPatrick Sananimport os 5c9f6b0acSPatrick Sananimport re 6c9f6b0acSPatrick Sananimport fileinput 7c9f6b0acSPatrick Sanan 8c9f6b0acSPatrick SananEDIT_URL_PATTERN = re.compile( 9c9f6b0acSPatrick Sanan r'^<p><a.*href="(.*)">Edit on GitLab</a></p>') # very brittle 10c9f6b0acSPatrick Sanan 11c9f6b0acSPatrick Sanan 12c9f6b0acSPatrick Sanandef _get_edit_url(filename): 13*9a968e71SBarry Smith """ Get the edit URL for the source code for a manual page that was added by lib/petsc/bin/maint/wwwindex.py""" 14c9f6b0acSPatrick Sanan with open(filename, "r") as f: 15c9f6b0acSPatrick Sanan for line in f: 16c9f6b0acSPatrick Sanan m = re.match(EDIT_URL_PATTERN, line) 17c9f6b0acSPatrick Sanan if m: 18c9f6b0acSPatrick Sanan return m.group(1) 19c9f6b0acSPatrick Sanan return None 20c9f6b0acSPatrick Sanan 21c9f6b0acSPatrick Sanan 22c9f6b0acSPatrick Sanandef _check_edit_link(filename): 23c9f6b0acSPatrick Sanan """ Return true if the file has an edit link to be updated """ 24c9f6b0acSPatrick Sanan found = False 25c9f6b0acSPatrick Sanan with open(filename, "r") as f: 26c9f6b0acSPatrick Sanan for line in f: 27c9f6b0acSPatrick Sanan if line.lstrip().startswith("<div") and "editthispage" in line: 28c9f6b0acSPatrick Sanan return True 29c9f6b0acSPatrick Sanan return False 30c9f6b0acSPatrick Sanan 31c9f6b0acSPatrick Sanan 32c9f6b0acSPatrick Sanandef _update_edit_link(filename, url): 33*9a968e71SBarry Smith """ Change the URL for editthispage that Sphinx generates to the URL for GitLab repository location of the file 34*9a968e71SBarry Smith Remove the Edit on GitLab line added by lib/petsc/bin/maint/wwwindex.py since it is now a duplicate""" 35c9f6b0acSPatrick Sanan with fileinput.FileInput(filename, inplace=True) as f: 36c9f6b0acSPatrick Sanan replace_link_line = False 37c9f6b0acSPatrick Sanan done = False 38c9f6b0acSPatrick Sanan for line in f: 39c9f6b0acSPatrick Sanan if done: 40c9f6b0acSPatrick Sanan print(line, end="") # prints to file 41c9f6b0acSPatrick Sanan else: 42c9f6b0acSPatrick Sanan if line.lstrip().startswith("<div") and "editthispage" in line: 43c9f6b0acSPatrick Sanan replace_link_line = True 44c9f6b0acSPatrick Sanan if replace_link_line and line.lstrip().startswith("<a"): 45c9f6b0acSPatrick Sanan print("<a href=%s>" % url) # prints to file 46c9f6b0acSPatrick Sanan done = True 47*9a968e71SBarry Smith elif not 'Edit on GitLab' in line: 48c9f6b0acSPatrick Sanan print(line, end="") # prints to file 49c9f6b0acSPatrick Sanan 50c9f6b0acSPatrick Sanan 51c9f6b0acSPatrick Sanandef fix_man_page_edit_links(root): 5273fdd05bSBarry Smith base = os.path.join(root, "manualpages") 53c9f6b0acSPatrick Sanan for root, dirs, filenames in os.walk(base): 54c9f6b0acSPatrick Sanan for filename in filenames: 55c9f6b0acSPatrick Sanan if filename.endswith(".html"): 56c9f6b0acSPatrick Sanan filename_full = os.path.join(root, filename) 57c9f6b0acSPatrick Sanan url = _get_edit_url(filename_full) 58c9f6b0acSPatrick Sanan if url is not None and _check_edit_link(filename_full): 59c9f6b0acSPatrick Sanan _update_edit_link(filename_full, url) 60