Source code for pydata_sphinx_theme.edit_this_page
"""Create an "edit this page" url compatible with bitbucket, gitlab and github."""
import jinja2
from sphinx.application import Sphinx
from sphinx.errors import ExtensionError
[docs]
def setup_edit_url(
app: Sphinx, pagename: str, templatename: str, context, doctree
) -> None:
"""Add a function that jinja can access for returning the edit URL of a page."""
def get_edit_provider_and_url() -> None:
"""Return a provider name and a URL for an "edit this page" link."""
file_name = f"{pagename}{context['page_source_suffix']}"
# Make sure that doc_path has a path separator only if it exists (to avoid //)
doc_path = context.get("doc_path", "")
if doc_path and not doc_path.endswith("/"):
doc_path = f"{doc_path}/"
default_provider_urls = {
"bitbucket_url": "https://bitbucket.org",
"github_url": "https://github.com",
"gitlab_url": "https://gitlab.com",
}
edit_attrs = {}
# ensure custom URL is checked first, if given
url_template = context.get("edit_page_url_template")
if url_template is not None:
if "file_name" not in url_template:
raise ExtensionError(
"Missing required value for `use_edit_page_button`. "
"Ensure `file_name` appears in `edit_page_url_template`: "
f"{url_template}"
)
provider_name = context.get("edit_page_provider_name")
edit_attrs[("edit_page_url_template",)] = (provider_name, url_template)
edit_attrs.update(
{
("bitbucket_user", "bitbucket_repo", "bitbucket_version"): (
"Bitbucket",
"{{ bitbucket_url }}/{{ bitbucket_user }}/{{ bitbucket_repo }}"
"/src/{{ bitbucket_version }}"
"/{{ doc_path }}{{ file_name }}?mode=edit",
),
("github_user", "github_repo", "github_version"): (
"GitHub",
"{{ github_url }}/{{ github_user }}/{{ github_repo }}"
"/edit/{{ github_version }}/{{ doc_path }}{{ file_name }}",
),
("gitlab_user", "gitlab_repo", "gitlab_version"): (
"GitLab",
"{{ gitlab_url }}/{{ gitlab_user }}/{{ gitlab_repo }}"
"/-/edit/{{ gitlab_version }}/{{ doc_path }}{{ file_name }}",
),
}
)
doc_context = dict(default_provider_urls)
doc_context.update(context)
doc_context.update(doc_path=doc_path, file_name=file_name)
for attrs, (provider, url_template) in edit_attrs.items():
if all(doc_context.get(attr) not in [None, "None"] for attr in attrs):
return provider, jinja2.Template(url_template).render(**doc_context)
raise ExtensionError(
"Missing required value for `use_edit_page_button`. "
"Ensure one set of the following in your `html_context` "
f"configuration: {sorted(edit_attrs.keys())}"
)
context["get_edit_provider_and_url"] = get_edit_provider_and_url
# Ensure that the max TOC level is an integer
context["theme_show_toc_level"] = int(context.get("theme_show_toc_level", 1))