git.fiddlerwoaroof.com
Browse code

(init)

Ed Langley authored on 12/09/2019 08:00:02
Showing 8 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,2 @@
1
+*~
2
+*.fasl
0 3
new file mode 100644
... ...
@@ -0,0 +1,43 @@
1
+(defpackage :fwoar.default-layout
2
+  (:use :cl )
3
+  (:export
4
+   #:default-layout
5
+   #:border-color))
6
+(in-package :fwoar.default-layout)
7
+
8
+(defclass default-layout ()
9
+  ((%border-color :reader border-color :initform "#eee")))
10
+
11
+(defgeneric border-color (layout)
12
+  )
13
+
14
+(defmethod araneus:styles append ((layout default-layout))
15
+  `((body
16
+     :display flex
17
+     :flex-direction column
18
+     :min-height 100vh)
19
+    (h1
20
+     :height 3em
21
+     :border-bottom 1px solid ,(border-color layout)
22
+     :text-align center
23
+     :line-height 3em)
24
+    (div.main
25
+     :display flex
26
+     :width 100%
27
+     :flex-grow 1)
28
+    (nav
29
+     :width 10%
30
+     :display flex
31
+     :flex-direction column)
32
+    ((nav a)
33
+     :font-weight bold
34
+     :padding 1.5rem
35
+     :text-align right
36
+     :text-decoration underline)
37
+    ((nav (:and a :hover))
38
+     :background "#eee")
39
+    (main
40
+     :flex-grow 1
41
+     :padding 1.5rem
42
+     :border-left 1px solid ,(border-color layout)
43
+     :flex-shrink 1)))
0 44
new file mode 100644
... ...
@@ -0,0 +1,27 @@
1
+(in-package :fwoar.rss-reader)
2
+
3
+(defgeneric app (obj)
4
+  (:documentation "the ningle app that is to be run"))
5
+
6
+(defgeneric handler (obj)
7
+  (:documentation "the clack handler representing the currently running application"))
8
+
9
+(defclass+ rss-reader ()
10
+  ((%app :initform (make-instance 'ningle:<app>)
11
+         :reader app)
12
+   (%handler :accessor handler))
13
+  (:documentation
14
+   "A simple wrapper that ties a ningle app to a clack handler"))
15
+
16
+(defmethod araneus:routes progn ((app rss-reader))
17
+  (araneus:defroutes (app app)
18
+    (("/") (serapeum:partial 'araneus:run-route (make-instance 'homepage)))
19
+    (("/other") (serapeum:partial 'araneus:run-route 'other))))
20
+
21
+(defun start (app)
22
+  (setf (handler app)
23
+        (clack:clackup (app app)))
24
+  app)
25
+
26
+(defun main ()
27
+  (start (araneus:routes (rss-reader))))
0 28
new file mode 100644
... ...
@@ -0,0 +1,13 @@
1
+(defpackage :fwoar.rss-reader.utils
2
+  (:use :cl)
3
+  (:export #:defclass+))
4
+
5
+(defpackage :fwoar.rss-reader.ui
6
+  (:use :cl :parenscript)
7
+  (:export ui
8
+           #:homepage))
9
+
10
+(defpackage :fwoar.rss-reader
11
+  (:use :cl )
12
+  (:import-from :fwoar.rss-reader.utils #:defclass+)
13
+  (:export ))
0 14
new file mode 100644
... ...
@@ -0,0 +1,25 @@
1
+;;; -*- Mode:Lisp; Syntax:ANSI-Common-Lisp; Package: ASDF-USER -*-
2
+(in-package :asdf-user)
3
+
4
+(defsystem :rss-reader 
5
+  :description ""
6
+  :author "Ed L <edward@elangley.org>"
7
+  :license "MIT"
8
+  :pathname #+fw.dev #p"PROJECTS:RSS-READER;" #-fw.dev nil
9
+  :depends-on (#:alexandria
10
+               #:alimenta
11
+               #:araneus
12
+               #:clack
13
+               #:fwoar-lisputils
14
+               #:lass
15
+               #:ningle
16
+               #:parenscript
17
+               #:serapeum
18
+               #:spinneret
19
+               #:uiop)
20
+  :components ((:file "package")
21
+               (:file "utils" :depends-on ("package"))
22
+               (:file "default-layout")
23
+               (:file "ui" :depends-on ("package"))
24
+               (:file "view" :depends-on ("package" "ui" "default-layout"))
25
+               (:file "main" :depends-on ("package" "utils" "view"))))
0 26
new file mode 100644
... ...
@@ -0,0 +1,11 @@
1
+(in-package :fwoar.rss-reader.ui)
2
+
3
+(defun homepage ()
4
+  (spinneret:with-html
5
+    (:h1 "Hello, World!")
6
+    (:div.main
7
+     (:nav
8
+      (:a :data-ic-get-from "/other"
9
+          :data-ic-target "#content"
10
+          "hi"))
11
+     (:main#content "home content"))))
0 12
new file mode 100644
... ...
@@ -0,0 +1,19 @@
1
+(in-package  :fwoar.rss-reader.utils)
2
+
3
+(defmacro defclass+ (name (&rest super) &body (direct-slots &rest options))
4
+  (let ((initargs (append (mapcan (lambda (class)
5
+                                    (typecase class
6
+                                      (cons (cadr class))
7
+                                      (t nil)))
8
+                                  super)
9
+                          (mapcan (lambda (slot)
10
+                                    (alexandria:ensure-list
11
+                                     (alexandria:when-let ((initarg (getf (cdr slot)
12
+                                                                          :initarg)))
13
+                                       (make-symbol (symbol-name initarg)))))
14
+                                  direct-slots))))
15
+    `(progn (defclass ,name ,super
16
+              ,direct-slots
17
+              ,@options)
18
+            (defun ,name (,@initargs)
19
+              (fw.lu:new ',name ,@initargs)))))
0 20
new file mode 100644
... ...
@@ -0,0 +1,59 @@
1
+(in-package :fwoar.rss-reader)
2
+
3
+(defclass rss-reader-route ()
4
+  ())
5
+
6
+(defmethod araneus:view :around ((route rss-reader-route) model)
7
+  "basic html and javascript for our app, as well as an invocation of
8
+the hook that pulls in CSS"
9
+
10
+  (spinneret:with-html-string
11
+    (:doctype)
12
+    (:html
13
+     (:head
14
+      (:script :src "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"
15
+               :defer "defer")
16
+      (:script :src
17
+               "https://cdnjs.cloudflare.com/ajax/libs/intercooler-js/1.2.2/intercooler.min.js"
18
+               :defer "defer")
19
+      (:meta :name "intercoolerjs:use-data-prefix"
20
+             :content "true"/)
21
+      (:style
22
+       (apply 'lass:compile-and-write
23
+              (araneus:styles route))))
24
+     (:body
25
+      (call-next-method)))))
26
+
27
+(defmethod araneus:styles append ((route rss-reader-route))
28
+  "CSS Reset"
29
+
30
+  '((*
31
+     :margin 0
32
+     :padding 0
33
+     :font-family "\"Lato\", sans"
34
+     :box-sizing border-box)              
35
+    ((:or pre code)
36
+     :font-family "\"Source Code Pro\", monospace")
37
+    (body
38
+     :font-size 12pt)
39
+    ((:or h1 h2 h3 h4 h5 h6)
40
+     :font-size 1.6rem)
41
+    ((:or ul ol)
42
+     :padding-left 2rem)))
43
+
44
+(defclass homepage (rss-reader-route fwoar.default-layout:default-layout)
45
+  ())
46
+
47
+(defmethod fwoar.default-layout:border-color ((layout rss-reader-route))
48
+  "#BDE0F3")
49
+
50
+(defmethod araneus:controller ((route homepage) params &key)
51
+  (values))
52
+
53
+(defmethod araneus:view ((route homepage) model)
54
+  (fwoar.rss-reader.ui:homepage))
55
+
56
+(araneus:define-controller other (_)
57
+  (values))
58
+(araneus:define-view other (_)
59
+  "<h2>???</h2>")