Browse code
(init)
Ed Langley authored on 12/09/2019 08:00:02
Showing 8 changed files
Showing 8 changed files
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>") |