diff --git a/bin/controller.rc b/bin/controller.rc index ef54a57..15f33aa 100755 --- a/bin/controller.rc +++ b/bin/controller.rc @@ -1,10 +1,11 @@ #!/usr/local/plan9/bin/rc path=(. ./bin $PLAN9/bin /bin/ /usr/bin) -ifs='/' { args = `{ echo -n $REQUEST_URI | sed -e 's/\?.*//' -e 's/[^a-zA-Z0-9_+\-\/]//g' } } -args=`{echo $args | tr -d ' -'} -cd .. +uri = `{echo -n $REQUEST_URI | sed 's/\?.*//; s/[^a-zA-Z0-9_+\-\/]//g'} +ifs='/' { + args = `{echo -n $uri} +} +cd .. # default config site=$SERVER_NAME @@ -16,87 +17,86 @@ siteSubTitle='' title='' template=_default sidebar=sidebar - +basedir=/gsoc/www +baseuri=http://$site # Title fn gentitle { -echo '

'$"siteTitle' '$"siteSubTitle'

' + echo '

' ^ $"siteTitle ^ '' ^ $"siteSubTitle ^ '

' } +dirfilter = '/\/[._]/d; s,^\./,,; s,\.md$,,;' + # Sidebar fn menu { - ls -F $1 | grep -v '/_[^/]*' | sed -e 's,^./,,' -e 's,\.md$,,' | awk ' + ls -F $1 | sed $dirfilter | awk -F/ ' BEGIN { print "" } - /^([a-zA-Z0-9+_\-]+[\/*]?)+$/ && ! /index$/ { + /^([a-zA-Z0-9+_\-]+[\/*]?)+$/ && $NF != "index" { isdir = match($0, "/$") - sub("[*/]$", "") # The '*' makes no sense to me - - d = "" - if(isdir) - d = "/" - bname = $0 + sub("[*/]$", "") + + path = bname = $0 sub("^(.*/)?([0-9]+_)?", "", bname) gsub("_", " ", bname) - bname = bname d + if(isdir) { + bname = bname "/" + path = $0 "/" + } - if(index(ENVIRON["REQUEST_URI"], "/" $0) == 1) { + if(index(ENVIRON["REQUEST_URI"], "/" path) == 1) { if(isdir) { - print "
  • » " bname "" - system("rc -c ''menu " $0 "''") + print "
  • » " bname "" + system("rc -c ''menu " path "''") } else { - print "
  • » " bname "" + print "
  • » " bname "" } } else - print "
  • › " bname "" + print "
  • › " bname "" print "
  • " - }' - } fn gensidebar { - d=`{pwd} - cd $sitedir - menu . - cd $d + @{ + cd $sitedir + menu . + } } fn sortedBlogPostList { + # the /./ is added so we can sort -t. and order only the file name ls $*^'/./' | grep '[0-9]+.*\.md$'| sort -r -t. +1 } # Body fn genbody { - if ( test -f $"body^'.md' ) { - cat $"body^'.md' | markdown.pl - } - if not if ( test -f $"body^'.tpl' ) - template.awk $"body^'.tpl' | rc - if not { - if ( ~ $#blogDirs 0 ) { - if ( ~ $body */index ) { - echo '

    ' `{basename `{basename -d $body}}'

    ' - echo '' - } - if not { template.awk inc/404.tpl | rc } - } + if ( test -f $body.md ) + markdown.pl < $body.md + if not if ( test -f $body.tpl ) + template.awk $body.tpl | rc + if not if ( ~ $body */blog/index */blog//index && ~ $#blogDirs 0 ) + blogDirs = `{basename -d $body} + if not if(~ $body */index && ~ $#blogDirs 0) { + echo '

    ' `{basename `{basename -d $body}}'

    ' + echo '' } - - if (! ~ $#blogDirs 0 && ~ $body */index ) { - if ( ! ~ $#blogTitle 0 ) + if not if(~ $#blogDirs 0) + template.awk inc/404.tpl | rc + + # Technically wrong. Will spit out blog entries after 404 for /blog/foo, for instance. + if(! ~ $#blogDirs 0) { + if ( ! ~ $blogTitle '' ) echo '

    '$"blogTitle'

    ' - # the /./ is added so we can sort -t. and order only the file name - for ( i in `{ sortedBlogPostList $blogDirs } ) { - t=`{basename $i|sed -e 's/^[0-9\-]*_(.*)\.md$/\1/' -e 's/_/ /g' } - du=`{ls -l $i } - #echo '

    ' $"t 'by '$"$du(4)' (Last mod: '$du(7) $du(8) $du(9)')

    ' - echo '## ' $"t '*(By '$du(4)' Last mod: ' ( $du(7 8 9) ) ')*' - cat $i + for ( f in `{ sortedBlogPostList $blogDirs } ) { + title=`{basename $f | sed 's/^[0-9\-]*_(.*)\.md$/\1/; s/_/ /g' } + du=`{ls -l $f} + echo '##' $title '*('By $du(4) Last mod: $du(7 8 9) ')*' + cat $f echo } | markdown.pl } @@ -105,33 +105,93 @@ fn genbody { . etc/initrc -if (! ~ $#args 0 && ! ~ $args '') { +if (! ~ $args '') { title=$args($#args) title=`{echo $title | sed 's/_/ /g' } - body=`{ echo -n $"args |sed 's, ,/,g' } + body=$uri } -l=$sitedir -for ( i in / $args ) { - l = $l'/'$i - if ( test -f $l/_config ) { - . $l/_config - } -} +fpath=$sitedir +for ( i in '' $args ) { + fpath = $fpath/$i + if ( test -f $fpath/_config ) + . $fpath/_config +} template=$sitedir/$template.tpl -if (! ~ $#sidebar 0) { sidebar=tpl/_inc/$sidebar.tpl } -if (test -d $sitedir/$body) { +body=$sitedir/$body +if (! ~ $#sidebar 0) + sidebar=tpl/_inc/$sidebar.tpl +if (test -d $body) body=$body/index + +# RSS +fn statpost { + f = $1 + uri = `{echo $f | sed 's,^'$basedir',,'} + title=`{basename $f | sed 's/^[0-9\-]*_(.*)\.md$/\1/; s/_/ /g' } + stat=`{stat -c '%Y %U' $f} + date=`{/bin/date -Rd @$stat(1)} + uri=$baseuri^`{cleanname `{echo -n $uri | sed 's/\.(md|tpl)//g'}} + by=$stat(2) + ifs=() { + summary=`{awk -v max'='1024 '{ + nc += 1 + length; + if(nc > max) { + print substr($0, 1, nc - max) "..." + exit + } + print + }' $f | sed 's/\]\]>/Fucking goddamn XML garbage/g'} + } } -body=`{echo $sitedir/^$"body | sed 's, ,/,' } +fn template { + template.awk | rc | + awk '{ + buf = buf $0"\n" + if(length(buf) > 8192) { + printf "%s", buf + buf = "" + } + } + END{ printf "%s", buf }' +} +if(! ~ $REQUEST_URI */index.rss) { + cat $headers $template | template + exit +} -template.awk $headers | rc -template.awk $template | rc +uri = `{echo $uri | sed 's/indexrss$//'} +uri=$baseuri$"uri +# Should be in a separate file. +cat <<'!' | template +Content-Type: text/xml; charset=utf-8 + + + + + %($siteTitle%) + %($uri%) + %($blogDesc%) + en-us + Tom Duff's rc, and Kris Maglione's clever hackery + Uriel Mangado <uriel99@gmail.com> +%{ + for(f in `{sortedBlogPostList $blogDirs}) { + statpost $f +%} + %($title%) + %($by%)@noreply.cat-v.org + %($uri%) + %($uri%) + %($date%) + %($summary%)]]> + +% } + + +! -# Debug junk -#echo '
    '
    -#env