11"""Create an "edit this page" url compatible with bitbucket, gitlab and github."""
22
3+ import urllib
4+
35import jinja2
46
57from sphinx .application import Sphinx
68from sphinx .errors import ExtensionError
79
10+ from .utils import get_theme_options_dict
11+
812
913def setup_edit_url (
1014 app : Sphinx , pagename : str , templatename : str , context , doctree
@@ -20,11 +24,24 @@ def get_edit_provider_and_url() -> None:
2024 if doc_path and not doc_path .endswith ("/" ):
2125 doc_path = f"{ doc_path } /"
2226
23- default_provider_urls = {
27+ provider_urls = {
2428 "bitbucket_url" : "https://bitbucket.org" ,
29+ "forgejo_url" : "https://codeberg.org" ,
30+ "gitea_url" : "https://gitea.com" ,
2531 "github_url" : "https://github.com" ,
2632 "gitlab_url" : "https://gitlab.com" ,
2733 }
34+ provider_labels = {
35+ "bitbucket" : "Bitbucket" ,
36+ "forgejo" : "Forgejo" ,
37+ "gitea" : "Gitea" ,
38+ "github" : "GitHub" ,
39+ "gitlab" : "GitLab" ,
40+ }
41+ theme_options = get_theme_options_dict (app )
42+ provider_urls , provider_labels = adjust_forge_params (
43+ provider_urls , provider_labels , theme_options
44+ )
2845
2946 edit_attrs = {}
3047
@@ -44,25 +61,35 @@ def get_edit_provider_and_url() -> None:
4461 edit_attrs .update (
4562 {
4663 ("bitbucket_user" , "bitbucket_repo" , "bitbucket_version" ): (
47- "Bitbucket" ,
64+ provider_labels [ "bitbucket" ] ,
4865 "{{ bitbucket_url }}/{{ bitbucket_user }}/{{ bitbucket_repo }}"
4966 "/src/{{ bitbucket_version }}"
5067 "/{{ doc_path }}{{ file_name }}?mode=edit" ,
5168 ),
69+ ("forgejo_user" , "forgejo_repo" , "forgejo_version" ): (
70+ provider_labels ["forgejo" ],
71+ "{{ forgejo_url }}/{{ forgejo_user }}/{{ forgejo_repo }}"
72+ "/_edit/{{ forgejo_version }}/{{ doc_path }}{{ file_name }}" ,
73+ ),
74+ ("gitea_user" , "gitea_repo" , "gitea_version" ): (
75+ provider_labels ["gitea" ],
76+ "{{ gitea_url }}/{{ gitea_user }}/{{ gitea_repo }}"
77+ "/_edit/{{ gitea_version }}/{{ doc_path }}{{ file_name }}" ,
78+ ),
5279 ("github_user" , "github_repo" , "github_version" ): (
53- "GitHub" ,
80+ provider_labels [ "github" ] ,
5481 "{{ github_url }}/{{ github_user }}/{{ github_repo }}"
5582 "/edit/{{ github_version }}/{{ doc_path }}{{ file_name }}" ,
5683 ),
5784 ("gitlab_user" , "gitlab_repo" , "gitlab_version" ): (
58- "GitLab" ,
85+ provider_labels [ "gitlab" ] ,
5986 "{{ gitlab_url }}/{{ gitlab_user }}/{{ gitlab_repo }}"
6087 "/-/edit/{{ gitlab_version }}/{{ doc_path }}{{ file_name }}" ,
6188 ),
6289 }
6390 )
6491
65- doc_context = dict (default_provider_urls )
92+ doc_context = dict (provider_urls )
6693 doc_context .update (context )
6794 doc_context .update (doc_path = doc_path , file_name = file_name )
6895
@@ -80,3 +107,27 @@ def get_edit_provider_and_url() -> None:
80107
81108 # Ensure that the max TOC level is an integer
82109 context ["theme_show_toc_level" ] = int (context .get ("theme_show_toc_level" , 1 ))
110+
111+
112+ def adjust_forge_params (
113+ forge_urls : dict [str , str ],
114+ forge_labels : dict [str , str ],
115+ theme_options : dict [str , str ],
116+ ) -> (dict [str , str ], dict [str , str ]):
117+ """Adjust labels and URLs for some of the more decentralized forges."""
118+ # use *_urls given in html_theme_options as authority (netloc)
119+ # instead of default if available
120+ for url_key in forge_urls :
121+ forge_url = theme_options .get (url_key )
122+ if forge_url :
123+ forge_url = urllib .parse .urlsplit (forge_url , allow_fragments = False )
124+ forge_url = f"{ forge_url .scheme } ://{ forge_url .netloc } "
125+ forge_urls [url_key ] = forge_url
126+
127+ # use rebranded forge label instead of generic SW name where known
128+ if "forgejo_url" in theme_options :
129+ url = theme_options ["forgejo_url" ]
130+ if url .startswith ("https://codeberg.org" ):
131+ forge_labels ["forgejo" ] = "Codeberg"
132+
133+ return forge_urls , forge_labels
0 commit comments