xref: /petsc/doc/fix_man_page_edit_links.py (revision f748bf6bfc83f133d5068e6a5445afd45844ada1)
1#!/usr/bin/env python3
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(r'<p><a.*href="(.*)">Edit on GitLab</a></p>')  # very brittle
9SHOW_SOURCE_PATTERN = re.compile(r'(?s)<div class="toc-item">\s*<div class="tocsection sourcelink">.*<a href=.*>.*<i class="fa-solid fa-file-lines"></i> Show Source\s*</a>\s*</div>\s*</div>')
10
11def fix_man_page_edit_link(root,filename):
12   with open(os.path.join(root,filename)) as f:
13     str = f.read()
14   m = re.findall(EDIT_URL_PATTERN, str)
15   if not m:
16     # print("Cannot find Edit on Gitlab string "+os.path.join(root,filename))
17     return
18   url = m[0]
19   str = re.sub(SHOW_SOURCE_PATTERN,'',str)
20   replace_link_line = False
21   done = False
22   with open(os.path.join(root,filename),'w') as f:
23     for line in str.split('\n'):
24       if done:
25         f.write(line+'\n')
26       else:
27         if line.lstrip().startswith("<div") and "editthispage" in line:
28           replace_link_line = True
29         if replace_link_line and line.lstrip().startswith("<a"):
30           f.write("<a href=%s>\n" % url)
31           done = True
32         elif not 'Edit on GitLab' in line:
33           f.write(line+'\n')
34
35def fix_man_page_edit_links(root):
36    base = os.path.join(root, "manualpages")
37    for root, dirs, filenames in os.walk(base):
38        for filename in filenames:
39            if filename.endswith(".html"):
40              fix_man_page_edit_link(root,filename)
41