(module html mzscheme (provide (all-defined)) (require (lib "servlets/private/search-util.ss" "help") (lib "servlet.ss" "web-server") (lib "etc.ss") (lib "kw.ss") (lib "port.ss") "../../private/options.ss" "util.ss" "url.ss") ;;; ;;; STYLESHEET ;;; ;; css : -> string ;; fetch stylesheet from disk ;; (convenient during development) (define (css) (define (port->string port) (let ([os (open-output-string)]) (copy-port port os) (get-output-string os))) (call-with-input-file (build-path (this-expression-source-directory) "helpdesk.css") port->string)) ;;; ;;; HTML FOR THE INTERNAL HELPDESK ;;; (define (make-green-header-text s) (color-highlight `(h2 () ,s))) (define (br*) (if (eq? (helpdesk-platform) 'external-browser) '() '((br) (br)))) ;;; ;;; GENERATE XML FOR THE ENTIRE PAGE ;;; ;; html-page : xexpr (list xml) (list xml) -> xexpr (define/kw (html-page #:key title (top '()) (bodies '()) body) (let ([bodies (if body (append bodies (list body)) bodies)]) `(html (meta ([http-equiv "Content-Type"] [content "text/html;charset=UTF-8"])) (meta ([name "generator"] [content "PLT Scheme"])) ;; TODO: Ask Eli what exactly to put here in the online version ;; (script ([src "http://www.google-analytics.com/urchin.js"] ;; [type "text/javascript"])) ;; (script ([type "text/javascript"]) ;; "_uacct=\"UA-808258-1\";_udn=\"plt-scheme.org\";urchinTracker();") (head (title ,title) (style ([type "text/css"]) "\n" ,(css)) ;; TODO: Check the icons work in online version (link ([rel "icon"] [href "/help/servlets/plticon.ico"] [type "image/ico"])) (link ([rel "shortcut icon"] [href "/help/servlets/plticon.ico"]))) (body ,@top ,@bodies)))) ;; html-select : string (list string) natural -> xexpr (define (html-select name descriptions selected-index) `(select ([name ,name]) ,@(let loop ([i 0] [ds descriptions] [xexprs '()]) (cond [(null? ds) (reverse xexprs)] [(= i selected-index) (loop (+ i 1) (cdr ds) (list* (car ds) `(option ((selected "selected"))) xexprs))] [else (loop (+ i 1) (cdr ds) (list* (car ds) `(option) xexprs))])))) ;;; ;;; THE TOP SEARCH BAR ;;; (online version online) ;; html-top : requrest -> (list xml) (define (html-top request) (define bindings (request-bindings request)) (define search-string (get-binding bindings 'search-string "")) (define search-type (get-binding bindings 'search-type search-type-default)) (define match-type (get-binding bindings 'match-type match-type-default)) `((div ([style "border: 1px solid black; padding: 3px; background-color: #74ca56;"]) (table ([width "98%"]) (tr (td ([align "right"]) (img ([class "image"] [src "http://www.plt-scheme.org/plt-green.jpg"] [width "133"] [height "128"] [alt "[icon]"]))) (td ([align "center"]) (form ([method "GET"] [action ,url-helpdesk-results]) (table (tr (td ([align "center"] [class "sansa"]) "Search the Help Desk for documentation on: ")) (tr (td (input ([name "search-string"] [type "text"] [size "70"] [value ,search-string]))) (td nbsp nbsp (button "Search"))) (tr (td ([align "center"]) ,(html-select "search-type" search-type-descriptions (search-type->index search-type)) nbsp nbsp nbsp nbsp ,(html-select "match-type" match-type-descriptions (match-type->index match-type))))))) (td nbsp) (td nbsp) (td nbsp) (td (table (tr (td ([align "center"]) (a ([href ,url-helpdesk-home] [class "sansa"]) "HOME"))) (tr (td ([align "center"]) (a ([href ,url-helpdesk-manuals] [class "sansa"]) "MANUALS")))))))) (p " "))) ;;; ;;; BINDINGS ;;; (define (get-binding bindings name default-value) (if (exists-binding? name bindings) (extract-binding/single name bindings) default-value)) (define (delete-binding id bindings) (cond [(null? bindings) '()] [(equal? (binding-id (car bindings)) id) (cdr bindings)] [else (cons (car bindings) (delete-binding id (cdr bindings)))])) (define (delete-bindings ids bindings) (if (null? ids) bindings (delete-bindings (cdr ids) (delete-binding (car ids) bindings)))) (define (display-binding binding) ;; for debugging (printf "binding: ~a=~s\n" (binding-id binding) (binding:form-value binding))) ;;; ;;; SEARCH DESCRIPTIONS AND SHORT NAMES ;;; (define (search-type-description i) (cadr (list-ref search-types i))) (define (match-type-description i) (cadr (list-ref match-types i))) (define reversed-search-types (map reverse search-types)) (define reversed-match-types (map reverse match-types)) (define (search-type-description->search-type desc) (cond [(assoc desc reversed-search-types) => cadr] [else search-type-default])) (define (match-type-description->match-type desc) (cond [(assoc desc reversed-match-types) => cadr] [else match-type-default])) (define search-type->index (let* ([types (map car search-types)] [len (length types)]) (lambda (t) (cond [(member t types) => (lambda (tail) (- len (length tail)))] [else -1])))) (define match-type->index (let* ([types (map car match-types)] [len (length types)]) (lambda (t) (cond [(member t types) => (lambda (tail) (- len (length tail)))] [else -1])))) (define search-type-descriptions (map cadr search-types)) (define match-type-descriptions (map cadr match-types)) )