Skip to content
This repository was archived by the owner on Apr 28, 2026. It is now read-only.

Commit 8b5b643

Browse files
committed
ENG-9266: Support ld+json for docs pages
1 parent 2d9739e commit 8b5b643

2 files changed

Lines changed: 27 additions & 2 deletions

File tree

pcweb/meta/meta.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,16 @@ def blog_index_jsonld(posts: list[tuple[str, dict]], url: str) -> rx.Component:
287287
return rx.el.script(json.dumps(data), type="application/ld+json")
288288

289289

290+
def jsonld_script(data: dict) -> rx.Component:
291+
"""Create a JSON-LD script tag from a dict.
292+
293+
Adds ``@context: https://schema.org`` when not already present.
294+
"""
295+
if "@context" not in data:
296+
data = {"@context": "https://schema.org", **data}
297+
return rx.el.script(json.dumps(data), type="application/ld+json")
298+
299+
290300
def faq_jsonld(faq_schema: dict) -> rx.Component:
291301
"""Create a FAQPage JSON-LD script tag from a pre-built schema dict."""
292302
return rx.el.script(json.dumps(faq_schema), type="application/ld+json")

pcweb/pages/docs/__init__.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from pcweb.constants import REFLEX_ASSETS_CDN
1414
from pcweb.docgen_pipeline import get_docgen_toc, render_docgen_document
1515
from pcweb.flexdown import xd
16+
from pcweb.meta.meta import jsonld_script
1617
from pcweb.pages.docs.component import multi_docs
1718
from pcweb.pages.library_previews import components_previews_pages
1819
from pcweb.route import Route
@@ -256,9 +257,14 @@ def get_component(doc: str, title: str):
256257
return None
257258

258259
d = load_flexdown_doc(actual_doc_path)
260+
ldjson = d.metadata.get("ldjson")
259261

260262
def comp():
261-
return (get_toc(d, actual_doc_path), xd.render(d, actual_doc_path))
263+
toc = get_toc(d, actual_doc_path)
264+
rendered = xd.render(d, actual_doc_path)
265+
if ldjson:
266+
rendered = rx.fragment(jsonld_script(ldjson), rendered)
267+
return (toc, rendered)
262268

263269
return make_docpage(resolved.route, resolved.display_title, doc, comp)
264270

@@ -273,9 +279,18 @@ def get_component_docgen(virtual_doc: str, actual_path: str, title: str):
273279
if virtual_doc.startswith("docs/library"):
274280
return handle_library_doc(virtual_doc, actual_path, title, resolved)
275281

276-
def comp(_actual=actual_path):
282+
# Load metadata to check for ldjson (docgen docs use flexdown for metadata).
283+
try:
284+
_meta_doc = load_flexdown_doc(actual_path)
285+
ldjson = _meta_doc.metadata.get("ldjson")
286+
except (OSError, ValueError):
287+
ldjson = None
288+
289+
def comp(_actual=actual_path, _ldjson=ldjson):
277290
toc = get_docgen_toc(_actual)
278291
rendered = render_docgen_document(_actual)
292+
if _ldjson:
293+
rendered = rx.fragment(jsonld_script(_ldjson), rendered)
279294
return (toc, rendered)
280295

281296
return make_docpage(resolved.route, resolved.display_title, virtual_doc, comp)

0 commit comments

Comments
 (0)