From 9cb56dabb676391a9382731347e8d2b07b9437a5 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Sun, 7 Apr 2024 13:25:49 +0200 Subject: big cleanup --- README | 79 -- apps/blagh/app.rc | 142 -- apps/blagh/atom.tpl | 58 - apps/blagh/convert.rc | 20 - apps/blagh/jsonfeed.tpl | 35 - apps/blagh/new_post.tpl | 11 - apps/blagh/rss20.tpl | 43 - apps/bridge/app.rc | 103 -- apps/bridge/comments_list.tpl | 13 - apps/bridge/foot.tpl | 37 - apps/dirdir/app.rc | 40 - apps/dirdir/edit.tpl | 25 - apps/dirdir/sidebar_controls.tpl | 3 - apps/duckduckgo/HOWTO | 20 - apps/duckduckgo/app.rc | 30 - apps/duckduckgo/footer.inc.sample | 3 - apps/hello/app.rc | 10 - apps/paste/app.rc | 45 - apps/wman/app.rc | 89 -- apps/wman/man_page.tpl | 3 - apps/wman/page_list.tpl | 11 - apps/wman/search.tpl | 20 - apps/wman/section_list.tpl | 11 - bin/aux/addwuser.rc | 33 - bin/aux/bpst.rc | 64 - bin/aux/gensitemaptxt.rc | 14 - bin/aux/runtsts.rc | 16 - bin/contrib/fix-rc-scripts | 27 - bin/contrib/hgweb.config | 12 - bin/contrib/hgwebdir.cgi | 47 - bin/contrib/markdown.pl | 1447 -------------------- bin/contrib/md2html.awk | 427 ------ bin/contrib/rc-httpd/handlers/authorize | 6 - bin/contrib/rc-httpd/handlers/cgi | 46 - bin/contrib/rc-httpd/handlers/dir-index | 111 -- bin/contrib/rc-httpd/handlers/error | 43 - bin/contrib/rc-httpd/handlers/redirect | 30 - bin/contrib/rc-httpd/handlers/serve-static | 43 - bin/contrib/rc-httpd/handlers/static-or-cgi | 14 - bin/contrib/rc-httpd/handlers/static-or-index | 5 - bin/contrib/rc-httpd/lib/urldecode.awk | 39 - bin/contrib/rc-httpd/rc-httpd | 102 -- bin/contrib/rc-httpd/select-handler | 20 - bin/contrib/tcp80 | 7 - bin/contrib/urldecode.awk | 39 - bin/contrib/urlencode.awk | 126 -- bin/contrib/webserver.rc | 30 - bin/md2html.awk | 427 ++++++ bin/werc.rc | 5 - etc/initrc | 12 +- etc/users/GROUP_AND_USER_ACCOUNTS | 1 - files/djv.tar | Bin 0 -> 1822720 bytes files/djvmono.tar | Bin 0 -> 993280 bytes files/faces.patch | 105 ++ files/ndb.diff | 70 + files/websocket-webfs.patch | 565 ++++++++ images/2048.gif | Bin 0 -> 4157248 bytes images/acme-in-action.png | Bin 0 -> 286658 bytes images/cdude.png | Bin 0 -> 20432 bytes images/creepy_glenda.jpg | Bin 0 -> 36669 bytes images/cursed.png | Bin 0 -> 18433 bytes images/discordgif.gif | Bin 0 -> 9196759 bytes images/djvfonts.png | Bin 0 -> 138021 bytes images/favicon.ico | Bin 0 -> 2576 bytes images/fear.jpg | Bin 0 -> 48380 bytes images/hehegame.gif | Bin 0 -> 5903435 bytes images/hehegame2.gif | Bin 0 -> 5903435 bytes images/hehegame3.gif | Bin 0 -> 10636922 bytes images/kykeliky.png | Bin 0 -> 1055680 bytes images/linuxreverse.gif | Bin 0 -> 201797 bytes images/mordor.gif | Bin 0 -> 1620703 bytes images/rustdude.png | Bin 0 -> 18584 bytes images/walkoff.png | Bin 0 -> 19140 bytes images/wip-discord.png | Bin 0 -> 55180 bytes lib/footer.inc | 8 +- lib/headers.tpl | 11 +- lib/style.css | 122 ++ lib/top_bar.inc | 21 +- pub/default_favicon.ico | Bin 2150 -> 0 bytes pub/style/imgs/sgl.png | Bin 14763 -> 0 bytes pub/style/sinorca-screen-alt.css | 292 ---- pub/style/style.cat-v.css | 50 - pub/style/style.css | 122 -- pub/style/style.werc140.css | 330 ----- pub/style/style_old.css | 330 ----- sites/apl.pmikkelsen.com/_werc/lib/footer.inc | 1 - sites/apl.pmikkelsen.com/_werc/lib/top_bar.inc | 8 - sites/apl.pmikkelsen.com/favicon.ico | Bin 2576 -> 0 bytes sites/apl.pmikkelsen.com/index.md | 2 +- sites/lpa.pmikkelsen.com/_werc/lib/footer.inc | 1 - sites/lpa.pmikkelsen.com/_werc/lib/top_bar.inc | 8 - sites/lpa.pmikkelsen.com/favicon.ico | Bin 2576 -> 0 bytes sites/pmikkelsen.com/_files/djv.tar | Bin 1822720 -> 0 bytes sites/pmikkelsen.com/_files/djvmono.tar | Bin 993280 -> 0 bytes sites/pmikkelsen.com/_files/faces.patch | 105 -- sites/pmikkelsen.com/_files/ndb.diff | 70 - sites/pmikkelsen.com/_files/websocket-webfs.patch | 565 -------- .../_tmp/agda-dfa/Agda.Primitive.Cubical.html | 55 - .../_tmp/agda-dfa/Agda.Primitive.html | 35 - sites/pmikkelsen.com/_tmp/agda-dfa/Agda.css | 39 - sites/pmikkelsen.com/_tmp/agda-dfa/DFA.html | 115 -- sites/pmikkelsen.com/_werc/config | 2 +- sites/pmikkelsen.com/_werc/lib/footer.inc | 1 - sites/pmikkelsen.com/_werc/lib/top_bar.inc | 11 - sites/pmikkelsen.com/favicon.ico | Bin 2576 -> 0 bytes sites/pmikkelsen.com/images/2048.gif | Bin 4157248 -> 0 bytes sites/pmikkelsen.com/images/acme-in-action.png | Bin 286658 -> 0 bytes sites/pmikkelsen.com/images/cdude.png | Bin 20432 -> 0 bytes sites/pmikkelsen.com/images/creepy_glenda.jpg | Bin 36669 -> 0 bytes sites/pmikkelsen.com/images/cursed.png | Bin 18433 -> 0 bytes sites/pmikkelsen.com/images/discordgif.gif | Bin 9196759 -> 0 bytes sites/pmikkelsen.com/images/djvfonts.png | Bin 138021 -> 0 bytes sites/pmikkelsen.com/images/fear.jpg | Bin 48380 -> 0 bytes sites/pmikkelsen.com/images/hehegame.gif | Bin 5903435 -> 0 bytes sites/pmikkelsen.com/images/hehegame2.gif | Bin 5903435 -> 0 bytes sites/pmikkelsen.com/images/hehegame3.gif | Bin 10636922 -> 0 bytes sites/pmikkelsen.com/images/kykeliky.png | Bin 1055680 -> 0 bytes sites/pmikkelsen.com/images/linuxreverse.gif | Bin 201797 -> 0 bytes sites/pmikkelsen.com/images/mordor.gif | Bin 1620703 -> 0 bytes sites/pmikkelsen.com/images/rustdude.png | Bin 18584 -> 0 bytes sites/pmikkelsen.com/images/walkoff.png | Bin 19140 -> 0 bytes sites/pmikkelsen.com/images/wip-discord.png | Bin 55180 -> 0 bytes .../pmikkelsen.com/me/how-i-started-using-acme.md | 2 +- sites/pmikkelsen.com/plan9/discord.md | 2 +- sites/pmikkelsen.com/plan9/fonts.md | 6 +- sites/pmikkelsen.com/plan9/lets_encrypt.md | 2 +- .../plan9/mounting-9p-over-drawterm.md | 2 +- sites/pmikkelsen.com/plan9/webfs-websocket.md | 4 +- sites/prolog.pmikkelsen.com/_werc/lib/footer.inc | 1 - sites/prolog.pmikkelsen.com/_werc/lib/top_bar.inc | 8 - sites/prolog.pmikkelsen.com/favicon.ico | Bin 2576 -> 0 bytes sites/prolog.pmikkelsen.com/index.md | 2 +- tpl/_debug.tpl | 29 - tpl/_users/login.tpl | 18 - 134 files changed, 1319 insertions(+), 5845 deletions(-) delete mode 100644 README delete mode 100644 apps/blagh/app.rc delete mode 100644 apps/blagh/atom.tpl delete mode 100755 apps/blagh/convert.rc delete mode 100644 apps/blagh/jsonfeed.tpl delete mode 100644 apps/blagh/new_post.tpl delete mode 100644 apps/blagh/rss20.tpl delete mode 100755 apps/bridge/app.rc delete mode 100755 apps/bridge/comments_list.tpl delete mode 100755 apps/bridge/foot.tpl delete mode 100755 apps/dirdir/app.rc delete mode 100755 apps/dirdir/edit.tpl delete mode 100755 apps/dirdir/sidebar_controls.tpl delete mode 100644 apps/duckduckgo/HOWTO delete mode 100755 apps/duckduckgo/app.rc delete mode 100644 apps/duckduckgo/footer.inc.sample delete mode 100755 apps/hello/app.rc delete mode 100755 apps/paste/app.rc delete mode 100755 apps/wman/app.rc delete mode 100755 apps/wman/man_page.tpl delete mode 100755 apps/wman/page_list.tpl delete mode 100755 apps/wman/search.tpl delete mode 100755 apps/wman/section_list.tpl delete mode 100755 bin/aux/addwuser.rc delete mode 100755 bin/aux/bpst.rc delete mode 100755 bin/aux/gensitemaptxt.rc delete mode 100755 bin/aux/runtsts.rc delete mode 100755 bin/contrib/fix-rc-scripts delete mode 100755 bin/contrib/hgweb.config delete mode 100755 bin/contrib/hgwebdir.cgi delete mode 100755 bin/contrib/markdown.pl delete mode 100755 bin/contrib/md2html.awk delete mode 100755 bin/contrib/rc-httpd/handlers/authorize delete mode 100755 bin/contrib/rc-httpd/handlers/cgi delete mode 100755 bin/contrib/rc-httpd/handlers/dir-index delete mode 100755 bin/contrib/rc-httpd/handlers/error delete mode 100755 bin/contrib/rc-httpd/handlers/redirect delete mode 100755 bin/contrib/rc-httpd/handlers/serve-static delete mode 100755 bin/contrib/rc-httpd/handlers/static-or-cgi delete mode 100755 bin/contrib/rc-httpd/handlers/static-or-index delete mode 100755 bin/contrib/rc-httpd/lib/urldecode.awk delete mode 100755 bin/contrib/rc-httpd/rc-httpd delete mode 100755 bin/contrib/rc-httpd/select-handler delete mode 100755 bin/contrib/tcp80 delete mode 100755 bin/contrib/urldecode.awk delete mode 100755 bin/contrib/urlencode.awk delete mode 100755 bin/contrib/webserver.rc create mode 100755 bin/md2html.awk delete mode 100644 etc/users/GROUP_AND_USER_ACCOUNTS create mode 100644 files/djv.tar create mode 100644 files/djvmono.tar create mode 100644 files/faces.patch create mode 100644 files/ndb.diff create mode 100644 files/websocket-webfs.patch create mode 100644 images/2048.gif create mode 100644 images/acme-in-action.png create mode 100644 images/cdude.png create mode 100644 images/creepy_glenda.jpg create mode 100644 images/cursed.png create mode 100644 images/discordgif.gif create mode 100644 images/djvfonts.png create mode 100644 images/favicon.ico create mode 100644 images/fear.jpg create mode 100644 images/hehegame.gif create mode 100644 images/hehegame2.gif create mode 100644 images/hehegame3.gif create mode 100644 images/kykeliky.png create mode 100644 images/linuxreverse.gif create mode 100644 images/mordor.gif create mode 100644 images/rustdude.png create mode 100644 images/walkoff.png create mode 100644 images/wip-discord.png create mode 100644 lib/style.css delete mode 100755 pub/default_favicon.ico delete mode 100755 pub/style/imgs/sgl.png delete mode 100755 pub/style/sinorca-screen-alt.css delete mode 100644 pub/style/style.cat-v.css delete mode 100644 pub/style/style.css delete mode 100755 pub/style/style.werc140.css delete mode 100755 pub/style/style_old.css delete mode 100644 sites/apl.pmikkelsen.com/_werc/lib/footer.inc delete mode 100644 sites/apl.pmikkelsen.com/_werc/lib/top_bar.inc delete mode 100644 sites/apl.pmikkelsen.com/favicon.ico delete mode 100644 sites/lpa.pmikkelsen.com/_werc/lib/footer.inc delete mode 100644 sites/lpa.pmikkelsen.com/_werc/lib/top_bar.inc delete mode 100644 sites/lpa.pmikkelsen.com/favicon.ico delete mode 100644 sites/pmikkelsen.com/_files/djv.tar delete mode 100644 sites/pmikkelsen.com/_files/djvmono.tar delete mode 100644 sites/pmikkelsen.com/_files/faces.patch delete mode 100644 sites/pmikkelsen.com/_files/ndb.diff delete mode 100644 sites/pmikkelsen.com/_files/websocket-webfs.patch delete mode 100644 sites/pmikkelsen.com/_tmp/agda-dfa/Agda.Primitive.Cubical.html delete mode 100644 sites/pmikkelsen.com/_tmp/agda-dfa/Agda.Primitive.html delete mode 100644 sites/pmikkelsen.com/_tmp/agda-dfa/Agda.css delete mode 100644 sites/pmikkelsen.com/_tmp/agda-dfa/DFA.html delete mode 100644 sites/pmikkelsen.com/_werc/lib/footer.inc delete mode 100644 sites/pmikkelsen.com/_werc/lib/top_bar.inc delete mode 100644 sites/pmikkelsen.com/favicon.ico delete mode 100644 sites/pmikkelsen.com/images/2048.gif delete mode 100644 sites/pmikkelsen.com/images/acme-in-action.png delete mode 100644 sites/pmikkelsen.com/images/cdude.png delete mode 100644 sites/pmikkelsen.com/images/creepy_glenda.jpg delete mode 100644 sites/pmikkelsen.com/images/cursed.png delete mode 100644 sites/pmikkelsen.com/images/discordgif.gif delete mode 100644 sites/pmikkelsen.com/images/djvfonts.png delete mode 100644 sites/pmikkelsen.com/images/fear.jpg delete mode 100644 sites/pmikkelsen.com/images/hehegame.gif delete mode 100644 sites/pmikkelsen.com/images/hehegame2.gif delete mode 100644 sites/pmikkelsen.com/images/hehegame3.gif delete mode 100644 sites/pmikkelsen.com/images/kykeliky.png delete mode 100644 sites/pmikkelsen.com/images/linuxreverse.gif delete mode 100644 sites/pmikkelsen.com/images/mordor.gif delete mode 100644 sites/pmikkelsen.com/images/rustdude.png delete mode 100644 sites/pmikkelsen.com/images/walkoff.png delete mode 100644 sites/pmikkelsen.com/images/wip-discord.png delete mode 100644 sites/prolog.pmikkelsen.com/_werc/lib/footer.inc delete mode 100644 sites/prolog.pmikkelsen.com/_werc/lib/top_bar.inc delete mode 100644 sites/prolog.pmikkelsen.com/favicon.ico delete mode 100644 tpl/_debug.tpl delete mode 100644 tpl/_users/login.tpl diff --git a/README b/README deleted file mode 100644 index b4dc773..0000000 --- a/README +++ /dev/null @@ -1,79 +0,0 @@ -werc - a minimalist document management system ----------------------------------------------- - -Werc is a content management system and web (anti-)framework designed to be simple to -use, simple to setup, simple to hack on, and not get in the way while allowing -users easy customization. - -For more information see the official website: http://werc.cat-v.org/ - - -Installation ------------- - -Requirements: - -* An http server that can handle CGIs -* Plan 9 from User Space: http://swtch.com/plan9port, - Or 9base-tip: http://tools.suckless.org/9base, - Or frontbase: http://openbsd.stanleylieber.com/frontbase - -Note: Werc by default expects the Plan 9 tools to be installed under -/bin/, if you have installed them elsewhere you will need to edit the -#! line in bin/werc.rc and customize the $plan9port variable in your -etc/initrc.local. - - -Instructions: - -Untar werc at your desired location, configure httpd to use -/path-to-your-werc-installation/bin/werc.rc as a cgi-script, it is recommended -that you make werc.rc handle all non-static files (this can be done by setting -it up as your 404 handler) and setup your virtual hosts to handle static files -by setting the document root for the domain to -/path-to-werc-installation/sites/yourdomain.com/, and create a directory for -your web site under sites/ where you can start adding content right away. - -If you will want to allow updates via the web interface (eg., for wiki or -comments apps) make sure all files under sites/ are writable by the user your -cgi will run as, usually www-data, for example by doing: chown -R :www-data -sites/; chmod -R g+w sites/ - -If your Plan 9 binaries are located somewhere else than the standard /bin/ you -will need to edit the first line of bin/werc.rc (Note that p9p in particular is -picky about where it is located, once you run ./INSTALL you should *not* move -it to a different directory without running ./INSTALL again.) - -For general configuration options copy etc/initrc to etc/initrc.local and -customize it as needed. Site (and directory) specific options can be set in a -sites/example.com/_werc/config file inside the site's directory. To customize -templates and included files you can store your own version of the files in -lib/ under sites/example.com/_werc/lib. - -The source tree for the werc website is included under sites/werc.cat-v.org as -an example, feel free to use it as a template for your own site. - -For more details see the documentation section of the website: -http://werc.cat-v.org/docs/ - - -Contact -------- - -For comments, suggestions, bug reports or patches join the werc mailing list -at: http://werc.cat-v.org or the irc channel #cat-v in irc.freenode.org - -If you have a public website that uses werc I would love to hear about it and -get feedback about you experience setting it up. - -Thanks ------- - -Garbeam, Kris Maglione, sqweek, soul9, mycroftiv, maht, yiyus, cinap_lenrek, -khm and many others for their ideas, patches, testing and other contributions. - - -License -------- - -Werc is in the public domain. diff --git a/apps/blagh/app.rc b/apps/blagh/app.rc deleted file mode 100644 index c63689d..0000000 --- a/apps/blagh/app.rc +++ /dev/null @@ -1,142 +0,0 @@ -fn conf_enable_blog { - blagh_uri=$conf_wd - blagh_dirs=$* - if(~ $#blagh_dirs 0) - blagh_dirs=( . ) - conf_enable_app blagh - - if(~ $"conf_blog_editors '') - conf_blog_editors=blog-editors - - if(~ $"conf_max_posts_per_page '') - conf_max_posts_per_page=32 -} - -fn blagh_init { - if(~ $#blagh_dirs 0 && ~ $req_path */[bB]log/*) { - blagh_uri=`{echo $req_path | sed 's,(/[bB]log/).*,\1,'} - blagh_dirs=( . ) - } - - # Should not match sub-dirs! - if(! ~ $#blagh_dirs 0) { - # && test -d / `{echo '-a -d '^$blagh_root^$blagh_dirs} - blagh_url=$base_url^$blagh_uri - blagh_root=$sitedir^$blagh_uri - if(check_user $conf_blog_editors) { - editor_mode=on - if(~ $"post_arg_date '') - post_date=`{datei|sed 's,-,/,g'} - if not - post_date=$post_arg_date - ll_add handlers_bar_left echo 'Make a new post' - } - - if(~ $req_path $blagh_uri) { - handler_body_main=blagh_body - u=$blagh_uri'index' - extraHeaders=$"extraHeaders ^ \ -' - -' - } - if not if(~ $req_path $blagh_uri^index.atom) - blagh_setup_feed_handlers atom.tpl 'application/atom+xml' - - if not if(~ $req_path $blagh_uri^index.rss) - blagh_setup_feed_handlers rss20.tpl 'text/xml; charset=utf-8' - - if not if(~ $req_path $blagh_uri^feed.json) - blagh_setup_feed_handlers jsonfeed.tpl 'application/json; charset=utf-8' - - if not if(~ $req_path $blagh_uri^new_post && ! ~ $#editor_mode 0) { - handler_body_main=( tpl_handler `{get_lib_file blagh/new_post.tpl apps/blagh/new_post.tpl} ) - if(~ $REQUEST_METHOD POST) { - if(mkbpost $"post_arg_body $"post_date $"post_arg_title $post_arg_id) - post_redirect $blagh_uri - if not - notify_errors=$status - } - } - - } -} - -fn blagh_setup_feed_handlers { - handler_body_main=NOT_USED_by_blagh_feeds - res_tail=() - http_content_type=$2 - headers=() - master_template=apps/blagh/$1 # Should we allow tempalte override? -} - -fn blagh_body { - if (! ~ $"blogTitle '') - echo '

'$"blogTitle'

' - - # Direct links to feeds are disabled because they are not very useful, add clutter and might waste pagerank. - # An user can add this on their own using handlers_body_head anyway. - #echo '
(RSS Feed|Atom Feed)
' - - # XXX Not sure why this fixes issues with blog setup, probably bug in fltr_cache! - for(p in `{get_post_list $blagh_root^$blagh_dirs}) { - l=`{echo -n $p|sed 's!'$sitedir^'/?(.*)([0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9])(/[^/]+/)!\2 /\1\2\3!'} - sed '1s!.*![&]('^$l(2)^') ('^$l(1)^')!' < $p/index.md - echo # Needed extra \n so markdown doesn't mess up the formatting, probably can be done in sed. - } | $formatter - # XXX BUG! Markdown [references] break because multiple markdown documents are merged. Should format each blog post independently. - # TODO: use fltr_cache directly, that can fix the previous bug plus provide a perf boost by caching title generation. -} - -fn get_post_list { - # /./->/|/ done to sort -t| and order by date - # Note: $paths in blagh_dirs should not contain '/./' or '|' - ls -F $*^/./[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]/ >[2]/dev/null | sed -n '/'^$forbidden_uri_chars^'/d; s,/\./,/|/,; /\/$/p' | sort -r '-t|' +1 | sed -e 's,/+\|/+,/,' -e $conf_max_posts_per_page^'q' -} - -fn mkbpost { - bptext=$1 - bpdate=$2 - bptitle=$3 - bpid=$4 - _status=() - if(~ $"bptext '') - _status=($_status 'You need to provide a post body.') - if(! ~ $"bpdate [0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]) - _status=($_status 'Invalid date: '''^$"bpdate^'''') # XXX Should make semantic check. - - if(~ $#_status 0) { - umask 002 # Let group write - if(! ~ $"bpid '') - bpid=`{echo -n '-'^$bpid | sed 's/'$forbidden_uri_chars'+/_/g; 1q'} - - ddir=$blagh_root^$bpdate^'/' - n=`{ls $ddir >[2]/dev/null |wc -l} - - mkdir -p $ddir/$"n^$"bpid/ - { - if(! ~ $"bptitle '') { - echo $bptitle - echo '=========================================' - } - # TODO: Enable metadata - #echo '* Posted:' `{date} - #if(! ~ $#logged_user 0) - # echo '* Author: '$logged_user - echo - echo $bptext - }> $ddir/$"n^$"bpid/index.md - - # Experimental support for http://pubsubhubbub.googlecode.com/ - if(! ~ $"conf_blog_pubsubdub_hub '') { - ifs='' { p=`{echo $req_url|sed 's/new_post$/index.atom/'|url_encode } } - dprint hget -p 'hub.mode=publish&hub.url='^$"p $conf_blog_pubsubdub_hub - hget -d -h -p 'hub.mode=publish&hub.url='^$"p $conf_blog_pubsubdub_hub >[1=2] & - } - } - status=$_status -} - -fn strip_title_from_md_file { - sed '1N; /^.*\n===*$/N; /.*\n===*\n$/d' -} diff --git a/apps/blagh/atom.tpl b/apps/blagh/atom.tpl deleted file mode 100644 index 97c665f..0000000 --- a/apps/blagh/atom.tpl +++ /dev/null @@ -1,58 +0,0 @@ - - -%{ -# See for more info:http://www.tbray.org/ongoing/When/200x/2005/07/27/Atomic-RSS -fn statpost { - f = $1 - - post_uri=$base_url^`{cleanname `{echo $f | sed -e 's!^'$sitedir'!!'}}^'/' - title=`{read $f/index.md} - by=`{ls -m $f | sed 's/^\[//g; s/].*$//g' >[2]/dev/null} - ifs=() { summary=`{cat $f/index.md | strip_title_from_md_file | ifs=$difs {$formatter} } } -} -# rfc3339 date when feed was last updated. -fupdated = `{ndate -a `{date `{mtime `{ls $blagh_root$blagh_dirs/[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]/[0-9] | tail -1} | awk '{print $1}'}}} -%} - - - -% if(! ~ $"conf_blog_pubsubdub_hub '') { -% echo '' -% } - - - %($base_url^$req_path%) - - - <![CDATA[%($siteTitle%)]]> - - - %($fupdated%) - - -% for(f in `{get_post_list $blagh_root$blagh_dirs}) { -% statpost $f - - -% # Maybe we should be smarter, see: http://diveintomark.org/archives/2004/05/28/howto-atom-id, example: tag:intertwingly.net,2004:2899 - %($post_uri%) - - <![CDATA[%($title%)]]> -% # - - -
- -
- -% # rfc3339 date when entry was last updated. -% eupdated=`{ndate -a `{date `{mtime $f | awk '{print $1}'}}} - %($eupdated%) -
- -% } - -
- -% exit diff --git a/apps/blagh/convert.rc b/apps/blagh/convert.rc deleted file mode 100755 index 0640805..0000000 --- a/apps/blagh/convert.rc +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env rc - -path=($PLAN9/bin/ $path) - -for(p in *.md) { - echo - echo '=========================' - echo p $p - pp=`{echo $p | sed 's/^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])[\-_](.*).md$/\1 \2 \3 \4/' } - echo pp $pp - - d=$pp(1)^'/'^$pp(2)^'/'^$pp(3)^'/'^$pp(4)^'/' - - mkdir -p $d - echo $pp(4) | sed -e 's/^[0-9]_//; s/_/ /g;' > $d/index.md - echo '=================================' >> $d/index.md - echo >> $d/index.md - cat $p >> $d/index.md - -} diff --git a/apps/blagh/jsonfeed.tpl b/apps/blagh/jsonfeed.tpl deleted file mode 100644 index fd97ed4..0000000 --- a/apps/blagh/jsonfeed.tpl +++ /dev/null @@ -1,35 +0,0 @@ -{ -"version": "https://jsonfeed.org/version/1", -"title": "%($siteTitle%)", -"home_page_url": "%($"base_url%)", -"feed_url": "%($"base_url^$"req_path%)", -"items": [ -%{ -fn statpost { - f = $1 - post_uri=$base_url^`{cleanname `{echo $f | sed -e 's!^'$sitedir'!!'}}^'/' - title=`{read $f/index.md} - #ifs=() { summary=`{cat $f/index.md | crop_text 1024 ... | $formatter } } - ifs=() { summary=`{cat $f/index.md | strip_title_from_md_file | ifs=$difs {$formatter| sed 's/"/\\"/g' | tr -d '\012' } } } -} -%} -% #for(f in `{get_post_list $blagh_root$blagh_dirs}) { -% -% postlist=`{get_post_list $blagh_root$blagh_dirs} -% postcount=0 -% for(f in $postlist) { -% statpost $f - { - "id": "%($post_uri%)", - "url": "%($post_uri%)", - "title": "%($title%)", - "content_html": "%($summary%)" - } -% postcount = `{echo $postcount 1+p | dc} -% if (! ~ $#postlist $postcount) { echo , } -% } -] -} - -% exit - diff --git a/apps/blagh/new_post.tpl b/apps/blagh/new_post.tpl deleted file mode 100644 index bd521c4..0000000 --- a/apps/blagh/new_post.tpl +++ /dev/null @@ -1,11 +0,0 @@ -
-% notices_handler -
- Submit a new blog post -
- - - - -
-
diff --git a/apps/blagh/rss20.tpl b/apps/blagh/rss20.tpl deleted file mode 100644 index 0cba818..0000000 --- a/apps/blagh/rss20.tpl +++ /dev/null @@ -1,43 +0,0 @@ - - -%{ -fn statpost { - f = $1 - post_uri = `{echo $f | sed 's,^'$sitedir',,'} - title=`{read $f/index.md} - post_uri=$base_url^`{cleanname `{echo $f | sed -e 's!^'$sitedir'!!'}}^'/' - by=`{ls -m $f | sed 's/^\[//g; s/].*$//g' >[2]/dev/null} - ifs=() {summary=`{ cat $f/index.md |strip_title_from_md_file| ifs=$difs {$formatter | escape_html} }} -} - -%} - - - - - <![CDATA[%($siteTitle%)]]> - %($base_url^$req_path%) - - en-us - -%{ - # uriel99+rss@gmail.com (Uriel) - # rfc2822 last time channel content changed. - lbd=`{ndate -m `{date `{mtime `{ls $blagh_root$blagh_dirs/[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]/[0-9] | tail -1} | awk '{print $1}'}}} - echo ''$"lbd'' - # rfc2822 publication date for content in the channel. - pubdate=`{ndate -m} - for(f in `{get_post_list $blagh_root$blagh_dirs}){ - statpost $f -%} - - <![CDATA[%($title%)]]> - - %($post_uri%) - %($post_uri%) - %($pubdate%) - %($summary%) - -% } - - diff --git a/apps/bridge/app.rc b/apps/bridge/app.rc deleted file mode 100755 index 40477ba..0000000 --- a/apps/bridge/app.rc +++ /dev/null @@ -1,103 +0,0 @@ -comment_file_types=(md html) - -fn conf_enable_comments { - if(~ $1 -n) { - allow_new_user_comments=yes - shift - } - if not if(~ $1 -a) { - bridge_anon_comments=yes - } - enable_comments=yes - groups_allowed_comments=$* - conf_enable_app bridge -} - -fn bridge_init { - if(~ $#enable_comments 1 && ! ~ `{ls $local_path.$comment_file_types >[2]/dev/null|wc -l} 0) { - - comments_dir=$sitedir$req_path'_werc/comments' - if(~ $REQUEST_METHOD GET && test -d $comments_dir) - ll_add handlers_body_foot template apps/bridge/comments_list.tpl - - if(check_user $groups_allowed_comments || {~ $#logged_user 0 && ~ 1 $#allow_new_user_comments $#bridge_anon_comments}) { - - if(~ $#post_arg_bridge_post 1) { - ll_add handlers_body_foot template apps/bridge/foot.tpl - - if(mk_new_comment $comments_dir) - post_redirect $base_url^$req_path - if not - saved_comment_text=$post_arg_comment_text - } - if not if(~ $REQUEST_METHOD GET) - ll_add handlers_body_foot template apps/bridge/foot.tpl - } - if not if(~ $REQUEST_METHOD GET) - ll_add handlers_body_foot echo '

To post a comment you need to login first.

' - } -} - -fn validate_new_user { - usr=$1; pass=$2; pass2=$3 - _status=() - - if(~ $"usr '' || ! echo $usr |sed 1q|grep -s '^'$allowed_user_chars'+$') - _status='Requested user name is invalid, must match: '^$allowed_user_chars^'+' - if not if(test -d etc/users/$usr) - _status='Sorry, user name '''^$usr^''' already taken, please pick a different one.' - - if(~ $"pass '' || ! ~ $"pass $"pass2) - _status=($_status 'Provided passwords don''t match.') - - status=$_status -} - - -fn mk_new_comment { - _status=() - dir=$1 - if(~ $"post_arg_comment_text '') - _status='Provide a comment!' - if not if(~ $#logged_user 0) { - if(! ~ $#allow_new_user_comments 0) { - if(validate_new_user $"post_arg_comment_user $post_arg_comment_passwd $post_arg_comment_passwd2) { - u=$post_arg_comment_user':'$post_arg_comment_passwd - dir=$comments_dir^'_pending' - # XXX: This doesn't work because we then do a redirect. - notify_notes='Saved comment and registration info, they will be enabled when approved by an admin.' - } - if not - _status=$status - } - if not if(! ~ $#bridge_anon_comments 0) { - if(~ $"post_arg_ima_robot 'not') - u='Glenda' # Anonymous - if not - _status='You are a robot!' - } - if not - _status='You need to log in to comment.' - } - if not if(check_user $groups_allowed_comments) - u=$logged_user - if not - _status='You are not a member of a group allowed to comment.' - - if(~ $#_status 0) { - umask 002 - - dir=$dir'/'`{date -n} # FIXME Obvious race - mkdir -m 775 -p $dir && - echo $u > $dir/user && - echo $current_date_time > $dir/posted && - echo $post_arg_comment_text > $dir/body - _s=$status - if(! ~ $"_s '') { - dprint 'ERROR XXX: Could not create comment: ' $_s - _status='Could not post comment due internal error, sorry.' - } - } - notify_errors=$_status - status=$_status -} diff --git a/apps/bridge/comments_list.tpl b/apps/bridge/comments_list.tpl deleted file mode 100755 index 03e0ddc..0000000 --- a/apps/bridge/comments_list.tpl +++ /dev/null @@ -1,13 +0,0 @@ -
-

Comments

- -% for(c in `{ls $comments_dir/}) { -% if(test -s $c/body) { -
-
By: %(`{cat $c/user}%) (%(`{cat $c/posted}%)) -
-% cat $c/body | escape_html | sed 's,$,
,' -
-% } -% } - diff --git a/apps/bridge/foot.tpl b/apps/bridge/foot.tpl deleted file mode 100755 index 0dad21d..0000000 --- a/apps/bridge/foot.tpl +++ /dev/null @@ -1,37 +0,0 @@ -
- -% notices_handler -
- -
- - -% if(~ $#logged_user 0) { -% if(~ $#allow_new_user_comments 1) { - - - - - -
- Enter your desired user name/password and after your comment has been reviewed by an admin it will be posted and your account will be enabled. If you are already registered please login before posting. -
-% } -% if not if(~ $#bridge_anon_comments 1) { - -% } -% } -
diff --git a/apps/dirdir/app.rc b/apps/dirdir/app.rc deleted file mode 100755 index 1aa9cbd..0000000 --- a/apps/dirdir/app.rc +++ /dev/null @@ -1,40 +0,0 @@ -fn conf_enable_wiki { - enable_wiki=yes - wiki_editors_groups=$* - conf_enable_app dirdir -} - -fn dirdir_init { - if(! ~ $#enable_wiki 0 && check_user $wiki_editors_groups) { - lp=$local_path - # werc.rc doesn't append /index when $local_path doesn't exist - # maybe it should, but for now we can fix it up here. - if(~ $lp */) - lp=$lp^'index' - dirdir_file=$lp.md - dirdir_dir=$dirdir_file^'_werc/dirdir/' - - if(~ 1 $#post_arg_dirdir_edit $#post_arg_dirdir_preview) - handler_body_main=(tpl_handler `{get_lib_file dirdir/edit.tpl apps/dirdir/edit.tpl}) - - if not if(! ~ '' $"post_arg_dirdir_save $"post_arg_edit_text) - save_page - - if not if(~ $"handler_body_main '' || {~ $REQUEST_METHOD GET && test -f $local_path.md}) - ll_add handlers_bar_left tpl_handler apps/dirdir/sidebar_controls.tpl - } -} - -fn save_page { - dirdir_verdir=$dirdir_dir/^`{date -n}^/ - mkdir -p $dirdir_verdir - umask 002 - - # XXX Use a tmp file and mv(1) to ensure updates are atomic? - echo $logged_user > $dirdir_verdir/author - echo $post_arg_edit_text > $dirdir_verdir/data - echo $post_arg_edit_text > $dirdir_file - - post_redirect $base_url^$req_path - #notify_notes='Saved '$"req_path'!' -} diff --git a/apps/dirdir/edit.tpl b/apps/dirdir/edit.tpl deleted file mode 100755 index 1a5b206..0000000 --- a/apps/dirdir/edit.tpl +++ /dev/null @@ -1,25 +0,0 @@ -
-

Editing: %($req_path%)

-
-
- -
- - - DirDir documents are written using Markdown syntax. -
-
- -% if(! ~ $"post_arg_dirdir_preview '') { -

Preview:

-
-% echo $post_arg_edit_text | $formatter -
-% } diff --git a/apps/dirdir/sidebar_controls.tpl b/apps/dirdir/sidebar_controls.tpl deleted file mode 100755 index a897fc1..0000000 --- a/apps/dirdir/sidebar_controls.tpl +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/apps/duckduckgo/HOWTO b/apps/duckduckgo/HOWTO deleted file mode 100644 index 8bb952c..0000000 --- a/apps/duckduckgo/HOWTO +++ /dev/null @@ -1,20 +0,0 @@ -The default path for site search is /_search/. Assuming you want to keep -that default, you could enable site search like so: - - -mkdir -p /www/werc/sites/MYSITE/_search/_werc/ -echo 'conf_enable_duckduckgo' > /www/werc/sites/MYSITE/_search/_werc/config -mkdir -p /www/werc/sites/MYSITE/_werc/lib/ -cp /www/werc/apps/duckduckgo/footer.inc.sample /www/werc/sites/MYSITE/_werc/lib/footer.inc - -Searches will POST to /_search/ and from there get redirected to Duck Duck -Go with a site:$SERVER_NAME prefix. To have the search path URL be some- -thing different, you'll have to edit line 23 of app.rc to point to the new -path. - -TODO: -* Make it automatically work no matter which directory the app is enabled in. -* OR make the search path a configuration option. -* Provide a template for non-footer deployment -* Enable the search path itself to serve a search form to GET requests - diff --git a/apps/duckduckgo/app.rc b/apps/duckduckgo/app.rc deleted file mode 100755 index 72dd0ec..0000000 --- a/apps/duckduckgo/app.rc +++ /dev/null @@ -1,30 +0,0 @@ -fn conf_enable_duckduckgo { - enable_duckduckgo=yes - conf_enable_app duckduckgo - pageTitle='Site Search' -} - - -fn duckduckgo_init { - get_post_args q - if (! ~ $#q 0) { - redirect_string = 'https://duckduckgo.com/?q=site:'$SERVER_NAME^'+'^$"q - http_redirect $redirect_string '302 Found' - } - if not { - handler_body_main='duckduckgo_body' - } -} - -fn duckduckgo_body { - echo ' -

Site search

-

using DuckDuckGo

-
- - - -
' - -} - diff --git a/apps/duckduckgo/footer.inc.sample b/apps/duckduckgo/footer.inc.sample deleted file mode 100644 index 4dd671d..0000000 --- a/apps/duckduckgo/footer.inc.sample +++ /dev/null @@ -1,3 +0,0 @@ -
Powered by werc
- -
diff --git a/apps/hello/app.rc b/apps/hello/app.rc deleted file mode 100755 index e6faaa8..0000000 --- a/apps/hello/app.rc +++ /dev/null @@ -1,10 +0,0 @@ -fn hello_init { - if(~ $req_path /hello) { - handler_body_main='hello_body' - pageTitle='Hi title!' - } -} - -fn hello_body { - echo 'Hello world!' -} diff --git a/apps/paste/app.rc b/apps/paste/app.rc deleted file mode 100755 index af0c76d..0000000 --- a/apps/paste/app.rc +++ /dev/null @@ -1,45 +0,0 @@ -fn conf_enable_wercpaste { - paste_url=$conf_wd - if (~ $#paste_dir 0) { paste_dir=`{pwd} } - conf_enable_app wercpaste -} - -fn wercpaste_init { - if (~ $REQUEST_METHOD POST && ~ $post_arg_url url && ~ $req_path $paste_url ) { # incoming paste - now=`{ date -n } - cksum=`{ echo $"post_arg_paste | sum | awk '{ print $1 }' } - if (~ $cksum '1715a8eb' ) { # empty paste; discard - post_redirect $base_url^$paste_url - } - if not { # save and redirect - # TODO: stop using echo - # env var size limit is 16kb, this thing dies with larger input. - echo $"post_arg_paste > $paste_dir^/^$now^.^$cksum - # uncomment the following line to redirect to the pasted file - #post_redirect $base_url^$paste_url^$now^.^$cksum - # uncomment the following line instead to just return the url - echo 'Content-type: text/plain'; echo ''; exec echo $base_url^$paste_url^$now^.^$cksum - } - } - if not { # show a paste if there is one - if (test -r $werc_root/$local_path && ~ $QUERY_STRING raw ) { - echo 'Content-type: text/plain'; echo ''; exec cat $werc_root/$local_path - } - } - -# drop a textbox - if (~ $REQUEST_METHOD GET ) { handler_body_main='begforpaste' } - -} - -fn begforpaste { - echo '
-

pasted data is not publically indexed

-
-
-

- (do not change) -
-
- ' -} diff --git a/apps/wman/app.rc b/apps/wman/app.rc deleted file mode 100755 index 8f0a150..0000000 --- a/apps/wman/app.rc +++ /dev/null @@ -1,89 +0,0 @@ -fn conf_enable_wman { - wman_tmac=an - wman_base_uri=$conf_wd - wman_man_path=$* - if(~ $#wman_man_path 0) - wman_man_path=$wman_base_uri - conf_enable_app wman -} - -wman_junk_filter='/(\/(INDEX|\.cvsignore|_.*)|\.9p|\.html)$/d; s!/man([0-9]+/[^/]+)$!/\1!; ' -fn wman_ls_pages { - ls $* \ - | sed $dirfilter^$wman_junk_filter^' s/\.([0-9]|9p)$//; s!/0intro$!/intro!' \ - | sort -u -} -fn wman_init { - ifs=$ifs^'/' { p=`{echo $req_path | sed 's!^'^$wman_base_uri^'!!'} } - wman_cat=$p(1) - wman_page=$p(2) - if(~ $#wman_unix_mode 1) { - wman_cp='man' - wman_pe=.^$"wman_cat - } - - if(! ~ $"wman_cat '') { - wman_cat_path=$wman_man_path^/^$"wman_cp^$p(1) - if(! ~ $"wman_page '') { - wman_page_file=$wman_page^$"wman_pe - # Hack to handle 0intro files. - if(~ $wman_page intro && test -f $wman_cat_path^/0^$"wman_page_file) - wman_page_file=0^$"wman_page_file - wman_page_file=$wman_cat_path^/^$"wman_page_file - x=`{echo $"req_path|sed 's%.*/([^/]+)/'$"wman_cat'/'^$"wman_page^'%\1%; s%_% %g'} - pageTitle=$wman_page' page from Section '$wman_cat' of the '^$"x' manual' - } - } - - wman_cat_list=`{ls -F $wman_man_path/*/ \ - | sed -e $wman_junk_filter -e 's!.*/([^/]+)/[^/]+$!\1!; /[0-9]+/!d' \ - | sort -un} - - synth_paths=($wman_base_uri$wman_cat_list'/') - - if(~ $req_path $wman_base_uri && ~ $"handler_body_main '') - handler_body_main=(tpl_handler apps/wman/section_list.tpl) - if not if(~ $req_path $wman_base_uri^*) { - #^*/[a-z0-9]*[a-z]* $wman_base_uri^*/*[a-z]*[a-z0-9] $wman_base_uri^*/[a-z]) - if(echo $req_path | grep -s '^'^$wman_base_uri^'/*[0-9]+/[0-9a-z\-\+\.]+$') - if(test -f $wman_page_file) # Check for 404 - handler_body_main=(tpl_handler apps/wman/man_page.tpl) - if not if(~ $req_path $wman_base_uri^*/) - handler_body_main=(tpl_handler apps/wman/page_list.tpl) - if not if(~ $p(2) [A-Z]* [0-9][A-Z]*) # Correct badly capitalized links - perm_redirect $wman_base_uri^$p(1)^/^`{echo $p(2) |tr 'A-Z' 'a-z'} - } - - # Search - ll_add handlers_body_head tpl_handler apps/wman/search.tpl - if(! ~ $"post_arg_wman_search '') { - s=`{echo $post_arg_wman_search | sed 's/[^a-zA-Z0-9\-\.]+//g; s/\.+/./g; 1q'} - ifs='' { wman_search_results=`{wman_ls_pages $wman_man_path/*/*^$"s^*} } - if(! ~ $"post_arg_go '' && ~ `{echo -n $wman_search_results|wc -l} 1) - post_redirect $wman_base_uri^`{echo $wman_search_results|awk -F/ '{print $(NF-1)"/"$NF}'} - } - -} - -fn wman_get_section_desc { - cat $wman_man_path/^$"wman_cp^$1/0intro* >[2]/dev/null| sed '1,2d; s!intro \\- [Ii]ntroduction to !!; 3q;' -} - -fn wman_page_gen { - #troff -manhtml $1| troff2html -t 'Plan 9 from User Space' - troff -N -m$wman_tmac $1 | wman_out_filter -} - -fn wman_out_filter { - wman_default_out_filter -} - -fn wman_default_out_filter { - # col -x syntax is the same for UNIX and Plan 9. - escape_html \ - | sed 's!([\.\-a-zA-Z0-9]+)\(('^`{echo $wman_cat_list|tr ' ' '|'}^')\)!&!g' \ - | awk '/^$/ {if(n != 1) print; n=1; next} /./ {n=0; print}' \ - | col -x -} - - diff --git a/apps/wman/man_page.tpl b/apps/wman/man_page.tpl deleted file mode 100755 index 945e23a..0000000 --- a/apps/wman/man_page.tpl +++ /dev/null @@ -1,3 +0,0 @@ -
-% wman_page_gen $wman_page_file
-
diff --git a/apps/wman/page_list.tpl b/apps/wman/page_list.tpl deleted file mode 100755 index b98600d..0000000 --- a/apps/wman/page_list.tpl +++ /dev/null @@ -1,11 +0,0 @@ -% d=`{wman_get_section_desc $wman_cat} -

Manual pages - Section %($wman_cat%): %($"d%)

- - - diff --git a/apps/wman/search.tpl b/apps/wman/search.tpl deleted file mode 100755 index a6c59e4..0000000 --- a/apps/wman/search.tpl +++ /dev/null @@ -1,20 +0,0 @@ -
-
- - - - -% if(! ~ $"post_arg_wman_search '') { -% if(~ $"wman_search_results '') { - No matches found for '%($post_arg_wman_search%)'. -% } -% if not { -
    -% echo $wman_search_results|awk -F/ '$(NF-1) ~ "^[0-9]+$" {printf "
  • %s(%s)
  • ", $(NF-1),$NF, $NF, $(NF-1)}' -
-% } -% } - -
-
- diff --git a/apps/wman/section_list.tpl b/apps/wman/section_list.tpl deleted file mode 100755 index 299d613..0000000 --- a/apps/wman/section_list.tpl +++ /dev/null @@ -1,11 +0,0 @@ -

Manual Sections

- - diff --git a/bin/aux/addwuser.rc b/bin/aux/addwuser.rc deleted file mode 100755 index 9364d39..0000000 --- a/bin/aux/addwuser.rc +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/rc - -if(! ~ $#werc_root 0) - cd $werc_root - -fn usage { - if(! ~ $#* 0) - echo $0: $* >[1=2] - echo 'Usage:' $0 'user_name user_password [groups ...]' >[1=2] - exit usage -} - -if(! test -d etc/users/) - usage 'Run for root of werc installation or set $werc_root' - -user_name=$1 -shift -user_pass=$1 -shift -user_groups=$* - -if(~ $"user_name '' || ~ $"user_pass '') - usage - -mkdir etc/users/$user_name -echo $user_pass > etc/users/$user_name/password - -if(! ~ $#user_groups 0) - for(g in $user_groups) { - mkdir -p etc/users/$g - echo $user_name >> etc/users/$g/members - } - diff --git a/bin/aux/bpst.rc b/bin/aux/bpst.rc deleted file mode 100755 index e60d034..0000000 --- a/bin/aux/bpst.rc +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/rc - -path=( $PLAN9/bin $path ) -base=. - -if(~ $#user 0) - user=`{whoami} - -file=(); title=(); -bloguser=$user -while(! ~ $#* 0) { - switch($1) { - case -u - base=/gsoc/www/people/$user/blog/ - case -b - shift - base=$1 - case -f - shift - file=$1 - } - shift -} - -if(~ $"EDITOR '') - EDITOR=vi - -if(~ $#file 0 || ! test -f $file) { - file=/tmp/blogtmp.$pid - rm $file >[2]/dev/null - touch $file -} - -$EDITOR $file -ispell $file -rm $file.bak >[2]/dev/null - -fn mkbpost { - umask 002 # Let group write - bptext=$1 - if(! ~ $#2 0) - bpid=`{echo -n '-'^$"bpid | sed 's/'$forbidden_uri_chars'+/_/g; 1q'} - d=`{/bin/date +%F|sed 's,-,/,g'} - - ddir=$blagh_root^$d^'/' - n=`{ls $ddir >[2]/dev/null |wc -l} - - mkdir -p $ddir/$"n^$"bpid/ - { - # TODO: Enable metadata - #echo '* Posted:' `{date} - #if(! ~ $#logged_user 0) - # echo '* Author: '$logged_user - cat $bptext - }> $ddir/$"n^$"bpid/index.md -} - -forbidden_uri_chars='[^a-zA-Z0-9_+\-\/\.]' -blagh_root=$base - -if(test -s $file) - mkbpost $file -if not - echo Empty file! diff --git a/bin/aux/gensitemaptxt.rc b/bin/aux/gensitemaptxt.rc deleted file mode 100755 index a1b349d..0000000 --- a/bin/aux/gensitemaptxt.rc +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/rc -# DEPRECATED: sitemap.tpl now generates and updates a sitemap.txt when requested, and is also more smart than this simplistic script. - -for(d in sites/*/) { -echo $d -9 du -a $d | awk '/\.(md|html)$/ { print $2 }; {}' | 9 sed -e 's/\.(md|html)$//' -e 's,/index$,/,' -e 's,^sites/,http://,' > $d/sitemap.txt - -if(! test -f $d/robots.txt) { - echo generating missing robots.txt for $d - echo $d|sed 's,sites/,Sitemap: http://,; s/$/sitemap.txt/;' > $d/robots.txt - cat $d/robots.txt -} - -} diff --git a/bin/aux/runtsts.rc b/bin/aux/runtsts.rc deleted file mode 100755 index b5b1df7..0000000 --- a/bin/aux/runtsts.rc +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/rc - -tstdom='http://test.cat-v.org' - -cd sites/tst.cat-v.org - -tstfiles=`{du -a |awk '/\.tst$/ { print $2 }; {} ' | sed 's/^\.//; s/\.tst$//'} - -for(f in $tstfiles) { - ifs=' -' { tsts=`{cat ./$f.tst} } - - for(t in $tsts) { - echo tst $t - } -} diff --git a/bin/contrib/fix-rc-scripts b/bin/contrib/fix-rc-scripts deleted file mode 100755 index beb21c5..0000000 --- a/bin/contrib/fix-rc-scripts +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/local/plan9/bin/rc - -# Fix rc shell scripts to find rc without launching env every time. -# Invoke with rc and plan9 versions of grep and ed in $PATH - -# If your system lacks which (e.g. some gnu/linux) -# substitute the full path to rc in this line: -rc=/usr/local/plan9/bin/rc -firstline='#!'$"rc - -if(~ $#* 0) files = * -if not files = $* - -myname = `{basename $0} - -for(file in $files) { - if(test -d $file) $0 $file/* - if not if(~ $file *$myname) {} - if not if(sed 1q $file | grep '^#!/.*[/ ]rc$' > /dev/null) { - { - echo 1c - echo $firstline - echo . - echo wq - } | ed $file > /dev/null - } -} diff --git a/bin/contrib/hgweb.config b/bin/contrib/hgweb.config deleted file mode 100755 index fba802b..0000000 --- a/bin/contrib/hgweb.config +++ /dev/null @@ -1,12 +0,0 @@ -[web] -style = gitweb -allow_archive = bz2 - -#[paths] -#w9 = /gsoc/hg/w9/ - -[collections] -#allow_archive = bz2 zip -/gsoc/hg = /gsoc/hg/ -#/var/hg = /var/hg/ - diff --git a/bin/contrib/hgwebdir.cgi b/bin/contrib/hgwebdir.cgi deleted file mode 100755 index 5fe4b16..0000000 --- a/bin/contrib/hgwebdir.cgi +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env python -# -# An example CGI script to export multiple hgweb repos, edit as necessary - -# send python tracebacks to the browser if an error occurs: -import cgitb -cgitb.enable() - -# adjust python path if not a system-wide install: -#import sys -#sys.path.insert(0, "/path/to/python/lib") - -# If you'd like to serve pages with UTF-8 instead of your default -# locale charset, you can do so by uncommenting the following lines. -# Note that this will cause your .hgrc files to be interpreted in -# UTF-8 and all your repo files to be displayed using UTF-8. -# -#import os -#os.environ["HGENCODING"] = "UTF-8" - -from mercurial.hgweb.hgwebdir_mod import hgwebdir -from mercurial.hgweb.request import wsgiapplication -import mercurial.hgweb.wsgicgi as wsgicgi - -# The config file looks like this. You can have paths to individual -# repos, collections of repos in a directory tree, or both. -# -# [paths] -# virtual/path = /real/path -# virtual/path = /real/path -# -# [collections] -# /prefix/to/strip/off = /root/of/tree/full/of/repos -# -# collections example: say directory tree /foo contains repos /foo/bar, -# /foo/quux/baz. Give this config section: -# [collections] -# /foo = /foo -# Then repos will list as bar and quux/baz. -# -# Alternatively you can pass a list of ('virtual/path', '/real/path') tuples -# or use a dictionary with entries like 'virtual/path': '/real/path' - -def make_web_app(): - return hgwebdir("hgweb.config") - -wsgicgi.launch(wsgiapplication(make_web_app)) diff --git a/bin/contrib/markdown.pl b/bin/contrib/markdown.pl deleted file mode 100755 index 3758a87..0000000 --- a/bin/contrib/markdown.pl +++ /dev/null @@ -1,1447 +0,0 @@ -#!/usr/bin/env perl -# -# Markdown -- A text-to-HTML conversion tool for web writers -# -# Copyright (c) 2004 John Gruber -# -# -package Markdown; -require 5.006_000; -use strict; -use warnings; - -use Digest::MD5 qw(md5_hex); -use vars qw($VERSION); -$VERSION = '1.0.1'; -# Tue 14 Dec 2004 - -## Disabled; causes problems under Perl 5.6.1: -# use utf8; -# binmode( STDOUT, ":utf8" ); # c.f.: http://acis.openlib.org/dev/perl-unicode-struggle.html - - -# -# Global default settings: -# -my $g_empty_element_suffix = " />"; # Change to ">" for HTML output -my $g_tab_width = 4; - - -# -# Globals: -# - -# Regex to match balanced [brackets]. See Friedl's -# "Mastering Regular Expressions", 2nd Ed., pp. 328-331. -my $g_nested_brackets; -$g_nested_brackets = qr{ - (?> # Atomic matching - [^\[\]]+ # Anything other than brackets - | - \[ - (??{ $g_nested_brackets }) # Recursive set of nested brackets - \] - )* -}x; - - -# Table of hash values for escaped characters: -my %g_escape_table; -foreach my $char (split //, '\\`*_{}[]()>#+-.!') { - $g_escape_table{$char} = md5_hex($char); -} - - -# Global hashes, used by various utility routines -my %g_urls; -my %g_titles; -my %g_html_blocks; - -# Used to track when we're inside an ordered or unordered list -# (see _ProcessListItems() for details): -my $g_list_level = 0; - - -#### Blosxom plug-in interface ########################################## - -# Set $g_blosxom_use_meta to 1 to use Blosxom's meta plug-in to determine -# which posts Markdown should process, using a "meta-markup: markdown" -# header. If it's set to 0 (the default), Markdown will process all -# entries. -my $g_blosxom_use_meta = 0; - -sub start { 1; } -sub story { - my($pkg, $path, $filename, $story_ref, $title_ref, $body_ref) = @_; - - if ( (! $g_blosxom_use_meta) or - (defined($meta::markup) and ($meta::markup =~ /^\s*markdown\s*$/i)) - ){ - $$body_ref = Markdown($$body_ref); - } - 1; -} - - -#### Movable Type plug-in interface ##################################### -eval {require MT}; # Test to see if we're running in MT. -unless ($@) { - require MT; - import MT; - require MT::Template::Context; - import MT::Template::Context; - - eval {require MT::Plugin}; # Test to see if we're running >= MT 3.0. - unless ($@) { - require MT::Plugin; - import MT::Plugin; - my $plugin = new MT::Plugin({ - name => "Markdown", - description => "A plain-text-to-HTML formatting plugin. (Version: $VERSION)", - doc_link => 'http://daringfireball.net/projects/markdown/' - }); - MT->add_plugin( $plugin ); - } - - MT::Template::Context->add_container_tag(MarkdownOptions => sub { - my $ctx = shift; - my $args = shift; - my $builder = $ctx->stash('builder'); - my $tokens = $ctx->stash('tokens'); - - if (defined ($args->{'output'}) ) { - $ctx->stash('markdown_output', lc $args->{'output'}); - } - - defined (my $str = $builder->build($ctx, $tokens) ) - or return $ctx->error($builder->errstr); - $str; # return value - }); - - MT->add_text_filter('markdown' => { - label => 'Markdown', - docs => 'http://daringfireball.net/projects/markdown/', - on_format => sub { - my $text = shift; - my $ctx = shift; - my $raw = 0; - if (defined $ctx) { - my $output = $ctx->stash('markdown_output'); - if (defined $output && $output =~ m/^html/i) { - $g_empty_element_suffix = ">"; - $ctx->stash('markdown_output', ''); - } - elsif (defined $output && $output eq 'raw') { - $raw = 1; - $ctx->stash('markdown_output', ''); - } - else { - $raw = 0; - $g_empty_element_suffix = " />"; - } - } - $text = $raw ? $text : Markdown($text); - $text; - }, - }); - - # If SmartyPants is loaded, add a combo Markdown/SmartyPants text filter: - my $smartypants; - - { - no warnings "once"; - $smartypants = $MT::Template::Context::Global_filters{'smarty_pants'}; - } - - if ($smartypants) { - MT->add_text_filter('markdown_with_smartypants' => { - label => 'Markdown With SmartyPants', - docs => 'http://daringfireball.net/projects/markdown/', - on_format => sub { - my $text = shift; - my $ctx = shift; - if (defined $ctx) { - my $output = $ctx->stash('markdown_output'); - if (defined $output && $output eq 'html') { - $g_empty_element_suffix = ">"; - } - else { - $g_empty_element_suffix = " />"; - } - } - $text = Markdown($text); - $text = $smartypants->($text, '1'); - }, - }); - } -} -else { -#### BBEdit/command-line text filter interface ########################## -# Needs to be hidden from MT (and Blosxom when running in static mode). - - # We're only using $blosxom::version once; tell Perl not to warn us: - no warnings 'once'; - unless ( defined($blosxom::version) ) { - use warnings; - - #### Check for command-line switches: ################# - my %cli_opts; - use Getopt::Long; - Getopt::Long::Configure('pass_through'); - GetOptions(\%cli_opts, - 'version', - 'shortversion', - 'html4tags', - ); - if ($cli_opts{'version'}) { # Version info - print "\nThis is Markdown, version $VERSION.\n"; - print "Copyright 2004 John Gruber\n"; - print "http://daringfireball.net/projects/markdown/\n\n"; - exit 0; - } - if ($cli_opts{'shortversion'}) { # Just the version number string. - print $VERSION; - exit 0; - } - if ($cli_opts{'html4tags'}) { # Use HTML tag style instead of XHTML - $g_empty_element_suffix = ">"; - } - - - #### Process incoming text: ########################### - my $text; - { - local $/; # Slurp the whole file - $text = <>; - } - print Markdown($text); - } -} - - - -sub Markdown { -# -# Main function. The order in which other subs are called here is -# essential. Link and image substitutions need to happen before -# _EscapeSpecialChars(), so that any *'s or _'s in the -# and tags get encoded. -# - my $text = shift; - - # Clear the global hashes. If we don't clear these, you get conflicts - # from other articles when generating a page which contains more than - # one article (e.g. an index page that shows the N most recent - # articles): - %g_urls = (); - %g_titles = (); - %g_html_blocks = (); - - - # Standardize line endings: - $text =~ s{\r\n}{\n}g; # DOS to Unix - $text =~ s{\r}{\n}g; # Mac to Unix - - # Make sure $text ends with a couple of newlines: - $text .= "\n\n"; - - # Convert all tabs to spaces. - $text = _Detab($text); - - # Strip any lines consisting only of spaces and tabs. - # This makes subsequent regexen easier to write, because we can - # match consecutive blank lines with /\n+/ instead of something - # contorted like /[ \t]*\n+/ . - $text =~ s/^[ \t]+$//mg; - - # Turn block-level HTML blocks into hash entries - $text = _HashHTMLBlocks($text); - - # Strip link definitions, store in hashes. - $text = _StripLinkDefinitions($text); - - $text = _RunBlockGamut($text); - - $text = _UnescapeSpecialChars($text); - - return $text . "\n"; -} - - -sub _StripLinkDefinitions { -# -# Strips link definitions from text, stores the URLs and titles in -# hash references. -# - my $text = shift; - my $less_than_tab = $g_tab_width - 1; - - # Link defs are in the form: ^[id]: url "optional title" - while ($text =~ s{ - ^[ ]{0,$less_than_tab}\[(.+)\]: # id = $1 - [ \t]* - \n? # maybe *one* newline - [ \t]* - ? # url = $2 - [ \t]* - \n? # maybe one newline - [ \t]* - (?: - (?<=\s) # lookbehind for whitespace - ["(] - (.+?) # title = $3 - [")] - [ \t]* - )? # title is optional - (?:\n+|\Z) - } - {}mx) { - $g_urls{lc $1} = _EncodeAmpsAndAngles( $2 ); # Link IDs are case-insensitive - if ($3) { - $g_titles{lc $1} = $3; - $g_titles{lc $1} =~ s/"/"/g; - } - } - - return $text; -} - - -sub _HashHTMLBlocks { - my $text = shift; - my $less_than_tab = $g_tab_width - 1; - - # Hashify HTML blocks: - # We only want to do this for block-level HTML tags, such as headers, - # lists, and tables. That's because we still want to wrap

s around - # "paragraphs" that are wrapped in non-block-level tags, such as anchors, - # phrase emphasis, and spans. The list of tags we're looking for is - # hard-coded: - my $block_tags_a = qr/p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del/; - my $block_tags_b = qr/p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math/; - - # First, look for nested blocks, e.g.: - #

- #
- # tags for inner block must be indented. - #
- #
- # - # The outermost tags must start at the left margin for this to match, and - # the inner nested divs must be indented. - # We need to do this before the next, more liberal match, because the next - # match will start at the first `
` and stop at the first `
`. - $text =~ s{ - ( # save in $1 - ^ # start of line (with /m) - <($block_tags_a) # start tag = $2 - \b # word break - (.*\n)*? # any number of lines, minimally matching - # the matching end tag - [ \t]* # trailing spaces/tabs - (?=\n+|\Z) # followed by a newline or end of document - ) - }{ - my $key = md5_hex($1); - $g_html_blocks{$key} = $1; - "\n\n" . $key . "\n\n"; - }egmx; - - - # - # Now match more liberally, simply from `\n` to `\n` - # - $text =~ s{ - ( # save in $1 - ^ # start of line (with /m) - <($block_tags_b) # start tag = $2 - \b # word break - (.*\n)*? # any number of lines, minimally matching - .* # the matching end tag - [ \t]* # trailing spaces/tabs - (?=\n+|\Z) # followed by a newline or end of document - ) - }{ - my $key = md5_hex($1); - $g_html_blocks{$key} = $1; - "\n\n" . $key . "\n\n"; - }egmx; - # Special case just for
. It was easier to make a special case than - # to make the other regex more complicated. - $text =~ s{ - (?: - (?<=\n\n) # Starting after a blank line - | # or - \A\n? # the beginning of the doc - ) - ( # save in $1 - [ ]{0,$less_than_tab} - <(hr) # start tag = $2 - \b # word break - ([^<>])*? # - /?> # the matching end tag - [ \t]* - (?=\n{2,}|\Z) # followed by a blank line or end of document - ) - }{ - my $key = md5_hex($1); - $g_html_blocks{$key} = $1; - "\n\n" . $key . "\n\n"; - }egx; - - # Special case for standalone HTML comments: - $text =~ s{ - (?: - (?<=\n\n) # Starting after a blank line - | # or - \A\n? # the beginning of the doc - ) - ( # save in $1 - [ ]{0,$less_than_tab} - (?s: - - ) - [ \t]* - (?=\n{2,}|\Z) # followed by a blank line or end of document - ) - }{ - my $key = md5_hex($1); - $g_html_blocks{$key} = $1; - "\n\n" . $key . "\n\n"; - }egx; - - - return $text; -} - - -sub _RunBlockGamut { -# -# These are all the transformations that form block-level -# tags like paragraphs, headers, and list items. -# - my $text = shift; - - $text = _DoHeaders($text); - - # Do Horizontal Rules: - $text =~ s{^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$}{\n tags around block-level tags. - $text = _HashHTMLBlocks($text); - - $text = _FormParagraphs($text); - - return $text; -} - - -sub _RunSpanGamut { -# -# These are all the transformations that occur *within* block-level -# tags like paragraphs, headers, and list items. -# - my $text = shift; - - $text = _DoCodeSpans($text); - - $text = _EscapeSpecialChars($text); - - # Process anchor and image tags. Images must come first, - # because ![foo][f] looks like an anchor. - $text = _DoImages($text); - $text = _DoAnchors($text); - - # Make links out of things like `` - # Must come after _DoAnchors(), because you can use < and > - # delimiters in inline links like [this](). - $text = _DoAutoLinks($text); - - $text = _EncodeAmpsAndAngles($text); - - $text = _DoItalicsAndBold($text); - - # Do hard breaks: - $text =~ s/ {2,}\n/ or tags. -# my $tags_to_skip = qr!<(/?)(?:pre|code|kbd|script|math)[\s>]!; - - foreach my $cur_token (@$tokens) { - if ($cur_token->[0] eq "tag") { - # Within tags, encode * and _ so they don't conflict - # with their use in Markdown for italics and strong. - # We're replacing each such character with its - # corresponding MD5 checksum value; this is likely - # overkill, but it should prevent us from colliding - # with the escape values by accident. - $cur_token->[1] =~ s! \* !$g_escape_table{'*'}!gx; - $cur_token->[1] =~ s! _ !$g_escape_table{'_'}!gx; - $text .= $cur_token->[1]; - } else { - my $t = $cur_token->[1]; - $t = _EncodeBackslashEscapes($t); - $text .= $t; - } - } - return $text; -} - - -sub _DoAnchors { -# -# Turn Markdown link shortcuts into XHTML
tags. -# - my $text = shift; - - # - # First, handle reference-style links: [link text] [id] - # - $text =~ s{ - ( # wrap whole match in $1 - \[ - ($g_nested_brackets) # link text = $2 - \] - - [ ]? # one optional space - (?:\n[ ]*)? # one optional newline followed by spaces - - \[ - (.*?) # id = $3 - \] - ) - }{ - my $result; - my $whole_match = $1; - my $link_text = $2; - my $link_id = lc $3; - - if ($link_id eq "") { - $link_id = lc $link_text; # for shortcut links like [this][]. - } - - if (defined $g_urls{$link_id}) { - my $url = $g_urls{$link_id}; - $url =~ s! \* !$g_escape_table{'*'}!gx; # We've got to encode these to avoid - $url =~ s! _ !$g_escape_table{'_'}!gx; # conflicting with italics/bold. - $result = "? # href = $3 - [ \t]* - ( # $4 - (['"]) # quote char = $5 - (.*?) # Title = $6 - \5 # matching quote - )? # title is optional - \) - ) - }{ - my $result; - my $whole_match = $1; - my $link_text = $2; - my $url = $3; - my $title = $6; - - $url =~ s! \* !$g_escape_table{'*'}!gx; # We've got to encode these to avoid - $url =~ s! _ !$g_escape_table{'_'}!gx; # conflicting with italics/bold. - $result = " tags. -# - my $text = shift; - - # - # First, handle reference-style labeled images: ![alt text][id] - # - $text =~ s{ - ( # wrap whole match in $1 - !\[ - (.*?) # alt text = $2 - \] - - [ ]? # one optional space - (?:\n[ ]*)? # one optional newline followed by spaces - - \[ - (.*?) # id = $3 - \] - - ) - }{ - my $result; - my $whole_match = $1; - my $alt_text = $2; - my $link_id = lc $3; - - if ($link_id eq "") { - $link_id = lc $alt_text; # for shortcut links like ![this][]. - } - - $alt_text =~ s/"/"/g; - if (defined $g_urls{$link_id}) { - my $url = $g_urls{$link_id}; - $url =~ s! \* !$g_escape_table{'*'}!gx; # We've got to encode these to avoid - $url =~ s! _ !$g_escape_table{'_'}!gx; # conflicting with italics/bold. - $result = "\"$alt_text\"";? # src url = $3 - [ \t]* - ( # $4 - (['"]) # quote char = $5 - (.*?) # title = $6 - \5 # matching quote - [ \t]* - )? # title is optional - \) - ) - }{ - my $result; - my $whole_match = $1; - my $alt_text = $2; - my $url = $3; - my $title = ''; - if (defined($6)) { - $title = $6; - } - - $alt_text =~ s/"/"/g; - $title =~ s/"/"/g; - $url =~ s! \* !$g_escape_table{'*'}!gx; # We've got to encode these to avoid - $url =~ s! _ !$g_escape_table{'_'}!gx; # conflicting with italics/bold. - $result = "\"$alt_text\"";" . _RunSpanGamut($1) . "\n\n"; - }egmx; - - $text =~ s{ ^(.+)[ \t]*\n-+[ \t]*\n+ }{ - "

" . _RunSpanGamut($1) . "

\n\n"; - }egmx; - - - # atx-style headers: - # # Header 1 - # ## Header 2 - # ## Header 2 with closing hashes ## - # ... - # ###### Header 6 - # - $text =~ s{ - ^(\#{1,6}) # $1 = string of #'s - [ \t]* - (.+?) # $2 = Header text - [ \t]* - \#* # optional closing #'s (not counted) - \n+ - }{ - my $h_level = length($1); - "" . _RunSpanGamut($2) . "\n\n"; - }egmx; - - return $text; -} - - -sub _DoLists { -# -# Form HTML ordered (numbered) and unordered (bulleted) lists. -# - my $text = shift; - my $less_than_tab = $g_tab_width - 1; - - # Re-usable patterns to match list item bullets and number markers: - my $marker_ul = qr/[*+-]/; - my $marker_ol = qr/\d+[.]/; - my $marker_any = qr/(?:$marker_ul|$marker_ol)/; - - # Re-usable pattern to match any entirel ul or ol list: - my $whole_list = qr{ - ( # $1 = whole list - ( # $2 - [ ]{0,$less_than_tab} - (${marker_any}) # $3 = first list item marker - [ \t]+ - ) - (?s:.+?) - ( # $4 - \z - | - \n{2,} - (?=\S) - (?! # Negative lookahead for another list item marker - [ \t]* - ${marker_any}[ \t]+ - ) - ) - ) - }mx; - - # We use a different prefix before nested lists than top-level lists. - # See extended comment in _ProcessListItems(). - # - # Note: There's a bit of duplication here. My original implementation - # created a scalar regex pattern as the conditional result of the test on - # $g_list_level, and then only ran the $text =~ s{...}{...}egmx - # substitution once, using the scalar as the pattern. This worked, - # everywhere except when running under MT on my hosting account at Pair - # Networks. There, this caused all rebuilds to be killed by the reaper (or - # perhaps they crashed, but that seems incredibly unlikely given that the - # same script on the same server ran fine *except* under MT. I've spent - # more time trying to figure out why this is happening than I'd like to - # admit. My only guess, backed up by the fact that this workaround works, - # is that Perl optimizes the substition when it can figure out that the - # pattern will never change, and when this optimization isn't on, we run - # afoul of the reaper. Thus, the slightly redundant code to that uses two - # static s/// patterns rather than one conditional pattern. - - if ($g_list_level) { - $text =~ s{ - ^ - $whole_list - }{ - my $list = $1; - my $list_type = ($3 =~ m/$marker_ul/) ? "ul" : "ol"; - # Turn double returns into triple returns, so that we can make a - # paragraph for the last item in a list, if necessary: - $list =~ s/\n{2,}/\n\n\n/g; - my $result = _ProcessListItems($list, $marker_any); - $result = "<$list_type>\n" . $result . "\n"; - $result; - }egmx; - } - else { - $text =~ s{ - (?:(?<=\n\n)|\A\n?) - $whole_list - }{ - my $list = $1; - my $list_type = ($3 =~ m/$marker_ul/) ? "ul" : "ol"; - # Turn double returns into triple returns, so that we can make a - # paragraph for the last item in a list, if necessary: - $list =~ s/\n{2,}/\n\n\n/g; - my $result = _ProcessListItems($list, $marker_any); - $result = "<$list_type>\n" . $result . "\n"; - $result; - }egmx; - } - - - return $text; -} - - -sub _ProcessListItems { -# -# Process the contents of a single ordered or unordered list, splitting it -# into individual list items. -# - - my $list_str = shift; - my $marker_any = shift; - - - # The $g_list_level global keeps track of when we're inside a list. - # Each time we enter a list, we increment it; when we leave a list, - # we decrement. If it's zero, we're not in a list anymore. - # - # We do this because when we're not inside a list, we want to treat - # something like this: - # - # I recommend upgrading to version - # 8. Oops, now this line is treated - # as a sub-list. - # - # As a single paragraph, despite the fact that the second line starts - # with a digit-period-space sequence. - # - # Whereas when we're inside a list (or sub-list), that line will be - # treated as the start of a sub-list. What a kludge, huh? This is - # an aspect of Markdown's syntax that's hard to parse perfectly - # without resorting to mind-reading. Perhaps the solution is to - # change the syntax rules such that sub-lists must start with a - # starting cardinal number; e.g. "1." or "a.". - - $g_list_level++; - - # trim trailing blank lines: - $list_str =~ s/\n{2,}\z/\n/; - - - $list_str =~ s{ - (\n)? # leading line = $1 - (^[ \t]*) # leading whitespace = $2 - ($marker_any) [ \t]+ # list marker = $3 - ((?s:.+?) # list item text = $4 - (\n{1,2})) - (?= \n* (\z | \2 ($marker_any) [ \t]+)) - }{ - my $item = $4; - my $leading_line = $1; - my $leading_space = $2; - - if ($leading_line or ($item =~ m/\n{2,}/)) { - $item = _RunBlockGamut(_Outdent($item)); - } - else { - # Recursion for sub-lists: - $item = _DoLists(_Outdent($item)); - chomp $item; - $item = _RunSpanGamut($item); - } - - "
  • " . $item . "
  • \n"; - }egmx; - - $g_list_level--; - return $list_str; -} - - - -sub _DoCodeBlocks { -# -# Process Markdown `
    ` blocks.
    -#	
    -
    -	my $text = shift;
    -
    -	$text =~ s{
    -			(?:\n\n|\A)
    -			(	            # $1 = the code block -- one or more lines, starting with a space/tab
    -			  (?:
    -			    (?:[ ]{$g_tab_width} | \t)  # Lines must start with a tab or a tab-width of spaces
    -			    .*\n+
    -			  )+
    -			)
    -			((?=^[ ]{0,$g_tab_width}\S)|\Z)	# Lookahead for non-space at line-start, or end of doc
    -		}{
    -			my $codeblock = $1;
    -			my $result; # return value
    -
    -			$codeblock = _EncodeCode(_Outdent($codeblock));
    -			$codeblock = _Detab($codeblock);
    -			$codeblock =~ s/\A\n+//; # trim leading newlines
    -			$codeblock =~ s/\s+\z//; # trim trailing whitespace
    -
    -			$result = "\n\n
    " . $codeblock . "\n
    \n\n"; - - $result; - }egmx; - - return $text; -} - - -sub _DoCodeSpans { -# -# * Backtick quotes are used for spans. -# -# * You can use multiple backticks as the delimiters if you want to -# include literal backticks in the code span. So, this input: -# -# Just type ``foo `bar` baz`` at the prompt. -# -# Will translate to: -# -#

    Just type foo `bar` baz at the prompt.

    -# -# There's no arbitrary limit to the number of backticks you -# can use as delimters. If you need three consecutive backticks -# in your code, use four for delimiters, etc. -# -# * You can use spaces to get literal backticks at the edges: -# -# ... type `` `bar` `` ... -# -# Turns to: -# -# ... type `bar` ... -# - - my $text = shift; - - $text =~ s@ - (`+) # $1 = Opening run of ` - (.+?) # $2 = The code block - (?$c
    "; - @egsx; - - return $text; -} - - -sub _EncodeCode { -# -# Encode/escape certain characters inside Markdown code runs. -# The point is that in code, these characters are literals, -# and lose their special Markdown meanings. -# - local $_ = shift; - - # Encode all ampersands; HTML entities are not - # entities within a Markdown code span. - s/&/&/g; - - # Encode $'s, but only if we're running under Blosxom. - # (Blosxom interpolates Perl variables in article bodies.) - { - no warnings 'once'; - if (defined($blosxom::version)) { - s/\$/$/g; - } - } - - - # Do the angle bracket song and dance: - s! < !<!gx; - s! > !>!gx; - - # Now, escape characters that are magic in Markdown: - s! \* !$g_escape_table{'*'}!gx; - s! _ !$g_escape_table{'_'}!gx; - s! { !$g_escape_table{'{'}!gx; - s! } !$g_escape_table{'}'}!gx; - s! \[ !$g_escape_table{'['}!gx; - s! \] !$g_escape_table{']'}!gx; - s! \\ !$g_escape_table{'\\'}!gx; - - return $_; -} - - -sub _DoItalicsAndBold { - my $text = shift; - - # must go first: - $text =~ s{ (\*\*|__) (?=\S) (.+?[*_]*) (?<=\S) \1 } - {$2}gsx; - - $text =~ s{ (\*|_) (?=\S) (.+?) (?<=\S) \1 } - {$2}gsx; - - return $text; -} - - -sub _DoBlockQuotes { - my $text = shift; - - $text =~ s{ - ( # Wrap whole match in $1 - ( - ^[ \t]*>[ \t]? # '>' at the start of a line - .+\n # rest of the first line - (.+\n)* # subsequent consecutive lines - \n* # blanks - )+ - ) - }{ - my $bq = $1; - $bq =~ s/^[ \t]*>[ \t]?//gm; # trim one level of quoting - $bq =~ s/^[ \t]+$//mg; # trim whitespace-only lines - $bq = _RunBlockGamut($bq); # recurse - - $bq =~ s/^/ /g; - # These leading spaces screw with
     content, so we need to fix that:
    -			$bq =~ s{
    -					(\s*
    .+?
    ) - }{ - my $pre = $1; - $pre =~ s/^ //mg; - $pre; - }egsx; - - "
    \n$bq\n
    \n\n"; - }egmx; - - - return $text; -} - - -sub _FormParagraphs { -# -# Params: -# $text - string to process with html

    tags -# - my $text = shift; - - # Strip leading and trailing lines: - $text =~ s/\A\n+//; - $text =~ s/\n+\z//; - - my @grafs = split(/\n{2,}/, $text); - - # - # Wrap

    tags. - # - foreach (@grafs) { - unless (defined( $g_html_blocks{$_} )) { - $_ = _RunSpanGamut($_); - s/^([ \t]*)/

    /; - $_ .= "

    "; - } - } - - # - # Unhashify HTML blocks - # - foreach (@grafs) { - if (defined( $g_html_blocks{$_} )) { - $_ = $g_html_blocks{$_}; - } - } - - return join "\n\n", @grafs; -} - - -sub _EncodeAmpsAndAngles { -# Smart processing for ampersands and angle brackets that need to be encoded. - - my $text = shift; - - # Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin: - # http://bumppo.net/projects/amputator/ - $text =~ s/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/&/g; - - # Encode naked <'s - $text =~ s{<(?![a-z/?\$!])}{<}gi; - - return $text; -} - - -sub _EncodeBackslashEscapes { -# -# Parameter: String. -# Returns: The string, with after processing the following backslash -# escape sequences. -# - local $_ = shift; - - s! \\\\ !$g_escape_table{'\\'}!gx; # Must process escaped backslashes first. - s! \\` !$g_escape_table{'`'}!gx; - s! \\\* !$g_escape_table{'*'}!gx; - s! \\_ !$g_escape_table{'_'}!gx; - s! \\\{ !$g_escape_table{'{'}!gx; - s! \\\} !$g_escape_table{'}'}!gx; - s! \\\[ !$g_escape_table{'['}!gx; - s! \\\] !$g_escape_table{']'}!gx; - s! \\\( !$g_escape_table{'('}!gx; - s! \\\) !$g_escape_table{')'}!gx; - s! \\> !$g_escape_table{'>'}!gx; - s! \\\# !$g_escape_table{'#'}!gx; - s! \\\+ !$g_escape_table{'+'}!gx; - s! \\\- !$g_escape_table{'-'}!gx; - s! \\\. !$g_escape_table{'.'}!gx; - s{ \\! }{$g_escape_table{'!'}}gx; - - return $_; -} - - -sub _DoAutoLinks { - my $text = shift; - - $text =~ s{<((https?|ftp):[^'">\s]+)>}{
    $1}gi; - - # Email addresses: - $text =~ s{ - < - (?:mailto:)? - ( - [-.\w]+ - \@ - [-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+ - ) - > - }{ - _EncodeEmailAddress( _UnescapeSpecialChars($1) ); - }egix; - - return $text; -} - - -sub _EncodeEmailAddress { -# -# Input: an email address, e.g. "foo@example.com" -# -# Output: the email address as a mailto link, with each character -# of the address encoded as either a decimal or hex entity, in -# the hopes of foiling most address harvesting spam bots. E.g.: -# -# foo -# @example.com -# -# Based on a filter by Matthew Wickline, posted to the BBEdit-Talk -# mailing list: -# - - my $addr = shift; - - srand; - my @encode = ( - sub { '&#' . ord(shift) . ';' }, - sub { '&#x' . sprintf( "%X", ord(shift) ) . ';' }, - sub { shift }, - ); - - $addr = "mailto:" . $addr; - - $addr =~ s{(.)}{ - my $char = $1; - if ( $char eq '@' ) { - # this *must* be encoded. I insist. - $char = $encode[int rand 1]->($char); - } elsif ( $char ne ':' ) { - # leave ':' alone (to spot mailto: later) - my $r = rand; - # roughly 10% raw, 45% hex, 45% dec - $char = ( - $r > .9 ? $encode[2]->($char) : - $r < .45 ? $encode[1]->($char) : - $encode[0]->($char) - ); - } - $char; - }gex; - - $addr = qq{$addr}; - $addr =~ s{">.+?:}{">}; # strip the mailto: from the visible part - - return $addr; -} - - -sub _UnescapeSpecialChars { -# -# Swap back in all the special characters we've hidden. -# - my $text = shift; - - while( my($char, $hash) = each(%g_escape_table) ) { - $text =~ s/$hash/$char/g; - } - return $text; -} - - -sub _TokenizeHTML { -# -# Parameter: String containing HTML markup. -# Returns: Reference to an array of the tokens comprising the input -# string. Each token is either a tag (possibly with nested, -# tags contained therein, such as , or a -# run of text between tags. Each element of the array is a -# two-element array; the first is either 'tag' or 'text'; -# the second is the actual value. -# -# -# Derived from the _tokenize() subroutine from Brad Choate's MTRegex plugin. -# -# - - my $str = shift; - my $pos = 0; - my $len = length $str; - my @tokens; - - my $depth = 6; - my $nested_tags = join('|', ('(?:<[a-z/!$](?:[^<>]') x $depth) . (')*>)' x $depth); - my $match = qr/(?s: ) | # comment - (?s: <\? .*? \?> ) | # processing instruction - $nested_tags/ix; # nested tags - - while ($str =~ m/($match)/g) { - my $whole_tag = $1; - my $sec_start = pos $str; - my $tag_start = $sec_start - length $whole_tag; - if ($pos < $tag_start) { - push @tokens, ['text', substr($str, $pos, $tag_start - $pos)]; - } - push @tokens, ['tag', $whole_tag]; - $pos = pos $str; - } - push @tokens, ['text', substr($str, $pos, $len - $pos)] if $pos < $len; - \@tokens; -} - - -sub _Outdent { -# -# Remove one level of line-leading tabs or spaces -# - my $text = shift; - - $text =~ s/^(\t|[ ]{1,$g_tab_width})//gm; - return $text; -} - - -sub _Detab { -# -# Cribbed from a post by Bart Lateur: -# -# - my $text = shift; - - $text =~ s{(.*?)\t}{$1.(' ' x ($g_tab_width - length($1) % $g_tab_width))}ge; - return $text; -} - - -1; - -__END__ - - -=pod - -=head1 NAME - -B - - -=head1 SYNOPSIS - -B [ B<--html4tags> ] [ B<--version> ] [ B<-shortversion> ] - [ I ... ] - - -=head1 DESCRIPTION - -Markdown is a text-to-HTML filter; it translates an easy-to-read / -easy-to-write structured text format into HTML. Markdown's text format -is most similar to that of plain text email, and supports features such -as headers, *emphasis*, code blocks, blockquotes, and links. - -Markdown's syntax is designed not as a generic markup language, but -specifically to serve as a front-end to (X)HTML. You can use span-level -HTML tags anywhere in a Markdown document, and you can use block level -HTML tags (like
    and as well). - -For more information about Markdown's syntax, see: - - http://daringfireball.net/projects/markdown/ - - -=head1 OPTIONS - -Use "--" to end switch parsing. For example, to open a file named "-z", use: - - Markdown.pl -- -z - -=over 4 - - -=item B<--html4tags> - -Use HTML 4 style for empty element tags, e.g.: - -
    - -instead of Markdown's default XHTML style tags, e.g.: - -
    - - -=item B<-v>, B<--version> - -Display Markdown's version number and copyright information. - - -=item B<-s>, B<--shortversion> - -Display the short-form version number. - - -=back - - - -=head1 BUGS - -To file bug reports or feature requests (other than topics listed in the -Caveats section above) please send email to: - - support@daringfireball.net - -Please include with your report: (1) the example input; (2) the output -you expected; (3) the output Markdown actually produced. - - -=head1 VERSION HISTORY - -See the readme file for detailed release notes for this version. - -1.0.1 - 14 Dec 2004 - -1.0 - 28 Aug 2004 - - -=head1 AUTHOR - - John Gruber - http://daringfireball.net - - PHP port and other contributions by Michel Fortin - http://michelf.com - - -=head1 COPYRIGHT AND LICENSE - -Copyright (c) 2003-2004 John Gruber - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -* Neither the name "Markdown" nor the names of its contributors may - be used to endorse or promote products derived from this software - without specific prior written permission. - -This software is provided by the copyright holders and contributors "as -is" and any express or implied warranties, including, but not limited -to, the implied warranties of merchantability and fitness for a -particular purpose are disclaimed. In no event shall the copyright owner -or contributors be liable for any direct, indirect, incidental, special, -exemplary, or consequential damages (including, but not limited to, -procurement of substitute goods or services; loss of use, data, or -profits; or business interruption) however caused and on any theory of -liability, whether in contract, strict liability, or tort (including -negligence or otherwise) arising in any way out of the use of this -software, even if advised of the possibility of such damage. - -=cut diff --git a/bin/contrib/md2html.awk b/bin/contrib/md2html.awk deleted file mode 100755 index 81d1241..0000000 --- a/bin/contrib/md2html.awk +++ /dev/null @@ -1,427 +0,0 @@ -#!/bin/awk -f -# -# by: Jesus Galan (yiyus) 2009 -# -# Usage: md2html.awk file.md > file.html -# See: http://4l77.com/src/md2html.awk - -function eschtml(t) { - gsub("&", "\\&", t); - gsub("<", "\\<", t); - return t; -} - -function oprint(t){ - if(nr == 0) - print t; - else - otext = otext "\n" t; -} - -function subref(id){ - for(; nr > 0 && sub("<<" id, ref[id], otext); nr--); - if(nr == 0 && otext) { - print otext; - otext = ""; - } -} - -function nextil(t) { - if(!match(t, /[`<&\[*_\\-]|(\!\[)/)) - return t; - t1 = substr(t, 1, RSTART - 1); - tag = substr(t, RSTART, RLENGTH); - t2 = substr(t, RSTART + RLENGTH); - if(ilcode && tag != "`") - return eschtml(t1 tag) nextil(t2); - # Backslash escaping - if(tag == "\\"){ - if(match(t2, /^[\\`*_{}\[\]()#+\-\.!]/)){ - tag = substr(t2, 1, 1); - t2 = substr(t2, 2); - } - return t1 tag nextil(t2); - } - # Dashes - if(tag == "-"){ - if(sub(/^-/, "", t2)) - tag = "—"; - return t1 tag nextil(t2); - } - # Inline Code - if(tag == "`"){ - if(sub(/^`/, "", t2)){ - if(!match(t2, /``/)) - return t1 "”" nextil(t2); - ilcode2 = !ilcode2; - } - else if(ilcode2) - return t1 tag nextil(t2); - tag = ""; - if(ilcode){ - t1 = eschtml(t1); - tag = ""; - } - ilcode = !ilcode; - return t1 tag nextil(t2); - } - if(tag == "<"){ - # Autolinks - if(match(t2, /^[^ ]+[\.@][^ ]+>/)){ - url = eschtml(substr(t2, 1, RLENGTH - 1)); - t2 = substr(t2, RLENGTH + 1); - linktext = url; - if(match(url, /@/) && !match(url, /^mailto:/)) - url = "mailto:" url; - return t1 "" linktext "" nextil(t2); - } - # Html tags - if(match(t2, /^[A-Za-z\/!][^>]*>/)){ - tag = tag substr(t2, RSTART, RLENGTH); - t2 = substr(t2, RLENGTH + 1); - return t1 tag nextil(t2); - } - return t1 "<" nextil(t2); - } - # Html special entities - if(tag == "&"){ - if(match(t2, /^#?[A-Za-z0-9]+;/)){ - tag = tag substr(t2, RSTART, RLENGTH); - t2 = substr(t2, RLENGTH + 1); - return t1 tag nextil(t2); - } - return t1 "&" nextil(t2); - } - # Images - if(tag == "!["){ - if(!match(t2, /(\[.*\])|(\(.*\))/)) - return t1 tag nextil(t2); - match(t2, /^[^\]]*/); - alt = substr(t2, 1, RLENGTH); - t2 = substr(t2, RLENGTH + 2); - if(match(t2, /^\(/)){ - # Inline - sub(/^\(/, "", t2); - match(t2, /^[^\)]+/); - url = eschtml(substr(t2, 1, RLENGTH)); - t2 = substr(t2, RLENGTH + 2); - title = ""; - if(match(url, /[ ]+\".*\"[ ]*$/)) { - title = substr(url, RSTART, RLENGTH); - url = substr(url, 1, RSTART - 1); - match(title, /\".*\"/); - title = " title=\"" substr(title, RSTART + 1, RLENGTH - 2) "\""; - } - if(match(url, /^<.*>$/)) - url = substr(url, 2, RLENGTH - 2); - return t1 "\""" nextil(t2); - } - else{ - # Referenced - sub(/^ ?\[/, "", t2); - id = alt; - if(match(t2, /^[^\]]+/)) - id = substr(t2, 1, RLENGTH); - t2 = substr(t2, RLENGTH + 2); - if(ref[id]) - r = ref[id]; - else{ - r = "<<" id; - nr++; - } - return t1 "\""" nextil(t2); - } - } - # Links - if(tag == "["){ - if(!match(t2, /(\[.*\])|(\(.*\))/)) - return t1 tag nextil(t2); - match(t2, /^[^\]]*(\[[^\]]*\][^\]]*)*/); - linktext = substr(t2, 1, RLENGTH); - t2 = substr(t2, RLENGTH + 2); - if(match(t2, /^\(/)){ - # Inline - match(t2, /^[^\)]+(\([^\)]+\)[^\)]*)*/); - url = substr(t2, 2, RLENGTH - 1); - pt2 = substr(t2, RLENGTH + 2); - title = ""; - if(match(url, /[ ]+\".*\"[ ]*$/)) { - title = substr(url, RSTART, RLENGTH); - url = substr(url, 1, RSTART - 1); - match(title, /\".*\"/); - title = " title=\"" substr(title, RSTART + 1, RLENGTH - 2) "\""; - } - if(match(url, /^<.*>$/)) - url = substr(url, 2, RLENGTH - 2); - url = eschtml(url); - return t1 "" nextil(linktext) "" nextil(pt2); - } - else{ - # Referenced - sub(/^ ?\[/, "", t2); - id = linktext; - if(match(t2, /^[^\]]+/)) - id = substr(t2, 1, RLENGTH); - t2 = substr(t2, RLENGTH + 2); - if(ref[id]) - r = ref[id]; - else{ - r = "<<" id; - nr++; - } - pt2 = t2; - return t1 "" nextil(linktext) "" nextil(pt2); - } - } - # Emphasis - if(match(tag, /[*_]/)){ - ntag = tag; - if(sub("^" tag, "", t2)){ - if(stag[ns] == tag && match(t2, "^" tag)) - t2 = tag t2; - else - ntag = tag tag - } - n = length(ntag); - tag = (n == 2) ? "strong" : "em"; - if(match(t1, / $/) && match(t2, /^ /)) - return t1 tag nextil(t2); - if(stag[ns] == ntag){ - tag = "/" tag; - ns--; - } - else - stag[++ns] = ntag; - tag = "<" tag ">"; - return t1 tag nextil(t2); - } -} - -function inline(t) { - ilcode = 0; - ilcode2 = 0; - ns = 0; - - return nextil(t); -} - -function printp(tag) { - if(!match(text, /^[ ]*$/)){ - text = inline(text); - if(tag != "") - oprint("<" tag ">" text ""); - else - oprint(text); - } - text = ""; -} - -BEGIN { - blank = 0; - code = 0; - hr = 0; - html = 0; - nl = 0; - nr = 0; - otext = ""; - text = ""; - par = "p"; -} - -# References -!code && /^ *\[[^\]]*\]:[ ]+/ { - sub(/^ *\[/, ""); - match($0, /\]/); - id = substr($0, 1, RSTART - 1); - sub(id "\\]:[ ]+", ""); - title = ""; - if(match($0, /\".*\"$/)) - title = "\" title=\"" substr($0, RSTART + 1, RLENGTH - 2); - sub(/[ ]+\".*\"$/, ""); - url = eschtml($0); - ref[id] = url title; - - subref(id); - next; -} - -# html -!html && /^<(address|blockquote|center|dir|div|dl|fieldset|form|h[1-6r]|\ -isindex|menu|noframes|noscript|ol|p|pre|table|ul|!--)/ { - if(code) - oprint(""); - for(; !text && block[nl] == "blockquote"; nl--) - oprint(""); - match($0, /^<(address|blockquote|center|dir|div|dl|fieldset|form|h[1-6r]|\ - isindex|menu|noframes|noscript|ol|p|pre|table|ul|!--)/); - htag = substr($0, 2, RLENGTH - 1); - if(!match($0, "(<\\/" htag ">)|((^
    $)")) - html = 1; - if(html && match($0, /^
    $/ || -(hr && />$/)) { - html = 0; - hr = 0; - oprint($0); - next; -} - -html { - oprint($0); - next; -} - -# List and quote blocks - -# Remove indentation -{ - for(nnl = 0; nnl < nl; nnl++) - if((match(block[nnl + 1], /[ou]l/) && !sub(/^( | )/, "")) || \ - (block[nnl + 1] == "blockquote" && !sub(/^> ?/, ""))) - break; -} -nnl < nl && !blank && text && ! /^ ? ? ?([*+-]|([0-9]+\.)+)( +| )/ { nnl = nl; } -# Quote blocks -{ - while(sub(/^> /, "")) - nblock[++nnl] = "blockquote"; -} -# Horizontal rules -{ hr = 0; } -(blank || (!text && !code)) && /^ ? ? ?([-*_][ ]*)([-*_][ ]*)([-*_][ ]*)+$/ { - if(code){ - oprint(""); - code = 0; - } - blank = 0; - nnl = 0; - hr = 1; -} -# List items -block[nl] ~ /[ou]l/ && /^$/ { - blank = 1; - next; -} -{ newli = 0; } -!hr && (nnl != nl || !text || block[nl] ~ /[ou]l/) && /^ ? ? ?[*+-]( +| )/ { - sub(/^ ? ? ?[*+-]( +| )/, ""); - nnl++; - nblock[nnl] = "ul"; - newli = 1; -} -(nnl != nl || !text || block[nl] ~ /[ou]l/) && /^ ? ? ?([0-9]+\.)+( +| )/ { - sub(/^ ? ? ?([0-9]+\.)+( +| )/, ""); - nnl++; - nblock[nnl] = "ol"; - newli = 1; -} -newli { - if(blank && nnl == nl && !par) - par = "p"; - blank = 0; - printp(par); - if(nnl == nl && block[nl] == nblock[nl]) - oprint("
  • "); -} -blank && ! /^$/ { - if(match(block[nnl], /[ou]l/) && !par) - par = "p"; - printp(par); - par = "p"; - blank = 0; -} - -# Close old blocks and open new ones -nnl != nl || nblock[nl] != block[nl] { - if(code){ - oprint(""); - code = 0; - } - printp(par); - b = (nnl > nl) ? nblock[nnl] : block[nnl]; - par = (match(b, /[ou]l/)) ? "" : "p"; -} -nnl < nl || (nnl == nl && nblock[nl] != block[nl]) { - for(; nl > nnl || (nnl == nl && pblock[nl] != block[nl]); nl--){ - if(match(block[nl], /[ou]l/)) - oprint("
  • "); - oprint(""); - } -} -nnl > nl { - for(; nl < nnl; nl++){ - block[nl + 1] = nblock[nl + 1]; - oprint("<" block[nl + 1] ">"); - if(match(block[nl + 1], /[ou]l/)) - oprint("
  • "); - } -} -hr { - oprint("
    "); - next; -} - -# Code blocks -code && /^$/ { - if(blanK) - oprint(""); - blank = 1; - next; -} -!text && sub(/^( | )/, "") { - if(blanK) - oprint(""); - blank = 0; - if(!code) - oprint("
    ");
    -	code = 1;
    -	$0 = eschtml($0);
    -	oprint($0);
    -	next;
    -}
    -code {
    -	oprint("
    "); - code = 0; -} - -# Setex-style Headers -text && /^=+$/ {printp("h1"); next;} -text && /^-+$/ {printp("h2"); next;} - -# Atx-Style headers -/^#+/ && (!newli || par=="p" || /^##/) { - for(n = 0; n < 6 && sub(/^# */, ""); n++) - sub(/#$/, ""); - par = "h" n; -} - -# Paragraph -/^$/ { - printp(par); - par = "p"; - next; -} - -# Add text -{ text = (text ? text " " : "") $0; } - -END { - if(code){ - oprint(""); - code = 0; - } - printp(par); - for(; nl > 0; nl--){ - if(match(block[nl], /[ou]l/)) - oprint("
  • "); - oprint(""); - } - gsub(/<<[^\"]*/, "", otext); - print(otext); -} diff --git a/bin/contrib/rc-httpd/handlers/authorize b/bin/contrib/rc-httpd/handlers/authorize deleted file mode 100755 index ea4db3e..0000000 --- a/bin/contrib/rc-httpd/handlers/authorize +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/rc -if(~ $REMOTE_USER ''){ - extra_headers=($extra_headers 'WWW-Authenticate: Basic realm="'$"SERVER_NAME'"') - error 401 - exit -} diff --git a/bin/contrib/rc-httpd/handlers/cgi b/bin/contrib/rc-httpd/handlers/cgi deleted file mode 100755 index 2c9a9b9..0000000 --- a/bin/contrib/rc-httpd/handlers/cgi +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/rc -fn filter_headers{ - response=(200 OK) - lines='' - done=false - while(~ $done false){ - line=`{getline} - head=`{echo $line | awk '{print tolower($1)}'} - if(~ $head status:*) - response=`{echo $line | awk '{$1="" ; print}'} - if not if(~ $line '') - done=true - if not - lines=$"lines^$"line^$cr^' -' - } - echo 'HTTP/1.1' $"response^$cr - echo -n $"lines - do_log $response(1) -} - -fn run_cgi { - path=$cgi_path exec $"cgi_bin $params || echo 'Status: 500' -} - -cgi_bin=$1 -cgi_dir=. -if(! ~ $#* 1) - cgi_dir=$*($#*) -if not if(~ $"cgi_bin /*){ - cgi_dir=`{basename -d $"cgi_bin} - cgi_dir=$"cgi_dir -} -if(! ~ $"cgi_bin */*) - cgi_bin=./$"cgi_bin -if(! builtin cd $"cgi_dir >[2]/dev/null || ! test -x $"cgi_bin){ - error 500 - exit -} - -run_cgi | { - filter_headers - emit_extra_headers - echo $cr - exec cat -} diff --git a/bin/contrib/rc-httpd/handlers/dir-index b/bin/contrib/rc-httpd/handlers/dir-index deleted file mode 100755 index 00ff8ce..0000000 --- a/bin/contrib/rc-httpd/handlers/dir-index +++ /dev/null @@ -1,111 +0,0 @@ -#!/bin/rc -PATH_INFO=`{echo $PATH_INFO | urldecode.awk} -full_path=$"FS_ROOT^$"PATH_INFO -full_path=$"full_path -if(! test -d $full_path){ - error 404 - exit -} -if(! test -r $full_path -x $full_path){ - error 503 - exit -} -do_log 200 -builtin cd $full_path -if(~ $"NOINDEXFILE ^ $"NOINDEX ''){ - ifile=index.htm* - if(! ~ $ifile(1) *'*'){ - PATH_INFO=$ifile(1) - FS_ROOT='' - exec serve-static - } -} -title=`{echo $SITE_TITLE | sed s,%s,^$"PATH_INFO^,} -title=$"title -lso=() -switch($2){ -case size - # ls has no option to sort by size - # could pipe it through sort, I suppose -case date - lso=-t -} -echo 'HTTP/1.1 200 OK'^$cr -emit_extra_headers -echo 'Content-type: text/html'^$cr -echo $cr -echo ' - -'^$title^' - - -' -echo '

    '^$title^'

    ' -if(! ~ $PATH_INFO /) - echo 'Parent directory' -echo '
    ' -ls -lQ $lso | awk ' -function urlencode(loc){ - # very minimal encoding, just enough for our static-file purposes - url=loc - gsub("%", "%25", url) # this one first! - gsub("\\$", "%24", url) - gsub("&", "%26", url) - gsub("\\+", "%2B", url) - gsub("\\?", "%3F", url) - gsub(" ", "%20", url) - gsub("\"", "%22", url) - gsub("#", "%23", url) - return url -} -function hrsize(size){ - if(size > 1073741824) return sprintf("%.1fGB", size/1073741824) - if(size > 10485760) return sprintf("%iMB", size/1048576) - if(size > 1048576) return sprintf("%.1fMB", size/1048576) - if(size > 10240) return sprintf("%iKB", size/1024) - if(size > 1024) return sprintf("%.1fKB", size/1024) - return sprintf("%iB", size) -} -/^(-|a)/ { - print "" - print "" - print "" - print "" - print "" - $1="" ; $2="" ; $3="" ; $4="" ; $5="" ; $6="" ; $7="" ; $8="" ; $9="" - sub("^ *?", "") - print "" - print "" - $0="" -} -/^d/ { - print "" - print "" - print "" - print "" - print "" - $1="" ; $2="" ; $3="" ; $4="" ; $5="" ; $6="" ; $7="" ; $8="" ; $9="" - sub("^ *?", "") - print "" - print "" -}' -echo '
    "hrsize($6)""$7""$8""$9""$0"
    "$7""$8""$9""$0"/
    - - -' diff --git a/bin/contrib/rc-httpd/handlers/error b/bin/contrib/rc-httpd/handlers/error deleted file mode 100755 index 282d870..0000000 --- a/bin/contrib/rc-httpd/handlers/error +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/rc -# DO NOT make this script callable directly from the web! -fn do_error{ - echo 'HTTP/1.1 '^$1^$cr - emit_extra_headers - echo 'Content-type: text/html'^$cr - echo $cr - echo ' - -'^$1^' - - -

    '^$1^'

    ' - echo $2 - echo '

    rc-httpd at' $SERVER_NAME '' - echo ' - - - ' -} - -fn 401{ - do_error '401 Unauthorized' \ - 'The requested path '^$"location^' requires authorization.' -} - -fn 404{ - do_error '404 Not Found' \ - 'The requested path '^$"location^' was not found on this server.' -} - -fn 500{ - do_error '500 Internal Server Error' \ - 'The server has encountered an internal misconfiguration and is unable to satisfy your request.' -} - -fn 503{ - do_error '503 Forbidden' \ - 'You do not have permission to access '^$"location^' on this server.' -} - -do_log $1 -$1 diff --git a/bin/contrib/rc-httpd/handlers/redirect b/bin/contrib/rc-httpd/handlers/redirect deleted file mode 100755 index e223091..0000000 --- a/bin/contrib/rc-httpd/handlers/redirect +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/rc -if(~ $#2 0){ - error 500 - exit -} -switch($1){ -case perm* - do_log 301 - echo 'HTTP/1.1 301 Moved Permanently'^$cr -case temp* - do_log 302 - echo 'HTTP/1.1 302 Moved Temporarily'^$cr -case seeother - do_log 303 - echo 'HTTP/1.1 303 See Other'^$cr -case * - error 500 - exit -} -echo 'Location: ' ^ $2 ^ $cr -emit_extra_headers -echo 'Content-type: text/html'^$cr -echo $cr -echo '' -if(~ $#3 0) - echo 'Browser did not accept redirect.' -if not - echo $3 -echo 'Click here' -echo '' diff --git a/bin/contrib/rc-httpd/handlers/serve-static b/bin/contrib/rc-httpd/handlers/serve-static deleted file mode 100755 index 00cc70a..0000000 --- a/bin/contrib/rc-httpd/handlers/serve-static +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/rc -full_path=`{echo $"FS_ROOT^$"PATH_INFO | urldecode.awk} -full_path=$"full_path -if(~ $full_path */) - error 503 -if(test -d $full_path){ - redirect perm $"location^'/' \ - 'URL not quite right, and browser did not accept redirect.' - exit -} -if(! test -e $full_path){ - error 404 - exit -} -if(! test -r $full_path){ - error 503 - exit -} -do_log 200 -switch($full_path){ -case *.html *.htm - type=text/html -case *.css - type=text/css -case *.txt - type='text/plain; charset=utf-8' -case *.jpg *.jpeg - type=image/jpeg -case *.gif - type=image/gif -case *.png - type=image/png -case * - type=`{file -m $full_path || file -i $full_path} # GROSS -} -max_age=3600 # 1 hour -echo 'HTTP/1.1 200 OK'^$cr -emit_extra_headers -echo 'Content-type: '^$type^'; charset=utf-8'^$cr -echo 'Content-length: '^`{ls -l $full_path | awk '{print $6}'} -echo 'Cache-control: max-age='^$max_age^$cr -echo $cr -exec cat $full_path diff --git a/bin/contrib/rc-httpd/handlers/static-or-cgi b/bin/contrib/rc-httpd/handlers/static-or-cgi deleted file mode 100755 index 4d8a2d4..0000000 --- a/bin/contrib/rc-httpd/handlers/static-or-cgi +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/rc -cgiargs=$* - -fn error{ - if(~ $1 404) - exec cgi $cgiargs - if not - $rc_httpd_dir/handlers/error $1 -} - -if(~ $location */) - exec cgi $cgiargs -if not - exec serve-static diff --git a/bin/contrib/rc-httpd/handlers/static-or-index b/bin/contrib/rc-httpd/handlers/static-or-index deleted file mode 100755 index f0904f8..0000000 --- a/bin/contrib/rc-httpd/handlers/static-or-index +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/rc -if(~ $PATH_INFO */) - exec dir-index $params -if not - exec serve-static diff --git a/bin/contrib/rc-httpd/lib/urldecode.awk b/bin/contrib/rc-httpd/lib/urldecode.awk deleted file mode 100755 index 1dadd00..0000000 --- a/bin/contrib/rc-httpd/lib/urldecode.awk +++ /dev/null @@ -1,39 +0,0 @@ -# taken from werc -BEGIN { - hextab ["0"] = 0; hextab ["8"] = 8; - hextab ["1"] = 1; hextab ["9"] = 9; - hextab ["2"] = 2; hextab ["A"] = hextab ["a"] = 10 - hextab ["3"] = 3; hextab ["B"] = hextab ["b"] = 11; - hextab ["4"] = 4; hextab ["C"] = hextab ["c"] = 12; - hextab ["5"] = 5; hextab ["D"] = hextab ["d"] = 13; - hextab ["6"] = 6; hextab ["E"] = hextab ["e"] = 14; - hextab ["7"] = 7; hextab ["F"] = hextab ["f"] = 15; -} -{ - decoded = "" - i = 1 - len = length ($0) - while ( i <= len ) { - c = substr ($0, i, 1) - if ( c == "%" ) { - if ( i+2 <= len ) { - c1 = substr ($0, i+1, 1) - c2 = substr ($0, i+2, 1) - if ( hextab [c1] == "" || hextab [c2] == "" ) { - print "WARNING: invalid hex encoding: %" c1 c2 | "cat >&2" - } else { - code = 0 + hextab [c1] * 16 + hextab [c2] + 0 - c = sprintf ("%c", code) - i = i + 2 - } - } else { - print "WARNING: invalid % encoding: " substr ($0, i, len - i) - } - } else if ( c == "+" ) { - c = " " - } - decoded = decoded c - ++i - } - printf "%s", decoded -} diff --git a/bin/contrib/rc-httpd/rc-httpd b/bin/contrib/rc-httpd/rc-httpd deleted file mode 100755 index 8e4fad9..0000000 --- a/bin/contrib/rc-httpd/rc-httpd +++ /dev/null @@ -1,102 +0,0 @@ -#!/bin/rc -rc_httpd_dir=/home/sl/www/werc/bin/contrib/rc-httpd -libdir = $rc_httpd_dir/lib -path=($PLAN9/bin $rc_httpd_dir/handlers $PATH) -cgi_path=$PLAN9/bin -SERVER_PORT=80 # default for CGI scripts, may be overridden by the Host header -extra_headers='Server: rc-httpd' -cr= - -fn do_log{ - echo `{date} :: $SERVER_NAME :: $request :: \ - $HTTP_USER_AGENT :: $1 :: $HTTP_REFERER >[1=2] -} - -fn emit_extra_headers{ - for(header in $extra_headers) - echo $"header^$cr -} - -fn getline{ read | sed 's/'^$"cr^'$//g' } - -fn terminate{ - echo `{date} connection terminated >[1=2] - exit terminate -} - -fn trim_input{ dd -bs 1 -count $CONTENT_LENGTH } - -request=`{getline} -if(~ $#request 0) - terminate -REQUEST_METHOD=$request(1) -REQUEST_URI=$request(2) -reqlines='' -HTTP_COOKIE='' -REMOTE_USER='' -done=false -chunked=no -while(~ $"done false){ - line=`{getline} - if(~ $#line 0) - done=true - reqlines=$"reqlines$"line' -' - h=`{echo $line | awk '{print tolower($1)}'} - switch($h){ - case '' - done=true - case host: - SERVER_NAME=$line(2) - case referer: - HTTP_REFERER=$line(2) - case user-agent: - HTTP_USER_AGENT=`{echo $line | sed 's;[^:]+:[ ]+;;'} - case content-length: - CONTENT_LENGTH=$line(2) - case content-type: - CONTENT_TYPE=$line(2) - case cookie: - cookie=`{echo $line | sed 's;^[^:]+:[ ]*;;'} - HTTP_COOKIE=$"HTTP_COOKIE^$"cookie^'; ' - case authorization: - REMOTE_USER=`{auth/httpauth $line(3)} - case transfer-encoding: - ~ $line(2) chunked && chunked=yes - } -} -if(~ $REQUEST_URI *://* //*){ - SERVER_NAME=`{echo $REQUEST_URI | sed ' - s;^[^:]+:;; - s;^//([^/]+).*;\1;'} - REQUEST_URI=`{echo $REQUEST_URI | sed ' - s;^[^:]+:;; - s;^//[^/]+/?;/;'} -} -QUERY_STRING=`{echo $REQUEST_URI | sed 's;[^?]*\??;;'} -params=`{echo $QUERY_STRING | sed 's;\+; ;g'} -location=`{echo $REQUEST_URI | sed 's;\?.*;;'} -location=`{echo $location | sed ' - s;[^/]+/\.\./;/;g - s;/\./;/;g - s;//+;/;g -'} -SERVER_NAME=`{echo $SERVER_NAME | sed 's;^(\[[^\]]+\]|[^:]+)\:([0-9]+)$;\1 \2;'} -if(~ $#SERVER_NAME 2){ - SERVER_PORT=$SERVER_NAME(2) - SERVER_NAME=$SERVER_NAME(1) -} -if(~ $REQUEST_METHOD (PUT POST)){ - if(! ~ $"CONTENT_LENGTH '') - trim_input | exec $rc_httpd_dir/select-handler - if not{ - if(~ $chunked yes){ - echo 'HTTP/1.1 411 Length required'^$cr - echo $cr - exit - } - exec $rc_httpd_dir/select-handler - } -} -if not - . $rc_httpd_dir/select-handler diff --git a/bin/contrib/rc-httpd/select-handler b/bin/contrib/rc-httpd/select-handler deleted file mode 100755 index ec819d4..0000000 --- a/bin/contrib/rc-httpd/select-handler +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/rc -rfork n - -# Route requests to werc. -# Change paths to match your system. - -if(~ $SERVER_NAME 9base.werc.cat-v.org) - PLAN9=/usr/local/9base -if(~ $SERVER_NAME frontbase.werc.cat-v.org) - PLAN9=/usr/local/plan9front -if(~ $SERVER_NAME plan9port.werc.cat-v.org) - PLAN9=/usr/local/plan9 - -if(~ $SERVER_NAME *){ - PATH_INFO=$location - FS_ROOT=/home/sl/www/werc/sites/$SERVER_NAME - exec static-or-cgi /home/sl/www/werc/bin/werc.rc -} -if not - error 503 diff --git a/bin/contrib/tcp80 b/bin/contrib/tcp80 deleted file mode 100755 index ae111a0..0000000 --- a/bin/contrib/tcp80 +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/rc -# For use with listen(8). -# Change paths to match your system. -# Eitdit rc-httpd/rc-httpd to match your system. -PLAN9=/usr/local/plan9 -PATH=($PATH /home/sl/www/werc/bin/contrib) -exec /home/sl/www/werc/bin/contrib/rc-httpd/rc-httpd >>[2]/var/log/rc-httpd diff --git a/bin/contrib/urldecode.awk b/bin/contrib/urldecode.awk deleted file mode 100755 index bd791e3..0000000 --- a/bin/contrib/urldecode.awk +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/awk -f -BEGIN { - hextab ["0"] = 0; hextab ["8"] = 8; - hextab ["1"] = 1; hextab ["9"] = 9; - hextab ["2"] = 2; hextab ["A"] = hextab ["a"] = 10 - hextab ["3"] = 3; hextab ["B"] = hextab ["b"] = 11; - hextab ["4"] = 4; hextab ["C"] = hextab ["c"] = 12; - hextab ["5"] = 5; hextab ["D"] = hextab ["d"] = 13; - hextab ["6"] = 6; hextab ["E"] = hextab ["e"] = 14; - hextab ["7"] = 7; hextab ["F"] = hextab ["f"] = 15; -} -{ - decoded = "" - i = 1 - len = length ($0) - while ( i <= len ) { - c = substr ($0, i, 1) - if ( c == "%" ) { - if ( i+2 <= len ) { - c1 = substr ($0, i+1, 1) - c2 = substr ($0, i+2, 1) - if ( hextab [c1] == "" || hextab [c2] == "" ) { - print "WARNING: invalid hex encoding: %" c1 c2 | "cat >&2" - } else { - code = 0 + hextab [c1] * 16 + hextab [c2] + 0 - c = sprintf ("%c", code) - i = i + 2 - } - } else { - print "WARNING: invalid % encoding: " substr ($0, i, len - i) - } - } else if ( c == "+" ) { - c = " " - } - decoded = decoded c - ++i - } - print decoded -} diff --git a/bin/contrib/urlencode.awk b/bin/contrib/urlencode.awk deleted file mode 100755 index d4d354d..0000000 --- a/bin/contrib/urlencode.awk +++ /dev/null @@ -1,126 +0,0 @@ -# Taken from http://www.shelldorado.com/scripts/cmds/urlencode -########################################################################## -# Title : urlencode - encode URL data -# Author : Heiner Steven (heiner.steven@odn.de) -# Date : 2000-03-15 -# Requires : awk -# Categories : File Conversion, WWW, CGI -# SCCS-Id. : @(#) urlencode 1.4 06/10/29 -########################################################################## -# Description -# Encode data according to -# RFC 1738: "Uniform Resource Locators (URL)" and -# RFC 1866: "Hypertext Markup Language - 2.0" (HTML) -# -# This encoding is used i.e. for the MIME type -# "application/x-www-form-urlencoded" -# -# Notes -# o The default behaviour is not to encode the line endings. This -# may not be what was intended, because the result will be -# multiple lines of output (which cannot be used in an URL or a -# HTTP "POST" request). If the desired output should be one -# line, use the "-l" option. -# -# o The "-l" option assumes, that the end-of-line is denoted by -# the character LF (ASCII 10). This is not true for Windows or -# Mac systems, where the end of a line is denoted by the two -# characters CR LF (ASCII 13 10). -# We use this for symmetry; data processed in the following way: -# cat | urlencode -l | urldecode -l -# should (and will) result in the original data -# -# o Large lines (or binary files) will break many AWK -# implementations. If you get the message -# awk: record `...' too long -# record number xxx -# consider using GNU AWK (gawk). -# -# o urlencode will always terminate it's output with an EOL -# character -# -# Thanks to Stefan Brozinski for pointing out a bug related to non-standard -# locales. -# -# See also -# urldecode -########################################################################## - -PN=`basename "$0"` # Program name -VER='1.4' - -: ${AWK=awk} - -Usage () { - echo >&2 "$PN - encode URL data, $VER -usage: $PN [-l] [file ...] - -l: encode line endings (result will be one line of output) - -The default is to encode each input line on its own." - exit 1 -} - -Msg () { - for MsgLine - do echo "$PN: $MsgLine" >&2 - done -} - -Fatal () { Msg "$@"; exit 1; } - -set -- `getopt hl "$@" 2>/dev/null` || Usage -[ $# -lt 1 ] && Usage # "getopt" detected an error - -EncodeEOL=no -while [ $# -gt 0 ] -do - case "$1" in - -l) EncodeEOL=yes;; - --) shift; break;; - -h) Usage;; - -*) Usage;; - *) break;; # First file name - esac - shift -done - -LANG=C export LANG -$AWK ' - BEGIN { - # We assume an awk implementation that is just plain dumb. - # We will convert an character to its ASCII value with the - # table ord[], and produce two-digit hexadecimal output - # without the printf("%02X") feature. - - EOL = "%0A" # "end of line" string (encoded) - split ("1 2 3 4 5 6 7 8 9 A B C D E F", hextab, " ") - hextab [0] = 0 - for ( i=1; i<=255; ++i ) ord [ sprintf ("%c", i) "" ] = i + 0 - if ("'"$EncodeEOL"'" == "yes") EncodeEOL = 1; else EncodeEOL = 0 - } - { - encoded = "" - for ( i=1; i<=length ($0); ++i ) { - c = substr ($0, i, 1) - if ( c ~ /[a-zA-Z0-9.-]/ ) { - encoded = encoded c # safe character - } else if ( c == " " ) { - encoded = encoded "+" # special handling - } else { - # unsafe character, encode it as a two-digit hex-number - lo = ord [c] % 16 - hi = int (ord [c] / 16); - encoded = encoded "%" hextab [hi] hextab [lo] - } - } - if ( EncodeEOL ) { - printf ("%s", encoded EOL) - } else { - print encoded - } - } - END { - #if ( EncodeEOL ) print "" - } -' "$@" - diff --git a/bin/contrib/webserver.rc b/bin/contrib/webserver.rc deleted file mode 100755 index 8044565..0000000 --- a/bin/contrib/webserver.rc +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/rc - -# A web server in rc by maht -# Originally from http://www.proweb.co.uk/~matt/rc/webserver.rc - -ifs=' ' -request=`{sed 1q} - -url=$request(2) -file=`{echo $url | sed 's/http:\/\/[^\/]*//' | tr -d \012} - -if(test -d $file){ - file=$file ^'/index.html' -} -if(test -e $file) { - response='200' -} -if not { - response='404' - file='404.html' -} - -echo 'HTTP/1.1 ' ^$response -echo 'Date: ' `{date} -echo 'Server: rc shell' -echo 'Content-Length: ' `{cat $file | wc -c | tr -d ' '} -echo 'Content-Type: ' `{file -i $file | awk '{ print $2 }'} -echo 'Connection: close' -echo -cat $file diff --git a/bin/md2html.awk b/bin/md2html.awk new file mode 100755 index 0000000..81d1241 --- /dev/null +++ b/bin/md2html.awk @@ -0,0 +1,427 @@ +#!/bin/awk -f +# +# by: Jesus Galan (yiyus) 2009 +# +# Usage: md2html.awk file.md > file.html +# See: http://4l77.com/src/md2html.awk + +function eschtml(t) { + gsub("&", "\\&", t); + gsub("<", "\\<", t); + return t; +} + +function oprint(t){ + if(nr == 0) + print t; + else + otext = otext "\n" t; +} + +function subref(id){ + for(; nr > 0 && sub("<<" id, ref[id], otext); nr--); + if(nr == 0 && otext) { + print otext; + otext = ""; + } +} + +function nextil(t) { + if(!match(t, /[`<&\[*_\\-]|(\!\[)/)) + return t; + t1 = substr(t, 1, RSTART - 1); + tag = substr(t, RSTART, RLENGTH); + t2 = substr(t, RSTART + RLENGTH); + if(ilcode && tag != "`") + return eschtml(t1 tag) nextil(t2); + # Backslash escaping + if(tag == "\\"){ + if(match(t2, /^[\\`*_{}\[\]()#+\-\.!]/)){ + tag = substr(t2, 1, 1); + t2 = substr(t2, 2); + } + return t1 tag nextil(t2); + } + # Dashes + if(tag == "-"){ + if(sub(/^-/, "", t2)) + tag = "—"; + return t1 tag nextil(t2); + } + # Inline Code + if(tag == "`"){ + if(sub(/^`/, "", t2)){ + if(!match(t2, /``/)) + return t1 "”" nextil(t2); + ilcode2 = !ilcode2; + } + else if(ilcode2) + return t1 tag nextil(t2); + tag = ""; + if(ilcode){ + t1 = eschtml(t1); + tag = ""; + } + ilcode = !ilcode; + return t1 tag nextil(t2); + } + if(tag == "<"){ + # Autolinks + if(match(t2, /^[^ ]+[\.@][^ ]+>/)){ + url = eschtml(substr(t2, 1, RLENGTH - 1)); + t2 = substr(t2, RLENGTH + 1); + linktext = url; + if(match(url, /@/) && !match(url, /^mailto:/)) + url = "mailto:" url; + return t1 "" linktext "" nextil(t2); + } + # Html tags + if(match(t2, /^[A-Za-z\/!][^>]*>/)){ + tag = tag substr(t2, RSTART, RLENGTH); + t2 = substr(t2, RLENGTH + 1); + return t1 tag nextil(t2); + } + return t1 "<" nextil(t2); + } + # Html special entities + if(tag == "&"){ + if(match(t2, /^#?[A-Za-z0-9]+;/)){ + tag = tag substr(t2, RSTART, RLENGTH); + t2 = substr(t2, RLENGTH + 1); + return t1 tag nextil(t2); + } + return t1 "&" nextil(t2); + } + # Images + if(tag == "!["){ + if(!match(t2, /(\[.*\])|(\(.*\))/)) + return t1 tag nextil(t2); + match(t2, /^[^\]]*/); + alt = substr(t2, 1, RLENGTH); + t2 = substr(t2, RLENGTH + 2); + if(match(t2, /^\(/)){ + # Inline + sub(/^\(/, "", t2); + match(t2, /^[^\)]+/); + url = eschtml(substr(t2, 1, RLENGTH)); + t2 = substr(t2, RLENGTH + 2); + title = ""; + if(match(url, /[ ]+\".*\"[ ]*$/)) { + title = substr(url, RSTART, RLENGTH); + url = substr(url, 1, RSTART - 1); + match(title, /\".*\"/); + title = " title=\"" substr(title, RSTART + 1, RLENGTH - 2) "\""; + } + if(match(url, /^<.*>$/)) + url = substr(url, 2, RLENGTH - 2); + return t1 "\""" nextil(t2); + } + else{ + # Referenced + sub(/^ ?\[/, "", t2); + id = alt; + if(match(t2, /^[^\]]+/)) + id = substr(t2, 1, RLENGTH); + t2 = substr(t2, RLENGTH + 2); + if(ref[id]) + r = ref[id]; + else{ + r = "<<" id; + nr++; + } + return t1 "\""" nextil(t2); + } + } + # Links + if(tag == "["){ + if(!match(t2, /(\[.*\])|(\(.*\))/)) + return t1 tag nextil(t2); + match(t2, /^[^\]]*(\[[^\]]*\][^\]]*)*/); + linktext = substr(t2, 1, RLENGTH); + t2 = substr(t2, RLENGTH + 2); + if(match(t2, /^\(/)){ + # Inline + match(t2, /^[^\)]+(\([^\)]+\)[^\)]*)*/); + url = substr(t2, 2, RLENGTH - 1); + pt2 = substr(t2, RLENGTH + 2); + title = ""; + if(match(url, /[ ]+\".*\"[ ]*$/)) { + title = substr(url, RSTART, RLENGTH); + url = substr(url, 1, RSTART - 1); + match(title, /\".*\"/); + title = " title=\"" substr(title, RSTART + 1, RLENGTH - 2) "\""; + } + if(match(url, /^<.*>$/)) + url = substr(url, 2, RLENGTH - 2); + url = eschtml(url); + return t1 "" nextil(linktext) "" nextil(pt2); + } + else{ + # Referenced + sub(/^ ?\[/, "", t2); + id = linktext; + if(match(t2, /^[^\]]+/)) + id = substr(t2, 1, RLENGTH); + t2 = substr(t2, RLENGTH + 2); + if(ref[id]) + r = ref[id]; + else{ + r = "<<" id; + nr++; + } + pt2 = t2; + return t1 "" nextil(linktext) "" nextil(pt2); + } + } + # Emphasis + if(match(tag, /[*_]/)){ + ntag = tag; + if(sub("^" tag, "", t2)){ + if(stag[ns] == tag && match(t2, "^" tag)) + t2 = tag t2; + else + ntag = tag tag + } + n = length(ntag); + tag = (n == 2) ? "strong" : "em"; + if(match(t1, / $/) && match(t2, /^ /)) + return t1 tag nextil(t2); + if(stag[ns] == ntag){ + tag = "/" tag; + ns--; + } + else + stag[++ns] = ntag; + tag = "<" tag ">"; + return t1 tag nextil(t2); + } +} + +function inline(t) { + ilcode = 0; + ilcode2 = 0; + ns = 0; + + return nextil(t); +} + +function printp(tag) { + if(!match(text, /^[ ]*$/)){ + text = inline(text); + if(tag != "") + oprint("<" tag ">" text ""); + else + oprint(text); + } + text = ""; +} + +BEGIN { + blank = 0; + code = 0; + hr = 0; + html = 0; + nl = 0; + nr = 0; + otext = ""; + text = ""; + par = "p"; +} + +# References +!code && /^ *\[[^\]]*\]:[ ]+/ { + sub(/^ *\[/, ""); + match($0, /\]/); + id = substr($0, 1, RSTART - 1); + sub(id "\\]:[ ]+", ""); + title = ""; + if(match($0, /\".*\"$/)) + title = "\" title=\"" substr($0, RSTART + 1, RLENGTH - 2); + sub(/[ ]+\".*\"$/, ""); + url = eschtml($0); + ref[id] = url title; + + subref(id); + next; +} + +# html +!html && /^<(address|blockquote|center|dir|div|dl|fieldset|form|h[1-6r]|\ +isindex|menu|noframes|noscript|ol|p|pre|table|ul|!--)/ { + if(code) + oprint("

    "); + for(; !text && block[nl] == "blockquote"; nl--) + oprint(""); + match($0, /^<(address|blockquote|center|dir|div|dl|fieldset|form|h[1-6r]|\ + isindex|menu|noframes|noscript|ol|p|pre|table|ul|!--)/); + htag = substr($0, 2, RLENGTH - 1); + if(!match($0, "(<\\/" htag ">)|((^
    $)")) + html = 1; + if(html && match($0, /^
    $/ || +(hr && />$/)) { + html = 0; + hr = 0; + oprint($0); + next; +} + +html { + oprint($0); + next; +} + +# List and quote blocks + +# Remove indentation +{ + for(nnl = 0; nnl < nl; nnl++) + if((match(block[nnl + 1], /[ou]l/) && !sub(/^( | )/, "")) || \ + (block[nnl + 1] == "blockquote" && !sub(/^> ?/, ""))) + break; +} +nnl < nl && !blank && text && ! /^ ? ? ?([*+-]|([0-9]+\.)+)( +| )/ { nnl = nl; } +# Quote blocks +{ + while(sub(/^> /, "")) + nblock[++nnl] = "blockquote"; +} +# Horizontal rules +{ hr = 0; } +(blank || (!text && !code)) && /^ ? ? ?([-*_][ ]*)([-*_][ ]*)([-*_][ ]*)+$/ { + if(code){ + oprint("
    "); + code = 0; + } + blank = 0; + nnl = 0; + hr = 1; +} +# List items +block[nl] ~ /[ou]l/ && /^$/ { + blank = 1; + next; +} +{ newli = 0; } +!hr && (nnl != nl || !text || block[nl] ~ /[ou]l/) && /^ ? ? ?[*+-]( +| )/ { + sub(/^ ? ? ?[*+-]( +| )/, ""); + nnl++; + nblock[nnl] = "ul"; + newli = 1; +} +(nnl != nl || !text || block[nl] ~ /[ou]l/) && /^ ? ? ?([0-9]+\.)+( +| )/ { + sub(/^ ? ? ?([0-9]+\.)+( +| )/, ""); + nnl++; + nblock[nnl] = "ol"; + newli = 1; +} +newli { + if(blank && nnl == nl && !par) + par = "p"; + blank = 0; + printp(par); + if(nnl == nl && block[nl] == nblock[nl]) + oprint("
  • "); +} +blank && ! /^$/ { + if(match(block[nnl], /[ou]l/) && !par) + par = "p"; + printp(par); + par = "p"; + blank = 0; +} + +# Close old blocks and open new ones +nnl != nl || nblock[nl] != block[nl] { + if(code){ + oprint(""); + code = 0; + } + printp(par); + b = (nnl > nl) ? nblock[nnl] : block[nnl]; + par = (match(b, /[ou]l/)) ? "" : "p"; +} +nnl < nl || (nnl == nl && nblock[nl] != block[nl]) { + for(; nl > nnl || (nnl == nl && pblock[nl] != block[nl]); nl--){ + if(match(block[nl], /[ou]l/)) + oprint("
  • "); + oprint(""); + } +} +nnl > nl { + for(; nl < nnl; nl++){ + block[nl + 1] = nblock[nl + 1]; + oprint("<" block[nl + 1] ">"); + if(match(block[nl + 1], /[ou]l/)) + oprint("
  • "); + } +} +hr { + oprint("
    "); + next; +} + +# Code blocks +code && /^$/ { + if(blanK) + oprint(""); + blank = 1; + next; +} +!text && sub(/^( | )/, "") { + if(blanK) + oprint(""); + blank = 0; + if(!code) + oprint("
    ");
    +	code = 1;
    +	$0 = eschtml($0);
    +	oprint($0);
    +	next;
    +}
    +code {
    +	oprint("
    "); + code = 0; +} + +# Setex-style Headers +text && /^=+$/ {printp("h1"); next;} +text && /^-+$/ {printp("h2"); next;} + +# Atx-Style headers +/^#+/ && (!newli || par=="p" || /^##/) { + for(n = 0; n < 6 && sub(/^# */, ""); n++) + sub(/#$/, ""); + par = "h" n; +} + +# Paragraph +/^$/ { + printp(par); + par = "p"; + next; +} + +# Add text +{ text = (text ? text " " : "") $0; } + +END { + if(code){ + oprint(""); + code = 0; + } + printp(par); + for(; nl > 0; nl--){ + if(match(block[nl], /[ou]l/)) + oprint("
  • "); + oprint(""); + } + gsub(/<<[^\"]*/, "", otext); + print(otext); +} diff --git a/bin/werc.rc b/bin/werc.rc index 0d006a3..1f83e96 100755 --- a/bin/werc.rc +++ b/bin/werc.rc @@ -20,7 +20,6 @@ path=(. /bin ./bin) res_tail='' http_content_type='text/html' ll_add handlers_bar_left nav_tree -werc_apps=( apps/* ) werc_root=`{pwd} sitesdir=sites @@ -29,9 +28,6 @@ sitesdir=sites if(test -f etc/initrc.local) . ./etc/initrc.local -for(a in $werc_apps) - . ./$a/app.rc - fn werc_exec_request { site=$SERVER_NAME base_url=http://$site:$SERVER_PORT @@ -61,7 +57,6 @@ fn werc_exec_request { if(~ $local_path */) { if(test -d $local_path) local_path=$local_path^'index' - # XXX: This redir might step on apps with synthetic dirs. if not if(ls `{basename -d $local_path}^* >/dev/null >[2]/dev/null) perm_redirect `{echo $req_path|sed 's,/+$,,'} } diff --git a/etc/initrc b/etc/initrc index f0b26c2..21a8aed 100755 --- a/etc/initrc +++ b/etc/initrc @@ -18,22 +18,16 @@ plan9port=$PLAN9 # Path, make sure the plan9port /bin directory is included before /bin # Keep '.' in path! It is needed. -path=($plan9port/bin . ./bin ./bin/contrib /bin /usr/bin) +path=($plan9port/bin . ./bin /bin /usr/bin) # Set this to your favorite markdown formatter, eg., markdown.pl (fltr_cache # takes as an argument a filter, in the default configuration markdown.pl, that # caches output) Note that some werc components assume a markdown-like # formatter, but all major functionality should should be formatter agnostic. -#formatter=(fltr_cache markdown.pl) -formatter=(fltr_cache md2html.awk) # no perl for old men +formatter=(fltr_cache md2html.awk) # Enable debugging, to disable set to () -debug=true +debug=false # Globally enabled apps enabled_apps=() - -# Default site variables, must be set in initrc.local or _werc/config, only siteTitle is required. -#masterSite=cat-v.org # Not required! -#siteTitle='cat-v' -#siteSubTitle='Considered harmful' diff --git a/etc/users/GROUP_AND_USER_ACCOUNTS b/etc/users/GROUP_AND_USER_ACCOUNTS deleted file mode 100644 index f563306..0000000 --- a/etc/users/GROUP_AND_USER_ACCOUNTS +++ /dev/null @@ -1 +0,0 @@ -This is just a dummy file to force hg to preserve this directory that is used to store user and group account information. diff --git a/files/djv.tar b/files/djv.tar new file mode 100644 index 0000000..5d60262 Binary files /dev/null and b/files/djv.tar differ diff --git a/files/djvmono.tar b/files/djvmono.tar new file mode 100644 index 0000000..1fb0c7d Binary files /dev/null and b/files/djvmono.tar differ diff --git a/files/faces.patch b/files/faces.patch new file mode 100644 index 0000000..3309c1b --- /dev/null +++ b/files/faces.patch @@ -0,0 +1,105 @@ +From 5595dbb332eae353832dbc2ad11ef92aeb8fcab0 +From: Peter Mikkelsen +Date: Mon, 28 Jun 2021 21:45:53 +0000 +Subject: [PATCH] Add -u flag to faces, making it only show unread messages. + +--- +diff 658757abed7be283e06bae3b1722fc2703334d74 5595dbb332eae353832dbc2ad11ef92aeb8fcab0 +--- a/sys/man/1/faces Sun Jun 27 02:13:58 2021 ++++ b/sys/man/1/faces Mon Jun 28 23:45:53 2021 +@@ -4,7 +4,7 @@ + .SH SYNOPSIS + .B faces + [ +-.B -ihc ++.B -ihcu + ] [ + .B -m + .I maildir +@@ -99,6 +99,15 @@ + rather than the current state of the mail box. + In particular, faces are not removed from the screen when messages are deleted. + Also, in this mode clicking button 1 in the display will clear the window. ++.PP ++The ++.B -u ++flag causes ++.I faces ++to read in the mailbox like with the ++.B -i ++flag, but it only shows the unread ones. ++When right-clicking on a message icon in this mode, the message is both plumbed and removed from the view. + .PP + .I Seemail + is an +--- a/sys/src/cmd/faces/main.c Sun Jun 27 02:13:58 2021 ++++ b/sys/src/cmd/faces/main.c Mon Jun 28 23:45:53 2021 +@@ -10,6 +10,7 @@ + int history = 0; /* use old interface, showing history of mailbox rather than current state */ + int initload = 0; /* initialize program with contents of mail box */ + int clickrm = 0; /* allows removing mail faces by left clicking */ ++int onlyunread = 0; /* initialize program with unread messages, remove when clicked */ + + enum + { +@@ -358,6 +359,28 @@ + unlockdisplay(display); + } + ++int ++isunread(char *dir, char *num) ++{ ++ char buf[1024], flags[8]; ++ int n, fd, unread; ++ ++ snprint(buf, sizeof(buf), "%s/%s/flags", dir, num); ++ fd = open(buf, OREAD); ++ if(fd < 0) ++ return 0; ++ n = readn(fd, flags, 7); ++ close(fd); ++ if(n != 7) ++ return 0; ++ flags[n] = '\0'; ++ if(strchr(flags, 's') != nil) ++ unread = 0; ++ else ++ unread = 1; ++ return unread; ++} ++ + void + loadmboxfaces(char *maildir) + { +@@ -370,7 +393,8 @@ + chdir(maildir); + while((n = dirread(dirfd, &d)) > 0){ + for(i=0; iTall) ++ if(type < 0 || type >Tcaa) + return 0; + return rrtname[type] != nil; + } +@@ -1891,7 +1892,7 @@ + char *t; + + t = nil; +- if(type >= 0 && type <= Tall) ++ if(type >= 0 && type <= Tcaa) + t = rrtname[type]; + if(t==nil){ + snprint(buf, len, "%d", type); +diff -r 4adb989bc93e sys/src/cmd/ndb/dns.h +--- a/sys/src/cmd/ndb/dns.h Tue Nov 03 20:47:14 2020 +0100 ++++ b/sys/src/cmd/ndb/dns.h Sun Nov 29 16:42:47 2020 +0100 +@@ -71,6 +71,7 @@ + Tmailb= 253, /* { Tmb, Tmg, Tmr } */ + Tmaila= 254, /* obsolete */ + Tall= 255, /* all records */ ++ Tcaa= 257, /* Certification authority restriction */ + + /* classes */ + Csym= 0, /* internal symbols */ diff --git a/files/websocket-webfs.patch b/files/websocket-webfs.patch new file mode 100644 index 0000000..77c44b0 --- /dev/null +++ b/files/websocket-webfs.patch @@ -0,0 +1,565 @@ +From 424bcc25db6c3de73678fe43d44e4b408cd0434d +From: Peter Mikkelsen +Date: Wed, 23 Jun 2021 15:44:24 +0000 +Subject: [PATCH] Initial buggy version of adding websocket support to webfs + + +It can create connections but doesn't handle errors very well yet. +--- +diff ce73821f3575921e24f839b21c7be60520a9dc42 424bcc25db6c3de73678fe43d44e4b408cd0434d +--- a/sys/src/cmd/webfs/fns.h Mon Jun 21 17:38:11 2021 ++++ b/sys/src/cmd/webfs/fns.h Wed Jun 23 17:44:24 2021 +@@ -41,3 +41,6 @@ + int authenticate(Url *u, Url *ru, char *method, char *s); + void flushauth(Url *u, char *t); + void http(char *m, Url *u, Key *shdr, Buq *qbody, Buq *qpost); ++ ++/* websocket */ ++void websocket(int fd, Buq *qbody, Buq *qpost); +--- a/sys/src/cmd/webfs/fs.c Mon Jun 21 17:38:11 2021 ++++ b/sys/src/cmd/webfs/fs.c Wed Jun 23 17:44:24 2021 +@@ -4,6 +4,7 @@ + #include + #include + #include <9p.h> ++#include + + #include "dat.h" + #include "fns.h" +@@ -19,10 +20,12 @@ + Url *baseurl; + Url *url; + Key *hdr; ++ int wantwebsocket; + + int obody; /* body opend */ + int cbody; /* body closed */ + Buq *qbody; ++ Buq *websocketin; /* websocket input */ + }; + + struct Webfid +@@ -121,6 +124,8 @@ + + buclose(cl->qbody, 0); + bufree(cl->qbody); ++ buclose(cl->websocketin, 0); ++ bufree(cl->websocketin); + + while(k = cl->hdr){ + cl->hdr = k->next; +@@ -384,6 +389,25 @@ + if(cl->qbody == nil){ + char *m; + ++ if(f->level == Qbody && (!strcmp(cl->url->scheme, "ws") || !strcmp(cl->url->scheme, "wss"))){ ++ cl->wantwebsocket = 1; ++ cl->websocketin = bualloc(64*1024); ++ if(!lookkey(cl->hdr, "Upgrade")) ++ cl->hdr = addkey(cl->hdr, "Upgrade", "websocket"); ++ if(!lookkey(cl->hdr, "Connection")) ++ cl->hdr = addkey(cl->hdr, "Connection", "upgrade"); ++ if(!lookkey(cl->hdr, "Sec-WebSocket-Version")) ++ cl->hdr = addkey(cl->hdr, "Sec-WebSocket-Version", "13"); ++ if(!lookkey(cl->hdr, "Sec-WebSocket-Key")){ ++ uchar nonce[16]; ++ char *b64nonce; ++ genrandom(nonce, 16); ++ b64nonce = smprint("%.*[", 16, nonce); ++ cl->hdr = addkey(cl->hdr, "Sec-WebSocket-Key", b64nonce); ++ free(b64nonce); ++ } ++ } ++ + if(cl->url == nil){ + respond(r, "no url set"); + return; +@@ -413,7 +437,7 @@ + if(agent && !lookkey(cl->hdr, "User-Agent")) + cl->hdr = addkey(cl->hdr, "User-Agent", agent); + +- http(m, cl->url, cl->hdr, cl->qbody, f->buq); ++ http(m, cl->url, cl->hdr, cl->qbody, cl->wantwebsocket ? cl->websocketin : f->buq); + cl->request[0] = 0; + cl->url = nil; + cl->hdr = nil; +@@ -683,6 +707,11 @@ + case Qpost: + bureq(f->buq, r); + return; ++ case Qbody: ++ if(f->client->wantwebsocket){ ++ bureq(f->client->websocketin, r); ++ return; ++ } + } + respond(r, "not implemented"); + } +--- a/sys/src/cmd/webfs/http.c Mon Jun 21 17:38:11 2021 ++++ b/sys/src/cmd/webfs/http.c Wed Jun 23 17:44:24 2021 +@@ -131,7 +131,7 @@ + if(strcmp(proxy->scheme, "https") == 0) + fd = tlswrap(fd, proxy->host); + } else { +- if(strcmp(u->scheme, "https") == 0) ++ if(strcmp(u->scheme, "https") == 0 || strcmp(u->scheme, "wss") == 0) + fd = tlswrap(fd, u->host); + } + if(fd < 0){ +@@ -520,7 +520,7 @@ + void + http(char *m, Url *u, Key *shdr, Buq *qbody, Buq *qpost) + { +- int i, l, n, try, pid, fd, cfd, needlength, chunked, retry, nobody, badauth; ++ int i, l, n, try, pid, fd, cfd, needlength, chunked, retry, nobody, badauth, wantwebsocket; + char *s, *x, buf[8192+2], status[256], method[16], *host; + vlong length, offset; + Url ru, tu, *nu; +@@ -549,8 +549,13 @@ + break; + } + ++ if(!strcmp(u->scheme, "ws") || !strcmp(u->scheme, "wss")) ++ wantwebsocket = 1; ++ else ++ wantwebsocket = 0; ++ + notify(catch); +- if(qpost){ ++ if(qpost && !wantwebsocket){ + /* file for spooling the postbody if we need to restart the request */ + snprint(buf, sizeof(buf), "/tmp/http.%d.%d.post", getppid(), getpid()); + fd = create(buf, OEXCL|ORDWR|ORCLOSE, 0600); +@@ -565,7 +570,7 @@ + badauth = 0; + for(try = 0; try < 12; try++){ + strcpy(status, "0 No status"); +- if(u == nil || (strcmp(u->scheme, "http") && strcmp(u->scheme, "https"))){ ++ if(u == nil || (strcmp(u->scheme, "http") && strcmp(u->scheme, "https") && strcmp(u->scheme, "ws") && strcmp(u->scheme, "wss"))){ + werrstr("bad url scheme"); + break; + } +@@ -591,7 +596,7 @@ + + length = 0; + chunked = 0; +- if(qpost){ ++ if(qpost && !wantwebsocket){ + /* have to read it to temp file to figure out the length */ + if(fd >= 0 && needlength && lookkey(shdr, "Content-Length") == nil){ + seek(fd, 0, 2); +@@ -700,7 +705,7 @@ + goto Retry; + } + +- if(qpost && !h->tunnel){ ++ if(qpost && !h->tunnel && !wantwebsocket){ + h->cancel = 0; + if((pid = rfork(RFMEM|RFPROC)) <= 0){ + int ifd; +@@ -802,8 +807,42 @@ + goto Status; + } + goto Error; +- case 100: /* Continue */ + case 101: /* Switching Protocols */ ++ if(wantwebsocket){ ++ int ok = 1; ++ char *wskey = lookkey(shdr, "Sec-WebSocket-Key"); ++ ++ k = getkey(rhdr, "Upgrade"); ++ if(k == nil || cistrcmp(k->val, "websocket") != 0) ++ ok = 0; ++ ++ k = getkey(rhdr, "Connection"); ++ if(k == nil && cistrcmp(k->val, "upgrade") != 0) ++ ok = 0; ++ ++ k = getkey(rhdr, "Sec-WebSocket-Accept"); ++ if(k == nil || wskey == nil) ++ ok = 0; ++ else{ ++ uchar digest[SHA1dlen]; ++ char *str = smprint("%s258EAFA5-E914-47DA-95CA-C5AB0DC85B11", wskey); ++ ++ sha1((uchar*)str, strlen(str), digest, nil); ++ char *val = smprint("%.*[", SHA1dlen, digest); ++ if(strcmp(val, k->val) != 0) ++ ok = 0; ++ free(str); ++ free(val); ++ } ++ ++ if(ok){ ++ qbody->url = u; u = nil; ++ qbody->hdr = rhdr; rhdr = nil; ++ websocket(h->fd, qbody, qpost); ++ } ++ goto Error; ++ } ++ case 100: /* Continue */ + case 102: /* Processing */ + case 103: /* Early Hints */ + while(k = rhdr){ +--- a/sys/src/cmd/webfs/mkfile Mon Jun 21 17:38:11 2021 ++++ b/sys/src/cmd/webfs/mkfile Wed Jun 23 17:44:24 2021 +@@ -3,6 +3,6 @@ + TARG=webfs + + HFILES=fns.h dat.h +-OFILES=sub.$O url.$O buq.$O http.$O fs.$O ++OFILES=sub.$O url.$O buq.$O http.$O websocket.$O fs.$O + + ++#include ++#include ++#include ++#include <9p.h> ++#include ++ ++#include "dat.h" ++#include "fns.h" ++ ++typedef struct Frame Frame; ++typedef struct Message Message; ++ ++struct Frame ++{ ++ int final; ++ int opcode; ++ int masked; ++ uchar maskkey[4]; ++ uvlong length; ++ uchar *data; ++ ++ Frame *next; /* Chain frames in a message together */ ++}; ++ ++struct Message ++{ ++ int type; ++ uvlong length; ++ uchar *data; ++}; ++ ++enum { ++ ContinueFrame = 0x0, ++ TextFrame = 0x1, ++ BinaryFrame = 0x2, ++ CloseFrame = 0x8, ++ PingFrame = 0x9, ++ PongFrame = 0xA, ++}; ++ ++void writemessage(int, Message *); ++ ++void ++maskframe(Frame *f) ++{ ++ uvlong i; ++ for(i = 0; i < f->length; i++) ++ f->data[i] = f->data[i] ^ f->maskkey[i%4]; ++} ++ ++Frame * ++readframe(int fd) ++{ ++ Frame *f = malloc(sizeof(Frame)); ++ long n; ++ int offset; ++ uchar len; ++ ++ uchar buf[4096]; ++ ++Again: ++ offset = 0; ++ n = read(fd, buf, 2); ++ if(n != 2) ++ goto Error; ++ ++ f->final = (buf[offset] >> 7) & 0x1; ++ /* ignore rsv1, rsv2, rsv3 */ ++ f->opcode = buf[offset] & 0x0F; ++ offset++; ++ ++ f->masked = (buf[offset] >> 7) & 0x1; ++ len = buf[offset] & 0x7F; ++ offset++; ++ ++ if(len <= 125) ++ f->length = len; ++ else if(len == 126){ ++ n = read(fd, buf+offset, 2); ++ if(n != 2) ++ goto Error; ++ ++ f->length = buf[offset++] << 8; ++ f->length |= buf[offset++]; ++ }else if(len == 127){ ++ n = read(fd, buf+offset, 8); ++ if(n != 8) ++ goto Error; ++ f->length = (uvlong)buf[offset++] << 56; ++ f->length |= (uvlong)buf[offset++] << 48; ++ f->length |= (uvlong)buf[offset++] << 40; ++ f->length |= (uvlong)buf[offset++] << 32; ++ f->length |= buf[offset++] << 24; ++ f->length |= buf[offset++] << 16; ++ f->length |= buf[offset++] << 8; ++ f->length |= buf[offset++]; ++ } ++ ++ if(f->masked){ ++ n = read(fd, buf+offset, 4); ++ if(n != 4) ++ goto Error; ++ ++ f->maskkey[0] = buf[offset++]; ++ f->maskkey[1] = buf[offset++]; ++ f->maskkey[2] = buf[offset++]; ++ f->maskkey[3] = buf[offset]; ++ } ++ ++ f->data = malloc(f->length); ++ readn(fd, f->data, f->length); ++ if(f->masked) ++ maskframe(f); ++ ++ if(f->opcode == PingFrame){ ++ Message *m = malloc(sizeof(Message)); ++ m->type = PongFrame; ++ m->length = f->length; ++ m->data = f->data; ++ writemessage(fd, m); /* SHOULD LOCK */ ++ free(m); ++ free(f->data); ++ goto Again; ++ } ++ ++ return f; ++Error: ++ exits("Readframe failed"); ++ return nil; ++} ++ ++Message * ++framestomessage(Frame *frames) ++{ ++ Message *m = malloc(sizeof(Message)); ++ uvlong length = 0; ++ uvlong offset = 0; ++ ++ Frame *f; ++ for(f = frames; f != nil; f = f->next) ++ length += f->length; ++ ++ m->type = frames->opcode; ++ m->length = length; ++ m->data = malloc(length); ++ for(f = frames; f != nil; f = f->next){ ++ memcpy(m->data + offset, f->data, f->length); ++ offset += f->length; ++ } ++ ++ return m; ++} ++ ++Message * ++readmsg(int fd) ++{ ++ Frame *frames = readframe(fd); ++ Frame *last = frames; ++ Message *m; ++ ++ while(!last->final){ ++ last->next = readframe(fd); ++ last = last->next; ++ } ++ last->next = nil; ++ ++ m = framestomessage(frames); ++ while(frames){ ++ Frame *f = frames->next; ++ free(frames->data); ++ free(frames); ++ frames = f; ++ } ++ return m; ++} ++ ++void ++writeframe(int fd, Frame *f) ++{ ++ uchar *buf; ++ uvlong totsize = 0; ++ uvlong offset = 0; ++ int lenbytes = 0; ++ ++ totsize += 2; /* Always there */ ++ if(f->length == 126) ++ lenbytes = 2; ++ else if(f->length == 127) ++ lenbytes = 8; ++ totsize += lenbytes; ++ ++ if(f->masked) ++ totsize += 4; ++ ++ totsize += f->length; ++ ++ buf = malloc(totsize); ++ ++ buf[offset] = f->final << 7; ++ buf[offset++] |= f->opcode; ++ buf[offset] = f->masked << 7; ++ ++ if(lenbytes == 0) ++ buf[offset++] |= f->length; ++ else if(lenbytes == 2) ++ buf[offset++] |= 126; ++ else if(lenbytes == 8) ++ buf[offset++] |= 127; ++ ++ if(lenbytes == 2){ ++ buf[offset++] = 0xFF & (f->length >> 8); ++ buf[offset++] = 0xFF & f->length; ++ }else if(lenbytes == 8){ ++ buf[offset++] = 0xFF & (f->length >> 56); ++ buf[offset++] = 0xFF & (f->length >> 48); ++ buf[offset++] = 0xFF & (f->length >> 40); ++ buf[offset++] = 0xFF & (f->length >> 32); ++ buf[offset++] = 0xFF & (f->length >> 24); ++ buf[offset++] = 0xFF & (f->length >> 16); ++ buf[offset++] = 0xFF & (f->length >> 8); ++ buf[offset++] = 0xFF & f->length; ++ } ++ ++ if(f->masked){ ++ buf[offset++] = f->maskkey[0]; ++ buf[offset++] = f->maskkey[1]; ++ buf[offset++] = f->maskkey[2]; ++ buf[offset++] = f->maskkey[3]; ++ } ++ ++ memcpy(buf + offset, f->data, f->length); ++ write(fd, buf, totsize); ++} ++ ++void ++writemessage(int fd, Message *m) ++{ ++ /* Could split up the message into frames but not right now. */ ++ ++ Frame *f = malloc(sizeof(Frame)); ++ f->final = 1; ++ f->opcode = m->type; ++ f->masked = 1; ++ genrandom(f->maskkey, 4); ++ f->length = m->length; ++ f->data = malloc(f->length); ++ memcpy(f->data, m->data, f->length); ++ maskframe(f); ++ f->next = nil; ++ ++ writeframe(fd, f); ++ free(f->data); ++ free(f); ++} ++ ++void ++websocketrecv(int fd, Buq *qbody) ++{ ++ /* ++ * Plan: Read frames and when we have a whole message do: ++ * 1) If control, act on it ++ * 2) If data, format as text and buwrite it ++ */ ++ while(1){ ++ Message *m = readmsg(fd); ++ //print("Received message type=%d length=%ulld\n", m->type, m->length); ++ ++ if(m->type == TextFrame || m->type == BinaryFrame){ ++ char *header; ++ if(m->type == TextFrame) ++ header = smprint("t %0.20ulld", m->length); ++ else ++ header = smprint("b %0.20ulld", m->length); ++ buwrite(qbody, header, 22); ++ buwrite(qbody, m->data, m->length); ++ } ++ free(m->data); ++ free(m); ++ } ++} ++ ++void ++websocketsend(int fd, Buq *qpost) ++{ ++ /* buread messages and pack them up in frames and send them */ ++ char buf[64]; ++ long n; ++ Message *m; ++ while(1){ ++ n = buread(qpost, buf, 22); ++ if(n != 22){ ++ buclose(qpost, "Header short"); ++ return; ++ } ++ buf[n] = 0; ++ ++ m = malloc(sizeof(Message)); ++ if(buf[0] == 't') ++ m->type = TextFrame; ++ else if(buf[0] == 'b') ++ m->type = BinaryFrame; ++ ++ char *ret; ++ m->length = strtoull(buf+2, &ret, 10); ++ if(ret != buf+22){ ++ buclose(qpost, "Header format wrong"); ++ return; ++ } ++ ++ m->data = malloc(m->length); ++ n = 0; ++ while(n < m->length){ ++ uvlong missing = m->length - n; ++ n += buread(qpost, m->data + n, (missing < 8192) ? missing : 8192); ++ } ++ ++ writemessage(fd, m); ++ free(m->data); ++ free(m); ++ } ++} ++ ++void ++websocket(int fd, Buq *qbody, Buq *qpost) ++{ ++ buwrite(qbody, "websocket ready\n", 16); ++ switch(rfork(RFPROC|RFMEM)){ ++ default: ++ websocketrecv(fd, qbody); ++ break; ++ case 0: ++ websocketsend(fd, qpost); ++ goto End; ++ case -1: ++ buclose(qbody, "can't fork"); ++ bufree(qbody); ++ buclose(qpost, "can't fork"); ++ bufree(qpost); ++ break; ++ } ++End: ++ close(fd); ++ buclose(qbody, nil); ++ bufree(qbody); ++ buclose(qpost, nil); ++ bufree(qpost); ++ exits(nil); ++} diff --git a/images/2048.gif b/images/2048.gif new file mode 100644 index 0000000..19dd98f Binary files /dev/null and b/images/2048.gif differ diff --git a/images/acme-in-action.png b/images/acme-in-action.png new file mode 100644 index 0000000..b74d9dc Binary files /dev/null and b/images/acme-in-action.png differ diff --git a/images/cdude.png b/images/cdude.png new file mode 100644 index 0000000..66ee18d Binary files /dev/null and b/images/cdude.png differ diff --git a/images/creepy_glenda.jpg b/images/creepy_glenda.jpg new file mode 100644 index 0000000..c1a35ba Binary files /dev/null and b/images/creepy_glenda.jpg differ diff --git a/images/cursed.png b/images/cursed.png new file mode 100644 index 0000000..f92e06e Binary files /dev/null and b/images/cursed.png differ diff --git a/images/discordgif.gif b/images/discordgif.gif new file mode 100644 index 0000000..207af41 Binary files /dev/null and b/images/discordgif.gif differ diff --git a/images/djvfonts.png b/images/djvfonts.png new file mode 100644 index 0000000..86d58a4 Binary files /dev/null and b/images/djvfonts.png differ diff --git a/images/favicon.ico b/images/favicon.ico new file mode 100644 index 0000000..745367e Binary files /dev/null and b/images/favicon.ico differ diff --git a/images/fear.jpg b/images/fear.jpg new file mode 100644 index 0000000..b585dfc Binary files /dev/null and b/images/fear.jpg differ diff --git a/images/hehegame.gif b/images/hehegame.gif new file mode 100644 index 0000000..5c385cb Binary files /dev/null and b/images/hehegame.gif differ diff --git a/images/hehegame2.gif b/images/hehegame2.gif new file mode 100644 index 0000000..5c385cb Binary files /dev/null and b/images/hehegame2.gif differ diff --git a/images/hehegame3.gif b/images/hehegame3.gif new file mode 100644 index 0000000..231f8ef Binary files /dev/null and b/images/hehegame3.gif differ diff --git a/images/kykeliky.png b/images/kykeliky.png new file mode 100644 index 0000000..0144cae Binary files /dev/null and b/images/kykeliky.png differ diff --git a/images/linuxreverse.gif b/images/linuxreverse.gif new file mode 100644 index 0000000..6684116 Binary files /dev/null and b/images/linuxreverse.gif differ diff --git a/images/mordor.gif b/images/mordor.gif new file mode 100644 index 0000000..fe13c09 Binary files /dev/null and b/images/mordor.gif differ diff --git a/images/rustdude.png b/images/rustdude.png new file mode 100644 index 0000000..c184664 Binary files /dev/null and b/images/rustdude.png differ diff --git a/images/walkoff.png b/images/walkoff.png new file mode 100644 index 0000000..871bb7c Binary files /dev/null and b/images/walkoff.png differ diff --git a/images/wip-discord.png b/images/wip-discord.png new file mode 100644 index 0000000..2ecafcc Binary files /dev/null and b/images/wip-discord.png differ diff --git a/lib/footer.inc b/lib/footer.inc index 1eac7d8..90fc345 100644 --- a/lib/footer.inc +++ b/lib/footer.inc @@ -1,7 +1 @@ - - - +Powered by werc © Peter Mikkelsen 2019-2024 diff --git a/lib/headers.tpl b/lib/headers.tpl index 635f85e..8d5ade5 100644 --- a/lib/headers.tpl +++ b/lib/headers.tpl @@ -3,14 +3,11 @@ %($pageTitle%) - - - -% if(test -f $sitedir/_werc/pub/style.css) -% echo ' ' - + + -% # Legacy charset declaration for backards compatibility with non-html5 browsers. % if(! ~ $#meta_description 0) diff --git a/lib/style.css b/lib/style.css new file mode 100644 index 0000000..1002606 --- /dev/null +++ b/lib/style.css @@ -0,0 +1,122 @@ +body { display: flex; flex-wrap: wrap; font-family: sans;} +header { flex-basis: 100%; flex-shrink: 0; } +article { flex-basis: 60%; padding-left: 1em; } +footer { flex-basis: 100%; flex-shrink: 0; } +header nav { display: flex; justify-content: space-between; } +nav a, header a { text-decoration: none ; color: inherit; } +header h1 span { margin-left: 1em; font-size: 50%; font-style: italic; } +.mainContent > nav { flex-basis: content; padding-right: 1vw; min-width: 16em; } +nav ul { display: flex; flex-direction: column; list-style-type: none; list-style-position: outside; padding-left: 0; } +nav li ul { padding-left: 0.6em } +footer { display: flex; justify-content: space-between; } + +/* cut here to leave vanity behind */ + +body { margin:0; padding: 0; font-size: 84%; font-family: Helvetica, Verdana, Arial, 'Liberation Sans', FreeSans, sans-serif; } +a { text-decoration: none; color: } +a:hover { text-decoration: underline; } +.thisPage { color: black; } + +/* header and top bar */ +header nav { background-color: rgb(100,135,220); color: white; padding: 0.3em; border-bottom: 2px solid black; font-size: 91%; } +header h1 { background-color: #ff6d06; color: black; margin: 0; border-bottom: 2px solid black; font-weight: normal; padding: 0.25ex; font-size: 233%; } +header a:hover { text-decoration: none; } + +/* sidebar */ +.mainContent > nav { border-right: 1px solid #ddd; padding: 0; } +.mainContent > nav > div { border-bottom: 1px solid #ddd; } +.mainContent > nav > div a { color: rgb(0, 102, 204); display: block; text-transform: capitalize; font-weight: bold; padding: 0.25em 1ex 0.25em 2mm; font-size: 102%} +.mainContent > nav > div a:hover { color: white; background-color: rgb(100,135,220); border-left: black solid 0.2em; text-decoration: none; } +.mainContent > nav > div p { font-weight: bold; margin: 0 0 0.5em 2mm; padding: 1em 0 0 0; } + +/* main copy */ +article { padding: 0.5ex 0 5vh 1vw; } +article h1, article h2 { color: rgb(0,102,204); font-weight: bold; margin: 2em 0 0 0; border-bottom: 2px solid rgb(0,102,204); } +article h3, article h4, article h5 { color: rgb(0,102,204); font-weight: bold; margin: 2em 0 0 0; } +article h6, article h7, article h8 { color: rgb(0,102,204); font-weight: bold; margin: 2em 0 0 0; } +article a { color: rgb(0,102,204); } +article a:hover { color: rgb(100,135,220); } +article pre { font-size: 1.2em; } + +/* footer */ +footer { color: white; background-color: rgb(100,135,220); } +footer a { color: inherit; } +footer div { padding: 1em; } + +/* tables */ +table { border: 1px solid rgba(128,128,128,0.5); padding: 0; } +th { color: white; background-color: rgb(100,135,220); } +tr:nth-child(odd) { background-color: rgba(128,128,128,0.1) } + +/* modifications */ +img { + max-width: 100%; + border: 1px solid black; +} + +body { + +} + +header h1 { + background-color: #c2d2c6; +} + +html { + font-size: 1.2em; +} + +header nav, footer { + background-color: #442a13; +} + +code > pre { + border: 2px solid #442a13; + background-color: #c2d2c6; + width: max-content; + padding: 0 0.5em; +} + +.mainContent > nav > div a, article a:hover { + color: #442a13; +} + +.mainContent > nav > div a:hover { + color: #442a13; + background-color: #c2d2c6; +} + +article h1, article h2 { + color: #c48f3b; + border-bottom: 2px solid #442a13; +} + +article a, .thisPage, footer, header nav { + color: #c48f3b; +} + +footer { + padding: 0.5em; + flex-shrink: 1; + flex-basis: unset; +} + +header { + flex-basis: unset; +} + +html { + display: flex; + min-height: 100%; +} + +body { + flex-direction: column; + flex: 1; + background-color: #e3dfd7; +} + +.mainContent { + display: flex; + flex-grow: 1; +} \ No newline at end of file diff --git a/lib/top_bar.inc b/lib/top_bar.inc index cbb89b8..76fba09 100644 --- a/lib/top_bar.inc +++ b/lib/top_bar.inc @@ -1,15 +1,14 @@ -
    - gsoc | - doc archive | - software repo | - ninetimes | - harmful | - 9P | - cat-v.org +
    + source | + notes | + images | + PProlog | + APL9 | + LPA
    -
    - site updates | - site map +
    + 9front | + OpenBSD
    diff --git a/pub/default_favicon.ico b/pub/default_favicon.ico deleted file mode 100755 index 817f5fa..0000000 Binary files a/pub/default_favicon.ico and /dev/null differ diff --git a/pub/style/imgs/sgl.png b/pub/style/imgs/sgl.png deleted file mode 100755 index d68580e..0000000 Binary files a/pub/style/imgs/sgl.png and /dev/null differ diff --git a/pub/style/sinorca-screen-alt.css b/pub/style/sinorca-screen-alt.css deleted file mode 100755 index d11e9ad..0000000 --- a/pub/style/sinorca-screen-alt.css +++ /dev/null @@ -1,292 +0,0 @@ -/*********************************************** - * TITLE: Sinorca Alterative Screen Stylesheet * - * URI : sinorca/sinorca-screen-alt.css * - * MODIF: 2003-May-13 18:48 +0800 * - ***********************************************/ - - -/* ##### Common Styles ##### */ - -body { - color: black; - background-color: white; - font-family: verdana, helvetica, arial, sans-serif; - font-size: 71%; /* Enables font size scaling in MSIE */ - margin: 0; - padding: 0; -} - -html > body { - font-size: 8.5pt; -} - -acronym, .titleTip { - border-bottom: 1px dotted rgb(153,153,153); - cursor: help; - margin: 0; - padding: 0 0 0.4px 0; -} - -.doNotDisplay { - display: none; -} - -.smallCaps { - font-size: 110%; - font-variant: small-caps; -} - - -/* ##### Header ##### */ - -.superHeader { - color: white; - background-color: rgb(100,135,220); - height: 2em; -} - -.superHeader a { - color: white; - background-color: transparent; - text-decoration: none; - font-size: 91%; - margin: 0; - padding: 0 0.5ex 0 0.25ex; -} - -.superHeader a:hover { - text-decoration: underline; -} - -.superHeader .left { - position: absolute; - left: 1.5mm; - top: 0.75ex; -} - -.superHeader .right { - position: absolute; - right: 1.5mm; - top: 0.75ex; -} - -.midHeader { - color: rgb(39,78,144); - background-color: rgb(140,170,230); -} - -.headerTitle { - font-size: 337%; - font-weight: normal; - margin: 0 0 0 4mm; - padding: 0.25ex 0; -} - -.subHeader { - color: white; - background-color: rgb(0,51,153); - margin: 0; - padding: 1ex 1ex 1ex 1.5mm; -} - -.subHeader a { - color: white; - background-color: transparent; - text-decoration: none; - font-weight: bold; - margin: 0; - padding: 0 0.75ex 0 0.5ex; -} - -.subHeader a:hover { - text-decoration: underline; -} - -.superHeader .highlight, .subHeader .highlight { - color: rgb(253,160,91); - background-color: transparent; -} - - -/* ##### Side Boxes ##### */ - -#side-bar { - width: 14em; - margin: 2.5em 0 0 1.25mm; - float: left; - clear: left; -} - -body > #side-bar { - margin-left: 2.5mm; /* Circumvents a rendering bug in MSIE (6.0) */ -} - -.sideBarTitle { - color: white; - background-color: rgb(100,135,220); - font-weight: bold; - margin: 0; - padding: 0.4ex 0 0.4ex 0.6ex; -} - -#side-bar ul { - list-style-type: none; - list-style-position: outside; - margin: 0; - padding: 0 0 2.25em 0; -} - -#side-bar li { - margin: 0; - padding: 0.1ex 0; /* Circumvents a rendering bug (?) in MSIE (6.0) */ -} - -#side-bar a, .thisPage { - color: rgb(0,102,204); - background-color: transparent; - text-decoration: none; - font-weight: bold; - margin: 0; - padding: 1.3ex 2ex; - display: block; -} - -.thisPage { - color: black; - background-color: transparent; -} - -#side-bar a:hover { - color: white; - background-color: rgb(100,135,220); - text-decoration: none; -} - -.sideBarText { - line-height: 1.5em; - margin: 0 0 2.5em 0; - padding: 1ex 0.5ex 0 0.5ex; - display: block; -} - -.sideBarText + .sideBarText { /* Not recognised by MSIE (6.0) */ - margin-top: -1.5em; -} - -#side-bar .sideBarText a { - text-decoration: underline; - font-weight: normal; - margin: 0; - padding: 0; - display: inline; -} - -#side-bar .sideBarText a:hover { - color: rgb(0,102,204); - background-color: transparent; - text-decoration: none; -} - - -/* ##### Main Copy ##### */ - -#main-copy { - color: black; - background-color: transparent; - text-align: justify; - line-height: 1.5em; - margin: -1em 0 0 15em; - padding: 0.5mm 5mm 5mm 5mm; -} - -#bodyText { - margin: 0 0 0 15.5em; - padding: 2mm 5mm 2mm 5mm; -} - - -#main-copy p { - margin: 1em 1ex 2em 1ex; - padding: 0; -} - -#main-copy a { - color: rgb(0,102,204); - background-color: transparent; - text-decoration: underline; -} - -#main-copy a:hover { - text-decoration: none; -} - -#main-copy h1 { - color: rgb(0,102,204); - background-color: transparent; - font-size: 145.5%; - font-weight: bold; - margin: 2em 0 0 0; - padding: 0.5ex 0 0.5ex 0.6ex; - border-bottom: 1px solid rgb(0,102,204); -} - -#main-copy .topOfPage { - color: rgb(0,102,204); - background-color: transparent; - font-size: 91%; - font-weight: bold; - text-decoration: none; - margin: 3ex 1ex 0 0; - padding: 0; - float: right; -} - -dl { - margin: 1em 1ex 2em 1ex; - padding: 0; -} - -dt { - font-weight: bold; - margin: 0 0 0 0; - padding: 0; -} - -dd { - margin: 0 0 2em 2em; - padding: 0; -} - - -/* ##### Footer ##### */ - -#footer { - color: white; - background-color: rgb(100,135,220); - font-size: 91%; - margin: 0; - padding: 1em 2.5mm 2.5ex 2.5mm; - clear: both; -} - -#footer .left { - text-align: left; - line-height: 1.45em; - float: left; - clear: left; -} - -#footer .right { - text-align: right; - line-height: 1.45em; -} - -#footer a { - color: white; - background-color: transparent; - text-decoration: underline; -} - -#footer a:hover { - text-decoration: none; -} \ No newline at end of file diff --git a/pub/style/style.cat-v.css b/pub/style/style.cat-v.css deleted file mode 100644 index 3d3d4b6..0000000 --- a/pub/style/style.cat-v.css +++ /dev/null @@ -1,50 +0,0 @@ -body { display: flex; flex-wrap: wrap; font-family: sans; } -header { flex-basis: 100%; flex-shrink: 0; } -article { flex-basis: 60%; padding-left: 1em; } -footer { flex-basis: 100%; flex-shrink: 0; } -header nav { display: flex; justify-content: space-between; } -nav a, header a { text-decoration: none ; color: inherit; } -header h1 span { margin-left: 1em; font-size: 50%; font-style: italic; } -body > nav { flex-basis: content; padding-right: 1vw; min-width: 16em; } -nav ul { display: flex; flex-direction: column; list-style-type: none; list-style-position: outside; padding-left: 0; } -nav li ul { padding-left: 0.6em } -footer { display: flex; justify-content: space-between; } - -/* cut here to leave vanity behind */ - -body { margin:0; padding: 0; font-size: 84%; font-family: Helvetica, Verdana, Arial, 'Liberation Sans', FreeSans, sans-serif; } -a { text-decoration: none; color: } -a:hover { text-decoration: underline; } -.thisPage { color: black; } - -/* header and top bar */ -header nav { background-color: rgb(100,135,220); color: white; padding: 0.3em; border-bottom: 2px solid black; font-size: 91%; } -header h1 { background-color: #ff6d06; color: black; margin: 0; border-bottom: 2px solid black; font-weight: normal; padding: 0.25ex; font-size: 233%; } -header a:hover { text-decoration: none; } - -/* sidebar */ -body > nav { border-right: 1px solid #ddd; padding: 0; } -body > nav > div { border-bottom: 1px solid #ddd; } -body > nav > div a { color: rgb(0, 102, 204); display: block; text-transform: capitalize; font-weight: bold; padding: 0.25em 1ex 0.25em 2mm; font-size: 102%} -body > nav > div a:hover { color: white; background-color: rgb(100,135,220); border-left: black solid 0.2em; text-decoration: none; } -body > nav > div p { font-weight: bold; margin: 0 0 0.5em 2mm; padding: 1em 0 0 0; } - -/* main copy */ -article { padding: 0.5ex 0 5vh 1vw; } -article h1, article h2 { color: rgb(0,102,204); font-weight: bold; margin: 2em 0 0 0; border-bottom: 2px solid rgb(0,102,204); } -article h3, article h4, article h5 { color: rgb(0,102,204); font-weight: bold; margin: 2em 0 0 0; } -article h6, article h7, article h8 { color: rgb(0,102,204); font-weight: bold; margin: 2em 0 0 0; } -article a { color: rgb(0,102,204); } -article a:hover { color: rgb(100,135,220); } -article pre { font-size: 1.2em; } - -/* footer */ -footer { color: white; background-color: rgb(100,135,220); } -footer a { color: inherit; } -footer div { padding: 1em; } - -/* tables */ -table { border: 1px solid rgba(128,128,128,0.5); padding: 0; } -th { color: white; background-color: rgb(100,135,220); } -tr:nth-child(odd) { background-color: rgba(128,128,128,0.1) } - diff --git a/pub/style/style.css b/pub/style/style.css deleted file mode 100644 index 1002606..0000000 --- a/pub/style/style.css +++ /dev/null @@ -1,122 +0,0 @@ -body { display: flex; flex-wrap: wrap; font-family: sans;} -header { flex-basis: 100%; flex-shrink: 0; } -article { flex-basis: 60%; padding-left: 1em; } -footer { flex-basis: 100%; flex-shrink: 0; } -header nav { display: flex; justify-content: space-between; } -nav a, header a { text-decoration: none ; color: inherit; } -header h1 span { margin-left: 1em; font-size: 50%; font-style: italic; } -.mainContent > nav { flex-basis: content; padding-right: 1vw; min-width: 16em; } -nav ul { display: flex; flex-direction: column; list-style-type: none; list-style-position: outside; padding-left: 0; } -nav li ul { padding-left: 0.6em } -footer { display: flex; justify-content: space-between; } - -/* cut here to leave vanity behind */ - -body { margin:0; padding: 0; font-size: 84%; font-family: Helvetica, Verdana, Arial, 'Liberation Sans', FreeSans, sans-serif; } -a { text-decoration: none; color: } -a:hover { text-decoration: underline; } -.thisPage { color: black; } - -/* header and top bar */ -header nav { background-color: rgb(100,135,220); color: white; padding: 0.3em; border-bottom: 2px solid black; font-size: 91%; } -header h1 { background-color: #ff6d06; color: black; margin: 0; border-bottom: 2px solid black; font-weight: normal; padding: 0.25ex; font-size: 233%; } -header a:hover { text-decoration: none; } - -/* sidebar */ -.mainContent > nav { border-right: 1px solid #ddd; padding: 0; } -.mainContent > nav > div { border-bottom: 1px solid #ddd; } -.mainContent > nav > div a { color: rgb(0, 102, 204); display: block; text-transform: capitalize; font-weight: bold; padding: 0.25em 1ex 0.25em 2mm; font-size: 102%} -.mainContent > nav > div a:hover { color: white; background-color: rgb(100,135,220); border-left: black solid 0.2em; text-decoration: none; } -.mainContent > nav > div p { font-weight: bold; margin: 0 0 0.5em 2mm; padding: 1em 0 0 0; } - -/* main copy */ -article { padding: 0.5ex 0 5vh 1vw; } -article h1, article h2 { color: rgb(0,102,204); font-weight: bold; margin: 2em 0 0 0; border-bottom: 2px solid rgb(0,102,204); } -article h3, article h4, article h5 { color: rgb(0,102,204); font-weight: bold; margin: 2em 0 0 0; } -article h6, article h7, article h8 { color: rgb(0,102,204); font-weight: bold; margin: 2em 0 0 0; } -article a { color: rgb(0,102,204); } -article a:hover { color: rgb(100,135,220); } -article pre { font-size: 1.2em; } - -/* footer */ -footer { color: white; background-color: rgb(100,135,220); } -footer a { color: inherit; } -footer div { padding: 1em; } - -/* tables */ -table { border: 1px solid rgba(128,128,128,0.5); padding: 0; } -th { color: white; background-color: rgb(100,135,220); } -tr:nth-child(odd) { background-color: rgba(128,128,128,0.1) } - -/* modifications */ -img { - max-width: 100%; - border: 1px solid black; -} - -body { - -} - -header h1 { - background-color: #c2d2c6; -} - -html { - font-size: 1.2em; -} - -header nav, footer { - background-color: #442a13; -} - -code > pre { - border: 2px solid #442a13; - background-color: #c2d2c6; - width: max-content; - padding: 0 0.5em; -} - -.mainContent > nav > div a, article a:hover { - color: #442a13; -} - -.mainContent > nav > div a:hover { - color: #442a13; - background-color: #c2d2c6; -} - -article h1, article h2 { - color: #c48f3b; - border-bottom: 2px solid #442a13; -} - -article a, .thisPage, footer, header nav { - color: #c48f3b; -} - -footer { - padding: 0.5em; - flex-shrink: 1; - flex-basis: unset; -} - -header { - flex-basis: unset; -} - -html { - display: flex; - min-height: 100%; -} - -body { - flex-direction: column; - flex: 1; - background-color: #e3dfd7; -} - -.mainContent { - display: flex; - flex-grow: 1; -} \ No newline at end of file diff --git a/pub/style/style.werc140.css b/pub/style/style.werc140.css deleted file mode 100755 index e3261e9..0000000 --- a/pub/style/style.werc140.css +++ /dev/null @@ -1,330 +0,0 @@ -/* Default werc style */ - -body { - color: black; - background-color: white; - font-family: Helvetica, Verdana, Arial, 'Liberation Sans', FreeSans, sans-serif; - font-size: 84%; /* Enables font size scaling in MSIE */ - margin: 0; - padding: 0; -} - - -/* # Header # */ -.superHeader { - color: white; - background-color: rgb(100,135,220); - height: 1.6em; -} - -.superHeader img { vertical-align: bottom; } - -.superHeader a { - color: white; - background-color: transparent; - font-size: 91%; - margin: 0; - padding: 0 0.5ex 0 0.25ex; -} - -a { text-decoration: none; } -a:hover { text-decoration: underline; } - -.superHeader div { - position: absolute; - top: 0.40ex; -} - -.superHeader .left { left: 0.4em; } -.superHeader .right { right: 0.4em; } - -.midHeader { - color: rgb(39,78,144); - background-color: rgb(140,170,230); - background-color: #ff6d06; - border: solid 0 black; - border-width: 2px 0; -} - -.headerTitle { - color: black; - font-size: 233%; - font-weight: normal; - margin: 0 0 0 4mm; - padding: 0.25ex 0; -} -#headerSubTitle { - font-size: 50%; - font-style: italic; - margin-left: 1em; -} - -.headerTitle a { color: black; } -.headerTitle a:hover { text-decoration: none; } - -.subHeader { - display: none; - color: white; - background-color: rgb(0,51,153); - margin: 0; - padding: 1ex 1ex 1ex 1.5mm; -} - -.subHeader a { - color: white; - background-color: transparent; - font-weight: bold; - margin: 0; - padding: 0 0.75ex 0 0.5ex; -} - -.superHeader .highlight, .subHeader .highlight { - color: rgb(253,160,91); - background-color: transparent; -} - - -/* # Side # */ -#side-bar { - width: 16em; - float: left; - clear: left; - border-right: 1px solid #ddd; -} - -#side-bar div { - border-bottom: 1px solid #ddd; -} - -.sideBarTitle { - font-weight: bold; - margin: 0 0 0.5em 2mm; - padding: 1em 0 0 0; -} - -#side-bar ul { - list-style-type: none; - list-style-position: outside; - margin: 0; - padding: 0 0 0.3em 0; -} - -li ul { - padding-left: 0.6em !important; -} - -#side-bar li { - margin: 0; - padding: 0.1ex 0; /* Circumvents a rendering bug (?) in MSIE 6.0 XXX should move to iehacks.css, this causes an ugly gap */ -} - -#side-bar a { - color: rgb(0,102,204); - background-color: transparent; - margin: 0; - padding: 0.25em 1ex 0.25em 2mm; - display: block; - text-transform: capitalize; - font-weight: bold!important; - font-size: 102%; - border-left: white solid 0.2em; -} - -.thisPage, .thisPage a { - color: black!important; - background-color: white; - padding-left: 5mm; -} - -#side-bar a:hover { - color: white; - background-color: rgb(100,135,220); - border-left: black solid 0.2em; - text-decoration: none; -} - -.sideBarText { - line-height: 1.5em; - margin: 0 0 1em 0; - padding: 0 1.5ex 0 2.5mm; - display: block; -} - -#side-bar .sideBarText a { - margin: 0; - padding: 0; - display: inline; -} - -#side-bar .sideBarText a:hover { - color: rgb(0,102,204); - background-color: transparent; - text-decoration: none; -} - - -/* # Main Copy # */ -#main-copy { - max-width: 70em; - color: black; - background-color: transparent; - text-align: justify; - line-height: 1.5em; - margin: 0em 0 0 16em; - padding: 0.5mm 5mm 5mm 5mm; - border-left: 1px solid #ddd; -} - -#bodyText { - margin: 0 0 0 15.5em; - padding: 2mm 5mm 2mm 5mm; -} - -#main-copy p { - margin: 1em 1ex 1em 1ex !important; /* Need !important so troff-generated pages don't look totally squezed */ - padding: 0; -} - -#main-copy a { - color: rgb(0,102,204); - background-color: transparent; -} - -#main-copy a:hover { - color: rgb(100,135,220); -} - -#main-copy h1, #main-copy h2 { - color: rgb(0,102,204); - background-color: transparent; - font-size: 145.5%; - font-weight: bold; - margin: 2em 0 0 0; - padding: 0.5ex 0 0.5ex 0.6ex; - border-bottom: 2px solid rgb(0,102,204); -} - -#main-copy h2 { - font-size: 115.5%; - border-bottom: 1px solid rgb(0,102,204); -} - -#main-copy .topOfPage { - color: rgb(0,102,204); - background-color: transparent; - font-size: 91%; - font-weight: bold; - text-decoration: none; - margin: 3ex 1ex 0 0; - padding: 0; - float: right; -} - -dl { - margin: 1em 1ex 2em 1ex; - padding: 0; -} - -dt { - font-weight: bold; - margin: 0 0 0 0; - padding: 0; -} - -dd { - margin: 0 0 2em 2em; - padding: 0; -} - - -/* # Footer # */ -#footer { - color: white; - background-color: rgb(100,135,220); - padding: 1em; - clear: both; -} - -#footer .left { - text-align: left; - line-height: 1.55em; - float: left; - clear: left; -} - -#footer .right { - text-align: right; - line-height: 1.45em; -} - -#footer a { - color: white; - background-color: transparent; -} - - -/* GENERAL */ - -table { - border: solid 1px black; -} -th { - background-color: #abc; - border: solid 1px black; - text-align: center; -} -td { - background-color: #def; - border: solid 1px black; -} - -hr { - border-width: 0px 0px 0.1em 0px; - border-color: black; -} - -acronym, .titleTip { - border-bottom: 1px solid #ddd; - cursor: help; - margin: 0; - padding: 0 0 0.4px 0; -} - -pre { - margin-left: 2em; - font-size: 1.2em; -} - -blockquote { - border-left: 1px solid blue; - font-style: italic; -} - -.smallCaps { - font-size: 110%; - font-variant: small-caps; -} - -.doNotDisplay { display: none; } - - -.notify_errors, -.notify_notes, -.notify_success { padding: .8em; margin-bottom: 1em; border: 2px solid #ddd; } - -.notify_errors { background: #FBE3E4; color: #8a1f11; border-color: #FBC2C4; } -.notify_notes { background: #FFF6BF; color: #514721; border-color: #FFD324; } -.notify_success { background: #E6EFC2; color: #264409; border-color: #C6D880; } -.notify_errors a { color: #8a1f11; } -.notify_notes a { color: #514721; } -.notify_success a { color: #264409; } - - -/* # Page/Handler specific # */ -h1.dir-list-head, ul.dir-list { - text-transform: capitalize; - font-weight: bold; -} -ul.sitemap-list a { - text-transform: capitalize; -} diff --git a/pub/style/style_old.css b/pub/style/style_old.css deleted file mode 100755 index e4a41fe..0000000 --- a/pub/style/style_old.css +++ /dev/null @@ -1,330 +0,0 @@ -/* Old Default style */ -/* ##### Common Styles ##### */ - -body { - color: black; - XXXbackground-color: rgb(240,240,240); - background-color: white; - font-family: verdana, helvetica, arial, sans-serif; - font-size: 71%; /* Enables font size scaling in MSIE */ - margin: 0; - padding: 0; -} - -html > body { - font-size: 8.5pt; -} - -acronym, .titleTip { - border-bottom: 1px dotted rgb(153,153,153); - cursor: help; - margin: 0; - padding: 0 0 0.4px 0; -} - -.doNotDisplay { - display: none; -} - -.smallCaps { - font-size: 110%; - font-variant: small-caps; -} - - -/* ##### Header ##### */ - -.superHeader { - color: white; - background-color: rgb(100,135,220); - height: 2em; -} - -.superHeader a { - color: white; - background-color: transparent; - text-decoration: none; - font-size: 91%; - margin: 0; - padding: 0 0.5ex 0 0.25ex; -} - -.superHeader a:hover { - text-decoration: underline; -} - -.superHeader .left { - position: absolute; - left: 1.5mm; - top: 0.75ex; -} - -.superHeader .right { - position: absolute; - right: 1.5mm; - top: 0.75ex; -} - -.midHeader { - color: rgb(39,78,144); - background-color: rgb(140,170,230); - border: solid 0 black; - border-width: 0.3em 0; -} - -.headerTitle { - color: black; - font-size: 337%; - font-weight: normal; - margin: 0 0 0 4mm; - padding: 0.25ex 0; -} -#headerSubTitle { - font-size: 50%; - font-style: italic; -} - -.subHeader { -display: none; - color: white; - background-color: rgb(0,51,153); - margin: 0; - padding: 1ex 1ex 1ex 1.5mm; -} - -.subHeader a { - color: white; - background-color: transparent; - text-decoration: none; - font-weight: bold; - margin: 0; - padding: 0 0.75ex 0 0.5ex; -} - -.subHeader a:hover { - text-decoration: underline; -} - -.superHeader .highlight, .subHeader .highlight { - color: rgb(253,160,91); - background-color: transparent; -} - - -/* ##### Side Bar ##### */ - -#side-bar { - width: 15em; - float: left; - clear: left; - border-right: 1px solid rgb(153,153,153); -} - -#side-bar div { - border-bottom: 1px solid rgb(153,153,153); -} - -.sideBarTitle { - font-weight: bold; - margin: 0 0 0.5em 2.5mm; - padding: 1em 0 0 0; -} - -#side-bar ul { - list-style-type: none; - list-style-position: outside; - margin: 0; - padding: 0 0 1.1em 0; -} - -#side-bar li { - margin: 0; - padding: 0.1ex 0; /* Circumvents a rendering bug (?) in MSIE 6.0 */ -} - -#side-bar a, .thisPage { - color: rgb(0,102,204); - background-color: transparent; - XXXtext-decoration: none; - margin: 0; - padding: 0.55em 1ex 0.55em 5mm; - display: block; -} - -.thisPage { - color: black; - background-color: white; - padding-left: 5mm; - XXXborder-top: 1px solid rgb(153,153,153); - XXXborder-bottom: 1px solid rgb(153,153,153); - font-weight: 600; -} - -#side-bar a:hover { - color: white; - background-color: rgb(100,135,220); - text-decoration: none; -} - -.sideBarText { - line-height: 1.5em; - margin: 0 0 1em 0; - padding: 0 1.5ex 0 2.5mm; - display: block; -} - -#side-bar .sideBarText a { - text-decoration: underline; - margin: 0; - padding: 0; - display: inline; -} - -#side-bar .sideBarText a:hover { - color: rgb(0,102,204); - background-color: transparent; - text-decoration: none; -} - -.lighterBackground { - color: inherit; - background-color: white; -} - - -/* ##### Main Copy ##### */ - -#main-copy { - max-width: 90em; - color: black; - background-color: white; - text-align: justify; - line-height: 1.5em; - margin: 0 0 0 15em; - padding: 0.5mm 5mm 5mm 5mm; - border-left: 1px solid rgb(153,153,153); -} - -#main-copy p { - margin: 1em 1ex 2em 1ex; - padding: 0; -} - -#main-copy a { - color: rgb(0,102,204); - background-color: transparent; - text-decoration: underline; -} - -#main-copy a:hover { - text-decoration: none; -} - -#main-copy h1 { - color: white; - background-color: rgb(100,135,220); - font-size: 100%; - font-weight: bold; - margin: 3em 0 0 0; - padding: 0.5ex 0 0.5ex 1ex; -} - -#main-copy .topOfPage { - color: white; - background-color: transparent; - font-size: 91%; - font-weight: bold; - text-decoration: none; - margin: 2.5ex 1ex 0 0; /* For MSIE */ - padding: 0; - float: right; -} - -#main-copy > .topOfPage { - margin: 2.75ex 1ex 0 0; /* For fully standards-compliant user agents */ -} - -dl { - margin: 1em 1ex 2em 1ex; - padding: 0; -} - -dt { - font-weight: bold; - margin: 0 0 0 0; - padding: 0; -} - -dd { - margin: 0 0 2em 2em; - padding: 0; -} - - -/* ##### Footer ##### */ - -#footer { - color: white; - background-color: rgb(100,135,220); - font-size: 91%; - margin: 0; - padding: 1em 2.5mm 2.5ex 2.5mm; - clear: both; -} - -#footer .left { - line-height: 1.45em; - float: left; - clear: left; -} - -#footer .right { - text-align: right; - line-height: 1.45em; -} - -#footer a { - color: white; - background-color: transparent; - text-decoration: underline; -} - -#footer a:hover { - text-decoration: none; -} - - -/* GENERAL */ -/* Spam */ -.spam { - text-align: center; -} - -/* Tables */ -table { - border: solid 1px black; -} -th { - background-color: #abc; - border: solid 1px black; -} -td { - background-color: #def; - border: solid 1px black; -} - -hr { - border-width: 0px 0px 0.1em 0px; - border-color: black; -} - -.spam table, .spam th, .spam td { - border: none; -} - -/* Code */ -pre { - margin-left: 2em; -} - - diff --git a/sites/apl.pmikkelsen.com/_werc/lib/footer.inc b/sites/apl.pmikkelsen.com/_werc/lib/footer.inc deleted file mode 100644 index 2deed52..0000000 --- a/sites/apl.pmikkelsen.com/_werc/lib/footer.inc +++ /dev/null @@ -1 +0,0 @@ -Powered by werc © Peter Mikkelsen 2022 \ No newline at end of file diff --git a/sites/apl.pmikkelsen.com/_werc/lib/top_bar.inc b/sites/apl.pmikkelsen.com/_werc/lib/top_bar.inc deleted file mode 100644 index 4c23cf3..0000000 --- a/sites/apl.pmikkelsen.com/_werc/lib/top_bar.inc +++ /dev/null @@ -1,8 +0,0 @@ - - -
    -
    diff --git a/sites/apl.pmikkelsen.com/favicon.ico b/sites/apl.pmikkelsen.com/favicon.ico deleted file mode 100644 index 745367e..0000000 Binary files a/sites/apl.pmikkelsen.com/favicon.ico and /dev/null differ diff --git a/sites/apl.pmikkelsen.com/index.md b/sites/apl.pmikkelsen.com/index.md index f27aac5..3e3eb8a 100644 --- a/sites/apl.pmikkelsen.com/index.md +++ b/sites/apl.pmikkelsen.com/index.md @@ -57,5 +57,5 @@ time, to get `⍶⍸⍹⍷⍣` and so on. Please email me if you have questions [![A picture of APL9 in action][2]][2] -[2]: /_images/apl-screenshot.png +[2]: https://images.pmikkelsen.com/apl-screenshot.png [1]: https://dyalog.com diff --git a/sites/lpa.pmikkelsen.com/_werc/lib/footer.inc b/sites/lpa.pmikkelsen.com/_werc/lib/footer.inc deleted file mode 100644 index d69228a..0000000 --- a/sites/lpa.pmikkelsen.com/_werc/lib/footer.inc +++ /dev/null @@ -1 +0,0 @@ -Powered by werc © Peter Mikkelsen 2024 \ No newline at end of file diff --git a/sites/lpa.pmikkelsen.com/_werc/lib/top_bar.inc b/sites/lpa.pmikkelsen.com/_werc/lib/top_bar.inc deleted file mode 100644 index 730a160..0000000 --- a/sites/lpa.pmikkelsen.com/_werc/lib/top_bar.inc +++ /dev/null @@ -1,8 +0,0 @@ - - -
    -
    diff --git a/sites/lpa.pmikkelsen.com/favicon.ico b/sites/lpa.pmikkelsen.com/favicon.ico deleted file mode 100644 index 745367e..0000000 Binary files a/sites/lpa.pmikkelsen.com/favicon.ico and /dev/null differ diff --git a/sites/pmikkelsen.com/_files/djv.tar b/sites/pmikkelsen.com/_files/djv.tar deleted file mode 100644 index 5d60262..0000000 Binary files a/sites/pmikkelsen.com/_files/djv.tar and /dev/null differ diff --git a/sites/pmikkelsen.com/_files/djvmono.tar b/sites/pmikkelsen.com/_files/djvmono.tar deleted file mode 100644 index 1fb0c7d..0000000 Binary files a/sites/pmikkelsen.com/_files/djvmono.tar and /dev/null differ diff --git a/sites/pmikkelsen.com/_files/faces.patch b/sites/pmikkelsen.com/_files/faces.patch deleted file mode 100644 index 3309c1b..0000000 --- a/sites/pmikkelsen.com/_files/faces.patch +++ /dev/null @@ -1,105 +0,0 @@ -From 5595dbb332eae353832dbc2ad11ef92aeb8fcab0 -From: Peter Mikkelsen -Date: Mon, 28 Jun 2021 21:45:53 +0000 -Subject: [PATCH] Add -u flag to faces, making it only show unread messages. - ---- -diff 658757abed7be283e06bae3b1722fc2703334d74 5595dbb332eae353832dbc2ad11ef92aeb8fcab0 ---- a/sys/man/1/faces Sun Jun 27 02:13:58 2021 -+++ b/sys/man/1/faces Mon Jun 28 23:45:53 2021 -@@ -4,7 +4,7 @@ - .SH SYNOPSIS - .B faces - [ --.B -ihc -+.B -ihcu - ] [ - .B -m - .I maildir -@@ -99,6 +99,15 @@ - rather than the current state of the mail box. - In particular, faces are not removed from the screen when messages are deleted. - Also, in this mode clicking button 1 in the display will clear the window. -+.PP -+The -+.B -u -+flag causes -+.I faces -+to read in the mailbox like with the -+.B -i -+flag, but it only shows the unread ones. -+When right-clicking on a message icon in this mode, the message is both plumbed and removed from the view. - .PP - .I Seemail - is an ---- a/sys/src/cmd/faces/main.c Sun Jun 27 02:13:58 2021 -+++ b/sys/src/cmd/faces/main.c Mon Jun 28 23:45:53 2021 -@@ -10,6 +10,7 @@ - int history = 0; /* use old interface, showing history of mailbox rather than current state */ - int initload = 0; /* initialize program with contents of mail box */ - int clickrm = 0; /* allows removing mail faces by left clicking */ -+int onlyunread = 0; /* initialize program with unread messages, remove when clicked */ - - enum - { -@@ -358,6 +359,28 @@ - unlockdisplay(display); - } - -+int -+isunread(char *dir, char *num) -+{ -+ char buf[1024], flags[8]; -+ int n, fd, unread; -+ -+ snprint(buf, sizeof(buf), "%s/%s/flags", dir, num); -+ fd = open(buf, OREAD); -+ if(fd < 0) -+ return 0; -+ n = readn(fd, flags, 7); -+ close(fd); -+ if(n != 7) -+ return 0; -+ flags[n] = '\0'; -+ if(strchr(flags, 's') != nil) -+ unread = 0; -+ else -+ unread = 1; -+ return unread; -+} -+ - void - loadmboxfaces(char *maildir) - { -@@ -370,7 +393,8 @@ - chdir(maildir); - while((n = dirread(dirfd, &d)) > 0){ - for(i=0; iTall) -+ if(type < 0 || type >Tcaa) - return 0; - return rrtname[type] != nil; - } -@@ -1891,7 +1892,7 @@ - char *t; - - t = nil; -- if(type >= 0 && type <= Tall) -+ if(type >= 0 && type <= Tcaa) - t = rrtname[type]; - if(t==nil){ - snprint(buf, len, "%d", type); -diff -r 4adb989bc93e sys/src/cmd/ndb/dns.h ---- a/sys/src/cmd/ndb/dns.h Tue Nov 03 20:47:14 2020 +0100 -+++ b/sys/src/cmd/ndb/dns.h Sun Nov 29 16:42:47 2020 +0100 -@@ -71,6 +71,7 @@ - Tmailb= 253, /* { Tmb, Tmg, Tmr } */ - Tmaila= 254, /* obsolete */ - Tall= 255, /* all records */ -+ Tcaa= 257, /* Certification authority restriction */ - - /* classes */ - Csym= 0, /* internal symbols */ diff --git a/sites/pmikkelsen.com/_files/websocket-webfs.patch b/sites/pmikkelsen.com/_files/websocket-webfs.patch deleted file mode 100644 index 77c44b0..0000000 --- a/sites/pmikkelsen.com/_files/websocket-webfs.patch +++ /dev/null @@ -1,565 +0,0 @@ -From 424bcc25db6c3de73678fe43d44e4b408cd0434d -From: Peter Mikkelsen -Date: Wed, 23 Jun 2021 15:44:24 +0000 -Subject: [PATCH] Initial buggy version of adding websocket support to webfs - - -It can create connections but doesn't handle errors very well yet. ---- -diff ce73821f3575921e24f839b21c7be60520a9dc42 424bcc25db6c3de73678fe43d44e4b408cd0434d ---- a/sys/src/cmd/webfs/fns.h Mon Jun 21 17:38:11 2021 -+++ b/sys/src/cmd/webfs/fns.h Wed Jun 23 17:44:24 2021 -@@ -41,3 +41,6 @@ - int authenticate(Url *u, Url *ru, char *method, char *s); - void flushauth(Url *u, char *t); - void http(char *m, Url *u, Key *shdr, Buq *qbody, Buq *qpost); -+ -+/* websocket */ -+void websocket(int fd, Buq *qbody, Buq *qpost); ---- a/sys/src/cmd/webfs/fs.c Mon Jun 21 17:38:11 2021 -+++ b/sys/src/cmd/webfs/fs.c Wed Jun 23 17:44:24 2021 -@@ -4,6 +4,7 @@ - #include - #include - #include <9p.h> -+#include - - #include "dat.h" - #include "fns.h" -@@ -19,10 +20,12 @@ - Url *baseurl; - Url *url; - Key *hdr; -+ int wantwebsocket; - - int obody; /* body opend */ - int cbody; /* body closed */ - Buq *qbody; -+ Buq *websocketin; /* websocket input */ - }; - - struct Webfid -@@ -121,6 +124,8 @@ - - buclose(cl->qbody, 0); - bufree(cl->qbody); -+ buclose(cl->websocketin, 0); -+ bufree(cl->websocketin); - - while(k = cl->hdr){ - cl->hdr = k->next; -@@ -384,6 +389,25 @@ - if(cl->qbody == nil){ - char *m; - -+ if(f->level == Qbody && (!strcmp(cl->url->scheme, "ws") || !strcmp(cl->url->scheme, "wss"))){ -+ cl->wantwebsocket = 1; -+ cl->websocketin = bualloc(64*1024); -+ if(!lookkey(cl->hdr, "Upgrade")) -+ cl->hdr = addkey(cl->hdr, "Upgrade", "websocket"); -+ if(!lookkey(cl->hdr, "Connection")) -+ cl->hdr = addkey(cl->hdr, "Connection", "upgrade"); -+ if(!lookkey(cl->hdr, "Sec-WebSocket-Version")) -+ cl->hdr = addkey(cl->hdr, "Sec-WebSocket-Version", "13"); -+ if(!lookkey(cl->hdr, "Sec-WebSocket-Key")){ -+ uchar nonce[16]; -+ char *b64nonce; -+ genrandom(nonce, 16); -+ b64nonce = smprint("%.*[", 16, nonce); -+ cl->hdr = addkey(cl->hdr, "Sec-WebSocket-Key", b64nonce); -+ free(b64nonce); -+ } -+ } -+ - if(cl->url == nil){ - respond(r, "no url set"); - return; -@@ -413,7 +437,7 @@ - if(agent && !lookkey(cl->hdr, "User-Agent")) - cl->hdr = addkey(cl->hdr, "User-Agent", agent); - -- http(m, cl->url, cl->hdr, cl->qbody, f->buq); -+ http(m, cl->url, cl->hdr, cl->qbody, cl->wantwebsocket ? cl->websocketin : f->buq); - cl->request[0] = 0; - cl->url = nil; - cl->hdr = nil; -@@ -683,6 +707,11 @@ - case Qpost: - bureq(f->buq, r); - return; -+ case Qbody: -+ if(f->client->wantwebsocket){ -+ bureq(f->client->websocketin, r); -+ return; -+ } - } - respond(r, "not implemented"); - } ---- a/sys/src/cmd/webfs/http.c Mon Jun 21 17:38:11 2021 -+++ b/sys/src/cmd/webfs/http.c Wed Jun 23 17:44:24 2021 -@@ -131,7 +131,7 @@ - if(strcmp(proxy->scheme, "https") == 0) - fd = tlswrap(fd, proxy->host); - } else { -- if(strcmp(u->scheme, "https") == 0) -+ if(strcmp(u->scheme, "https") == 0 || strcmp(u->scheme, "wss") == 0) - fd = tlswrap(fd, u->host); - } - if(fd < 0){ -@@ -520,7 +520,7 @@ - void - http(char *m, Url *u, Key *shdr, Buq *qbody, Buq *qpost) - { -- int i, l, n, try, pid, fd, cfd, needlength, chunked, retry, nobody, badauth; -+ int i, l, n, try, pid, fd, cfd, needlength, chunked, retry, nobody, badauth, wantwebsocket; - char *s, *x, buf[8192+2], status[256], method[16], *host; - vlong length, offset; - Url ru, tu, *nu; -@@ -549,8 +549,13 @@ - break; - } - -+ if(!strcmp(u->scheme, "ws") || !strcmp(u->scheme, "wss")) -+ wantwebsocket = 1; -+ else -+ wantwebsocket = 0; -+ - notify(catch); -- if(qpost){ -+ if(qpost && !wantwebsocket){ - /* file for spooling the postbody if we need to restart the request */ - snprint(buf, sizeof(buf), "/tmp/http.%d.%d.post", getppid(), getpid()); - fd = create(buf, OEXCL|ORDWR|ORCLOSE, 0600); -@@ -565,7 +570,7 @@ - badauth = 0; - for(try = 0; try < 12; try++){ - strcpy(status, "0 No status"); -- if(u == nil || (strcmp(u->scheme, "http") && strcmp(u->scheme, "https"))){ -+ if(u == nil || (strcmp(u->scheme, "http") && strcmp(u->scheme, "https") && strcmp(u->scheme, "ws") && strcmp(u->scheme, "wss"))){ - werrstr("bad url scheme"); - break; - } -@@ -591,7 +596,7 @@ - - length = 0; - chunked = 0; -- if(qpost){ -+ if(qpost && !wantwebsocket){ - /* have to read it to temp file to figure out the length */ - if(fd >= 0 && needlength && lookkey(shdr, "Content-Length") == nil){ - seek(fd, 0, 2); -@@ -700,7 +705,7 @@ - goto Retry; - } - -- if(qpost && !h->tunnel){ -+ if(qpost && !h->tunnel && !wantwebsocket){ - h->cancel = 0; - if((pid = rfork(RFMEM|RFPROC)) <= 0){ - int ifd; -@@ -802,8 +807,42 @@ - goto Status; - } - goto Error; -- case 100: /* Continue */ - case 101: /* Switching Protocols */ -+ if(wantwebsocket){ -+ int ok = 1; -+ char *wskey = lookkey(shdr, "Sec-WebSocket-Key"); -+ -+ k = getkey(rhdr, "Upgrade"); -+ if(k == nil || cistrcmp(k->val, "websocket") != 0) -+ ok = 0; -+ -+ k = getkey(rhdr, "Connection"); -+ if(k == nil && cistrcmp(k->val, "upgrade") != 0) -+ ok = 0; -+ -+ k = getkey(rhdr, "Sec-WebSocket-Accept"); -+ if(k == nil || wskey == nil) -+ ok = 0; -+ else{ -+ uchar digest[SHA1dlen]; -+ char *str = smprint("%s258EAFA5-E914-47DA-95CA-C5AB0DC85B11", wskey); -+ -+ sha1((uchar*)str, strlen(str), digest, nil); -+ char *val = smprint("%.*[", SHA1dlen, digest); -+ if(strcmp(val, k->val) != 0) -+ ok = 0; -+ free(str); -+ free(val); -+ } -+ -+ if(ok){ -+ qbody->url = u; u = nil; -+ qbody->hdr = rhdr; rhdr = nil; -+ websocket(h->fd, qbody, qpost); -+ } -+ goto Error; -+ } -+ case 100: /* Continue */ - case 102: /* Processing */ - case 103: /* Early Hints */ - while(k = rhdr){ ---- a/sys/src/cmd/webfs/mkfile Mon Jun 21 17:38:11 2021 -+++ b/sys/src/cmd/webfs/mkfile Wed Jun 23 17:44:24 2021 -@@ -3,6 +3,6 @@ - TARG=webfs - - HFILES=fns.h dat.h --OFILES=sub.$O url.$O buq.$O http.$O fs.$O -+OFILES=sub.$O url.$O buq.$O http.$O websocket.$O fs.$O - - -+#include -+#include -+#include -+#include <9p.h> -+#include -+ -+#include "dat.h" -+#include "fns.h" -+ -+typedef struct Frame Frame; -+typedef struct Message Message; -+ -+struct Frame -+{ -+ int final; -+ int opcode; -+ int masked; -+ uchar maskkey[4]; -+ uvlong length; -+ uchar *data; -+ -+ Frame *next; /* Chain frames in a message together */ -+}; -+ -+struct Message -+{ -+ int type; -+ uvlong length; -+ uchar *data; -+}; -+ -+enum { -+ ContinueFrame = 0x0, -+ TextFrame = 0x1, -+ BinaryFrame = 0x2, -+ CloseFrame = 0x8, -+ PingFrame = 0x9, -+ PongFrame = 0xA, -+}; -+ -+void writemessage(int, Message *); -+ -+void -+maskframe(Frame *f) -+{ -+ uvlong i; -+ for(i = 0; i < f->length; i++) -+ f->data[i] = f->data[i] ^ f->maskkey[i%4]; -+} -+ -+Frame * -+readframe(int fd) -+{ -+ Frame *f = malloc(sizeof(Frame)); -+ long n; -+ int offset; -+ uchar len; -+ -+ uchar buf[4096]; -+ -+Again: -+ offset = 0; -+ n = read(fd, buf, 2); -+ if(n != 2) -+ goto Error; -+ -+ f->final = (buf[offset] >> 7) & 0x1; -+ /* ignore rsv1, rsv2, rsv3 */ -+ f->opcode = buf[offset] & 0x0F; -+ offset++; -+ -+ f->masked = (buf[offset] >> 7) & 0x1; -+ len = buf[offset] & 0x7F; -+ offset++; -+ -+ if(len <= 125) -+ f->length = len; -+ else if(len == 126){ -+ n = read(fd, buf+offset, 2); -+ if(n != 2) -+ goto Error; -+ -+ f->length = buf[offset++] << 8; -+ f->length |= buf[offset++]; -+ }else if(len == 127){ -+ n = read(fd, buf+offset, 8); -+ if(n != 8) -+ goto Error; -+ f->length = (uvlong)buf[offset++] << 56; -+ f->length |= (uvlong)buf[offset++] << 48; -+ f->length |= (uvlong)buf[offset++] << 40; -+ f->length |= (uvlong)buf[offset++] << 32; -+ f->length |= buf[offset++] << 24; -+ f->length |= buf[offset++] << 16; -+ f->length |= buf[offset++] << 8; -+ f->length |= buf[offset++]; -+ } -+ -+ if(f->masked){ -+ n = read(fd, buf+offset, 4); -+ if(n != 4) -+ goto Error; -+ -+ f->maskkey[0] = buf[offset++]; -+ f->maskkey[1] = buf[offset++]; -+ f->maskkey[2] = buf[offset++]; -+ f->maskkey[3] = buf[offset]; -+ } -+ -+ f->data = malloc(f->length); -+ readn(fd, f->data, f->length); -+ if(f->masked) -+ maskframe(f); -+ -+ if(f->opcode == PingFrame){ -+ Message *m = malloc(sizeof(Message)); -+ m->type = PongFrame; -+ m->length = f->length; -+ m->data = f->data; -+ writemessage(fd, m); /* SHOULD LOCK */ -+ free(m); -+ free(f->data); -+ goto Again; -+ } -+ -+ return f; -+Error: -+ exits("Readframe failed"); -+ return nil; -+} -+ -+Message * -+framestomessage(Frame *frames) -+{ -+ Message *m = malloc(sizeof(Message)); -+ uvlong length = 0; -+ uvlong offset = 0; -+ -+ Frame *f; -+ for(f = frames; f != nil; f = f->next) -+ length += f->length; -+ -+ m->type = frames->opcode; -+ m->length = length; -+ m->data = malloc(length); -+ for(f = frames; f != nil; f = f->next){ -+ memcpy(m->data + offset, f->data, f->length); -+ offset += f->length; -+ } -+ -+ return m; -+} -+ -+Message * -+readmsg(int fd) -+{ -+ Frame *frames = readframe(fd); -+ Frame *last = frames; -+ Message *m; -+ -+ while(!last->final){ -+ last->next = readframe(fd); -+ last = last->next; -+ } -+ last->next = nil; -+ -+ m = framestomessage(frames); -+ while(frames){ -+ Frame *f = frames->next; -+ free(frames->data); -+ free(frames); -+ frames = f; -+ } -+ return m; -+} -+ -+void -+writeframe(int fd, Frame *f) -+{ -+ uchar *buf; -+ uvlong totsize = 0; -+ uvlong offset = 0; -+ int lenbytes = 0; -+ -+ totsize += 2; /* Always there */ -+ if(f->length == 126) -+ lenbytes = 2; -+ else if(f->length == 127) -+ lenbytes = 8; -+ totsize += lenbytes; -+ -+ if(f->masked) -+ totsize += 4; -+ -+ totsize += f->length; -+ -+ buf = malloc(totsize); -+ -+ buf[offset] = f->final << 7; -+ buf[offset++] |= f->opcode; -+ buf[offset] = f->masked << 7; -+ -+ if(lenbytes == 0) -+ buf[offset++] |= f->length; -+ else if(lenbytes == 2) -+ buf[offset++] |= 126; -+ else if(lenbytes == 8) -+ buf[offset++] |= 127; -+ -+ if(lenbytes == 2){ -+ buf[offset++] = 0xFF & (f->length >> 8); -+ buf[offset++] = 0xFF & f->length; -+ }else if(lenbytes == 8){ -+ buf[offset++] = 0xFF & (f->length >> 56); -+ buf[offset++] = 0xFF & (f->length >> 48); -+ buf[offset++] = 0xFF & (f->length >> 40); -+ buf[offset++] = 0xFF & (f->length >> 32); -+ buf[offset++] = 0xFF & (f->length >> 24); -+ buf[offset++] = 0xFF & (f->length >> 16); -+ buf[offset++] = 0xFF & (f->length >> 8); -+ buf[offset++] = 0xFF & f->length; -+ } -+ -+ if(f->masked){ -+ buf[offset++] = f->maskkey[0]; -+ buf[offset++] = f->maskkey[1]; -+ buf[offset++] = f->maskkey[2]; -+ buf[offset++] = f->maskkey[3]; -+ } -+ -+ memcpy(buf + offset, f->data, f->length); -+ write(fd, buf, totsize); -+} -+ -+void -+writemessage(int fd, Message *m) -+{ -+ /* Could split up the message into frames but not right now. */ -+ -+ Frame *f = malloc(sizeof(Frame)); -+ f->final = 1; -+ f->opcode = m->type; -+ f->masked = 1; -+ genrandom(f->maskkey, 4); -+ f->length = m->length; -+ f->data = malloc(f->length); -+ memcpy(f->data, m->data, f->length); -+ maskframe(f); -+ f->next = nil; -+ -+ writeframe(fd, f); -+ free(f->data); -+ free(f); -+} -+ -+void -+websocketrecv(int fd, Buq *qbody) -+{ -+ /* -+ * Plan: Read frames and when we have a whole message do: -+ * 1) If control, act on it -+ * 2) If data, format as text and buwrite it -+ */ -+ while(1){ -+ Message *m = readmsg(fd); -+ //print("Received message type=%d length=%ulld\n", m->type, m->length); -+ -+ if(m->type == TextFrame || m->type == BinaryFrame){ -+ char *header; -+ if(m->type == TextFrame) -+ header = smprint("t %0.20ulld", m->length); -+ else -+ header = smprint("b %0.20ulld", m->length); -+ buwrite(qbody, header, 22); -+ buwrite(qbody, m->data, m->length); -+ } -+ free(m->data); -+ free(m); -+ } -+} -+ -+void -+websocketsend(int fd, Buq *qpost) -+{ -+ /* buread messages and pack them up in frames and send them */ -+ char buf[64]; -+ long n; -+ Message *m; -+ while(1){ -+ n = buread(qpost, buf, 22); -+ if(n != 22){ -+ buclose(qpost, "Header short"); -+ return; -+ } -+ buf[n] = 0; -+ -+ m = malloc(sizeof(Message)); -+ if(buf[0] == 't') -+ m->type = TextFrame; -+ else if(buf[0] == 'b') -+ m->type = BinaryFrame; -+ -+ char *ret; -+ m->length = strtoull(buf+2, &ret, 10); -+ if(ret != buf+22){ -+ buclose(qpost, "Header format wrong"); -+ return; -+ } -+ -+ m->data = malloc(m->length); -+ n = 0; -+ while(n < m->length){ -+ uvlong missing = m->length - n; -+ n += buread(qpost, m->data + n, (missing < 8192) ? missing : 8192); -+ } -+ -+ writemessage(fd, m); -+ free(m->data); -+ free(m); -+ } -+} -+ -+void -+websocket(int fd, Buq *qbody, Buq *qpost) -+{ -+ buwrite(qbody, "websocket ready\n", 16); -+ switch(rfork(RFPROC|RFMEM)){ -+ default: -+ websocketrecv(fd, qbody); -+ break; -+ case 0: -+ websocketsend(fd, qpost); -+ goto End; -+ case -1: -+ buclose(qbody, "can't fork"); -+ bufree(qbody); -+ buclose(qpost, "can't fork"); -+ bufree(qpost); -+ break; -+ } -+End: -+ close(fd); -+ buclose(qbody, nil); -+ bufree(qbody); -+ buclose(qpost, nil); -+ bufree(qpost); -+ exits(nil); -+} diff --git a/sites/pmikkelsen.com/_tmp/agda-dfa/Agda.Primitive.Cubical.html b/sites/pmikkelsen.com/_tmp/agda-dfa/Agda.Primitive.Cubical.html deleted file mode 100644 index 1be20f5..0000000 --- a/sites/pmikkelsen.com/_tmp/agda-dfa/Agda.Primitive.Cubical.html +++ /dev/null @@ -1,55 +0,0 @@ - -Agda.Primitive.Cubical
    {-# OPTIONS --cubical --no-subtyping #-}
    -
    -module Agda.Primitive.Cubical where
    -
    -{-# BUILTIN INTERVAL I  #-}  -- I : Setω
    -
    -{-# BUILTIN IZERO    i0 #-}
    -{-# BUILTIN IONE     i1 #-}
    -
    -infix  30 primINeg
    -infixr 20 primIMin primIMax
    -
    -primitive
    -    primIMin : I  I  I
    -    primIMax : I  I  I
    -    primINeg : I  I
    -
    -{-# BUILTIN ISONE    IsOne    #-}  -- IsOne : I → Setω
    -
    -postulate
    -  itIsOne : IsOne i1
    -  IsOne1  :  i j  IsOne i  IsOne (primIMax i j)
    -  IsOne2  :  i j  IsOne j  IsOne (primIMax i j)
    -
    -{-# BUILTIN ITISONE  itIsOne  #-}
    -{-# BUILTIN ISONE1   IsOne1   #-}
    -{-# BUILTIN ISONE2   IsOne2   #-}
    -
    --- Partial : ∀{ℓ} (i : I) (A : Set ℓ) → Set ℓ
    --- Partial i A = IsOne i → A
    -
    -{-# BUILTIN PARTIAL  Partial  #-}
    -{-# BUILTIN PARTIALP PartialP #-}
    -
    -postulate
    -  isOneEmpty :  {} {A : Partial i0 (Set )}  PartialP i0 A
    -
    -{-# BUILTIN ISONEEMPTY isOneEmpty #-}
    -
    -primitive
    -  primPOr :  {} (i j : I) {A : Partial (primIMax i j) (Set )}
    -             (u : PartialP i  z  A (IsOne1 i j z)))
    -             (v : PartialP j  z  A (IsOne2 i j z)))
    -             PartialP (primIMax i j) A
    -
    -  -- Computes in terms of primHComp and primTransp
    -  primComp :  {} (A : (i : I)  Set ( i)) {φ : I} (u :  i  Partial φ (A i)) (a : A i0)  A i1
    -
    -syntax primPOr p q u t = [ p  u , q  t ]
    -
    -primitive
    -  primTransp :  {} (A : (i : I)  Set ( i)) (φ : I) (a : A i0)  A i1
    -  primHComp  :  {} {A : Set } {φ : I} (u :  i  Partial φ A) (a : A)  A
    -
    \ No newline at end of file diff --git a/sites/pmikkelsen.com/_tmp/agda-dfa/Agda.Primitive.html b/sites/pmikkelsen.com/_tmp/agda-dfa/Agda.Primitive.html deleted file mode 100644 index 5829754..0000000 --- a/sites/pmikkelsen.com/_tmp/agda-dfa/Agda.Primitive.html +++ /dev/null @@ -1,35 +0,0 @@ - -Agda.Primitive
    -- The Agda primitives (preloaded).
    -
    -{-# OPTIONS --without-K --no-subtyping #-}
    -
    -module Agda.Primitive where
    -
    -------------------------------------------------------------------------
    --- Universe levels
    -------------------------------------------------------------------------
    -
    -infixl 6 _⊔_
    -
    --- Level is the first thing we need to define.
    --- The other postulates can only be checked if built-in Level is known.
    -
    -postulate
    -  Level : Set
    -
    --- MAlonzo compiles Level to (). This should be safe, because it is
    --- not possible to pattern match on levels.
    -
    -{-# BUILTIN LEVEL Level #-}
    -
    -postulate
    -  lzero : Level
    -  lsuc  : ( : Level)  Level
    -  _⊔_   : (ℓ₁ ℓ₂ : Level)  Level
    -
    -{-# BUILTIN LEVELZERO lzero #-}
    -{-# BUILTIN LEVELSUC  lsuc  #-}
    -{-# BUILTIN LEVELMAX  _⊔_   #-}
    -
    -{-# BUILTIN SETOMEGA Setω #-}
    -
    \ No newline at end of file diff --git a/sites/pmikkelsen.com/_tmp/agda-dfa/Agda.css b/sites/pmikkelsen.com/_tmp/agda-dfa/Agda.css deleted file mode 100644 index 3a4b225..0000000 --- a/sites/pmikkelsen.com/_tmp/agda-dfa/Agda.css +++ /dev/null @@ -1,39 +0,0 @@ -/* Aspects. */ -.Agda .Comment { color: #B22222 } -.Agda .Background {} -.Agda .Markup { color: #000000 } -.Agda .Keyword { color: #CD6600 } -.Agda .String { color: #B22222 } -.Agda .Number { color: #A020F0 } -.Agda .Symbol { color: #404040 } -.Agda .PrimitiveType { color: #0000CD } -.Agda .Pragma { color: black } -.Agda .Operator {} - -/* NameKinds. */ -.Agda .Bound { color: black } -.Agda .Generalizable { color: black } -.Agda .InductiveConstructor { color: #008B00 } -.Agda .CoinductiveConstructor { color: #8B7500 } -.Agda .Datatype { color: #0000CD } -.Agda .Field { color: #EE1289 } -.Agda .Function { color: #0000CD } -.Agda .Module { color: #A020F0 } -.Agda .Postulate { color: #0000CD } -.Agda .Primitive { color: #0000CD } -.Agda .Record { color: #0000CD } - -/* OtherAspects. */ -.Agda .DottedPattern {} -.Agda .UnsolvedMeta { color: black; background: yellow } -.Agda .UnsolvedConstraint { color: black; background: yellow } -.Agda .TerminationProblem { color: black; background: #FFA07A } -.Agda .IncompletePattern { color: black; background: #F5DEB3 } -.Agda .Error { color: red; text-decoration: underline } -.Agda .TypeChecks { color: black; background: #ADD8E6 } -.Agda .Deadcode { color: black; background: #808080 } -.Agda .ShadowingInTelescope { color: black; background: #808080 } - -/* Standard attributes. */ -.Agda a { text-decoration: none } -.Agda a[href]:hover { background-color: #B4EEB4 } diff --git a/sites/pmikkelsen.com/_tmp/agda-dfa/DFA.html b/sites/pmikkelsen.com/_tmp/agda-dfa/DFA.html deleted file mode 100644 index 308e205..0000000 --- a/sites/pmikkelsen.com/_tmp/agda-dfa/DFA.html +++ /dev/null @@ -1,115 +0,0 @@ - -DFA
    module DFA where
    -
    --- A pair type 
    -record _×_ (A B : Set) : Set where
    -  constructor _,_
    -  field
    -    fst : A
    -    snd : B
    -
    --- A list type
    -infixr 5 _∷_
    -data List (a : Set) : Set where
    -  [] : List a
    -  _∷_ : a  List a  List a
    -
    --- Elements of type x ∈ xs is a proof that x is somewhere in xs
    -data _∈_ {A : Set}(x : A) : (xs : List A)  Set where
    -  here :  {xs}  x  (x  xs)
    -  there :  {y xs}  x  xs  x  (y  xs)
    -
    --- Elements of type a ≡ b is a proof that a and b are the same
    -data _≡_ {A : Set}(x : A) : A  Set where
    -  refl : x  x
    -
    --- The empty type. There are no members of this type, so it is the same as false
    -data  : Set where
    -
    --- Negation is defined by a function that takes a proof and returns ⊥, which is impossible. In agda an inhabited type means a proof, and an uninhabited means no proof.
    -¬_ : Set  Set
    -¬ A = A  
    -
    --- A DFA is a five tuple of Q Σ q₀ δ F
    -record DFA (Q : Set) (Σ : Set) (q₀ : Q) (δ : Q × Σ  Q) (F : List Q) : Set where
    -
    --- The DFArun data type keeps track of a running dfa.
    -data DFArun {Q Σ q₀ δ F}(dfa : DFA Q Σ q₀ δ F) : (q : Q)  (w : List Σ)  Set where
    -  empty : {q : Q}  q  F  DFArun dfa q []
    -  acceptOne : {ws : List Σ} 
    -              (w : Σ) 
    -              (q : Q) 
    -              DFArun dfa (δ (q , w)) ws 
    -              DFArun dfa q (w  ws)
    -
    --- Accepts dfa w is a proof that running the dfa with input w is possible form the start state q₀
    -data Accepts {Q Σ q₀ δ F}(dfa : DFA Q Σ q₀ δ F) : (w : List Σ)  Set where
    -  accepts : ∀{w}  DFArun dfa q₀ w  Accepts dfa w
    -
    --- CantAccept dfa q w is a proof that running the dfa on imput w is impossible if we want to start at state q₀. It has to start in q instead.
    -data CantAccept {Q Σ q₀ δ F}(dfa : DFA Q Σ q₀ δ F) : (q : Q)  (w : List Σ)  Set where
    -  cantAccept :  {w q}  DFArun dfa q w  ¬(q  q₀)  CantAccept dfa q w
    -
    -
    --- w ∈Lang dfa gives either a proof that w is in the language of the dfa, or that it isn't.
    -data _∈Lang_ {Q Σ q₀ δ F}(w : List Σ)(dfa : DFA Q Σ q₀ δ F) : Set where
    -  inLang : Accepts dfa w  w ∈Lang dfa
    -  notInLang : ∀{q}  CantAccept dfa q w  w ∈Lang dfa
    -
    -
    -
    -
    --- Test stuff. Create a DFA which only accepts an input with an even number of a's
    -
    -data TestQ : Set where
    -  evenNumberOfAs : TestQ
    -  oddNumberOfAs : TestQ
    -
    -data TestΣ : Set where
    -  a : TestΣ
    -  b : TestΣ
    -
    -Testδ : TestQ × TestΣ  TestQ
    -Testδ (evenNumberOfAs , a) = oddNumberOfAs
    -Testδ (evenNumberOfAs , b) = evenNumberOfAs
    -Testδ (oddNumberOfAs , a) = evenNumberOfAs
    -Testδ (oddNumberOfAs , b) = oddNumberOfAs
    -
    -TestF : List TestQ
    -TestF = evenNumberOfAs  []
    -
    -TestDFA : DFA TestQ TestΣ evenNumberOfAs Testδ TestF
    -TestDFA = _ -- Since a DFA is a record with no fields, agda can infer it
    -
    --- Try to construct proofs for different input strings
    -
    -input₁ input₂ input₃ : List TestΣ
    -input₁ = [] -- Empty string
    -input₂ = a  b  a  a  b  [] -- Three a's
    -input₃ = b  b  a  b  a  [] -- Two a's
    -
    -
    --- The proofs are found automatically by agda, and no other proofs would type check
    -proof₁ : input₁ ∈Lang TestDFA -- Proof that input₁ is in the language
    -proof₁ = inLang (accepts (empty here))
    -
    -proof₂ : input₂ ∈Lang TestDFA -- Proof that input₂ is not in the language
    -proof₂ = notInLang
    -           (cantAccept
    -            (acceptOne a oddNumberOfAs
    -             (acceptOne b evenNumberOfAs
    -              (acceptOne a evenNumberOfAs
    -               (acceptOne a oddNumberOfAs
    -                (acceptOne b evenNumberOfAs (empty here))))))
    -             ()))
    -
    -proof₃ : input₃ ∈Lang TestDFA -- Proof that input₃ is in the language
    -proof₃ = inLang
    -           (accepts
    -            (acceptOne b evenNumberOfAs
    -             (acceptOne b evenNumberOfAs
    -              (acceptOne a evenNumberOfAs
    -               (acceptOne b oddNumberOfAs
    -                (acceptOne a oddNumberOfAs (empty here)))))))
    -
    -
    \ No newline at end of file diff --git a/sites/pmikkelsen.com/_werc/config b/sites/pmikkelsen.com/_werc/config index 85a49d9..c71d503 100644 --- a/sites/pmikkelsen.com/_werc/config +++ b/sites/pmikkelsen.com/_werc/config @@ -1,3 +1,3 @@ masterSite=pmikkelsen.com siteTitle='Peter's website' -siteSubTitle='random notes' +siteSubTitle='- random notes' diff --git a/sites/pmikkelsen.com/_werc/lib/footer.inc b/sites/pmikkelsen.com/_werc/lib/footer.inc deleted file mode 100644 index 90fc345..0000000 --- a/sites/pmikkelsen.com/_werc/lib/footer.inc +++ /dev/null @@ -1 +0,0 @@ -Powered by werc © Peter Mikkelsen 2019-2024 diff --git a/sites/pmikkelsen.com/_werc/lib/top_bar.inc b/sites/pmikkelsen.com/_werc/lib/top_bar.inc deleted file mode 100644 index 5e5c7bc..0000000 --- a/sites/pmikkelsen.com/_werc/lib/top_bar.inc +++ /dev/null @@ -1,11 +0,0 @@ -
    - sourcehut | - gitlab | - prolog | - APL9 | - 9front -
    - -
    -
    - diff --git a/sites/pmikkelsen.com/favicon.ico b/sites/pmikkelsen.com/favicon.ico deleted file mode 100644 index 745367e..0000000 Binary files a/sites/pmikkelsen.com/favicon.ico and /dev/null differ diff --git a/sites/pmikkelsen.com/images/2048.gif b/sites/pmikkelsen.com/images/2048.gif deleted file mode 100644 index 19dd98f..0000000 Binary files a/sites/pmikkelsen.com/images/2048.gif and /dev/null differ diff --git a/sites/pmikkelsen.com/images/acme-in-action.png b/sites/pmikkelsen.com/images/acme-in-action.png deleted file mode 100644 index b74d9dc..0000000 Binary files a/sites/pmikkelsen.com/images/acme-in-action.png and /dev/null differ diff --git a/sites/pmikkelsen.com/images/cdude.png b/sites/pmikkelsen.com/images/cdude.png deleted file mode 100644 index 66ee18d..0000000 Binary files a/sites/pmikkelsen.com/images/cdude.png and /dev/null differ diff --git a/sites/pmikkelsen.com/images/creepy_glenda.jpg b/sites/pmikkelsen.com/images/creepy_glenda.jpg deleted file mode 100644 index c1a35ba..0000000 Binary files a/sites/pmikkelsen.com/images/creepy_glenda.jpg and /dev/null differ diff --git a/sites/pmikkelsen.com/images/cursed.png b/sites/pmikkelsen.com/images/cursed.png deleted file mode 100644 index f92e06e..0000000 Binary files a/sites/pmikkelsen.com/images/cursed.png and /dev/null differ diff --git a/sites/pmikkelsen.com/images/discordgif.gif b/sites/pmikkelsen.com/images/discordgif.gif deleted file mode 100644 index 207af41..0000000 Binary files a/sites/pmikkelsen.com/images/discordgif.gif and /dev/null differ diff --git a/sites/pmikkelsen.com/images/djvfonts.png b/sites/pmikkelsen.com/images/djvfonts.png deleted file mode 100644 index 86d58a4..0000000 Binary files a/sites/pmikkelsen.com/images/djvfonts.png and /dev/null differ diff --git a/sites/pmikkelsen.com/images/fear.jpg b/sites/pmikkelsen.com/images/fear.jpg deleted file mode 100644 index b585dfc..0000000 Binary files a/sites/pmikkelsen.com/images/fear.jpg and /dev/null differ diff --git a/sites/pmikkelsen.com/images/hehegame.gif b/sites/pmikkelsen.com/images/hehegame.gif deleted file mode 100644 index 5c385cb..0000000 Binary files a/sites/pmikkelsen.com/images/hehegame.gif and /dev/null differ diff --git a/sites/pmikkelsen.com/images/hehegame2.gif b/sites/pmikkelsen.com/images/hehegame2.gif deleted file mode 100644 index 5c385cb..0000000 Binary files a/sites/pmikkelsen.com/images/hehegame2.gif and /dev/null differ diff --git a/sites/pmikkelsen.com/images/hehegame3.gif b/sites/pmikkelsen.com/images/hehegame3.gif deleted file mode 100644 index 231f8ef..0000000 Binary files a/sites/pmikkelsen.com/images/hehegame3.gif and /dev/null differ diff --git a/sites/pmikkelsen.com/images/kykeliky.png b/sites/pmikkelsen.com/images/kykeliky.png deleted file mode 100644 index 0144cae..0000000 Binary files a/sites/pmikkelsen.com/images/kykeliky.png and /dev/null differ diff --git a/sites/pmikkelsen.com/images/linuxreverse.gif b/sites/pmikkelsen.com/images/linuxreverse.gif deleted file mode 100644 index 6684116..0000000 Binary files a/sites/pmikkelsen.com/images/linuxreverse.gif and /dev/null differ diff --git a/sites/pmikkelsen.com/images/mordor.gif b/sites/pmikkelsen.com/images/mordor.gif deleted file mode 100644 index fe13c09..0000000 Binary files a/sites/pmikkelsen.com/images/mordor.gif and /dev/null differ diff --git a/sites/pmikkelsen.com/images/rustdude.png b/sites/pmikkelsen.com/images/rustdude.png deleted file mode 100644 index c184664..0000000 Binary files a/sites/pmikkelsen.com/images/rustdude.png and /dev/null differ diff --git a/sites/pmikkelsen.com/images/walkoff.png b/sites/pmikkelsen.com/images/walkoff.png deleted file mode 100644 index 871bb7c..0000000 Binary files a/sites/pmikkelsen.com/images/walkoff.png and /dev/null differ diff --git a/sites/pmikkelsen.com/images/wip-discord.png b/sites/pmikkelsen.com/images/wip-discord.png deleted file mode 100644 index 2ecafcc..0000000 Binary files a/sites/pmikkelsen.com/images/wip-discord.png and /dev/null differ diff --git a/sites/pmikkelsen.com/me/how-i-started-using-acme.md b/sites/pmikkelsen.com/me/how-i-started-using-acme.md index 9e37dd7..143839b 100644 --- a/sites/pmikkelsen.com/me/how-i-started-using-acme.md +++ b/sites/pmikkelsen.com/me/how-i-started-using-acme.md @@ -114,4 +114,4 @@ text in sam with is another editor written by Rob Pike, and I quite like that one too for smaller projects. You can read more about sam [here](http://sam.cat-v.org/). -[1]: /images/acme-in-action.png \ No newline at end of file +[1]: https://images.pmikkelsen.com/acme-in-action.png diff --git a/sites/pmikkelsen.com/plan9/discord.md b/sites/pmikkelsen.com/plan9/discord.md index 8a9815f..fd7a508 100644 --- a/sites/pmikkelsen.com/plan9/discord.md +++ b/sites/pmikkelsen.com/plan9/discord.md @@ -80,4 +80,4 @@ I don't even notice it is not running locally. * No, this has not been tested very much, it just seems to do the job well enough for now. -[1]: /images/discordgif.gif +[1]: https://images.pmikkelsen.com/discordgif.gif diff --git a/sites/pmikkelsen.com/plan9/fonts.md b/sites/pmikkelsen.com/plan9/fonts.md index 6cd6780..d062276 100644 --- a/sites/pmikkelsen.com/plan9/fonts.md +++ b/sites/pmikkelsen.com/plan9/fonts.md @@ -4,9 +4,9 @@ By default 9front uses a font called VGA but its too small for my eyes. The fonts I use (dejavu) look like this[![an image showing the fonts][1]][1] and are attached below: -[proportional font](/_files/djv.tar) +[proportional font](https://files.pmikkelsen.com/djv.tar) -[monospace font](/_files/djvmono.tar) +[monospace font](https://files.pmikkelsen.com/djvmono.tar) They can be recreated by having them installed on linux and doing the following from linux with plan9port installed. @@ -26,4 +26,4 @@ Finally change your `lib/profile` to use `/lib/font/bit/djv/font` :) Note that 9front includes truetypefs which allows you to use `.ttf` files directly, but I find the results are better looking this way. -[1]: /images/djvfonts.png \ No newline at end of file +[1]: https://images.pmikkelsen.com/djvfonts.png diff --git a/sites/pmikkelsen.com/plan9/lets_encrypt.md b/sites/pmikkelsen.com/plan9/lets_encrypt.md index c22d0fa..a7eae3a 100644 --- a/sites/pmikkelsen.com/plan9/lets_encrypt.md +++ b/sites/pmikkelsen.com/plan9/lets_encrypt.md @@ -10,7 +10,7 @@ Install certbot on linux and run the following command certbot certonly --manual -d pmikkelsen.com -d vps1.pmikkelsen.com and do the challenges, they should be easy. -I use the diff [here](/_files/ndb.diff) to make 9fronts dns server understand the needed records. +I use the diff [here](https://files.pmikkelsen.com/ndb.diff) to make 9fronts dns server understand the needed records. *EDIT*: As of Sun Feb 14 2021, this patch is no longer needed since cinap pushed a [proper fix](http://code.9front.org/hg/plan9front/rev/73935ff27172). diff --git a/sites/pmikkelsen.com/plan9/mounting-9p-over-drawterm.md b/sites/pmikkelsen.com/plan9/mounting-9p-over-drawterm.md index 414b9f2..cb04b97 100644 --- a/sites/pmikkelsen.com/plan9/mounting-9p-over-drawterm.md +++ b/sites/pmikkelsen.com/plan9/mounting-9p-over-drawterm.md @@ -55,4 +55,4 @@ This means I can just go into any directory on the server, type `linux ghci` and The bind net trick still blows my mind a bit, since it is so trivial, yet so powerful. It is also fun to think about how one would do this on other systems than plan9, which I can't even imagine. -[1]: /images/linuxreverse.gif +[1]: https://images.pmikkelsen.com/linuxreverse.gif diff --git a/sites/pmikkelsen.com/plan9/webfs-websocket.md b/sites/pmikkelsen.com/plan9/webfs-websocket.md index c229f95..084411b 100644 --- a/sites/pmikkelsen.com/plan9/webfs-websocket.md +++ b/sites/pmikkelsen.com/plan9/webfs-websocket.md @@ -1,7 +1,7 @@ # Creating websocket connections via 9front's webfs With the following patch (note: work in progress, contains bugs), 9front's webfs can be used -to create websocket connections. The patch is available [here](/_files/websocket-webfs.patch). +to create websocket connections. The patch is available [here](https://files.pmikkelsen.com/websocket-webfs.patch). ## The idea @@ -74,4 +74,4 @@ back to the user. ## Bugs Yes. The code doesn't really handle errors or connection shutdowns yet. Also, I need to add proper cleanup code -around in different places. \ No newline at end of file +around in different places. diff --git a/sites/prolog.pmikkelsen.com/_werc/lib/footer.inc b/sites/prolog.pmikkelsen.com/_werc/lib/footer.inc deleted file mode 100644 index 996a89a..0000000 --- a/sites/prolog.pmikkelsen.com/_werc/lib/footer.inc +++ /dev/null @@ -1 +0,0 @@ -Powered by werc © Peter Mikkelsen 2020-2022 \ No newline at end of file diff --git a/sites/prolog.pmikkelsen.com/_werc/lib/top_bar.inc b/sites/prolog.pmikkelsen.com/_werc/lib/top_bar.inc deleted file mode 100644 index e6a79eb..0000000 --- a/sites/prolog.pmikkelsen.com/_werc/lib/top_bar.inc +++ /dev/null @@ -1,8 +0,0 @@ - - -
    -
    diff --git a/sites/prolog.pmikkelsen.com/favicon.ico b/sites/prolog.pmikkelsen.com/favicon.ico deleted file mode 100644 index 745367e..0000000 Binary files a/sites/prolog.pmikkelsen.com/favicon.ico and /dev/null differ diff --git a/sites/prolog.pmikkelsen.com/index.md b/sites/prolog.pmikkelsen.com/index.md index 730d8c0..e1e24df 100644 --- a/sites/prolog.pmikkelsen.com/index.md +++ b/sites/prolog.pmikkelsen.com/index.md @@ -69,4 +69,4 @@ and many more all listed [here](https://git.sr.ht/~pmikkelsen/pprolog/tree/maste [![A picture of pprolog in action][1]][1] -[1]: /_images/prolog-screenshot.png +[1]: https://images.pmikkelsen.com/prolog-screenshot.png diff --git a/tpl/_debug.tpl b/tpl/_debug.tpl deleted file mode 100644 index 4d650ea..0000000 --- a/tpl/_debug.tpl +++ /dev/null @@ -1,29 +0,0 @@ -% if(! ~ $#debug_shell 0) { -
    - - -
    - - -%{ -fn evl { - # Buffering is probably messing this up: - #rc -c 'flag x +;{'^$post_arg_command'} |[2] awk ''{print ">> "$0}''' - rc -c 'flag s +; flag x +;'^$post_arg_command -} - if(! ~ $#post_arg_command 0 && ! ~ $#post_arg_command '') { - echo '
    '
    -        evl | escape_html |[2] awk '{print ""$0""}' 
    -        echo '
    ' - } -%} -% } - -
    -% env | escape_html
    -

    - -% umask - diff --git a/tpl/_users/login.tpl b/tpl/_users/login.tpl deleted file mode 100644 index 5857188..0000000 --- a/tpl/_users/login.tpl +++ /dev/null @@ -1,18 +0,0 @@ -

    User login

    -
    -% if(check_user) { - You are logged in as: %($logged_user%) -% } -% if not { -% if (~ $REQUEST_METHOD POST) -% echo '
    Login failed!
    ' -
    -
    -
    -
    - -
    -
    -% } - -
    -- cgit v1.2.3