forked from cadence/breezewiki
		
	Compare commits
	
		
			1 commit
		
	
	
		
			main
			...
			disable-re
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9611b8c164 | 
					 3 changed files with 156 additions and 138 deletions
				
			
		|  | @ -65,64 +65,70 @@ | ||||||
| 
 | 
 | ||||||
| (define (page-category req) | (define (page-category req) | ||||||
|   (response-handler |   (response-handler | ||||||
|    (define wikiname (path/param-path (first (url-path (request-uri req))))) |    (cond | ||||||
|    (define prefixed-category (string-join (map path/param-path (cddr (url-path (request-uri req)))) "/")) |      [(config-true? 'feature_offline::only) | ||||||
|    (define origin (format "https://~a.fandom.com" wikiname)) |       (response/output #:code 503 | ||||||
|    (define source-url (format "~a/wiki/~a" origin prefixed-category)) |                        #:headers (build-headers always-headers) | ||||||
|  |                        (λ (out) (write-html '(p "Sorry, category pages are temporarily disabled. I hope to have them back soon.") out)))] | ||||||
|  |      [else | ||||||
|  |       (define wikiname (path/param-path (first (url-path (request-uri req))))) | ||||||
|  |       (define prefixed-category (string-join (map path/param-path (cddr (url-path (request-uri req)))) "/")) | ||||||
|  |       (define origin (format "https://~a.fandom.com" wikiname)) | ||||||
|  |       (define source-url (format "~a/wiki/~a" origin prefixed-category)) | ||||||
| 
 | 
 | ||||||
|    (define-values (members-data page-data siteinfo) |       (define-values (members-data page-data siteinfo) | ||||||
|      (thread-values |         (thread-values | ||||||
|       (λ () |          (λ () | ||||||
|         (define dest-url |            (define dest-url | ||||||
|           (format "~a/api.php?~a" |              (format "~a/api.php?~a" | ||||||
|                   origin |                      origin | ||||||
|                   (params->query `(("action" . "query") |                      (params->query `(("action" . "query") | ||||||
|                                    ("list" . "categorymembers") |                                       ("list" . "categorymembers") | ||||||
|                                    ("cmtitle" . ,prefixed-category) |                                       ("cmtitle" . ,prefixed-category) | ||||||
|                                    ("cmlimit" . "max") |                                       ("cmlimit" . "max") | ||||||
|                                    ("formatversion" . "2") |                                       ("formatversion" . "2") | ||||||
|                                    ("format" . "json"))))) |                                       ("format" . "json"))))) | ||||||
|         (log-outgoing dest-url) |            (log-outgoing dest-url) | ||||||
|         (define dest-res (easy:get dest-url #:timeouts timeouts)) |            (define dest-res (easy:get dest-url #:timeouts timeouts)) | ||||||
|         (easy:response-json dest-res)) |            (easy:response-json dest-res)) | ||||||
|       (λ () |          (λ () | ||||||
|         (define dest-url |            (define dest-url | ||||||
|           (format "~a/api.php?~a" |              (format "~a/api.php?~a" | ||||||
|                   origin |                      origin | ||||||
|                   (params->query `(("action" . "parse") |                      (params->query `(("action" . "parse") | ||||||
|                                    ("page" . ,prefixed-category) |                                       ("page" . ,prefixed-category) | ||||||
|                                    ("prop" . "text|headhtml|langlinks") |                                       ("prop" . "text|headhtml|langlinks") | ||||||
|                                    ("formatversion" . "2") |                                       ("formatversion" . "2") | ||||||
|                                    ("format" . "json"))))) |                                       ("format" . "json"))))) | ||||||
|         (log-outgoing dest-url) |            (log-outgoing dest-url) | ||||||
|         (define dest-res (easy:get dest-url #:timeouts timeouts)) |            (define dest-res (easy:get dest-url #:timeouts timeouts)) | ||||||
|         (easy:response-json dest-res)) |            (easy:response-json dest-res)) | ||||||
|       (λ () |          (λ () | ||||||
|         (siteinfo-fetch wikiname)))) |            (siteinfo-fetch wikiname)))) | ||||||
| 
 | 
 | ||||||
|    (define title (preprocess-html-wiki (jp "/parse/title" page-data prefixed-category))) |       (define title (preprocess-html-wiki (jp "/parse/title" page-data prefixed-category))) | ||||||
|    (define page-html (preprocess-html-wiki (jp "/parse/text" page-data ""))) |       (define page-html (preprocess-html-wiki (jp "/parse/text" page-data ""))) | ||||||
|    (define page (html->xexp page-html)) |       (define page (html->xexp page-html)) | ||||||
|    (define head-data ((head-data-getter wikiname) page-data)) |       (define head-data ((head-data-getter wikiname) page-data)) | ||||||
|    (define body (generate-results-page |       (define body (generate-results-page | ||||||
|                  #:req req |                     #:req req | ||||||
|                  #:source-url source-url |                     #:source-url source-url | ||||||
|                  #:wikiname wikiname |                     #:wikiname wikiname | ||||||
|                  #:title title |                     #:title title | ||||||
|                  #:members-data members-data |                     #:members-data members-data | ||||||
|                  #:page page |                     #:page page | ||||||
|                  #:head-data head-data |                     #:head-data head-data | ||||||
|                  #:siteinfo siteinfo)) |                     #:siteinfo siteinfo)) | ||||||
| 
 | 
 | ||||||
|    (when (config-true? 'debug) |       (when (config-true? 'debug) | ||||||
|      ; used for its side effects |         ; used for its side effects | ||||||
|      ; convert to string with error checking, error will be raised if xexp is invalid |         ; convert to string with error checking, error will be raised if xexp is invalid | ||||||
|      (xexp->html body)) |         (xexp->html body)) | ||||||
|    (response/output |       (response/output | ||||||
|     #:code 200 |        #:code 200 | ||||||
|     #:headers (build-headers always-headers) |        #:headers (build-headers always-headers) | ||||||
|     (λ (out) |        (λ (out) | ||||||
|       (write-html body out))))) |          (write-html body out)))]))) | ||||||
| (module+ test | (module+ test | ||||||
|   (check-not-false ((query-selector (attribute-selector 'href "/test/wiki/Ankle_Monitor") |   (check-not-false ((query-selector (attribute-selector 'href "/test/wiki/Ankle_Monitor") | ||||||
|                                     (generate-results-page |                                     (generate-results-page | ||||||
|  |  | ||||||
|  | @ -104,50 +104,56 @@ | ||||||
| 
 | 
 | ||||||
| (define (page-file req) | (define (page-file req) | ||||||
|   (response-handler |   (response-handler | ||||||
|    (define wikiname (path/param-path (first (url-path (request-uri req))))) |    (cond | ||||||
|    (define prefixed-title (path/param-path (caddr (url-path (request-uri req))))) |      [(config-true? 'feature_offline::only) | ||||||
|    (define origin (format "https://~a.fandom.com" wikiname)) |       (response/output #:code 503 | ||||||
|    (define source-url (format "~a/wiki/~a" origin prefixed-title)) |                        #:headers (build-headers always-headers) | ||||||
|  |                        (λ (out) (write-html '(p "Sorry, file pages are temporarily disabled. I hope to have them back soon.") out)))] | ||||||
|  |      [else | ||||||
|  |       (define wikiname (path/param-path (first (url-path (request-uri req))))) | ||||||
|  |       (define prefixed-title (path/param-path (caddr (url-path (request-uri req))))) | ||||||
|  |       (define origin (format "https://~a.fandom.com" wikiname)) | ||||||
|  |       (define source-url (format "~a/wiki/~a" origin prefixed-title)) | ||||||
| 
 | 
 | ||||||
|    (define-values (media-detail siteinfo) |       (define-values (media-detail siteinfo) | ||||||
|      (thread-values |         (thread-values | ||||||
|       (λ () |          (λ () | ||||||
|         (define dest-url |            (define dest-url | ||||||
|           (format "~a/wikia.php?~a" |              (format "~a/wikia.php?~a" | ||||||
|                   origin |                      origin | ||||||
|                   (params->query `(("format" . "json") ("controller" . "Lightbox") |                      (params->query `(("format" . "json") ("controller" . "Lightbox") | ||||||
|                                                        ("method" . "getMediaDetail") |                                                           ("method" . "getMediaDetail") | ||||||
|                                                        ("fileTitle" . ,prefixed-title))))) |                                                           ("fileTitle" . ,prefixed-title))))) | ||||||
|         (log-outgoing dest-url) |            (log-outgoing dest-url) | ||||||
|         (define dest-res (easy:get dest-url #:timeouts timeouts)) |            (define dest-res (easy:get dest-url #:timeouts timeouts)) | ||||||
|         (easy:response-json dest-res)) |            (easy:response-json dest-res)) | ||||||
|       (λ () |          (λ () | ||||||
|         (siteinfo-fetch wikiname)))) |            (siteinfo-fetch wikiname)))) | ||||||
|    (if (not (jp "/exists" media-detail #f)) |       (if (not (jp "/exists" media-detail #f)) | ||||||
|        (next-dispatcher) |           (next-dispatcher) | ||||||
|        (response-handler |           (response-handler | ||||||
|         (define file-title (jp "/fileTitle" media-detail "")) |            (define file-title (jp "/fileTitle" media-detail "")) | ||||||
|         (define title |            (define title | ||||||
|           (if (non-empty-string? file-title) (format "File:~a" file-title) prefixed-title)) |              (if (non-empty-string? file-title) (format "File:~a" file-title) prefixed-title)) | ||||||
|         (define image-content-type |            (define image-content-type | ||||||
|           (if (non-empty-string? (jp "/videoEmbedCode" media-detail "")) |              (if (non-empty-string? (jp "/videoEmbedCode" media-detail "")) | ||||||
|               #f |                  #f | ||||||
|               (url-content-type (jp "/imageUrl" media-detail)))) |                  (url-content-type (jp "/imageUrl" media-detail)))) | ||||||
|         (define body |            (define body | ||||||
|           (generate-results-page #:req req |              (generate-results-page #:req req | ||||||
|                                  #:source-url source-url |                                     #:source-url source-url | ||||||
|                                  #:wikiname wikiname |                                     #:wikiname wikiname | ||||||
|                                  #:title title |                                     #:title title | ||||||
|                                  #:media-detail media-detail |                                     #:media-detail media-detail | ||||||
|                                  #:image-content-type image-content-type |                                     #:image-content-type image-content-type | ||||||
|                                  #:siteinfo siteinfo)) |                                     #:siteinfo siteinfo)) | ||||||
|         (when (config-true? 'debug) |            (when (config-true? 'debug) | ||||||
|           ; used for its side effects |              ; used for its side effects | ||||||
|           ; convert to string with error checking, error will be raised if xexp is invalid |              ; convert to string with error checking, error will be raised if xexp is invalid | ||||||
|           (xexp->html body)) |              (xexp->html body)) | ||||||
|         (response/output #:code 200 |            (response/output #:code 200 | ||||||
|                          #:headers (build-headers always-headers) |                             #:headers (build-headers always-headers) | ||||||
|                          (λ (out) (write-html body out))))))) |                             (λ (out) (write-html body out)))))]))) | ||||||
| (module+ test | (module+ test | ||||||
|   (parameterize ([(config-parameter 'strict_proxy) "true"]) |   (parameterize ([(config-parameter 'strict_proxy) "true"]) | ||||||
|     (check-equal? (get-media-html "https://static.wikia.nocookie.net/a" "image/jpeg") |     (check-equal? (get-media-html "https://static.wikia.nocookie.net/a" "image/jpeg") | ||||||
|  |  | ||||||
|  | @ -68,48 +68,54 @@ | ||||||
| (define (page-search req) | (define (page-search req) | ||||||
|   ;; this just means, catch any errors and display them in the browser. it's a function somewhere else |   ;; this just means, catch any errors and display them in the browser. it's a function somewhere else | ||||||
|   (response-handler |   (response-handler | ||||||
|    ;; the URL will look like "/minecraft/wiki/Special:Search?q=Spawner" |    (cond | ||||||
|    ;; grab the first part to use as the wikiname, in this case, "minecraft" |      [(config-true? 'feature_offline::only) | ||||||
|    (define wikiname (path/param-path (first (url-path (request-uri req))))) |       (response/output #:code 503 | ||||||
|    ;; grab the part after ?q= which is the search terms |                        #:headers (build-headers always-headers) | ||||||
|    (define query (dict-ref (url-query (request-uri req)) 'q #f)) |                        (λ (out) (write-html '(body (p "Sorry, full search is temporarily broken, but I have a plan to fix it.") (p "In the meantime, please use the popup search suggestions below the search box.")) out)))] | ||||||
|    ;; constructing the URL where I want to get fandom data from... |      [else | ||||||
|    (define origin (format "https://~a.fandom.com" wikiname)) |       ;; the URL will look like "/minecraft/wiki/Special:Search?q=Spawner" | ||||||
|    ;; the dest-URL will look something like https://minecraft.fandom.com/api.php?action=query&list=search&srsearch=Spawner&formatversion=2&format=json |       ;; grab the first part to use as the wikiname, in this case, "minecraft" | ||||||
|    (define dest-url |       (define wikiname (path/param-path (first (url-path (request-uri req))))) | ||||||
|      (format "~a/api.php?~a" |       ;; grab the part after ?q= which is the search terms | ||||||
|              origin |       (define query (dict-ref (url-query (request-uri req)) 'q #f)) | ||||||
|              (params->query `(("action" . "query") |       ;; constructing the URL where I want to get fandom data from... | ||||||
|                               ("list" . "search") |       (define origin (format "https://~a.fandom.com" wikiname)) | ||||||
|                               ("srsearch" . ,query) |       ;; the dest-URL will look something like https://minecraft.fandom.com/api.php?action=query&list=search&srsearch=Spawner&formatversion=2&format=json | ||||||
|                               ("formatversion" . "2") |       (define dest-url | ||||||
|                               ("format" . "json"))))) |         (format "~a/api.php?~a" | ||||||
|  |                 origin | ||||||
|  |                 (params->query `(("action" . "query") | ||||||
|  |                                  ("list" . "search") | ||||||
|  |                                  ("srsearch" . ,query) | ||||||
|  |                                  ("formatversion" . "2") | ||||||
|  |                                  ("format" . "json"))))) | ||||||
| 
 | 
 | ||||||
|    ;; simultaneously get the search results from the fandom API, as well as information about the wiki as a whole (its license, icon, name) |       ;; simultaneously get the search results from the fandom API, as well as information about the wiki as a whole (its license, icon, name) | ||||||
|    (define-values (dest-res siteinfo) |       (define-values (dest-res siteinfo) | ||||||
|      (thread-values |         (thread-values | ||||||
|       (λ () |          (λ () | ||||||
|         (log-outgoing dest-url) |            (log-outgoing dest-url) | ||||||
|         (easy:get dest-url #:timeouts timeouts)) ;; HTTP request to dest-url for search results |            (easy:get dest-url #:timeouts timeouts)) ;; HTTP request to dest-url for search results | ||||||
|       (λ () |          (λ () | ||||||
|         (siteinfo-fetch wikiname)))) ;; helper function in another file to get information about the wiki |            (siteinfo-fetch wikiname)))) ;; helper function in another file to get information about the wiki | ||||||
| 
 | 
 | ||||||
|    ;; search results are a JSON string. parse JSON into racket data structures |       ;; search results are a JSON string. parse JSON into racket data structures | ||||||
|    (define data (easy:response-json dest-res)) |       (define data (easy:response-json dest-res)) | ||||||
|    ;; calling my generate-results-page function with the information so far in order to get a big fat x-expression |       ;; calling my generate-results-page function with the information so far in order to get a big fat x-expression | ||||||
|    ;; big fat x-expression goes into the body variable |       ;; big fat x-expression goes into the body variable | ||||||
|    (define body (generate-results-page req dest-url wikiname query data #:siteinfo siteinfo)) |       (define body (generate-results-page req dest-url wikiname query data #:siteinfo siteinfo)) | ||||||
|    ;; error checking |       ;; error checking | ||||||
|    (when (config-true? 'debug) |       (when (config-true? 'debug) | ||||||
|      ; used for its side effects |         ; used for its side effects | ||||||
|      ; convert to string with error checking, error will be raised if xexp is invalid |         ; convert to string with error checking, error will be raised if xexp is invalid | ||||||
|      (xexp->html body)) |         (xexp->html body)) | ||||||
|    ;; convert body to HTML and send to browser |       ;; convert body to HTML and send to browser | ||||||
|    (response/output |       (response/output | ||||||
|     #:code 200 |        #:code 200 | ||||||
|     #:headers (build-headers always-headers) |        #:headers (build-headers always-headers) | ||||||
|     (λ (out) |        (λ (out) | ||||||
|       (write-html body out))))) |          (write-html body out)))]))) | ||||||
| (module+ test | (module+ test | ||||||
|   (parameterize ([(config-parameter 'feature_offline::only) "false"]) |   (parameterize ([(config-parameter 'feature_offline::only) "false"]) | ||||||
|     (check-not-false ((query-selector (attribute-selector 'href "/test/wiki/Gacha_Capsule") |     (check-not-false ((query-selector (attribute-selector 'href "/test/wiki/Gacha_Capsule") | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue