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