url_schemes.py 4.11 KB
Newer Older
1
# SPDX-License-Identifier: Apache-2.0
2
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
"""
This is basically a port of MyST parser’s external URL resolution mechanism
(https://myst-parser.readthedocs.io/en/latest/syntax/cross-referencing.html#customising-external-url-resolution)
to work with MkDocs.

It allows Markdown authors to use GitHub shorthand links like:

  - [Text](gh-issue:123)
  - <gh-pr:456>
  - [File](gh-file:path/to/file.py#L10)

These are automatically rewritten into fully qualified GitHub URLs pointing to
issues, pull requests, files, directories, or projects in the
`vllm-project/vllm` repository.

The goal is to simplify cross-referencing common GitHub resources
in project docs.
"""

22
import regex as re
23
24
25
26
27
from mkdocs.config.defaults import MkDocsConfig
from mkdocs.structure.files import Files
from mkdocs.structure.pages import Page


28
29
30
def on_page_markdown(
    markdown: str, *, page: Page, config: MkDocsConfig, files: Files
) -> str:
31
32
33
34
35
36
37
38
    """
    Custom MkDocs plugin hook to rewrite special GitHub reference links
    in Markdown.

    This function scans the given Markdown content for specially formatted
    GitHub shorthand links, such as:
      - `[Link text](gh-issue:123)`
      - `<gh-pr:456>`
39

40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
    And rewrites them into fully-qualified GitHub URLs with GitHub icons:
      - `[:octicons-mark-github-16: Link text](https://github.com/vllm-project/vllm/issues/123)`
      - `[:octicons-mark-github-16: Pull Request #456](https://github.com/vllm-project/vllm/pull/456)`

    Supported shorthand types:
      - `gh-issue`
      - `gh-pr`
      - `gh-project`
      - `gh-dir`
      - `gh-file`

    Args:
        markdown (str): The raw Markdown content of the page.
        page (Page): The MkDocs page object being processed.
        config (MkDocsConfig): The MkDocs site configuration.
        files (Files): The collection of files in the MkDocs build.

    Returns:
        str: The updated Markdown content with GitHub shorthand links replaced.
    """
60
61
62
63
    gh_icon = ":octicons-mark-github-16:"
    gh_url = "https://github.com"
    repo_url = f"{gh_url}/vllm-project/vllm"
    org_url = f"{gh_url}/orgs/vllm-project"
64
65

    # Mapping of shorthand types to their corresponding GitHub base URLs
66
67
68
69
70
71
72
    urls = {
        "issue": f"{repo_url}/issues",
        "pr": f"{repo_url}/pull",
        "project": f"{org_url}/projects",
        "dir": f"{repo_url}/tree/main",
        "file": f"{repo_url}/blob/main",
    }
73
74

    # Default title prefixes for auto links
75
76
77
78
79
80
81
82
    titles = {
        "issue": "Issue #",
        "pr": "Pull Request #",
        "project": "Project #",
        "dir": "",
        "file": "",
    }

83
    # Regular expression to match GitHub shorthand links
84
85
86
87
88
    scheme = r"gh-(?P<type>.+?):(?P<path>.+?)(#(?P<fragment>.+?))?"
    inline_link = re.compile(r"\[(?P<title>[^\[]+?)\]\(" + scheme + r"\)")
    auto_link = re.compile(f"<{scheme}>")

    def replace_inline_link(match: re.Match) -> str:
89
90
91
        """
        Replaces a matched inline-style GitHub shorthand link
        with a full Markdown link.
92

93
94
95
        Example:
            [My issue](gh-issue:123) → [:octicons-mark-github-16: My issue](https://github.com/vllm-project/vllm/issues/123)
        """
96
        url = f"{urls[match.group('type')]}/{match.group('path')}"
97
98
99
        if fragment := match.group("fragment"):
            url += f"#{fragment}"

100
        return f"[{gh_icon} {match.group('title')}]({url})"
101
102

    def replace_auto_link(match: re.Match) -> str:
103
104
105
        """
        Replaces a matched autolink-style GitHub shorthand
        with a full Markdown link.
106

107
108
109
        Example:
            <gh-pr:456> → [:octicons-mark-github-16: Pull Request #456](https://github.com/vllm-project/vllm/pull/456)
        """
110
111
112
113
114
115
116
117
118
        type = match.group("type")
        path = match.group("path")
        title = f"{titles[type]}{path}"
        url = f"{urls[type]}/{path}"
        if fragment := match.group("fragment"):
            url += f"#{fragment}"

        return f"[{gh_icon} {title}]({url})"

119
    # Replace both inline and autolinks
120
121
122
123
    markdown = inline_link.sub(replace_inline_link, markdown)
    markdown = auto_link.sub(replace_auto_link, markdown)

    return markdown