feat: draw a sharing card per platform page
Each platform page shares a card titled with the platform's name, rendered by make_og_cards.py --only platforms.
No files matched your search
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 51 KiB |
@@ -5,40 +5,76 @@ Each card is an SVG written by ``sitediagrams.og_card_svg`` from the
|
|||||||
registry, rasterised by a headless Chromium through Playwright, then
|
registry, rasterised by a headless Chromium through Playwright, then
|
||||||
committed under ``docs_assets/og/``. The site build copies the PNG files and
|
committed under ``docs_assets/og/``. The site build copies the PNG files and
|
||||||
never runs this script, so it adds nothing to the build's dependencies.
|
never runs this script, so it adds nothing to the build's dependencies.
|
||||||
Run it again when a section's wording or the platform count changes.
|
Run it again when a section's wording, the platform count or the list of
|
||||||
|
platforms changes.
|
||||||
|
|
||||||
python scripts/make_og_cards.py
|
python scripts/make_og_cards.py
|
||||||
|
python scripts/make_og_cards.py --only platforms
|
||||||
|
|
||||||
|
A platform page shares a card with its own name (``og/platforms/<id>.png``),
|
||||||
|
the other pages their section's.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import argparse
|
||||||
import sys
|
import sys
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
ROOT = Path(__file__).resolve().parent.parent
|
ROOT = Path(__file__).resolve().parent.parent
|
||||||
sys.path.insert(0, str(ROOT / "scripts"))
|
sys.path.insert(0, str(ROOT / "scripts"))
|
||||||
|
|
||||||
|
from common import list_registered_platforms, load_platform_config # noqa: E402
|
||||||
from sitediagrams import OG_SECTIONS, og_card_svg # noqa: E402
|
from sitediagrams import OG_SECTIONS, og_card_svg # noqa: E402
|
||||||
|
|
||||||
OUT = ROOT / "docs_assets" / "og"
|
OUT = ROOT / "docs_assets" / "og"
|
||||||
LOGO = ROOT / ".github" / "assets" / "logo.png"
|
LOGO = ROOT / ".github" / "assets" / "logo.png"
|
||||||
|
PLATFORM_TAGLINE = "Which BIOS files it needs, and where each one goes"
|
||||||
|
|
||||||
|
|
||||||
|
def platform_cards() -> dict[str, str]:
|
||||||
|
"""Each platform page's card, by its path under og/, with its title."""
|
||||||
|
platforms = ROOT / "platforms"
|
||||||
|
return {
|
||||||
|
f"platforms/{name}": load_platform_config(name, str(platforms))["platform"]
|
||||||
|
for name in list_registered_platforms(str(platforms), include_archived=True)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def card_svg(key: str, logo: bytes, titles: dict[str, str]) -> str:
|
||||||
|
if key in OG_SECTIONS:
|
||||||
|
return og_card_svg(key, logo)
|
||||||
|
# A platform card is a section card with the platform's name for title.
|
||||||
|
OG_SECTIONS[key] = (titles[key], PLATFORM_TAGLINE)
|
||||||
|
try:
|
||||||
|
return og_card_svg(key, logo)
|
||||||
|
finally:
|
||||||
|
del OG_SECTIONS[key]
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
def main() -> None:
|
||||||
|
parser = argparse.ArgumentParser(description="Render the sharing cards to PNG.",
|
||||||
|
allow_abbrev=False)
|
||||||
|
parser.add_argument("--only", choices=("sections", "platforms"),
|
||||||
|
help="render one kind of card (default: both)")
|
||||||
|
args = parser.parse_args()
|
||||||
try:
|
try:
|
||||||
from playwright.sync_api import sync_playwright
|
from playwright.sync_api import sync_playwright
|
||||||
except ImportError as exc:
|
except ImportError as exc:
|
||||||
raise SystemExit("Playwright with Chromium is needed: pip install playwright") from exc
|
raise SystemExit("Playwright with Chromium is needed: pip install playwright") from exc
|
||||||
OUT.mkdir(parents=True, exist_ok=True)
|
titles = platform_cards()
|
||||||
|
keys = [*([] if args.only == "platforms" else OG_SECTIONS),
|
||||||
|
*([] if args.only == "sections" else titles)]
|
||||||
logo = LOGO.read_bytes()
|
logo = LOGO.read_bytes()
|
||||||
with sync_playwright() as playwright:
|
with sync_playwright() as playwright:
|
||||||
browser = playwright.chromium.launch()
|
browser = playwright.chromium.launch()
|
||||||
page = browser.new_page(viewport={"width": 1200, "height": 630})
|
page = browser.new_page(viewport={"width": 1200, "height": 630})
|
||||||
for section in OG_SECTIONS:
|
for key in keys:
|
||||||
page.set_content(
|
page.set_content(
|
||||||
'<html><body style="margin:0">' + og_card_svg(section, logo) + "</body></html>"
|
'<html><body style="margin:0">' + card_svg(key, logo, titles) + "</body></html>"
|
||||||
)
|
)
|
||||||
path = OUT / f"{section}.png"
|
path = OUT / f"{key}.png"
|
||||||
|
path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
page.screenshot(path=str(path), clip={"x": 0, "y": 0, "width": 1200, "height": 630})
|
page.screenshot(path=str(path), clip={"x": 0, "y": 0, "width": 1200, "height": 630})
|
||||||
print(path.relative_to(ROOT))
|
print(path.relative_to(ROOT))
|
||||||
browser.close()
|
browser.close()
|
||||||
|
|||||||