2022-09-16 13:56:03 +00:00
|
|
|
#lang racket/base
|
2022-10-09 07:53:09 +00:00
|
|
|
(require racket/list
|
2022-10-31 06:39:19 +00:00
|
|
|
racket/match
|
2022-10-09 07:53:09 +00:00
|
|
|
(prefix-in easy: net/http-easy)
|
|
|
|
memo
|
2022-10-31 06:39:19 +00:00
|
|
|
"static-data.rkt"
|
2022-09-16 13:56:03 +00:00
|
|
|
"url-utils.rkt"
|
|
|
|
"xexpr-utils.rkt")
|
|
|
|
|
|
|
|
(provide
|
2022-10-09 09:50:50 +00:00
|
|
|
(struct-out siteinfo^)
|
|
|
|
(struct-out license^)
|
2022-10-31 06:39:19 +00:00
|
|
|
(struct-out head-data^)
|
2022-10-09 07:53:09 +00:00
|
|
|
siteinfo-fetch
|
2022-10-09 09:50:50 +00:00
|
|
|
siteinfo-default
|
2022-10-31 06:39:19 +00:00
|
|
|
license-default
|
|
|
|
head-data-getter
|
|
|
|
head-data-default)
|
2022-09-16 13:56:03 +00:00
|
|
|
|
2022-10-09 09:50:50 +00:00
|
|
|
(struct siteinfo^ (sitename basepage license) #:transparent)
|
|
|
|
(struct license^ (text url) #:transparent)
|
2022-10-31 06:39:19 +00:00
|
|
|
(struct head-data^ (body-class icon-url) #:transparent)
|
2022-10-09 07:53:09 +00:00
|
|
|
|
2022-10-09 09:50:50 +00:00
|
|
|
(define license-default (license^ "CC-BY-SA" "https://www.fandom.com/licensing"))
|
|
|
|
(define siteinfo-default (siteinfo^ "Test Wiki" "Main_Page" license-default))
|
2022-10-31 07:03:50 +00:00
|
|
|
(define head-data-default (head-data^ "skin-fandomdesktop" (get-static-url "breezewiki-favicon.svg")))
|
2022-10-09 07:53:09 +00:00
|
|
|
|
|
|
|
(define/memoize (siteinfo-fetch wikiname) #:hash hash
|
2022-09-16 13:56:03 +00:00
|
|
|
(define dest-url
|
|
|
|
(format "https://~a.fandom.com/api.php?~a"
|
|
|
|
wikiname
|
|
|
|
(params->query '(("action" . "query")
|
|
|
|
("meta" . "siteinfo")
|
2022-10-09 07:53:09 +00:00
|
|
|
("siprop" . "general|rightsinfo")
|
2022-09-16 13:56:03 +00:00
|
|
|
("format" . "json")
|
|
|
|
("formatversion" . "2")))))
|
2022-10-04 08:13:07 +00:00
|
|
|
(log-outgoing dest-url)
|
2022-09-16 13:56:03 +00:00
|
|
|
(define res (easy:get dest-url))
|
|
|
|
(define data (easy:response-json res))
|
2022-10-09 09:50:50 +00:00
|
|
|
(siteinfo^ (jp "/query/general/sitename" data)
|
|
|
|
(second (regexp-match #rx"/wiki/(.*)" (jp "/query/general/base" data)))
|
|
|
|
(license^ (jp "/query/rightsinfo/text" data)
|
|
|
|
(jp "/query/rightsinfo/url" data))))
|
2022-10-31 06:39:19 +00:00
|
|
|
|
|
|
|
(define/memoize (head-data-getter wikiname) #:hash hash
|
|
|
|
;; data will be stored here, can be referenced by the memoized closure
|
|
|
|
(define this-data head-data-default)
|
|
|
|
;; returns the getter
|
|
|
|
(λ ([res-in #f])
|
|
|
|
(when res-in
|
|
|
|
;; when actual information is provided, parse it into the struct and store it for the future
|
|
|
|
(define head-html (jp "/parse/headhtml" res-in ""))
|
|
|
|
(define data
|
|
|
|
(head-data^
|
|
|
|
(match (regexp-match #rx"<body [^>]*class=\"([^\"]*)" head-html)
|
|
|
|
[(list _ classes) classes]
|
|
|
|
[_ (head-data^-body-class head-data-default)])
|
|
|
|
(match (regexp-match #rx"<link rel=\"(?:shortcut )?icon\" href=\"([^\"]*)" head-html)
|
|
|
|
[(list _ icon-url) icon-url]
|
|
|
|
[_ (head-data^-icon-url head-data-default)])))
|
|
|
|
(set! this-data data))
|
|
|
|
;; then no matter what, return the best information we have so far
|
|
|
|
this-data))
|