diff --git a/pkgs/plt-services/meta/new-web/download/index.rkt b/pkgs/plt-services/meta/new-web/download/index.rkt
index 7406a81a6c..4dc6663af5 100644
--- a/pkgs/plt-services/meta/new-web/download/index.rkt
+++ b/pkgs/plt-services/meta/new-web/download/index.rkt
@@ -1,6 +1,8 @@
#lang plt-web
-(require "resources.rkt" "download-pages.rkt")
+(require "resources.rkt"
+ "download-pages.rkt"
+ "../identity.rkt")
(provide index)
(define index
@@ -8,3 +10,5 @@
#:link-title "Download" #:window-title "Download Racket"
#:part-of 'download #:width 'full]{
@(render-download-page)})
+
+(register-identity download-site)
diff --git a/pkgs/plt-services/meta/new-web/download/resources.rkt b/pkgs/plt-services/meta/new-web/download/resources.rkt
index a85d95d102..826a8983e0 100644
--- a/pkgs/plt-services/meta/new-web/download/resources.rkt
+++ b/pkgs/plt-services/meta/new-web/download/resources.rkt
@@ -1,7 +1,9 @@
#lang plt-web
-(require "../testing.rkt")
+(require "../testing.rkt"
+ "../identity.rkt")
(provide download-site)
(define download-site (site "download"
- #:url (rewrite-for-testing "http://download.racket-lang.org/")))
+ #:url (rewrite-for-testing "http://download.racket-lang.org/")
+ #:page-headers (identity-headers)))
diff --git a/pkgs/plt-services/meta/new-web/identity.rkt b/pkgs/plt-services/meta/new-web/identity.rkt
new file mode 100644
index 0000000000..dd11140017
--- /dev/null
+++ b/pkgs/plt-services/meta/new-web/identity.rkt
@@ -0,0 +1,28 @@
+#lang plt-web
+
+(provide identity-headers
+ register-identity)
+
+;; Include the returned header in `#:page-headers` for each site:
+(define (identity-headers)
+ (list
+ @script{
+ (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+ })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+ ga('create', 'UA-48767493-1', 'racket-lang.org');
+ ga('send', 'pageview');
+ }))
+
+;; Call this function for each site:
+(define (register-identity site)
+ ;; the following resources are not used directly, so their names are
+ ;; irrelevant
+ @plain[#:site site #:file "google5b2dc47c0b1b15cb.html"]{
+ google-site-verification: google5b2dc47c0b1b15cb.html}
+ @plain[#:site site #:file "BingSiteAuth.xml"]{
+
+ 140BE58EEC31CB97382E1016E21C405A}
+ (void))
diff --git a/pkgs/plt-services/meta/new-web/minis/drracket.rkt b/pkgs/plt-services/meta/new-web/minis/drracket.rkt
index 1e3dc20100..d4eed3f711 100644
--- a/pkgs/plt-services/meta/new-web/minis/drracket.rkt
+++ b/pkgs/plt-services/meta/new-web/minis/drracket.rkt
@@ -1,10 +1,12 @@
#lang plt-web
-(require "../www/resources.rkt")
+(require "../www/resources.rkt"
+ "../identity.rkt")
(define drracket-site (site "drracket"
#:url "http://drracket.org/"
#:share-from www-site
+ #:page-headers (identity-headers)
#:page-style? #f
#:meta? #t))
@@ -12,6 +14,8 @@
;; to Can Burak Cilingir for both the logo and the drracket.org domain
;; name.
+(register-identity drracket-site)
+
(define index
(page #:site drracket-site
#:title "DrRacket" #:extra-headers (lazy headers) (center-div logo)))
diff --git a/pkgs/plt-services/meta/new-web/minis/pre.rkt b/pkgs/plt-services/meta/new-web/minis/pre.rkt
index 4b34266ad7..29c4a9ad33 100644
--- a/pkgs/plt-services/meta/new-web/minis/pre.rkt
+++ b/pkgs/plt-services/meta/new-web/minis/pre.rkt
@@ -1,14 +1,18 @@
#lang plt-web
(require "../www/resources.rkt"
"../testing.rkt"
+ "../identity.rkt"
plt-web/style)
(provide installers)
(define pre-site (site "pre"
#:url (rewrite-for-testing "http://pre.racket-lang.org/")
+ #:page-headers (identity-headers)
#:share-from www-site))
+(register-identity pre-site)
+
(define (main id)
@page[#:site pre-site
#:id id
diff --git a/pkgs/plt-services/meta/new-web/rcon/all.rkt b/pkgs/plt-services/meta/new-web/rcon/all.rkt
index 44a0592d9d..7230062353 100644
--- a/pkgs/plt-services/meta/new-web/rcon/all.rkt
+++ b/pkgs/plt-services/meta/new-web/rcon/all.rkt
@@ -3,12 +3,15 @@
(require plt-web/style
"resources.rkt"
"utils.rkt"
+ "../identity.rkt"
(prefix-in 2011: "2011/all.rkt")
(prefix-in 2012: "2012/all.rkt")
(prefix-in 2013: "2013/all.rkt"))
(provide index)
+(register-identity con-site)
+
(define index
@page[#:site con-site
#:link-title "RacketCon" #:title "RacketCon"
diff --git a/pkgs/plt-services/meta/new-web/rcon/resources.rkt b/pkgs/plt-services/meta/new-web/rcon/resources.rkt
index 4dc4aaa06f..641986fbb8 100644
--- a/pkgs/plt-services/meta/new-web/rcon/resources.rkt
+++ b/pkgs/plt-services/meta/new-web/rcon/resources.rkt
@@ -1,5 +1,6 @@
#lang plt-web
(require "../www/resources.rkt"
+ "../identity.rkt"
"../testing.rkt")
(provide con-site
@@ -8,6 +9,7 @@
(define con-site
(site "con"
#:url (rewrite-for-testing "http://con.racket-lang.org/")
+ #:page-headers (identity-headers)
#:share-from www-site))
(define (rcon [year #f] . text)
diff --git a/pkgs/plt-services/meta/new-web/www/index.rkt b/pkgs/plt-services/meta/new-web/www/index.rkt
index 1622098c4a..ce4d1ceae4 100644
--- a/pkgs/plt-services/meta/new-web/www/index.rkt
+++ b/pkgs/plt-services/meta/new-web/www/index.rkt
@@ -4,7 +4,9 @@
"irc.rkt"
(prefix-in pre: "../minis/pre.rkt")
(only-in "../stubs/docs.rkt" docs-path)
- (only-in "../rcon/resources.rkt" rcon))
+ (only-in "../rcon/resources.rkt" rcon)
+ "../identity.rkt"
+ (only-in "../stubs/pkgs.rkt"))
;; TODO
;; -- add links in top paragraph
@@ -15,6 +17,8 @@
(require "resources.rkt" "code.rkt" "download.rkt" "learning.rkt" "people.rkt"
"community.rkt")
+(register-identity www-site)
+
(define-runtime-path img-dir "img")
(define-runtime-path js-dir "js")
(define-runtime-path css-dir "css")
diff --git a/pkgs/plt-services/meta/new-web/www/resources.rkt b/pkgs/plt-services/meta/new-web/www/resources.rkt
index 974da12cdc..63ca2af1b9 100644
--- a/pkgs/plt-services/meta/new-web/www/resources.rkt
+++ b/pkgs/plt-services/meta/new-web/www/resources.rkt
@@ -1,5 +1,6 @@
#lang plt-web
(require plt-web/style
+ "../identity.rkt"
"../testing.rkt")
(provide www-site)
@@ -7,6 +8,7 @@
(define www-site
(site "www"
#:url (rewrite-for-testing "http://www.racket-lang.org/")
+ #:page-headers (identity-headers)
#:navigation
(list
@a[href: (resource "stubs/pkgs/" #f)]{Packages}
diff --git a/pkgs/plt-web-pkgs/plt-web-doc/plt-web.scrbl b/pkgs/plt-web-pkgs/plt-web-doc/plt-web.scrbl
index 18aa7bf5d6..07158a9702 100644
--- a/pkgs/plt-web-pkgs/plt-web-doc/plt-web.scrbl
+++ b/pkgs/plt-web-pkgs/plt-web-doc/plt-web.scrbl
@@ -38,6 +38,7 @@ relative directory is mapped to a destination URL via
[#:always-abs-url? always-abs-url? any/c #t]
[#:share-from share-from (or/c site? #f) #f]
[#:page-style? page-style? any/c #t]
+ [#:page-headers page-headers outputable/c null]
[#:meta? meta? any/c page-style?]
[#:robots robots (or/c #f #t outputable/c) #t]
[#:htaccess htaccess (or/c #f #t outputable/c) #t]
@@ -65,6 +66,9 @@ include content to set the style of the overall page. Otherwise, only
sufficient resources and content are included to specify the style of
the PLT web-page header (i.e., a bar with the Racket logo).
+The @racket[page-headers] argument provides content for the header of
+any HTML page generated at the site via @racket[page] or @racket[page*].
+
If @racket[meta?] is true, then @filepath{.htaccess},
@filepath{robots.txt}, and similar files are generated for the site.
The @racket[robots] and @racket[htaccess] arguments determine robot
diff --git a/pkgs/plt-web-pkgs/plt-web-lib/layout.rkt b/pkgs/plt-web-pkgs/plt-web-lib/layout.rkt
index 448fd50ecb..a8554b13ef 100644
--- a/pkgs/plt-web-pkgs/plt-web-lib/layout.rkt
+++ b/pkgs/plt-web-pkgs/plt-web-lib/layout.rkt
@@ -223,7 +223,7 @@
null)
})
-(define (make-resources files navigation page-style? sharing-site)
+(define (make-resources files navigation page-style? extra-headers sharing-site)
(define (recur/share what)
(if sharing-site
((site-resources sharing-site) what)
@@ -253,7 +253,7 @@
[sharing-site (recur/share what)]
[else (error 'resource "unknown resource: ~e" what)])]))
(define icon-headers (html-icon-headers (resources 'icon-path)))
- (define headers (html-headers resources icon-headers page-style?))
+ (define headers (list (html-headers resources icon-headers page-style?) extra-headers))
(define make-navbar (navbar-maker (resources 'logo-path) navigation page-style?))
(define make-navbar-content (navbar-content (resources 'logo-path) navigation page-style?))
(define preamble (cons @doctype['html]
@@ -280,6 +280,7 @@
#:robots [robots #t]
#:htaccess [htaccess #t]
#:navigation [navigation null]
+ #:page-headers [headers null]
#:page-style? [page-style? #t]
#:meta? [meta? page-style?]
#:share-from [given-sharing-site #f])
@@ -304,12 +305,13 @@
#:site the-site
content))
dir robots htaccess
- page-style?
+ page-style?
meta?
(and sharing-site
#t))
navigation
page-style?
+ headers
sharing-site))))
the-site)])
site))
diff --git a/pkgs/plt-web-pkgs/plt-web-lib/resources.rkt b/pkgs/plt-web-pkgs/plt-web-lib/resources.rkt
index 8121ac0c6d..844696916d 100644
--- a/pkgs/plt-web-pkgs/plt-web-lib/resources.rkt
+++ b/pkgs/plt-web-pkgs/plt-web-lib/resources.rkt
@@ -59,13 +59,6 @@
null)
,@(if meta?
(list
- ;; the following resources are not used directly, so their names are
- ;; irrelevant
- @writefile["google5b2dc47c0b1b15cb.html"]{
- google-site-verification: google5b2dc47c0b1b15cb.html}
- @writefile["BingSiteAuth.xml"]{
-
- 140BE58EEC31CB97382E1016E21C405A}
;; #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))])