From 08c51382a419b225e57646c730739f3ee5a853cb Mon Sep 17 00:00:00 2001 From: Nadeem Khan Date: Wed, 23 Sep 2026 16:24:46 -0500 Subject: [PATCH] feat(demo): a link preview card for the hosted demo Pasting either link showed nothing: the app's own page had no Open Graph tags, and the Space's card had no thumbnail. - `scripts/social_card.html` is a 1200x630 card in the playground's own language -- mist paper, one verdigris accent, Schibsted Grotesk and Fragment Mono -- carried by the words, with a fragment of a plan turning into SQL underneath. `python scripts/render_social_card.py` renders it with headless Chrome into the two places that need it, and a test holds those two byte-identical. - The playground adds the Open Graph and Twitter tags to the built page's head as each request goes out (`preview.py`) rather than baking them in: a crawler runs no JavaScript, and `og:image` and `og:url` have to be absolute, so the host comes off the request -- the forwarded headers when a proxy set them, which is what the Space does. The card is served at `/social-card.png` and ships in the wheel. - The Space's front-matter gains `thumbnail`, read over raw GitHub so the card works before the Space has built. --- deploy/huggingface/README.md | 7 + docs/assets/social-card.png | Bin 0 -> 62327 bytes docs/deployment/hosted-demo.md | 50 +++++ packages/nl2sql/pyproject.toml | 6 +- .../src/nl2sql/cli/demo/playground/app.py | 21 ++- .../demo/playground/assets/social-card.png | Bin 0 -> 62327 bytes .../src/nl2sql/cli/demo/playground/preview.py | 101 ++++++++++ .../cli/demo/playground/static/index.html | 5 +- .../unit/test_hosted_space_definition.py | 24 +++ .../nl2sql/tests/unit/test_playground_app.py | 99 ++++++++++ .../tests/unit/test_playground_settings.py | 1 + scripts/render_social_card.py | 115 ++++++++++++ scripts/social_card.html | 175 ++++++++++++++++++ web/playground/index.html | 5 +- 14 files changed, 601 insertions(+), 8 deletions(-) create mode 100644 docs/assets/social-card.png create mode 100644 packages/nl2sql/src/nl2sql/cli/demo/playground/assets/social-card.png create mode 100644 packages/nl2sql/src/nl2sql/cli/demo/playground/preview.py create mode 100644 scripts/render_social_card.py create mode 100644 scripts/social_card.html diff --git a/deploy/huggingface/README.md b/deploy/huggingface/README.md index 52ff4e8b..808800da 100644 --- a/deploy/huggingface/README.md +++ b/deploy/huggingface/README.md @@ -8,6 +8,7 @@ app_port: 7860 pinned: false license: mit short_description: Ask a sample database in English, with your own API key +thumbnail: https://raw.githubusercontent.com/nadeem4/nl2sql/main/docs/assets/social-card.png --- # nl2sql playground @@ -45,6 +46,12 @@ Everything the Space needs is in this one folder: the `Dockerfile` builds the image with no build context from the repository, and the front-matter above is the Space configuration. Nothing here holds a secret. +The front-matter's `short_description` and `thumbnail` are what this Space's +own link preview is made of; the thumbnail is read from raw GitHub, so the card +works before the Space has built. The image is generated -- regenerate it with +`python scripts/render_social_card.py`, described in +[the hosted demo docs](https://github.com/nadeem4/nl2sql/blob/main/docs/deployment/hosted-demo.md). + **Normally this is automatic.** `.github/workflows/publish_space.yml` in the repository creates the Space if it is missing, mirrors this folder onto its root, and waits for the build -- on every push to `main` that touches this diff --git a/docs/assets/social-card.png b/docs/assets/social-card.png new file mode 100644 index 0000000000000000000000000000000000000000..108b3dcbc8184c885cb45ec2eedd7a5113eb80a2 GIT binary patch literal 62327 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

cm>dz&@yCpUt!6F>TpH=Cd&-me%rSzM-jG6+5W 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 literal 0 HcmV?d00001 diff --git a/docs/deployment/hosted-demo.md b/docs/deployment/hosted-demo.md index af18ba56..19734377 100644 --- a/docs/deployment/hosted-demo.md +++ b/docs/deployment/hosted-demo.md @@ -351,6 +351,55 @@ If step 3 is refused because the Space has commits of its own, replaces the Space's history with this folder's. The workflow above never needs that, which is why it exists. +## The link preview + +Two different links go around, and each unfurls from a different place: + +| Pasted link | The card comes from | +| --- | --- | +| | the Open Graph and Twitter tags in the page the app serves | +| | `short_description` and `thumbnail` in `deploy/huggingface/README.md`'s front-matter | + +Both show the same 1200x630 card: + +![The link preview card: the nl2sql playground wordmark, the line "Ask a database in plain English, the model plans, the code writes the SQL", and a fragment of a plan turning into SQL](../assets/social-card.png) + +**The app's tags** are added to the built page's `` by +[`preview.py`][preview] as each request goes out, not baked into the bundle. A +crawler runs no JavaScript, so a tag React adds on mount is a tag nobody sees; +and `og:image` and `og:url` have to be absolute, while the same page is the +Space, a container and `http://127.0.0.1:8000`. So the host comes off the +request: `X-Forwarded-Proto` and `X-Forwarded-Host` when a proxy set them +(which is what the Space does), the `Host` header otherwise, and the URL the +app itself saw if neither is a host. The card is served by the app at +`/social-card.png` and ships in the wheel, so a `pip install` serves it too. + +**The Space's card** reads `thumbnail` over raw GitHub rather than from the +Space, so it works before the Space has built and while it is asleep. + +### Regenerating the card + +The card is rendered from `scripts/social_card.html`, which uses the +playground's own colours and both of its typefaces. Edit that file, then: + +```bash +cd web/playground && npm ci && cd ../.. # the fonts the card borrows +python scripts/render_social_card.py +``` + +Headless Chrome shoots it at 1200x630 and the script writes the same bytes to +both places that need them: `docs/assets/social-card.png`, which the Space's +`thumbnail` reads, and +`packages/nl2sql/src/nl2sql/cli/demo/playground/assets/social-card.png`, which +the app serves. A test holds the two byte-identical, so regenerating into only +one of them fails rather than going out half-changed. + +A card validator needs a public URL, so the check that the card really unfurls +can only be run against the deployed Space, with X's card validator or +. What the tests check is everything up to that: the +tags are in the served HTML, their URLs are absolute, and the image is served +as `image/png`. + ## Running it locally instead Hosted mode exists to show the engine on our sample data. To ask questions of @@ -364,5 +413,6 @@ nl2sql demo See [Demo](../getting_started/demo.md). [key-module]: https://github.com/nadeem4/nl2sql/blob/main/packages/nl2sql/src/nl2sql/llm/request_key.py +[preview]: https://github.com/nadeem4/nl2sql/blob/main/packages/nl2sql/src/nl2sql/cli/demo/playground/preview.py [space-readme]: https://github.com/nadeem4/nl2sql/blob/main/deploy/huggingface/README.md [workflow]: https://github.com/nadeem4/nl2sql/blob/main/.github/workflows/publish_space.yml diff --git a/packages/nl2sql/pyproject.toml b/packages/nl2sql/pyproject.toml index 3c3e5360..8f8dc9b5 100644 --- a/packages/nl2sql/pyproject.toml +++ b/packages/nl2sql/pyproject.toml @@ -101,5 +101,7 @@ include = ["nl2sql*"] "nl2sql.evaluation" = ["datasets/*.yaml"] "nl2sql.evaluation.presets" = ["*.yaml"] # The committed Vite build of web/playground: the wheel must carry the finished -# page so `pip install "nl2sql-engine[demo]"` needs no Node toolchain. -"nl2sql.cli.demo.playground" = ["static/*"] +# page so `pip install "nl2sql-engine[demo]"` needs no Node toolchain. The card +# the link preview names sits beside it rather than in `static/`, which the +# Vite build empties on every run. +"nl2sql.cli.demo.playground" = ["static/*", "assets/*"] diff --git a/packages/nl2sql/src/nl2sql/cli/demo/playground/app.py b/packages/nl2sql/src/nl2sql/cli/demo/playground/app.py index 0202180e..f241633f 100644 --- a/packages/nl2sql/src/nl2sql/cli/demo/playground/app.py +++ b/packages/nl2sql/src/nl2sql/cli/demo/playground/app.py @@ -1,8 +1,10 @@ """The playground FastAPI app. -Fifteen routes: +Sixteen routes: -``GET /`` the built React page +``GET /`` the built React page, with the link preview's + tags in its head (see :mod:`preview`) +``GET /social-card.png`` the 1200x630 card those tags name ``GET /api/meta`` mode, dataset, every registered datasource, the guided questions (flat, and grouped by datasource), the roles and how many guided questions have replay recordings @@ -58,6 +60,7 @@ from nl2sql.auth.models import UserContext from nl2sql.cli.demo.playground.hosted import FEEDBACK_MESSAGE, REBUILD_MESSAGE, Hosted from nl2sql.cli.demo.playground.index_panel import IndexPanel +from nl2sql.cli.demo.playground.preview import CARD, CARD_ROUTE, with_preview from nl2sql.cli.demo.playground.settings import SettingsPanel from nl2sql.common.settings import settings from nl2sql.feedback import NOTE_MAX_CHARS, FeedbackStore, run_record, run_signals @@ -304,8 +307,18 @@ async def _invalid_request(request: Request, exc: RequestValidationError) -> JSO app.mount("/static", StaticFiles(directory=str(STATIC_DIR)), name="static") @app.get("/", response_class=HTMLResponse) - def index() -> str: - return page + def index(request: Request) -> str: + # The preview tags are added here rather than baked into the built + # page: they carry absolute URLs, and the host they name is the one + # this request arrived on. See :mod:`preview`. + return with_preview(page, request) + + @app.get(CARD_ROUTE, include_in_schema=False) + def social_card() -> FileResponse: + """The card the preview tags name. It ships with the package.""" + if not CARD.is_file(): + raise HTTPException(status_code=404, detail="No preview card in this install.") + return FileResponse(CARD, media_type="image/png") # One group per datasource that has guided questions, in the order given. groups = [{"datasource": ds, "questions": list(qs)} diff --git a/packages/nl2sql/src/nl2sql/cli/demo/playground/assets/social-card.png b/packages/nl2sql/src/nl2sql/cli/demo/playground/assets/social-card.png new file mode 100644 index 0000000000000000000000000000000000000000..108b3dcbc8184c885cb45ec2eedd7a5113eb80a2 GIT binary patch literal 62327 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

cm>dz&@yCpUt!6F>TpH=Cd&-me%rSzM-jG6+5W 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 literal 0 HcmV?d00001 diff --git a/packages/nl2sql/src/nl2sql/cli/demo/playground/preview.py b/packages/nl2sql/src/nl2sql/cli/demo/playground/preview.py new file mode 100644 index 00000000..c3442d04 --- /dev/null +++ b/packages/nl2sql/src/nl2sql/cli/demo/playground/preview.py @@ -0,0 +1,101 @@ +"""The link preview: what a pasted link to the playground unfurls into. + +Three things have to be true for a card to appear, and each is why a piece of +this module exists: + +1. **The tags are in the HTML the server sends.** A crawler runs no + JavaScript, so a tag the React bundle adds on mount is a tag nobody sees. + :func:`with_preview` puts them in the ```` of the built page as it + goes out. +2. **``og:image`` and ``og:url`` are absolute.** A relative path is not + resolved by most unfurlers, and the one absolute URL that would work + everywhere does not exist: the same page is the Space, a container, and + ``http://127.0.0.1:8000``. :func:`origin` reads the host the visitor typed + off the request instead. +3. **The image is served by the app.** The card ships in the package, so a + ``pip install "nl2sql-engine[demo]"`` serves it too; ``docs/assets`` holds + the same bytes for the Space's own card, which is read from GitHub before + the Space has built. + +The card itself is generated: ``scripts/social_card.html`` is the source and +``python scripts/render_social_card.py`` renders it. +""" + +from __future__ import annotations + +import html +import pathlib +import re +from importlib.resources import files + +CARD = pathlib.Path(str(files("nl2sql.cli.demo.playground") / "assets" / "social-card.png")) + +# Where the app serves the card. A path of its own rather than one under +# ``/static``, because the build empties that directory on every `npm run +# build` and the card is not the bundle's to write. +CARD_ROUTE = "/social-card.png" + +TITLE = "nl2sql playground" + +# The card says the same thing in the same words: whatever is changed here is +# changed in `scripts/social_card.html` too. ``—`` is an em dash; the rest +# of this repository's source is ASCII and this keeps it that way. +DESCRIPTION = ( + "Ask a database in plain English — the model plans, the code writes the SQL. " + "Bring your own API key and ask the sample databases: the plan, the checks, " + "the SQL, the rows and the cost, step by step." +) + +# A host is a name and an optional port and nothing else. Anything else is +# either a proxy this code does not understand or a forged header trying to +# write a URL of its own into the page, and both fall back. +_HOST = re.compile(r"[A-Za-z0-9.\-]{1,253}(:[0-9]{1,5})?") + + +def _first(value: str | None) -> str | None: + """The first entry of a forwarded header; proxies chain them with commas.""" + return value.split(",")[0].strip() if value else None + + +def origin(request) -> str: + """The scheme and host to build the preview's absolute URLs from. + + A Space serves this page behind a proxy: the request the app sees is plain + HTTP to an internal address, while the visitor typed + ``https://nadeem4nk-nl2sql-demo.hf.space``. The forwarded headers carry + that, so they decide; with no proxy in front they are absent and the URL + the app itself saw is already right. + """ + scheme = _first(request.headers.get("x-forwarded-proto")) or request.url.scheme + host = _first(request.headers.get("x-forwarded-host")) or request.headers.get("host") or "" + if scheme in ("http", "https") and _HOST.fullmatch(host): + return f"{scheme}://{host}" + return str(request.base_url).rstrip("/") + + +def head_tags(site: str) -> str: + """The preview's ```` tags, for a page served from ``site``.""" + page, image = f"{site}/", f"{site}{CARD_ROUTE}" + tags = [ + ("name", "description", DESCRIPTION), + ("property", "og:type", "website"), + ("property", "og:site_name", TITLE), + ("property", "og:title", TITLE), + ("property", "og:description", DESCRIPTION), + ("property", "og:url", page), + ("property", "og:image", image), + ("property", "og:image:width", "1200"), + ("property", "og:image:height", "630"), + ("property", "og:image:alt", "The nl2sql playground card: ask a database in plain English."), + ("name", "twitter:card", "summary_large_image"), + ("name", "twitter:title", TITLE), + ("name", "twitter:description", DESCRIPTION), + ("name", "twitter:image", image), + ] + return "".join(f'' + for kind, key, value in tags) + + +def with_preview(page: str, request) -> str: + """The built page with the preview tags in its ````.""" + return page.replace("", head_tags(origin(request)) + "", 1) diff --git a/packages/nl2sql/src/nl2sql/cli/demo/playground/static/index.html b/packages/nl2sql/src/nl2sql/cli/demo/playground/static/index.html index 1720a682..dc75a479 100644 --- a/packages/nl2sql/src/nl2sql/cli/demo/playground/static/index.html +++ b/packages/nl2sql/src/nl2sql/cli/demo/playground/static/index.html @@ -3,7 +3,10 @@ - + nl2sql playground diff --git a/packages/nl2sql/tests/unit/test_hosted_space_definition.py b/packages/nl2sql/tests/unit/test_hosted_space_definition.py index d6216f2b..a8e3f3f8 100644 --- a/packages/nl2sql/tests/unit/test_hosted_space_definition.py +++ b/packages/nl2sql/tests/unit/test_hosted_space_definition.py @@ -32,6 +32,30 @@ def test_the_space_front_matter_declares_a_public_docker_space(): assert front["license"] == "mit" +def test_the_space_card_has_a_sentence_and_a_thumbnail(): + """What the Space's own link preview is made of. + + A Space card shows the `short_description` and the `thumbnail`, and has + nothing else to show: the README's body is the page, not the card. The + thumbnail is read from raw GitHub rather than from the Space, so the card + works before the Space has built and while it is sleeping. + """ + front = _front_matter() + + assert front["short_description"] + assert len(front["short_description"]) <= 60, "Hugging Face truncates a longer one" + assert front["thumbnail"] == ( + "https://raw.githubusercontent.com/nadeem4/nl2sql/main/docs/assets/social-card.png" + ) + + +def test_the_thumbnail_names_a_card_this_repository_holds(): + card = SPACE.parents[1] / "docs" / "assets" / "social-card.png" + + assert card.is_file(), "deploy/huggingface/README.md points its thumbnail at a missing file" + assert card.read_bytes().startswith(b"\x89PNG\r\n\x1a\n") + + def test_the_declared_port_is_the_one_the_container_listens_on(): dockerfile = (SPACE / "Dockerfile").read_text(encoding="utf-8") compose = yaml.safe_load((SPACE / "docker-compose.yml").read_text(encoding="utf-8")) diff --git a/packages/nl2sql/tests/unit/test_playground_app.py b/packages/nl2sql/tests/unit/test_playground_app.py index 00ce101b..324c94d4 100644 --- a/packages/nl2sql/tests/unit/test_playground_app.py +++ b/packages/nl2sql/tests/unit/test_playground_app.py @@ -1,4 +1,7 @@ """The playground FastAPI app: meta, ask, schema and the served page.""" +import pathlib +import re + import pytest fastapi = pytest.importorskip("fastapi") @@ -314,3 +317,99 @@ def test_trace_route_never_resolves_a_file_outside_the_directory(tmp_path): client = _trace_client(tmp_path) # "outside" is a valid-looking id, but its file sits one level up. assert client.get("/api/trace/outside").status_code == 404 + + +# ---------- the link preview ---------- +# +# A crawler runs no JavaScript and resolves no relative path, and both of those +# are the point here: the tags are in the HTML the server sends, and the URLs +# in them are absolute and name the host the visitor typed. + +REPO = pathlib.Path(__file__).resolve().parents[4] +CARD_COPIES = ( + REPO / "docs" / "assets" / "social-card.png", + REPO / "packages" / "nl2sql" / "src" / "nl2sql" / "cli" / "demo" / "playground" / "assets" / "social-card.png", +) + + +def _served_page(**headers) -> str: + client = TestClient(build_app(_Engine(), questions=[], roles=["admin"], mode="live", dataset="chinook")) + response = client.get("/", headers=headers) + assert response.status_code == 200 + return response.text + + +def _tag(html: str, key: str) -> str: + match = re.search(rf'') + assert _tag(html, "og:type") == "website" + assert _tag(html, "og:title") == "nl2sql playground" + assert "plain English" in _tag(html, "og:description") + assert _tag(html, "twitter:card") == "summary_large_image" + assert _tag(html, "twitter:title") == _tag(html, "og:title") + assert _tag(html, "twitter:description") == _tag(html, "og:description") + assert _tag(html, "twitter:image") == _tag(html, "og:image") + # One description, and it says what the card says. + assert _tag(html, "description") == _tag(html, "og:description") + assert html.count('name="description"') == 1 + + +def test_the_preview_urls_are_absolute_and_name_the_host_the_visitor_typed(): + html = _served_page(**{"x-forwarded-proto": "https", + "x-forwarded-host": "nadeem4nk-nl2sql-demo.hf.space"}) + + assert _tag(html, "og:url") == "https://nadeem4nk-nl2sql-demo.hf.space/" + assert _tag(html, "og:image") == "https://nadeem4nk-nl2sql-demo.hf.space/social-card.png" + assert _tag(html, "og:image:width") == "1200" + assert _tag(html, "og:image:height") == "630" + + +def test_without_a_proxy_the_preview_urls_are_the_ones_the_app_was_reached_on(): + html = _served_page() + + # TestClient asks for http://testserver/, which is what a local run looks + # like: absolute, and right for whoever can reach this playground. + assert _tag(html, "og:url") == "http://testserver/" + assert _tag(html, "og:image") == "http://testserver/social-card.png" + + +@pytest.mark.parametrize("host", ['evil">', "not a host", "", " "]) +def test_a_forged_host_header_cannot_write_a_url_into_the_page(host): + html = _served_page(**{"x-forwarded-host": host}) + + assert "" not in html + assert _tag(html, "og:image").startswith("http://") + assert _tag(html, "og:image").endswith("/social-card.png") + + +def test_the_app_serves_the_card_as_a_png(): + client = TestClient(build_app(_Engine(), questions=[], roles=["admin"], mode="live", dataset="chinook")) + response = client.get("/social-card.png") + + assert response.status_code == 200 + assert response.headers["content-type"] == "image/png" + assert response.content.startswith(b"\x89PNG\r\n\x1a\n") + + +def test_the_card_the_app_serves_is_the_one_the_space_reads_from_github(): + """Two copies, one file. + + The Space's `thumbnail:` reads the copy in `docs/` over raw GitHub, so the + Space's own card works before the Space has built; the playground serves + the copy in the package, so a pip install has it too. + `scripts/render_social_card.py` writes both, and a card regenerated into + only one of them is the drift this catches. + """ + docs, packaged = (path.read_bytes() for path in CARD_COPIES) + + assert docs == packaged + # Small enough that an unfurler fetches it rather than giving up. + assert len(docs) < 200 * 1024 diff --git a/packages/nl2sql/tests/unit/test_playground_settings.py b/packages/nl2sql/tests/unit/test_playground_settings.py index 3ec6227e..5dd765be 100644 --- a/packages/nl2sql/tests/unit/test_playground_settings.py +++ b/packages/nl2sql/tests/unit/test_playground_settings.py @@ -191,6 +191,7 @@ def _every_route_response(client, trace_id="0b8f7d2e-1111-4222-8333-944455556666 """One request per route; the test fails if a route is added and not listed.""" requests = { ("GET", "/"): lambda: client.get("/"), + ("GET", "/social-card.png"): lambda: client.get("/social-card.png"), ("GET", "/api/meta"): lambda: client.get("/api/meta"), ("GET", "/api/schema"): lambda: client.get("/api/schema"), ("POST", "/api/ask"): lambda: client.post("/api/ask", json={"question": "q1", "role": "admin"}), diff --git a/scripts/render_social_card.py b/scripts/render_social_card.py new file mode 100644 index 00000000..29de6d87 --- /dev/null +++ b/scripts/render_social_card.py @@ -0,0 +1,115 @@ +"""Renders ``scripts/social_card.html`` into the link preview card. + +The card is the 1200x630 image a link to the hosted demo unfurls into: the +playground's Open Graph tags name it, and the Hugging Face Space's front-matter +points its ``thumbnail`` at the copy in ``docs/``. + +Two copies are written, and a test holds them byte-identical: + +``docs/assets/social-card.png`` + what the Space's ``thumbnail:`` reads over raw.githubusercontent.com, so + the Space card works before the Space has built, and what the docs show. + +``packages/nl2sql/src/nl2sql/cli/demo/playground/assets/social-card.png`` + what the playground itself serves at ``/social-card.png``. It ships in the + wheel, so ``pip install "nl2sql-engine[demo]"`` has it too. + +The card borrows the playground's bundled fonts, so run ``npm ci`` in +``web/playground`` first, then:: + + python scripts/render_social_card.py + +Headless Chrome does the rendering. The fonts are inlined as ``data:`` URIs +into a copy of the page first, because Chrome refuses to load a font from a +``file:`` URL into a ``file:`` page. Chrome is found on PATH, in the usual +Windows and macOS locations, or named with ``--chrome``. +""" + +from __future__ import annotations + +import argparse +import base64 +import mimetypes +import pathlib +import re +import shutil +import subprocess +import sys +import tempfile + +ROOT = pathlib.Path(__file__).resolve().parents[1] +SOURCE = ROOT / "scripts" / "social_card.html" +OUTPUTS = ( + ROOT / "docs" / "assets" / "social-card.png", + ROOT / "packages" / "nl2sql" / "src" / "nl2sql" / "cli" / "demo" / "playground" / "assets" / "social-card.png", +) +WIDTH, HEIGHT = 1200, 630 + +# Every local file the stylesheet reaches for, so none is left to Chrome. +_URL = re.compile(r"""url\(\s*["']?([^"')]+)["']?\s*\)""") + +_CHROME_CANDIDATES = ( + "chrome", "google-chrome", "chromium", "chromium-browser", "msedge", + r"C:\Program Files\Google\Chrome\Application\chrome.exe", + r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe", + "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", +) + + +def find_chrome(named: str | None) -> str: + if named: + return named + for candidate in _CHROME_CANDIDATES: + found = shutil.which(candidate) or (candidate if pathlib.Path(candidate).exists() else None) + if found: + return found + raise SystemExit("No Chrome found. Pass one with --chrome.") + + +def inline_assets(html: str, base: pathlib.Path) -> str: + """Replaces every ``url(...)`` pointing at a local file with a data URI.""" + + def replace(match: re.Match[str]) -> str: + reference = match.group(1) + if reference.startswith(("data:", "http:", "https:")): + return match.group(0) + path = (base / reference).resolve() + if not path.is_file(): + raise SystemExit(f"{reference} is missing. Run `npm ci` in web/playground first.") + media = mimetypes.guess_type(path.name)[0] or "application/octet-stream" + return f'url("data:{media};base64,{base64.b64encode(path.read_bytes()).decode("ascii")}")' + + return _URL.sub(replace, html) + + +def render(chrome: str, html: str) -> bytes: + with tempfile.TemporaryDirectory() as work: + page = pathlib.Path(work) / "card.html" + page.write_text(html, encoding="utf-8") + shot = pathlib.Path(work) / "card.png" + subprocess.run( + [chrome, "--headless=new", "--disable-gpu", "--hide-scrollbars", + "--force-device-scale-factor=1", f"--window-size={WIDTH},{HEIGHT}", + "--virtual-time-budget=4000", f"--screenshot={shot}", page.as_uri()], + check=True, capture_output=True, + ) + if not shot.is_file(): + raise SystemExit("Chrome wrote no screenshot.") + return shot.read_bytes() + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser(description=__doc__.splitlines()[0]) + parser.add_argument("--chrome", help="the Chrome or Chromium binary to render with") + args = parser.parse_args(argv) + + png = render(find_chrome(args.chrome), inline_assets(SOURCE.read_text(encoding="utf-8"), SOURCE.parent)) + for out in OUTPUTS: + out.parent.mkdir(parents=True, exist_ok=True) + out.write_bytes(png) + print(f"{out.relative_to(ROOT)} {len(png) / 1024:.0f} KB") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/scripts/social_card.html b/scripts/social_card.html new file mode 100644 index 00000000..0664eb2f --- /dev/null +++ b/scripts/social_card.html @@ -0,0 +1,175 @@ + + + + + nl2sql playground link preview card + + + + +

+
+ + +

nl2sql playground

+
+ +
+

Ask a database in plain English — the model plans, the code writes the SQL

+

Bring your own API key · Sample data · Open source

+
+ +
+ group_by: country · sum(total) + → + SELECT country, SUM(total) … +
+
+ + diff --git a/web/playground/index.html b/web/playground/index.html index 2318c389..b3420956 100644 --- a/web/playground/index.html +++ b/web/playground/index.html @@ -3,7 +3,10 @@ - + nl2sql playground