Compare commits
6 commits
master
...
0.1.5_MAIN
Author | SHA1 | Date | |
---|---|---|---|
|
a44014e82f | ||
|
3567838fa8 | ||
|
1e9ce7b9a0 | ||
|
c18b74fef6 | ||
|
4861ee809b | ||
|
4daedee4fc |
5
.gitignore
vendored
5
.gitignore
vendored
|
@ -8,9 +8,14 @@ pom.xml
|
|||
/.lein-*
|
||||
/.env
|
||||
*.log
|
||||
/.calva/
|
||||
|
||||
# Links to other places:
|
||||
resources/public/docs/mw-*/uberdoc.html
|
||||
# Artefacts:
|
||||
mw_ui.log
|
||||
pom.xml
|
||||
|
||||
buildall.tmp.*/
|
||||
|
||||
.nrepl-port
|
||||
|
|
3
Dockerfile
Normal file
3
Dockerfile
Normal file
|
@ -0,0 +1,3 @@
|
|||
FROM tomcat:alpine
|
||||
COPY target/microworld.war $CATALINA_HOME/webapps/
|
||||
|
39
project.clj
39
project.clj
|
@ -1,4 +1,4 @@
|
|||
(defproject mw-ui "0.1.5-SNAPSHOT"
|
||||
(defproject mw-ui "0.1.5"
|
||||
:description "Web-based user interface for MicroWorld"
|
||||
:url "http://www.journeyman.cc/microworld"
|
||||
:manifest {
|
||||
|
@ -8,22 +8,29 @@
|
|||
"build-signature-timestamp" "unset"
|
||||
"Implementation-Version" "unset"
|
||||
}
|
||||
:dependencies [[org.clojure/clojure "1.6.0"]
|
||||
[mw-engine "0.1.5-SNAPSHOT"]
|
||||
[mw-parser "0.1.5-SNAPSHOT"]
|
||||
[lib-noir "0.8.4"]
|
||||
[ring-server "0.3.1"]
|
||||
[selmer "0.6.8"]
|
||||
[com.taoensso/timbre "3.2.1"]
|
||||
[com.taoensso/tower "2.0.2"]
|
||||
[markdown-clj "0.9.44"]
|
||||
[environ "0.5.0"]
|
||||
[noir-exception "0.2.2"]]
|
||||
|
||||
:dependencies [[org.clojure/clojure "1.8.0"]
|
||||
[mw-engine "0.1.5"]
|
||||
[mw-parser "0.1.5"]
|
||||
[lib-noir "0.9.9"]
|
||||
[ring-server "0.5.0"]
|
||||
[selmer "1.11.3" :exclusions [cheshire
|
||||
com.fasterxml.jackson.core/jackson-core
|
||||
com.fasterxml.jackson.dataformat/jackson-dataformat-smile
|
||||
com.fasterxml.jackson.dataformat/jackson-dataformat-cbor]]
|
||||
[hiccup "1.0.5"]
|
||||
[com.taoensso/timbre "4.10.0" :exclusions [org.clojure/tools.reader]]
|
||||
[com.taoensso/tower "3.0.2"]
|
||||
[markdown-clj "1.0.1"]
|
||||
[environ "1.1.0"]
|
||||
[noir-exception "0.2.5"]]
|
||||
:main mw-ui.repl
|
||||
:repl-options {:init-ns mw-ui.repl}
|
||||
:plugins [[lein-ring "0.8.11"]
|
||||
[lein-environ "0.5.0"]
|
||||
[lein-marginalia "0.7.1"]]
|
||||
[lein-marginalia "0.7.1"]
|
||||
[io.sarnowski/lein-docker "1.1.0"]]
|
||||
:docker {:image-name "simonbrooke/microworld"
|
||||
:dockerfile "Dockerfile"}
|
||||
:ring {:handler mw-ui.handler/app
|
||||
:init mw-ui.handler/init
|
||||
:destroy mw-ui.handler/destroy
|
||||
|
@ -37,8 +44,8 @@
|
|||
:stacktraces? false
|
||||
:auto-reload? false}}
|
||||
:dev {:dependencies [[ring-mock "0.1.5"]
|
||||
[ring/ring-devel "1.3.0"]
|
||||
[pjstadig/humane-test-output "0.6.0"]]
|
||||
[ring/ring-devel "1.6.3" :exclusions [ring/ring-codec]]
|
||||
[pjstadig/humane-test-output "0.8.3"]]
|
||||
:injections [(require 'pjstadig.humane-test-output)
|
||||
(pjstadig.humane-test-output/activate!)]
|
||||
:env {:dev true}}}
|
||||
|
|
|
@ -45,7 +45,9 @@
|
|||
{% endif %}
|
||||
{% if error %}
|
||||
<div id="error">
|
||||
<p class="error">{{error}}</p>
|
||||
<pre class="error">
|
||||
{{error}}
|
||||
</pre>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
@ -57,7 +59,8 @@
|
|||
Built with <a href="http://www.luminusweb.net/">LuminusWeb</a> ||
|
||||
<img height="16" width="16" align="top" src="img/clojure-icon.gif" alt="λ"> Powered by <a href="http://clojure.org">Clojure</a> ||
|
||||
Engineering and hosting by <a href="http://www.journeyman.cc">Journeyman</a> ||
|
||||
World generated using <a href="http://git.journeyman.cc/?p=mw-engine;a=summary">MicroWorld Engine</a>
|
||||
World generated using <a href="http://git.journeyman.cc/?p=mw-engine;a=summary">MicroWorld Engine</a> ||
|
||||
Version {{version}}
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
{% extends "templates/base.html" %}
|
||||
{% block content %}
|
||||
<form action="{{servlet-context}}/params" method="POST">
|
||||
{% csrf-field %}
|
||||
<p class="widget">
|
||||
<label for="ruleset">The rule set to use</label>
|
||||
<select name="ruleset">
|
||||
|
@ -34,4 +35,4 @@
|
|||
</p>
|
||||
</form>
|
||||
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
{% extends "templates/base.html" %}
|
||||
{% block content %}
|
||||
<form action="{{servlet-context}}/rules" method="POST">
|
||||
{% csrf-field %}
|
||||
<textarea name="src" id="src" rows="10" cols="80">
|
||||
{{rule-text}}
|
||||
</textarea>
|
||||
|
@ -11,4 +12,4 @@
|
|||
|
||||
</form>
|
||||
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
(ns mw-ui.handler
|
||||
(ns ^{:doc "Set up and tear down the request handler."
|
||||
:author "Simon Brooke"}
|
||||
mw-ui.handler
|
||||
(:require [compojure.core :refer [defroutes]]
|
||||
[mw-ui.routes.home :refer [home-routes]]
|
||||
[mw-ui.middleware :refer [load-middleware]]
|
||||
|
@ -6,35 +8,59 @@
|
|||
[noir.util.middleware :refer [app-handler]]
|
||||
[compojure.route :as route]
|
||||
[taoensso.timbre :as timbre]
|
||||
[taoensso.timbre.appenders.rotor :as rotor]
|
||||
[taoensso.timbre.appenders.3rd-party.rotor :as rotor]
|
||||
[selmer.parser :as parser]
|
||||
[environ.core :refer [env]]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;
|
||||
;;;; mw-ui: a servlet user/visualisation interface for MicroWorld.
|
||||
;;;;
|
||||
;;;; This program is free software; you can redistribute it and/or
|
||||
;;;; modify it under the terms of the GNU General Public License
|
||||
;;;; as published by the Free Software Foundation; either version 2
|
||||
;;;; of the License, or (at your option) any later version.
|
||||
;;;;
|
||||
;;;; This program is distributed in the hope that it will be useful,
|
||||
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;;;; GNU General Public License for more details.
|
||||
;;;;
|
||||
;;;; You should have received a copy of the GNU General Public License
|
||||
;;;; along with this program; if not, write to the Free Software
|
||||
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
;;;; USA.
|
||||
;;;;
|
||||
;;;; Copyright (C) 2014 Simon Brooke
|
||||
;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(defroutes app-routes
|
||||
(route/resources "/")
|
||||
(route/not-found "Not Found"))
|
||||
|
||||
|
||||
(defn init
|
||||
"init will be called once when
|
||||
app is deployed as a servlet on
|
||||
an app server such as Tomcat
|
||||
put any initialization code here"
|
||||
[]
|
||||
(timbre/set-config!
|
||||
[:appenders :rotor]
|
||||
{:min-level :info
|
||||
:enabled? true
|
||||
:async? false ; should be always false for rotor
|
||||
:max-message-per-msecs nil
|
||||
:fn rotor/appender-fn})
|
||||
(timbre/merge-config!
|
||||
{:appenders
|
||||
{:rotor (rotor/rotor-appender
|
||||
{:path "mw-ui.log"
|
||||
:max-size (* 512 1024)
|
||||
:backlog 10})}
|
||||
:level (or
|
||||
(if (env :dev) :debug)
|
||||
:info)})
|
||||
|
||||
(timbre/set-config!
|
||||
[:shared-appender-config :rotor]
|
||||
{:path "mw_ui.log" :max-size (* 512 1024) :backlog 10})
|
||||
|
||||
(if (env :dev) (parser/cache-off!))
|
||||
(timbre/info "mw-ui started successfully"))
|
||||
|
||||
|
||||
(defn destroy
|
||||
"destroy will be called when your application
|
||||
shuts down, put any clean up code here"
|
||||
|
@ -42,7 +68,6 @@
|
|||
(timbre/info "mw-ui is shutting down..."))
|
||||
|
||||
|
||||
|
||||
(def app (app-handler
|
||||
;; add your application routes here
|
||||
[home-routes app-routes]
|
||||
|
|
|
@ -1,16 +1,47 @@
|
|||
(ns mw-ui.layout
|
||||
(ns ^{:doc "Layout content as HTML."
|
||||
:author "Simon Brooke"}
|
||||
mw-ui.layout
|
||||
(:require [selmer.parser :as parser]
|
||||
[clojure.string :as s]
|
||||
[ring.util.anti-forgery :refer [anti-forgery-field]]
|
||||
[ring.util.response :refer [content-type response]]
|
||||
[compojure.response :refer [Renderable]]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;
|
||||
;;;; mw-ui: a servlet user/visualisation interface for MicroWorld.
|
||||
;;;;
|
||||
;;;; This program is free software; you can redistribute it and/or
|
||||
;;;; modify it under the terms of the GNU General Public License
|
||||
;;;; as published by the Free Software Foundation; either version 2
|
||||
;;;; of the License, or (at your option) any later version.
|
||||
;;;;
|
||||
;;;; This program is distributed in the hope that it will be useful,
|
||||
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;;;; GNU General Public License for more details.
|
||||
;;;;
|
||||
;;;; You should have received a copy of the GNU General Public License
|
||||
;;;; along with this program; if not, write to the Free Software
|
||||
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
;;;; USA.
|
||||
;;;;
|
||||
;;;; Copyright (C) 2014 Simon Brooke
|
||||
;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
(def template-path "templates/")
|
||||
|
||||
|
||||
(parser/add-tag! :csrf-field (fn [_ _] (anti-forgery-field)))
|
||||
|
||||
|
||||
(deftype RenderableTemplate [template params]
|
||||
Renderable
|
||||
(render [this request]
|
||||
(content-type
|
||||
(->> (assoc params
|
||||
(->> (assoc (merge params {:version (System/getProperty "mw-ui.version")})
|
||||
(keyword (s/replace template #".html" "-selected")) "active"
|
||||
:servlet-context
|
||||
(if-let [context (:servlet-context request)]
|
||||
|
@ -19,6 +50,7 @@
|
|||
response)
|
||||
"text/html; charset=utf-8")))
|
||||
|
||||
|
||||
(defn render [template & [params]]
|
||||
(RenderableTemplate. template params))
|
||||
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
(ns mw-ui.middleware
|
||||
(ns ^{:doc "In truth, boilerplate from Luminus."
|
||||
:author "Simon Brooke"}
|
||||
mw-ui.middleware
|
||||
(:require [taoensso.timbre :as timbre]
|
||||
[selmer.parser :as parser]
|
||||
[environ.core :refer [env]]
|
||||
|
@ -6,19 +8,46 @@
|
|||
[noir-exception.core
|
||||
:refer [wrap-internal-error wrap-exceptions]]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;
|
||||
;;;; mw-ui: a servlet user/visualisation interface for MicroWorld.
|
||||
;;;;
|
||||
;;;; This program is free software; you can redistribute it and/or
|
||||
;;;; modify it under the terms of the GNU General Public License
|
||||
;;;; as published by the Free Software Foundation; either version 2
|
||||
;;;; of the License, or (at your option) any later version.
|
||||
;;;;
|
||||
;;;; This program is distributed in the hope that it will be useful,
|
||||
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;;;; GNU General Public License for more details.
|
||||
;;;;
|
||||
;;;; You should have received a copy of the GNU General Public License
|
||||
;;;; along with this program; if not, write to the Free Software
|
||||
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
;;;; USA.
|
||||
;;;;
|
||||
;;;; Copyright (C) 2014 Simon Brooke
|
||||
;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
(defn log-request [handler]
|
||||
(fn [req]
|
||||
(timbre/debug req)
|
||||
(handler req)))
|
||||
|
||||
|
||||
(def development-middleware
|
||||
[log-request
|
||||
wrap-error-page
|
||||
wrap-exceptions])
|
||||
|
||||
|
||||
(def production-middleware
|
||||
[#(wrap-internal-error % :log (fn [e] (timbre/error e)))])
|
||||
|
||||
|
||||
(defn load-middleware []
|
||||
(concat (when (env :dev) development-middleware)
|
||||
production-middleware))
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
(ns mw-ui.render-world
|
||||
(ns ^{:doc "Render the state of the world as an HTML table."
|
||||
:author "Simon Brooke"}
|
||||
mw-ui.render-world
|
||||
(:require [clojure.java.io :as jio]
|
||||
[mw-engine.core :as engine]
|
||||
[mw-engine.world :as world]
|
||||
|
@ -8,21 +10,47 @@
|
|||
[noir.io :as io]
|
||||
[noir.session :as session]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;
|
||||
;;;; mw-ui: a servlet user/visualisation interface for MicroWorld.
|
||||
;;;;
|
||||
;;;; This program is free software; you can redistribute it and/or
|
||||
;;;; modify it under the terms of the GNU General Public License
|
||||
;;;; as published by the Free Software Foundation; either version 2
|
||||
;;;; of the License, or (at your option) any later version.
|
||||
;;;;
|
||||
;;;; This program is distributed in the hope that it will be useful,
|
||||
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;;;; GNU General Public License for more details.
|
||||
;;;;
|
||||
;;;; You should have received a copy of the GNU General Public License
|
||||
;;;; along with this program; if not, write to the Free Software
|
||||
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
;;;; USA.
|
||||
;;;;
|
||||
;;;; Copyright (C) 2014 Simon Brooke
|
||||
;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
(defn format-css-class [statekey]
|
||||
"Format this statekey, assumed to be a keyword indicating a state in the
|
||||
world, into a CSS class"
|
||||
(subs (str statekey) 1))
|
||||
|
||||
|
||||
(defn format-image-path
|
||||
"Render this statekey, assumed to be a keyword indicating a state in the
|
||||
world, into a path which should recover the corresponding image file."
|
||||
[statekey]
|
||||
(format "img/tiles/%s.png" (format-css-class statekey)))
|
||||
|
||||
|
||||
(defn format-mouseover [cell]
|
||||
(str cell))
|
||||
|
||||
|
||||
(defn render-cell
|
||||
"Render this world cell as a Hiccup table cell."
|
||||
[cell]
|
||||
|
@ -31,11 +59,13 @@
|
|||
[:a {:href (format "inspect?x=%d&y=%d" (:x cell) (:y cell))}
|
||||
[:img {:alt (:state cell) :src (format-image-path state)}]]]))
|
||||
|
||||
|
||||
(defn render-world-row
|
||||
"Render this world row as a Hiccup table row."
|
||||
[row]
|
||||
(apply vector (cons :tr (map render-cell row))))
|
||||
|
||||
|
||||
(defn render-world-table
|
||||
"Render the world implied by the current session as a complete HTML table in a DIV."
|
||||
[]
|
||||
|
@ -48,8 +78,7 @@
|
|||
(io/get-resource "/rulesets/basic.txt")))
|
||||
(session/get :rules)))
|
||||
generation (inc (or (session/get :generation) 0))
|
||||
w2 (engine/transform-world world rules)
|
||||
]
|
||||
w2 (engine/transform-world world rules)]
|
||||
(session/put! :world w2)
|
||||
(session/put! :generation generation)
|
||||
[:div {:class "world"}
|
||||
|
@ -59,6 +88,7 @@
|
|||
[:p
|
||||
(str "Generation " generation)]]))
|
||||
|
||||
|
||||
(defn render-inspector
|
||||
"Render in Hiccup format the HTML content of an inspector on this cell."
|
||||
[cell table]
|
||||
|
|
|
@ -1,9 +1,34 @@
|
|||
(ns mw-ui.repl
|
||||
(ns ^{:doc "In truth, boilerplate from Luminus."
|
||||
:author "Simon Brooke"}
|
||||
mw-ui.repl
|
||||
(:use mw-ui.handler
|
||||
ring.server.standalone
|
||||
[ring.middleware file-info file])
|
||||
(:gen-class)
|
||||
)
|
||||
(:gen-class))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;
|
||||
;;;; mw-ui: a servlet user/visualisation interface for MicroWorld.
|
||||
;;;;
|
||||
;;;; This program is free software; you can redistribute it and/or
|
||||
;;;; modify it under the terms of the GNU General Public License
|
||||
;;;; as published by the Free Software Foundation; either version 2
|
||||
;;;; of the License, or (at your option) any later version.
|
||||
;;;;
|
||||
;;;; This program is distributed in the hope that it will be useful,
|
||||
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;;;; GNU General Public License for more details.
|
||||
;;;;
|
||||
;;;; You should have received a copy of the GNU General Public License
|
||||
;;;; along with this program; if not, write to the Free Software
|
||||
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
;;;; USA.
|
||||
;;;;
|
||||
;;;; Copyright (C) 2014 Simon Brooke
|
||||
;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
(defonce server (atom nil))
|
||||
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
(ns mw-ui.routes.home
|
||||
(ns ^{:doc "Routes which serve the main pages of the application."
|
||||
:author "Simon Brooke"}
|
||||
mw-ui.routes.home
|
||||
(:use clojure.walk
|
||||
compojure.core)
|
||||
(:require [clojure.pprint :only [pprint]]
|
||||
|
@ -15,6 +17,29 @@
|
|||
[noir.session :as session]
|
||||
[ring.util.response :as response]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;
|
||||
;;;; mw-ui: a servlet user/visualisation interface for MicroWorld.
|
||||
;;;;
|
||||
;;;; This program is free software; you can redistribute it and/or
|
||||
;;;; modify it under the terms of the GNU General Public License
|
||||
;;;; as published by the Free Software Foundation; either version 2
|
||||
;;;; of the License, or (at your option) any later version.
|
||||
;;;;
|
||||
;;;; This program is distributed in the hope that it will be useful,
|
||||
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;;;; GNU General Public License for more details.
|
||||
;;;;
|
||||
;;;; You should have received a copy of the GNU General Public License
|
||||
;;;; along with this program; if not, write to the Free Software
|
||||
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
;;;; USA.
|
||||
;;;;
|
||||
;;;; Copyright (C) 2014 Simon Brooke
|
||||
;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
(defn list-states []
|
||||
(sort
|
||||
|
@ -27,19 +52,22 @@
|
|||
(layout/render "trusted-content.html"
|
||||
{:title "About MicroWorld"
|
||||
:about-selected "active"
|
||||
:content (util/md->html "/md/about.md")}))
|
||||
:content (util/md->html "/md/about.md")
|
||||
:version (System/getProperty "mw-ui.version")}))
|
||||
|
||||
(defn docs-page []
|
||||
(layout/render "docs.html" {:title "Documentation"
|
||||
:parser (util/md->html "/md/mw-parser.md" )
|
||||
:states (util/list-resources "/img/tiles" #"([0-9a-z-_]+).png")
|
||||
:lessons (util/list-resources "/md/lesson-plans" #"([0-9a-z-_]+).md")
|
||||
:components ["mw-engine" "mw-parser" "mw-ui"]}))
|
||||
:components ["mw-engine" "mw-parser" "mw-ui"]
|
||||
:version (System/getProperty "mw-ui.version")}))
|
||||
|
||||
(defn home-page []
|
||||
"Render the home page."
|
||||
(layout/render "trusted-content.html" {:title "Welcome to MicroWorld"
|
||||
:content (util/md->html "/md/mw-ui.md")}))
|
||||
:content (util/md->html "/md/mw-ui.md")
|
||||
:version (System/getProperty "mw-ui.version")}))
|
||||
|
||||
(defn inspect-page [request]
|
||||
"Open an inspector on the cell at the co-ordinates specified in this request"
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
(ns mw-ui.routes.load
|
||||
(ns ^{:doc "Route which handles the upload of worlds/rules from the client."
|
||||
:author "Simon Brooke"}
|
||||
mw-ui.routes.load
|
||||
(:use clojure.walk
|
||||
compojure.core)
|
||||
(:require [hiccup.core :refer [html]]
|
||||
|
@ -8,6 +10,29 @@
|
|||
[mw-ui.layout :as layout]
|
||||
))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;
|
||||
;;;; mw-ui: a servlet user/visualisation interface for MicroWorld.
|
||||
;;;;
|
||||
;;;; This program is free software; you can redistribute it and/or
|
||||
;;;; modify it under the terms of the GNU General Public License
|
||||
;;;; as published by the Free Software Foundation; either version 2
|
||||
;;;; of the License, or (at your option) any later version.
|
||||
;;;;
|
||||
;;;; This program is distributed in the hope that it will be useful,
|
||||
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;;;; GNU General Public License for more details.
|
||||
;;;;
|
||||
;;;; You should have received a copy of the GNU General Public License
|
||||
;;;; along with this program; if not, write to the Free Software
|
||||
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
;;;; USA.
|
||||
;;;;
|
||||
;;;; Copyright (C) 2014 Simon Brooke
|
||||
;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
(defn- upload [file]
|
||||
(io/upload-file "/tmp/" file)
|
||||
|
@ -16,6 +41,7 @@
|
|||
(with-open [eddi (java.io.FileReader. (:tempfile file))] (read)))
|
||||
(str "Successfully loaded your world from " (:filename file))))
|
||||
|
||||
|
||||
(defn load-page
|
||||
"If no args, show the load form; with args, load a world file from the client.
|
||||
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
(ns mw-ui.routes.params
|
||||
(ns ^{:doc "Route which serves and handles the parameters page."
|
||||
:author "Simon Brooke"}
|
||||
mw-ui.routes.params
|
||||
(:use clojure.walk
|
||||
clojure.java.io
|
||||
compojure.core)
|
||||
|
@ -11,6 +13,30 @@
|
|||
[noir.io :as io]
|
||||
[noir.session :as session]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;
|
||||
;;;; mw-ui: a servlet user/visualisation interface for MicroWorld.
|
||||
;;;;
|
||||
;;;; This program is free software; you can redistribute it and/or
|
||||
;;;; modify it under the terms of the GNU General Public License
|
||||
;;;; as published by the Free Software Foundation; either version 2
|
||||
;;;; of the License, or (at your option) any later version.
|
||||
;;;;
|
||||
;;;; This program is distributed in the hope that it will be useful,
|
||||
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;;;; GNU General Public License for more details.
|
||||
;;;;
|
||||
;;;; You should have received a copy of the GNU General Public License
|
||||
;;;; along with this program; if not, write to the Free Software
|
||||
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
;;;; USA.
|
||||
;;;;
|
||||
;;;; Copyright (C) 2014 Simon Brooke
|
||||
;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
(defn- send-params []
|
||||
{:title "Choose your world"
|
||||
:heightmaps (util/list-resources "/img/heightmaps" #"([0-9a-z-_]+).png")
|
||||
|
@ -18,7 +44,8 @@
|
|||
:rulesets (util/list-resources "/rulesets" #"([0-9a-z-_]+).txt")
|
||||
})
|
||||
|
||||
(defn params-page
|
||||
|
||||
(defn params-page
|
||||
"Handler for params request. If no `request` passed, show empty params form.
|
||||
If `request` is passed, put parameters from request into session and show
|
||||
the world page."
|
||||
|
@ -31,25 +58,25 @@
|
|||
pause (:pause params)
|
||||
rulefile (:ruleset params)
|
||||
rulepath (str "/rulesets/" rulefile ".txt")]
|
||||
(if (not= map "")
|
||||
(session/put! :world
|
||||
(heightmap/apply-heightmap
|
||||
(if (not= map "")
|
||||
(session/put! :world
|
||||
(heightmap/apply-heightmap
|
||||
(io/get-resource (str "/img/heightmaps/" map ".png")))))
|
||||
(when (not= rulefile "")
|
||||
(session/put! :rule-text (io/slurp-resource rulepath))
|
||||
(session/put! :rules (compiler/compile-file (io/get-resource rulepath))))
|
||||
(if (not= pause "")
|
||||
(session/put! :pause pause))
|
||||
(layout/render "params.html"
|
||||
(merge (send-params)
|
||||
(layout/render "params.html"
|
||||
(merge (send-params)
|
||||
{:r rulefile
|
||||
:h map
|
||||
:message "Your parameters are saved, now look at your world"})))
|
||||
(catch Exception e
|
||||
(let [params (keywordize-keys (:form-params request))]
|
||||
(layout/render "params.html"
|
||||
(layout/render "params.html"
|
||||
(merge (send-params)
|
||||
{:title "Choose your world"
|
||||
{:title "Choose your world"
|
||||
:r (:ruleset params)
|
||||
:h (:heightmap params)
|
||||
:message "Your paramters are not saved"
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
(ns mw-ui.routes.rules
|
||||
(ns ^{:doc "Route which serves and handles the rules page."
|
||||
:author "Simon Brooke"}
|
||||
mw-ui.routes.rules
|
||||
(:use clojure.walk
|
||||
compojure.core)
|
||||
(:require [hiccup.core :refer [html]]
|
||||
|
@ -10,31 +12,56 @@
|
|||
[noir.session :as session]
|
||||
[ring.util.response :as response]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;
|
||||
;;;; mw-ui: a servlet user/visualisation interface for MicroWorld.
|
||||
;;;;
|
||||
;;;; This program is free software; you can redistribute it and/or
|
||||
;;;; modify it under the terms of the GNU General Public License
|
||||
;;;; as published by the Free Software Foundation; either version 2
|
||||
;;;; of the License, or (at your option) any later version.
|
||||
;;;;
|
||||
;;;; This program is distributed in the hope that it will be useful,
|
||||
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;;;; GNU General Public License for more details.
|
||||
;;;;
|
||||
;;;; You should have received a copy of the GNU General Public License
|
||||
;;;; along with this program; if not, write to the Free Software
|
||||
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
;;;; USA.
|
||||
;;;;
|
||||
;;;; Copyright (C) 2014 Simon Brooke
|
||||
;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
(defn process-rules-request
|
||||
[request]
|
||||
(let [src (:src (keywordize-keys (:form-params request)))]
|
||||
(try
|
||||
(cond src
|
||||
(try
|
||||
(cond src
|
||||
(let [rules (compiler/compile-string src)]
|
||||
{:rule-text src
|
||||
:rules rules
|
||||
:message (str "Successfully compiled "
|
||||
(count rules)
|
||||
:message (str "Successfully compiled "
|
||||
(count rules)
|
||||
" rules") })
|
||||
true {:rule-text (or
|
||||
(session/get :rule-text)
|
||||
true {:rule-text (or
|
||||
(session/get :rule-text)
|
||||
(io/slurp-resource "/rulesets/basic.txt"))
|
||||
:message "No rules found in request; loading defaults"})
|
||||
(catch Exception e
|
||||
(catch Exception e
|
||||
{:rule-text src
|
||||
:message "An error occurred during compilation"
|
||||
:error (str (.getName (.getClass e)) ": " (.getMessage e))}))))
|
||||
|
||||
(defn rules-page
|
||||
|
||||
(defn rules-page
|
||||
"Request handler for the `rules` request. If the `request` contains a value
|
||||
for `:src`, treat that as rule source and try to compile it. If compilation
|
||||
succeeds, stash the compiled rules and the rule text on the session, and
|
||||
provide feedback; if not, provide feedback.
|
||||
for `:src`, treat that as rule source and try to compile it. If compilation
|
||||
succeeds, stash the compiled rules and the rule text on the session, and
|
||||
provide feedback; if not, provide feedback.
|
||||
|
||||
If `request` doesn't contain a value for `:src`, load basic rule source from
|
||||
the session or from `resources/rulesets/basic.txt` and pass that back."
|
||||
|
@ -44,7 +71,7 @@
|
|||
(session/put! :rules (:rules processed)))
|
||||
(if (:rule-text processed)
|
||||
(session/put! :rule-text (:rule-text processed)))
|
||||
(layout/render "rules.html"
|
||||
(layout/render "rules.html"
|
||||
(merge {:title "Edit Rules"} processed))))
|
||||
([]
|
||||
(rules-page nil)))
|
||||
|
|
|
@ -1,15 +1,40 @@
|
|||
(ns mw-ui.routes.save
|
||||
(ns ^{:doc "Route which handles the saving of world state the client."
|
||||
:author "Simon Brooke"}
|
||||
mw-ui.routes.save
|
||||
(:require [clojure.pprint :as pretty :only [pprint]]
|
||||
[noir.session :as session]
|
||||
[ring.util.response :as response]))
|
||||
[noir.response :as response]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;
|
||||
;;;; mw-ui: a servlet user/visualisation interface for MicroWorld.
|
||||
;;;;
|
||||
;;;; This program is free software; you can redistribute it and/or
|
||||
;;;; modify it under the terms of the GNU General Public License
|
||||
;;;; as published by the Free Software Foundation; either version 2
|
||||
;;;; of the License, or (at your option) any later version.
|
||||
;;;;
|
||||
;;;; This program is distributed in the hope that it will be useful,
|
||||
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;;;; GNU General Public License for more details.
|
||||
;;;;
|
||||
;;;; You should have received a copy of the GNU General Public License
|
||||
;;;; along with this program; if not, write to the Free Software
|
||||
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
;;;; USA.
|
||||
;;;;
|
||||
;;;; Copyright (C) 2014 Simon Brooke
|
||||
;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
(defn save-page []
|
||||
"Save the current world to the browser, using our own custom mime-type in
|
||||
an attempt to prevent the browser trying to do anything clever with it.
|
||||
Note that it is saved as a raw Clojure data structure, not as XML or
|
||||
any proprietary format."
|
||||
(response/header
|
||||
(response/response
|
||||
(with-out-str (pretty/pprint (session/get :world))))
|
||||
"Content-Type" "application/journeyman-mwm; charset=utf-8"))
|
||||
(response/content-type
|
||||
"application/journeyman-mwm; charset=utf-8"
|
||||
(with-out-str (pretty/pprint (session/get :world)))))
|
||||
|
||||
|
|
|
@ -1,8 +1,34 @@
|
|||
(ns mw-ui.util
|
||||
(ns ^{:doc "Utility functions used by other namespaces in this package."
|
||||
:author "Simon Brooke"}
|
||||
mw-ui.util
|
||||
(:require [noir.io :as io]
|
||||
[noir.session :as session]
|
||||
[markdown.core :as md]))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;;
|
||||
;;;; mw-ui: a servlet user/visualisation interface for MicroWorld.
|
||||
;;;;
|
||||
;;;; This program is free software; you can redistribute it and/or
|
||||
;;;; modify it under the terms of the GNU General Public License
|
||||
;;;; as published by the Free Software Foundation; either version 2
|
||||
;;;; of the License, or (at your option) any later version.
|
||||
;;;;
|
||||
;;;; This program is distributed in the hope that it will be useful,
|
||||
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;;;; GNU General Public License for more details.
|
||||
;;;;
|
||||
;;;; You should have received a copy of the GNU General Public License
|
||||
;;;; along with this program; if not, write to the Free Software
|
||||
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
;;;; USA.
|
||||
;;;;
|
||||
;;;; Copyright (C) 2014 Simon Brooke
|
||||
;;;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
|
||||
(defn md->html
|
||||
"reads a markdown file from public/md and returns an HTML string"
|
||||
[filename]
|
||||
|
@ -10,12 +36,14 @@
|
|||
(io/slurp-resource filename)
|
||||
(md/md-to-html-string)))
|
||||
|
||||
(defn list-resources [directory pattern]
|
||||
|
||||
(defn list-resources
|
||||
"List resource files matching `pattern` in `directory`."
|
||||
(let
|
||||
[directory pattern]
|
||||
(let
|
||||
[path (str (io/resource-path) directory)]
|
||||
(session/put! :list-resources-path path)
|
||||
(sort
|
||||
(remove nil?
|
||||
(remove nil?
|
||||
(map #(first (rest (re-matches pattern (.getName %))))
|
||||
(file-seq (clojure.java.io/file path)))))))
|
||||
|
|
Loading…
Reference in a new issue