From c15cd08159c5aa8465c7494246d2bdd3b88c4b24 Mon Sep 17 00:00:00 2001 From: Simon Brooke Date: Wed, 23 Jul 2014 10:04:04 +0100 Subject: [PATCH] Restyling; much reorganisation of documentation. --- README.md | 16 +++ project.clj | 2 +- resources/public/css/form.css | 94 --------------- resources/public/css/override.css | 50 -------- resources/public/css/standard.css | 35 +++--- resources/public/docs/mw-engine/uberdoc.html | 32 ++---- .../hill.png => heightmaps/small_hill.png} | Bin resources/public/img/tiles/pasture.png | Bin 0 -> 368 bytes resources/public/md/about.md | 37 ++---- resources/public/md/docs.md | 21 ---- resources/public/md/lesson-plans/example.md | 10 ++ resources/public/md/missing.md | 3 + resources/templates/base.html | 27 ++--- resources/templates/docs.html | 108 ++++++++++++++++++ src/mw_ui/render_world.clj | 2 +- src/mw_ui/routes/home.clj | 27 ++++- src/mw_ui/routes/params.clj | 10 +- 17 files changed, 217 insertions(+), 257 deletions(-) delete mode 100644 resources/public/css/form.css delete mode 100644 resources/public/css/override.css rename resources/public/img/{20x20/hill.png => heightmaps/small_hill.png} (100%) create mode 100644 resources/public/img/tiles/pasture.png delete mode 100644 resources/public/md/docs.md create mode 100644 resources/public/md/lesson-plans/example.md create mode 100644 resources/public/md/missing.md diff --git a/README.md b/README.md index 84cf94b..8c3d29f 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,9 @@ all those: I'll leave you to work out what the rules of life are for yourself, from the Wiki page I linked to. +**CHEAT** _You'll find other rule sets you can explore if you go to the_ +_[Parameters](params) page_. + ### Change the engine If you want to modify the engine itself, you will need @@ -131,6 +134,19 @@ which is quite small and will run on a Raspberry Pi, or [LightTable](http://www.lighttable.com/), which is extremely helpful but needs a more powerful computer. +#### Worthwhile projects + +If you would like to work on the engine, there's things that would be worth +improving: + +1. Better arithmetic in actions +2. Better arithmetic in conditions - it would be useful to be able to say _'if generation is more than 64 - y then state should be snow'_. This would make the ice retreat in the right direction in the iceage rule set. +3. Better error messages when rules don't parse, explaining where the problem occured _(very hard)_. +4. Make this all work in ClojureScript in the browser, so there's less load on the server and one server can support more users _(quite hard)_. +5. Optimisation: MicroWorld runs quite slowly, you can't really do big maps and one server won't support many users. There must be many ways performance can be improved. + +If you make changes which you think improve MicroWorld, please [mail them to me](mailto:simon@journeyman.cc). + Have fun! ## License diff --git a/project.clj b/project.clj index deb1e5c..67a49b3 100644 --- a/project.clj +++ b/project.clj @@ -14,7 +14,7 @@ [noir-exception "0.2.2"]] :repl-options {:init-ns mw-ui.repl} - :plugins [[lein-ring "0.8.10"] + :plugins [[lein-ring "0.8.11"] [lein-environ "0.5.0"] [lein-marginalia "0.7.1"]] :ring {:handler mw-ui.handler/app diff --git a/resources/public/css/form.css b/resources/public/css/form.css deleted file mode 100644 index 4116a67..0000000 --- a/resources/public/css/form.css +++ /dev/null @@ -1,94 +0,0 @@ -.form-all{list-style:none;list-style-position:outside;margin:0px;font-family:Verdana;font-size:12px}.form-captcha{border:1px -solid #ccc;background:#f5f5f5;padding:6px;width:152px;-moz-border-radius:4px 4px 4px 4px;-webkit-border-radius:4px;border-radius:4px 4px 4px 4px}#payment_total{display:inline-block}#coupon-message{font-size:10px;font-weight:normal;white-space:normal}.form-captcha:hover{border:1px -solid #aaa}.form-captcha-image{border:1px -solid #aaa;-moz-border-radius:4px 4px 4px 4px;-webkit-border-radius:4px;border-radius:4px 4px 4px 4px}.form-collapse-table{height:58px;border:1px -solid #ccc;background:#f5f5f5 url(/images/soft-grad.png) repeat-x;position:relative}.form-list{padding:3px;border:1px -solid #CCC;-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.2) inset;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.2) inset;box-shadow:0 1px 1px rgba(0, 0, 0, 0.2) inset}.form-list -option{padding:2px}.form-list option:nth-child(2n+1){background:#f5f5f5}.form-textarea{font-family:"Lucida Grande",Verdana}.form-textarea-limit{}.form-textarea-limit>span{display:inline-block}.form-textarea-limit -textarea{overflow:auto}.form-textarea-limit textarea:focus{outline:none !important}.form-textarea-limit-indicator{color:#666;font-size:9px;margin-top: -1px;padding:2px;text-align:right}.form-textarea-limit-indicator-error{background:#FAA;color:#fff}.nicEdit-main{background-color:white}.form-datetime-validation-error{background:#FAA;color:#fff}.form-collapse-left{}.form-collapse-mid{text-shadow:0px 2px 0px #fff;float:left;font-size:18px;margin:16px -45px 16px 20px}.form-product-item{display:inline-block;padding:5px -5px 5px 10px;position:relative}.form-product-item -img{display:block;position:static;margin:0 -12px 0 0;float:left;-moz-border-radius:3px 3px;-webkit-border-radius:3px 3px;border-radius:3px 3px}.hover-product-item:hover{background:#f5f5f5;color:#000}.form-product-item label, .form-product-item .form-radio, .form-product-item .form-checkbox{cursor:pointer}.form-special-subtotal{display:block;font-size:10px;margin-left:10px;margin-top:6px}.form-product-image,.form-product-image-with-options{margin:5px;margin-left:10px}.form-product-image-with-options{position:absolute;top:15px;-moz-border-radius:5px 5px;-webkit-border-radius:5px 5px;border-radius:5px 5px}.form-radio,.form-checkbox{vertical-align:middle;margin:0px;padding:0px}.form-radio-item,.form-checkbox-item{margin-top:5px;float:left}.form-multiple-column,.form-single-column{display:inline-block}.form-multiple-column .form-radio-item, .form-multiple-column .form-checkbox-item{width:150px}.form-radio-item label, .form-checkbox-item -label{margin-left:5px}.form-radio-item br, .form-checkbox-item -br{clear:left}.form-submit-button,.form-submit-reset,.form-submit-print,.form-screen-button{margin:0px;overflow:visible;padding:1px -6px;width:auto}.form-submit-button::-moz-focus-inner,.form-submit-reset::-moz-focus-inner{border:0px;padding:1px -6px}.form-button-red{border:1px -solid red}.form-button-magenta{border:1px -solid magenta}.form-screen-message{width:260px;height:100px}.form-screen-button -div{background-image:url("/images/photo.png");background-position:center;background-repeat:no-repeat;height:50px;width:50px}.form-screen-button{position:absolute;top:1px;margin:0px;margin-left:10px;padding:0px;background:#fdc000;background: -moz-linear-gradient(top, #fdc000 0%, #fe8900 100%);background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fdc000), color-stop(100%,#fe8900));background: -webkit-linear-gradient(top, #fdc000 0%,#fe8900 100%);background: -o-linear-gradient(top, #fdc000 0%,#fe8900 100%);background: -ms-linear-gradient(top, #fdc000 0%,#fe8900 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#fdc000', endColorstr='#fe8900',GradientType=0 );background:linear-gradient(top, #fdc000 0%,#fe8900 100%);-moz-box-shadow:0 1px 0 rgba(255, 255, 255, .6), 0 1px 0 rgba(255,255,255,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255, 255, 255, .6), 0 1px 0 rgba(255,255,255,.6) inset;box-shadow:0 1px 0 rgba(255, 255, 255, .6), 0 1px 0 rgba(255,255,255,.6) inset;border:1px -solid #ae5d00;border-radius:5px}.form-screen-button:hover{background:#fcc932;background: -moz-linear-gradient(top, #fcc932 0%, #fc9e32 100%);background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fcc932), color-stop(100%,#fc9e32));background: -webkit-linear-gradient(top, #fcc932 0%,#fc9e32 100%);background: -o-linear-gradient(top, #fcc932 0%,#fc9e32 100%);background: -ms-linear-gradient(top, #fcc932 0%,#fc9e32 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#fcc932', endColorstr='#fc9e32',GradientType=0 );background:linear-gradient(top, #fcc932 0%,#fc9e32 100%);border:1px -solid #ae5d00}.form-screen-button:active{background:#fe8900;background: -moz-linear-gradient(top, #fe8900 0%, #fdc000 100%);background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#fe8900), color-stop(100%,#fdc000));background: -webkit-linear-gradient(top, #fe8900 0%,#fdc000 100%);background: -o-linear-gradient(top, #fe8900 0%,#fdc000 100%);background: -ms-linear-gradient(top, #fe8900 0%,#fdc000 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#fe8900', endColorstr='#fdc000',GradientType=0 );background:linear-gradient(top, #fe8900 0%,#fdc000 100%);border:1px -solid #C56600;-moz-box-shadow:0 1px 0 rgba(255, 255, 255, .6), 0 -1px 0 rgba(255,255,255,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255, 255, 255, .6), 0 -1px 0 rgba(255,255,255,.6) inset;box-shadow:0 1px 0 rgba(255, 255, 255, .6), 0 -1px 0 rgba(255,255,255,.6) inset}.form-screenshot-plate{background:url("/images/noises/defaultdesktop.png") repeat scroll 0 0 transparent;border:2px -solid #545454;border-radius:3px 3px 3px 3px;box-shadow:0 0 5px rgba(0, 0, 0, 0.7) inset;margin:10px -0;text-align:center}.form-screenshot-img{box-shadow:0 0 5px rgba(0, 0, 0, 0.7);margin:14px -0;display:inline-block}.form-screenshot-img -img{}.form-submit-print::-moz-focus-inner{padding:0px -6px}.form-submit-print{padding:1px -6px}.form-submit-print -img{margin-left: -14px;margin-right:3px;margin-top: -3px}.form-submit-print{margin-bottom: -4px;margin-top: -6px;margin-left: -6px;margin-right:5px}.form-submit-button-img{border:none !important;margin:0 -!important;padding:0 -!important;background:none !important;cursor:pointer !important}.form-collapse-right{position:absolute;right:0px;height:58px;width:40px}.form-collapse-right-show{background:url(/images/arrow-open.png) no-repeat center}.form-collapse-right-hide{background:url(/images/arrow-closed.png) no-repeat center}.form-collapse-hidden{display:none}.form-grading-item{margin-bottom:3px}.form-header{margin:0px}.form-footer{margin:0px;text-align:center;font-size:9px;color:#999;font-weight:300}.form-subHeader{border-top:1px solid #ccc;font-style:italic}.form-header-group{background:#f5f5f5;border-bottom:1px solid #ccc;padding:12px;clear:both}.form-footer-group{padding:12px;clear:both}.form-label{width:150px;margin-bottom:6px;display:inline-block;white-space:normal}.form-label-top{margin-bottom:6px;display:block;white-space:normal}.form-label-left{float:left;display:inline-block;text-align:left;padding:3px;white-space:normal}.form-label-right{float:left;display:inline-block;text-align:right;margin-bottom:6px;padding:3px;white-space:normal}.form-input-wide{}.form-section,.form-section-closed{list-style:none;list-style-position:outside;margin:0px;padding:0px;position:relative;zoom:1;clear:both}.form-section-closed{overflow:hidden;height:60px}.form-input{display:inline-block}.form-line{clear:both;padding:10px;margin:0px;display:block;width:97%;width:-moz-available;position:relative}.form-line-column{float:left;clear:none;width:auto;white-space:nowrap}.form-line.form-line-column{display:inline-block}.form-line-column-clear{clear:left;width:auto}.form-line-active{background-color:#FFFFE0;color:#333}.form-matrix-table{border-collapse:collapse;font-size:10px;margin-bottom:5px}.form-matrix-column-headers{border:1px -solid #ccc;background:#ddd;color:inherit;text-align:center}.form-matrix-row-headers{border:1px -solid #ccc;background:#ddd}.form-matrix-values{border:1px -solid #ccc;background:#f5f5f5}.form-pagebreak{border-top:1px solid #ccc;background:#f5f5f5;height:60px;clear:left}.form-pagebreak-back-container,.form-pagebreak-next-container{float:left;padding:10px;padding-top:14px}.form-pagebreak-next-container{padding-left:0px}.form-pagebreak-back,.form-pagebreak-next{-webkit-border-radius:5px 5px;-webkit-box-shadow:0px 1px 2px #aaa;-moz-border-radius:5px 5px;-moz-box-shadow:0px 1px 2px #aaa;border-radius:5px 5px;box-shadow:0px 1px 2px #aaa;border:1px -solid #999;background:#ddd;padding:5px;margin:0px;font-size:14px}.form-pagebreak-next{margin:0 -0 0 20px}.button-hidden{display:none}.form-required{margin-left:5px;color:red}.form-scale-table{font-size:12px}.form-scale-table -th{border-bottom:1px solid #ccc;color:#999}.form-product-details{font-size:9px;color:#999;font-style:italic}.form-address-table{width:330px}.form-address-line{width:310px}.form-address-city,.form-address-state{width:144px}.form-address-table td, .form-address-table -th{padding-bottom:10px}.form-address-table -select{width:150px}.form-button-error{color:red;display:inline;text-align:center}.form-pagebreak>.form-button-error{padding:14px -10px 10px;display:block}.form-line-error{background:#FAA;color:#333}.form-line-error input:not(#coupon-input), .form-line-error textarea,.form-validation-error{border:1px -solid red;-moz-box-shadow:0 0 2px red;-webkit-box-shadow:0 0 2px red;box-shadow:0 0 2px red}.form-validation-error.form-input{border:none}.form-line-active .form-error-message{display:none}.form-error-message{z-index:900;position:absolute;max-width:130px;right:0px;top:0px;color:#333;padding:3px;font-size:10px;border:4px -solid #d88;-webkit-box-shadow:0px 2px 4px rgba(102, 102, 102, 0.5);-webkit-border-radius:6px 6px;-moz-box-shadow:0px 2px 4px rgba(102, 102, 102, 0.5);-moz-border-radius:6px 6px;box-shadow:0px 2px 4px rgba(102, 102, 102, 0.5);border-radius:6px 6px;background:#FCC}.form-error-arrow{position:absolute;top:-20px;left:10px;height:0px;width:0px;border:10px -solid transparent;border-bottom-color:#666;border-bottom:10px solid rgba(102,102,102,0.3)}.form-error-arrow-inner{position:absolute;top:1px;height:0px;width:0px;border:10px -solid transparent;border-bottom-color:#FCC;border-bottom-width:11px;left:-10px;top:-10px}.form-input .form-error-message, .form-input-wide .form-error-message{bottom:-5px;font-size:11px;position:relative;z-index:900;right:auto;top:auto;color:#333;padding:3px;max-width:100%;padding-bottom:3px;font-size:12px;border:none;-moz-box-shadow:0px 2px 4px rgba(102, 102, 102, 0.5);-webkit-box-shadow:0px 2px 4px rgba(102, 102, 102, 0.5);-moz-border-radius:6px 6px;-webkit-border-radius:6px 6px;box-shadow:0px 2px 4px rgba(102, 102, 102, 0.5);border-radius:6px 6px;background:#FCC}.form-description{z-index:1000;position:absolute;right:7px;max-width:150px;top:6px;border:4px -solid #ccc;-webkit-border-radius:6px 6px;-webkit-box-shadow:0px 2px 4px #666;-moz-border-radius:6px 6px;-moz-box-shadow:0px 2px 4px #666;border-radius:6px 6px;box-shadow:0px 2px 4px #666;background:#f5f5f5;white-space:normal}.form-description-content{padding:10px;font-size:10px;color:#333}.form-description-arrow{border-color:transparent #CCC transparent transparent;border-style:solid;border-width:10px;height:0;width:0;left:-24px;top:7px;position:absolute}.form-description-arrow-small{border-color:transparent #F5F5F5 transparent transparent;border-style:solid;border-width:7px;height:0;width:0;left:-14px;top:10px;position:absolute}.right{right:33px !important;float:none !important}.form-line:hover .form-description-indicator, .form-line-active .form-description-indicator{display:block}.form-description-indicator{display:none;height:100%;position:absolute;right:0;top:0;width:25px;background:url(/images/s-info.png) no-repeat center}.right .form-description-arrow{border-color:transparent transparent transparent #CCC;left:auto;right:-24px}.right .form-description-arrow-small{border-color:transparent transparent transparent #F5F5F5;left:auto;right:-14px}.form-autocomplete-list{font-family:Verdana,Geneva,Arial,Helvetica,sans-serif;font-size:12px;background:#333;background:rgba(26,58,81,0.8);border:1px -solid #eee;border-top:none;padding:5px -0;-moz-border-radius-bottomright:10px 10px;-moz-border-radius-bottomleft:10px 10px;-moz-box-shadow:0px 5px 10px rgba(0,0,0,0.6);-webkit-border-bottom-right-radius:10px 10px;-webkit-border-bottom-left-radius:10px 10px;-webkit-box-shadow:0px 5px 10px rgba(0,0,0,0.6);border-radius-bottom-right:10px 10px;border-radius-bottom-left:10px 10px;box-shadow:0px 5px 10px rgba(0,0,0,0.6)}.form-autocomplete-list-item{margin:0 -5px;border:1px -solid transparent;color:#fff;padding:3px;-moz-border-radius:5px 5px;-webkit-border-radius:5px;border-radius:5px 5px;text-shadow:1px 1px 3px #000;cursor:pointer}.form-autocomplete-list-item-selected,.form-autocomplete-list-item:hover{-moz-box-shadow:0 0 4px #333;-webkit-box-shadow:0 0 4px #333;box-shadow:0 0 4px #333;border:1px -solid #1a3a51;background:#4295D1}.form-autocomplete-list-item:hover{border:1px -solid #ccc}.form-sub-label-container{display:inline-block;margin-right:5px;white-space:nowrap}.form-sub-label{color:#999;display:block;font-size:9px}.form-html{padding:3px;white-space:normal}.form-radio-other-input,.form.checkbox-other-input{margin-left:5px}.form-spinner-input-td{white-space:normal}.form-spinner-input-td input[type="number"]::-webkit-inner-spin-button, -.form-spinner-input-td input[type="number"]::-webkit-outer-spin-button{display:none}.edit-hover{display:none}.form-custom-hint{color:#aaa !important;overflow:hidden !important}.filePicker-button{border-style:solid;border-width:1px;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);cursor:pointer;display:inline-block;vertical-align:middle;padding:9px -24px;margin-bottom:0;font-size:13px;line-height:18px;text-align:center;color:#FFF;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background:#0074CC;background: -moz-linear-gradient(top, #08c 0%, #05c 100%);background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#0088cc), color-stop(100%,#0055cc));background: -webkit-linear-gradient(top, #08c 0%,#05c 100%);background: -o-linear-gradient(top, #08c 0%,#05c 100%);background: -ms-linear-gradient(top, #08c 0%,#05c 100%);background:linear-gradient(to bottom, #08c 0%,#05c 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#0088cc', endColorstr='#0055cc',GradientType=0 );-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;-moz-box-shadow:0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.05);-webkit-box-shadow:0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 0 rgba(255, 255, 255, 0.2) inset, 0 1px 2px rgba(0,0,0,0.05)}.filePicker-button:hover{background:#00a0f0;background: -moz-linear-gradient(top, #00a0f0 0%, #0064f0 100%);background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#00a0f0), color-stop(100%,#0064f0));background: -webkit-linear-gradient(top, #00a0f0 0%,#0064f0 100%);background: -o-linear-gradient(top, #00a0f0 0%,#0064f0 100%);background: -ms-linear-gradient(top, #00a0f0 0%,#0064f0 100%);background:linear-gradient(to bottom, #00a0f0 0%,#0064f0 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#00a0f0', endColorstr='#0064f0',GradientType=0 )}.filePicker-button:active{background:#0064f0;background: -moz-linear-gradient(top, #0064f0 0%, #00a0f0 100%);background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#0064f0), color-stop(100%,#00a0f0));background: -webkit-linear-gradient(top, #0064f0 0%,#00a0f0 100%);background: -o-linear-gradient(top, #0064f0 0%,#00a0f0 100%);background: -ms-linear-gradient(top, #0064f0 0%,#00a0f0 100%);background:linear-gradient(to bottom, #0064f0 0%,#00a0f0 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#0064f0', endColorstr='#00a0f0',GradientType=0 )}.qq-uploader{position:relative;width:224px}.qq-upload-button{background:#ffa84c;background: -moz-linear-gradient(top, #FBCB5D 0%, #EFA003 100%);background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#FBCB5D), color-stop(100%,#EFA003));filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#FBCB5D', endColorstr='#EFA003',GradientType=0 );color:#FFF;display:block;font-size:16px;padding:8px -0;text-align:center;text-shadow:0 -1px #C64F00;border:1px -solid #C64F00;-moz-border-radius:5px 5px;-webkit-border-radius:5px 5px;border-radius:5px 5px}.qq-upload-button-hover{background:#ff7b0d;background: -moz-linear-gradient(top, #ff7b0d 0%, #ffa84c 100%);background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ff7b0d), color-stop(100%,#ffa84c));filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#ff7b0d', endColorstr='#ffa84c',GradientType=0 )}.qq-upload-button-focus{outline:1px -dotted black}.qq-upload-delete{display:none;top:0px;position:absolute;background:#f85032;background: -moz-linear-gradient(top, #f85032 0%, #f16f5c 50%, #f6290c 51%, #f02f17 71%, #e73827 100%);background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f85032), color-stop(50%,#f16f5c), color-stop(51%,#f6290c), color-stop(71%,#f02f17), color-stop(100%,#e73827));filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#f85032', endColorstr='#e73827',GradientType=0 );width:20px;height:20px;right:0px;color:#fff;line-height:18px;text-align:center;text-shadow:0 -1px 0px #000;-moz-border-radius:0px 5px 5px 0px;-webkit-border-radius:0px 5px 5px 0px;border-radius:0px 5px 5px 0px;border-left:1px solid #aaa;cursor:pointer}.qq-upload-delete:hover{background:#ffb76b;background: -moz-linear-gradient(top, #ffb76b 0%, #ffa73d 50%, #ff7c00 51%, #ff7f04 100%);background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ffb76b), color-stop(50%,#ffa73d), color-stop(51%,#ff7c00), color-stop(100%,#ff7f04));filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffb76b', endColorstr='#ff7f04',GradientType=0 )}.qq-upload-list li:hover{border:1px -solid #aaa}.qq-upload-list li:hover .qq-upload-delete{display:block}.qq-upload-drop-area{position:absolute;top:0;left:0;width:100%;height:100%;min-height:54px;z-index:2;background:#F5F5F5;background:rgba(240, 240, 240, 0.9);text-align:center;color:#B1B1B1;border:2px -dashed #c5c5c5;-moz-border-radius:5px 5px;-webkit-border-radius:5px 5px;border-radius:5px 5px}.qq-upload-drop-area -span{display:block;position:absolute;top:50%;width:100%;margin-top:-10px;font-size:16px}.qq-upload-drop-area-active{background:lightyellow;background:rgba(222,255,210,0.9)}.qq-upload-list{margin:10px -0;padding:0;list-style:none}.qq-upload-list -li{position:relative;font-size:11px;margin:8px -0;color:#5E5B5B;padding:2px -4px;background:#EEE;-moz-border-radius:5px 5px;-webkit-border-radius:5px 5px;border-radius:5px 5px;white-space:normal;border:1px -solid transparent}.qq-upload-file,.qq-upload-spinner,.qq-upload-size,.qq-upload-cancel,.qq-upload-failed-text{font-size:9px;line-height:16px}.qq-file-uploading{display:inline-block;overflow:hidden;white-space:nowrap;width:80px}.qq-upload-failed-text{float:right}.qq-upload-fail{background:#FF927D !important;color:#fff !important}.qq-upload-fail .qq-upload-size{display:none !important}.qq-upload-file{}.qq-upload-spinner{display:inline-block;background:url("/images/loading.gif");width:15px;height:15px;vertical-align:text-bottom;margin-bottom:3px;margin-left:2px}.qq-upload-size,.qq-upload-cancel{float:right;margin-left:4px}.qq-upload-failed-text{display:none}.qq-upload-fail .qq-upload-failed-text{display:inline}.fb-login-wrapper{}.fb-align-auto,.fb-align-center{}.fb-align-left{}.fb-align-right{}.fb-login-label{color:#888;font-size:11px;line-height:23px}.fb-login-button{}.paypalpro_img{width:40px;height:26px;padding-right:7px}.paypalpro_visa{background:url('/images/credit-card-logo.png') no-repeat 0 0}.paypalpro_mc{background:url('/images/credit-card-logo.png') no-repeat -47px 0}.paypalpro_amex{background:url('/images/credit-card-logo.png') no-repeat -94px 0}.paypalpro_dc{background:url('/images/credit-card-logo.png') no-repeat -141px 0}#recaptcha_logo{display:none}#recaptcha_tagline{display:none}#recaptcha_table{border:none !important}.recaptchatable .recaptcha_image_cell,#recaptcha_table{background-color:transparent !important}#recaptcha_table -td{padding-left:0px !important}.form-single-column -.clearfix{display:inline-block}.form-single-column -.clearfix{display:block}@media only screen and (max-device-width: 550px){body{font-size:18px}.form-all{width:auto !important}.form-label-left{float:none;display:block}.form-buttons-wrapper{margin:5px -!important;text-align:center}.form-submit-print{display:none}.form-textarea{width:94% !important}.form-textbox,.form-textarea,.form-dropdown,.form-list{border:1px -solid #555;padding:4px;-webkit-border-radius:5px 5px;-webkit-box-shadow:0 2px 4px rgba(0,0,0, 0.4) inset;-moz-border-radius:5px 5px;-moz-box-shadow:0 2px 4px rgba(0,0,0, 0.4) inset;border-radius:5px 5px;box-shadow:0 2px 4px rgba(0,0,0, 0.4) inset}.form-address-table{width:300px}.form-address-line{width:280px}.form-address-city,.form-address-state{width:130px}.form-address-table td, .form-address-table -th{padding-bottom:10px}.form-address-table -select{width:120px}.form-spinner{border-collapse:inherit !important;border:1px -solid #555 !important;-webkit-border-radius:5px 5px;-webkit-box-shadow:0 2px 4px rgba(0,0,0, 0.4) inset;-moz-border-radius:5px 5px;-moz-box-shadow:0 2px 4px rgba(0,0,0, 0.4) inset;border-radius:5px 5px;box-shadow:0 2px 4px rgba(0,0,0, 0.4) inset}.form-spinner-up,.form-spinner-down{padding:0 -8px !important;border:none !important;border-left:1px solid #555 !important}.form-spinner-up{-moz-border-radius-topright:5px 5px;-webkit-border-top-right-radius:5px 5px;border-top-right-radius:5px 5px;border-bottom:1px solid #555 !important}.form-spinner-down{-moz-border-radius-bottomright:5px 5px;-webkit-border-bottom-right-radius:5px 5px;border-bottom-right-radius:5px 5px}.form-spinner-input-td{padding-right:6px !important}.form-spinner-input-td -input{padding:4px -!important;background:none}.form-sub-label-container img[id*="pick"]{width:25px}div.form-header-group{margin:0px -!important}div.form-pagebreak .form-label-left{display:inline-block !important;float:left}.form-submit-button,.form-submit-reset{font-size:18px;line-height:30px}.form-captcha{border:1px -solid #555}.form-captcha -input{width:120px !important}}.clearfix2:before,.clearfix2:after{content:" ";display:table}.clearfix2:after{clear:both}div.calendar{color:#000;font-family:Verdana,Geneva,Arial,Helvetica,sans-serif;-moz-box-shadow:0px 0px 8px rgba(0, 0, 0, 0.5);-webkit-box-shadow:0px 0px 8px rgba(0, 0, 0, 0.5);box-shadow:0px 0px 8px rgba(0,0,0,0.5)}div.calendar.popup{margin-left: -40px;margin-top: -100px;z-index:100000}div.calendar -td.weekend{background:#b5cfe9}div.calendar -.today{background:#f9621a !important}div.calendar .title, div.calendar -.button{color:#f9621a}div.calendar -table{background-color:#eee;border:1px -solid #aaa;border-collapse:collapse}div.calendar -thead{background-color:white}div.calendar td, -div.calendar -th{font-size:11px;padding:3px;text-align:center}div.calendar -td.title{font-weight:bold}div.calendar -th{background:#ddd;border-bottom:1px solid #ccc;border-top:1px solid #ccc;font-weight:bold;color:#555}div.calendar tr.days -td{width:2em;color:#555;text-align:center;cursor:pointer}div.calendar tr.days td:hover, -div.calendar td.button:hover{background-color:#34ABFA;cursor:pointer}div.calendar tr.days td:active -div.calendar td.button:active{background-color:#cde}div.calendar tr.days -td.selected{font-weight:bold;background-color:#fff;color:#000}div.calendar tr.days -td.today{font-weight:bold;color:#D50000}div.calendar tr.days -td.otherDay{color:#bbb} \ No newline at end of file diff --git a/resources/public/css/override.css b/resources/public/css/override.css deleted file mode 100644 index 02404ab..0000000 --- a/resources/public/css/override.css +++ /dev/null @@ -1,50 +0,0 @@ -/** - * CSS rules added to override those in existing stylesheets in the interests of better look'n'feel - */ - - -/* this lot taken from an embedded style element within the jot form */ - -.form-label{ -/* width:149px !important; */ -} - -.form-label-left{ -/* width:149px !important; */ -} - -.form-line{ - list-style: none; - margin: 0.5 0.5em; -/* padding-top:12px; - padding-bottom:12px; */ -} - -.form-label-right{ -/* width:149px !important; */ -} - -body, html{ - margin:0; - padding:0; - background:false; -} - -.form-all{ - margin:0px auto; -/* padding-top:20px; - width:390px; */ - color:#555 !important; - font-family:'Arial'; -/* font-size:12px; */ -} - -.form-radio-item label, .form-checkbox-item label, .form-grading-label, .form-header { - color:#555; -} - -.form-required { - color: red; -} -/* end of group from the embedded style element within the jot form */ - diff --git a/resources/public/css/standard.css b/resources/public/css/standard.css index 0fd8ba0..8f2fed2 100644 --- a/resources/public/css/standard.css +++ b/resources/public/css/standard.css @@ -6,14 +6,10 @@ body { /* Overall container div, holds all content of page. Yes, I know it shouldn't have fixed width */ #main-container{ clear: both; - width:80%; - margin: 0 10%; - padding: 0; - padding-top: 12em; - padding-bottom: 2em; + width:100%; } -/* footer of the document, within #main-container */ +/* footer of the document */ #footer { clear: both; font-size: smaller; @@ -33,12 +29,8 @@ body { #header { width:100%; - margin: -10px; - padding: 0.25em 10%; - position: fixed; - z-index: 149; + padding: 2em 10% 0.25em 10%; background-color: black; - background-repeat: no-repeat; color: white; } @@ -53,10 +45,11 @@ body { #nav{ - float: left; margin: 0; - min-height: 56px; - width: 60%; + width: 100%; + position: fixed; + z-index: 149; + background:rgba(40,40,40,0.8); } #nav ul li { @@ -69,14 +62,15 @@ body { color: white; text-decoration: none; font-weight: bold; - padding: 0.25em 0.75em; + padding: 0.1em 0.75em; margin: 0; } #nav ul li.active a { background: silver;} li.nav-item a:hover { background: rgb( 240, 240, 240) } li.nav-item a:active { background: gray; color: white; } + .error { - background-color: #663399;; + background-color: red; color: white; } @@ -107,9 +101,11 @@ h1 { h1, h2, h3, h4, h5 { background-color: black; color: white; - padding-left: -20px; } +p, pre, ul, ol, dl, h1, h2, h3, h4, h5 { + padding: 0.25em 10%; +} input { background-color: white; @@ -124,8 +120,11 @@ input.required:after { color: red; } +label { + min-width: 35%; +} + label, input { - width: 45%; padding: 0.25em 1em; margin: 0 0.5em; } diff --git a/resources/public/docs/mw-engine/uberdoc.html b/resources/public/docs/mw-engine/uberdoc.html index 8ccbf4e..469fa5a 100644 --- a/resources/public/docs/mw-engine/uberdoc.html +++ b/resources/public/docs/mw-engine/uberdoc.html @@ -3063,20 +3063,11 @@ further rules can be applied.

(cond (ifn? rule) (apply-rule cell world rule nil) (seq? rule) (let [[afn src] rule] (apply-rule cell world afn src)))) - ;; {:afn afn :src src}))) - ;; (apply-rule cell world (first rule) (first (rest rule))))) ([cell world rule source] - (try - (let [result (apply rule (list cell world))] - (cond - (and result source) (merge result {:rule source}) - true result)) - (catch Exception e - (merge cell {:error (format "%s at generation %d when in state %s" - (.getMessage e) - (:generation cell) - (:state cell)) - :error-rule source})))))

Derive a cell from this cell of this world by applying these rules.

+ (let [result (apply rule (list cell world))] + (cond + (and result source) (merge result {:rule source}) + true result))))

Derive a cell from this cell of this world by applying these rules.

(defn- apply-rules
   [cell world rules]
   (cond (empty? rules) cell
@@ -3095,15 +3086,16 @@ further rules can be applied.

(format "%s at generation %d when in state %s" (.getMessage e) (:generation cell) - (:state cell))}))))

Return a row derived from this row of this world by applying these rules to each cell.

+ (:state cell))}))))

Return a row derived from this row of this world by applying these rules to each cell.

(defn- transform-world-row
   [row world rules]
-  (map #(transform-cell % world rules) row))

Return a world derived from this world by applying these rules to each cell.

+ (apply vector (map #(transform-cell % world rules) row)))

Return a world derived from this world by applying these rules to each cell.

(defn transform-world
   [world rules]
-  (map
-    #(transform-world-row % world rules)
-    world))

Consider this single argument as a map of :world and :rules; apply the rules + (apply vector + (map + #(transform-world-row % world rules) + world)))

Consider this single argument as a map of :world and :rules; apply the rules to transform the world, and return a map of the new, transformed :world and these :rules. As a side effect, print the world.

(defn- transform-world-state
@@ -3486,7 +3478,7 @@ that every cell's :x and :y properties reflect its place in the matrix.

* `width` total width of the matrix, in cells; * `height` total height of the matrix, in cells." (cond (= index height) nil - true (cons (make-world-row 0 width index) + true (cons (apply vector (make-world-row 0 width index)) (make-world-rows (+ index 1) width height))))

Make a world width cells from east to west, and height cells from north to south.

@@ -3496,7 +3488,7 @@ that every cell's :x and :y properties reflect its place in the matrix.

(defn make-world
   [width height]
-  (make-world-rows 0 width height))

Truncate the print name of the state of this cell to at most limit characters.

+ (apply vector (make-world-rows 0 width height)))

Truncate the print name of the state of this cell to at most limit characters.

(defn truncate-state
   [cell limit]
   (let [s (:state cell)]
diff --git a/resources/public/img/20x20/hill.png b/resources/public/img/heightmaps/small_hill.png
similarity index 100%
rename from resources/public/img/20x20/hill.png
rename to resources/public/img/heightmaps/small_hill.png
diff --git a/resources/public/img/tiles/pasture.png b/resources/public/img/tiles/pasture.png
new file mode 100644
index 0000000000000000000000000000000000000000..44453f997e30d003276c90e0469c1dcfcccc437e
GIT binary patch
literal 368
zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1SFYWcSQjy&H|6fVg?3oVGw3ym^DWND9B#o
z>FdgVkDX6Y&noRhDl1S(vcxr_#5q4VH#M(>!MP|ku_QG`p**uBL&4qCHz2%`PaLS|
zm8Xkih{fsTDff;Zb|g)?@78&d
zZf3qd8mWrf#
ztqc5Y4E-I9|IJWeAX$ILSm?}opy-A)prFN;k4J1=Kk_g%m^ZXHxLvys^fiO0tDnm{
Hr-UW|nW~kA

literal 0
HcmV?d00001

diff --git a/resources/public/md/about.md b/resources/public/md/about.md
index d9a7694..d571d80 100644
--- a/resources/public/md/about.md
+++ b/resources/public/md/about.md
@@ -12,28 +12,23 @@ represented as a map having at least the following properties:
 * **y** The Y offset of this cell within the array (should not be tampered with).
 * **state** The current state of this cell, represented as a clojure key; initially :waste.
 
-As currently initialised all cells have two additional properties:
-
-* **altitude** Altitude of this cell. Initially 1. Currently not used.
-* **fertility** Soil fertility of this cell. Initially 1. Increases under climax forest; later, will decrease under ploughland, may increase under pasture.
-
 Rules can add any additional properties to cells that you like; the current
-'natural-rules' rule-set adds properties for the populations of deer and of
+'ecology' rule-set adds properties for the populations of deer and of
 wolves.
 
 ### Representation of rules
 
-Rules are just ordinary Clojure functions (can be anonymous functions, and in the current
-rule-sets they are) which take two arguments, a cell and a world, and return
-either nil (indicating the rule did not fire), or a new cell which should have
-the same :x and :y properties as the cell passed in. Any other properties can
-be different.
+Rules are simple production rules, in a [grammar](docs#grammar) defined in the 
+documentation. Each rule is compiled into a Clojure anonymous function of two 
+arguments, **world** and **cell**, which if its conditions are met returns a 
+new cell which must the same **x** and **y** values as the cell which was 
+passed. Any other properties may be modified.
 
 ## What is MicroWorld for
 
 The underlying intention is to crudely model the evolution of human settlement
 in a landscape, but also to act as a learning environment to teach ideas about
-software and about ecology.
+software and about geography and ecology.
 
 ## User interface
 
@@ -45,19 +40,5 @@ of the world cell.
 
 The 'state' classes are defined in a CSS file 'states.css', which should be
 edited when you add additional states. Image files should be 32x32 pixels and
-should be stored in the directory 'img/tiles', but at this stage I haven't
-created any.
-
-## Future plans
-
-### Run in the browser
-
-Currently the simulation runs on the server and only the display is in the
-browser. It would be much better converted to ClojureScript and run in the browser
-- that would save both network traffic and server load, and would allow the
-animation to run faster.
-
-### Rule language
-
-It would be good to have a near-English rule parser to make rules easier for
-children to add and modify.
+should be stored in the directory 'img/tiles', be in PNG format, and have a
+name comprising the name of the state followed by '.png'.
diff --git a/resources/public/md/docs.md b/resources/public/md/docs.md
deleted file mode 100644
index a86e3fe..0000000
--- a/resources/public/md/docs.md
+++ /dev/null
@@ -1,21 +0,0 @@
-
-### Managing Your Middleware
-
-Two middleware functions are provided by default in the `mw-ui.middleware` namespace.
-
-* `log-request` - logs all requests using the debug level
-* `template-error-page` - provides friendly formatting for Selmer errors in dev mode
-
-See the `:middleware` key of the `app` definition located in the `mw-ui.handler` namespace to manage the enabled middleware.
-
-### Here are some links to get started
-
-1. [HTML templating](http://www.luminusweb.net/docs/html_templating.md)
-2. [Accessing the database](http://www.luminusweb.net/docs/database.md)
-3. [Serving static resources](http://www.luminusweb.net/docs/static_resources.md)
-4. [Setting response types](http://www.luminusweb.net/docs/responses.md)
-5. [Defining routes](http://www.luminusweb.net/docs/routes.md)
-6. [Adding middleware](http://www.luminusweb.net/docs/middleware.md)
-7. [Sessions and cookies](http://www.luminusweb.net/docs/sessions_cookies.md)
-8. [Security](http://www.luminusweb.net/docs/security.md)
-9. [Deploying the application](http://www.luminusweb.net/docs/deployment.md)
diff --git a/resources/public/md/lesson-plans/example.md b/resources/public/md/lesson-plans/example.md
new file mode 100644
index 0000000..48fe42c
--- /dev/null
+++ b/resources/public/md/lesson-plans/example.md
@@ -0,0 +1,10 @@
+## Lesson plans
+
+I haven't actually written any lesson plans, since I'm not a teacher and that 
+isn't my skill. If you use MicroWorld in class, and find it useful, and would
+like to contribute a lesson plan, please mail it to [me](mailto:simon@journeyman.cc).
+
+Ideally your lesson plan should be written in 'markdown' style, the very simple
+style which is used in this document and other documentation within the program,
+but frankly it doesn't matter - I'll accept them in any format, including hand
+written notes or even (gasp) Microsoft Word.
\ No newline at end of file
diff --git a/resources/public/md/missing.md b/resources/public/md/missing.md
new file mode 100644
index 0000000..43a9d59
--- /dev/null
+++ b/resources/public/md/missing.md
@@ -0,0 +1,3 @@
+## No content file was found?
+
+No content file was found. Are you sure the right one was specified?
diff --git a/resources/templates/base.html b/resources/templates/base.html
index 1419ab8..55ad0ca 100644
--- a/resources/templates/base.html
+++ b/resources/templates/base.html
@@ -19,19 +19,20 @@
     
   
   
-      
+    
+
+    
 
     
{% if message %} diff --git a/resources/templates/docs.html b/resources/templates/docs.html index 2529439..ec8ba58 100644 --- a/resources/templates/docs.html +++ b/resources/templates/docs.html @@ -7,6 +7,7 @@
  • Rule language
  • Implemented states
  • API documentation
  • +
  • For teachers

  • @@ -17,6 +18,7 @@
  • Rule language
  • Implemented states
  • API documentation
  • +
  • For teachers

  • Implemented states

    @@ -42,6 +44,7 @@
  • Rule language
  • Implemented states
  • API documentation
  • +
  • For teachers

  • API documentation

    @@ -58,5 +61,110 @@ {% endfor %} + +
    + +
  • Top
  • +
  • Rule language
  • +
  • Implemented states
  • +
  • API documentation
  • +
  • For teachers
  • +
    +
    +

    For teachers

    +

    MicroWorld was written in the hope that it would be of use for teachers, + including teachers in primary schools. The reason for attempting to write + a very simple rule language was that young people would be able to create + their own rules and rule sets.

    + +

    Classroom setup

    +

    MicroWorld will run on a Raspberry Pi, and I plan to produce a + downloadable SD card image which auto-runs it. One ideal classroom setup + would be to have one Raspberry Pi running MicroWorld to every group of + two or three children.

    +

    MicroWorld will also run on any ordinary PC, including Windows, + Macintosh and Linux machines. I plan to produce a packaged installer + for each operating system.

    +

    Servers and clients

    +

    MicroWorld is a web-app, which means it runs in a web server and the + user interface is a web browser. It would be possible to arrange a + classroom with one copy of MicroWorld on a single server, and each child's + machine running MicroWorld from that single server.

    +

    However, performance isn't very good, and unless you have an unusually + powerful server you may find that when a full class of pupils are running + MicroWorld from a single server performance may be frustratingly poor. + Check your performance before introducing a class to it, and if in doubt, + running a separate copy on each machine used by children may well be more + satisfactory.

    + +

    Subject areas

    +

    One of my main objectives in writing MicroWorld was to create a system + which would be engaging for children and would enable them to see + computing in the context of other subject areas.

    +

    Geography

    +

    Maps of Great Britain and Ireland, and of the Isle of Man, are included + in the distribution; however, only the 'small' version of the map of + Great Britain and Ireland is really useable, the others are too big and + will be two slow. However, you can cut a map of your local area from the + larger maps if that is helpful to your class.

    +

    The following rulesets are of potential use in geography teaching:

    +
    +
    basic
    +
    A very simple ruleset which simply establishes vegetation in the + landscape. Not particularly useful in itself, but a good ruleset for + children to use as a basis for their own projects.
    +
    iceage
    +
    illustrates ice thawing gradually. Because of inadequacies in the + rule language, currently the ice retreats from north to south, which is + of course wrong for the northern hemisphere; but the principle of + retreating ice, the way in which ice retreats up mountains, and the way + in which ecosystems establish themselves.
    +
    ecology
    +
    Attempts to model the effects of browsers and predators - represented + by deer and wolves, respectively - on the landscape.
    +
    settlement
    +
    illustrates human settlement appearing first on coastal promontaries + (e.g. kitchen-midden people), gradually spreads inland (in this model as + nomadic pastoralists), and forms permanent settlements where conditions + are favourable. This helps explore why the towns in your locality are + where they are. The model is obviously simplified, but produces a + potentially useful account of settlement in at least north-western Europe + from paleolithic up to at least late bronze age. Note that unless + your map has at least some coastal promontaries this ruleset will need + to be modified.
    +
    +
    +

    All of these rulesets are deliberately simple. This is so that + children have something to start with, but so that they can actually make + real, demonstrable improvements quite simply.

    +

    History

    +

    The settlement ruleset is probably the best starting point for + history exploration. As described above, it essentially covers only + pre-history; the development of the feudal system, for example, or of + industrialisation, are not modelled. They could be, as (more advanced) + class projects. Writing rules will enable discussion of why castles, or + mills, are positioned where they are, and what the social consequences of + these developments are.

    +

    IT/Informatics

    +

    Obviously, any of the rulesets but particularly the gameoflife + ruleset are good introduction points to informatics lessons. The rule + language is sufficiently simple that introducing children to writing + their own rules can begin almost as soon as basic literacy is + established.

    +

    In more advanced IT lessons, at the upper end of primary school or in + secondary schools, I would encourage you to explore modifying the engine + itself in your classes.

    + +

    Lesson plans

    + +
    {% endblock %} \ No newline at end of file diff --git a/src/mw_ui/render_world.clj b/src/mw_ui/render_world.clj index 15af785..e702055 100644 --- a/src/mw_ui/render_world.clj +++ b/src/mw_ui/render_world.clj @@ -41,7 +41,7 @@ (let [world (or (session/get :world) (engine/transform-world (heightmap/apply-heightmap - "resources/public/img/20x20/hill.png" + "resources/public/img/heightmaps/small_hill.png" ;; "resources/public/img/heightmaps/great_britain_and_ireland_small.png" ) rules/init-rules)) diff --git a/src/mw_ui/routes/home.clj b/src/mw_ui/routes/home.clj index 3a3ced8..43cf414 100644 --- a/src/mw_ui/routes/home.clj +++ b/src/mw_ui/routes/home.clj @@ -1,5 +1,6 @@ (ns mw-ui.routes.home - (:use compojure.core + (:use clojure.walk + compojure.core [mw-ui.routes.rules :as rules] [mw-ui.routes.params :as params]) (:require [hiccup.core :refer [html]] @@ -13,13 +14,25 @@ :content (util/md->html "/md/mw-ui.md")})) (defn world-page [] - (layout/render "trusted-content.html" {:title "Watch your world grow" - :content (html (world/render-world-table)) - :pause (or (session/get :pause) 5) - :maybe-refresh "refresh"})) + (layout/render "trusted-content.html" + {:title "Watch your world grow" + :world-selected "active" + :content (html (world/render-world-table)) + :pause (or (session/get :pause) 5) + :maybe-refresh "refresh"})) (defn about-page [] - (layout/render "trusted-content.html" {:title "About MicroWorld" :content (util/md->html "/md/about.md")})) + (layout/render "trusted-content.html" + {:title "About MicroWorld" + :about-selected "active" + :content (util/md->html "/md/about.md")})) + +(defn md-page [request] + (let [params (keywordize-keys (:params request)) + content (or (:content params) "missing.md")] + (layout/render "trusted-content.html" + {:title "Welcome to MicroWorld" + :content (util/md->html (str "/md/" content))}))) (defn list-states [] (sort @@ -31,6 +44,7 @@ (layout/render "docs.html" {:title "Documentation" :parser (util/md->html "/md/mw-parser.md" ) :states (util/list-resources "resources/public/img/tiles" #"([0-9a-z-_]+).png") + :lessons (util/list-resources "resources/public/md/lesson-plans" #"([0-9a-z-_]+).md") :components ["mw-engine" "mw-parser" "mw-ui"]})) (defroutes home-routes @@ -39,6 +53,7 @@ (GET "/docs" [] (docs-page)) (GET "/world" [] (world-page)) (GET "/params" [] (params/params-page)) + (GET "/md" request (md-page request)) (POST "/params" request (params/params-page request)) (GET "/rules" request (rules/rules-page request)) (POST "/rules" request (rules/rules-page request))) diff --git a/src/mw_ui/routes/params.clj b/src/mw_ui/routes/params.clj index d7f4150..35a360c 100644 --- a/src/mw_ui/routes/params.clj +++ b/src/mw_ui/routes/params.clj @@ -10,11 +10,11 @@ [noir.session :as session])) (defn- send-params [] - {{:title "Choose your world" - :heightmaps (util/list-resources "resources/public/img/heightmaps" #"([0-9a-z-_]+).png") - :pause (or (session/get :pause) 5) - :rulesets (util/list-resources "resources/rulesets" #"([0-9a-z-_]+).txt") - }) + {:title "Choose your world" + :heightmaps (util/list-resources "resources/public/img/heightmaps" #"([0-9a-z-_]+).png") + :pause (or (session/get :pause) 5) + :rulesets (util/list-resources "resources/rulesets" #"([0-9a-z-_]+).txt") + }) (defn params-page "Handler for params request. If no `request` passed, show empty params form.