Initial commit
This commit is contained in:
commit
1f398c64ea
|
@ -0,0 +1 @@
|
|||
*.html
|
|
@ -0,0 +1,46 @@
|
|||
(file (role data))
|
||||
|
||||
(tag
|
||||
(id "convenience")
|
||||
(title "Convenience"))
|
||||
|
||||
(tag
|
||||
(id "libraries")
|
||||
(title "Libraries"))
|
||||
|
||||
(tag
|
||||
(id "process")
|
||||
(title "Process"))
|
||||
|
||||
(tag
|
||||
(id "strings")
|
||||
(title "Strings"))
|
||||
|
||||
(tag
|
||||
(id "symbols")
|
||||
(title "Symbols"))
|
||||
|
||||
(proposal
|
||||
(year 2022)
|
||||
(ordinal 1)
|
||||
(status draft)
|
||||
(title "Scheme Review")
|
||||
(author "Lassi Kortela")
|
||||
(tag "process")
|
||||
(draft
|
||||
(number 1)
|
||||
(date "2022-12-01 ")))
|
||||
|
||||
(proposal
|
||||
(year 2022)
|
||||
(ordinal 2)
|
||||
(status draft)
|
||||
(title "Symbols as strings")
|
||||
(author "Lassi Kortela")
|
||||
(tag "libraries")
|
||||
(tag "convenience")
|
||||
(tag "symbols")
|
||||
(tag "strings")
|
||||
(draft
|
||||
(number 1)
|
||||
(date "2022-12-01 ")))
|
|
@ -0,0 +1,13 @@
|
|||
#!/bin/sh
|
||||
set -eu
|
||||
cd "$(dirname "$0")"/..
|
||||
echo "Entering directory '$PWD'"
|
||||
root=../../scheme-review
|
||||
for proposal in $(cd "$root" && ls -d 20*-*); do
|
||||
source="$root/$proposal/document.md"
|
||||
target="www/$proposal.html"
|
||||
if test -f "$source"; then
|
||||
echo "Writing $target"
|
||||
pandoc -o "$target" "$source"
|
||||
fi
|
||||
done
|
|
@ -0,0 +1,244 @@
|
|||
#! /usr/bin/env gosh
|
||||
|
||||
(import (scheme base)
|
||||
(scheme cxr)
|
||||
(scheme file)
|
||||
(scheme read)
|
||||
(scheme write)
|
||||
(srfi 1)
|
||||
(srfi 193))
|
||||
|
||||
(define root-directory
|
||||
(string-append (script-directory) ".." "/"))
|
||||
|
||||
(define (asset . parts)
|
||||
(let loop ((path root-directory) (parts parts))
|
||||
(cond ((null? parts)
|
||||
path)
|
||||
((null? (cdr parts))
|
||||
(string-append path (car parts)))
|
||||
(else
|
||||
(loop (string-append path (car parts) "/")
|
||||
(cdr parts))))))
|
||||
|
||||
(define (positive-integer? obj)
|
||||
(and (integer? obj)
|
||||
(positive? obj)))
|
||||
|
||||
(define (valid-year? obj)
|
||||
(and (integer? obj)
|
||||
(<= 1970 obj 2070)))
|
||||
|
||||
(define (interpose delimiter list)
|
||||
(if (null? list)
|
||||
'()
|
||||
(let loop ((new '()) (list list))
|
||||
(if (null? (cdr list))
|
||||
(reverse (cons (first list) new))
|
||||
(loop (cons* delimiter (first list) new)
|
||||
(cdr list))))))
|
||||
|
||||
(define-syntax define-enum
|
||||
(syntax-rules ()
|
||||
((define-symbols enum symbol ...)
|
||||
(begin (define symbol 'symbol)
|
||||
...
|
||||
(define enum (list symbol ...))))))
|
||||
|
||||
(define-enum statuses
|
||||
draft
|
||||
final
|
||||
withdrawn
|
||||
superseded
|
||||
living)
|
||||
|
||||
(define (valid-status? obj)
|
||||
(not (not (member obj statuses))))
|
||||
|
||||
(define (generator->list g)
|
||||
(let loop ((xs '()))
|
||||
(let ((x (g)))
|
||||
(if (eof-object? x) (reverse xs) (loop (cons x xs))))))
|
||||
|
||||
(define (read-all)
|
||||
(generator->list read))
|
||||
|
||||
(define (display-sxml x)
|
||||
(define (display* . xs) (for-each display xs))
|
||||
(define (display-char char)
|
||||
(let* ((cc (char->integer char))
|
||||
(ok? (case char ((#\& #\< #\> #\") #f) (else (<= #x20 cc #x7e)))))
|
||||
(if ok? (display char) (display* "&#" cc ";"))))
|
||||
(define (display-attribute attribute)
|
||||
(display* " " (car attribute) "=\"")
|
||||
(string-for-each display-char (cadr attribute))
|
||||
(display "\""))
|
||||
(cond ((pair? x)
|
||||
(display* "<" (car x))
|
||||
(let ((body (cond ((and (pair? (cdr x))
|
||||
(pair? (cadr x))
|
||||
(eq? '@ (car (cadr x))))
|
||||
(for-each display-attribute (cdr (cadr x)))
|
||||
(cddr x))
|
||||
(else (cdr x)))))
|
||||
(display ">")
|
||||
(for-each display-sxml body)
|
||||
(unless (memq (car x) '(meta br))
|
||||
(display* "</" (car x) ">"))))
|
||||
((string? x)
|
||||
(string-for-each display-char x))
|
||||
(else (error "Bad:" x))))
|
||||
|
||||
(define (get-all alist key)
|
||||
(let loop ((results '()) (alist alist))
|
||||
(if (null? alist)
|
||||
(reverse results)
|
||||
(let ((entry (car alist)))
|
||||
(cond ((not (and (pair? entry)
|
||||
(equal? key (car entry))))
|
||||
(loop results
|
||||
(cdr alist)))
|
||||
(else
|
||||
(loop (cons entry results)
|
||||
(cdr alist))))))))
|
||||
|
||||
(define (get-one alist key valid?)
|
||||
(let ((all (get-all alist key)))
|
||||
(cond ((= (length all) 0)
|
||||
(error "No" key))
|
||||
((> (length all) 1)
|
||||
(error "Multiple" key))
|
||||
((not (valid? (cadar all)))
|
||||
(error "Not valid" (cadar all)))
|
||||
(else
|
||||
(cadar all)))))
|
||||
|
||||
(define (one-getter key valid?)
|
||||
(lambda (alist)
|
||||
(get-one alist key valid?)))
|
||||
|
||||
(define (all-getter key)
|
||||
(lambda (alist)
|
||||
(get-all alist key)))
|
||||
|
||||
(define index
|
||||
(with-input-from-file (asset "data" "index.pose")
|
||||
read-all))
|
||||
|
||||
(define (head=? key)
|
||||
(lambda (form)
|
||||
(and (pair? form)
|
||||
(equal? key (car form)))))
|
||||
|
||||
(define tag-entry-id (one-getter 'id string?))
|
||||
(define tag-entry-title (one-getter 'title string?))
|
||||
|
||||
(define (all-tag-entries)
|
||||
(filter (head=? 'tag) index))
|
||||
|
||||
(define (tag-entry-by-id tag-id)
|
||||
(find (lambda (entry)
|
||||
(equal? tag-id (tag-entry-id entry)))
|
||||
(all-tag-entries)))
|
||||
|
||||
(define (all-tags)
|
||||
(map tag-entry-id (all-tag-entries)))
|
||||
|
||||
(define (tag-title tag-id)
|
||||
(let ((entry (tag-entry-by-id tag-id)))
|
||||
(if entry
|
||||
(tag-entry-title entry)
|
||||
(error "No such tag" tag-id))))
|
||||
|
||||
(define draft-number (one-getter 'number positive-integer?))
|
||||
|
||||
(define proposal-year (one-getter 'year valid-year?))
|
||||
(define proposal-ordinal (one-getter 'ordinal positive-integer?))
|
||||
(define proposal-status (one-getter 'status valid-status?))
|
||||
(define proposal-title (one-getter 'title string?))
|
||||
(define proposal-drafts (all-getter 'draft))
|
||||
|
||||
(define (proposal-authors proposal)
|
||||
(map second (get-all proposal 'author)))
|
||||
|
||||
(define (proposal-tags proposal)
|
||||
(map second (get-all proposal 'tag)))
|
||||
|
||||
(define (proposals)
|
||||
(filter (head=? 'proposal) index))
|
||||
|
||||
(define (proposal-id proposal)
|
||||
(string-append (number->string (proposal-year proposal))
|
||||
"-"
|
||||
(number->string (proposal-ordinal proposal))))
|
||||
|
||||
(define (proposal-latest-draft-number proposal)
|
||||
(apply max (map draft-number (proposal-drafts proposal))))
|
||||
|
||||
(define (proposal-latest-uri proposal)
|
||||
(string-append (proposal-id proposal)
|
||||
".html"))
|
||||
|
||||
(define (proposal-repository-uri proposal)
|
||||
(string-append "https://gitea.scheme.org/review/"
|
||||
(proposal-id proposal)))
|
||||
|
||||
(define (proposal-discussion-uri proposal)
|
||||
(string-append (proposal-repository-uri proposal)
|
||||
"/issues"))
|
||||
|
||||
(define title "Scheme Review")
|
||||
|
||||
(define intro
|
||||
`((p "Peer review for documents and code."
|
||||
" SRFI without the constraints.")
|
||||
(ul
|
||||
(li "Draft-based."
|
||||
" Send a new draft whenever you have"
|
||||
" something people should read.")
|
||||
(li "No deadlines."
|
||||
" If it takes ten years to perfect your"
|
||||
" proposal, that's fine.")
|
||||
(li "Not limited to requests for implementation."
|
||||
" Submit anything you want schemers to review -"
|
||||
" whether a neat hack, an aesthetic note, a survey,"
|
||||
" or a full fledged library."))))
|
||||
|
||||
(define (main)
|
||||
(with-output-to-file (asset "www" "index.html")
|
||||
(lambda ()
|
||||
(display-sxml
|
||||
`(html
|
||||
(head
|
||||
(title ,title)
|
||||
(link (@ (rel "stylesheet")
|
||||
(href "review.css"))))
|
||||
(body
|
||||
(h1 ,title)
|
||||
(section
|
||||
(@ (class "intro box"))
|
||||
,@intro)
|
||||
(section
|
||||
(ul
|
||||
(@ (class "proposals"))
|
||||
,@(map (lambda (proposal)
|
||||
`(li (@ (class "proposal box"))
|
||||
(b ,(proposal-id proposal)
|
||||
": "
|
||||
,(proposal-title proposal))
|
||||
(br)
|
||||
(a (@ (href ,(proposal-latest-uri proposal)))
|
||||
"Document")
|
||||
" | "
|
||||
(a (@ (href ,(proposal-repository-uri proposal)))
|
||||
"Repo")
|
||||
" | "
|
||||
(a (@ (href ,(proposal-discussion-uri proposal)))
|
||||
"Talk")
|
||||
" | "
|
||||
"Tags: "
|
||||
,@(interpose ", "
|
||||
(map tag-title (proposal-tags proposal)))))
|
||||
(reverse (proposals)))))))))))
|
||||
|
||||
(main)
|
|
@ -0,0 +1,7 @@
|
|||
#!/bin/sh
|
||||
set -eu
|
||||
cd "$(dirname "$0")"/..
|
||||
set -x
|
||||
scripts/generate.scm
|
||||
scripts/generate-docs.sh
|
||||
rsync -vcr www/ alpha.servers.scheme.org:/production/groups/www/review/
|
|
@ -0,0 +1,22 @@
|
|||
body {
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
.box {
|
||||
border-radius: 20px;
|
||||
padding: 1em;
|
||||
margin: 1em;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.intro {
|
||||
background-color: lightgreen;
|
||||
}
|
||||
|
||||
ul.proposals {
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
li.proposal {
|
||||
background-color: wheat;
|
||||
}
|
Loading…
Reference in New Issue