aboutsummaryrefslogtreecommitdiffstats
path: root/docs/_klipper3d/mkdocs_hooks.py
blob: 212d147f5a85d34108633d992694cdca2939040f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# Tool to customize conversion of markdown files during mkdocs site generation
import re
import logging

# This script translates some github specific markdown formatting to
# improve rendering with mkdocs.  The goal is for pages to render
# similarly on both github and the web site.  It has three main tasks:
# 1. Convert links outside of the docs directory (any reference
#    starting with "../") to an absolute link to the raw file on
#    github.
# 2. Convert a trailing backslash on a text line to a "<br>".
# 3. Remove leading spaces from top-level lists so that those lists
#    are rendered correctly.

logger = logging.getLogger("mkdocs.mkdocs_hooks.transform")


def transform(markdown: str, page, config, files):
    in_code_block = 0
    in_list = False
    lines = markdown.splitlines()
    for i in range(len(lines)):
        line_out = lines[i]
        in_code_block = (in_code_block + len(re.findall("\s*[`]{3,}", line_out))) % 2
        if not in_code_block:
            line_out = line_out.replace("](../", f"]({config['repo_url']}blob/master/")
            line_out = re.sub("\\\s*$", "<br>", line_out)
            # check that lists at level 0 are not indented
            # (no space before *|-|1.)
            if re.match(r"^[^-*0-9 ]", line_out):
                in_list = False
            elif re.match(r"^(\*|-|\d+\.) ", line_out):
                in_list = True
            if not in_list:
                line_out = re.sub(r"^\s+(\*|-|\d+\.) ", r"\1 ", line_out)
            if line_out != lines[i]:
                logger.debug(
                    (
                        f"[mkdocs_hooks] rewrite line {i+1}: "
                        f'"{lines[i]}" -> "{line_out}"'
                    )
                )
            lines[i] = line_out
    output = "\n".join(lines)
    return output