xref: /petsc/doc/fix_man_page_edit_links.py (revision f748bf6bfc83f133d5068e6a5445afd45844ada1)
1*1b37a2a7SPierre Jolivet#!/usr/bin/env python3
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
83ecf4727SBarry SmithEDIT_URL_PATTERN = re.compile(r'<p><a.*href="(.*)">Edit on GitLab</a></p>')  # very brittle
93ecf4727SBarry SmithSHOW_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>')
10c9f6b0acSPatrick Sanan
113ecf4727SBarry Smithdef fix_man_page_edit_link(root,filename):
123ecf4727SBarry Smith   with open(os.path.join(root,filename)) as f:
133ecf4727SBarry Smith     str = f.read()
143ecf4727SBarry Smith   m = re.findall(EDIT_URL_PATTERN, str)
153ecf4727SBarry Smith   if not m:
163ecf4727SBarry Smith     # print("Cannot find Edit on Gitlab string "+os.path.join(root,filename))
173ecf4727SBarry Smith     return
183ecf4727SBarry Smith   url = m[0]
193ecf4727SBarry Smith   str = re.sub(SHOW_SOURCE_PATTERN,'',str)
20c9f6b0acSPatrick Sanan   replace_link_line = False
21c9f6b0acSPatrick Sanan   done = False
223ecf4727SBarry Smith   with open(os.path.join(root,filename),'w') as f:
233ecf4727SBarry Smith     for line in str.split('\n'):
24c9f6b0acSPatrick Sanan       if done:
253ecf4727SBarry Smith         f.write(line+'\n')
26c9f6b0acSPatrick Sanan       else:
27c9f6b0acSPatrick Sanan         if line.lstrip().startswith("<div") and "editthispage" in line:
28c9f6b0acSPatrick Sanan           replace_link_line = True
29c9f6b0acSPatrick Sanan         if replace_link_line and line.lstrip().startswith("<a"):
303ecf4727SBarry Smith           f.write("<a href=%s>\n" % url)
31c9f6b0acSPatrick Sanan           done = True
329a968e71SBarry Smith         elif not 'Edit on GitLab' in line:
333ecf4727SBarry Smith           f.write(line+'\n')
34c9f6b0acSPatrick Sanan
35c9f6b0acSPatrick Sanandef fix_man_page_edit_links(root):
3673fdd05bSBarry Smith    base = os.path.join(root, "manualpages")
37c9f6b0acSPatrick Sanan    for root, dirs, filenames in os.walk(base):
38c9f6b0acSPatrick Sanan        for filename in filenames:
39c9f6b0acSPatrick Sanan            if filename.endswith(".html"):
403ecf4727SBarry Smith              fix_man_page_edit_link(root,filename)
41