mirror of
https://github.com/fastapi/fastapi.git
synced 2026-03-30 12:43:15 -04:00
✨ Refactor docs for building scripts, use MkDocs hooks, simplify (remove) configs for languages (#9742)
* ✨ Add MkDocs hooks to re-use all config from en, and auto-generate missing docs files form en * 🔧 Update MkDocs config for es * 🔧 Simplify configs for all languages * ✨ Compute available languages from MkDocs Material for config overrides in hooks * 🔧 Update config for MkDocs for en, to make paths compatible for other languages * ♻️ Refactor scripts/docs.py to remove all custom logic that is now handled by the MkDocs hooks * 🔧 Remove ta language as it's incomplete (no translations and causing errors) * 🔥 Remove ta lang, no translations available * 🔥 Remove dummy overrides directories, no longer needed * ✨ Use the same missing-translation.md file contents for hooks * ⏪️ Restore and refactor new-lang command * 📝 Update docs for contributing with new simplified workflow for translations * 🔊 Enable logs so that MkDocs can show its standard output on the docs.py script
This commit is contained in:
committed by
GitHub
parent
c563b5bcf1
commit
5656ed09ef
@@ -1,11 +1,88 @@
|
||||
from functools import lru_cache
|
||||
from pathlib import Path
|
||||
from typing import Any, List, Union
|
||||
|
||||
import material
|
||||
from mkdocs.config.defaults import MkDocsConfig
|
||||
from mkdocs.structure.files import Files
|
||||
from mkdocs.structure.files import File, Files
|
||||
from mkdocs.structure.nav import Link, Navigation, Section
|
||||
from mkdocs.structure.pages import Page
|
||||
|
||||
|
||||
@lru_cache()
|
||||
def get_missing_translation_content(docs_dir: str) -> str:
|
||||
docs_dir_path = Path(docs_dir)
|
||||
missing_translation_path = docs_dir_path.parent.parent / "missing-translation.md"
|
||||
return missing_translation_path.read_text(encoding="utf-8")
|
||||
|
||||
|
||||
@lru_cache()
|
||||
def get_mkdocs_material_langs() -> List[str]:
|
||||
material_path = Path(material.__file__).parent
|
||||
material_langs_path = material_path / "partials" / "languages"
|
||||
langs = [file.stem for file in material_langs_path.glob("*.html")]
|
||||
return langs
|
||||
|
||||
|
||||
class EnFile(File):
|
||||
pass
|
||||
|
||||
|
||||
def on_config(config: MkDocsConfig, **kwargs: Any) -> MkDocsConfig:
|
||||
available_langs = get_mkdocs_material_langs()
|
||||
dir_path = Path(config.docs_dir)
|
||||
lang = dir_path.parent.name
|
||||
if lang in available_langs:
|
||||
config.theme["language"] = lang
|
||||
if not (config.site_url or "").endswith(f"{lang}/") and not lang == "en":
|
||||
config.site_url = f"{config.site_url}{lang}/"
|
||||
return config
|
||||
|
||||
|
||||
def resolve_file(*, item: str, files: Files, config: MkDocsConfig) -> None:
|
||||
item_path = Path(config.docs_dir) / item
|
||||
if not item_path.is_file():
|
||||
en_src_dir = (Path(config.docs_dir) / "../../en/docs").resolve()
|
||||
potential_path = en_src_dir / item
|
||||
if potential_path.is_file():
|
||||
files.append(
|
||||
EnFile(
|
||||
path=item,
|
||||
src_dir=str(en_src_dir),
|
||||
dest_dir=config.site_dir,
|
||||
use_directory_urls=config.use_directory_urls,
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def resolve_files(*, items: List[Any], files: Files, config: MkDocsConfig) -> None:
|
||||
for item in items:
|
||||
if isinstance(item, str):
|
||||
resolve_file(item=item, files=files, config=config)
|
||||
elif isinstance(item, dict):
|
||||
assert len(item) == 1
|
||||
values = list(item.values())
|
||||
if not values:
|
||||
continue
|
||||
if isinstance(values[0], str):
|
||||
resolve_file(item=values[0], files=files, config=config)
|
||||
elif isinstance(values[0], list):
|
||||
resolve_files(items=values[0], files=files, config=config)
|
||||
else:
|
||||
raise ValueError(f"Unexpected value: {values}")
|
||||
|
||||
|
||||
def on_files(files: Files, *, config: MkDocsConfig) -> Files:
|
||||
resolve_files(items=config.nav or [], files=files, config=config)
|
||||
if "logo" in config.theme:
|
||||
resolve_file(item=config.theme["logo"], files=files, config=config)
|
||||
if "favicon" in config.theme:
|
||||
resolve_file(item=config.theme["favicon"], files=files, config=config)
|
||||
resolve_files(items=config.extra_css, files=files, config=config)
|
||||
resolve_files(items=config.extra_javascript, files=files, config=config)
|
||||
return files
|
||||
|
||||
|
||||
def generate_renamed_section_items(
|
||||
items: List[Union[Page, Section, Link]], *, config: MkDocsConfig
|
||||
) -> List[Union[Page, Section, Link]]:
|
||||
@@ -36,3 +113,20 @@ def on_nav(
|
||||
) -> Navigation:
|
||||
new_items = generate_renamed_section_items(nav.items, config=config)
|
||||
return Navigation(items=new_items, pages=nav.pages)
|
||||
|
||||
|
||||
def on_pre_page(page: Page, *, config: MkDocsConfig, files: Files) -> Page:
|
||||
return page
|
||||
|
||||
|
||||
def on_page_markdown(
|
||||
markdown: str, *, page: Page, config: MkDocsConfig, files: Files
|
||||
) -> str:
|
||||
if isinstance(page.file, EnFile):
|
||||
missing_translation_content = get_missing_translation_content(config.docs_dir)
|
||||
header = ""
|
||||
body = markdown
|
||||
if markdown.startswith("#"):
|
||||
header, _, body = markdown.partition("\n\n")
|
||||
return f"{header}\n\n{missing_translation_content}\n\n{body}"
|
||||
return markdown
|
||||
|
||||
Reference in New Issue
Block a user