Prefix all SX URLs with /sx/ for WhatsApp-safe sharing
All routes moved under /sx/ prefix: - / redirects to /sx/ - /sx/ serves home page - /sx/<path:expr> is the catch-all for SX expression URLs - Bare /(...) and /~... redirect to /sx/(...) and /sx/~... - All ~600 hrefs, sx-get attrs, defhandler paths, redirect targets, and blueprint routes updated across 44 files Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -214,8 +214,8 @@ async def eval_sx_url(raw_path: str) -> Any:
|
||||
|
||||
ctx = _get_request_context()
|
||||
|
||||
# Use raw URL path for nav matching — dots in hrefs match dots in URLs
|
||||
path_str = raw_path
|
||||
# Nav hrefs use /sx/ prefix — reconstruct the full path for nav matching
|
||||
path_str = f"/sx{raw_path}" if raw_path != "/" else "/sx/"
|
||||
|
||||
# Check if expression head is a component (~name) — if so, skip
|
||||
# async_eval and pass directly to _eval_slot. Components contain HTML
|
||||
@@ -285,109 +285,109 @@ _REDIRECT_PATTERNS = [
|
||||
|
||||
# Reference API: /geography/hypermedia/reference/api/item/<id>
|
||||
(re.compile(r"^/geography/hypermedia/reference/api/item/(.+?)/?$"),
|
||||
lambda m: f"/(geography.(hypermedia.(reference.(api.(item.{m.group(1)})))))"),
|
||||
lambda m: f"/sx/(geography.(hypermedia.(reference.(api.(item.{m.group(1)})))))"),
|
||||
# Reference API: /geography/hypermedia/reference/api/<name>
|
||||
(re.compile(r"^/geography/hypermedia/reference/api/(.+?)/?$"),
|
||||
lambda m: f"/(geography.(hypermedia.(reference.(api.{m.group(1)}))))"),
|
||||
lambda m: f"/sx/(geography.(hypermedia.(reference.(api.{m.group(1)}))))"),
|
||||
|
||||
# Example API: sub-paths with params
|
||||
(re.compile(r"^/geography/hypermedia/examples/api/editrow/(.+?)/cancel/?$"),
|
||||
lambda m: f"/(geography.(hypermedia.(example.(api.(editrow-cancel.{m.group(1)})))))"),
|
||||
lambda m: f"/sx/(geography.(hypermedia.(example.(api.(editrow-cancel.{m.group(1)})))))"),
|
||||
(re.compile(r"^/geography/hypermedia/examples/api/editrow/(.+?)/?$"),
|
||||
lambda m: f"/(geography.(hypermedia.(example.(api.(editrow.{m.group(1)})))))"),
|
||||
lambda m: f"/sx/(geography.(hypermedia.(example.(api.(editrow.{m.group(1)})))))"),
|
||||
(re.compile(r"^/geography/hypermedia/examples/api/delete/(.+?)/?$"),
|
||||
lambda m: f"/(geography.(hypermedia.(example.(api.(delete.{m.group(1)})))))"),
|
||||
lambda m: f"/sx/(geography.(hypermedia.(example.(api.(delete.{m.group(1)})))))"),
|
||||
(re.compile(r"^/geography/hypermedia/examples/api/tabs/(.+?)/?$"),
|
||||
lambda m: f"/(geography.(hypermedia.(example.(api.(tabs.{m.group(1)})))))"),
|
||||
lambda m: f"/sx/(geography.(hypermedia.(example.(api.(tabs.{m.group(1)})))))"),
|
||||
# Example API: sub-paths collapsed to hyphens
|
||||
(re.compile(r"^/geography/hypermedia/examples/api/edit/cancel/?$"),
|
||||
"/(geography.(hypermedia.(example.(api.edit-cancel))))"),
|
||||
"/sx/(geography.(hypermedia.(example.(api.edit-cancel))))"),
|
||||
(re.compile(r"^/geography/hypermedia/examples/api/progress/start/?$"),
|
||||
"/(geography.(hypermedia.(example.(api.progress-start))))"),
|
||||
"/sx/(geography.(hypermedia.(example.(api.progress-start))))"),
|
||||
(re.compile(r"^/geography/hypermedia/examples/api/progress/status/?$"),
|
||||
"/(geography.(hypermedia.(example.(api.progress-status))))"),
|
||||
"/sx/(geography.(hypermedia.(example.(api.progress-status))))"),
|
||||
(re.compile(r"^/geography/hypermedia/examples/api/validate/submit/?$"),
|
||||
"/(geography.(hypermedia.(example.(api.validate-submit))))"),
|
||||
"/sx/(geography.(hypermedia.(example.(api.validate-submit))))"),
|
||||
(re.compile(r"^/geography/hypermedia/examples/api/dialog/close/?$"),
|
||||
"/(geography.(hypermedia.(example.(api.dialog-close))))"),
|
||||
"/sx/(geography.(hypermedia.(example.(api.dialog-close))))"),
|
||||
(re.compile(r"^/geography/hypermedia/examples/api/putpatch/edit-all/?$"),
|
||||
"/(geography.(hypermedia.(example.(api.putpatch-edit-all))))"),
|
||||
"/sx/(geography.(hypermedia.(example.(api.putpatch-edit-all))))"),
|
||||
(re.compile(r"^/geography/hypermedia/examples/api/putpatch/cancel/?$"),
|
||||
"/(geography.(hypermedia.(example.(api.putpatch-cancel))))"),
|
||||
"/sx/(geography.(hypermedia.(example.(api.putpatch-cancel))))"),
|
||||
# Example API: simple names
|
||||
(re.compile(r"^/geography/hypermedia/examples/api/(.+?)/?$"),
|
||||
lambda m: f"/(geography.(hypermedia.(example.(api.{m.group(1)}))))"),
|
||||
lambda m: f"/sx/(geography.(hypermedia.(example.(api.{m.group(1)}))))"),
|
||||
|
||||
# Reactive API: sub-paths collapsed
|
||||
(re.compile(r"^/geography/reactive/api/search/(.+?)/?$"),
|
||||
lambda m: f"/(geography.(reactive.(api.search-{m.group(1)})))"),
|
||||
lambda m: f"/sx/(geography.(reactive.(api.search-{m.group(1)})))"),
|
||||
(re.compile(r"^/geography/reactive/api/(.+?)/?$"),
|
||||
lambda m: f"/(geography.(reactive.(api.{m.group(1)})))"),
|
||||
lambda m: f"/sx/(geography.(reactive.(api.{m.group(1)})))"),
|
||||
|
||||
# --- Page redirects ---
|
||||
|
||||
# More specific first
|
||||
(re.compile(r"^/language/specs/explore/(.+?)/?$"),
|
||||
lambda m: f"/(language.(spec.(explore.{m.group(1)})))"),
|
||||
lambda m: f"/sx/(language.(spec.(explore.{m.group(1)})))"),
|
||||
(re.compile(r"^/language/docs/(.+?)/?$"),
|
||||
lambda m: f"/(language.(doc.{m.group(1)}))"),
|
||||
lambda m: f"/sx/(language.(doc.{m.group(1)}))"),
|
||||
(re.compile(r"^/language/docs/?$"),
|
||||
"/(language.(doc))"),
|
||||
"/sx/(language.(doc))"),
|
||||
(re.compile(r"^/language/specs/(.+?)/?$"),
|
||||
lambda m: f"/(language.(spec.{m.group(1)}))"),
|
||||
lambda m: f"/sx/(language.(spec.{m.group(1)}))"),
|
||||
(re.compile(r"^/language/bootstrappers/page-helpers/?$"),
|
||||
"/(language.(bootstrapper.page-helpers))"),
|
||||
"/sx/(language.(bootstrapper.page-helpers))"),
|
||||
(re.compile(r"^/language/bootstrappers/(.+?)/?$"),
|
||||
lambda m: f"/(language.(bootstrapper.{m.group(1)}))"),
|
||||
lambda m: f"/sx/(language.(bootstrapper.{m.group(1)}))"),
|
||||
(re.compile(r"^/language/testing/(.+?)/?$"),
|
||||
lambda m: f"/(language.(test.{m.group(1)}))"),
|
||||
lambda m: f"/sx/(language.(test.{m.group(1)}))"),
|
||||
(re.compile(r"^/geography/hypermedia/reference/attributes/(.+?)/?$"),
|
||||
lambda m: f"/(geography.(hypermedia.(reference-detail.attributes.{m.group(1)})))"),
|
||||
lambda m: f"/sx/(geography.(hypermedia.(reference-detail.attributes.{m.group(1)})))"),
|
||||
(re.compile(r"^/geography/hypermedia/reference/headers/(.+?)/?$"),
|
||||
lambda m: f"/(geography.(hypermedia.(reference-detail.headers.{m.group(1)})))"),
|
||||
lambda m: f"/sx/(geography.(hypermedia.(reference-detail.headers.{m.group(1)})))"),
|
||||
(re.compile(r"^/geography/hypermedia/reference/events/(.+?)/?$"),
|
||||
lambda m: f"/(geography.(hypermedia.(reference-detail.events.{m.group(1)})))"),
|
||||
lambda m: f"/sx/(geography.(hypermedia.(reference-detail.events.{m.group(1)})))"),
|
||||
(re.compile(r"^/geography/hypermedia/reference/(.+?)/?$"),
|
||||
lambda m: f"/(geography.(hypermedia.(reference.{m.group(1)})))"),
|
||||
lambda m: f"/sx/(geography.(hypermedia.(reference.{m.group(1)})))"),
|
||||
(re.compile(r"^/geography/hypermedia/examples/(.+?)/?$"),
|
||||
lambda m: f"/(geography.(hypermedia.(example.{m.group(1)})))"),
|
||||
lambda m: f"/sx/(geography.(hypermedia.(example.{m.group(1)})))"),
|
||||
(re.compile(r"^/geography/hypermedia/reference/?$"),
|
||||
"/(geography.(hypermedia.(reference)))"),
|
||||
"/sx/(geography.(hypermedia.(reference)))"),
|
||||
(re.compile(r"^/geography/hypermedia/examples/?$"),
|
||||
"/(geography.(hypermedia.(example)))"),
|
||||
"/sx/(geography.(hypermedia.(example)))"),
|
||||
(re.compile(r"^/geography/reactive/(.+?)/?$"),
|
||||
lambda m: f"/(geography.(reactive.{m.group(1)}))"),
|
||||
lambda m: f"/sx/(geography.(reactive.{m.group(1)}))"),
|
||||
(re.compile(r"^/geography/isomorphism/(.+?)/?$"),
|
||||
lambda m: f"/(geography.(isomorphism.{m.group(1)}))"),
|
||||
lambda m: f"/sx/(geography.(isomorphism.{m.group(1)}))"),
|
||||
(re.compile(r"^/geography/marshes/?$"),
|
||||
"/(geography.(marshes))"),
|
||||
"/sx/(geography.(marshes))"),
|
||||
(re.compile(r"^/applications/cssx/(.+?)/?$"),
|
||||
lambda m: f"/(applications.(cssx.{m.group(1)}))"),
|
||||
lambda m: f"/sx/(applications.(cssx.{m.group(1)}))"),
|
||||
(re.compile(r"^/applications/protocols/(.+?)/?$"),
|
||||
lambda m: f"/(applications.(protocol.{m.group(1)}))"),
|
||||
lambda m: f"/sx/(applications.(protocol.{m.group(1)}))"),
|
||||
(re.compile(r"^/etc/essays/(.+?)/?$"),
|
||||
lambda m: f"/(etc.(essay.{m.group(1)}))"),
|
||||
lambda m: f"/sx/(etc.(essay.{m.group(1)}))"),
|
||||
(re.compile(r"^/etc/philosophy/(.+?)/?$"),
|
||||
lambda m: f"/(etc.(philosophy.{m.group(1)}))"),
|
||||
lambda m: f"/sx/(etc.(philosophy.{m.group(1)}))"),
|
||||
(re.compile(r"^/etc/plans/(.+?)/?$"),
|
||||
lambda m: f"/(etc.(plan.{m.group(1)}))"),
|
||||
lambda m: f"/sx/(etc.(plan.{m.group(1)}))"),
|
||||
# Section indices
|
||||
(re.compile(r"^/language/docs/?$"), "/(language.(doc))"),
|
||||
(re.compile(r"^/language/specs/?$"), "/(language.(spec))"),
|
||||
(re.compile(r"^/language/bootstrappers/?$"), "/(language.(bootstrapper))"),
|
||||
(re.compile(r"^/language/testing/?$"), "/(language.(test))"),
|
||||
(re.compile(r"^/language/?$"), "/(language)"),
|
||||
(re.compile(r"^/geography/hypermedia/?$"), "/(geography.(hypermedia))"),
|
||||
(re.compile(r"^/geography/reactive/?$"), "/(geography.(reactive))"),
|
||||
(re.compile(r"^/geography/isomorphism/?$"), "/(geography.(isomorphism))"),
|
||||
(re.compile(r"^/geography/?$"), "/(geography)"),
|
||||
(re.compile(r"^/applications/cssx/?$"), "/(applications.(cssx))"),
|
||||
(re.compile(r"^/applications/protocols/?$"), "/(applications.(protocol))"),
|
||||
(re.compile(r"^/applications/?$"), "/(applications)"),
|
||||
(re.compile(r"^/etc/essays/?$"), "/(etc.(essay))"),
|
||||
(re.compile(r"^/etc/philosophy/?$"), "/(etc.(philosophy))"),
|
||||
(re.compile(r"^/etc/plans/?$"), "/(etc.(plan))"),
|
||||
(re.compile(r"^/etc/?$"), "/(etc)"),
|
||||
(re.compile(r"^/language/docs/?$"), "/sx/(language.(doc))"),
|
||||
(re.compile(r"^/language/specs/?$"), "/sx/(language.(spec))"),
|
||||
(re.compile(r"^/language/bootstrappers/?$"), "/sx/(language.(bootstrapper))"),
|
||||
(re.compile(r"^/language/testing/?$"), "/sx/(language.(test))"),
|
||||
(re.compile(r"^/language/?$"), "/sx/(language)"),
|
||||
(re.compile(r"^/geography/hypermedia/?$"), "/sx/(geography.(hypermedia))"),
|
||||
(re.compile(r"^/geography/reactive/?$"), "/sx/(geography.(reactive))"),
|
||||
(re.compile(r"^/geography/isomorphism/?$"), "/sx/(geography.(isomorphism))"),
|
||||
(re.compile(r"^/geography/?$"), "/sx/(geography)"),
|
||||
(re.compile(r"^/applications/cssx/?$"), "/sx/(applications.(cssx))"),
|
||||
(re.compile(r"^/applications/protocols/?$"), "/sx/(applications.(protocol))"),
|
||||
(re.compile(r"^/applications/?$"), "/sx/(applications)"),
|
||||
(re.compile(r"^/etc/essays/?$"), "/sx/(etc.(essay))"),
|
||||
(re.compile(r"^/etc/philosophy/?$"), "/sx/(etc.(philosophy))"),
|
||||
(re.compile(r"^/etc/plans/?$"), "/sx/(etc.(plan))"),
|
||||
(re.compile(r"^/etc/?$"), "/sx/(etc)"),
|
||||
]
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user