
* The main page's title appears in search results, so use "The Racket Language" instead of "Racket". Additional minor tweaks to a few more titles to make them presentable as search results. * Add a `#:description' keyword to make it easy to add it to pages. Add such texts to the main page, downloads, community, learning, people, and mailing list pages. * Add a <meta name="robots" content="NOODP" /> to the front page, to avoid getting the ODP (dmoz) blurb, hopefully the new and improved description(s) will be used instead. (If not, this should be reverted.)
169 lines
6.9 KiB
Racket
169 lines
6.9 KiB
Racket
#lang meta/web
|
|
|
|
(provide mailing-lists-quick)
|
|
|
|
(define-context "lists")
|
|
|
|
(struct ML (name gmane-name google-name description))
|
|
|
|
(define MLs
|
|
(list (ML "users" "user" "racket-users"
|
|
@text{A discussion list for all things related to Racket.
|
|
Ask your questions here!})
|
|
(ML "announce" "announce" #f
|
|
@text{A low-volume, moderated list for announcements, only.
|
|
@small{(These are posted on the @TT{users} list too, no need
|
|
to subscribe to both.)}})
|
|
(ML "dev" "devel" #f
|
|
@text{A mailing list for Racket development.
|
|
@small{(For people who want to see how the sausages are made
|
|
— and help make them.)}})))
|
|
|
|
(define lists
|
|
@page[#:title "Mailing Lists" #:file "" #:part-of 'community
|
|
#:description
|
|
@'{Racket mailing lists for users, developers, announcements, and more.}
|
|
(define (list-cells what) (map (λ (r) (r what)) list-renderers))
|
|
]{
|
|
@p{This is the Racket mailing list server. We have several public mailing
|
|
lists, some are listed below with several mirrors for each one. The
|
|
complete list of public mailing lists is available on
|
|
@a[href: "listinfo"]{this page}.}
|
|
@(define gap1 (tr (map (λ (_) @td{@div[style: "height: 1ex;"]{}}) MLs)))
|
|
@(define gap2 (tr (map (λ (_) @td{}) MLs)))
|
|
@(define (sec . text)
|
|
@list{@gap1
|
|
@tr{@td[style: '("background-color: #dddddd; font-weight: bold;"
|
|
" padding: 0;")
|
|
colspan: (length MLs)]{@text}}
|
|
@gap2})
|
|
@table[style: "width: 100%; margin: auto; text-align: center;"
|
|
frame: 'box rules: 'cols cellpadding: 5]{
|
|
@tr[style: "border-bottom: 1px solid; background-color: #ccccff;"]{
|
|
@(list-cells 'header-cell)}
|
|
@tr[valign: 'top style: "text-align: left;"]{@(list-cells 'description)}
|
|
@tr{@(list-cells 'main-page-cell)}
|
|
@tr{@(list-cells 'graph-cell)}
|
|
@sec{Subscription: enter your email here to subscribe to a mailing list}
|
|
@tr{@(list-cells 'subscribe-cell)}
|
|
@sec{Gmane Mirror}
|
|
@tr{@(list-cells 'gmane-cell)}
|
|
@sec{Archive at mail-archive.com}
|
|
@tr{@(list-cells 'mail-archive-cell)}
|
|
@sec{Google group mirror}
|
|
@tr{@(list-cells 'google-cell)}}})
|
|
|
|
(define (list-renderer ml)
|
|
(define name (ML-name ml))
|
|
(define at-domain "@racket-lang.org")
|
|
(define email (list name at-domain))
|
|
(define description (ML-description ml))
|
|
(define gmane
|
|
(let ([gm (ML-gmane-name ml)])
|
|
(and gm @list{gmane.comp.lang.racket.@(ML-gmane-name ml)})))
|
|
(define (gmane-link base . body)
|
|
(unless gmane
|
|
(error 'list-renderer "internal error: no gmane info for ~a" name))
|
|
(let* ([path (if (pair? base) (list "/" (cdr base) "/") "/")]
|
|
[base (if (pair? base) (car base) base)]
|
|
[pfx (if (regexp-match? #rx"://" base) base (list "http://" base))])
|
|
@a[href: (list pfx ".gmane.org" path gmane)]{@body}))
|
|
(define (mail-archive-link suffix . body)
|
|
@a[href: (list "http://www.mail-archive.com/" email "/" suffix)]{@body})
|
|
(define google-groups-url
|
|
(let ([g (ML-google-name ml)])
|
|
(and g (list "http://groups.google.com/group/" g "/"))))
|
|
(define ((mk-form make) url #:method [method 'get] . body)
|
|
(make @form[action: url method: method
|
|
style: "display: inline; clear: none;"]{
|
|
@div{@body}}))
|
|
(define (mk-subscribe mk)
|
|
@(mk-form mk)[(list (url-of lists #t) name "/subscribe") #:method 'post]{
|
|
@input[type: 'text name: 'email size: 20 value: ""
|
|
placeholder: "Email to Subscribe"
|
|
title: @list{Enter your email to subscribe
|
|
to the "@name" mailing list.}]})
|
|
(define form-cell (mk-form td))
|
|
(λ (what)
|
|
(case what
|
|
[(header-cell)
|
|
@th[style: "width: 33%;"]{
|
|
@; the mixed styles will help against some spam harvesting too
|
|
@span[style: '("font-size: x-large;"
|
|
" font-family: monospace; font-weight: bold;")]{
|
|
@TT{@name}@;
|
|
@span[style: "font-size: small;"]{@at-domain}}}]
|
|
[(description) @td{@description}]
|
|
[(main-page-cell)
|
|
@td{@a[href: (list name "/")]{@big{@b{@TT{@name}}} page}
|
|
@bull
|
|
@a[href: (list name "/archive/")]{archive}}]
|
|
[(graph-cell)
|
|
@td{@img[src: (list "http://gmane.org/plot-rate.php?group=" gmane)
|
|
style: "width: 80%;"]}]
|
|
[(subscribe-cell) (mk-subscribe td)]
|
|
[(google-cell)
|
|
(if google-groups-url
|
|
@form-cell[(list google-groups-url "search")]{
|
|
@a[href: google-groups-url]{
|
|
@(string-titlecase
|
|
(regexp-replace* #rx"-" (ML-google-name ml) " "))}
|
|
@br
|
|
@span[style: "white-space: nowrap;"]{
|
|
Search: @input[type: 'text name: 'q value: "" size: 20].}}
|
|
@td{@small{—none—}})]
|
|
[(mail-archive-cell)
|
|
@form-cell["http://www.mail-archive.com/search"]{
|
|
@input[type: 'hidden name: 'l value: email]
|
|
@mail-archive-link["info.html"]{Archive}
|
|
@bull
|
|
@mail-archive-link[""]{Browse}
|
|
@bull
|
|
@mail-archive-link["maillist.xml"]{RSS}
|
|
@br
|
|
@span[style: "white-space: nowrap;"]{
|
|
Search: @input[type: 'text name: 'q value: "" size: 20].}}]
|
|
[(gmane-cell)
|
|
@form-cell["http://search.gmane.org/"]{
|
|
@input[type: 'hidden name: 'group value: gmane]
|
|
@gmane-link["dir"]{@TT{@gmane}}
|
|
@br
|
|
@gmane-link["news"]{threaded}
|
|
@bull
|
|
@gmane-link["blog"]{blog}
|
|
@bull
|
|
@gmane-link["nntp://news"]{newsgroup}
|
|
@br
|
|
Feed:
|
|
@gmane-link['("rss" "messages/complete")]{messages}
|
|
@bull
|
|
@gmane-link['("rss" "topics/complete")]{topics}
|
|
@br
|
|
@;Excerpt feed:
|
|
@;@gmane-link['("rss" "messages/excerpts")]{messages}
|
|
@;@bull
|
|
@;@gmane-link['("rss" "topics/excerpts")]{topics}
|
|
@;@br
|
|
@span[style: "white-space: nowrap;"]{
|
|
Search: @input[type: 'text name: 'query value: "" size: 20].}}]
|
|
[(quick)
|
|
@text{
|
|
@big{@TT{@b{@name}}@small{@tt{@at-domain}}}
|
|
@div[style: "margin-left: 2em;"]{
|
|
@description
|
|
@br
|
|
@div[style: "float: right;"]{@(mk-subscribe values)}
|
|
[@a[href: (list (url-of lists) name "/")]{list page},
|
|
@gmane-link["dir"]{gmane mirror},
|
|
@mail-archive-link[""]{mail-archive}@;
|
|
@(and google-groups-url
|
|
@text{, @a[href: google-groups-url]{google group mirror}})]}}]
|
|
[else (error 'list-cell "internal error")])))
|
|
|
|
(define list-renderers (map list-renderer MLs))
|
|
|
|
(define (mailing-lists-quick)
|
|
@text{@(apply parlist @strong{Mailing Lists}
|
|
(map (λ (r) (r 'quick)) list-renderers))
|
|
@p{See the @lists{mailing list server} for more details.}})
|