72 lines
2.5 KiB
Racket
72 lines
2.5 KiB
Racket
|
#lang cli
|
||
|
(require charterm
|
||
|
"archiver.rkt")
|
||
|
|
||
|
(help (usage "Downloads a single Fandom wiki in BreezeWiki offline format."
|
||
|
""
|
||
|
"Downloaded pages go into `archive/` next to the executable."
|
||
|
"Database goes into `archiver.db*` next to the executable."
|
||
|
"The database is necessary to store your download progress and resume where you left off if the process is interrupted.")
|
||
|
(ps ""
|
||
|
"Default output style is `progress` in a tty and `lines` otherwise."))
|
||
|
|
||
|
(flag (output-quiet?)
|
||
|
("-q" "--output-quiet" "disable progress output")
|
||
|
(output-quiet? #t))
|
||
|
|
||
|
(flag (output-lines?)
|
||
|
("-l" "--output-lines" "output the name of each file downloaded")
|
||
|
(output-lines? #t))
|
||
|
|
||
|
(flag (output-progress?)
|
||
|
("-p" "--output-progress" "progress output for terminals")
|
||
|
(output-progress? #t))
|
||
|
|
||
|
(constraint (one-of output-quiet? output-lines? output-progress?))
|
||
|
|
||
|
(program
|
||
|
(start [wikiname "wikiname to download"])
|
||
|
;; set up arguments
|
||
|
(define width 80)
|
||
|
(when (not (or (output-quiet?) (output-lines?) (output-progress?)))
|
||
|
(cond [(terminal-port? current-input-port)
|
||
|
(output-progress? #t)]
|
||
|
[else
|
||
|
(output-lines? #t)]))
|
||
|
(define (update-width)
|
||
|
(when (output-progress?)
|
||
|
(with-charterm
|
||
|
(call-with-values (λ () (charterm-screen-size))
|
||
|
(λ (cols rows) (set! width cols))))))
|
||
|
(update-width)
|
||
|
;; check
|
||
|
(when (or (not wikiname) (equal? wikiname ""))
|
||
|
(raise-user-error "Please specify the wikiname to download on the command line."))
|
||
|
;; stage 1
|
||
|
(cond [(output-lines?) (displayln "Downloading list of pages...")]
|
||
|
[(output-progress?) (printf "Downloading list of pages... \r")])
|
||
|
(if-necessary-download-list-of-pages
|
||
|
wikiname
|
||
|
(λ (a b c)
|
||
|
(cond [(output-progress?) (printf "Downloading list of pages... [~a/~b]\r" a b)])))
|
||
|
;; stage 2
|
||
|
(save-each-page
|
||
|
wikiname
|
||
|
(λ (a b c)
|
||
|
(define basename (basename->name-for-query c))
|
||
|
(cond
|
||
|
[(output-lines?)
|
||
|
(displayln basename)]
|
||
|
[(output-progress?)
|
||
|
(when (eq? (modulo a 20) 0)
|
||
|
(thread (λ () (update-width))))
|
||
|
(define prefix (format "[~a/~a] " a b))
|
||
|
(define rest (- width (string-length prefix)))
|
||
|
(define real-width (min (string-length basename) rest))
|
||
|
(define spare-width (- rest real-width))
|
||
|
(define name-display (substring basename 0 real-width))
|
||
|
(define whitespace (make-string spare-width #\ ))
|
||
|
(printf "~a~a~a\r" prefix name-display whitespace)]))))
|
||
|
|
||
|
(run start)
|