From bb3dbeb2c04d623b16a8cbaeebe51629a2cefa27 Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Thu, 16 Sep 2010 13:42:56 -0400 Subject: [PATCH] Add "All Versions" page with a table of all versions and all packages. --- collects/meta/web/download/data.rkt | 29 ++++++++++++--- collects/meta/web/download/download-pages.rkt | 37 +++++++++++++++++-- 2 files changed, 57 insertions(+), 9 deletions(-) diff --git a/collects/meta/web/download/data.rkt b/collects/meta/web/download/data.rkt index b70eb25d3e..89381ac7fa 100644 --- a/collects/meta/web/download/data.rkt +++ b/collects/meta/web/download/data.rkt @@ -79,6 +79,9 @@ ["plt" "Racket Package"] ["sit" "StuffIt Archive"])) +;; Used to sort packages when more then one is rendered on a page +(define -package-order- '(racket racket-textual)) + (define -mirrors- ;; This is a sequence of ;; (location url reposnisble-name email [techincal-contact]) @@ -139,10 +142,13 @@ ;; ---------------------------------------------------------------------------- +;; accepts "053" +(define (version->integer* v) + (version->integer (regexp-replace #rx"^0+" v ""))) + (define versions+dates (sort -versions+dates- < - #:key (lambda (vd) - (version->integer (regexp-replace #rx"^0+" (car vd) ""))) + #:key (lambda (vd) (version->integer* (car vd))) #:cache-keys? #t)) ;; sorted from oldest to newest @@ -176,6 +182,7 @@ (path ; path to file from the installers directory file ; just the file name version ; version of the installer (as a string) + version-number ; version as a number (via version->integer*) size ; human-readable size string package ; package kind symbol 'racket or 'racket-textual binary? ; #t = binary distribution, #f = source distribution @@ -200,8 +207,8 @@ "))$"))) (define (make-installer size path version package file type platform suffix) - (installer path file version size (string->symbol package) - (equal? "bin" type) platform suffix)) + (installer path file version (version->integer* version) size + (string->symbol package) (equal? "bin" type) platform suffix)) (define (parse-installers in) (port-count-lines! in) @@ -211,7 +218,19 @@ (error 'installers "bad installer data line#~a: ~s" num line)))))) -(define all-installers (call-with-input-file installers-data parse-installers)) +;; sorted by version (newest first), and then by -package-order- +(define all-installers + (sort (call-with-input-file installers-data parse-installers) + (lambda (i1 i2) + (let ([v1 (installer-version-number i1)] + [v2 (installer-version-number i2)]) + (or (> v1 v2) + (and (= v1 v2) + (let* ([p1 (installer-package i1)] + [p2 (installer-package i2)] + [t1 (memq p1 -package-order-)]) + (and t1 (or (memq p2 (cdr t1)) + (not (memq p2 -package-order-))))))))))) (define package->name (let ([t (make-hasheq)]) diff --git a/collects/meta/web/download/download-pages.rkt b/collects/meta/web/download/download-pages.rkt index 86e51c3a28..fdf539ca49 100644 --- a/collects/meta/web/download/download-pages.rkt +++ b/collects/meta/web/download/download-pages.rkt @@ -1,7 +1,7 @@ #lang at-exp s-exp "shared.rkt" -(require "data.rkt" "installer-pages.rkt" - (prefix-in pre: "../stubs/pre.rkt")) +(require "data.rkt" "installer-pages.rkt" (prefix-in pre: "../stubs/pre.rkt") + racket/list) (provide render-download-page) @@ -21,7 +21,8 @@ @input[type: 'submit value: "Download" onclick: "do_jump();"] @|br hr| @div[align: "center"]{ - @small{@license @nbsp @bull @nbsp @pre:installers}} + @small{@all-version-pages @nbsp @bull @nbsp + @license @nbsp @bull @nbsp @pre:installers}} @hr @div[id: "linux_explain" style: '("font-size: 75%; display: none; width: 28em;" @@ -38,8 +39,36 @@ (equal? package (installer-package i)))) @li{@(installer->page i 'only-platform)})}}}) +(define all-version-pages + (let () + (define all-versions + (remove-duplicates (map installer-version all-installers))) + (define all-packages + (remove-duplicates (map installer-package all-installers))) + (define (make-page ver pkg) + (define file (format "~a-v~a.html" pkg ver)) + (define title @list{@(package->name pkg) v@ver}) + (define label @list{v@ver @small{(@(version->date ver))}}) + (define the-page + @page[#:file file #:title title #:part-of 'download]{ + @(render-download-page ver pkg)}) + (the-page label)) + @page[#:id 'all-versions #:title "All Versions" #:part-of 'download]{ + @table[width: "90%" align: 'center cellspacing: 10 cellpadding: 10 + rules: 'cols frame: 'box]{ + @thead{ + @tr[style: "border-bottom: 1px solid;"]{ + @(map (lambda (p) + @th[width: "50%" align: 'center]{@(package->name p)}) + all-packages)}} + @tbody{ + @(map (lambda (v) + (tr (map (lambda (p) (td align: 'center (make-page v p))) + all-packages))) + all-versions)}}})) + (define license - @page[#:title "Software License"]{ + @page[#:title "Software License" #:part-of 'download]{ @p{Racket is distributed under the @a[href: "http://www.gnu.org/copyleft/lesser.html"]{ GNU Lesser General Public License (LGPL)}.