5 changed files with 75 additions and 47 deletions
@ -1,21 +1,32 @@ |
|||||||
(ns NoteHub.main |
(ns NoteHub.main |
||||||
(:require [clojure.browser.dom :as dom] |
(:use [jayq.core :only [$ css inner val anim]]) |
||||||
[goog.dom :as gdom] |
(:require [fetch.remotes :as remotes] |
||||||
[goog.style :as style] |
[clojure.browser.dom :as dom] |
||||||
[goog.dom.classes :as classes] |
[clojure.browser.event :as event]) |
||||||
[clojure.browser.event :as event] |
(:require-macros [fetch.macros :as fm])) |
||||||
[goog.editor.focus :as focus])) |
|
||||||
|
|
||||||
(defn $ |
; frequently used selectors |
||||||
"The DOM-element selector." |
(def $draft ($ :#draft)) |
||||||
[selector] |
(def $preview ($ :#preview)) |
||||||
(dom/get-element selector)) |
|
||||||
|
|
||||||
(if-let [draft ($ "draft")] |
(defn scroll-to |
||||||
(focus/focusInputField draft)) |
"scrolls to the given selector" |
||||||
|
[$id] |
||||||
|
(anim ($ :body) {:scrollTop ((js->clj (.offset $id)) "top")} 500)) |
||||||
|
|
||||||
; Show the Preview button as soon as the user starts typing. |
; set focus to the draft textarea (if there is one) |
||||||
(event/listen ($ "draft") |
(.focus $draft) |
||||||
:keypress |
|
||||||
(fn [e] |
; show the preview & publish buttons as soon as the user starts typing. |
||||||
(style/setStyle ($ "preview-button") "display" "block"))) |
(.keypress $draft |
||||||
|
(fn [e] |
||||||
|
(css ($ :#buttons) {:display :block}))) |
||||||
|
|
||||||
|
; on a preview button click, transform markdown to html, put it |
||||||
|
; to the preview layer and scroll to it |
||||||
|
(.click ($ :#preview-button) |
||||||
|
(fn [e] |
||||||
|
(do |
||||||
|
(fm/remote (md-to-html (val $draft)) [result] |
||||||
|
(inner $preview result) |
||||||
|
(scroll-to $preview))))) |
||||||
|
|||||||
@ -1,31 +1,34 @@ |
|||||||
(ns NoteHub.views.pages |
(ns NoteHub.views.pages |
||||||
(:require [NoteHub.views.common :as common]) |
(:require [NoteHub.views.common :as common]) |
||||||
(:use |
(:use |
||||||
[clojure.string :rename {replace sreplace} :only [trim split replace]] |
[noir.response :only [content-type]] |
||||||
[noir.core :only [defpage]] |
[clojure.string :rename {replace sreplace} :only [trim split replace]] |
||||||
[hiccup.form]) |
[noir.core :only [defpage]] |
||||||
|
[hiccup.form] |
||||||
|
[noir.fetch.remotes]) |
||||||
(:import [org.pegdown PegDownProcessor])) |
(:import [org.pegdown PegDownProcessor])) |
||||||
|
|
||||||
(defpage "/" {} |
(defpage "/" {} |
||||||
(common/layout "Free Markdown Hosting" |
(common/layout "Free Markdown Hosting" |
||||||
[:div#hero |
[:div#hero |
||||||
[:h1 "NoteHub"] |
[:h1 "NoteHub"] |
||||||
[:h2 "Free hosting for markdown pages."] |
[:h2 "Free hosting for markdown pages."] |
||||||
[:br] |
[:br] |
||||||
[:br] |
[:br] |
||||||
[:a.button {:href "/new"} "New Page"]])) |
[:a.landing-button {:href "/new"} "New Page"]])) |
||||||
|
|
||||||
(defpage "/new" {} |
(defpage "/new" {} |
||||||
(common/layout "New Markdown Note" |
(common/layout "New Markdown Note" |
||||||
[:div.central-body |
[:div.central-body |
||||||
(form-to [:post "/preview-note"] |
(form-to [:get "/preview-note"] |
||||||
(text-area {:class "max-width"} :draft) |
(text-area {:class "max-width"} :draft) |
||||||
(submit-button {:id "preview-button"} "Preview"))])) |
[:div#buttons.hidden |
||||||
|
(submit-button {:style "float: left" :class "button"} "Publish") |
||||||
|
[:button#preview-button.button {:type :button :style "float: right"} "Preview"]])] |
||||||
|
[:div#preview-start] |
||||||
|
[:article#preview.central-body])) |
||||||
|
|
||||||
; Actions. |
; Actions. |
||||||
|
|
||||||
(defpage [:post "/preview-note"] {:keys [draft]} |
(defremote md-to-html [draft] |
||||||
(let [get-title (comp trim #(sreplace % "#" "") first #(split % #"\n"))] |
(.markdownToHtml (PegDownProcessor.) draft)) |
||||||
(common/layout (get-title draft) |
|
||||||
[:article.central-body |
|
||||||
(.markdownToHtml (PegDownProcessor.) draft)]))) |
|
||||||
|
|||||||
Loading…
Reference in new issue