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