diff --git a/project.clj b/project.clj index e280238..cee94af 100644 --- a/project.clj +++ b/project.clj @@ -8,18 +8,21 @@ "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"] + :dependencies [[org.clojure/clojure "1.8.0"] + [mw-engine "3.0.0-SNAPSHOT"] + [mw-parser "3.0.0-SNAPSHOT"] + [lib-noir "0.9.9"] + [ring-server "0.4.0"] + [selmer "1.0.9"] [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"]] + [com.taoensso/tower "3.0.2"] + [markdown-clj "0.9.89"] + [environ "1.1.0"] + [noir-exception "0.2.5"]] + :source-paths ["src/clj" "src/cljc"] + :license {:name "GNU General Public License v2" + :url "http://www.gnu.org/licenses/gpl-2.0.html"} :repl-options {:init-ns mw-ui.repl} :plugins [[lein-ring "0.8.11"] [lein-environ "0.5.0"] @@ -37,8 +40,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.5.0"] + [pjstadig/humane-test-output "0.8.1"]] :injections [(require 'pjstadig.humane-test-output) (pjstadig.humane-test-output/activate!)] :env {:dev true}}} diff --git a/resources/public/css/standard.css b/resources/public/css/standard.css index 131a881..62f3189 100644 --- a/resources/public/css/standard.css +++ b/resources/public/css/standard.css @@ -6,7 +6,7 @@ body { /* Overall container div, holds all content of page. Yes, I know it shouldn't have fixed width */ #main-container{ clear: both; -/* width:100%; */ + width:100%; } /* footer of the document */ @@ -145,4 +145,3 @@ th, td { text-align: left; padding: 0 0.25em; } - diff --git a/resources/templates/base.html b/resources/templates/base.html index 2be5573..46fe376 100644 --- a/resources/templates/base.html +++ b/resources/templates/base.html @@ -3,11 +3,7 @@ <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>{{title}}</title> - <link href="{{servlet-context}}/css/phone.css" media="only screen and (max-device-width: 480px)" rel="stylesheet" type="text/css" /> - <link href="{{servlet-context}}/css/tablet.css" media="only screen and (min-device-width: 481px) and (max-device-width: 1024px)" rel="stylesheet" type="text/css" /> <link href="{{servlet-context}}/css/standard.css" media="screen and (min-device-width: 1025px)" rel="stylesheet" type="text/css" /> - <link href="{{servlet-context}}/css/print.css" media="print" rel="stylesheet" type="text/css" /> - <link href="{{servlet-context}}/css/states.css" rel="stylesheet" type="text/css" /> {% script "/lib/jquery-1.9.0.js" %} {% script "/lib/jquery.validate.min.js" %} {% script "/lib/script.js" %} diff --git a/resources/templates/inspector.html b/resources/templates/inspector.html index 7ba60b3..35441df 100644 --- a/resources/templates/inspector.html +++ b/resources/templates/inspector.html @@ -4,6 +4,7 @@ {{content|safe}} </div> <form action="inspect" method="post"> + {% csrf-field %} <input type="hidden" name="x" value="{{x}}"/> <input type="hidden" name="y" value="{{y}}"/> <p class="widget"> diff --git a/resources/templates/params.html b/resources/templates/params.html index f0e13cb..c872da8 100644 --- a/resources/templates/params.html +++ b/resources/templates/params.html @@ -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 %} \ No newline at end of file +{% endblock %} diff --git a/src/mw_ui/handler.clj b/src/clj/mw_ui/handler.clj similarity index 100% rename from src/mw_ui/handler.clj rename to src/clj/mw_ui/handler.clj diff --git a/src/mw_ui/layout.clj b/src/clj/mw_ui/layout.clj similarity index 93% rename from src/mw_ui/layout.clj rename to src/clj/mw_ui/layout.clj index 9861426..3754943 100644 --- a/src/mw_ui/layout.clj +++ b/src/clj/mw_ui/layout.clj @@ -4,6 +4,7 @@ (:require [selmer.parser :as parser] [clojure.string :as s] [ring.util.response :refer [content-type response]] + [ring.util.anti-forgery :refer [anti-forgery-field]] [compojure.response :refer [Renderable]])) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -32,6 +33,7 @@ (def template-path "templates/") +(parser/add-tag! :csrf-field (fn [_ _] (anti-forgery-field))) (deftype RenderableTemplate [template params] Renderable diff --git a/src/mw_ui/middleware.clj b/src/clj/mw_ui/middleware.clj similarity index 100% rename from src/mw_ui/middleware.clj rename to src/clj/mw_ui/middleware.clj diff --git a/src/mw_ui/render_world.clj b/src/clj/mw_ui/render_world.clj similarity index 90% rename from src/mw_ui/render_world.clj rename to src/clj/mw_ui/render_world.clj index 2d91180..df7eb2b 100644 --- a/src/mw_ui/render_world.clj +++ b/src/clj/mw_ui/render_world.clj @@ -2,10 +2,10 @@ :author "Simon Brooke"} mw-ui.render-world (:require [clojure.java.io :as jio] - [mw-engine.core :as engine] - [mw-engine.world :as world] - [mw-engine.heightmap :as heightmap] - [mw-parser.bulk :as compiler] + [microworld.engine.core :as engine] + [microworld.engine.world :as world] + [microworld.engine.heightmap :as heightmap] + [microworld.parser.bulk :as compiler] [hiccup.core :refer [html]] [noir.io :as io] [noir.session :as session])) @@ -70,12 +70,11 @@ "Render the world implied by the current session as a complete HTML table in a DIV." [] (let [world (or (session/get :world) - (heightmap/apply-heightmap - (io/get-resource "/img/heightmaps/small_hill.png"))) + (heightmap/apply-heightmap "public/img/heightmaps/small_hill.png")) rules (or (session/get :rules) (do (session/put! :rules (compiler/compile-file - (io/get-resource "/rulesets/basic.txt"))) + (jio/resource "public/rulesets/basic.txt"))) (session/get :rules))) generation (inc (or (session/get :generation) 0)) w2 (engine/transform-world world rules) diff --git a/src/mw_ui/repl.clj b/src/clj/mw_ui/repl.clj similarity index 100% rename from src/mw_ui/repl.clj rename to src/clj/mw_ui/repl.clj diff --git a/src/mw_ui/routes/home.clj b/src/clj/mw_ui/routes/home.clj similarity index 85% rename from src/mw_ui/routes/home.clj rename to src/clj/mw_ui/routes/home.clj index efdda85..4c40b4a 100644 --- a/src/mw_ui/routes/home.clj +++ b/src/clj/mw_ui/routes/home.clj @@ -3,9 +3,10 @@ mw-ui.routes.home (:use clojure.walk compojure.core) - (:require [clojure.pprint :only [pprint]] + (:require [clojure.java.io :refer [file resource]] + [clojure.pprint :only [pprint]] [hiccup.core :refer [html]] - [mw-engine.utils :as engine-utils] + [microworld.engine.utils :as engine-utils] [mw-ui.layout :as layout] [mw-ui.render-world :as world] [mw-ui.routes.load :as load] @@ -45,28 +46,28 @@ (sort (filter #(not (nil? %)) (map #(first (rest (re-matches #"([0-9a-z-]+).png" (.getName %)))) - (file-seq (clojure.java.io/file "resources/public/img/tiles")))))) + (file-seq (resource "public/img/tiles")))))) (defn about-page [] (layout/render "trusted-content.html" {:title "About MicroWorld" :about-selected "active" - :content (util/md->html "/md/about.md") + :content (util/md->html "public/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"] + :parser (util/md->html "public/md/microworld.parser.md" ) + :states (util/list-resources "public/img/tiles" #"([0-9a-z-_]+).png") + :lessons (util/list-resources "public/md/lesson-plans" #"([0-9a-z-_]+).md") + :components ["microworld.engine" "microworld.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 "public/md/mw-ui.md") :version (System/getProperty "mw-ui.version")})) (defn inspect-page [request] @@ -91,7 +92,7 @@ :x (:x cell) :y (:y cell) :states (util/list-resources - "/img/tiles" #"([0-9a-z-_]+).png")})))) + "public/img/tiles" #"([0-9a-z-_]+).png")})))) (defn md-page "Render the markdown page specified in this request, if any. Probably undesirable, diff --git a/src/mw_ui/routes/load.clj b/src/clj/mw_ui/routes/load.clj similarity index 100% rename from src/mw_ui/routes/load.clj rename to src/clj/mw_ui/routes/load.clj diff --git a/src/mw_ui/routes/params.clj b/src/clj/mw_ui/routes/params.clj similarity index 84% rename from src/mw_ui/routes/params.clj rename to src/clj/mw_ui/routes/params.clj index f68fcb3..19416d7 100644 --- a/src/mw_ui/routes/params.clj +++ b/src/clj/mw_ui/routes/params.clj @@ -4,9 +4,10 @@ (:use clojure.walk clojure.java.io compojure.core) - (:require [hiccup.core :refer [html]] - [mw-engine.heightmap :as heightmap] - [mw-parser.bulk :as compiler] + (:require [clojure.java.io :refer [resource]] + [hiccup.core :refer [html]] + [microworld.engine.heightmap :as heightmap] + [microworld.parser.bulk :as compiler] [mw-ui.layout :as layout] [mw-ui.util :as util] [mw-ui.render-world :as world] @@ -39,9 +40,9 @@ (defn- send-params [] {:title "Choose your world" - :heightmaps (util/list-resources "/img/heightmaps" #"([0-9a-z-_]+).png") + :heightmaps (util/list-resources "public/img/heightmaps" #"([0-9a-z-_]+).png") :pause (or (session/get :pause) 5) - :rulesets (util/list-resources "/rulesets" #"([0-9a-z-_]+).txt") + :rulesets (util/list-resources "public/rulesets" #"([0-9a-z-_]+).txt") }) @@ -57,14 +58,14 @@ map (:heightmap params) pause (:pause params) rulefile (:ruleset params) - rulepath (str "/rulesets/" rulefile ".txt")] + rulepath (str "public/rulesets/" rulefile ".txt")] (if (not= map "") (session/put! :world (heightmap/apply-heightmap - (io/get-resource (str "/img/heightmaps/" map ".png"))))) + (resource (str "public/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)))) + (session/put! :rules (compiler/compile-file (resource rulepath)))) (if (not= pause "") (session/put! :pause pause)) (layout/render "params.html" diff --git a/src/mw_ui/routes/rules.clj b/src/clj/mw_ui/routes/rules.clj similarity index 98% rename from src/mw_ui/routes/rules.clj rename to src/clj/mw_ui/routes/rules.clj index b49a4c8..8f128aa 100644 --- a/src/mw_ui/routes/rules.clj +++ b/src/clj/mw_ui/routes/rules.clj @@ -4,7 +4,7 @@ (:use clojure.walk compojure.core) (:require [hiccup.core :refer [html]] - [mw-parser.bulk :as compiler] + [microworld.parser.bulk :as compiler] [mw-ui.layout :as layout] [mw-ui.util :as util] [mw-ui.render-world :as world] diff --git a/src/mw_ui/routes/save.clj b/src/clj/mw_ui/routes/save.clj similarity index 91% rename from src/mw_ui/routes/save.clj rename to src/clj/mw_ui/routes/save.clj index d75417a..41a29db 100644 --- a/src/mw_ui/routes/save.clj +++ b/src/clj/mw_ui/routes/save.clj @@ -1,8 +1,9 @@ (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]] + (:require [clojure.pprint :refer [pprint]] [noir.session :as session] + [ring.util.response :as response])) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; @@ -35,6 +36,6 @@ any proprietary format." (response/header (response/response - (with-out-str (pretty/pprint (session/get :world)))) + (with-out-str (pprint (session/get :world)))) "Content-Type" "application/journeyman-mwm; charset=utf-8")) diff --git a/src/mw_ui/util.clj b/src/clj/mw_ui/util.clj similarity index 82% rename from src/mw_ui/util.clj rename to src/clj/mw_ui/util.clj index fa59383..c52aaa9 100644 --- a/src/mw_ui/util.clj +++ b/src/clj/mw_ui/util.clj @@ -1,9 +1,9 @@ (ns ^{:doc "Utility functions used by other namespaces in this package." :author "Simon Brooke"} mw-ui.util - (:require [noir.io :as io] + (:require [clojure.java.io :refer [resource file]] [noir.session :as session] - [markdown.core :as md])) + [markdown.core :refer [md-to-html-string]])) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; @@ -33,16 +33,13 @@ "reads a markdown file from public/md and returns an HTML string" [filename] (->> - (io/slurp-resource filename) - (md/md-to-html-string))) + (slurp (resource filename)) + (md-to-html-string))) (defn list-resources [directory pattern] "List resource files matching `pattern` in `directory`." - (let - [path (str (io/resource-path) directory)] - (session/put! :list-resources-path path) - (sort - (remove nil? + (sort + (remove nil? (map #(first (rest (re-matches pattern (.getName %)))) - (file-seq (clojure.java.io/file path))))))) + (file-seq (file (resource directory)))))))