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