export PRAXIS=/home/phil/praxis
awk ' # exercises in chronological order (page "chron")
BEGIN { itemsperpage = 30; FS = "\n"; RS = ""
split("Jan:Feb:Mar:Apr:May:Jun:Jul:Aug:Sep:Oct:Nov:Dec",
monthname, ":") }
$1 ~ /^number\t[1-9][0-9]*$/ {
for (i=1; i<=NF; i++)
if (split($i, f, /\t/) == 2)
val[f[1]] = f[2]
out[++nitems] = \
sprintf("<tr><td>%d</td><td>%02d %s %d</td>" \
"<td><a href=\"/%d/%02d/%02d/%s/\">%s</a>: %s</td>" \
"<td><a href=\"/%d/%02d/%02d/%s/\">exercise</a> " \
"<a href=\"/%d/%02d/%02d/%s/%d/\">solution</a> " \
"<a href=\"http://programmingpraxis.codepad.org/" \
"%s\">codepad</a></td></tr>",
val["number"], val["pubday"], monthname[val["pubmon"]],
val["pubyear"], val["pubyear"], val["pubmon"],
val["pubday"], val["file"], val["title"],
val["blurb"], val["pubyear"], val["pubmon"],
val["pubday"], val["file"], val["pubyear"],
val["pubmon"], val["pubday"], val["file"],
val["soln"], val["codepad"]) }
# END { for (i=1; i<=nitems; i++) {
# if (i % itemsperpage == 1)
# printheader(i, nitems)
# print ""; print out[i]
# if (i % itemsperpage == 0 || i == nitems)
# printfooter(i, nitems)
# if (i % itemsperpage == 0 && i != nitems)
# printseparator(i, nitems) } }
END { print "<table cellpadding=\"10\">"
for (i=1; i<=nitems; i++) {
print ""; print out[i] }
print "</table>" }
function ceiling(n) { if (int(n) == n) return n; else return int(n) + 1 }
function printheader(i, nitems) {
printf("%s", "<big><big>Page: ")
for (page=1; page<=ceiling(nitems/itemsperpage); page++) {
if (ceiling(i/itemsperpage) == page) printf(" %d", page)
else printf(" <a href=\"/chron/%d\">%d</a>", page, page) }
print "</big></big>"; print ""; print "<table>" }
function printfooter(i, nitems) { print ""; print "</table>" }
function printseparator(i, nitems) { print ""; print "<!--nextpage-->\n" }
' $PRAXIS/praxis.info > $PRAXIS/pages/chron