summaryrefslogtreecommitdiff
path: root/desk/web/board/router.hoon
diff options
context:
space:
mode:
Diffstat (limited to 'desk/web/board/router.hoon')
-rw-r--r--desk/web/board/router.hoon281
1 files changed, 281 insertions, 0 deletions
diff --git a/desk/web/board/router.hoon b/desk/web/board/router.hoon
new file mode 100644
index 0000000..48c72a9
--- /dev/null
+++ b/desk/web/board/router.hoon
@@ -0,0 +1,281 @@
+/- boke, cnt=contact, tp=trill-post
+/+ kaji, fetch-lib=fetch, plib=trill-utils, const=constants, sr=sortug, lib=boke, ui=trill-ui
+/= index /web/index
+/= board /web/board/index
+/= mobile /web/board/mobile-index
+/= thread-page /web/board/thread
+/= new-thread /web/board/new
+/= nag /web/nag
+/= poll /web/components/poll
+
+|_ [rl=req-line:kaji s=state:boke =bowl:gall]
+ +* fetch ~(. fetch-lib [s bowl])
+ b ~(. board [s bowl mob.rl])
+ ::
+ ++ eyre-bail (error-response:kaji 404)
+ ++ manx-bail (error-page:kaji 404)
+::
+++ $ ^- eyre-res:kaji
+ =/ p ?. mob.rl pat.rl [%m pat.rl]
+
+ ?: ?=([%m ~] p) [%page (index ~[(mobile s bowl)] bowl)]
+ ?: ?=([%m %ff rest=*] p) [%html (mobile-fragment rest.p)]
+ =. p ?: ?=([%m rest=*] p) ((pole knot) rest.p) p
+ ?: ?=([%f rest=*] p) [%html (fragment rest.p)]
+ :- %page
+ %- index :_ bowl :_ ~
+ ?+ p manx-bail
+ :: boards
+ ~ (main par.rl)
+ :: these two mostly for mobile
+ [%t tag=@t ~] (tag-index tag.p)
+ [%b cat=@t ~] (board-index cat.p)
+ [%all ~] all-posts
+ :: threads
+ [%n ~] (new-thread tags.s bowl ~)
+ [%edit uid=@t ~] (edit-thread uid.p)
+ [%blog rest=*] (blog-as-thread rest.p)
+ [%p %esc uid=@t ~] (board-thread-no-path uid.p)
+ [tag=@t title=@t rest=*] (board-thread tag.p title.p rest.p)
+ :: [%p rest=*] (board-thread rest.p)
+ ==
+++ fragment
+ |= p=(pole knot)
+ ?+ p ~& no-fragment=p manx-bail
+ :: fetching categories
+ [%boards ~] (w category-list:b)
+ [%tags ~] (w (make-tag-list:b (scag 21 (tags-by-size:lib tags.s src.bowl))))
+ [%tag-search ~] (w tag-search)
+ :: fetching posts
+ [%page type=@t name=@t cursor=@t ~] (post-page type.p name.p cursor.p *_par.rl)
+ [%search type=@t name=@t cursor=@t ~] (post-page type.p name.p cursor.p par.rl)
+ ::
+ :: fetching replies of thread
+ [%replies thread=@t cursor=@t ~] (thread-replies thread.p cursor.p)
+ [%snip uid=@t ~] (post-snippet uid.p)
+ [%edit uid=@t ~] (edit-box uid.p)
+ [%poll %new ~] new-poll
+ ==
+++ mobile-fragment
+ |= p=(pole knot)
+ ?+ p manx-bail
+ [%boards ~] (w category-list:mobile)
+ [%tags ~] (w (make-tag-list:b (scag 33 (tags-by-size:lib tags.s src.bowl))))
+ [%tag-search ~]
+ =/ uq (~(get by par.rl) 'query')
+ %- w
+ ;* ?~ uq :~(;span:"No query")
+ %+ turn (tag-search:fetch u.uq) tag-preview:b
+ [%snip uid=@t ~] (post-snippet uid.p)
+ [%edit uid=@t ~] (edit-box uid.p)
+ ==
+
+
+
+++ w wrap-marl:kaji
+:: Boards
+++ main
+|= params=(map @t @t)
+ =/ post-list
+ =/ tag (~(get by params) 't')
+ ?^ tag (post-page 't' u.tag '0' ~)
+ =/ brd (~(get by params) 'b')
+ ?^ brd (post-page 'b' u.brd '0' ~)
+ (post-page '' '' '0' ~)
+
+ (main.b post-list)
+
+++ tag-search ^- marl
+ =/ uq (~(get by par.rl) 'query')
+ ;* ?~ uq :~(;span:"No query")
+ %+ turn (tag-search:fetch u.uq) tag-preview:b
+
+
++$ rq $%([%latest ~] [%board name=@t] [%tag name=@t])
+
+++ tag-index
+|= tag=@t
+ %- post-page
+ :^ 't' tag '0' ~
+++ board-index
+|= cat=@t
+ %- post-page
+ :^ 'b' cat '0' ~
+++ all-posts
+ %- post-page
+ :^ 'l' '' '0' ~
+
+++ post-page
+ |= [stype=@t name=@t scursor=@t params=(map @t @t)]
+ =/ contacts (get-contacts:cnt bowl)
+ =/ older=(unit @) ?: .=('0' scursor) ~ (slaw:parsing:sr %uw scursor)
+ =/ =rq
+ ?: .=(stype 't') [%tag name]
+ ?: .=(stype 'b') [%board name]
+ [%latest ~]
+
+ =/ query (~(get by params) 'query')
+ =/ sort-by (~(get by params) 'sort')
+ =/ page-req [~ older board-page-size:const]
+ =/ filter ?~ query
+ %- some |= =thread:tp
+ !(~(has in tags.thread) 'blog')
+ %- some |= =thread:tp
+ ?: (~(has in tags.thread) 'blog') .n
+ (cfind:sr u.query title.thread .n)
+ =/ =tpage:tp
+ ?- -.rq
+ %latest (active-thread-page-all:fetch page-req filter)
+ %tag (active-thread-page-by-tags:fetch ~[name] page-req filter)
+ %board (active-thread-page-by-board:fetch name page-req filter)
+ ==
+ ?: .=('0' scursor)
+ (post-index:b tpage rq contacts query mob.rl)
+ (previews:b tpage rq contacts query mob.rl)
+:: Threads
+
+++ edit-thread |= uid=@t
+ =/ op (thread-by-hash:fetch uid)
+ ?~ op manx-bail
+ (new-thread tags.s bowl op)
+++ board-thread-no-path
+ |= uid=@t
+ =/ post (post:fetch uid)
+ ?~ post manx-bail
+ (serve-thread u.post)
+
+++ blog-as-thread
+ |= p=path
+ =/ op (by-path:fetch p)
+ ?~ op ~& board-blog-path-not-found=p manx-bail
+ =/ is-op .=(thread.u.op [author.u.op id.u.op])
+ ?. is-op manx-bail (serve-thread u.op)
+
+++ serve-thread
+|= =post:tp
+ =/ ted (get:torm:tp threads.s thread.post)
+ ?~ ted ~& board-ted-not-found=rl manx-bail
+ :: =/ fn (node-to-full:plib post feed.s)
+ =/ contacts (get-contacts:cnt bowl)
+ :: =/ post-pid=pid:tp [author.u.post id.u.post]
+ :: ?~ parent.post
+ =/ =cpage:tp (thread-children:fetch u.ted)
+ =. p.cpage [post p.cpage]
+ ~& >> cpage=+.cpage
+ (thread-page u.ted cpage ~ ~ contacts s bowl mob.rl)
+++ thread-replies
+|= [ts=@t cs=@t]
+ =/ contacts (get-contacts:cnt bowl)
+ =/ thread (dec:kaji ts pid:tp)
+ ?~ thread manx-bail
+ =/ cursor (dec:kaji cs @ud)
+ ?~ cursor manx-bail
+ =/ ted (get:torm:tp threads.s u.thread)
+ ?~ ted manx-bail
+ ?~ replies.u.ted manx-bail
+ =/ =cpage:tp (older-children:fetch u.ted +(u.cursor))
+ =< inline
+ %= thread-page
+ thread u.ted
+ children cpage
+ focus (some i.replies.u.ted)
+ search ~
+ contacts contacts
+ state s
+ bowl bowl
+ is-mobile mob.rl
+ ==
+
+++ board-thread
+ |= [tag=@t title=@t rest=(pole knot)]
+ =/ post (by-path:fetch [tag title ~])
+ ?~ post ~& board-path-not-found=rl cant-show
+ (serve-thread u.post)
+
+ ++ cant-show html:nag
+
+ :: =/ children (flatten-fn-2:plib fn)
+ :: =/ req [~ ~ thread-page-size:const]
+ :: =/ children (get-children-page:plib fn req)
+ :: ~& children=+.children
+
+ :: =/ par (get:gorm:tp feed.s u.parent.post)
+ :: ?~ par ~& par-not-found=rl
+ :: =/ children (bulk-post-by-pid:fetch replies.u.ted)
+ :: =/ =spage:tp [children ~ ~ (lent children)]
+ :: (thread-page title.u.ted contents.u.post spage ~ ~ contacts bowl mob.rl)
+ :: =/ siblings (get-siblings-page-2:plib u.par)
+ :: (thread-page title.u.ted contents.u.post siblings `post-pid ~ contacts bowl mob.rl)
+
+++ edit-box
+ |= uid=@t
+ =/ up (post:fetch uid)
+ ?~ up not-found
+ =/ tag-string (tags-to-tape:ui tags.u.up)
+ =/ post-text (content-to-md:ui contents.u.up)
+ =/ action ?~ parent.u.up "add-post" "add-reply"
+ ;form.content.edit-box
+ =kaji "poke"
+ =action action
+ ;input(type "hidden", name "editing", value (trip uid));
+ ;input(type "hidden", name "error-div", value ".error-div");
+ ;input(type "hidden", name "title", value (trip title.u.up));
+ ;* ?~ parent.u.up ~ =/ p-string (enc:kaji [thread.u.up u.parent.u.up])
+ ;+ ;input(type "hidden", name "parents", value p-string);
+ ;textarea
+ =name "text"
+ ; {post-text}
+ ==
+ :: ;label
+ :: ; Tags
+ :: ;input(type "text", name "tags", value tag-string);
+ :: ==
+ ;div.buttons
+ ;input
+ =type "submit"
+ =value "Save"
+ ;
+ ==
+ ;button
+ =kaji "poke"
+ =action "del-reply"
+ =name "pid"
+ =payload (trip uid)
+ ; Delete
+ ==
+ ;div.error-div;
+ ==
+ ==
+++ post-snippet
+ |= uid=@t
+ =/ up (post:fetch uid)
+ ?~ up not-found
+ =/ contacts (get-contacts:cnt bowl)
+ =/ t thread-page(bowl bowl, state s, contacts contacts)
+ (snippet:t u.up)
+
+
+++ not-found
+;div
+ ; Post not found
+==
+
+++ new-poll (form:poll bowl)
+
+
+:: ++ serve-tags
+:: |= tags=path
+:: =/ postl (search-filter-full:plib feed.s [~ ~ board-page-size:const] (tag-search:plib tags))
+:: =/ tag-string %^ foldi:sr tags "" |= [i=@ud t=@t acc=tape]
+:: ?: .=(i (dec (lent tags)))
+:: "{acc}{(trip t)}"
+:: "{acc}{(trip t)}, "
+:: =/ page
+:: ;div#tag-search
+:: ;header
+:: ;h2.tc: Tag Search: {tag-string}
+:: ==
+:: ;+ (html:post-list postl)
+:: ==
+:: (index ~[title page] bowl)
+--