Create a gist now

Instantly share code, notes, and snippets.

(ns enlive-mw.core
(:use compojure)
(:require [net.cgrand.enlive-html :as e]))
(e/deftemplate simple-layout "enlive_mw/layout.html"
[{:keys [title ps widget]}]
#{[:title] [:h1]} (e/content title)
[:p] (e/clone-for [p ps] (e/content p))
[:#widget] (e/content widget))
(e/defsnippet widget "enlive_mw/widget.html" [:div] [s]
[:b] (e/content s))
(defn welcome-page [req]
{:body {:title "Layout through middleware: Demo"
:ps ["Lorem ipsum dolor sit amet, consectetur adipiscing elit."
"Ut hendrerit, nibh ac porttitor rhoncus, diam dolor
vestibulum nisi, non suscipit urna est vitae est."]
:widget (widget "Hello World")}})
(defn layout-with [handler layout]
(fn [req]
(let [{body :body :as resp} (handler req)]
(if (map? body)
(assoc resp :body (layout body))
resp))))
(decorate welcome-page
(layout-with simple-layout))
(defroutes app
(GET "/" welcome-page)
(ANY "*"
[404 "Page Not Found"]))
(defn start-app
([] (start-app 8080))
([port] (start-app app port))
([app port]
(run-server {:port port}
"/*" (servlet app))))
<html>
<head>
<title>Title goes here</title>
</head>
<body>
<h1>Title goes here too</h1>
<p>A very intersting paragraph</p>
<div id="widget">intentionally left blank</div>
</body>
</html>
<html>
<head>
<title>Layout through middleware: Demo</title>
</head>
<body>
<h1>Layout through middleware: Demo</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p><p>Ut hendrerit, nibh ac porttitor rhoncus, diam dolor
vestibulum nisi, non suscipit urna est vitae est.</p>
<div id="widget"><div style="background: #ccc; font: bold">I'm a wonderful widget which says <b>Hello World</b>!</div></div>
</body>
</html>
<html>
<body>
<div style="background: #ccc; font: bold">I'm a wonderful widget which says <b>boo</b>!</div>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment