geochan/src/pp_babillard.ml

274 lines
7.2 KiB
OCaml
Raw Normal View History

2022-02-02 19:16:53 +01:00
include Bindings
2022-01-29 09:34:57 +01:00
include Babillard
open Db
2022-02-21 02:24:17 +01:00
let pp_post fmt t =
let thread_data_opt, post =
match t with
| Op (data, post) -> (Some data, post)
| Post post -> (None, post)
in
2022-02-21 00:51:44 +01:00
let { id
; parent_id = _parent_id
; date
; nick
; comment
; image_info
; tags
; replies
; citations = _citations
} =
post
2022-02-18 19:40:19 +01:00
in
2022-01-29 09:34:57 +01:00
2022-02-18 01:37:25 +01:00
let image_view fmt () =
2022-01-29 09:34:57 +01:00
match image_info with
| Some (_image_name, image_alt) ->
2022-02-18 01:37:25 +01:00
Format.fprintf fmt
2022-01-29 09:34:57 +01:00
{|
2022-02-18 20:17:24 +01:00
<div class="post-image-container">
2022-02-18 19:40:19 +01:00
<a href="/img/%s">
2022-02-18 20:17:24 +01:00
<img class="post-image" src="/img/%s" alt="%s" title="%s" loading="lazy">
2022-01-29 09:34:57 +01:00
</a>
</div>
|}
2022-02-18 19:40:19 +01:00
id id image_alt image_alt
2022-02-18 01:37:25 +01:00
| None -> Format.fprintf fmt ""
2022-01-29 09:34:57 +01:00
in
let pp_print_reply fmt reply =
2022-02-18 20:17:24 +01:00
Format.fprintf fmt {|<a class="reply-link" href="#%s">&gt;&gt;%s</a>|} reply
2022-01-29 09:34:57 +01:00
reply
in
2022-02-18 01:37:25 +01:00
let pp_print_replies fmt replies =
Format.fprintf fmt {|<div class="replies">%a</div>|}
2022-01-29 09:34:57 +01:00
(Format.pp_print_list ~pp_sep:Format.pp_print_space pp_print_reply)
2022-02-02 13:47:04 +01:00
replies
2022-01-29 09:34:57 +01:00
in
2022-02-18 01:37:25 +01:00
let replies_view fmt () =
2022-02-21 02:24:17 +01:00
if Option.is_some thread_data_opt then
2022-02-21 00:51:44 +01:00
(* TODO put thread_posts count in thread_info ? *)
2022-02-18 19:40:19 +01:00
let res_nb = Db.find Q.count_thread_posts id in
2022-01-29 09:34:57 +01:00
match res_nb with
2022-02-18 01:37:25 +01:00
| Error _ -> Format.fprintf fmt ""
2022-01-29 09:34:57 +01:00
| Ok ((1 | 2) as nb) ->
2022-02-18 01:37:25 +01:00
Format.fprintf fmt {|<div class="replies">%d reply</div>|} (nb - 1)
2022-01-29 09:34:57 +01:00
| Ok nb ->
2022-02-21 00:51:44 +01:00
Format.fprintf fmt {|<div class="replies">%d replies</div>|} (nb - 1)
else pp_print_replies fmt replies
2022-01-29 09:34:57 +01:00
in
2022-02-18 01:37:25 +01:00
let post_links_view fmt () =
2022-02-21 02:24:17 +01:00
if Option.is_some thread_data_opt then
2022-02-21 00:51:44 +01:00
Format.fprintf fmt {|
%a
|} replies_view ()
else
2022-02-18 01:37:25 +01:00
Format.fprintf fmt
2022-01-29 09:34:57 +01:00
{|
<span class=postNo>
2022-02-18 20:17:24 +01:00
<button data-id="%s" class="quote-link" title="Reply to this post">%s</button>
2022-01-29 09:34:57 +01:00
</span>
2022-02-18 01:37:25 +01:00
%a
2022-01-29 09:34:57 +01:00
|}
2022-02-22 08:48:08 +01:00
id id replies_view ()
2022-01-29 09:34:57 +01:00
in
2022-02-18 01:37:25 +01:00
let post_info_view fmt () =
Format.fprintf fmt
2022-01-29 09:34:57 +01:00
{|
2022-02-18 20:17:24 +01:00
<div class="post-info">
2022-01-29 09:34:57 +01:00
<span class="nick">%s</span>
2022-02-23 14:30:06 +01:00
<span class="date" data-time="%f"></span>
2022-02-22 08:48:08 +01:00
<div class="dropend post-menu-div">
<a class="dropdown-toggle post-menu-link" href="#" role="button" id="dropdownMenuLink" data-bs-toggle="dropdown" aria-expanded="false">
</a>
<ul class="dropdown-menu post-menu-content" aria-labelledby="dropdownMenuLink">
<li><a class="dropdown-item" href="#%s">Link to this post</a></li>
<li><a class="dropdown-item" href="/delete/%s">Delete</a></li>
<li><a class="dropdown-item" href="/report/%s">Report</a></li>
</ul>
</div>
2022-02-18 01:37:25 +01:00
%a
2022-01-29 09:34:57 +01:00
</div>|}
2022-02-22 08:48:08 +01:00
nick date id id id post_links_view ()
2022-01-29 09:34:57 +01:00
in
2022-02-02 13:47:04 +01:00
let pp_print_tag fmt tag =
Format.fprintf fmt {|<span class="tag">%s</span>|} tag
in
2022-02-18 01:37:25 +01:00
let pp_print_tags fmt tags =
Format.fprintf fmt {|<div class="tags">%a</div>|}
2022-02-02 13:47:04 +01:00
(Format.pp_print_list ~pp_sep:Format.pp_print_space pp_print_tag)
tags
in
let tags = List.sort String.compare tags in
2022-02-18 01:37:25 +01:00
let tags_view fmt () = pp_print_tags fmt tags in
2022-02-02 13:47:04 +01:00
2022-02-21 02:24:17 +01:00
let subject =
Option.fold ~none:""
~some:(fun thread_data -> thread_data.subject)
thread_data_opt
in
(* put a link in if its a preview *)
let link fmt () =
if Option.is_some thread_data_opt then
Format.fprintf fmt
{|<a class="stretched-link preview-link" href="/thread/%s"></a>|} id
in
2022-02-23 14:30:06 +01:00
Format.fprintf fmt
{|
<div class="position-relative post" id="%s">
2022-02-21 02:24:17 +01:00
<div class="thread-subject">
%s
</div>
%a
%a
%a
<blockquote class="post-comment">%s</blockquote>
%a
</div>
|}
id subject link () post_info_view () image_view () comment tags_view ()
2022-01-29 09:34:57 +01:00
2022-02-21 09:46:27 +01:00
let view_post id =
let* post = get_post id in
Ok (Format.asprintf "%a" pp_post (Post post))
2022-02-21 02:24:17 +01:00
let pp_thread_preview fmt op =
let thread_data, post = op in
2022-02-02 11:58:18 +01:00
let thread_preview =
2022-02-21 02:24:17 +01:00
Format.fprintf fmt
2022-02-02 11:58:18 +01:00
{|
<div class="thread-preview">
%a
</div>
2022-02-02 11:58:18 +01:00
|}
pp_post
2022-02-21 02:24:17 +01:00
(Op (thread_data, post))
2022-02-02 11:58:18 +01:00
in
thread_preview
2022-01-29 09:34:57 +01:00
let catalog_content () =
2022-02-21 02:24:17 +01:00
let^ ids = Db.collect_list Q.get_threads () in
let* ops = get_ops ids in
Ok
(Format.asprintf "%a"
2022-02-22 00:01:35 +01:00
(Format.pp_print_list ~pp_sep:Format.pp_print_space pp_thread_preview)
ops )
2022-02-21 02:24:17 +01:00
2022-02-23 22:39:48 +01:00
let pp_report fmt post report request =
let url = "/admin" in
let nick, reason, _date, id = report in
let input_post_id fmt id =
Format.fprintf fmt
{|<input value="%s" name="post_id" type="hidden"></input>|} id
in
let button fmt value =
Format.fprintf fmt
{|<button value="%s" name="action" type="submit" class="btn btn-primary">%s</button>|}
value
(String.uppercase_ascii value)
in
let form fmt value =
Format.fprintf fmt {|%s %a %a </form>|}
(Dream.form_tag ~action:url request)
input_post_id id button value
in
Format.fprintf fmt
{|
<div class="report">
<div class="row mb-3">
<div class="col-md-6">
%a
</div>
<div class="col-md-6">
<span> From: %s Reason: %s</span>
<div>
%a
</form><br>
%a
</form><br>
%a
</form><br>
</div>
</div>
</div>
</div><br>
|}
pp_post (Post post) nick reason form "ignore" form "delete" form "banish"
let admin_page_content posts reports request =
let posts_reports = List.combine posts reports in
Format.asprintf "%a"
(Format.pp_print_list ~pp_sep:Format.pp_print_space
(fun fmt (post, report) -> pp_report fmt post report request) )
posts_reports
2022-02-21 02:24:17 +01:00
let pp_thread fmt op posts =
let thread_data, _post = op in
2022-02-18 01:37:25 +01:00
(*order by date *)
2022-02-21 02:24:17 +01:00
let posts = List.sort (fun a b -> compare a.date b.date) posts in
2022-02-22 00:29:31 +01:00
let posts_view fmt () =
2022-02-23 14:30:06 +01:00
Format.pp_print_list ~pp_sep:Format.pp_print_space
(fun fmt post -> pp_post fmt (Post post))
fmt posts
2022-02-21 02:24:17 +01:00
in
Format.fprintf fmt
{|
2022-02-02 11:58:18 +01:00
<div class="thread">
2022-02-18 20:17:24 +01:00
<div class="thread-subject">
2022-02-02 11:58:18 +01:00
%s
</div>
2022-02-18 20:17:24 +01:00
<div class="thread-posts">
2022-02-22 00:29:31 +01:00
%a
2022-02-02 11:58:18 +01:00
</div>
</div>
|}
2022-02-22 00:29:31 +01:00
thread_data.subject posts_view ()
2022-02-21 02:24:17 +01:00
let view_thread thread_id =
let* op = get_op thread_id in
let^ ids = Db.collect_list Q.get_thread_posts thread_id in
let* posts = get_posts ids in
let s =
(Format.asprintf "%a" (fun fmt (op, posts) -> pp_thread fmt op posts))
(op, posts)
in
Ok s
2022-02-21 02:24:17 +01:00
let pp_marker fmt op =
let thread_data, post = op in
let content = Format.asprintf "%a" pp_thread_preview op in
(* geojson use lng lat, and not lat lng*)
let json =
`Assoc
[ ("type", `String "Feature")
; ( "geometry"
, `Assoc
[ ("type", `String "Point")
; ( "coordinates"
, `List [ `Float thread_data.lng; `Float thread_data.lat ] )
] )
; ( "properties"
, `Assoc
[ ("content", `String content); ("thread_id", `String post.id) ] )
]
in
Yojson.pretty_print fmt json
2022-02-21 02:24:17 +01:00
let get_markers () =
let^ ids = Db.collect_list Q.get_threads () in
let* ops = get_ops ids in
let markers =
Format.asprintf "[%a]"
(Format.pp_print_list
~pp_sep:(fun fmt () -> Format.fprintf fmt ",")
2022-02-22 00:01:35 +01:00
pp_marker )
2022-02-21 02:24:17 +01:00
ops
in
Ok markers