racket/new-racket-web/web/common/resources.rkt
Eli Barzilay dd1996eefd Major simplification of site resources.
Only one resource (`make-navbar') returns a function now, the others
return just misc contents.  Dump the idea of a `head' resource which
complicated things whenever something new needed to be injected into the
head section -- and instead do the head assembly in the page layout
function.

Turn the preamble and postamble into resources too in preparation for
more contents taht is used in the postamble, mostly dealing with
resource files.  (The former doesn't need to be one since it's just
static text, but make it symmetric.)

Finally, the resources (implemented in `make-resources') have some
symbols that return things that are constructed by the code, and the
rest are files that are copied.  There are also some symbolic names that
stand for "special" resources -- these should get attention on changes,
since they are mostly there to expose some things for various pages.
For example, if more CSS is added, `style-path' should change to be a
list of CSS files and the code that uses it (in the git content that is
derived by gitweb) should also be adjusted to deal with more than one
file.
2014-03-01 19:55:56 -07:00

157 lines
4.6 KiB
Racket

#lang at-exp racket/base
(require scribble/html)
;; These are some resources that are shared across different toplevel
;; sites. They could be included from a single place, but then when one
;; machine crashes the rest won't work right. (Note: do not add
;; resources that are specific to only one site here, do so in the
;; site's "resources.rkt" file)
(require "utils.rkt")
(provide make-resource-files
navbar-style page-sizes font-family) ; needed for the blog template
;; robots is passed as #:robots in define-context, and htaccess as #:htaccess;
;; they can be #t (the default) for the standard ones, or some text that gets
;; added to the standard contents -- which is the user-agent line and the
;; ErrorDocument respectively.
(define (make-resource-files page dir robots htaccess)
;; the default target argument duplicate the behavior in "utils.rkt"
(define (copyfile file [target (basename file)])
(list target (copyfile-resource (in-here file) (web-path dir target))))
(define (writefile file . contents)
(list file (resource (web-path dir file)
(file-writer output (list contents "\n")))))
(define (pagefile file . contents)
(list file
(apply page (string->symbol (regexp-replace #rx"[.]html$" file ""))
contents)))
`(,(copyfile "logo.png")
,(copyfile "plticon.ico")
,(writefile "plt.css" racket-style)
;; the following resources are not used directly, so their names are
;; irrelevant
@,writefile["google5b2dc47c0b1b15cb.html"]{
google-site-verification: google5b2dc47c0b1b15cb.html}
@,writefile["BingSiteAuth.xml"]{
<?xml version="1.0"?>
<users><user>140BE58EEC31CB97382E1016E21C405A</user></users>}
;; #t (the default) => no-op file, good to avoid error-log lines
,(let* ([t (if (eq? #t robots) "Disallow:" robots)]
[t (and t (list "User-agent: *\n" t))])
(if t (writefile "robots.txt" t) '(#f #f)))
;; There are still some clients that look for a favicon.ico file
,(copyfile "plticon.ico" "favicon.ico")
@,pagefile["page-not-found.html"]{
@h1[style: "text-align: center; margin: 3em 0 1em 0;"]{
Page not found}
@(λ xs (table align: 'center (tr (td (pre xs))))){
> (@a[href: "/"]{(uncaught-exception-handler)}
(*(+(*)(*(+(*)(*)(*)(*)(*))(+(*)(*)(*)(*)(*))(+(*)(*)(*)(*))))@;
(+(*)(*)(*)(*))))
uncaught exception: 404}}
;; set the 404 page in htaccess instead of in the conf file, so we get it
;; only in sites that we generate here
,(let* ([t (and htaccess "ErrorDocument 404 /page-not-found.html")]
[t (if (boolean? htaccess) t (list htaccess "\n" t))])
(if t (writefile ".htaccess" t) '(#f #f)))))
(define page-sizes
@list{
margin-left: auto;
margin-right: auto;
width: 45em;
})
(define font-family
@list{
font-family: Optima, Arial, Verdana, Helvetica, sans-serif;
})
(define navbar-style
;; All of these are made to apply only inside `racketnav', so the styles can
;; be used in places with their own CSS (eg, blog.racket-lang.org)
@list{
.racketnav {
background-color: #000000;
color: #ffffff;
margin-bottom: 1em;
padding: 0.5em 0em;
white-space: nowrap;
}
.racketnav a {
color: #ffffff;
text-decoration: none;
}
.racketnav .navcontent {
@page-sizes
@font-family
}
.racketnav .navtitle {
font-size: xx-large;
font-weight: bold;
}
.racketnav .navitem {
text-decoration: none;
font-size: 88%;
}
.racketnav .navlink a {
padding: 0em 1em;
}
.racketnav .navcurlink a {
padding: 0em 1em;
background-color: #555555;
}
.racketnav .navlink a:hover,
.racketnav .navcurlink a:hover {
background-color: #888888;
}
.racketnav .navlinkcell {
text-align: center;
}
.racketnav .helpiconcell {
text-align: right;
vertical-align: top;
}
.racketnav .helpicon {
font-weight: bold;
font-size: 88%;
}
})
(define racket-style
@list{
@; ---- generic styles ----
html {
overflow-y: scroll;
}
body {
color: black;
background-color: white;
@font-family
margin: 0px;
padding: 0px;
}
a {
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
@; ---- content styles ----
.bodycontent {
@page-sizes
}
@; ---- styles for the navbar ----
@navbar-style
@; ---- styles for extras ----
.parlisttitle {
margin-bottom: 0.5em;
}
.parlistitem {
margin-bottom: 0.5em;
margin-left: 2em;
}
})