(define sx-auto-quote (fn (expr env) (cond (and (symbol? expr) (not (env-has? env (symbol-name expr)))) (symbol-name expr) (list? expr) (map (fn (e) (sx-auto-quote e env)) expr) :else expr))) (define sx-expr-to-str (fn (expr) (cond (string? expr) (str "\"" expr "\"") (symbol? expr) (symbol-name expr) (list? expr) (str "(" (join " " (map sx-expr-to-str expr)) ")") :else (str expr)))) (define sx-handle-request (fn (path headers env) (let ((is-ajax (or (has-key? headers "sx-request") (has-key? headers "hx-request"))) (raw-sx (if (or (= path "/sx/") (= path "/")) "(home)" (slice path 4 (len path)))) (page-sx-raw (replace raw-sx "." " ")) (page-exprs (sx-parse page-sx-raw)) (page-expr (if (empty? page-exprs) nil (first page-exprs))) (page-sx (if (nil? page-expr) page-sx-raw (sx-expr-to-str (sx-auto-quote page-expr env)))) (layout-sx (str "(~layouts/doc :path \"" path "\" " page-sx ")"))) (if is-ajax (let ((full-sx (render-to-sx (first (sx-parse layout-sx)) env))) full-sx) (let ((body-html (render-to-html (first (sx-parse layout-sx)) env))) (render-to-html (quasiquote (~shared:shell/sx-page-shell :title "sx" :csrf "" :page-sx (unquote layout-sx) :body-html (unquote body-html) :component-defs (unquote (env-get env "__shell-component-defs")) :component-hash (unquote (env-get env "__shell-component-hash")) :pages-sx (unquote (env-get env "__shell-pages-sx")) :sx-css (unquote (env-get env "__shell-sx-css")) :sx-css-classes (unquote (env-get env "__shell-sx-css-classes")) :asset-url (unquote (env-get env "__shell-asset-url")) :sx-js-hash (unquote (env-get env "__shell-sx-js-hash")) :body-js-hash (unquote (env-get env "__shell-body-js-hash")) :wasm-hash (unquote (env-get env "__shell-wasm-hash")) :head-scripts nil :body-scripts nil :inline-css nil :inline-head-js nil :init-sx nil :use-wasm true :meta-html "")) env))))))