summaryrefslogtreecommitdiffstats
path: root/sphinx/builders/dirhtml.py
diff options
context:
space:
mode:
Diffstat (limited to 'sphinx/builders/dirhtml.py')
-rw-r--r--sphinx/builders/dirhtml.py53
1 files changed, 53 insertions, 0 deletions
diff --git a/sphinx/builders/dirhtml.py b/sphinx/builders/dirhtml.py
new file mode 100644
index 0000000..9683ee6
--- /dev/null
+++ b/sphinx/builders/dirhtml.py
@@ -0,0 +1,53 @@
+"""Directory HTML builders."""
+
+from __future__ import annotations
+
+from os import path
+from typing import TYPE_CHECKING, Any
+
+from sphinx.builders.html import StandaloneHTMLBuilder
+from sphinx.util import logging
+from sphinx.util.osutil import SEP, os_path
+
+if TYPE_CHECKING:
+ from sphinx.application import Sphinx
+
+logger = logging.getLogger(__name__)
+
+
+class DirectoryHTMLBuilder(StandaloneHTMLBuilder):
+ """
+ A StandaloneHTMLBuilder that creates all HTML pages as "index.html" in
+ a directory given by their pagename, so that generated URLs don't have
+ ``.html`` in them.
+ """
+ name = 'dirhtml'
+
+ def get_target_uri(self, docname: str, typ: str | None = None) -> str:
+ if docname == 'index':
+ return ''
+ if docname.endswith(SEP + 'index'):
+ return docname[:-5] # up to sep
+ return docname + SEP
+
+ def get_outfilename(self, pagename: str) -> str:
+ if pagename == 'index' or pagename.endswith(SEP + 'index'):
+ outfilename = path.join(self.outdir, os_path(pagename) +
+ self.out_suffix)
+ else:
+ outfilename = path.join(self.outdir, os_path(pagename),
+ 'index' + self.out_suffix)
+
+ return outfilename
+
+
+def setup(app: Sphinx) -> dict[str, Any]:
+ app.setup_extension('sphinx.builders.html')
+
+ app.add_builder(DirectoryHTMLBuilder)
+
+ return {
+ 'version': 'builtin',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }