forked from cadence/breezewiki
		
	Display correct license information
This commit is contained in:
		
							parent
							
								
									37318b8c50
								
							
						
					
					
						commit
						a9acfc34a2
					
				
					 6 changed files with 134 additions and 81 deletions
				
			
		|  | @ -4,6 +4,7 @@ | ||||||
|          html-writing |          html-writing | ||||||
|          web-server/http |          web-server/http | ||||||
|          "config.rkt" |          "config.rkt" | ||||||
|  |          "data.rkt" | ||||||
|          "xexpr-utils.rkt" |          "xexpr-utils.rkt" | ||||||
|          "url-utils.rkt") |          "url-utils.rkt") | ||||||
| 
 | 
 | ||||||
|  | @ -23,7 +24,8 @@ | ||||||
| 
 | 
 | ||||||
| (define timeouts (easy:make-timeout-config #:lease 5 #:connect 5)) | (define timeouts (easy:make-timeout-config #:lease 5 #:connect 5)) | ||||||
| 
 | 
 | ||||||
| (define (application-footer source-url) | (define (application-footer source-url #:license [license-in #f]) | ||||||
|  |   (define license (or license-in license-default)) | ||||||
|   `(footer (@ (class "custom-footer")) |   `(footer (@ (class "custom-footer")) | ||||||
|            (div (@ (class ,(if source-url "custom-footer__cols" "internal-footer"))) |            (div (@ (class ,(if source-url "custom-footer__cols" "internal-footer"))) | ||||||
|                 (div (p |                 (div (p | ||||||
|  | @ -46,8 +48,8 @@ | ||||||
|                 ,(if source-url |                 ,(if source-url | ||||||
|                      `(div (p "This page displays proxied content from " |                      `(div (p "This page displays proxied content from " | ||||||
|                               (a (@ (href ,source-url) (rel "noreferrer")) ,source-url) |                               (a (@ (href ,source-url) (rel "noreferrer")) ,source-url) | ||||||
|                               ". Text content is available under the Creative Commons Attribution-Share Alike License 3.0 (Unported), " |                               ,(format ". Text content is available under the ~a license, " (license-text license)) | ||||||
|                               (a (@ (href "https://www.fandom.com/licensing")) "see license info.") |                               (a (@ (href ,(license-url license))) "see license info.") | ||||||
|                               " Media files may have different copying restrictions.") |                               " Media files may have different copying restrictions.") | ||||||
|                            (p ,(format "Fandom is a trademark of Fandom, Inc. ~a is not affiliated with Fandom." (config-get 'application_name)))) |                            (p ,(format "Fandom is a trademark of Fandom, Inc. ~a is not affiliated with Fandom." (config-get 'application_name)))) | ||||||
|                      `(div (p "Text content on wikis run by Fandom is available under the Creative Commons Attribution-Share Alike License 3.0 (Unported), " |                      `(div (p "Text content on wikis run by Fandom is available under the Creative Commons Attribution-Share Alike License 3.0 (Unported), " | ||||||
|  | @ -60,8 +62,9 @@ | ||||||
|          #:source-url source-url |          #:source-url source-url | ||||||
|          #:wikiname wikiname |          #:wikiname wikiname | ||||||
|          #:title title |          #:title title | ||||||
|          #:body-class [body-class-in ""]) |          #:body-class [body-class-in #f] | ||||||
|   (define body-class (if (equal? "" body-class-in) |          #:license [license #f]) | ||||||
|  |   (define body-class (if (not body-class-in) | ||||||
|                          "skin-fandomdesktop" |                          "skin-fandomdesktop" | ||||||
|                          body-class-in)) |                          body-class-in)) | ||||||
|   (define (required-styles origin) |   (define (required-styles origin) | ||||||
|  | @ -98,7 +101,7 @@ | ||||||
|                           (div (@ (id "content") #;(class "page-content")) |                           (div (@ (id "content") #;(class "page-content")) | ||||||
|                                (div (@ (id "mw-content-text")) |                                (div (@ (id "mw-content-text")) | ||||||
|                                     ,content)) |                                     ,content)) | ||||||
|                           ,(application-footer source-url))))))) |                           ,(application-footer source-url #:license license))))))) | ||||||
| (module+ test | (module+ test | ||||||
|   (define page |   (define page | ||||||
|     (parameterize ([(config-parameter 'strict_proxy) "true"]) |     (parameterize ([(config-parameter 'strict_proxy) "true"]) | ||||||
|  |  | ||||||
							
								
								
									
										33
									
								
								src/data.rkt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/data.rkt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,33 @@ | ||||||
|  | #lang racket/base | ||||||
|  | (require (prefix-in easy: net/http-easy) | ||||||
|  |          "url-utils.rkt" | ||||||
|  |          "xexpr-utils.rkt") | ||||||
|  | 
 | ||||||
|  | (provide | ||||||
|  |  (struct-out license) | ||||||
|  |  license-default | ||||||
|  |  license-auto) | ||||||
|  | 
 | ||||||
|  | (struct license (text url) #:transparent) | ||||||
|  | (define license-default (license "CC-BY-SA" "https://www.fandom.com/licensing")) | ||||||
|  | (define license-hash (make-hash)) | ||||||
|  | (define (license-fetch wikiname) | ||||||
|  |   (define dest-url | ||||||
|  |     (format "https://~a.fandom.com/api.php?~a" | ||||||
|  |             wikiname | ||||||
|  |             (params->query '(("action" . "query") | ||||||
|  |                              ("meta" . "siteinfo") | ||||||
|  |                              ("siprop" . "rightsinfo") | ||||||
|  |                              ("format" . "json") | ||||||
|  |                              ("formatversion" . "2"))))) | ||||||
|  |   (printf "out: ~a~n" dest-url) | ||||||
|  |   (define res (easy:get dest-url)) | ||||||
|  |   (define data (easy:response-json res)) | ||||||
|  |   (license (jp "/query/rightsinfo/text" data) | ||||||
|  |            (jp "/query/rightsinfo/url" data))) | ||||||
|  | (define (license-auto wikiname) | ||||||
|  |   (if (hash-has-key? license-hash wikiname) | ||||||
|  |       (hash-ref license-hash wikiname) | ||||||
|  |       (let ([result (license-fetch wikiname)]) | ||||||
|  |         (hash-set! license-hash wikiname result) | ||||||
|  |         result))) | ||||||
|  | @ -12,7 +12,9 @@ | ||||||
| 
 | 
 | ||||||
| (provide | (provide | ||||||
|  ; syntax to make the hashmap from names |  ; syntax to make the hashmap from names | ||||||
|  dispatcher-tree) |  dispatcher-tree | ||||||
|  |  ; procedure to make the tree from the hashmap | ||||||
|  |  make-dispatcher-tree) | ||||||
| 
 | 
 | ||||||
| ; make a hashmap out of the provided names and call make-dispatcher-tree with it | ; make a hashmap out of the provided names and call make-dispatcher-tree with it | ||||||
| (define-syntax (dispatcher-tree stx) | (define-syntax (dispatcher-tree stx) | ||||||
|  |  | ||||||
|  | @ -14,6 +14,7 @@ | ||||||
|          #;(only-in web-server/http/redirect redirect-to) |          #;(only-in web-server/http/redirect redirect-to) | ||||||
|          "application-globals.rkt" |          "application-globals.rkt" | ||||||
|          "config.rkt" |          "config.rkt" | ||||||
|  |          "data.rkt" | ||||||
|          "page-wiki.rkt" |          "page-wiki.rkt" | ||||||
|          "syntax.rkt" |          "syntax.rkt" | ||||||
|          "url-utils.rkt" |          "url-utils.rkt" | ||||||
|  | @ -33,13 +34,15 @@ | ||||||
|          #:prefixed-category prefixed-category |          #:prefixed-category prefixed-category | ||||||
|          #:members-data members-data |          #:members-data members-data | ||||||
|          #:page page |          #:page page | ||||||
|          #:body-class body-class) |          #:body-class [body-class #f] | ||||||
|  |          #:license [license #f]) | ||||||
|   (define members (jp "/query/categorymembers" members-data)) |   (define members (jp "/query/categorymembers" members-data)) | ||||||
|   (generate-wiki-page |   (generate-wiki-page | ||||||
|    #:source-url source-url |    #:source-url source-url | ||||||
|    #:wikiname wikiname |    #:wikiname wikiname | ||||||
|    #:title prefixed-category |    #:title prefixed-category | ||||||
|    #:body-class body-class |    #:body-class body-class | ||||||
|  |    #:license license | ||||||
|    `(div |    `(div | ||||||
|      ,(update-tree-wiki page wikiname) |      ,(update-tree-wiki page wikiname) | ||||||
|      (hr) |      (hr) | ||||||
|  | @ -85,7 +88,8 @@ | ||||||
|                                            ("format" . "json"))))) |                                            ("format" . "json"))))) | ||||||
|                 (printf "out: ~a~n" dest-url) |                 (printf "out: ~a~n" 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)] | ||||||
|  |      [license (license-auto wikiname)]) | ||||||
| 
 | 
 | ||||||
|     (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)) | ||||||
|  | @ -93,15 +97,14 @@ | ||||||
|     (define body-class (match (regexp-match #rx"<body [^>]*class=\"([^\"]*)" head-html) |     (define body-class (match (regexp-match #rx"<body [^>]*class=\"([^\"]*)" head-html) | ||||||
|                          [(list _ classes) classes] |                          [(list _ classes) classes] | ||||||
|                          [_ ""])) |                          [_ ""])) | ||||||
|     (println head-html) |  | ||||||
|     (println body-class) |  | ||||||
|     (define body (generate-results-page |     (define body (generate-results-page | ||||||
|                   #:source-url source-url |                   #:source-url source-url | ||||||
|                   #:wikiname wikiname |                   #:wikiname wikiname | ||||||
|                   #:prefixed-category prefixed-category |                   #:prefixed-category prefixed-category | ||||||
|                   #:members-data members-data |                   #:members-data members-data | ||||||
|                   #:page page |                   #:page page | ||||||
|                   #:body-class body-class)) |                   #:body-class body-class | ||||||
|  |                   #:license license)) | ||||||
| 
 | 
 | ||||||
|     (when (config-true? 'debug) |     (when (config-true? 'debug) | ||||||
|       ; used for its side effects |       ; used for its side effects | ||||||
|  | @ -117,5 +120,5 @@ | ||||||
|                                      #:source-url "" |                                      #:source-url "" | ||||||
|                                      #:wikiname "test" |                                      #:wikiname "test" | ||||||
|                                      #:prefixed-category "Category:Items" |                                      #:prefixed-category "Category:Items" | ||||||
|                                      #:category-data category-json-data |                                      #:members-data category-json-data | ||||||
|                                      #:page '(div "page text")))))) |                                      #:page '(div "page text")))))) | ||||||
|  |  | ||||||
|  | @ -10,8 +10,10 @@ | ||||||
|          web-server/http |          web-server/http | ||||||
|          (only-in web-server/dispatchers/dispatch next-dispatcher) |          (only-in web-server/dispatchers/dispatch next-dispatcher) | ||||||
|          #;(only-in web-server/http/redirect redirect-to) |          #;(only-in web-server/http/redirect redirect-to) | ||||||
|          "config.rkt" |  | ||||||
|          "application-globals.rkt" |          "application-globals.rkt" | ||||||
|  |          "config.rkt" | ||||||
|  |          "data.rkt" | ||||||
|  |          "syntax.rkt" | ||||||
|          "url-utils.rkt" |          "url-utils.rkt" | ||||||
|          "xexpr-utils.rkt") |          "xexpr-utils.rkt") | ||||||
| 
 | 
 | ||||||
|  | @ -23,12 +25,13 @@ | ||||||
|   (define search-json-data |   (define search-json-data | ||||||
|     '#hasheq((batchcomplete . #t) (query . #hasheq((search . (#hasheq((ns . 0) (pageid . 219) (size . 1482) (snippet . "") (timestamp . "2022-08-21T08:54:23Z") (title . "Gacha Capsule") (wordcount . 214)) #hasheq((ns . 0) (pageid . 201) (size . 1198) (snippet . "") (timestamp . "2022-07-11T17:52:47Z") (title . "Badges") (wordcount . 181))))))))) |     '#hasheq((batchcomplete . #t) (query . #hasheq((search . (#hasheq((ns . 0) (pageid . 219) (size . 1482) (snippet . "") (timestamp . "2022-08-21T08:54:23Z") (title . "Gacha Capsule") (wordcount . 214)) #hasheq((ns . 0) (pageid . 201) (size . 1198) (snippet . "") (timestamp . "2022-07-11T17:52:47Z") (title . "Badges") (wordcount . 181))))))))) | ||||||
| 
 | 
 | ||||||
| (define (generate-results-page dest-url wikiname query data) | (define (generate-results-page dest-url wikiname query data #:license [license #f]) | ||||||
|   (define search-results (jp "/query/search" data)) |   (define search-results (jp "/query/search" data)) | ||||||
|   (generate-wiki-page |   (generate-wiki-page | ||||||
|    #:source-url dest-url |    #:source-url dest-url | ||||||
|    #:wikiname wikiname |    #:wikiname wikiname | ||||||
|    #:title "Search Results" |    #:title "Search Results" | ||||||
|  |    #:license license | ||||||
|    `(div (@ (class "mw-parser-output")) |    `(div (@ (class "mw-parser-output")) | ||||||
|          (p ,(format "~a results found for " (length search-results)) |          (p ,(format "~a results found for " (length search-results)) | ||||||
|             (strong ,query)) |             (strong ,query)) | ||||||
|  | @ -54,21 +57,24 @@ | ||||||
|   (response-handler |   (response-handler | ||||||
|    (define wikiname (path/param-path (first (url-path (request-uri req))))) |    (define wikiname (path/param-path (first (url-path (request-uri req))))) | ||||||
|    (define query (dict-ref (url-query (request-uri req)) 'q #f)) |    (define query (dict-ref (url-query (request-uri req)) 'q #f)) | ||||||
| 
 |  | ||||||
|    (define origin (format "https://~a.fandom.com" wikiname)) |    (define origin (format "https://~a.fandom.com" wikiname)) | ||||||
|    (define dest-url (format "~a/api.php?~a" |    (define dest-url | ||||||
|  |      (format "~a/api.php?~a" | ||||||
|              origin |              origin | ||||||
|              (params->query `(("action" . "query") |              (params->query `(("action" . "query") | ||||||
|                               ("list" . "search") |                               ("list" . "search") | ||||||
|                               ("srsearch" . ,query) |                               ("srsearch" . ,query) | ||||||
|                               ("formatversion" . "2") |                               ("formatversion" . "2") | ||||||
|                               ("format" . "json"))))) |                               ("format" . "json"))))) | ||||||
|    (printf "out: ~a~n" dest-url) | 
 | ||||||
|    (define dest-res (easy:get dest-url #:timeouts timeouts)) |    (thread-let | ||||||
|  |     ([dest-res (printf "out: ~a~n" dest-url) | ||||||
|  |                (easy:get dest-url #:timeouts timeouts)] | ||||||
|  |      [license (license-auto wikiname)]) | ||||||
| 
 | 
 | ||||||
|     (define data (easy:response-json dest-res)) |     (define data (easy:response-json dest-res)) | ||||||
| 
 | 
 | ||||||
|    (define body (generate-results-page dest-url wikiname query data)) |     (define body (generate-results-page dest-url wikiname query data #:license license)) | ||||||
|     (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 | ||||||
|  | @ -76,7 +82,7 @@ | ||||||
|     (response/output |     (response/output | ||||||
|      #:code 200 |      #:code 200 | ||||||
|      (λ (out) |      (λ (out) | ||||||
|       (write-html body out))))) |        (write-html body out)))))) | ||||||
| (module+ test | (module+ test | ||||||
|   (check-not-false ((query-selector (attribute-selector 'href "/test/wiki/Gacha_Capsule") |   (check-not-false ((query-selector (attribute-selector 'href "/test/wiki/Gacha_Capsule") | ||||||
|                                     (generate-results-page "" "test" "Gacha" search-json-data))))) |                                     (generate-results-page "" "test" "Gacha" search-json-data))))) | ||||||
|  |  | ||||||
|  | @ -16,7 +16,9 @@ | ||||||
|          ; my libs |          ; my libs | ||||||
|          "application-globals.rkt" |          "application-globals.rkt" | ||||||
|          "config.rkt" |          "config.rkt" | ||||||
|  |          "data.rkt" | ||||||
|          "pure-utils.rkt" |          "pure-utils.rkt" | ||||||
|  |          "syntax.rkt" | ||||||
|          "xexpr-utils.rkt" |          "xexpr-utils.rkt" | ||||||
|          "url-utils.rkt") |          "url-utils.rkt") | ||||||
| 
 | 
 | ||||||
|  | @ -235,7 +237,9 @@ | ||||||
|   (define path (string-join (map path/param-path (cddr (url-path (request-uri req)))) "/")) |   (define path (string-join (map path/param-path (cddr (url-path (request-uri req)))) "/")) | ||||||
|   (define source-url (format "https://~a.fandom.com/wiki/~a" wikiname path)) |   (define source-url (format "https://~a.fandom.com/wiki/~a" wikiname path)) | ||||||
| 
 | 
 | ||||||
|   (define dest-url (format "~a/api.php?~a" |   (thread-let | ||||||
|  |    ([dest-res (define dest-url | ||||||
|  |                 (format "~a/api.php?~a" | ||||||
|                         origin |                         origin | ||||||
|                         (params->query `(("action" . "parse") |                         (params->query `(("action" . "parse") | ||||||
|                                          ("page" . ,path) |                                          ("page" . ,path) | ||||||
|  | @ -243,7 +247,8 @@ | ||||||
|                                          ("formatversion" . "2") |                                          ("formatversion" . "2") | ||||||
|                                          ("format" . "json"))))) |                                          ("format" . "json"))))) | ||||||
|               (printf "out: ~a~n" dest-url) |               (printf "out: ~a~n" dest-url) | ||||||
|   (define dest-res (easy:get dest-url #:timeouts timeouts)) |               (easy:get dest-url #:timeouts timeouts)] | ||||||
|  |     [license (license-auto wikiname)]) | ||||||
| 
 | 
 | ||||||
|    (cond |    (cond | ||||||
|      [(eq? 200 (easy:response-status-code dest-res)) |      [(eq? 200 (easy:response-status-code dest-res)) | ||||||
|  | @ -265,7 +270,8 @@ | ||||||
|                 #:source-url source-url |                 #:source-url source-url | ||||||
|                 #:wikiname wikiname |                 #:wikiname wikiname | ||||||
|                 #:title title |                 #:title title | ||||||
|                #:body-class body-class)) |                 #:body-class body-class | ||||||
|  |                 #:license license)) | ||||||
|              (define redirect-msg ((query-selector (attribute-selector 'class "redirectMsg") body))) |              (define redirect-msg ((query-selector (attribute-selector 'class "redirectMsg") body))) | ||||||
|              (define headers (if redirect-msg |              (define headers (if redirect-msg | ||||||
|                                  (let* ([dest (get-attribute 'href (bits->attributes ((query-selector (λ (t a c) (eq? t 'a)) redirect-msg))))] |                                  (let* ([dest (get-attribute 'href (bits->attributes ((query-selector (λ (t a c) (eq? t 'a)) redirect-msg))))] | ||||||
|  | @ -280,4 +286,4 @@ | ||||||
|               #:code 200 |               #:code 200 | ||||||
|               #:headers headers |               #:headers headers | ||||||
|               (λ (out) |               (λ (out) | ||||||
|                (write-html body out))))))])) |                 (write-html body out))))))]))) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue