xref: /petsc/doc/fix_man_page_edit_links.py (revision 9a968e71cae788a5a92e64e6da450bafbea3125d)
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