meowbb/tui.rkt

57 lines
1.6 KiB
Racket

#lang racket/base
(require racket/class racket/date racket/list racket/match
"fs.rkt"
"framework.rkt")
(define meowbb%
(class activity%
(init-field entries)
(super-new [fps 0.0])
(define root
(new header/footer%
[header (new label% [label-text "this is the header"])]
[body (new scroll-pane%
[body (new table%
[flex-col 1]
[headers '("tag" "title" "author" "updated")]
[cells entries])])]
[footer (new label% [label-text "this is the footer"])]))
(define/override (draw size)
(send root draw size))
(define/override (on-event e)
(match e
["q" 'quit]
[_ (send root on-event e)
'continue]))
(define/override (on-deactivated)
(format "bye, meow"))))
(module+ main
(require ansi)
;; gang
(date-display-format 'iso-8601)
(define users (list-users))
(define posts (get-posts users))
(define modtimes (make-hash))
(void (dfs-modtime posts '() modtimes))
(define raw-entries
(for*/list ([(tag forum) (in-hash posts)] [(k v) (in-hash forum)])
(define post (first (hash-ref v "/index")))
(define modtime (hash-ref modtimes (list tag k)))
(list modtime tag (last (post-path post)) (post-author post)
(date->string (seconds->date modtime #t) #t))))
(define sorted-entries
(sort raw-entries > #:key first))
(define entries (map rest sorted-entries))
(run-application "MeowBB" (new meowbb% [entries entries])))