mirror of
https://github.com/godotengine/godot-docs.git
synced 2025-12-31 17:49:03 +03:00
319 lines
11 KiB
Python
319 lines
11 KiB
Python
# -*- coding: utf-8 -*-
|
|
#
|
|
# Godot Engine documentation build configuration file
|
|
|
|
import sphinx
|
|
import sphinx_rtd_theme
|
|
import sys
|
|
import os
|
|
|
|
# -- General configuration ------------------------------------------------
|
|
|
|
needs_sphinx = "8.1"
|
|
|
|
# Sphinx extension module names and templates location
|
|
sys.path.append(os.path.abspath("_extensions"))
|
|
extensions = [
|
|
"sphinx_tabs.tabs",
|
|
"notfound.extension",
|
|
"sphinxext.opengraph",
|
|
"sphinx_copybutton",
|
|
"sphinxcontrib.video",
|
|
]
|
|
|
|
# Warning when the Sphinx Tabs extension is used with unknown
|
|
# builders (like the dummy builder) - as it doesn't cause errors,
|
|
# we can ignore this so we still can treat other warnings as errors.
|
|
sphinx_tabs_nowarn = True
|
|
|
|
# Disable collapsing tabs for codeblocks.
|
|
sphinx_tabs_disable_tab_closing = True
|
|
|
|
# on_rtd is whether we are on readthedocs.org, this line of code grabbed from docs.readthedocs.org
|
|
on_rtd = os.environ.get("READTHEDOCS", None) == "True"
|
|
|
|
# Don't add `/en/latest` prefix during local development.
|
|
# This makes it easier to test the custom 404 page by loading `/404.html`
|
|
# on a local web server.
|
|
if not on_rtd:
|
|
notfound_urls_prefix = ''
|
|
|
|
# Specify the site name for the Open Graph extension.
|
|
ogp_site_name = "Godot Engine documentation"
|
|
ogp_social_cards = {
|
|
"enable": False
|
|
}
|
|
|
|
if not os.getenv("SPHINX_NO_GDSCRIPT"):
|
|
extensions.append("gdscript")
|
|
|
|
if not os.getenv("SPHINX_NO_DESCRIPTIONS"):
|
|
extensions.append("godot_descriptions")
|
|
|
|
templates_path = ["_templates"]
|
|
|
|
# You can specify multiple suffix as a list of string: ['.rst', '.md']
|
|
source_suffix = ".rst"
|
|
source_encoding = "utf-8-sig"
|
|
|
|
# The master toctree document
|
|
master_doc = "index"
|
|
|
|
# General information about the project
|
|
project = "Godot Engine"
|
|
copyright = (
|
|
"2014-present Juan Linietsky, Ariel Manzur and the Godot community (CC BY 3.0)"
|
|
)
|
|
author = "Juan Linietsky, Ariel Manzur and the Godot community"
|
|
|
|
# Version info for the project, acts as replacement for |version| and |release|
|
|
# The short X.Y version
|
|
version = os.getenv("READTHEDOCS_VERSION", "latest")
|
|
# The full version, including alpha/beta/rc tags
|
|
release = version
|
|
|
|
# Parse Sphinx tags passed from RTD via environment
|
|
env_tags = os.getenv("SPHINX_TAGS")
|
|
if env_tags is not None:
|
|
for tag in env_tags.split(","):
|
|
print("Adding Sphinx tag: %s" % tag.strip())
|
|
tags.add(tag.strip()) # noqa: F821
|
|
|
|
# Language / i18n
|
|
|
|
supported_languages = {
|
|
"en": "Godot Engine %s documentation in English",
|
|
"de": "Godot Engine %s Dokumentation auf Deutsch",
|
|
"es": "Documentación de Godot Engine %s en español",
|
|
"fr": "Documentation de Godot Engine %s en français",
|
|
"fi": "Godot Engine %s dokumentaatio suomeksi",
|
|
"it": "Godot Engine %s documentazione in italiano",
|
|
"ja": "Godot Engine %sの日本語のドキュメント",
|
|
"ko": "Godot Engine %s 문서 (한국어)",
|
|
"pl": "Dokumentacja Godot Engine %s w języku polskim",
|
|
"pt_BR": "Documentação da Godot Engine %s em Português Brasileiro",
|
|
"ru": "Документация Godot Engine %s на русском языке",
|
|
"uk": "Документація до Godot Engine %s українською мовою",
|
|
"zh_Hans": "Godot Engine %s 简体中文文档",
|
|
"zh_Hant": "Godot Engine %s 正體中文 (台灣) 文件",
|
|
}
|
|
|
|
# RTD normalized their language codes to ll-cc (e.g. pt-br),
|
|
# but Sphinx did not and still uses ll_CC (e.g. pt_BR).
|
|
# `language` is the Sphinx configuration so it needs to be converted back.
|
|
language = os.getenv("READTHEDOCS_LANGUAGE", "en")
|
|
if "-" in language:
|
|
(lang_name, lang_country) = language.split("-")
|
|
language = lang_name + "_" + lang_country.upper()
|
|
|
|
if not language in supported_languages.keys():
|
|
print("Unknown language: " + language)
|
|
print("Supported languages: " + ", ".join(supported_languages.keys()))
|
|
print(
|
|
"The configured language is either wrong, or it should be added to supported_languages in conf.py. Falling back to 'en'."
|
|
)
|
|
language = "en"
|
|
|
|
is_i18n = tags.has("i18n") # noqa: F821
|
|
print("Build language: {}, i18n tag: {}".format(language, is_i18n))
|
|
|
|
exclude_patterns = [".*", "**/.*", "_build", "_tools"]
|
|
|
|
# fmt: off
|
|
# These imports should *not* be moved to the start of the file,
|
|
# they depend on the sys.path.append call registering "_extensions".
|
|
# GDScript syntax highlighting
|
|
from gdscript import GDScriptLexer
|
|
from sphinx.highlighting import lexers
|
|
|
|
lexers["gdscript"] = GDScriptLexer()
|
|
# fmt: on
|
|
|
|
smartquotes = False
|
|
|
|
# Pygments (syntax highlighting) style to use
|
|
pygments_style = "sphinx"
|
|
highlight_language = "gdscript"
|
|
|
|
# -- Options for HTML output ----------------------------------------------
|
|
|
|
html_theme = "sphinx_rtd_theme"
|
|
if on_rtd:
|
|
using_rtd_theme = True
|
|
|
|
# Theme options
|
|
html_theme_options = {
|
|
# if we have a html_logo below, this shows /only/ the logo with no title text
|
|
"logo_only": True,
|
|
# Collapse navigation (False makes it tree-like)
|
|
"collapse_navigation": False,
|
|
# Remove version and language picker beneath the title
|
|
"version_selector": False,
|
|
"language_selector": False,
|
|
# Set Flyout menu to attached
|
|
"flyout_display": "attached",
|
|
}
|
|
|
|
html_title = supported_languages[language] % ( "(" + version + ")" )
|
|
|
|
# Edit on GitHub options: https://docs.readthedocs.io/en/latest/guides/edit-source-links-sphinx.html
|
|
html_context = {
|
|
"display_github": not is_i18n, # Integrate GitHub
|
|
"github_user": "godotengine", # Username
|
|
"github_repo": "godot-docs", # Repo name
|
|
"github_version": "master", # Version
|
|
"conf_py_path": "/", # Path in the checkout to the docs root
|
|
"godot_docs_title": supported_languages[language],
|
|
"godot_docs_basepath": "https://docs.godotengine.org/",
|
|
"godot_docs_suffix": ".html",
|
|
# Distinguish local development website from production website.
|
|
# This prevents people from looking for changes on the production website after making local changes :)
|
|
"godot_title_prefix": "" if on_rtd else "(DEV) ",
|
|
# Set this to `True` when in the `latest` branch to clearly indicate to the reader
|
|
# that they are not reading the `stable` documentation.
|
|
"godot_is_latest": True,
|
|
"godot_version": "4.6",
|
|
# Enables a banner that displays the up-to-date status of each article.
|
|
"godot_show_article_status": True,
|
|
# Display user-contributed notes at the bottom of pages that don't have `:allow_comments: False` at the top.
|
|
"godot_show_article_comments": on_rtd and not is_i18n,
|
|
}
|
|
|
|
html_logo = "img/docs_logo.svg"
|
|
|
|
# These folders are copied to the documentation's HTML output
|
|
html_static_path = ["_static"]
|
|
|
|
html_extra_path = ["robots.txt"]
|
|
|
|
# These paths are either relative to html_static_path
|
|
# or fully qualified paths (e.g. https://...)
|
|
html_css_files = [
|
|
"css/custom.css",
|
|
]
|
|
|
|
if not on_rtd:
|
|
html_css_files.append("css/dev.css")
|
|
|
|
html_js_files = [
|
|
"js/custom.js",
|
|
('https://plausible.godot.foundation/js/script.file-downloads.outbound-links.js',
|
|
{'defer': 'defer', 'data-domain': 'godotengine.org'}),
|
|
]
|
|
|
|
# Output file base name for HTML help builder
|
|
htmlhelp_basename = "GodotEnginedoc"
|
|
|
|
# -- Options for reStructuredText parser ----------------------------------
|
|
|
|
# Enable directives that insert the contents of external files
|
|
file_insertion_enabled = False
|
|
|
|
# -- Options for LaTeX output ---------------------------------------------
|
|
|
|
# Grouping the document tree into LaTeX files. List of tuples
|
|
# (source start file, target name, title,
|
|
# author, documentclass [howto, manual, or own class]).
|
|
latex_documents = [
|
|
(
|
|
master_doc,
|
|
"GodotEngine.tex",
|
|
"Godot Engine Documentation",
|
|
"Juan Linietsky, Ariel Manzur and the Godot community",
|
|
"manual",
|
|
),
|
|
]
|
|
|
|
# -- Options for linkcheck builder ----------------------------------------
|
|
|
|
# disable checking urls with about.html#this_part_of_page anchors
|
|
linkcheck_anchors = False
|
|
|
|
linkcheck_timeout = 10
|
|
|
|
# -- Custom Sphinx roles for UI -------------------------------------------
|
|
|
|
rst_prolog = """
|
|
.. role:: button
|
|
:class: role-button role-ui
|
|
|
|
.. role:: menu
|
|
:class: role-menu role-ui
|
|
|
|
.. role:: inspector
|
|
:class: role-ui
|
|
|
|
.. role:: ui
|
|
:class: role-ui
|
|
|
|
"""
|
|
|
|
# -- I18n settings --------------------------------------------------------
|
|
|
|
# Godot localization is handled via https://github.com/godotengine/godot-docs-l10n
|
|
# where the main docs repo is a submodule. Therefore the translated material is
|
|
# actually in the parent folder of this conf.py, hence the "../".
|
|
|
|
locale_dirs = ["../sphinx/po/"]
|
|
gettext_compact = False
|
|
|
|
# We want to host the localized images in godot-docs-l10n, but Sphinx does not provide
|
|
# the necessary feature to do so. `figure_language_filename` has `{root}` and `{path}`,
|
|
# but they resolve to (host) absolute paths, so we can't use them as is to access "../".
|
|
# However, Python is glorious and lets us redefine Sphinx's internal method that handles
|
|
# `figure_language_filename`, so we do our own post-processing to fix the absolute path
|
|
# and point to the parallel folder structure in godot-docs-l10n.
|
|
# Note: Sphinx's handling of `figure_language_filename` may change in the future, monitor
|
|
# https://github.com/sphinx-doc/sphinx/issues/7768 to see what would be relevant for us.
|
|
figure_language_filename = "{root}.{language}{ext}"
|
|
|
|
cwd = os.getcwd()
|
|
|
|
sphinx_original_get_image_filename_for_language = sphinx.util.i18n.get_image_filename_for_language
|
|
|
|
|
|
def godot_get_image_filename_for_language(filename, env):
|
|
"""
|
|
Hack the absolute path returned by Sphinx based on `figure_language_filename`
|
|
to insert our `../images` relative path to godot-docs-l10n's images folder,
|
|
which mirrors the folder structure of the docs repository.
|
|
The returned string should also be absolute so that `os.path.exists` can properly
|
|
resolve it when trying to concatenate with the original doc folder.
|
|
"""
|
|
path = sphinx_original_get_image_filename_for_language(filename, env)
|
|
path = os.path.abspath(os.path.join("../images/", os.path.relpath(path, cwd)))
|
|
return path
|
|
|
|
sphinx.util.i18n.get_image_filename_for_language = godot_get_image_filename_for_language
|
|
|
|
# Similar story for the localized class reference, it's out of tree and there doesn't
|
|
# seem to be an easy way for us to tweak the toctree to take this into account.
|
|
# So we're deleting the existing class reference and adding a symlink instead...
|
|
if is_i18n and os.path.exists("../classes/" + language):
|
|
import shutil
|
|
|
|
if os.path.islink("classes"): # Previously made symlink.
|
|
os.unlink("classes")
|
|
else:
|
|
shutil.rmtree("classes")
|
|
|
|
os.symlink("../classes/" + language, "classes")
|
|
|
|
# Couldn't find a way to retrieve variables nor do advanced string
|
|
# concat from reST, so had to hardcode this in the "epilog" added to
|
|
# all pages. This is used in index.rst to display the Weblate badge.
|
|
# On English pages, the badge points to the language-neutral engage page.
|
|
rst_epilog = """
|
|
.. |weblate_widget| image:: https://hosted.weblate.org/widgets/godot-engine/{image_locale}/godot-docs/287x66-white.png
|
|
:alt: Translation status
|
|
:target: https://hosted.weblate.org/engage/godot-engine{target_locale}/?utm_source=widget
|
|
:width: 287
|
|
:height: 66
|
|
""".format(
|
|
image_locale="-" if language == "en" else language,
|
|
target_locale="" if language == "en" else "/" + language,
|
|
)
|
|
|
|
# Needed so the table of contents is created for EPUB
|
|
epub_tocscope = 'includehidden'
|