initial commit
This commit is contained in:
commit
5b839e0543
174 changed files with 12261 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
.DS_Store
|
||||
.htpasswd
|
||||
werc/etc/*
|
48
Dockerfile
Normal file
48
Dockerfile
Normal file
|
@ -0,0 +1,48 @@
|
|||
FROM alpine:latest
|
||||
|
||||
#ENV PLAN9 /usr/lib/9base
|
||||
ENV PLAN9 /usr/lib/plan9
|
||||
ENV EDITOR /usr/bin/nvim
|
||||
|
||||
#RUN apk add 9base --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing/
|
||||
#RUN apk add plan9port
|
||||
RUN apk add --update --no-cache \
|
||||
lighttpd \
|
||||
lighttpd-mod_auth \
|
||||
apache2-utils \
|
||||
curl \
|
||||
discount \
|
||||
shadow \
|
||||
imagemagick \
|
||||
aspell \
|
||||
aspell-en \
|
||||
neovim \
|
||||
git build-base linux-headers libucontext-dev libxt-dev libx11-dev fontconfig-dev libxext-dev perl \
|
||||
&& rm -rf /var/cache/apk/*
|
||||
RUN curl http://werc.cat-v.org/download/werc-1.5.0.tar.gz | tar xzf - && mkdir -p /var/www/ && mv ../werc-*/ /var/www/werc
|
||||
RUN git clone https://github.com/9fans/plan9port /usr/lib/plan9
|
||||
WORKDIR /usr/lib/plan9
|
||||
RUN ./INSTALL
|
||||
WORKDIR /
|
||||
|
||||
COPY etc/lighttpd/ /etc/lighttpd/
|
||||
RUN sed 's/fltr_cache md2html\.awk/fltr_cache markdown/' /var/www/werc/etc/initrc > /var/www/werc/etc/initrc.local
|
||||
COPY init.sh /usr/local/bin
|
||||
RUN chmod +x /usr/local/bin/init.sh
|
||||
|
||||
RUN ln -s $PLAN9 /usr/local/plan9
|
||||
RUN ln -s $PLAN9/bin/rc /bin/rc
|
||||
RUN ln -s $PLAN9/bin/awk /bin/awk
|
||||
#RUN cp /usr/bin/sha1sum $PLAN9/bin
|
||||
ENV PATH="$PLAN9/bin:${PATH}"
|
||||
|
||||
EXPOSE 80
|
||||
|
||||
#RUN /var/www/werc/bin/contrib/fix-rc-scripts /var/www/werc/bin
|
||||
|
||||
RUN usermod -u 1000 lighttpd
|
||||
RUN chown -R lighttpd:root /var/www
|
||||
RUN chmod -R g+w /var/www/werc/sites
|
||||
#RUN sed '1s|^.*$|#!/usr/lib/9base/bin/rc|' /var/www/werc/bin/werc.rc > /tmp/werc.rc.tmp && mv /tmp/werc.rc.tmp /var/www/werc/bin/werc.rc && chmod 775 /var/www/werc/bin/werc.rc
|
||||
#RUN sed 's/formatter=(fltr_cache md2html\.awk)/formatter=(fltr_cache markdown)/' /var/www/werc/etc/initrc > /var/www/werc/etc/initrc.local
|
||||
CMD ["init.sh"]
|
32
docker-compose.yml
Normal file
32
docker-compose.yml
Normal file
|
@ -0,0 +1,32 @@
|
|||
services:
|
||||
werc:
|
||||
build:
|
||||
dockerfile: Dockerfile
|
||||
context: .
|
||||
ports:
|
||||
- 80:80
|
||||
environment:
|
||||
- HOSTNAME=thirdculture.top
|
||||
volumes:
|
||||
- werc:/var/www/werc
|
||||
- lighttpd:/etc/lighttpd
|
||||
tty: true
|
||||
gossa:
|
||||
image: pldubouilh/gossa
|
||||
ports:
|
||||
- 8001:8001
|
||||
volumes:
|
||||
- ./werc/sites/thirdculture.top/_files:/shared
|
||||
volumes:
|
||||
werc:
|
||||
driver: local
|
||||
driver_opts:
|
||||
o: bind
|
||||
type: none
|
||||
device: "./werc"
|
||||
lighttpd:
|
||||
driver: local
|
||||
driver_opts:
|
||||
o: bind
|
||||
type: none
|
||||
device: "./etc/lighttpd"
|
21
etc/lighttpd/conf.d/files.thirdculture.top.conf
Normal file
21
etc/lighttpd/conf.d/files.thirdculture.top.conf
Normal file
|
@ -0,0 +1,21 @@
|
|||
$HTTP["host"] =~ "^files\.thirdculture\.top$" {
|
||||
auth.backend = "htpasswd"
|
||||
auth.backend.htpasswd.userfile = "/etc/lighttpd/.htpasswd"
|
||||
|
||||
auth.require = ( "" =>
|
||||
(
|
||||
"method" => "basic",
|
||||
"realm" => "Password protected area",
|
||||
"require" => "valid-user"
|
||||
)
|
||||
)
|
||||
|
||||
proxy.server = (
|
||||
"" => (
|
||||
(
|
||||
"host" => "gossa",
|
||||
"port" => 8001
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
6
etc/lighttpd/conf.d/ppl.thirdculture.top.conf
Normal file
6
etc/lighttpd/conf.d/ppl.thirdculture.top.conf
Normal file
|
@ -0,0 +1,6 @@
|
|||
$HTTP["host"] =~ "^ppl\.thirdculture\.top$" {
|
||||
index-file.names = ( )
|
||||
server.error-handler-404 = "/werc.rc"
|
||||
alias.url += ( "/werc.rc" => "/var/www/werc/bin/werc.rc" )
|
||||
cgi.assign += ( ".rc" => "")
|
||||
}
|
6
etc/lighttpd/conf.d/thirdculture.top.conf
Normal file
6
etc/lighttpd/conf.d/thirdculture.top.conf
Normal file
|
@ -0,0 +1,6 @@
|
|||
$HTTP["host"] =~ "^thirdculture\.top$" {
|
||||
index-file.names = ( )
|
||||
server.error-handler-404 = "/werc.rc"
|
||||
alias.url += ( "/werc.rc" => "/var/www/werc/bin/werc.rc" )
|
||||
cgi.assign += ( ".rc" => "")
|
||||
}
|
326
etc/lighttpd/lighttpd.conf
Normal file
326
etc/lighttpd/lighttpd.conf
Normal file
|
@ -0,0 +1,326 @@
|
|||
###############################################################################
|
||||
# Default lighttpd.conf for Gentoo.
|
||||
# $Header: /var/cvsroot/gentoo-x86/www-servers/lighttpd/files/conf/lighttpd.conf,v 1.3 2005/09/01 14:22:35 ka0ttic Exp $
|
||||
###############################################################################
|
||||
|
||||
# {{{ variables
|
||||
var.basedir = "/var/www/localhost"
|
||||
var.logdir = "/var/log/lighttpd"
|
||||
var.statedir = "/var/lib/lighttpd"
|
||||
# }}}
|
||||
|
||||
# {{{ modules
|
||||
# At the very least, mod_access and mod_accesslog should be enabled.
|
||||
# All other modules should only be loaded if necessary.
|
||||
# NOTE: the order of modules is important.
|
||||
server.modules = (
|
||||
"mod_rewrite",
|
||||
# "mod_redirect",
|
||||
"mod_alias",
|
||||
"mod_access",
|
||||
# "mod_cml",
|
||||
# "mod_trigger_b4_dl",
|
||||
"mod_auth",
|
||||
# "mod_status",
|
||||
# "mod_setenv",
|
||||
"mod_proxy",
|
||||
# "mod_simple_vhost",
|
||||
# "mod_evhost",
|
||||
# "mod_userdir",
|
||||
# "mod_deflate",
|
||||
# "mod_ssi",
|
||||
# "mod_usertrack",
|
||||
# "mod_expire",
|
||||
# "mod_secdownload",
|
||||
# "mod_rrdtool",
|
||||
# "mod_webdav",
|
||||
"mod_accesslog"
|
||||
)
|
||||
# }}}
|
||||
|
||||
# {{{ includes
|
||||
include "mime-types.conf"
|
||||
# uncomment for cgi support
|
||||
include "mod_cgi.conf"
|
||||
# uncomment for php/fastcgi support
|
||||
# include "mod_fastcgi.conf"
|
||||
# uncomment for php/fastcgi fpm support
|
||||
# include "mod_fastcgi_fpm.conf"
|
||||
# }}}
|
||||
|
||||
# {{{ server settings
|
||||
server.username = "lighttpd"
|
||||
server.groupname = "lighttpd"
|
||||
|
||||
server.document-root = var.basedir + "/htdocs"
|
||||
server.pid-file = "/run/lighttpd.pid"
|
||||
|
||||
server.errorlog = "/dev/pts/0"
|
||||
#server.errorlog = var.logdir + "/error.log"
|
||||
# log errors to syslog instead
|
||||
# server.errorlog-use-syslog = "enable"
|
||||
|
||||
server.indexfiles = ("index.php", "index.html",
|
||||
"index.htm", "default.htm")
|
||||
|
||||
# server.tag = "lighttpd"
|
||||
|
||||
server.follow-symlink = "enable"
|
||||
|
||||
# event handler (defaults to "poll")
|
||||
# see performance.txt
|
||||
#
|
||||
# for >= linux-2.4
|
||||
# server.event-handler = "linux-rtsig"
|
||||
# for >= linux-2.6
|
||||
# server.event-handler = "linux-sysepoll"
|
||||
# for FreeBSD
|
||||
# server.event-handler = "freebsd-kqueue"
|
||||
|
||||
# chroot to directory (defaults to no chroot)
|
||||
# server.chroot = "/"
|
||||
|
||||
# bind to port (defaults to 80)
|
||||
# server.port = 81
|
||||
|
||||
# bind to name (defaults to all interfaces)
|
||||
# server.bind = "grisu.home.kneschke.de"
|
||||
|
||||
# error-handler for status 404
|
||||
# server.error-handler-404 = "/error-handler.html"
|
||||
# server.error-handler-404 = "/error-handler.php"
|
||||
|
||||
# Format: <errorfile-prefix><status-code>.html
|
||||
# -> ..../status-404.html for 'File not found'
|
||||
# server.errorfile-prefix = var.basedir + "/error/status-"
|
||||
|
||||
# FAM support for caching stat() calls
|
||||
# requires that lighttpd be built with USE=fam
|
||||
# server.stat-cache-engine = "fam"
|
||||
# }}}
|
||||
|
||||
# {{{ mod_staticfile
|
||||
|
||||
# which extensions should not be handled via static-file transfer
|
||||
# (extensions that are usually handled by mod_cgi, mod_fastcgi, etc).
|
||||
static-file.exclude-extensions = (".php", ".pl", ".cgi", ".fcgi")
|
||||
# }}}
|
||||
|
||||
# {{{ mod_accesslog
|
||||
accesslog.filename = "/dev/pts/0"
|
||||
#accesslog.filename = var.logdir + "/access.log"
|
||||
# }}}
|
||||
|
||||
# {{{ mod_dirlisting
|
||||
# enable directory listings
|
||||
# dir-listing.activate = "enable"
|
||||
#
|
||||
# don't list hidden files/directories
|
||||
# dir-listing.hide-dotfiles = "enable"
|
||||
#
|
||||
# use a different css for directory listings
|
||||
# dir-listing.external-css = "/path/to/dir-listing.css"
|
||||
#
|
||||
# list of regular expressions. files that match any of the
|
||||
# specified regular expressions will be excluded from directory
|
||||
# listings.
|
||||
# dir-listing.exclude = ("^\.", "~$")
|
||||
# }}}
|
||||
|
||||
# {{{ mod_access
|
||||
# see access.txt
|
||||
|
||||
url.access-deny = ("~", ".inc")
|
||||
# }}}
|
||||
|
||||
# {{{ mod_userdir
|
||||
# see userdir.txt
|
||||
#
|
||||
# userdir.path = "public_html"
|
||||
# userdir.exclude-user = ("root")
|
||||
# }}}
|
||||
|
||||
# {{{ mod_ssi
|
||||
# see ssi.txt
|
||||
#
|
||||
# ssi.extension = (".shtml")
|
||||
# }}}
|
||||
|
||||
# {{{ mod_ssl
|
||||
# see ssl.txt
|
||||
#
|
||||
# ssl.engine = "enable"
|
||||
# ssl.pemfile = "server.pem"
|
||||
# }}}
|
||||
|
||||
# {{{ mod_status
|
||||
# see status.txt
|
||||
#
|
||||
# status.status-url = "/server-status"
|
||||
# status.config-url = "/server-config"
|
||||
# }}}
|
||||
|
||||
# {{{ mod_simple_vhost
|
||||
# see simple-vhost.txt
|
||||
#
|
||||
# If you want name-based virtual hosting add the next three settings and load
|
||||
# mod_simple_vhost
|
||||
#
|
||||
# document-root =
|
||||
# virtual-server-root + virtual-server-default-host + virtual-server-docroot
|
||||
# or
|
||||
# virtual-server-root + http-host + virtual-server-docroot
|
||||
#
|
||||
# simple-vhost.server-root = "/home/weigon/wwwroot/servers/"
|
||||
# simple-vhost.default-host = "grisu.home.kneschke.de"
|
||||
# simple-vhost.document-root = "/pages/"
|
||||
# }}}
|
||||
|
||||
# {{{ mod_deflate
|
||||
# see compress.txt
|
||||
#
|
||||
# deflate.cache-dir = var.statedir + "/cache/compress"
|
||||
# deflate.mimetypes = ("text/plain", "text/html")
|
||||
# }}}
|
||||
|
||||
# {{{ mod_proxy
|
||||
# see proxy.txt
|
||||
#
|
||||
# proxy.server = ( ".php" =>
|
||||
# ( "localhost" =>
|
||||
# (
|
||||
# "host" => "192.168.0.101",
|
||||
# "port" => 80
|
||||
# )
|
||||
# )
|
||||
# )
|
||||
# }}}
|
||||
|
||||
# {{{ mod_auth
|
||||
# see authentication.txt
|
||||
#
|
||||
# auth.backend = "plain"
|
||||
# auth.backend.plain.userfile = "lighttpd.user"
|
||||
# auth.backend.plain.groupfile = "lighttpd.group"
|
||||
|
||||
# auth.backend.ldap.hostname = "localhost"
|
||||
# auth.backend.ldap.base-dn = "dc=my-domain,dc=com"
|
||||
# auth.backend.ldap.filter = "(uid=$)"
|
||||
|
||||
# auth.require = ( "/server-status" =>
|
||||
# (
|
||||
# "method" => "digest",
|
||||
# "realm" => "download archiv",
|
||||
# "require" => "user=jan"
|
||||
# ),
|
||||
# "/server-info" =>
|
||||
# (
|
||||
# "method" => "digest",
|
||||
# "realm" => "download archiv",
|
||||
# "require" => "valid-user"
|
||||
# )
|
||||
# )
|
||||
# }}}
|
||||
|
||||
# {{{ mod_rewrite
|
||||
# see rewrite.txt
|
||||
#
|
||||
# url.rewrite = (
|
||||
# "^/$" => "/server-status"
|
||||
# )
|
||||
# }}}
|
||||
|
||||
# {{{ mod_redirect
|
||||
# see redirect.txt
|
||||
#
|
||||
# url.redirect = (
|
||||
# "^/wishlist/(.+)" => "http://www.123.org/$1"
|
||||
# )
|
||||
# }}}
|
||||
|
||||
# {{{ mod_evhost
|
||||
# define a pattern for the host url finding
|
||||
# %% => % sign
|
||||
# %0 => domain name + tld
|
||||
# %1 => tld
|
||||
# %2 => domain name without tld
|
||||
# %3 => subdomain 1 name
|
||||
# %4 => subdomain 2 name
|
||||
#
|
||||
# evhost.path-pattern = "/home/storage/dev/www/%3/htdocs/"
|
||||
# }}}
|
||||
|
||||
# {{{ mod_expire
|
||||
# expire.url = (
|
||||
# "/buggy/" => "access 2 hours",
|
||||
# "/asdhas/" => "access plus 1 seconds 2 minutes"
|
||||
# )
|
||||
# }}}
|
||||
|
||||
# {{{ mod_rrdtool
|
||||
# see rrdtool.txt
|
||||
#
|
||||
# rrdtool.binary = "/usr/bin/rrdtool"
|
||||
# rrdtool.db-name = var.statedir + "/lighttpd.rrd"
|
||||
# }}}
|
||||
|
||||
# {{{ mod_setenv
|
||||
# see setenv.txt
|
||||
#
|
||||
# setenv.add-request-header = ( "TRAV_ENV" => "mysql://user@host/db" )
|
||||
# setenv.add-response-header = ( "X-Secret-Message" => "42" )
|
||||
# }}}
|
||||
|
||||
# {{{ mod_trigger_b4_dl
|
||||
# see trigger_b4_dl.txt
|
||||
#
|
||||
# trigger-before-download.gdbm-filename = "/home/weigon/testbase/trigger.db"
|
||||
# trigger-before-download.memcache-hosts = ( "127.0.0.1:11211" )
|
||||
# trigger-before-download.trigger-url = "^/trigger/"
|
||||
# trigger-before-download.download-url = "^/download/"
|
||||
# trigger-before-download.deny-url = "http://127.0.0.1/index.html"
|
||||
# trigger-before-download.trigger-timeout = 10
|
||||
# }}}
|
||||
|
||||
# {{{ mod_cml
|
||||
# see cml.txt
|
||||
#
|
||||
# don't forget to add index.cml to server.indexfiles
|
||||
# cml.extension = ".cml"
|
||||
# cml.memcache-hosts = ( "127.0.0.1:11211" )
|
||||
# }}}
|
||||
|
||||
# {{{ mod_webdav
|
||||
# see webdav.txt
|
||||
#
|
||||
# $HTTP["url"] =~ "^/dav($|/)" {
|
||||
# webdav.activate = "enable"
|
||||
# webdav.is-readonly = "enable"
|
||||
# }
|
||||
# }}}
|
||||
|
||||
# {{{ extra rules
|
||||
#
|
||||
# set Content-Encoding and reset Content-Type for browsers that
|
||||
# support decompressing on-thy-fly (requires mod_setenv)
|
||||
# $HTTP["url"] =~ "\.gz$" {
|
||||
# setenv.add-response-header = ("Content-Encoding" => "x-gzip")
|
||||
# mimetype.assign = (".gz" => "text/plain")
|
||||
# }
|
||||
|
||||
# $HTTP["url"] =~ "\.bz2$" {
|
||||
# setenv.add-response-header = ("Content-Encoding" => "x-bzip2")
|
||||
# mimetype.assign = (".bz2" => "text/plain")
|
||||
# }
|
||||
#
|
||||
# }}}
|
||||
|
||||
# {{{ debug
|
||||
# debug.log-request-header = "enable"
|
||||
# debug.log-response-header = "enable"
|
||||
# debug.log-request-handling = "enable"
|
||||
# debug.log-file-not-found = "enable"
|
||||
# }}}
|
||||
|
||||
# vim: set ft=conf foldmethod=marker et :
|
||||
include "/etc/lighttpd/conf.d/*.conf"
|
79
etc/lighttpd/mime-types.conf
Normal file
79
etc/lighttpd/mime-types.conf
Normal file
|
@ -0,0 +1,79 @@
|
|||
###############################################################################
|
||||
# Default mime-types.conf for Gentoo.
|
||||
# include'd from lighttpd.conf.
|
||||
# $Header: /var/cvsroot/gentoo-x86/www-servers/lighttpd/files/conf/mime-types.conf,v 1.4 2010/03/14 21:45:18 bangert Exp $
|
||||
###############################################################################
|
||||
|
||||
# {{{ mime types
|
||||
mimetype.assign = (
|
||||
".svg" => "image/svg+xml",
|
||||
".svgz" => "image/svg+xml",
|
||||
".pdf" => "application/pdf",
|
||||
".sig" => "application/pgp-signature",
|
||||
".spl" => "application/futuresplash",
|
||||
".class" => "application/octet-stream",
|
||||
".ps" => "application/postscript",
|
||||
".torrent" => "application/x-bittorrent",
|
||||
".dvi" => "application/x-dvi",
|
||||
".gz" => "application/x-gzip",
|
||||
".pac" => "application/x-ns-proxy-autoconfig",
|
||||
".swf" => "application/x-shockwave-flash",
|
||||
".tar.gz" => "application/x-tgz",
|
||||
".tgz" => "application/x-tgz",
|
||||
".tar" => "application/x-tar",
|
||||
".zip" => "application/zip",
|
||||
".dmg" => "application/x-apple-diskimage",
|
||||
".mp3" => "audio/mpeg",
|
||||
".m3u" => "audio/x-mpegurl",
|
||||
".wma" => "audio/x-ms-wma",
|
||||
".wax" => "audio/x-ms-wax",
|
||||
".ogg" => "application/ogg",
|
||||
".wav" => "audio/x-wav",
|
||||
".gif" => "image/gif",
|
||||
".jpg" => "image/jpeg",
|
||||
".jpeg" => "image/jpeg",
|
||||
".png" => "image/png",
|
||||
".xbm" => "image/x-xbitmap",
|
||||
".xpm" => "image/x-xpixmap",
|
||||
".xwd" => "image/x-xwindowdump",
|
||||
".css" => "text/css",
|
||||
".html" => "text/html",
|
||||
".htm" => "text/html",
|
||||
".js" => "text/javascript",
|
||||
".asc" => "text/plain",
|
||||
".c" => "text/plain",
|
||||
".h" => "text/plain",
|
||||
".cc" => "text/plain",
|
||||
".cpp" => "text/plain",
|
||||
".hh" => "text/plain",
|
||||
".hpp" => "text/plain",
|
||||
".conf" => "text/plain",
|
||||
".log" => "text/plain",
|
||||
".text" => "text/plain",
|
||||
".txt" => "text/plain",
|
||||
".diff" => "text/plain",
|
||||
".patch" => "text/plain",
|
||||
".ebuild" => "text/plain",
|
||||
".eclass" => "text/plain",
|
||||
".rtf" => "application/rtf",
|
||||
".bmp" => "image/bmp",
|
||||
".tif" => "image/tiff",
|
||||
".tiff" => "image/tiff",
|
||||
".ico" => "image/x-icon",
|
||||
".dtd" => "text/xml",
|
||||
".xml" => "text/xml",
|
||||
".mpeg" => "video/mpeg",
|
||||
".mpg" => "video/mpeg",
|
||||
".mov" => "video/quicktime",
|
||||
".qt" => "video/quicktime",
|
||||
".avi" => "video/x-msvideo",
|
||||
".asf" => "video/x-ms-asf",
|
||||
".asx" => "video/x-ms-asf",
|
||||
".wmv" => "video/x-ms-wmv",
|
||||
".bz2" => "application/x-bzip",
|
||||
".tbz" => "application/x-bzip-compressed-tar",
|
||||
".tar.bz2" => "application/x-bzip-compressed-tar"
|
||||
)
|
||||
# }}}
|
||||
|
||||
# vim: set ft=conf foldmethod=marker et :
|
33
etc/lighttpd/mod_cgi.conf
Normal file
33
etc/lighttpd/mod_cgi.conf
Normal file
|
@ -0,0 +1,33 @@
|
|||
###############################################################################
|
||||
# mod_cgi.conf
|
||||
# include'd by lighttpd.conf.
|
||||
# $Header: /var/cvsroot/gentoo-x86/www-servers/lighttpd/files/conf/mod_cgi.conf,v 1.1 2005/08/27 12:36:13 ka0ttic Exp $
|
||||
###############################################################################
|
||||
|
||||
#
|
||||
# see cgi.txt for more information on using mod_cgi
|
||||
#
|
||||
|
||||
server.modules += ("mod_cgi")
|
||||
|
||||
# NOTE: this requires mod_alias
|
||||
alias.url = (
|
||||
"/cgi-bin/" => var.basedir + "/cgi-bin/"
|
||||
)
|
||||
|
||||
#
|
||||
# Note that you'll also want to enable the
|
||||
# cgi-bin alias via mod_alias (above).
|
||||
#
|
||||
|
||||
$HTTP["url"] =~ "^/cgi-bin/" {
|
||||
# disable directory listings
|
||||
#dir-listing.activate = "disable"
|
||||
# only allow cgi's in this directory
|
||||
cgi.assign = (
|
||||
".pl" => "/usr/bin/perl",
|
||||
".cgi" => "/usr/bin/perl"
|
||||
)
|
||||
}
|
||||
|
||||
# vim: set ft=conf foldmethod=marker et :
|
17
etc/lighttpd/mod_fastcgi.conf
Normal file
17
etc/lighttpd/mod_fastcgi.conf
Normal file
|
@ -0,0 +1,17 @@
|
|||
###############################################################################
|
||||
# mod_fastcgi.conf
|
||||
# include'd by lighttpd.conf.
|
||||
# $Header: /var/cvsroot/gentoo-x86/www-servers/lighttpd/files/conf/mod_fastcgi.conf-1.4.13-r2,v 1.1 2007/04/01 23:22:00 robbat2 Exp $
|
||||
###############################################################################
|
||||
|
||||
server.modules += ("mod_fastcgi")
|
||||
fastcgi.server = ( ".php" =>
|
||||
( "localhost" =>
|
||||
(
|
||||
"socket" => "/run/lighttpd/lighttpd-fastcgi-php-" + PID + ".socket",
|
||||
"bin-path" => "/usr/bin/php-cgi"
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
# vim: set ft=conf foldmethod=marker et :
|
16
etc/lighttpd/mod_fastcgi_fpm.conf
Normal file
16
etc/lighttpd/mod_fastcgi_fpm.conf
Normal file
|
@ -0,0 +1,16 @@
|
|||
###############################################################################
|
||||
# mod_fastcgi_fpm.conf
|
||||
# include'd by lighttpd.conf.
|
||||
###############################################################################
|
||||
|
||||
server.modules += ("mod_fastcgi")
|
||||
fastcgi.server = ( ".php" =>
|
||||
( "localhost" =>
|
||||
(
|
||||
"host" => "127.0.0.1",
|
||||
"port" => "9000"
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
# vim: set ft=conf foldmethod=marker et :
|
24
init.sh
Normal file
24
init.sh
Normal file
|
@ -0,0 +1,24 @@
|
|||
#!/bin/sh
|
||||
|
||||
if [ ! -d "/var/www/werc/sites/$HOSTNAME" ]; then
|
||||
echo "Index directory for hostname $HOSTNAME does not exist. Creating..."
|
||||
cp -r /var/www/werc/sites/werc.cat-v.org "/var/www/werc/sites/$HOSTNAME"
|
||||
echo "# Hello World!" > "/var/www/werc/sites/$HOSTNAME/index.md"
|
||||
fi
|
||||
|
||||
CONF_FILE="/etc/lighttpd/conf.d/$HOSTNAME.conf"
|
||||
if [ ! -f "$CONF_FILE" ]; then
|
||||
echo "Creating new configuration file: $CONF_FILE"
|
||||
cat << EOF > "$CONF_FILE"
|
||||
\$HTTP["host"] =~ "^$(echo "$HOSTNAME" | sed 's/\./\\./g')$" {
|
||||
index-file.names = ( )
|
||||
server.error-handler-404 = "/werc.rc"
|
||||
alias.url += ( "/werc.rc" => "/var/www/werc/bin/werc.rc" )
|
||||
cgi.assign += ( ".rc" => "" )
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
|
||||
echo "Running lighttpd"
|
||||
chmod a+w /dev/pts/0
|
||||
exec lighttpd -D -f /etc/lighttpd/lighttpd.conf
|
79
werc/README
Normal file
79
werc/README
Normal file
|
@ -0,0 +1,79 @@
|
|||
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.
|
6
werc/apps/barf/.hg_archival.txt
Normal file
6
werc/apps/barf/.hg_archival.txt
Normal file
|
@ -0,0 +1,6 @@
|
|||
repo: 77501160f26f7411d00111255a38267f9973ec27
|
||||
node: e422b2d51d185ecbbdb180a28fdd13cac672be03
|
||||
branch: default
|
||||
latesttag: null
|
||||
latesttagdistance: 25
|
||||
changessincelatesttag: 25
|
158
werc/apps/barf/README
Executable file
158
werc/apps/barf/README
Executable file
|
@ -0,0 +1,158 @@
|
|||
BARF - emit HTML
|
||||
|
||||
DESCRIPTION
|
||||
BARF utilizes rc(1) and command line tools to compile a structured
|
||||
directory of files into a single page of HTML. Tagging and RSS 2.0
|
||||
feeds have been implemented.
|
||||
|
||||
SETUP
|
||||
To enable BARF, add:
|
||||
|
||||
conf_enable_barf
|
||||
|
||||
to _werc/config under the site root.
|
||||
|
||||
To configure BARF, copy or create the following files under the site
|
||||
root (example files have been included in this distribution):
|
||||
|
||||
_werc/barf/config
|
||||
A list of variables that control various site options:
|
||||
|
||||
barf_type=paste # blog, image, log, paste
|
||||
posts_per_page=10
|
||||
show_ascending=0
|
||||
show_footer=0
|
||||
show_header=0
|
||||
show_sidebar=0
|
||||
require_login=0 # if not logged in, redirect to /login
|
||||
allow_anon=1 # allow posts without logging in
|
||||
show_disqus=0 # include disqus comments template
|
||||
# from _werc/barf/disqus
|
||||
|
||||
_werc/barf/footer
|
||||
HTML or markdown that will appear as the foot of
|
||||
the BARF content area.
|
||||
|
||||
_werc/barf/header
|
||||
HTML or markdown that will appear at the head of
|
||||
the BARF content area.
|
||||
|
||||
_werc/barf/sidebar
|
||||
HTML or markdown that will appear on one side of
|
||||
the BARF content area.
|
||||
|
||||
Finally, sample stylesheets are provided in the directory
|
||||
pub/. Copy any of these to _werc/pub/style.css to try
|
||||
them out.
|
||||
|
||||
POSTS
|
||||
Posts are stored in the directory src/ relative to the
|
||||
site root.
|
||||
|
||||
Directory names in src/ that do not match the regular
|
||||
expression ^[0-9]*$ will not be included in the listing of
|
||||
posts that are displayed in the browser. However, such
|
||||
directories are still accessible when called directly via
|
||||
an appropriately constructed URL.
|
||||
|
||||
A post's directory contains the following files and
|
||||
directories (an example post's directory has been
|
||||
included in this distribution):
|
||||
|
||||
body
|
||||
date
|
||||
img/
|
||||
link
|
||||
tags/
|
||||
title
|
||||
|
||||
The img/ directory contains images uploaded to the
|
||||
image board, including the original image and a
|
||||
thumbnail version, resized to no greater than 500
|
||||
pixels wide and 600 pixels tall.
|
||||
|
||||
The tags/ directory contains one empty file named
|
||||
for each tag associated with the post.
|
||||
|
||||
The site root contains a file named tags that is compr-
|
||||
ised of an index of the tags associated with each post.
|
||||
This index is consulted when searching for a given tag in
|
||||
the web browser.
|
||||
|
||||
UTILS
|
||||
bin/gf
|
||||
Parse Livejournal and Tumblr RSS feeds into
|
||||
BARF posts. (Abandoned, may no longer work.)
|
||||
bin/gk
|
||||
Create a list of known tags in the site root in
|
||||
a file named known_tags.
|
||||
bin/gr
|
||||
Parse Google Reader bundles into BARF posts.
|
||||
bin/gt
|
||||
Create an index of tags in the site root in a file
|
||||
named tags.
|
||||
|
||||
For more information on these tools, read the source.
|
||||
|
||||
ADMIN
|
||||
Any tool that can create, alter, or delete flat files
|
||||
and directories is sufficient to administer a BARF.
|
||||
|
||||
Web-based login and administration utilizes werc's
|
||||
built-in user authentication:
|
||||
|
||||
http://domain.com/login
|
||||
|
||||
After login, links to edit and delete will appear in
|
||||
each post's meta data.
|
||||
|
||||
Web-based administration requires that the src/
|
||||
directory and its sub-directories are writable by
|
||||
the web server process.
|
||||
|
||||
REQUIREMENTS
|
||||
Unix
|
||||
Plan9port or 9base are required. Site type
|
||||
image requires ImageMagick and curl. Site
|
||||
type url also requires curl if the user employs
|
||||
the option to download remote URLs. These
|
||||
utilities may be swapped out for others by
|
||||
altering the source.
|
||||
|
||||
SOURCE
|
||||
http://plan9.stanleylieber.com/werc/apps/barf.tgz
|
||||
https://code.9front.org/hg/barf
|
||||
|
||||
EXAMPLES
|
||||
blog
|
||||
http://read.stanleylieber.com
|
||||
RSS feeds are converted by the utility rrss[0]
|
||||
and stored as individual blog posts.
|
||||
image
|
||||
http://img.stanleylieber.com
|
||||
Hybrid public/private image board. Requires
|
||||
standard werc authentication to post, but all
|
||||
posts are visible to the public.
|
||||
paste
|
||||
http://okturing.com
|
||||
Public pastebin. No authentication required
|
||||
to post.
|
||||
url
|
||||
http://url.stanleylieber.com
|
||||
Private index of URL bookmarks, similar
|
||||
in functionality to the old delicious.com.
|
||||
(In fact, most of the index was imported
|
||||
from delicious.)
|
||||
|
||||
SEE ALSO
|
||||
[0] https://code.9front.org/hg/rrss
|
||||
|
||||
LICENSE
|
||||
Public domain.
|
||||
|
||||
BUGS
|
||||
On Plan 9, if the web server process is run as user
|
||||
none (typically the case), directories used for entering
|
||||
posts or uploading/downloading files from the browser
|
||||
must be set world writable. This could prove problematic
|
||||
on multiuser systems.
|
80
werc/apps/barf/app.rc
Executable file
80
werc/apps/barf/app.rc
Executable file
|
@ -0,0 +1,80 @@
|
|||
fn conf_enable_barf{
|
||||
barf_base_uri=$conf_wd
|
||||
barf_root=`{pwd}
|
||||
conf_enable_app barf
|
||||
}
|
||||
|
||||
fn barf_init{
|
||||
p=`{echo $req_path | sed 's!^'^$barf_base_uri^'!!'}
|
||||
barf_dir=`{basename -d $"p | sed 's!^\.$!!'}
|
||||
barf_items=`{cat $barf_root/_werc/barf/items}
|
||||
. ./apps/barf/lib/core
|
||||
. ./apps/barf/barf/config
|
||||
. $barf_root/_werc/barf/config
|
||||
. ./apps/barf/lib/$barf_type
|
||||
if(test -f $barf_root/_werc/barf/lib/$barf_type)
|
||||
. $barf_root/_werc/barf/lib/$barf_type
|
||||
if(~ $require_login 1 && ! ~ $req_path $barf_base_uri^login){
|
||||
check_user
|
||||
if(~ $#logged_user 0)
|
||||
post_redirect /login
|
||||
}
|
||||
if(~ $REQUEST_METHOD GET && ~ $REQUEST_URI *'='*){
|
||||
load_get_args
|
||||
parse_get_args
|
||||
}
|
||||
if(~ $REQUEST_METHOD POST)
|
||||
parse_post_args
|
||||
if(~ $a_func add_post){
|
||||
if(~ $allow_anon 1 || {check_user && ! ~ $#logged_user 0})
|
||||
add_post
|
||||
post_redirect /
|
||||
}
|
||||
if(~ $a_func edit_post delete_post dsrc){
|
||||
if(check_user && ! ~ $#logged_user 0){
|
||||
switch($a_func){
|
||||
case edit_post
|
||||
edit_post
|
||||
case delete_post
|
||||
delete_post
|
||||
case dsrc
|
||||
dsrc
|
||||
}
|
||||
}
|
||||
}
|
||||
get_start
|
||||
get_stop
|
||||
get_tags
|
||||
if(~ $req_path $barf_base_uri){
|
||||
extraHeaders=$"extraHeaders ^ \
|
||||
'<link rel="alternate" type="application/rss+xml" title="RSS" href="'$base_url^$barf_base_uri'index.rss" />'
|
||||
handler_body_main=(tpl_handler `{barf_template barf})
|
||||
}
|
||||
if not if(~ $req_path $barf_base_uri^index.rss){
|
||||
obarf_type=$barf_type # disgusting hack. fix!
|
||||
barf_type=rss
|
||||
. ./apps/barf/lib/rss
|
||||
barf_setup_feed_handlers barf.tpl 'text/xml; charset=utf-8'
|
||||
}
|
||||
if not if(~ $req_path $barf_base_uri^login){
|
||||
barf_type=login
|
||||
handler_body_main=(tpl_handler `{barf_template barf})
|
||||
}
|
||||
}
|
||||
|
||||
fn barf_setup_feed_handlers{
|
||||
handler_body_main=NOT_USED_by_barf_feeds
|
||||
res_tail=()
|
||||
http_content_type=$2
|
||||
headers=()
|
||||
master_template=apps/barf/lib/$1
|
||||
}
|
||||
|
||||
fn barf_template{
|
||||
if(test -f $barf_root/$"barf_dir/_werc/barf/lib/$1.tpl)
|
||||
echo -n $barf_root/$"barf_dir/_werc/barf/lib/$1.tpl
|
||||
if not if(test -f $barf_root/_werc/barf/lib/$1.tpl)
|
||||
echo -n $barf_root/_werc/barf/lib/$1.tpl
|
||||
if not
|
||||
get_lib_file barf/$1.tpl apps/barf/lib/$1.tpl
|
||||
}
|
9
werc/apps/barf/barf/config
Executable file
9
werc/apps/barf/barf/config
Executable file
|
@ -0,0 +1,9 @@
|
|||
barf_type=blog # blog, image, log, paste, url
|
||||
site_tmp=_tmp # used by hoc on plan 9
|
||||
posts_per_page=10
|
||||
show_ascending=0
|
||||
show_footer=0
|
||||
show_header=0
|
||||
show_sidebar=0
|
||||
require_login=0 # if not logged in, redirect to /login
|
||||
allow_anon=1 # allow posts without logging in
|
1
werc/apps/barf/barf/footer
Executable file
1
werc/apps/barf/barf/footer
Executable file
|
@ -0,0 +1 @@
|
|||
THIS IS THE FOOTER.
|
1
werc/apps/barf/barf/header
Executable file
1
werc/apps/barf/barf/header
Executable file
|
@ -0,0 +1 @@
|
|||
THIS IS THE HEADER.
|
1
werc/apps/barf/barf/sidebar
Executable file
1
werc/apps/barf/barf/sidebar
Executable file
|
@ -0,0 +1 @@
|
|||
THIS IS THE SIDEBAR.
|
174
werc/apps/barf/bin/bsrc
Executable file
174
werc/apps/barf/bin/bsrc
Executable file
|
@ -0,0 +1,174 @@
|
|||
#!/bin/rc
|
||||
# Build static pages for $site.
|
||||
rfork e
|
||||
fn usage{
|
||||
echo usage: $0 [ domain.com ] >[1=2]
|
||||
exit usage
|
||||
}
|
||||
if(~ $#1 0)
|
||||
usage
|
||||
|
||||
fn conf_enable_barf{ }
|
||||
|
||||
werc=/var/www/werc
|
||||
site=$werc/sites/$1
|
||||
barf_root=$site
|
||||
|
||||
. $site/_werc/config
|
||||
. $site/_werc/barf/config
|
||||
. $werc/apps/barf/lib/core
|
||||
. $werc/apps/barf/lib/$barf_type
|
||||
if(test -f $site/_werc/barf/lib/$barf_type)
|
||||
. $site/_werc/barf/lib/$barf_type
|
||||
if(~ $show_ascending 1)
|
||||
sort=(sort -nu)
|
||||
if not
|
||||
sort=(sort -nru)
|
||||
|
||||
fn check_user{ }
|
||||
|
||||
fn display_html_footers{
|
||||
echo '</body>
|
||||
</html>'
|
||||
}
|
||||
|
||||
fn display_html_headers{
|
||||
echo '<html>
|
||||
<head>
|
||||
|
||||
<title>'$"siteTitle'</title>
|
||||
|
||||
<link rel="stylesheet" href="/_werc/pub/style.css" type="text/css" media="screen" title="default">
|
||||
<link rel="shortcut icon" href="/favicon.ico" type="image/vnd.microsoft.icon">
|
||||
<link rel="alternate" type="application/rss+xml" title="RSS" href="'$"rss'">
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
'
|
||||
}
|
||||
|
||||
fn display_prevnext{
|
||||
if(~ $#nstart 1){
|
||||
echo '
|
||||
<div id="page_list">
|
||||
<span>
|
||||
'
|
||||
if(test $start -lt $pstop && ! ~ $start $pstart)
|
||||
echo '<a href="'$pstart^'-'^$pstop^'.html">prev</a> | '
|
||||
echo '</span>
|
||||
<span>
|
||||
'
|
||||
if(test $nstart -gt $bposts($#bposts))
|
||||
echo '<a href="'$nstart^'-'^$nstop^'.html">next</a>'
|
||||
echo '
|
||||
</span>
|
||||
</div>
|
||||
'
|
||||
}
|
||||
}
|
||||
|
||||
fn get_post_list{
|
||||
if(~ $#posts 0){
|
||||
if(~ $id [0-9]*)
|
||||
posts=$id
|
||||
if not{
|
||||
posts=`{
|
||||
if(~ $tags all)
|
||||
ls -p $site/src |
|
||||
grep -e '^[0-9]*$' |
|
||||
eval $sort |
|
||||
sed -n $start^,^$stop^p
|
||||
if not
|
||||
grep -e '^.*\/'$tags'$' $site/tags |
|
||||
awk -F '/' '{print $1;}' |
|
||||
eval $sort |
|
||||
sed -n $start^,^$stop^p
|
||||
}
|
||||
if(! ~ $posts [0-9]*)
|
||||
posts=()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn print{
|
||||
display_html_headers
|
||||
if(~ $show_header 1)
|
||||
display_header
|
||||
display_^$barf_type
|
||||
if(~ $show_sidebar 1)
|
||||
display_sidebar
|
||||
if(~ $show_footer 1)
|
||||
display_footer
|
||||
display_html_footers
|
||||
}
|
||||
|
||||
fn print_id{
|
||||
echo '<span id="post_id"><a href="'$"a_id'.html">No.'$"a_id'</a></span>'
|
||||
}
|
||||
|
||||
fn print_tags{
|
||||
a_tags=`{ls -p $a_dir/tags}
|
||||
a_tags=`{for(t in $a_tags) echo '<a href="/tag/'$t'">'$t'</a>, '}
|
||||
a_tags=`{echo $a_tags | awk '{print substr($0, 1, length($0) -1)}'}
|
||||
echo '<span id="post_tags">'$"a_tags'</span>'
|
||||
}
|
||||
|
||||
fn print_title{
|
||||
a_title=`{cat $a_dir/title}
|
||||
if(! ~ $#a_title 0){
|
||||
if(~ $barf_type log url)
|
||||
echo '<a href="'`{cat $a_dir/link}'">'$"a_title'</a>'
|
||||
if not
|
||||
echo '<a href="'$"a_id'.html">'$"a_title'</a>'
|
||||
}
|
||||
}
|
||||
|
||||
cd $site
|
||||
|
||||
# individual posts
|
||||
bposts=`{ls -p $site/src | grep -v private | grep -e '^[0-9]*$' | eval $sort}
|
||||
for(b in $bposts){
|
||||
id=$b posts=() print >$b.html
|
||||
echo $"b^'.html' >[1=2]
|
||||
}
|
||||
|
||||
# paginated posts
|
||||
start=$bposts(1)
|
||||
stop=`{echo $bposts(1)^-^$posts_per_page | bc}
|
||||
pstart=$start
|
||||
pstop=$stop
|
||||
while(test $start -ge $bposts($#bposts)){
|
||||
if(test $stop -lt $bposts($#bposts))
|
||||
stop=$bposts($#bposts)
|
||||
nstart=`{echo $stop^-^1 | bc}
|
||||
nstop=`{echo $stop^-^$posts_per_page^-1 | bc}
|
||||
pposts=`{
|
||||
for(i in `{seq $stop $start | eval $sort})
|
||||
if(test -d $site/src/$i)
|
||||
echo $i
|
||||
}
|
||||
tags=all posts=$pposts print >$start^-^$stop.html
|
||||
echo $"start^'-'^$"stop^'.html' >[1=2]
|
||||
pstart=$start
|
||||
pstop=$stop
|
||||
start=`{echo $stop^-1 | bc}
|
||||
stop=`{echo $start^-^$posts_per_page | bc}
|
||||
}
|
||||
cp `{ls [0-9]*-[0-9]*.html | sort -n | tail -1} index.html
|
||||
if(test -x /boot/factotum)
|
||||
chmod +t [0-9]*.html [0-9]*-[0-9]*.html index.html
|
||||
|
||||
# tags
|
||||
for(b in `{awk -F '/' '{print $3;}' tags | sort -u}){
|
||||
btags=$b
|
||||
mkdir -p tag/$btags
|
||||
bposts=`{grep -e '^.*\/'$btags'$' tags | awk -F '/' '{print $1;}' | eval $sort}
|
||||
start=$bposts(1)
|
||||
stop=$bposts($#bposts)
|
||||
tags=all posts=$bposts print >tag/$btags/index.html
|
||||
echo tag/$btags/index.html >[1=2]
|
||||
if(test -x /boot/factotum)
|
||||
chmod +t tag tag/$btags tag/$btags/index.html
|
||||
}
|
31
werc/apps/barf/bin/dsrc
Executable file
31
werc/apps/barf/bin/dsrc
Executable file
|
@ -0,0 +1,31 @@
|
|||
#!/bin/rc
|
||||
# 2016-05-01T18:47:42-0400
|
||||
# Delete posts $low through $high.
|
||||
rfork e
|
||||
dhost=ur.inri.net
|
||||
fn usage {
|
||||
echo usage: dsrc [ -r n ] [ -t n ] >[1=2]
|
||||
exit usage
|
||||
}
|
||||
switch($1){
|
||||
case -r
|
||||
site=/usr/sl/www/werc/sites/read.stanleylieber.com
|
||||
case -t
|
||||
site=/usr/sl/www/werc/sites/tumblr.stanleylieber.com
|
||||
case *
|
||||
usage
|
||||
}
|
||||
if(! ~ $sysname ur){
|
||||
rcpu -h $dhost -c dsrc $*
|
||||
exit
|
||||
}
|
||||
low=`{ls -p $site/src | sort -n | sed 1q}
|
||||
high=$2
|
||||
cd $site/src && rm -rf `{seq $low $high}
|
||||
{
|
||||
for(i in `{seq $low $high})
|
||||
echo ',x/^'$i'\/.*\n/d'
|
||||
echo w
|
||||
echo w
|
||||
echo q
|
||||
} | sam -d $site/tags >[2]/dev/null
|
426
werc/apps/barf/bin/gf
Executable file
426
werc/apps/barf/bin/gf
Executable file
|
@ -0,0 +1,426 @@
|
|||
#!/bin/rc
|
||||
# Parse RSS feeds from livejournal or tumblr into BARF blog posts
|
||||
# for the specified site. If a post with a matching <link> already
|
||||
# exists, no new post will be created for that <item>. Accordingly,
|
||||
# the gf script may run slowly for sites with a large number of
|
||||
# existing posts. Tags will be created from each <category>.
|
||||
rfork en
|
||||
switch($1){
|
||||
case 1oct1993_lj
|
||||
feed=http://feeds.feedburner.com/Sl/1oct1993
|
||||
site=1oct1993.com
|
||||
tags=(rss)
|
||||
case architecture
|
||||
feed='http://pipes.yahoo.com/pipes/pipe.run?_id=6e361b590b57934fb1e7c4e29339d619&_render=rss'
|
||||
site=read.stanleylieber.com
|
||||
tags=(architecture)
|
||||
case comics
|
||||
feed='http://pipes.yahoo.com/pipes/pipe.run?_id=6bc617a6b20aafd526affafc9a28a5d5&_render=rss'
|
||||
site=read.stanleylieber.com
|
||||
tags=(comics)
|
||||
case fg_lj
|
||||
feed=http://feeds.feedburner.com/Sl/flamesgif
|
||||
site=flamesgif.com
|
||||
tags=(rss livejournal)
|
||||
case inri_lj
|
||||
feed=http://feeds.feedburner.com/Sl/itrecords
|
||||
site=inri.net
|
||||
tags=(rss livejournal)
|
||||
case mf_lj
|
||||
feed=http://feeds.feedburner.com/Sl/massivefictions
|
||||
site=massivefictions.com
|
||||
tags=(rss livejournal)
|
||||
case other_lj
|
||||
feed=http://feeds.feedburner.com/SL/other
|
||||
site=other.stanleylieber.com
|
||||
tags=()
|
||||
case read
|
||||
#feed=http://feeds.feedburner.com/SL/g/friends
|
||||
#feed='http://pipes.yahoo.com/pipes/pipe.run?_id=f5d60acfd41497310d74900270192600&_render=rss'
|
||||
feed='http://pipes.yahoo.com/pipes/pipe.run?_id=d1f7146306b019d96d768facf95eebd9&_render=rss'
|
||||
site=test.stanleylieber.com
|
||||
tags=()
|
||||
case sl_lj
|
||||
feed=http://feeds.feedburner.com/ImNotReallyStanleyLieber
|
||||
site=stanleylieber.com
|
||||
tags=(rss livejournal)
|
||||
case sl_tumblr
|
||||
feed=http://stanleylieber.tumblr.com/rss
|
||||
site=stanleylieber.com
|
||||
tags=(rss tumblr)
|
||||
case ta_lj
|
||||
feed=http://feeds.feedburner.com/Sl/text_adventure
|
||||
site=textadventure.stanleylieber.com
|
||||
tags=(rss livejournal)
|
||||
case tech
|
||||
feed='http://pipes.yahoo.com/pipes/pipe.run?_id=6dd49be6e34a6871db9bcfc74d4b36b1&_render=rss'
|
||||
site=read.stanleylieber.com
|
||||
tags=(tech)
|
||||
case *
|
||||
echo 'Usage: gf [ ... ]' >[1=2]
|
||||
exit usage
|
||||
}
|
||||
|
||||
file=/tmp/gf.$1
|
||||
werc=/usr/sl/www/werc
|
||||
|
||||
if(test -f /boot/factotum)
|
||||
cmd=hget
|
||||
if not
|
||||
cmd='curl -s'
|
||||
|
||||
fn get_feed{
|
||||
$"cmd $feed >$file.work
|
||||
{
|
||||
echo '
|
||||
,s/
//g
|
||||
,s/\"/\"/g
|
||||
,s/\"/\"/g
|
||||
,s/\&/\&/g
|
||||
,s/\&/\&/g
|
||||
,s/\'/''/g
|
||||
,s/\,/,/g
|
||||
,s/\-/-/g
|
||||
,s/\./\./g
|
||||
,s/\//\//g
|
||||
,s/\:/:/g
|
||||
,s/\;/;/g
|
||||
,s/\</</g
|
||||
,s/\</</g
|
||||
,s/\=/=/g
|
||||
,s/\>/>/g
|
||||
,s/\>/>/g
|
||||
,s/\_/_/g
|
||||
,s/\|/\|/g
|
||||
,s/\n//g
|
||||
,s/<\/item>/\n<\/item>\n/g
|
||||
,s/^<item>/<item>\n/g
|
||||
,s/^[ ]*<guid/<guid/g
|
||||
,s/^<[\/i].*$//g
|
||||
,s/^[ ]*\n[ ]*$//g
|
||||
x/<description>.*<\/description>/ s/\n//g
|
||||
w
|
||||
q
|
||||
'
|
||||
echo
|
||||
} | sam -d $file.work >[2]/dev/null >[1=2]
|
||||
awk '/(^<item>|<guid|<link>|<pubDate>|<title>|<description>|<comments>|<category>|<\/item>)/ {print $0;}' $file.work >$file
|
||||
}
|
||||
|
||||
fn get_tags{
|
||||
switch($a_link){
|
||||
case *1oct1993*
|
||||
tags=($tags 1oct1993)
|
||||
case *9front*
|
||||
tags=($tags software plan9 9front)
|
||||
case *amyearles* *pushedunder* *seaglass* *woolandwater*
|
||||
tags=($tags amy_earles)
|
||||
case *animenewsnetwork*
|
||||
tags=($tags telescreen anime)
|
||||
case *spikejapan*
|
||||
tags=($tags japan comics manga telescreen anime)
|
||||
case *ArchDaily* *archdaily*
|
||||
tags=($tags archdaily architecture)
|
||||
case *bldgblog*
|
||||
tags=($tags bldgblog architecture)
|
||||
case *kazuyosejima*
|
||||
tags=($tags japan architecture)
|
||||
case *Minimalissimo*
|
||||
tags=($tags minimalissimo design architecture)
|
||||
case *ArtFagCity* *artfagcity*
|
||||
tags=($tags artfagcity art)
|
||||
case *rhizome-fp*
|
||||
tags=($tags rhizome-fp art)
|
||||
case *rhizome*
|
||||
tags=($tags rhizome art)
|
||||
case *starwarsmodern*
|
||||
tags=($tags starwarsmodern art)
|
||||
case *tokyoartbeat*
|
||||
tags=($tags tokyoartbeat japan art)
|
||||
case *trendbeheer*
|
||||
tags=($tags trendbeheer art)
|
||||
case *ValentinaTanni*
|
||||
tags=($tags valentinatanni art)
|
||||
case *vvork*
|
||||
tags=($tags vwork art)
|
||||
case *auriea* *tale-of-tales* *taleoftales*
|
||||
tags=($tags auriea)
|
||||
case *basscomm* *closeoutwarrior* *crummysocks* *gamerrelocationproject* *protipoftheday* *PushButtonB* *pushbuttonb*
|
||||
tags=($tags video_games basscomm)
|
||||
case *benjaminmarra*
|
||||
tags=($tags comics benjamin_marra)
|
||||
case *boingboing*
|
||||
tags=($tags boingboing)
|
||||
case *bushinbooks* *henka*
|
||||
tags=($tags budo)
|
||||
case *alexaanddave* *CEREBUS* *Cerebus* *cerebus* *davesim* *gerhard*
|
||||
tags=($tags comics cerebus gerhard)
|
||||
case *coilhouse*
|
||||
tags=($tags coilhouse)
|
||||
case *arche-arc*
|
||||
tags=($tags arche comics)
|
||||
case *blaiselarmee*
|
||||
tags=($tags blaise_larmee comics)
|
||||
case *bleedingcool*
|
||||
tags=($tags bleedingcool comics)
|
||||
case *bobgreenberger*
|
||||
tags=($tags bob_greengerger comics)
|
||||
case *coldheatcomics*
|
||||
tags=($tags coldheat comics)
|
||||
case *comicbookresources*
|
||||
tags=($tags cbr comics)
|
||||
case *comicsbeat*
|
||||
tags=($tags comicsbeat comics)
|
||||
case *ComicsComics* *comicscomics*
|
||||
tags=($tags comicscomics comics)
|
||||
case *coveredblog*
|
||||
tags=($tags coveredblog comics)
|
||||
case *dcfifty-too*
|
||||
tags=($tags dcfifty-too comics)
|
||||
case *Destructoid* *destructoid*
|
||||
tags=($tags destructoid video_games)
|
||||
case *economist.com*
|
||||
tags=($tags economist)
|
||||
case *ferrandelgado*
|
||||
tags=($tags ferran_delgado comics)
|
||||
case *eddiecampbell*
|
||||
tags=($tags eddie_campbell comics)
|
||||
case *factualopinion*
|
||||
tags=($tags factualopinion comics)
|
||||
case *floating_world* *floatingworld*
|
||||
tags=($tags floating_world comics)
|
||||
case *frankmiller*
|
||||
tags=($tags frank_miller comics)
|
||||
case *humancolor*
|
||||
tags=($tags humancolor comics)
|
||||
case *jerkcity*
|
||||
tags=($tags jerkcity comics)
|
||||
case *newconstructionblog*
|
||||
tags=($tags newconstruction manga comics)
|
||||
case *ohdannyboy*
|
||||
tags=($tags ohdannyboy comics)
|
||||
case *pulphope*
|
||||
tags=($tags pulphope comics)
|
||||
case *pwbeat*
|
||||
tags=($tags pwbeat comics)
|
||||
case *reliablecomics*
|
||||
tags=($tags reliablecomics comics)
|
||||
case *reneefrench*
|
||||
tags=($tags renee_french comics)
|
||||
case *rickveitch*
|
||||
tags=($tags rick_veitch comics)
|
||||
case *smbc-comics*
|
||||
tags=($tags smbc comics)
|
||||
case *studygroup*
|
||||
tags=($tags studygroup comics)
|
||||
case *xkcd*
|
||||
tags=($tags xkcd comics)
|
||||
case *bowiesongs* *DavidBowie* *davidbowie*
|
||||
tags=($tags music david_bowie)
|
||||
case *designboom*
|
||||
tags=($tags designboom design)
|
||||
case *dezeen*
|
||||
tags=($tags dezeen design)
|
||||
case *infosthetics*
|
||||
tags=($tags infosthetics design)
|
||||
case *inhabitat*
|
||||
tags=($tags inhabitat architecture design)
|
||||
case *luigicolani*
|
||||
tags=($tags luigicolani design)
|
||||
case *mocoloco*
|
||||
tags=($tags mocoloco design)
|
||||
case *sydmead*
|
||||
tags=($tags sydmead design)
|
||||
case *dzima*
|
||||
tags=($tags dzima)
|
||||
case *bbcicecream*
|
||||
tags=($tags bbcicecream fashion)
|
||||
case *DamStyle *damstyle*
|
||||
tags=($tags damstyle fashion)
|
||||
case *facehunter*
|
||||
tags=($tags facehunter fashion)
|
||||
case *StilInBerlin*
|
||||
tags=($tags germany fashion)
|
||||
case *jstreets*
|
||||
tags=($tags jstreets japan fashion)
|
||||
case *stylefromtokyo*
|
||||
tags=($tags stylefromtokyo japan fashion)
|
||||
case *tokyofashion*
|
||||
tags=($tags tokyofashion japan fashion)
|
||||
case *flames.gif* *flamesgif*
|
||||
tags=($tags flames.gif)
|
||||
case *contemporary-home-computing*
|
||||
tags=($tags software flames.gif)
|
||||
case *kurzweil*
|
||||
tags=($tags kurzweil future)
|
||||
case *longnow*
|
||||
tags=($tags longnow future)
|
||||
case *OpenTheFuture*
|
||||
tags=($tags openthefuture future)
|
||||
case *golang* *blog.nella.org*
|
||||
tags=($tags golang)
|
||||
case *googlepluses*
|
||||
tags=($tags google)
|
||||
case *news.ycombinator.com*
|
||||
tags=($tags hackernews hack)
|
||||
case *seanbonner*
|
||||
tags=($tags sean_bonner hack)
|
||||
case *banriman*
|
||||
tags=($tags banriman japan)
|
||||
case *japansubculture*
|
||||
tags=($tags japansubculture japan)
|
||||
case *jeansnow*
|
||||
tags=($tags jeansnow japan)
|
||||
case *Kotaku* *kotaku*
|
||||
tags=($tags kotaku video_games)
|
||||
case *eforemario*
|
||||
tags=($tags before_mario video_games)
|
||||
case *nakakobooks*
|
||||
tags=($tags books nakakobooks japan)
|
||||
case *ozawamaria*
|
||||
tags=($tags maria_ozawa japan)
|
||||
case *shisaku.blogspot.com*
|
||||
tags=($tags shisaku japan)
|
||||
case *jimshooter*
|
||||
tags=($tags comics jim_shooter)
|
||||
case *LettersOfNote* *lettersofnote*
|
||||
tags=($tags letters)
|
||||
case *nasa*letters.rss*
|
||||
tags=($tags nasa letters)
|
||||
case *hellodamage* *manganews* *naokiurasawa* *samehat*
|
||||
tags=($tags comics manga)
|
||||
case *mangatraders*
|
||||
tags=($tags p2p comics manga)
|
||||
case *hortonheardawho*
|
||||
tags=($tags hortonheardawho flickr nasa mars)
|
||||
case *me-vs-gutenberg* *mevsgutenberg*
|
||||
tags=($tags martin_sand)
|
||||
case *marxy*
|
||||
tags=($tags marxy)
|
||||
case *etamodern*
|
||||
tags=($tags metamodern)
|
||||
case *aviationintel*
|
||||
tags=($tags aviationintel mil)
|
||||
case *aviationweek*
|
||||
tags=($tags aviationweek mil)
|
||||
case *codeonemagazine*
|
||||
tags=($tags codeonemagazine mil)
|
||||
case *geimint*
|
||||
tags=($tags geimint mil)
|
||||
case *momus* *mrstsk*
|
||||
tags=($tags books music momus)
|
||||
case *bjork* *toog*
|
||||
tags=($tags music)
|
||||
case *nasa.gov*
|
||||
tags=($tags space nasa)
|
||||
case *mongoliad*
|
||||
tags=($tags neal_stephenson)
|
||||
case *gaiman*
|
||||
tags=($tags comics neil_gaiman)
|
||||
case *nin.com* *feeds.nin.com*
|
||||
tags=($tags music nin)
|
||||
case *nix-os* *syssoftware*
|
||||
tags=($tags plan9 nix)
|
||||
case *bsdly* *OPENBSD* *OpenBSD* *openbsd* *scientist-home* *undeadly*
|
||||
tags=($tags software openbsd)
|
||||
case *godownmatthew* *mysticmilk* *petetoms*
|
||||
tags=($tags pete_toms)
|
||||
case *Pitchfork* *pitchfork*
|
||||
tags=($tags music pitchfork)
|
||||
case *9gridchan* *cat-v* *maht0x0r* *Plan9* *plan9*
|
||||
tags=($tags software plan9)
|
||||
case *FlauntTalks* *prince.org* *purpleinterviews* *wendyandlisa*
|
||||
tags=($tags music prince)
|
||||
case *commandcenter* *rob_pike*
|
||||
tags=($tags golang plan9 rob_pike)
|
||||
case *prometheus*
|
||||
tags=($tags telescreen prometheus)
|
||||
case *reddit.com*
|
||||
tags=($tags reddit)
|
||||
case *swtch.com*
|
||||
tags=($tags golang plan9 rsc)
|
||||
case *bunniestudios*
|
||||
tags=($tags bunniestudios security)
|
||||
case *jwz*
|
||||
tags=($tags jwz security)
|
||||
case *Krebs* *krebs*
|
||||
tags=($tags krebs security)
|
||||
case *scarybeastsecurity*
|
||||
tags=($tags scarybeast security)
|
||||
case *schneier*
|
||||
tags=($tags bruce_schneier security)
|
||||
case *chinchillakwak* *skwak*
|
||||
tags=($tags skwak)
|
||||
case *slashdot*
|
||||
tags=($tags slashdot)
|
||||
case *stanleylieber*
|
||||
tags=($tags stanleylieber)
|
||||
case *fastcompany*
|
||||
tags=($tags fastcompany tech)
|
||||
case *danharmon*
|
||||
tags=($tags danharmon telescreen)
|
||||
case *mindlessones*
|
||||
tags=($tags mindlessones telescreen)
|
||||
case *tcj.com*
|
||||
tags=($tags comics tcj)
|
||||
case *TEDblog* *ted.com*
|
||||
tags=($tags ted)
|
||||
case *ticom*
|
||||
tags=($tags ticom security)
|
||||
case *orrentfreak*
|
||||
tags=($tags p2p torrentfreak)
|
||||
case *ultra*culture*
|
||||
tags=($tags ultraculture)
|
||||
case *kleinletters*
|
||||
tags=($tags comics todd_klein)
|
||||
case *plaidstallions*
|
||||
tags=($tags plaidstallions toys)
|
||||
case *shojikawamori*
|
||||
tags=($tags shojikawamori japan toys)
|
||||
}
|
||||
echo -n $tags
|
||||
}
|
||||
|
||||
fn parse_posts{
|
||||
ifs='
|
||||
' {
|
||||
posts=`{cat $file}
|
||||
for(i in `{seq 1 $#posts | sort -nr}){
|
||||
post=`{echo $posts($i) | sed 's/> </>\n</g' | grep -v -e '<comments>'}
|
||||
if(! ~ $post ''){
|
||||
a_title=`{echo $post | grep -e 'title>' | sed 's/^.*<title>//g; s/<\/title>.*$//g'}
|
||||
a_date=`{echo $post | grep -e '<pubDate>' | sed 's/^.*<pubDate>//g; s/<\/pubDate>.*$//g'}
|
||||
a_link=`{echo $post | grep -e '<link>' | sed 's/^.*<link>//g; s/<\/link>.*$//g; s/^.*http/http/g'}
|
||||
a_tags=`{echo $post | grep -e '<category>' | sed 's/^.*<\/comments>//g; s/^.*<description>//g; s/^.*<\/description>//g; s/^.*<\/pubDate>//g; s/<category>/ /g; s/<\/category>//g; s/<dc.*$//g; s/^ //g; s/ $//g'}
|
||||
a_tags=`{for(j in $a_tags){ echo $j | sed 's/^.*(<|>).*$//g'}}
|
||||
a_body=`{echo $post | grep -e '<description>' | sed 's/^.*<description>//g; s/<\/description>.*$//g'}
|
||||
a_id=`{echo `{ls -p $werc/sites/$site/src | sort -n | tail -1}^+1 | bc}
|
||||
if(~ $#a_id 0)
|
||||
a_id=1
|
||||
while(test -d $werc/sites/$site/src/$a_id)
|
||||
a_id=`{echo $a_id^+1 | bc}
|
||||
if(! ~ $"a_link '' && ! ~ $"a_link `{cat $werc/sites/$site/src/*/link}){
|
||||
mkdir -p $werc/sites/$site/src/$a_id/tags # big fat race
|
||||
echo $"a_title >$werc/sites/$site/src/$a_id/title
|
||||
echo $"a_date >$werc/sites/$site/src/$a_id/date
|
||||
echo $"a_link >$werc/sites/$site/src/$a_id/link
|
||||
echo $"a_body '</a></li></ul>' >$werc/sites/$site/src/$a_id/body
|
||||
ifs=' ' {
|
||||
for(j in `{get_tags}){
|
||||
>$werc/sites/$site/src/$a_id/tags/$j
|
||||
echo $a_id/tags/$j >>$werc/sites/$site/tags
|
||||
}
|
||||
}
|
||||
}
|
||||
if(test -f /boot/factotum && ~ $site *.stanleylieber.com)
|
||||
for(i in `{f $werc/sites/$site/src/$a_id})
|
||||
chmod +t $i
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(test -f /boot/factotum && test -f /rc/bin/hget)
|
||||
webfs
|
||||
get_feed
|
||||
parse_posts
|
20
werc/apps/barf/bin/gk
Executable file
20
werc/apps/barf/bin/gk
Executable file
|
@ -0,0 +1,20 @@
|
|||
#!/bin/rc
|
||||
# Create an index of known_tags in $werc/sites/$site/known_tags
|
||||
if(! ~ $#1 0)
|
||||
base=$1
|
||||
if not if(~ $#barf_root 1 && $#barf_base 1)
|
||||
base=$barf_root/$"barf_base
|
||||
if not
|
||||
base=`{pwd}
|
||||
|
||||
if(test -f $base/_known_tags)
|
||||
rm $base/_known_tags
|
||||
for(i in `{cat $base/etc/tags}){
|
||||
grep -e '^.*\/'$i'$' $base/tags |
|
||||
awk -F '/' '{print $3;}' |
|
||||
sort |
|
||||
uniq -c |
|
||||
awk '{print $2 " " $1;}' >>$base/_known_tags
|
||||
}
|
||||
if(test -f $base/_known_tags)
|
||||
cp $base/_known_tags $base/known_tags
|
415
werc/apps/barf/bin/gr
Executable file
415
werc/apps/barf/bin/gr
Executable file
|
@ -0,0 +1,415 @@
|
|||
#!/bin/rc
|
||||
# Parse RSS feeds from Google Reader bundles into BULGE blog posts.
|
||||
# If a post with a matching <link> already exists, no new post will
|
||||
# be created for that <item>. Accordingly, the gr script may run
|
||||
# slowly for sites with a large number of existing posts. Tags will
|
||||
# be created from each <category>.
|
||||
rfork en
|
||||
switch($1){
|
||||
case architecture
|
||||
feed='http://pipes.yahoo.com/pipes/pipe.run?_id=6e361b590b57934fb1e7c4e29339d619&_render=rss'
|
||||
site=read.stanleylieber.com
|
||||
tags=(architecture)
|
||||
case comics
|
||||
feed='http://pipes.yahoo.com/pipes/pipe.run?_id=6bc617a6b20aafd526affafc9a28a5d5&_render=rss'
|
||||
site=read.stanleylieber.com
|
||||
tags=(comics)
|
||||
case friends
|
||||
feed='https://www.google.com/reader/bundle/user%2F08193524211692385241%2Fbundle%2Ffriends'
|
||||
site=read.stanleylieber.com
|
||||
tags=(friends)
|
||||
case tech
|
||||
feed='http://pipes.yahoo.com/pipes/pipe.run?_id=6dd49be6e34a6871db9bcfc74d4b36b1&_render=rss'
|
||||
site=read.stanleylieber.com
|
||||
tags=(tech)
|
||||
case *
|
||||
echo usage: `{basename $0} '[ ... ]' >[1=2]
|
||||
exit usage
|
||||
}
|
||||
|
||||
file=/tmp/gr.$1
|
||||
werc=/usr/sl/www/werc
|
||||
|
||||
if(test -f /boot/factotum)
|
||||
cmd=hget
|
||||
if not
|
||||
cmd='curl -s'
|
||||
|
||||
fn f{ du -a $* | sed 's/^.* //g' }
|
||||
|
||||
fn get_feed{
|
||||
$"cmd $feed >$file.work
|
||||
{
|
||||
echo '
|
||||
,s/\"/\"/g
|
||||
,s/\"/\"/g
|
||||
,s/\&/\&/g
|
||||
,s/\&/\&/g
|
||||
,s/\'/\''/g
|
||||
,s/\,/,/g
|
||||
,s/\-/-/g
|
||||
,s/\./\./g
|
||||
,s/\//\//g
|
||||
,s/\:/:/g
|
||||
,s/\;/;/g
|
||||
,s/\</</g
|
||||
,s/\</</g
|
||||
,s/\=/=/g
|
||||
,s/\>/>/g
|
||||
,s/\>/>/g
|
||||
,s/\_/_/g
|
||||
,s/\|/\|/g
|
||||
,/<div id="items">/d
|
||||
/<div id="sidebar">/,d
|
||||
,s/<h2 class="item-title">/\n<h2 class="item-title">/g
|
||||
,s/<div class="item">.*$/HJDIVIDER/g
|
||||
,s/\n//g
|
||||
,s/HJDIVIDER/\n/g
|
||||
1d
|
||||
w
|
||||
q
|
||||
'
|
||||
echo
|
||||
} | sam -d $file.work >[2]/dev/null >[1=2]
|
||||
}
|
||||
|
||||
fn get_tags{
|
||||
switch($a_link){
|
||||
case *1oct1993*
|
||||
tags=($tags 1oct1993)
|
||||
case *9front*
|
||||
tags=($tags software plan9 9front)
|
||||
case *amyearles* *pushedunder* *seaglass* *woolandwater*
|
||||
tags=($tags amy_earles)
|
||||
case *animenewsnetwork*
|
||||
tags=($tags telescreen anime)
|
||||
case *spikejapan*
|
||||
tags=($tags japan comics manga telescreen anime)
|
||||
case *ArchDaily* *archdaily*
|
||||
tags=($tags archdaily architecture)
|
||||
case *bldgblog*
|
||||
tags=($tags bldgblog architecture)
|
||||
case *kazuyosejima*
|
||||
tags=($tags japan architecture)
|
||||
case *Minimalissimo*
|
||||
tags=($tags minimalissimo design architecture)
|
||||
case *ArtFCity* *ArtFagCity* *artfagcity*
|
||||
tags=($tags artfagcity art)
|
||||
case *rhizome-fp*
|
||||
tags=($tags rhizome-fp art)
|
||||
case *rhizome*
|
||||
tags=($tags rhizome art)
|
||||
case *starwarsmodern*
|
||||
tags=($tags starwarsmodern art)
|
||||
case *tokyoartbeat*
|
||||
tags=($tags tokyoartbeat japan art)
|
||||
case *trendbeheer*
|
||||
tags=($tags trendbeheer art)
|
||||
case *ValentinaTanni*
|
||||
tags=($tags valentinatanni art)
|
||||
case *vvork*
|
||||
tags=($tags vwork art)
|
||||
case *auriea* *tale-of-tales* *taleoftales*
|
||||
tags=($tags auriea)
|
||||
case *basscomm* *closeoutwarrior* *crummysocks* *gamerrelocationproject* *protipoftheday* *PushButtonB* *pushbuttonb*
|
||||
tags=($tags video_games basscomm)
|
||||
case *benjaminmarra*
|
||||
tags=($tags comics benjamin_marra)
|
||||
case *boingboing*
|
||||
tags=($tags boingboing)
|
||||
case *bushinbooks* *henka*
|
||||
tags=($tags budo)
|
||||
case *alexaanddave* *CEREBUS* *Cerebus* *cerebus* *davesim* *gerhard*
|
||||
tags=($tags comics cerebus gerhard)
|
||||
case *coilhouse*
|
||||
tags=($tags coilhouse)
|
||||
case *arche-arc*
|
||||
tags=($tags arche comics)
|
||||
case *blaiselarmee*
|
||||
tags=($tags blaise_larmee comics)
|
||||
case *bleedingcool*
|
||||
tags=($tags bleedingcool comics)
|
||||
case *bobgreenberger*
|
||||
tags=($tags bob_greengerger comics)
|
||||
case *coldheatcomics*
|
||||
tags=($tags coldheat comics)
|
||||
case *comicbookresources*
|
||||
tags=($tags cbr comics)
|
||||
case *comicsbeat*
|
||||
tags=($tags comicsbeat comics)
|
||||
case *ComicsComics* *comicscomics*
|
||||
tags=($tags comicscomics comics)
|
||||
case *coveredblog*
|
||||
tags=($tags coveredblog comics)
|
||||
case *dcfifty-too*
|
||||
tags=($tags dcfifty-too comics)
|
||||
case *Destructoid* *destructoid*
|
||||
tags=($tags destructoid video_games)
|
||||
case *economist.com*
|
||||
tags=($tags economist)
|
||||
case *ferrandelgado*
|
||||
tags=($tags ferran_delgado comics)
|
||||
case *eddiecampbell*
|
||||
tags=($tags eddie_campbell comics)
|
||||
case *factualopinion*
|
||||
tags=($tags factualopinion comics)
|
||||
case *floating_world* *floatingworld*
|
||||
tags=($tags floating_world comics)
|
||||
case *frankmiller*
|
||||
tags=($tags frank_miller comics)
|
||||
case *humancolor*
|
||||
tags=($tags humancolor comics)
|
||||
case *jerkcity*
|
||||
tags=($tags jerkcity comics)
|
||||
case *newconstructionblog*
|
||||
tags=($tags newconstruction manga comics)
|
||||
case *ohdannyboy*
|
||||
tags=($tags ohdannyboy comics)
|
||||
case *pulphope*
|
||||
tags=($tags pulphope comics)
|
||||
case *pwbeat*
|
||||
tags=($tags pwbeat comics)
|
||||
case *reliablecomics*
|
||||
tags=($tags reliablecomics comics)
|
||||
case *reneefrench*
|
||||
tags=($tags renee_french comics)
|
||||
case *rickveitch*
|
||||
tags=($tags rick_veitch comics)
|
||||
case *smbc-comics*
|
||||
tags=($tags smbc comics)
|
||||
case *studygroup*
|
||||
tags=($tags studygroup comics)
|
||||
case *xkcd*
|
||||
tags=($tags xkcd comics)
|
||||
case *bowiesongs* *DavidBowie* *davidbowie*
|
||||
tags=($tags music david_bowie)
|
||||
case *designboom*
|
||||
tags=($tags designboom design)
|
||||
case *dezeen*
|
||||
tags=($tags dezeen design)
|
||||
case *infosthetics*
|
||||
tags=($tags infosthetics design)
|
||||
case *inhabitat*
|
||||
tags=($tags inhabitat architecture design)
|
||||
case *luigicolani*
|
||||
tags=($tags luigicolani design)
|
||||
case *mocoloco*
|
||||
tags=($tags mocoloco design)
|
||||
case *sydmead*
|
||||
tags=($tags sydmead design)
|
||||
case *dzima*
|
||||
tags=($tags dzima)
|
||||
case *bbcicecream*
|
||||
tags=($tags bbcicecream fashion)
|
||||
case *DamStyle *damstyle*
|
||||
tags=($tags damstyle fashion)
|
||||
case *facehunter*
|
||||
tags=($tags facehunter fashion)
|
||||
case *StilInBerlin*
|
||||
tags=($tags germany fashion)
|
||||
case *jstreets*
|
||||
tags=($tags jstreets japan fashion)
|
||||
case *Stilinberlin*
|
||||
tags=($tags stilinberlin germany fashion)
|
||||
case *stylefromtokyo*
|
||||
tags=($tags stylefromtokyo japan fashion)
|
||||
case *tokyofashion*
|
||||
tags=($tags tokyofashion japan fashion)
|
||||
case *flames.gif* *flamesgif*
|
||||
tags=($tags flames.gif)
|
||||
case *contemporary-home-computing*
|
||||
tags=($tags software flames.gif)
|
||||
case *kurzweil*
|
||||
tags=($tags kurzweil future)
|
||||
case *longnow*
|
||||
tags=($tags longnow future)
|
||||
case *OpenTheFuture*
|
||||
tags=($tags openthefuture future)
|
||||
case *golang* *blog.nella.org*
|
||||
tags=($tags golang)
|
||||
case *googlepluses*
|
||||
tags=($tags google)
|
||||
case *news.ycombinator.com*
|
||||
tags=($tags hackernews hack)
|
||||
case *seanbonner*
|
||||
tags=($tags sean_bonner hack)
|
||||
case *banriman*
|
||||
tags=($tags banriman japan)
|
||||
case *japansubculture*
|
||||
tags=($tags japansubculture japan)
|
||||
case *jeansnow*
|
||||
tags=($tags jeansnow japan)
|
||||
case *Kotaku* *kotaku*
|
||||
tags=($tags kotaku video_games)
|
||||
case *eforemario*
|
||||
tags=($tags before_mario video_games)
|
||||
case *nakakobooks*
|
||||
tags=($tags books nakakobooks japan)
|
||||
case *ozawamaria*
|
||||
tags=($tags maria_ozawa japan)
|
||||
case *ibuya246*
|
||||
tags=($tags shibuya246 japan)
|
||||
case *shisaku.blogspot.com*
|
||||
tags=($tags shisaku japan)
|
||||
case *jimshooter*
|
||||
tags=($tags comics jim_shooter)
|
||||
case *LettersOfNote* *lettersofnote*
|
||||
tags=($tags letters)
|
||||
case *nasa*letters.rss*
|
||||
tags=($tags nasa letters)
|
||||
case *hellodamage* *manganews* *naokiurasawa* *samehat*
|
||||
tags=($tags comics manga)
|
||||
case *mangatraders*
|
||||
tags=($tags p2p comics manga)
|
||||
case *hortonheardawho*
|
||||
tags=($tags hortonheardawho flickr nasa mars)
|
||||
case *me-vs-gutenberg* *mevsgutenberg*
|
||||
tags=($tags martin_sand)
|
||||
case *marxy*
|
||||
tags=($tags marxy)
|
||||
case *etamodern*
|
||||
tags=($tags metamodern)
|
||||
case *aviationintel*
|
||||
tags=($tags aviationintel mil)
|
||||
case *aviationweek*
|
||||
tags=($tags aviationweek mil)
|
||||
case *codeonemagazine*
|
||||
tags=($tags codeonemagazine mil)
|
||||
case *geimint*
|
||||
tags=($tags geimint mil)
|
||||
case *bjork*
|
||||
tags=($tags bjork music)
|
||||
case *momus* *mrstsk*
|
||||
tags=($tags books momus music)
|
||||
case *toog*
|
||||
tags=($tags toog music)
|
||||
case *nasa.gov*
|
||||
tags=($tags space nasa)
|
||||
case *mongoliad*
|
||||
tags=($tags neal_stephenson)
|
||||
case *gaiman*
|
||||
tags=($tags comics neil_gaiman)
|
||||
case *nin.com* *feeds.nin.com*
|
||||
tags=($tags music nin)
|
||||
case *nix-os* *syssoftware*
|
||||
tags=($tags plan9 nix)
|
||||
case *bsdly* *OPENBSD* *OpenBSD* *openbsd* *scientist-home* *undeadly*
|
||||
tags=($tags software openbsd)
|
||||
case *godownmatthew* *mysticmilk* *petetoms*
|
||||
tags=($tags pete_toms)
|
||||
case *Pitchfork* *pitchfork*
|
||||
tags=($tags music pitchfork)
|
||||
case *9gridchan* *cat-v* *maht0x0r* *Plan9* *plan9*
|
||||
tags=($tags software plan9)
|
||||
case *FlauntTalks* *prince.org* *purpleinterviews* *wendyandlisa*
|
||||
tags=($tags music prince)
|
||||
case *commandcenter* *rob_pike*
|
||||
tags=($tags golang plan9 rob_pike)
|
||||
case *prometheus*
|
||||
tags=($tags telescreen prometheus)
|
||||
case *reddit.com*
|
||||
tags=($tags reddit)
|
||||
case *swtch.com*
|
||||
tags=($tags golang plan9 rsc)
|
||||
case *bunniestudios*
|
||||
tags=($tags bunniestudios security)
|
||||
case *jwz*
|
||||
tags=($tags jwz security)
|
||||
case *Krebs* *krebs*
|
||||
tags=($tags krebs security)
|
||||
case *scarybeastsecurity*
|
||||
tags=($tags scarybeast security)
|
||||
case *schneier*
|
||||
tags=($tags bruce_schneier security)
|
||||
case *chinchillakwak* *skwak*
|
||||
tags=($tags skwak)
|
||||
case *slashdot*
|
||||
tags=($tags slashdot)
|
||||
case *stanleylieber*
|
||||
tags=($tags stanleylieber)
|
||||
case *fastcompany*
|
||||
tags=($tags fastcompany tech)
|
||||
case *danharmon*
|
||||
tags=($tags danharmon telescreen)
|
||||
case *mindlessones*
|
||||
tags=($tags mindlessones telescreen)
|
||||
case *tcj.com*
|
||||
tags=($tags comics tcj)
|
||||
case *TEDblog* *ted.com*
|
||||
tags=($tags ted)
|
||||
case *ticom*
|
||||
tags=($tags ticom security)
|
||||
case *orrentfreak*
|
||||
tags=($tags p2p torrentfreak)
|
||||
case *ultra*culture*
|
||||
tags=($tags ultraculture)
|
||||
case *kleinletters*
|
||||
tags=($tags comics todd_klein)
|
||||
case *kennercollector*
|
||||
tags=($tags kennercollector toys)
|
||||
case *plaidstallions*
|
||||
tags=($tags plaidstallions toys)
|
||||
case *shojikawamori*
|
||||
tags=($tags shojikawamori japan toys)
|
||||
case *ruinedcartridge*
|
||||
tags=($tags basscomm video_games)
|
||||
}
|
||||
echo -n $tags
|
||||
}
|
||||
|
||||
fn parse_posts{
|
||||
ifs='
|
||||
' {
|
||||
for(post in `{sort -r $file.work}){
|
||||
if(! ~ $post ''){
|
||||
a_title=`{echo $post | sed 's/^.*<h2 class="item-title"><div class="">//g' | sed 's/<div class="item-info">.*$//g' | htmlfmt}
|
||||
if(~ $#a_title 0)
|
||||
a_title=`{echo $post | sed 's/^.*<div class="item-info">//g' | sed 's/<div class="item-annotations">.*$//g' | htmlfmt}
|
||||
if(~ $#a_title 0)
|
||||
a_title=fake
|
||||
a_link=`{echo $post | sed 's/^.*<h2 class="item-title"><div class="">//g' | sed 's/<div class="item-info">.*$//g' | htmlfmt -a | sed 's/^.*\[//g' | sed 's/\].*$//g' | sed 's/ .*$//g'}
|
||||
if(~ $#a_link 0 || ! ~ $"a_link http*)
|
||||
a_link=`{echo $post | sed 's/^.*<h2 class="item-title"><div class="">//g' | sed 's/<div class="item-info">.*$//g' | sed 's/^.*<a href="//g' | sed 's/\".*$//g' | sed 's/^.*http/http/g' | sed 's/ .*$//g'}
|
||||
if(~ $#a_link 0 || ! ~ $"a_link http*)
|
||||
a_link=`{echo $post | sed 's/^.*<div class="item-info">//g' | sed 's/<div class="item-annotations">.*$//g' | htmlfmt -a | sed 's/^.*\[//g' | sed 's/\].*$//g' | sed 's/ .*$//g'}
|
||||
if(~ $#a_link 0 || ! ~ $"a_link http*)
|
||||
a_link=`{echo $post | sed 's/^.*<div class="item-info">//g' | sed 's/<div class="item-annotations">.*$//g' | sed 's/^.*<a href="//g' | sed 's/" class="f">.*$//g' | sed 's/\".*$//g' | sed 's/^.*http/http/g' | sed 's/ .*$//g'}
|
||||
a_link=$a_link(1)
|
||||
if(~ $#a_link 0 || ~ $"a_link '' || ! ~ $"a_link http*)
|
||||
a_link=fake
|
||||
if(! ~ $#a_link 1)
|
||||
a_link=`{echo $a_link | awk '{print $1;}'}
|
||||
a_date=`{date -n}
|
||||
a_body=`{echo $post | sed 's/^.*<div class="item-body">//g' | sed 's/<div class="clear">.*$//g'}
|
||||
if(~ $#a_body 0)
|
||||
a_body=fake
|
||||
a_id=`{echo `{ls -p $werc/sites/$site/src | sort -n | tail -1}^+1 | bc}
|
||||
if(~ $#a_id 0)
|
||||
a_id=1
|
||||
while(test -d $werc/sites/$site/src/$a_id)
|
||||
a_id=`{echo $a_id^+1 | bc}
|
||||
if(! ~ $"a_link `{cat $werc/sites/$site/src/*/link}){
|
||||
mkdir -p $werc/sites/$site/src/$a_id/tags # big fat race
|
||||
echo $"a_title >$werc/sites/$site/src/$a_id/title
|
||||
echo $"a_date >$werc/sites/$site/src/$a_id/date
|
||||
echo $"a_link >$werc/sites/$site/src/$a_id/link
|
||||
echo $"a_body '</a></li></ul>' >$werc/sites/$site/src/$a_id/body
|
||||
ifs=' ' {
|
||||
for(j in `{get_tags}){
|
||||
>$werc/sites/$site/src/$a_id/tags/$j
|
||||
echo $a_id/tags/$j >>$werc/sites/$site/tags
|
||||
}
|
||||
}
|
||||
}
|
||||
if(test -f /boot/factotum)
|
||||
for(i in `{f $werc/sites/$site/src/$a_id})
|
||||
chmod +t $i
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(test -f /boot/factotum && test -f /rc/bin/hget)
|
||||
webfs
|
||||
get_feed
|
||||
parse_posts
|
23
werc/apps/barf/bin/gt
Executable file
23
werc/apps/barf/bin/gt
Executable file
|
@ -0,0 +1,23 @@
|
|||
#!/bin/rc
|
||||
# Create an index of tags in $werc/sites/$site/tags. BULGE
|
||||
# greps this index when running a search on a given tag.
|
||||
# This file is also maintained by the bin/g* commands, or
|
||||
# when adding posts through the web interface.
|
||||
if(! ~ $#1 0)
|
||||
base=$1
|
||||
if not if(~ $#barf_root 1 && $#barf_base 1)
|
||||
base=$barf_root/$"barf_base
|
||||
if not
|
||||
base=`{pwd}
|
||||
|
||||
if(test -f $base/_tags)
|
||||
rm $base/_tags
|
||||
builtin cd $base/src
|
||||
ls -p |
|
||||
sort -n |
|
||||
xargs du -a |
|
||||
sed 's/^.* //g' |
|
||||
grep -e '^[0-9]*\/tags' |
|
||||
grep -v -e '^.*\/tags$' >>$base/_tags
|
||||
if(test -s $base/_tags)
|
||||
cp $base/_tags $base/tags
|
455
werc/apps/barf/bin/gy
Executable file
455
werc/apps/barf/bin/gy
Executable file
|
@ -0,0 +1,455 @@
|
|||
#!/bin/rc
|
||||
# Parse XML RSS feeds from Yahoo Pipes into BARF blog posts
|
||||
# for the specified site. If a post with a matching _link_ already
|
||||
# exists, no new post will be created for that item. Accordingly,
|
||||
# the gy script may run slowly for sites with a large number of
|
||||
# existing posts. Tags will be created according to the rules
|
||||
# defined in the get_tags() function.
|
||||
#
|
||||
# Requires 20h's xmlpull and rssread.
|
||||
rfork en
|
||||
switch($1){
|
||||
case read
|
||||
feed='http://pipes.yahoo.com/pipes/pipe.run?_id=d1f7146306b019d96d768facf95eebd9&_render=rss'
|
||||
site=read.stanleylieber.com
|
||||
tags=()
|
||||
case *
|
||||
echo 'Usage: gy [ ... ]' >[1=2]
|
||||
exit usage
|
||||
}
|
||||
|
||||
file=/tmp/gy.$1
|
||||
werc=/usr/sl/www/werc
|
||||
|
||||
if(test -f /boot/factotum)
|
||||
cmd=hget
|
||||
if not
|
||||
cmd='curl -s'
|
||||
|
||||
fn cram{
|
||||
ssam '
|
||||
,s/^link:.*$/HJDIVIDER&HJDIVIDER/g
|
||||
,s/^title:.*$/HJDIVIDER&HJDIVIDER/g
|
||||
,s/\n//g
|
||||
,s/HJDIVIDERtitle:/\n&/g
|
||||
'
|
||||
}
|
||||
|
||||
fn scape{
|
||||
ssam '
|
||||
,s/
//g
|
||||
,s/\"/\"/g
|
||||
,s/\"/\"/g
|
||||
,s/\&/\&/g
|
||||
,s/\&/\&/g
|
||||
,s/\'/''/g
|
||||
,s/\,/,/g
|
||||
,s/\-/-/g
|
||||
,s/\./\./g
|
||||
,s/\//\//g
|
||||
,s/\:/:/g
|
||||
,s/\;/;/g
|
||||
,s/\</</g
|
||||
,s/\</</g
|
||||
,s/\=/=/g
|
||||
,s/\>/>/g
|
||||
,s/\>/>/g
|
||||
,s/\_/_/g
|
||||
,s/\|/\|/g
|
||||
'
|
||||
}
|
||||
|
||||
fn get_posts{
|
||||
$"cmd $feed | rssread | cram | scape >$file
|
||||
echo >>$file
|
||||
}
|
||||
|
||||
fn get_tags{
|
||||
switch($a_link){
|
||||
case *1oct1993*
|
||||
tags=($tags 1oct1993)
|
||||
case *9front*
|
||||
tags=($tags software plan9 9front)
|
||||
case *organicmentalcore*
|
||||
tags=($tags aleks)
|
||||
case *amyearles* *etsy.com* *pushedunder* *seaglass* *woolandwater*
|
||||
tags=($tags amy_earles)
|
||||
case *animenewsnetwork*
|
||||
tags=($tags telescreen anime)
|
||||
case *spikejapan*
|
||||
tags=($tags japan comics manga telescreen anime)
|
||||
case *augmented.org*
|
||||
tags=($tags augmented.org ar)
|
||||
case *ArchDaily* *archdaily*
|
||||
tags=($tags archdaily architecture)
|
||||
case *bldgblog*
|
||||
tags=($tags bldgblog architecture)
|
||||
case *kazuyosejima*
|
||||
tags=($tags japan architecture)
|
||||
case *Minimalissimo*
|
||||
tags=($tags minimalissimo design architecture)
|
||||
case *ArtFagCity* *ArtFCity* *artfagcity*
|
||||
tags=($tags artfagcity art)
|
||||
case *rhizome-fp*
|
||||
tags=($tags rhizome-fp art)
|
||||
case *rhizome*
|
||||
tags=($tags rhizome art)
|
||||
case *starwarsmodern*
|
||||
tags=($tags starwarsmodern art)
|
||||
case *tokyoartbeat*
|
||||
tags=($tags tokyoartbeat japan art)
|
||||
case *trendbeheer*
|
||||
tags=($tags trendbeheer art)
|
||||
case *ValentinaTanni*
|
||||
tags=($tags valentinatanni art)
|
||||
case *vvork*
|
||||
tags=($tags vwork art)
|
||||
case *auriea* *tale-of-tales* *taleoftales*
|
||||
tags=($tags auriea)
|
||||
case *basscomm* *closeoutwarrior* *crummysocks* *gamerrelocationproject* *protipoftheday* *PushButtonB* *pushbuttonb*
|
||||
tags=($tags video_games basscomm)
|
||||
case *benjaminmarra*
|
||||
tags=($tags comics benjamin_marra)
|
||||
case *boingboing*
|
||||
tags=($tags boingboing)
|
||||
case *bushinbooks* *henka*
|
||||
tags=($tags budo)
|
||||
case *alexaanddave* *CEREBUS* *Cerebus* *cerebus* *davesim* *gerhard*
|
||||
tags=($tags comics cerebus gerhard)
|
||||
case *coilhouse*
|
||||
tags=($tags coilhouse)
|
||||
case *arche-arc*
|
||||
tags=($tags arche comics)
|
||||
case *bitolithic.com*
|
||||
tags=($tags bitolithic comics)
|
||||
case *blaiselarmee*
|
||||
tags=($tags blaise_larmee comics)
|
||||
case *bleedingcool*
|
||||
tags=($tags bleedingcool comics)
|
||||
case *bobgreenberger*
|
||||
tags=($tags bob_greengerger comics)
|
||||
case *coldheatcomics*
|
||||
tags=($tags coldheat comics)
|
||||
case *comicbookresources*
|
||||
tags=($tags cbr comics)
|
||||
case *comicsbeat*
|
||||
tags=($tags comicsbeat comics)
|
||||
case *ComicsComics* *comicscomics*
|
||||
tags=($tags comicscomics comics)
|
||||
case *coveredblog*
|
||||
tags=($tags coveredblog comics)
|
||||
case *dcfifty-too*
|
||||
tags=($tags dcfifty-too comics)
|
||||
case *Destructoid* *destructoid*
|
||||
tags=($tags destructoid video_games)
|
||||
case *economist.com*
|
||||
tags=($tags economist)
|
||||
case *brucesterling.tumblr.com*
|
||||
tags=($tags bruce_sterling)
|
||||
case *thecreatorsproject*
|
||||
tags=($tags thecreatorsproject)
|
||||
case *ferrandelgado*
|
||||
tags=($tags ferran_delgado comics)
|
||||
case *eddiecampbell*
|
||||
tags=($tags eddie_campbell comics)
|
||||
case *factualopinion*
|
||||
tags=($tags factualopinion comics)
|
||||
case *floating_world* *floatingworld*
|
||||
tags=($tags floating_world comics)
|
||||
case *frankmiller*
|
||||
tags=($tags frank_miller comics)
|
||||
case *humancolor*
|
||||
tags=($tags humancolor comics)
|
||||
case *jerkcity*
|
||||
tags=($tags jerkcity comics)
|
||||
case *maakies.com*
|
||||
tags=($tags tony_millionaire maakies comics)
|
||||
case *newconstructionblog*
|
||||
tags=($tags newconstruction manga comics)
|
||||
case *ohdannyboy*
|
||||
tags=($tags ohdannyboy comics)
|
||||
case *pulphope*
|
||||
tags=($tags pulphope comics)
|
||||
case *pwbeat*
|
||||
tags=($tags pwbeat comics)
|
||||
case *reliablecomics*
|
||||
tags=($tags reliablecomics comics)
|
||||
case *reneefrench*
|
||||
tags=($tags renee_french comics)
|
||||
case *rickveitch*
|
||||
tags=($tags rick_veitch comics)
|
||||
case *royalboiler*
|
||||
tags=($tags royalboiler comics)
|
||||
case *smbc-comics*
|
||||
tags=($tags smbc comics)
|
||||
case *studygroup*
|
||||
tags=($tags studygroup comics)
|
||||
case *xkcd*
|
||||
tags=($tags xkcd comics)
|
||||
case *bowiesongs* *DavidBowie* *davidbowie*
|
||||
tags=($tags music david_bowie)
|
||||
case *designboom*
|
||||
tags=($tags designboom design)
|
||||
case *dezeen*
|
||||
tags=($tags dezeen design)
|
||||
case *infosthetics*
|
||||
tags=($tags infosthetics design)
|
||||
case *inhabitat*
|
||||
tags=($tags inhabitat architecture design)
|
||||
case *luigicolani*
|
||||
tags=($tags luigicolani design)
|
||||
case *mocoloco*
|
||||
tags=($tags mocoloco design)
|
||||
case *sydmead*
|
||||
tags=($tags sydmead design)
|
||||
case *dzima*
|
||||
tags=($tags dzima)
|
||||
case *bbcicecream*
|
||||
tags=($tags bbcicecream fashion)
|
||||
case *DamStyle *damstyle*
|
||||
tags=($tags damstyle fashion)
|
||||
case *facehunter*
|
||||
tags=($tags facehunter fashion)
|
||||
case *StilInBerlin* *Stilinberlin*
|
||||
tags=($tags germany fashion)
|
||||
case *jstreets*
|
||||
tags=($tags jstreets japan fashion)
|
||||
case *stylefromtokyo*
|
||||
tags=($tags stylefromtokyo japan fashion)
|
||||
case *tokyofashion*
|
||||
tags=($tags tokyofashion japan fashion)
|
||||
case *flames.gif* *flamesgif*
|
||||
tags=($tags flames.gif)
|
||||
case *contemporary-home-computing*
|
||||
tags=($tags software flames.gif)
|
||||
case *acceler8or.com*
|
||||
tags=($tags acceler8or future)
|
||||
case *afrocyberpunk.wordpress.com*
|
||||
tags=($tags afrocyberpunk future)
|
||||
case *hyperallergic.com*
|
||||
tags=($tags hyperallergic future)
|
||||
case *kurzweil*
|
||||
tags=($tags kurzweil future)
|
||||
case *longnow*
|
||||
tags=($tags longnow future)
|
||||
case *OpenTheFuture*
|
||||
tags=($tags openthefuture future)
|
||||
case *theverge.com*
|
||||
tags=($tags theverge future)
|
||||
case *golang* *blog.nella.org*
|
||||
tags=($tags golang)
|
||||
case *googlepluses*
|
||||
tags=($tags google)
|
||||
case *news.ycombinator.com*
|
||||
tags=($tags hackernews hack)
|
||||
case *seanbonner*
|
||||
tags=($tags sean_bonner hack)
|
||||
case *banriman*
|
||||
tags=($tags banriman japan)
|
||||
case *japansubculture*
|
||||
tags=($tags japansubculture japan)
|
||||
case *jeansnow*
|
||||
tags=($tags jeansnow japan)
|
||||
case *Kotaku* *kotaku*
|
||||
tags=($tags kotaku video_games)
|
||||
case *eforemario*
|
||||
tags=($tags before_mario video_games)
|
||||
case *instagram* *web.stagram.com*
|
||||
tags=($tags instagram)
|
||||
case *nakakobooks*
|
||||
tags=($tags books nakakobooks japan)
|
||||
case *ozawamaria*
|
||||
tags=($tags maria_ozawa japan)
|
||||
case *Shibuya246*
|
||||
tags=($tags shibuya246 japan)
|
||||
case *shisaku.blogspot.com*
|
||||
tags=($tags shisaku japan)
|
||||
case *jimshooter*
|
||||
tags=($tags comics jim_shooter)
|
||||
case *LettersOfNote* *lettersofnote*
|
||||
tags=($tags letters)
|
||||
case *nasa*letters.rss*
|
||||
tags=($tags nasa letters)
|
||||
case *kore.livejournal.com*
|
||||
tags=($tags kore livejournal)
|
||||
case *real-funny-lady.livejournal.com*
|
||||
tags=($tags rea_funny_lady livejournal)
|
||||
case *vintage-ads.livejournal.com*
|
||||
tags=($tags vintage_ads livejournal)
|
||||
case *hellodamage*
|
||||
tags=($tags comics hellodamage manga)
|
||||
case *manganews*
|
||||
tags=($tags comics manganews manga)
|
||||
case *naokiurasawa*
|
||||
tags=($tags comics naokiurasawa manga)
|
||||
case *samehat*
|
||||
tags=($tags comics samehat manga)
|
||||
case *mangatraders*
|
||||
tags=($tags p2p comics manga)
|
||||
case *hortonheardawho*
|
||||
tags=($tags hortonheardawho flickr nasa mars)
|
||||
case *marstoday.com*
|
||||
tags=($tags marstoday mars)
|
||||
case *kielbryant*
|
||||
tags=($tags kiel_bryant flickr)
|
||||
case *flickr*paoru*
|
||||
tags=($tags paoru flickr)
|
||||
case *me-vs-gutenberg* *mevsgutenberg*
|
||||
tags=($tags martin_sand)
|
||||
case *marxy*
|
||||
tags=($tags marxy)
|
||||
case *etamodern*
|
||||
tags=($tags metamodern)
|
||||
case *aviationintel*
|
||||
tags=($tags aviationintel mil)
|
||||
case *aviationweek*
|
||||
tags=($tags aviationweek mil)
|
||||
case *codeonemagazine*
|
||||
tags=($tags codeonemagazine mil)
|
||||
case *geimint*
|
||||
tags=($tags geimint mil)
|
||||
case *momus* *mrstsk*
|
||||
tags=($tags books music momus)
|
||||
case *bjork*
|
||||
tags=($tags bjork music)
|
||||
case *c-h-r-i-s-c-a-r-t-e-r*
|
||||
tags=($tags chris_carter music)
|
||||
case *toog*
|
||||
tags=($tags toog music)
|
||||
case *nasa.gov*
|
||||
tags=($tags space nasa)
|
||||
case *mongoliad*
|
||||
tags=($tags neal_stephenson)
|
||||
case *gaiman*
|
||||
tags=($tags comics neil_gaiman)
|
||||
case *111567547782666546187*
|
||||
tags=($tags daniel_rehn gplus)
|
||||
case *114408853762245370512*
|
||||
tags=($tags francesco_cardi gplus)
|
||||
case *106673611724400311137*
|
||||
tags=($tags mark_jondahl gplus)
|
||||
case *113974084460235989118*
|
||||
tags=($tags jose_nazario gplus)
|
||||
case *102089697005520721324*
|
||||
tags=($tags zaki_hasan gplus)
|
||||
case *nin.com* *feeds.nin.com*
|
||||
tags=($tags music nin.com nin)
|
||||
case *ninofficialnews.tumblr.com*
|
||||
tags=($tags music tumblr nin)
|
||||
case *nix-os* *syssoftware*
|
||||
tags=($tags plan9 nix)
|
||||
case *bsdly* *OPENBSD* *OpenBSD* *openbsd* *scientist-home* *undeadly*
|
||||
tags=($tags software openbsd)
|
||||
case *godownmatthew* *mysticmilk* *petetoms*
|
||||
tags=($tags pete_toms)
|
||||
case *Pitchfork* *pitchfork*
|
||||
tags=($tags music pitchfork)
|
||||
case *9gridchan* *cat-v* *maht0x0r* *Plan9* *plan9*
|
||||
tags=($tags software plan9)
|
||||
case *FlauntTalks* *prince.org* *purpleinterviews* *wendyandlisa*
|
||||
tags=($tags music prince)
|
||||
case *101960720994009339267*
|
||||
tags=($tags gplus rob_pike)
|
||||
case *commandcenter* *rob_pike*
|
||||
tags=($tags blogger rob_pike)
|
||||
case *prometheus*
|
||||
tags=($tags telescreen prometheus)
|
||||
case *reddit.com*
|
||||
tags=($tags reddit)
|
||||
case *swtch.com*
|
||||
tags=($tags golang plan9 rsc)
|
||||
case *bunniestudios*
|
||||
tags=($tags bunniestudios security)
|
||||
case *jwz*
|
||||
tags=($tags jwz security)
|
||||
case *Krebs* *krebs*
|
||||
tags=($tags krebs security)
|
||||
case *scarybeastsecurity*
|
||||
tags=($tags scarybeast security)
|
||||
case *schneier*
|
||||
tags=($tags bruce_schneier security)
|
||||
case *chinchillakwak* *skwak*
|
||||
tags=($tags skwak)
|
||||
case *slashdot*
|
||||
tags=($tags slashdot)
|
||||
case *spaceref.com*
|
||||
tags=($tags space spaceref)
|
||||
case *StanleyLieber* *stanleylieber*
|
||||
tags=($tags stanleylieber)
|
||||
case *fastcompany*
|
||||
tags=($tags fastcompany tech)
|
||||
case *gizchina.com*
|
||||
tags=($tags gizchina tech)
|
||||
case *danharmon*
|
||||
tags=($tags danharmon telescreen)
|
||||
case *mindlessones*
|
||||
tags=($tags mindlessones telescreen)
|
||||
case *tcj.com*
|
||||
tags=($tags comics tcj)
|
||||
case *TEDBlog* *TEDblog* *ted.com*
|
||||
tags=($tags ted)
|
||||
case *ticom*
|
||||
tags=($tags ticom security)
|
||||
case *orrentfreak*
|
||||
tags=($tags p2p torrentfreak)
|
||||
case *ultra*culture*
|
||||
tags=($tags ultraculture)
|
||||
case *kleinletters*
|
||||
tags=($tags comics todd_klein)
|
||||
case *collectiondx.com*
|
||||
tags=($tags collectiondx toys)
|
||||
case *kennercollector.com*
|
||||
tags=($tags kennercollector toys)
|
||||
case *plaidstallions*
|
||||
tags=($tags plaidstallions toys)
|
||||
case *shojikawamori*
|
||||
tags=($tags shojikawamori japan toys)
|
||||
case *tumblr*
|
||||
tags=($tags tumblr)
|
||||
case *ruinedcartridge*
|
||||
tags=($tags ruinedcartridge basscomm video_games)
|
||||
}
|
||||
echo -n $tags
|
||||
}
|
||||
|
||||
fn parse_posts{
|
||||
ifs='
|
||||
' {
|
||||
posts=`{cat $file}
|
||||
for(i in `{seq 1 $#posts | sort -nr}){
|
||||
post=$posts($i)
|
||||
if(! ~ $post ''){
|
||||
a_title=`{echo $post | sed 's/^.*HJDIVIDERtitle: //g; s/HJDIVIDER.*$//g'}
|
||||
a_date=`{date}
|
||||
a_link=`{echo $post | sed 's/^.*HJDIVIDERlink: //g; s/HJDIVIDER.*$//g'}
|
||||
a_body=`{echo $post | sed 's/^.*HJDIVIDER//g; s/^.*HJDIVIDER//g; s/^.*HJDIVIDER//g'}
|
||||
a_id=`{echo `{ls -p $werc/sites/$site/src | sort -n | tail -1}^+1 | bc}
|
||||
if(~ $#a_id 0)
|
||||
a_id=1
|
||||
while(test -d $werc/sites/$site/src/$a_id)
|
||||
a_id=`{echo $a_id^+1 | bc}
|
||||
if(! ~ $"a_link '' && ! grep -s `{echo $"a_link | md5sum} $werc/sites/$site/links){
|
||||
mkdir -p $werc/sites/$site/src/$a_id/tags # big fat race
|
||||
echo $"a_title >$werc/sites/$site/src/$a_id/title
|
||||
echo $"a_date >$werc/sites/$site/src/$a_id/date
|
||||
echo $a_link(1) >$werc/sites/$site/src/$a_id/link
|
||||
echo $a_link(1) | md5sum >>$werc/sites/$site/links
|
||||
echo $"a_body '</a></li></ul>' >$werc/sites/$site/src/$a_id/body
|
||||
ifs=' ' {
|
||||
for(j in `{get_tags}){
|
||||
>$werc/sites/$site/src/$a_id/tags/$j
|
||||
echo $a_id/tags/$j >>$werc/sites/$site/tags
|
||||
}
|
||||
}
|
||||
}
|
||||
if(test -f /boot/factotum && ~ $site *.stanleylieber.com && test -d $werc/sites/$site/src/$a_id)
|
||||
chmod +t $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id/* $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id/tags/*
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(test -f /boot/factotum && test -f /rc/bin/hget)
|
||||
webfs
|
||||
get_posts
|
||||
parse_posts
|
119
werc/apps/barf/bin/gz
Executable file
119
werc/apps/barf/bin/gz
Executable file
|
@ -0,0 +1,119 @@
|
|||
#!/bin/rc
|
||||
# Parse XML RSS feeds into BARF blog posts for the specified site.
|
||||
# If a post with a matching _link_ already exists, no new post will
|
||||
# be created for that item. Tags will be created according to the rules
|
||||
# defined in the get_tags() function.
|
||||
#
|
||||
# The file argument should point to a file containing one line per feed,
|
||||
# with fields separated by the | character, in the following format:
|
||||
#
|
||||
# http://feeds.feedburner.com/ImNotReallyStanleyLieber|stanleylieber
|
||||
#
|
||||
# where the first field is the feed URL and each addition field is a tag.
|
||||
#
|
||||
# Requires 20h's xmlpull and rssread.
|
||||
rfork en
|
||||
switch($1){
|
||||
case /*
|
||||
feeds=$1
|
||||
site=read.stanleylieber.com
|
||||
tags=()
|
||||
case *
|
||||
echo 'Usage: gz file' >[1=2]
|
||||
exit usage
|
||||
}
|
||||
|
||||
file=/tmp/gz.$pid
|
||||
werc=/usr/sl/www/werc
|
||||
|
||||
if(test -f /boot/factotum)
|
||||
cmd=hget
|
||||
if not
|
||||
cmd='curl -s'
|
||||
|
||||
fn cram{
|
||||
ssam '
|
||||
,s/^link:.*$/HJDIVIDER&HJDIVIDER/g
|
||||
,s/^title:.*$/HJDIVIDER&HJDIVIDER/g
|
||||
,s/\n//g
|
||||
,s/HJDIVIDERtitle:/\n&/g
|
||||
'
|
||||
}
|
||||
|
||||
fn scape{
|
||||
ssam '
|
||||
,s/
//g
|
||||
,s/\"/\"/g
|
||||
,s/\"/\"/g
|
||||
,s/\&/\&/g
|
||||
,s/\&/\&/g
|
||||
,s/\'/''/g
|
||||
,s/\,/,/g
|
||||
,s/\-/-/g
|
||||
,s/\./\./g
|
||||
,s/\//\//g
|
||||
,s/\:/:/g
|
||||
,s/\;/;/g
|
||||
,s/\</</g
|
||||
,s/\</</g
|
||||
,s/\=/=/g
|
||||
,s/\>/>/g
|
||||
,s/\>/>/g
|
||||
,s/\_/_/g
|
||||
,s/\|/\|/g
|
||||
'
|
||||
}
|
||||
|
||||
fn get_posts{
|
||||
$"cmd $"feed | rssread | cram | scape >$file
|
||||
echo >>$file
|
||||
}
|
||||
|
||||
fn parse_posts{
|
||||
ifs='
|
||||
' {
|
||||
posts=`{cat $file}
|
||||
for(i in `{seq 1 $#posts | sort -nr}){
|
||||
post=$posts($i)
|
||||
if(! ~ $post ''){
|
||||
a_title=`{echo $post | sed 's/^.*HJDIVIDERtitle: //g; s/HJDIVIDER.*$//g'}
|
||||
a_date=`{date}
|
||||
a_link=`{echo $post | sed 's/^.*HJDIVIDERlink: //g; s/HJDIVIDER.*$//g'}
|
||||
a_body=`{echo $post | sed 's/^.*HJDIVIDER//g; s/^.*HJDIVIDER//g; s/^.*HJDIVIDER//g'}
|
||||
a_id=`{echo `{ls -p $werc/sites/$site/src | sort -n | tail -1}^+1 | bc}
|
||||
if(~ $#a_id 0)
|
||||
a_id=1
|
||||
while(test -d $werc/sites/$site/src/$a_id)
|
||||
a_id=`{echo $a_id^+1 | bc}
|
||||
if(! ~ $"a_link '' && ! grep -s `{echo $"a_link | md5sum} $werc/sites/$site/links){
|
||||
mkdir -p $werc/sites/$site/src/$a_id/tags # big fat race
|
||||
echo $"a_title >$werc/sites/$site/src/$a_id/title
|
||||
echo $"a_date >$werc/sites/$site/src/$a_id/date
|
||||
echo $a_link(1) >$werc/sites/$site/src/$a_id/link
|
||||
echo $a_link(1) | md5sum >>$werc/sites/$site/links
|
||||
if(~ $a_link(1) *staticflickr.com*)
|
||||
echo '<img src="'$"a_link'">' >$werc/sites/$site/src/$a_id/body
|
||||
echo $"a_body '</a></li></ul>' >>$werc/sites/$site/src/$a_id/body
|
||||
ifs=' ' {
|
||||
for(j in $tags){
|
||||
>$werc/sites/$site/src/$a_id/tags/$j
|
||||
echo $a_id/tags/$j >>$werc/sites/$site/tags
|
||||
}
|
||||
}
|
||||
}
|
||||
if(test -f /boot/factotum && ~ $site *.stanleylieber.com && test -d $werc/sites/$site/src/$a_id)
|
||||
chmod +t $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id/* $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id/tags/*
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(test -f /boot/factotum && test -f /rc/bin/hget)
|
||||
webfs
|
||||
for(i in `{grep -v -e '^#' $feeds}){
|
||||
feed=`{echo $"i | sed 's/\|.*$//g'}
|
||||
tags=`{echo $"i | sed 's/\|/ /g'}
|
||||
tags=$tags(2-)
|
||||
get_posts
|
||||
parse_posts
|
||||
}
|
119
werc/apps/barf/bin/gz.read
Executable file
119
werc/apps/barf/bin/gz.read
Executable file
|
@ -0,0 +1,119 @@
|
|||
#!/bin/rc
|
||||
# Parse XML RSS feeds into BARF blog posts for the specified site.
|
||||
# If a post with a matching _link_ already exists, no new post will
|
||||
# be created for that item. Tags will be created according to the rules
|
||||
# defined in the get_tags() function.
|
||||
#
|
||||
# The file argument should point to a file containing one line per feed,
|
||||
# with fields separated by the | character, in the following format:
|
||||
#
|
||||
# http://feeds.feedburner.com/ImNotReallyStanleyLieber|stanleylieber
|
||||
#
|
||||
# where the first field is the feed URL and each addition field is a tag.
|
||||
#
|
||||
# Requires 20h's xmlpull and rssread.
|
||||
rfork en
|
||||
switch($1){
|
||||
case /*
|
||||
feeds=$1
|
||||
site=read.stanleylieber.com
|
||||
tags=()
|
||||
case *
|
||||
echo 'Usage: gz file' >[1=2]
|
||||
exit usage
|
||||
}
|
||||
|
||||
file=/tmp/gz.$pid
|
||||
werc=/usr/sl/www/werc
|
||||
|
||||
if(test -f /boot/factotum)
|
||||
cmd=hget
|
||||
if not
|
||||
cmd='curl -s'
|
||||
|
||||
fn cram{
|
||||
ssam '
|
||||
,s/^link:.*$/HJDIVIDER&HJDIVIDER/g
|
||||
,s/^title:.*$/HJDIVIDER&HJDIVIDER/g
|
||||
,s/\n//g
|
||||
,s/HJDIVIDERtitle:/\n&/g
|
||||
'
|
||||
}
|
||||
|
||||
fn scape{
|
||||
ssam '
|
||||
,s/
//g
|
||||
,s/\"/\"/g
|
||||
,s/\"/\"/g
|
||||
,s/\&/\&/g
|
||||
,s/\&/\&/g
|
||||
,s/\'/''/g
|
||||
,s/\,/,/g
|
||||
,s/\-/-/g
|
||||
,s/\./\./g
|
||||
,s/\//\//g
|
||||
,s/\:/:/g
|
||||
,s/\;/;/g
|
||||
,s/\</</g
|
||||
,s/\</</g
|
||||
,s/\=/=/g
|
||||
,s/\>/>/g
|
||||
,s/\>/>/g
|
||||
,s/\_/_/g
|
||||
,s/\|/\|/g
|
||||
'
|
||||
}
|
||||
|
||||
fn get_posts{
|
||||
$"cmd $"feed | rssread | cram | scape >$file
|
||||
echo >>$file
|
||||
}
|
||||
|
||||
fn parse_posts{
|
||||
ifs='
|
||||
' {
|
||||
posts=`{cat $file}
|
||||
for(i in `{seq 1 $#posts | sort -nr}){
|
||||
post=$posts($i)
|
||||
if(! ~ $post ''){
|
||||
a_title=`{echo $post | sed 's/^.*HJDIVIDERtitle: //g; s/HJDIVIDER.*$//g'}
|
||||
a_date=`{date}
|
||||
a_link=`{echo $post | sed 's/^.*HJDIVIDERlink: //g; s/HJDIVIDER.*$//g'}
|
||||
a_body=`{echo $post | sed 's/^.*HJDIVIDER//g; s/^.*HJDIVIDER//g; s/^.*HJDIVIDER//g'}
|
||||
a_id=`{echo `{ls -p $werc/sites/$site/src | sort -n | tail -1}^+1 | bc}
|
||||
if(~ $#a_id 0)
|
||||
a_id=1
|
||||
while(test -d $werc/sites/$site/src/$a_id)
|
||||
a_id=`{echo $a_id^+1 | bc}
|
||||
if(! ~ $"a_link '' && ! grep -s `{echo $"a_link | md5sum} $werc/sites/$site/links){
|
||||
mkdir -p $werc/sites/$site/src/$a_id/tags # big fat race
|
||||
echo $"a_title >$werc/sites/$site/src/$a_id/title
|
||||
echo $"a_date >$werc/sites/$site/src/$a_id/date
|
||||
echo $a_link(1) >$werc/sites/$site/src/$a_id/link
|
||||
echo $a_link(1) | md5sum >>$werc/sites/$site/links
|
||||
if(~ $a_link(1) *staticflickr.com*)
|
||||
echo '<img src="'$"a_link'">' >$werc/sites/$site/src/$a_id/body
|
||||
echo $"a_body '</a></li></ul>' >>$werc/sites/$site/src/$a_id/body
|
||||
ifs=' ' {
|
||||
for(j in $tags){
|
||||
>$werc/sites/$site/src/$a_id/tags/$j
|
||||
echo $a_id/tags/$j >>$werc/sites/$site/tags
|
||||
}
|
||||
}
|
||||
}
|
||||
if(test -f /boot/factotum && ~ $site *.stanleylieber.com && test -d $werc/sites/$site/src/$a_id)
|
||||
chmod +t $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id/* $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id/tags/*
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(test -f /boot/factotum && test -f /rc/bin/hget)
|
||||
webfs
|
||||
for(i in `{grep -v -e '^#' $feeds}){
|
||||
feed=`{echo $"i | sed 's/\|.*$//g'}
|
||||
tags=`{echo $"i | sed 's/\|/ /g'}
|
||||
tags=$tags(2-)
|
||||
get_posts
|
||||
parse_posts
|
||||
}
|
119
werc/apps/barf/bin/gz.tumblr
Executable file
119
werc/apps/barf/bin/gz.tumblr
Executable file
|
@ -0,0 +1,119 @@
|
|||
#!/bin/rc
|
||||
# Parse XML RSS feeds into BARF blog posts for the specified site.
|
||||
# If a post with a matching _link_ already exists, no new post will
|
||||
# be created for that item. Tags will be created according to the rules
|
||||
# defined in the get_tags() function.
|
||||
#
|
||||
# The file argument should point to a file containing one line per feed,
|
||||
# with fields separated by the | character, in the following format:
|
||||
#
|
||||
# http://feeds.feedburner.com/ImNotReallyStanleyLieber|stanleylieber
|
||||
#
|
||||
# where the first field is the feed URL and each addition field is a tag.
|
||||
#
|
||||
# Requires 20h's xmlpull and rssread.
|
||||
rfork en
|
||||
switch($1){
|
||||
case /*
|
||||
feeds=$1
|
||||
site=tumblr.stanleylieber.com
|
||||
tags=()
|
||||
case *
|
||||
echo 'Usage: gz file' >[1=2]
|
||||
exit usage
|
||||
}
|
||||
|
||||
file=/tmp/gz.$pid
|
||||
werc=/usr/sl/www/werc
|
||||
|
||||
if(test -f /boot/factotum)
|
||||
cmd=hget
|
||||
if not
|
||||
cmd='curl -s'
|
||||
|
||||
fn cram{
|
||||
ssam '
|
||||
,s/^link:.*$/HJDIVIDER&HJDIVIDER/g
|
||||
,s/^title:.*$/HJDIVIDER&HJDIVIDER/g
|
||||
,s/\n//g
|
||||
,s/HJDIVIDERtitle:/\n&/g
|
||||
'
|
||||
}
|
||||
|
||||
fn scape{
|
||||
ssam '
|
||||
,s/
//g
|
||||
,s/\"/\"/g
|
||||
,s/\"/\"/g
|
||||
,s/\&/\&/g
|
||||
,s/\&/\&/g
|
||||
,s/\'/''/g
|
||||
,s/\,/,/g
|
||||
,s/\-/-/g
|
||||
,s/\./\./g
|
||||
,s/\//\//g
|
||||
,s/\:/:/g
|
||||
,s/\;/;/g
|
||||
,s/\</</g
|
||||
,s/\</</g
|
||||
,s/\=/=/g
|
||||
,s/\>/>/g
|
||||
,s/\>/>/g
|
||||
,s/\_/_/g
|
||||
,s/\|/\|/g
|
||||
'
|
||||
}
|
||||
|
||||
fn get_posts{
|
||||
$"cmd $"feed | rssread | cram | scape >$file
|
||||
echo >>$file
|
||||
}
|
||||
|
||||
fn parse_posts{
|
||||
ifs='
|
||||
' {
|
||||
posts=`{cat $file}
|
||||
for(i in `{seq 1 $#posts | sort -nr}){
|
||||
post=$posts($i)
|
||||
if(! ~ $post ''){
|
||||
a_title=`{echo $post | sed 's/^.*HJDIVIDERtitle: //g; s/HJDIVIDER.*$//g'}
|
||||
a_date=`{date}
|
||||
a_link=`{echo $post | sed 's/^.*HJDIVIDERlink: //g; s/HJDIVIDER.*$//g'}
|
||||
a_body=`{echo $post | sed 's/^.*HJDIVIDER//g; s/^.*HJDIVIDER//g; s/^.*HJDIVIDER//g'}
|
||||
a_id=`{echo `{ls -p $werc/sites/$site/src | sort -n | tail -1}^+1 | bc}
|
||||
if(~ $#a_id 0)
|
||||
a_id=1
|
||||
while(test -d $werc/sites/$site/src/$a_id)
|
||||
a_id=`{echo $a_id^+1 | bc}
|
||||
if(! ~ $"a_link '' && ! grep -s `{echo $"a_link | md5sum} $werc/sites/$site/links){
|
||||
mkdir -p $werc/sites/$site/src/$a_id/tags # big fat race
|
||||
echo $"a_title >$werc/sites/$site/src/$a_id/title
|
||||
echo $"a_date >$werc/sites/$site/src/$a_id/date
|
||||
echo $a_link(1) >$werc/sites/$site/src/$a_id/link
|
||||
echo $a_link(1) | md5sum >>$werc/sites/$site/links
|
||||
if(~ $a_link(1) *staticflickr.com*)
|
||||
echo '<img src="'$"a_link'">' >$werc/sites/$site/src/$a_id/body
|
||||
echo $"a_body '</a></li></ul>' >>$werc/sites/$site/src/$a_id/body
|
||||
ifs=' ' {
|
||||
for(j in $tags){
|
||||
>$werc/sites/$site/src/$a_id/tags/$j
|
||||
echo $a_id/tags/$j >>$werc/sites/$site/tags
|
||||
}
|
||||
}
|
||||
}
|
||||
if(test -f /boot/factotum && ~ $site *.stanleylieber.com && test -d $werc/sites/$site/src/$a_id)
|
||||
chmod +t $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id/* $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id/tags/*
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(test -f /boot/factotum && test -f /rc/bin/hget)
|
||||
webfs
|
||||
for(i in `{grep -v -e '^#' $feeds}){
|
||||
feed=`{echo $"i | sed 's/\|.*$//g'}
|
||||
tags=`{echo $"i | sed 's/\|/ /g'}
|
||||
tags=$tags(2-)
|
||||
get_posts
|
||||
parse_posts
|
||||
}
|
3
werc/apps/barf/bin/rsrc
Executable file
3
werc/apps/barf/bin/rsrc
Executable file
|
@ -0,0 +1,3 @@
|
|||
#!/bin/rc
|
||||
# Remove static files.
|
||||
rm -r [0-9]*.html [0-9]*-[0-9]*.html tag
|
4
werc/apps/barf/bin/srct
Executable file
4
werc/apps/barf/bin/srct
Executable file
|
@ -0,0 +1,4 @@
|
|||
#!/bin/rc
|
||||
# do not store these files in the worm
|
||||
fn f{ du -a $* | sed 's/^.* //g' }
|
||||
for(i in `{f $1}){ chmod +t $i }
|
14
werc/apps/barf/lib/barf.tpl
Executable file
14
werc/apps/barf/lib/barf.tpl
Executable file
|
@ -0,0 +1,14 @@
|
|||
% if(~ $show_header 1 && ! ~ $barf_type login rss)
|
||||
% display_header
|
||||
% if(~ $a_func edit_form){
|
||||
% if(check_user && ! ~ $#logged_user 0)
|
||||
% edit_form
|
||||
% if not
|
||||
% display_^$barf_type
|
||||
% }
|
||||
% if not
|
||||
% display_^$barf_type
|
||||
% if(~ $show_sidebar 1 && ~ $#a_func 0 && ! ~ $barf_type login rss)
|
||||
% display_sidebar
|
||||
% if(~ $show_footer 1 && ~ $#a_func 0 && ! ~ $barf_type login rss)
|
||||
% display_footer
|
43
werc/apps/barf/lib/blog
Executable file
43
werc/apps/barf/lib/blog
Executable file
|
@ -0,0 +1,43 @@
|
|||
fn display_blog{
|
||||
echo '<div id="center">
|
||||
<div id="posts">'
|
||||
get_post_list
|
||||
for(i in `{seq 1 $#posts}){
|
||||
a_id=$posts($i)
|
||||
a_dir=$barf_root/$"barf_dir/src/$a_id
|
||||
echo '<div id="post">
|
||||
<div id="post_title">'
|
||||
print_title
|
||||
echo '</div>
|
||||
<div id="post_meta">'
|
||||
link=`{cat $a_dir/link}
|
||||
echo '<span id="post_link">
|
||||
<a href="'$"link'" target="_b">link</a>
|
||||
</span>
|
||||
| <span id="post_tags">'
|
||||
print_tags
|
||||
echo '</span>
|
||||
| <span id="post_date">'
|
||||
cat $a_dir/date
|
||||
echo '</span>'
|
||||
print_id
|
||||
if(check_user && ! ~ $#logged_user 0){
|
||||
echo ' | <span id="post_edit">'
|
||||
print_edit
|
||||
echo '</span>'
|
||||
}
|
||||
echo '</div>
|
||||
<div id="post_body">'
|
||||
cat $a_dir/body
|
||||
if(~ $show_disqus 1 && ! ~ $#id 0)
|
||||
cat $barf_root/_werc/barf/disqus
|
||||
echo '</div>
|
||||
</div>
|
||||
<br>'
|
||||
}
|
||||
display_prevnext
|
||||
echo '<br><br><br>
|
||||
</div>
|
||||
</div>
|
||||
</div>'
|
||||
}
|
414
werc/apps/barf/lib/core
Executable file
414
werc/apps/barf/lib/core
Executable file
|
@ -0,0 +1,414 @@
|
|||
fn delete_post{
|
||||
a_dir=$barf_root/$"barf_dir/src/$a_id
|
||||
if(test -d $a_dir){
|
||||
rm -rf $a_dir &&
|
||||
{echo ',x/^'$a_id'\/.*\n/d'; echo w; echo q} | sam -d $barf_root/$"barf_dir/tags >[2]/dev/null
|
||||
}
|
||||
post_redirect $base_url^$barf_base_uri
|
||||
}
|
||||
|
||||
fn display_footer{
|
||||
if(test -f $barf_root/$"barf_dir/_werc/barf/footer)
|
||||
cat $barf_root/$"barf_dir/_werc/barf/footer
|
||||
if not if(test -f $barf_root/_werc/barf/footer)
|
||||
cat $barf_root/_werc/barf/footer
|
||||
if not
|
||||
cat apps/barf/barf/footer
|
||||
}
|
||||
|
||||
fn display_header{
|
||||
if(test -f $barf_root/$"barf_dir/_werc/barf/header)
|
||||
cat $barf_root/$"barf_dir/_werc/barf/header
|
||||
if not if(test -f $barf_root/_werc/barf/header)
|
||||
cat $barf_root/_werc/barf/header
|
||||
if not
|
||||
cat apps/barf/barf/header
|
||||
}
|
||||
|
||||
fn display_login{
|
||||
echo '<div id="login">
|
||||
<form method="post" action="/">
|
||||
<input type="hidden" name="a_func" value="login">
|
||||
username: <input type="text" name="user_name"><br>
|
||||
password: <input type="password" name="user_password"><br>
|
||||
<input name="s" type="submit" value="login">
|
||||
</form>
|
||||
</div>'
|
||||
}
|
||||
|
||||
fn display_prevnext{
|
||||
if(test $stop -gt `{echo 1+^$posts_per_page | bc}){
|
||||
nprev=`{echo $start^-1-^$posts_per_page | bc}
|
||||
prev='<span>
|
||||
<a href="'$base_url^$barf_base_uri'?tags='$"tags'&start='$"nprev'">prev</a> |
|
||||
</span>'
|
||||
}
|
||||
if(test $#posts -gt $posts_per_page){
|
||||
nnext=`{echo $stop^+1 | bc}
|
||||
next='<span>
|
||||
<a href="'$base_url^$barf_base_uri'?tags='$"tags'&start='$"nnext'">next</a>
|
||||
</span>'
|
||||
}
|
||||
echo '<div id="page_list">
|
||||
'$"prev'
|
||||
'$"next'
|
||||
</div>'
|
||||
}
|
||||
|
||||
fn display_sidebar{
|
||||
if(test -f $barf_root/$"barf_dir/_werc/barf/sidebar)
|
||||
cat $barf_root/$"barf_dir/_werc/barf/sidebar
|
||||
if not if(test -f $barf_root/_werc/barf/sidebar)
|
||||
cat $barf_root/_werc/barf/sidebar
|
||||
if not
|
||||
cat apps/barf/barf/sidebar
|
||||
}
|
||||
|
||||
fn dsrc{
|
||||
low=`{ls -p $barf_root/$"barf_dir/src | sort -n | sed 1q}
|
||||
high=$a_id
|
||||
if(~ $#low 1 && ~ $#high 1){
|
||||
cd $barf_root/$"barf_dir/src && rm -rf `{seq $low $high} &&
|
||||
{
|
||||
for(i in `{seq $low $high})
|
||||
echo ',x/^'$i'\/.*\n/d'
|
||||
echo w
|
||||
echo w
|
||||
echo q
|
||||
} | sam -d $barf_root/$"barf_dir/tags >[2]/dev/null
|
||||
}
|
||||
post_redirect $base_url^$barf_base_uri
|
||||
}
|
||||
|
||||
fn edit_form{
|
||||
if(~ $#a_id 0)
|
||||
name=add
|
||||
if not{
|
||||
name=update
|
||||
a_dir=$barf_root/$"barf_dir/src/$a_id
|
||||
for(x in $barf_items){
|
||||
if(~ $x img)
|
||||
a_img=`{ls -p $a_dir/img | sed 1q}
|
||||
if(~ $x tags)
|
||||
a_tags=`{ls -p $a_dir/tags}
|
||||
if not
|
||||
$x=`{cat $a_dir/$x}
|
||||
}
|
||||
}
|
||||
echo '<div id="list">
|
||||
<form action="/" method="post" name="edit" id="button">
|
||||
<input type="hidden" name="fake" value="fake">
|
||||
<input type="text" name="url" style="display: none;">
|
||||
<input type="hidden" name="a_func" value="edit_post">'
|
||||
if(~ $name update)
|
||||
echo '<input type="hidden" name="a_id" value="'$"a_id'">'
|
||||
for(x in $barf_items){
|
||||
if(~ $x body){
|
||||
echo '<div id="edit_body">' \
|
||||
'body:<br>' \
|
||||
'<textarea name="a_body">'
|
||||
if(~ $name update)
|
||||
cat $a_dir/body
|
||||
echo '</textarea></div>'
|
||||
}
|
||||
if not if(~ $x img){
|
||||
echo '<div id="edit_img">' \
|
||||
'image:<br>' \
|
||||
'<input name="a_img" type="text" value="'$"a_img'" id="edit"> ' \
|
||||
'download: <input name="a_download" type="checkbox" value="1">' \
|
||||
'</div>'
|
||||
}
|
||||
if not if(~ $x tags){
|
||||
echo '<div id="edit_tags">' \
|
||||
'tags: (space separated list of tags)<br>' \
|
||||
'<input name="a_tags" type="text" value="'$"a_tags'" id="edit">' \
|
||||
'</div>'
|
||||
}
|
||||
if not{
|
||||
echo '<div id="edit_'$"x'">' \
|
||||
$"x':<br>' \
|
||||
'<input name="a_'$"x'" type="text" value="'$"$x'" id="edit">' \
|
||||
'</div>'
|
||||
}
|
||||
}
|
||||
echo '<div id="edit_submit">' \
|
||||
'<input type="submit" name="'$name'" value="'$name'">' \
|
||||
'</div>
|
||||
</form>
|
||||
</div>'
|
||||
}
|
||||
|
||||
fn edit_post{
|
||||
if(~ $#a_id 0){
|
||||
a_id=`{echo `{ls -p $barf_root/$"barf_dir/src | sort -n | tail -1}^+1 | bc}
|
||||
if(~ $#a_id 0)
|
||||
a_id=1
|
||||
while(test -d $barf_root/$"barf_dir/src/$a_id)
|
||||
a_id=`{echo $a_id^+1 | bc}
|
||||
}
|
||||
a_dir=$barf_root/$"barf_dir^src/$a_id
|
||||
mkdir -p $a_dir/img $a_dir/tags
|
||||
rm -f $a_dir/tags/*
|
||||
for(x in $barf_items){
|
||||
if(~ $x date){
|
||||
if(! ~ $#a_date 0)
|
||||
echo $"a_date >$a_dir/date
|
||||
if not
|
||||
date >$a_dir/date
|
||||
}
|
||||
if not if(~ $x tags){
|
||||
if(! ~ $#a_tags 0){
|
||||
a_tags=`{echo $"a_tags | sed 's/[^A-Za-z0-9_\- ]//g'}
|
||||
ifs=' '{a_tags=`{echo -n $a_tags}}
|
||||
{
|
||||
t=1
|
||||
while(test $t -le $#a_tags){
|
||||
>$a_dir/tags/$a_tags($t)
|
||||
t=`{echo $t^+1 | bc}
|
||||
}
|
||||
}
|
||||
for(i in $a_tags)
|
||||
echo $a_id'/tags/'$i >>$barf_root/$"barf_dir/tags
|
||||
}
|
||||
}
|
||||
if not if(! ~ $x img tags){
|
||||
item='a_'$"x
|
||||
if(! ~ $$item ''){
|
||||
>$a_dir/$x
|
||||
echo $$item >$a_dir/$x
|
||||
}
|
||||
}
|
||||
}
|
||||
if(~ $a_download 1){
|
||||
switch($barf_type){
|
||||
case image
|
||||
rm -f $a_dir/img/*
|
||||
img=$a_dir/img/^`{date -n}^.^`{echo $"a_img |
|
||||
sed 's/^.*\.(gif|GIF)$/gif/g;
|
||||
s/^.*\.(jpg|jpeg|JPG|JPEG)$/jpg/g;
|
||||
s/^.*\.(png|PNG)$/png/g;
|
||||
s/^.*\.(tif|TIF|tiff|TIFF)$/tif/g'
|
||||
}
|
||||
thumb=$a_dir/img/small.^`{basename $img | sed 's/\..*$//g'}^.png
|
||||
if(test -f /boot/factotum){
|
||||
@{
|
||||
rfork n
|
||||
if(test -f /rc/bin/hget)
|
||||
webfs
|
||||
hget $"a_img >$img
|
||||
#magick/convert $img -resize 500x600 $thumb
|
||||
switch($img){
|
||||
case *.bmp
|
||||
cmd=bmp
|
||||
case *.gif
|
||||
cmd=gif
|
||||
case *.ico
|
||||
cmd=ico
|
||||
case *.jpg
|
||||
cmd=jpg
|
||||
case *.png
|
||||
cmd=png
|
||||
case *.tif
|
||||
cmd=tif
|
||||
case *.tga
|
||||
cmd=tga
|
||||
}
|
||||
$cmd -9et <$img | resample -x 500 | topng >$thumb
|
||||
}
|
||||
}
|
||||
if not{
|
||||
curl -s -o $"a_img >$img
|
||||
convert $img -resize 500x600 $thumb
|
||||
}
|
||||
case url
|
||||
if(test -f /boot/factotum){
|
||||
@{
|
||||
rfork n
|
||||
if(test -f /rc/bin/hget)
|
||||
webfs
|
||||
hget $"a_link | htmlfmt | fmt >$a_dir/body
|
||||
}
|
||||
}
|
||||
if not
|
||||
curl -s $"a_link | htmlfmt | fmt >$a_dir/body
|
||||
}
|
||||
}
|
||||
if(! ~ $gp 1)
|
||||
post_redirect $base_url^$barf_base_uri
|
||||
}
|
||||
|
||||
fn get_post_list{
|
||||
if(~ $id [0-9]*)
|
||||
posts=$id
|
||||
if not{
|
||||
posts=`{
|
||||
if(~ $show_ascending 1)
|
||||
sort=(sort -n)
|
||||
if not
|
||||
sort=(sort -nr)
|
||||
if(~ $tags all)
|
||||
ls -p $barf_root/$"barf_dir/src |
|
||||
grep -e '^[0-9]*$' |
|
||||
eval $sort |
|
||||
sed -n $start^,^$stop^p # awk 'NR=='$start',NR=='$stop' {print;}'
|
||||
if not
|
||||
grep -e '^.*\/'$tags'$' $barf_root/$"barf_dir/tags |
|
||||
awk -F '/' '{print $1;}' |
|
||||
eval $sort |
|
||||
uniq |
|
||||
sed -n $start^,^$stop^p
|
||||
}
|
||||
if(! ~ $posts [0-9]*)
|
||||
posts=()
|
||||
}
|
||||
}
|
||||
|
||||
fn get_start{
|
||||
if(~ $#start 0)
|
||||
start=1
|
||||
}
|
||||
|
||||
fn get_stop{
|
||||
if(~ $#stop 0)
|
||||
stop=`{echo $start^+^$posts_per_page | bc}
|
||||
}
|
||||
|
||||
fn get_tags{
|
||||
if(~ $#tags 0)
|
||||
tags=all
|
||||
}
|
||||
|
||||
fn load_get_args{
|
||||
if(~ $REQUEST_METHOD GET && ~ $#get_args 0 && ~ $REQUEST_URI *'='*){
|
||||
ifs='&' {
|
||||
a=`{echo $"REQUEST_URI | sed 's/(^\/|#.*$)//g'}
|
||||
for(pair in $a){
|
||||
ifs='=' { pair=`{echo -n $pair} }
|
||||
n='get_arg_'^`{echo $pair(1) | urldecode | tr -cd 'a-zA-Z0-9_'}
|
||||
get_args=( $get_args $n )
|
||||
ifs=() { $n=`{echo -n $pair(2) | urldecode | tr -d '
'} }
|
||||
}
|
||||
}
|
||||
pair=()
|
||||
}
|
||||
}
|
||||
|
||||
fn parse_get_args{
|
||||
if(! ~ $#get_arg_a_func 0)
|
||||
a_func=$get_arg_a_func
|
||||
if(! ~ $#get_arg_a_id 0)
|
||||
a_id=$get_arg_a_id
|
||||
if(! ~ $#get_arg_id 0)
|
||||
id=$get_arg_id
|
||||
if(! ~ $#get_arg_start 0)
|
||||
start=$get_arg_start
|
||||
if(! ~ $#get_arg_stop 0)
|
||||
stop=$get_arg_stop
|
||||
if(! ~ $#get_arg_reply 0)
|
||||
reply=$get_arg_reply
|
||||
if(! ~ $#get_arg_tags 0)
|
||||
tags=$get_arg_tags
|
||||
}
|
||||
|
||||
fn parse_post_args{
|
||||
for(x in $barf_items){
|
||||
a='a_'$"x
|
||||
p='post_arg_'$"a
|
||||
$a=$$p
|
||||
}
|
||||
if(! ~ $#post_arg_a_download 0)
|
||||
a_download=$post_arg_a_download
|
||||
if(! ~ $#post_arg_a_func 0)
|
||||
a_func=$post_arg_a_func
|
||||
if(! ~ $#post_arg_fake 0)
|
||||
fake=$post_arg_fake
|
||||
if(! ~ $#post_arg_a_id 0)
|
||||
a_id=$post_arg_a_id
|
||||
if(! ~ $#post_arg_url 0)
|
||||
url=$post_arg_url
|
||||
}
|
||||
|
||||
fn print_edit{
|
||||
edit='<a href="'$base_url^$barf_base_uri'?a_func=edit_form&a_id='$"a_id'">edit</a>'
|
||||
delete='<a href="'$base_url^$barf_base_uri'?a_func=delete_post&a_id='$"a_id'" onclick="return confirm(''are you sure you want to delete?'');">delete</a>'
|
||||
dsrc='<a href="'$base_url^$barf_base_uri'?a_func=dsrc&a_id='$"a_id'" onclick="return confirm(''are you sure you want to dsrc?'');">dsrc</a>'
|
||||
echo $"edit' | '$"delete' | '$"dsrc
|
||||
}
|
||||
|
||||
fn print_id{
|
||||
echo '<span id="post_id"><a href="/?id='$"a_id'">No.'$"a_id'</a></span>'
|
||||
}
|
||||
|
||||
fn print_img{
|
||||
a_img=`{ls -p $a_dir/img/[0-9]*}
|
||||
a_thumb=`{ls -p $a_dir/img/small*}
|
||||
if(! ~ $#a_img 0)
|
||||
if(~ $#a_thumb 0)
|
||||
a_thumb=$a_img
|
||||
echo '<a href="'$base_url^$barf_base_uri'src/'$a_id'/img/'$a_img'" target="_b"><img src="'$base_url^$barf_base_uri'src/'$a_id'/img/'$a_thumb'" border="0"></a>'
|
||||
}
|
||||
|
||||
fn print_tags{
|
||||
a_tags=`{ls -p $a_dir/tags}
|
||||
a_tags=`{for(t in $a_tags) echo '<a href="'$base_url^$barf_base_uri'?tags='$t'">'$t'</a>, '}
|
||||
a_tags=`{echo $a_tags | awk '{print substr($0, 1, length($0) -1)}'}
|
||||
echo '<span id="post_tags">'$"a_tags'</span>'
|
||||
}
|
||||
|
||||
fn print_title{
|
||||
a_title=`{cat $a_dir/title}
|
||||
if(! ~ $#a_title 0){
|
||||
if(~ $barf_type log url)
|
||||
echo '<a href="'`{cat $a_dir/link}'">'$"a_title'</a>'
|
||||
if not
|
||||
echo '<a href="'$base_url^$barf_base_uri'?id='$"a_id'">'$"a_title'</a>'
|
||||
}
|
||||
}
|
||||
|
||||
fn redirect_bots{
|
||||
if(! ~ $fake fake || ! ~ $url '')
|
||||
post_redirect http://google.com
|
||||
}
|
||||
|
||||
fn urldecode {
|
||||
awk '
|
||||
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
|
||||
}
|
||||
'
|
||||
}
|
1
werc/apps/barf/lib/default_master.tpl
Executable file
1
werc/apps/barf/lib/default_master.tpl
Executable file
|
@ -0,0 +1 @@
|
|||
% run_handler $handler_body_main
|
68
werc/apps/barf/lib/image
Executable file
68
werc/apps/barf/lib/image
Executable file
|
@ -0,0 +1,68 @@
|
|||
fn add_post{
|
||||
redirect_bots
|
||||
a_download=1
|
||||
edit_post
|
||||
}
|
||||
|
||||
fn display_image{
|
||||
echo '<div id="center">'
|
||||
if(~ $allow_anon 1 || {check_user && ! ~ $#logged_user 0}){
|
||||
echo '<div id="upload">
|
||||
<form method="post" action="/">
|
||||
<input type="hidden" name="fake" value="fake">
|
||||
<input type="text" name="url" style="display: none;">
|
||||
<input type="hidden" name="a_func" value="add_post">
|
||||
<div id="upload_heading">/'$tags'/</div>
|
||||
<table id="upload_table">
|
||||
<tr><td id="upload_label">Image</td><td><input type="text" name="a_img" id="upload_input"></td></tr>
|
||||
<tr><td id="upload_label">Link</td><td><input type="text" name="a_link" id="upload_input"></td></tr>
|
||||
<tr><td id="upload_label">Tags</td><td><input type="text" name="a_tags" id="upload_tags">
|
||||
<input type="submit" name="submit" value="add" id="upload_submit"></td></tr>
|
||||
</table>
|
||||
</form>
|
||||
<table align="center">
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<li id="upload_meta">Supported file types are: GIF, JPG, PNG</li>
|
||||
<li id="upload_meta">Images greater than 500x600 pixels will be thumbnailed.</li>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>'
|
||||
}
|
||||
echo '<div id="center_body">'
|
||||
get_post_list
|
||||
for(i in `{seq 1 $#posts}){
|
||||
a_id=$posts($i)
|
||||
a_dir=$barf_root/$"barf_dir/src/$a_id
|
||||
echo '<div id="post">
|
||||
<div id="post_meta">
|
||||
<span id="post_link">'
|
||||
link=`{cat $a_dir/link}
|
||||
echo '<a href="'$"link'">link</a>
|
||||
</span> |
|
||||
<span id="post_tags">'
|
||||
print_tags
|
||||
echo '</span> |
|
||||
<span id="post_date">'
|
||||
cat $a_dir/date
|
||||
echo '</span>'
|
||||
if(check_user && ! ~ $#logged_user 0){
|
||||
echo '| <span id="post_edit">'
|
||||
print_edit
|
||||
echo '</span>'
|
||||
}
|
||||
echo '</div>
|
||||
<div id="post_img">'
|
||||
print_img
|
||||
echo '</div>
|
||||
</div>
|
||||
<br><br>'
|
||||
}
|
||||
display_prevnext
|
||||
echo '<br><br><br><br>
|
||||
</div>
|
||||
</div>
|
||||
</div>'
|
||||
}
|
55
werc/apps/barf/lib/log
Executable file
55
werc/apps/barf/lib/log
Executable file
|
@ -0,0 +1,55 @@
|
|||
fn display_log{
|
||||
if(~ $#logged_user 0)
|
||||
a='<a href="'$base_url^$barf_base_uri'login">login</a>'
|
||||
if not
|
||||
a='<a href="'$base_url^$barf_base_uri'?a_func=edit_form">add</a>'
|
||||
echo '<div>
|
||||
<span id="add">'$"a'</span>
|
||||
<span id="search">
|
||||
<form method="get" action="/">
|
||||
<input type="text" name="tags" size="28">
|
||||
<input type="submit" value="search">
|
||||
</form>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div id="list">
|
||||
<table id="post_table">
|
||||
<tbody>
|
||||
<tr id="blank">
|
||||
<th style="display: none;"> </th>
|
||||
<th style="display: none;"> </th>
|
||||
<th style="display: none;"> </th>'
|
||||
if(check_user && ! ~ $#logged_user 0)
|
||||
echo '<th style="display: none;"> </th>'
|
||||
echo '</tr>'
|
||||
get_post_list
|
||||
for(i in `{seq 1 $#posts}){
|
||||
a_id=$posts($i)
|
||||
a_dir=$barf_root/$"barf_dir/src/$a_id
|
||||
echo '<tr>'
|
||||
for(j in $barf_items){
|
||||
echo '<td id="post_'$"j'">'
|
||||
if(~ $j img)
|
||||
print_img
|
||||
if not if(~ $j tags)
|
||||
print_tags
|
||||
if not if(~ $j title)
|
||||
print_title
|
||||
if not
|
||||
cat $a_dir/$j
|
||||
echo '</td>'
|
||||
}
|
||||
if(check_user && ! ~ $#logged_user 0){
|
||||
echo '<td id="post_edit">'
|
||||
print_edit
|
||||
echo '</td>'
|
||||
}
|
||||
echo '</tr>'
|
||||
}
|
||||
echo '</tbody>
|
||||
</table>'
|
||||
display_prevnext
|
||||
echo '<br><br><br><br>
|
||||
</div>'
|
||||
}
|
50
werc/apps/barf/lib/paste
Executable file
50
werc/apps/barf/lib/paste
Executable file
|
@ -0,0 +1,50 @@
|
|||
fn add_post{
|
||||
redirect_bots
|
||||
a_date=`{date}
|
||||
edit_post
|
||||
}
|
||||
|
||||
fn display_paste{
|
||||
echo '<div id="center">'
|
||||
if(~ $allow_anon 1 || {check_user && ! ~ $#logged_user 0}){
|
||||
echo '<div id="paste">
|
||||
<p>
|
||||
<form method="post" action="/">
|
||||
<input type="hidden" name="fake" value="fake">
|
||||
<input type="text" name="url" style="display: none;">
|
||||
<input type="hidden" name="a_func" value="add_post">
|
||||
<textarea name="a_body" id="paste_box"></textarea><br>
|
||||
<input type="submit" name="submit" value="submit" id="paste_submit">
|
||||
</form>
|
||||
</div>'
|
||||
}
|
||||
echo '<p>
|
||||
<div id="posts">'
|
||||
get_post_list
|
||||
for(i in `{seq 1 $#posts}){
|
||||
a_id=$posts($i)
|
||||
a_dir=$barf_root/$"barf_dir/src/$a_id
|
||||
echo '<div id="post">
|
||||
<div id="post_meta">'
|
||||
date=`{cat $a_dir/date}
|
||||
echo '<span id="post_date">
|
||||
<a href="/src/'$"a_id'/body" target="_b">'$"date'</a>
|
||||
</span>'
|
||||
if(check_user && ! ~ $#logged_user 0){
|
||||
echo ' | <span id="post_edit">'
|
||||
print_edit
|
||||
echo '</span>'
|
||||
}
|
||||
echo '</div>
|
||||
<div id="post_body">'
|
||||
txt_handler $barf_root/$"barf_dir/src/$a_id/body
|
||||
echo '</div>
|
||||
</div>
|
||||
<br>'
|
||||
}
|
||||
display_prevnext
|
||||
echo '<br><br><br><br>
|
||||
</div>
|
||||
</div>
|
||||
</div>'
|
||||
}
|
56
werc/apps/barf/lib/rss
Executable file
56
werc/apps/barf/lib/rss
Executable file
|
@ -0,0 +1,56 @@
|
|||
fn display_rss{
|
||||
echo '<?xml version="1.0" encoding="UTF-8"?>'
|
||||
echo '<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">'
|
||||
echo '<channel>'
|
||||
echo '<atom:link href="'$base_url^$req_path'" rel="self" type="application/rss+xml" />'
|
||||
echo '<title><![CDATA['$"siteTitle']]></title>'
|
||||
echo '<link>'$base_url^$barf_base_uri'</link>'
|
||||
echo '<description><![CDATA['$"blogDesc']]></description>'
|
||||
echo '<generator><![CDATA[barf]]></generator>'
|
||||
echo '<lastBuildDate>'
|
||||
ndate -m `{date `{mtime $barf_root/$"barf_dir/src | awk '{print $1}'}} # rfc2822 last time channel content changed.
|
||||
echo -n '</lastBuildDate>'
|
||||
echo '<language>en-us</language>'
|
||||
date=`{ndate -m} # rfc2822 publication date for content in the channel.
|
||||
get_post_list
|
||||
for(i in `{seq 1 $#posts}){
|
||||
a_id=$posts($i)
|
||||
a_dir=$barf_root/$"barf_dir/src/$a_id
|
||||
echo '<item>'
|
||||
echo '<guid isPermaLink="true">'$base_url^$barf_base_uri'?id='$"a_id'</guid>'
|
||||
echo '<pubDate>'$"date'</pubDate>'
|
||||
title=`{cat $a_dir/title}
|
||||
if(~ $title '')
|
||||
ntitle=($siteTitle $"a_id)
|
||||
if not
|
||||
ntitle=$title
|
||||
echo '<title>'$"ntitle'</title>'
|
||||
echo '<link>'$base_url^$barf_base_uri'?id='$"a_id'</link>'
|
||||
echo '<description><![CDATA['
|
||||
if(~ $obarf_type image){
|
||||
if(! ~ $#a_link 0)
|
||||
link=$"a_link
|
||||
if not
|
||||
link=$base_url^$barf_base_uri'?id='$"a_id
|
||||
echo '<p>source: <a href="'$"link'">link</a></p>'
|
||||
}
|
||||
a_tags=`{ls -p $a_dir/tags}
|
||||
if(! ~ $#a_tags 0){
|
||||
echo '<p>tags: '
|
||||
print_tags
|
||||
echo '</p>'
|
||||
echo '<p>'
|
||||
}
|
||||
# begin ugly if statements
|
||||
if(~ $obarf_type paste)
|
||||
echo '<pre>'
|
||||
if(! ~ $obarf_type image)
|
||||
cat $a_dir/body
|
||||
if(~ $obarf_type paste)
|
||||
echo '</pre>'
|
||||
if(~ $obarf_type image)
|
||||
print_img
|
||||
echo '</p>]]></description></item>'
|
||||
}
|
||||
echo '</channel></rss>'
|
||||
}
|
52
werc/apps/barf/lib/url
Executable file
52
werc/apps/barf/lib/url
Executable file
|
@ -0,0 +1,52 @@
|
|||
fn display_url{
|
||||
if(~ $#logged_user 0)
|
||||
a='<a href="'$base_url^$barf_base_uri'login">login</a>'
|
||||
if not
|
||||
a='<a href="'$base_url^$barf_base_uri'?a_func=edit_form">add</a>'
|
||||
echo '<div>
|
||||
<span id="add">'$"a'</span>
|
||||
<span id="search">
|
||||
<form method="get" action="/">
|
||||
<input type="text" name="tags" size="28">
|
||||
<input type="submit" value="search">
|
||||
</form>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div id="list">
|
||||
<table id="post_table">
|
||||
<tbody>
|
||||
<tr id="blank">
|
||||
<th style="display: none;"> </th>
|
||||
<th style="display: none;"> </th>
|
||||
<th style="display: none;"> </th>'
|
||||
if(check_user && ! ~ $#logged_user 0)
|
||||
echo '<th style="display: none;"> </th>'
|
||||
echo '</tr>'
|
||||
get_post_list
|
||||
for(i in `{seq 1 $#posts}){
|
||||
a_id=$posts($i)
|
||||
a_dir=$barf_root/$"barf_dir/src/$a_id
|
||||
echo '<tr>
|
||||
<td id="post_title">'
|
||||
print_title
|
||||
echo '</td>
|
||||
<td id="post_tags">'
|
||||
print_tags
|
||||
echo '</td>
|
||||
<td id="post_date">'
|
||||
cat $a_dir/date
|
||||
echo '</td>'
|
||||
if(check_user && ! ~ $#logged_user 0){
|
||||
echo '<td id="post_edit">'
|
||||
print_edit
|
||||
echo '</td>'
|
||||
}
|
||||
echo '</tr>'
|
||||
}
|
||||
echo '</tbody>
|
||||
</table>'
|
||||
display_prevnext
|
||||
echo '<br><br><br><br>
|
||||
</div>'
|
||||
}
|
10
werc/apps/barf/mkfile
Executable file
10
werc/apps/barf/mkfile
Executable file
|
@ -0,0 +1,10 @@
|
|||
WERC=/usr/sl/www/werc
|
||||
PLAN9=$WERC/sites/plan9.stanleylieber.com
|
||||
|
||||
web:V:
|
||||
src=`{basename `{pwd}}
|
||||
rm -rf $PLAN9/werc/apps/$src
|
||||
cd $WERC/apps
|
||||
tar zcvf $PLAN9/werc/apps/$src.tgz $src
|
||||
cd $PLAN9/werc/apps
|
||||
tar zxvf $src.tgz
|
344
werc/apps/barf/pub/1995.css
Executable file
344
werc/apps/barf/pub/1995.css
Executable file
|
@ -0,0 +1,344 @@
|
|||
/* 1995 */
|
||||
|
||||
body {
|
||||
color: black;
|
||||
background-color: silver;
|
||||
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: black;
|
||||
background-color: silver;
|
||||
height: 1.6em;
|
||||
}
|
||||
|
||||
.superHeader img { vertical-align: bottom; }
|
||||
|
||||
.superHeader a {
|
||||
color: blue;
|
||||
background-color: transparent;
|
||||
font-size: 91%;
|
||||
margin: 0;
|
||||
padding: 0 0.5ex 0 0.25ex;
|
||||
text-decoration: underline; }
|
||||
}
|
||||
|
||||
a { text-decoration: underline; }
|
||||
a:hover { text-decoration: underline; }
|
||||
|
||||
.superHeader div {
|
||||
position: absolute;
|
||||
top: 0.40ex;
|
||||
}
|
||||
|
||||
.superHeader .left { left: 0.4em; }
|
||||
.superHeader .right { right: 0.4em; }
|
||||
|
||||
.midHeader {
|
||||
color: black;
|
||||
background-color: silver;
|
||||
border: solid 0 black;
|
||||
border-width: 1px 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 black;
|
||||
}
|
||||
|
||||
#side-bar div {
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
|
||||
.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: black;
|
||||
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: blue solid 0.2em;
|
||||
}
|
||||
|
||||
.thisPage, .thisPage a {
|
||||
color: black!important;
|
||||
background-color: white;
|
||||
padding-left: 5mm;
|
||||
}
|
||||
|
||||
#side-bar a:hover {
|
||||
color: white;
|
||||
background-color: blue;
|
||||
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: black;
|
||||
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 black;
|
||||
}
|
||||
|
||||
#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: blue;
|
||||
background-color: transparent;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
#main-copy a:hover {
|
||||
color: blue;
|
||||
background-color: transparent;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
#main-copy h1, #main-copy h2 {
|
||||
color: black;
|
||||
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 black;
|
||||
}
|
||||
|
||||
#main-copy h2 {
|
||||
font-size: 115.5%;
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
|
||||
#main-copy .topOfPage {
|
||||
color: black;
|
||||
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: black;
|
||||
background-color: silver;
|
||||
padding: 1em;
|
||||
clear: both;
|
||||
border-color: black;
|
||||
border-width: 1px 0;
|
||||
}
|
||||
|
||||
#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: blue;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
|
||||
/* GENERAL */
|
||||
|
||||
table {
|
||||
background-color: transparent;
|
||||
padding: 0px;
|
||||
border: 0px;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 10px;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-collapse: collapse;
|
||||
border-color: #000000;
|
||||
background: silver;
|
||||
}
|
||||
|
||||
tr {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-collapse: collapse;
|
||||
border-color: #000000;
|
||||
}
|
||||
hr {
|
||||
border-width: 0px 0px 0.1em 0px;
|
||||
border-color: black;
|
||||
}
|
||||
|
||||
acronym, .titleTip {
|
||||
border-bottom: 1px solid black;
|
||||
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 black; }
|
||||
|
||||
.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;
|
||||
}
|
63
werc/apps/barf/pub/1oct1993.css
Executable file
63
werc/apps/barf/pub/1oct1993.css
Executable file
|
@ -0,0 +1,63 @@
|
|||
/* 1oct1993 */
|
||||
body {
|
||||
color: #FFFFFF;
|
||||
background-color: #000000;
|
||||
font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', 'Bitstream Sans Vera', Sans-Serif;
|
||||
font-size: 84%; /* Enables font size scaling in MSIE */
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
a { text-decoration: none; color: #00ADEF; }
|
||||
a:hover { color: #00ADEF; text-decoration: none; }
|
||||
li:hover { color: #00ADEF; text-decoration: none; }
|
||||
li a { color: #00ADEF }
|
||||
li a:hover { color: #00ADEF; text-decoration: none; }
|
||||
li ul { padding-left: 0.6em !important; }
|
||||
h1 { font-size: 10pt; font-weight: normal; }
|
||||
h2 { font-size: 9pt; font-weight: normal; }
|
||||
input , textarea, select, option { background-color: #00ADEF; border: none; }
|
||||
table { border: none; }
|
||||
tr { background-color: transparent; }
|
||||
th {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
text-align: center;
|
||||
}
|
||||
td {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
}
|
||||
|
||||
hr {
|
||||
border-width: 0px 0px 0.1em 0px;
|
||||
border-color: transparent;
|
||||
}
|
||||
pre, code, blockquote {
|
||||
font-family: Courier, 'Lucida Console','Courier New', Serif;
|
||||
margin-left: 2em;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
blockquote {
|
||||
border-left: none;
|
||||
font-style: none;
|
||||
background-color: #00ADEF;
|
||||
}
|
||||
#header { flex-basis: 100%; }
|
||||
#header tr { background-color: transparent; }
|
||||
#center {
|
||||
width: 500px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
#center h1 { font-size 9pt; }
|
||||
#footer {
|
||||
font-size: 8pt;
|
||||
background-color: #000000;
|
||||
color: #00ADEF;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
#footer a { color: #00ADEF; text-decoration: none; }
|
||||
#footer a:hover { color: #00ADEF; text-decoration: none; }
|
||||
#footer table { font-size: 8pt; }
|
||||
#footer tr { background-color: transparent; }
|
77
werc/apps/barf/pub/flamesgif.css
Executable file
77
werc/apps/barf/pub/flamesgif.css
Executable file
|
@ -0,0 +1,77 @@
|
|||
/* flamesgif.com */
|
||||
body {
|
||||
color: black;
|
||||
background-color: silver;
|
||||
font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', 'Bitstream Sans Vera', Sans-Serif;
|
||||
font-size: 84%; /* Enables font size scaling in MSIE */
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
a { text-decoration: none; color: blue; }
|
||||
a:hover { color: purple;}
|
||||
blockquote {
|
||||
border-left: none;
|
||||
font-style: none;
|
||||
background-color: silver;
|
||||
}
|
||||
li:hover { color: purple }
|
||||
li a { color: blue }
|
||||
li a:hover { color: purple; }
|
||||
h1 { font-size: 10pt; }
|
||||
h2, h3, h1, h4 { color : blue; }
|
||||
hr {
|
||||
border-width: 0px 0px 0.1em 0px;
|
||||
border-color: transparent;
|
||||
}
|
||||
input , textarea, select, option { background-color: blue; border: none; }
|
||||
pre, code, blockquote {
|
||||
font-family: Courier, 'Lucida Console','Courier New', Serif;
|
||||
margin-left: 2em;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
table { border: none; }
|
||||
th {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
text-align: center;
|
||||
}
|
||||
td {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
}
|
||||
ul { list-style: none; padding-left: 0px; margin: 0px }
|
||||
#center {
|
||||
width: 600px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
#center h1 { font-size 9pt; }
|
||||
#footer {
|
||||
font-size: 8pt;
|
||||
background-color: silver;
|
||||
color: blue;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
#footer a { color: blue; text-decoration: none; }
|
||||
#footer a:hover { color: purple; text-decoration: none; }
|
||||
#footer table { font-size: 8pt; }
|
||||
#right {
|
||||
float: right;
|
||||
position: absolute;
|
||||
top: 210px;
|
||||
right: 1px;
|
||||
width: 25%;
|
||||
height: 100%;
|
||||
list-style: none;
|
||||
}
|
||||
#sidebar {
|
||||
position: relative;
|
||||
z-index: 100;
|
||||
width: 95%;
|
||||
top: 10px;
|
||||
right: 10px;
|
||||
left: 10px;
|
||||
margin: 2px;
|
||||
background: silver;
|
||||
}
|
53
werc/apps/barf/pub/img.css
Executable file
53
werc/apps/barf/pub/img.css
Executable file
|
@ -0,0 +1,53 @@
|
|||
/* img.stanleylieber.com */
|
||||
body { display: flex; flex-wrap: wrap; font-family: sans; }
|
||||
header { flex-basis: 99%; flex-shrink: 0; padding-left: 1em; padding-bottom: 1em; }
|
||||
article { flex-basis: 99%; padding: 0; }
|
||||
footer { flex-basis: 99%; flex-shrink: 0; }
|
||||
header nav { display: flex; justify-content: space-between; }
|
||||
footer { display: flex; justify-content: space-between; }
|
||||
|
||||
body { margin:0; padding: 0; font-size: 10pt; font-family: Helvetica, Verdana, Arial, 'Liberation Sans', FreeSans, sans-serif; background-color: #000000; color: #FFFFFF; }
|
||||
a { text-decoration: none; color: #FFFFFF; background-color: #000000; font-weight: bold; }
|
||||
a:hover { text-decoration: none; background-color: #FFFFFF; color: #000000; }
|
||||
|
||||
/* header and top bar */
|
||||
header h3 { padding-bottom: 2px; }
|
||||
header a img { vertical-align: bottom; padding-top: 1em; }
|
||||
|
||||
/* main copy */
|
||||
article { padding-left: 1em; padding-right: 1em; }
|
||||
article nav { padding-bottom: 2px; }
|
||||
article div { padding-top: 2px; padding-bottom: 2px; }
|
||||
article h1, article h2, article h3, article h4, article h5, article h6, article h7, article h8 {
|
||||
font-weight: bold; margin: 0; padding-bottom: 2px;
|
||||
}
|
||||
article a img { vertical-align: bottom; }
|
||||
article img { max-width: 100%!important; }
|
||||
article iframe { max-width: 100%!important; }
|
||||
article video { max-width: 100%!important; }
|
||||
article fieldset { color: #FFFFFF; border-color: #FFFFFF; }
|
||||
article legend { color: #FFFFFF; border-color: #FFFFFF; }
|
||||
|
||||
/* footer */
|
||||
footer > nav { margin-left: auto; padding: 1em; }
|
||||
|
||||
/* fixed-width fonts */
|
||||
pre, code { white-space: pre-wrap!important; }
|
||||
pre, code, blockquote {
|
||||
max-width: 100%!important;
|
||||
font-family: Courier, 'Lucida Console','Courier New', Serif;
|
||||
}
|
||||
|
||||
/* input */
|
||||
input, textarea, select, option {
|
||||
font-family: Sans-Serif;
|
||||
font-size: 100%;
|
||||
padding: 2px;
|
||||
border-top: solid 1px #FFFFFF;
|
||||
border-bottom: solid 1px #FFFFFF;
|
||||
border-left: solid 1px #FFFFFF;
|
||||
border-right: solid 1px #FFFFFF;
|
||||
background-color: #000000;
|
||||
color: #FFFFFF;
|
||||
margin: 2px;
|
||||
}
|
417
werc/apps/barf/pub/inri.css
Executable file
417
werc/apps/barf/pub/inri.css
Executable file
|
@ -0,0 +1,417 @@
|
|||
/* inri.net */
|
||||
body {
|
||||
font-family :'Lucida Sans Unicode','Lucida Sans', 'Trebuchet MS', 'Lucida Grande', 'Bitstream Sans Vera', Verdana, Arial, Tahoma, Helvetica, Sans-Serif;
|
||||
font-style : normal;
|
||||
padding: 2px 2em;
|
||||
line-height: 1.5em;
|
||||
font-size: 70%;
|
||||
background: #FFF;
|
||||
color: #111;
|
||||
}
|
||||
|
||||
|
||||
/* # Header # */
|
||||
.superHeader {
|
||||
color: white;
|
||||
background-color: gray;
|
||||
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: gray;
|
||||
background-color: gray;
|
||||
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: gray;
|
||||
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: gray;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
|
||||
/* # Side # */
|
||||
#side-bar {
|
||||
width: 16em;
|
||||
float: left;
|
||||
clear: left;
|
||||
border-right: 1px solid white;
|
||||
}
|
||||
|
||||
#side-bar div {
|
||||
border-bottom: 1px solid white;
|
||||
}
|
||||
|
||||
.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: gray;
|
||||
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: black;
|
||||
background-color: gray;
|
||||
border-left: gray 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: gray;
|
||||
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 white;
|
||||
}
|
||||
|
||||
#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: gray;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
#main-copy a:hover {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
#main-copy h1, #main-copy h2 {
|
||||
color: gray;
|
||||
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 gray;
|
||||
}
|
||||
|
||||
#main-copy h2 {
|
||||
font-size: 115.5%;
|
||||
border-bottom: 1px solid gray;
|
||||
}
|
||||
|
||||
#main-copy .topOfPage {
|
||||
color: gray;
|
||||
background-color: transparent;
|
||||
font-size: 91%;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
margin: 3ex 1ex 0 0;
|
||||
padding: 0;
|
||||
float: right;
|
||||
}
|
||||
|
||||
#post {
|
||||
position: relative;
|
||||
left: 23%;
|
||||
width: 76%;
|
||||
padding-top: 25px;
|
||||
padding-bottom: 25px;
|
||||
}
|
||||
|
||||
#post tr { background-color: transparent; }
|
||||
|
||||
#center {
|
||||
position: absolute;
|
||||
top: 210px;
|
||||
left: 1%;
|
||||
width: 65%;
|
||||
height: 100%;
|
||||
}
|
||||
#center h1 { font-size 8pt; font-family :'Lucida Sans Unicode','Lucida Sans', 'Trebuchet MS', 'Lucida Grande', 'Bitstream Sans Vera', Verdana, Arial, Tahoma, Helvetica, Sans-Serif; }
|
||||
|
||||
a { text-decoration: none; color: #000000; }
|
||||
a:hover { color: #111;}
|
||||
li:hover { color: #111 }
|
||||
li a { color: #000000 }
|
||||
li a:hover { color: #111; }
|
||||
ul { list-style: none; padding-left: 0px; margin: 0px }
|
||||
|
||||
h1 { font-size: 8pt; font-weight: normal; }
|
||||
h2 { font-size : 140%; }
|
||||
h3 { font-size: 120%; }
|
||||
h4 { font-size: 100%; }
|
||||
h2, h3, h1, h4 {
|
||||
font-family: Georgia,'Trebuchet MS', 'Lucida Sans', 'Lucida Grande', 'Bitstream Sans Vera', Verdana, Arial, Tahoma, Helvetica, Sans-Serif;
|
||||
color : #000000;
|
||||
margin: 0px 0px;
|
||||
padding: 2px 0px;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
input , textarea, select, option { background-color: #eee; border: none; }
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
#right {
|
||||
float: right;
|
||||
position: absolute;
|
||||
top: 210px;
|
||||
right: 1px;
|
||||
width: 34%;
|
||||
height: 100%;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
/* sidebar */
|
||||
#sidebar {
|
||||
position: relative;
|
||||
z-index: 100;
|
||||
width: 95%;
|
||||
top: 10px;
|
||||
right: 10px;
|
||||
left: 10px;
|
||||
margin: 2px;
|
||||
background: #FFFFFF;
|
||||
}
|
||||
#sidebar h2 {
|
||||
margin: 5px 0px 0px;
|
||||
padding: 4px 0px;
|
||||
font-size:100%;
|
||||
}
|
||||
#sidebar li { font-size: 8.5pt; }
|
||||
#sidebar ul { margin: 2px; }
|
||||
|
||||
/*searchform*/
|
||||
#searchform label { font-weight:bold; }
|
||||
#searchform input { width: 20%; }
|
||||
#searchform input.submit { width: 16%; }
|
||||
|
||||
#top {
|
||||
float: top;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
height: 10%;
|
||||
width: 100%
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
|
||||
/* # Footer # */
|
||||
#footer {
|
||||
font-size: 8pt;
|
||||
background-color: white;
|
||||
color: black;
|
||||
}
|
||||
#footer a { color: gray; text-decoration: none; }
|
||||
#footer a:hover { color: #111; text-decoration: none; }
|
||||
#footer table { font-size: 8pt; }
|
||||
|
||||
#footer .left {
|
||||
text-align: left;
|
||||
line-height: 1.55em;
|
||||
float: left;
|
||||
clear: left;
|
||||
}
|
||||
|
||||
#footer .right {
|
||||
text-align: right;
|
||||
line-height: 1.45em;
|
||||
}
|
||||
|
||||
/* GENERAL */
|
||||
|
||||
table {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
}
|
||||
tr {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
}
|
||||
th {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
text-align: center;
|
||||
}
|
||||
td {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
}
|
||||
|
||||
hr {
|
||||
border-width: 0px 0px 0.1em 0px;
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
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: none;
|
||||
font-style: none;
|
||||
background-color: silver;
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
62
werc/apps/barf/pub/massivefictions.css
Executable file
62
werc/apps/barf/pub/massivefictions.css
Executable file
|
@ -0,0 +1,62 @@
|
|||
/* mf */
|
||||
body {
|
||||
color: #a6a6a6;
|
||||
background-color: #626060;
|
||||
font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', 'Bitstream Sans Vera', Sans-Serif;
|
||||
font-size: 84%; /* Enables font size scaling in MSIE */
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
a { text-decoration: none; color: #a6a6a6; }
|
||||
a:hover { background-color: #a6a6a6; color: #626060; text-decoration: none; }
|
||||
a img { display: block; border: 0 none; }
|
||||
li:hover { background-color: #a6a6a6; color: #626060; text-decoration: none; }
|
||||
li a { color: #a6a6a6 }
|
||||
li a:hover { background-color: #a6a6a6; color: #626060; text-decoration: none; }
|
||||
li ul { padding-left: 0.6em !important; }
|
||||
h1 { font-size: 10pt; font-weight: normal; }
|
||||
h2 { font-size: 9pt; font-weight: normal; }
|
||||
input , textarea, select, option { background-color: #a6a6a6; border: none; }
|
||||
table { border: none; background-color: transparent; }
|
||||
th {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
text-align: center;
|
||||
}
|
||||
tr:nth-child(odd) { background-color: transparent; }
|
||||
td {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
}
|
||||
hr {
|
||||
border-width: 0px 0px 0.1em 0px;
|
||||
border-color: transparent;
|
||||
}
|
||||
pre, code, blockquote {
|
||||
font-family: Courier, 'Lucida Console','Courier New', Serif;
|
||||
margin-left: 2em;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
blockquote {
|
||||
border-left: none;
|
||||
font-style: none;
|
||||
background-color: #a6a6a6;
|
||||
}
|
||||
#header {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
#center {
|
||||
width: 500px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
#center h1 { font-size 9pt; }
|
||||
#footer {
|
||||
font-size: 8pt;
|
||||
background-color: #626060;
|
||||
color: #a6a6a6;
|
||||
}
|
||||
#footer a { color: #a6a6a6; text-decoration: none; }
|
||||
#footer a:hover { color: #626060; text-decoration: none; }
|
||||
#footer table { font-size: 8pt; }
|
58
werc/apps/barf/pub/okturing.css
Executable file
58
werc/apps/barf/pub/okturing.css
Executable file
|
@ -0,0 +1,58 @@
|
|||
/* okturing.com */
|
||||
body { display: flex; flex-wrap: wrap; font-family: sans; }
|
||||
header { flex-basis: 100%; flex-shrink: 0; }
|
||||
article { flex-basis: 100%; padding: 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: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', 'Bitstream Sans Vera', Sans-Serif; background-color: #FFFFFF; color: #000000; }
|
||||
a:hover { text-decoration: none; background-color: #FFFFFF; color: #000000; }
|
||||
|
||||
/* header and top bar */
|
||||
header nav { background-color: #FFFFFF; color: #000000; padding: 0em; border-bottom: 2px solid #FFFFFF; font-size: 91%; }
|
||||
header h1 { background-color: #FFFFFF; color: #000000; margin: 0; border-bottom: 2px solid #FFFFFF; font-weight: normal; padding: 0.25ex; font-size: 233%; }
|
||||
|
||||
/* sidebar */
|
||||
body > nav { border-right: 1px solid #FFFFFF; padding: 0; }
|
||||
body > nav > div { border-bottom: 1px solid #FFFFFF; }
|
||||
body > nav > div a { background-color: #00ff00; color: #000000; display: block; text-transform: capitalize; font-weight: bold; padding: 0.25em 1ex 0.25em 2mm; font-size: 102%}
|
||||
body > nav > div a:hover { color: #FFFFFF; background-color: #000000 border-left: #FFFFFF 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: 1em; }
|
||||
article h1, article h2 { color: #000000; font-weight: bold; margin: 2em 0 0 0; border-bottom: 2px solid #FFFFFF; }
|
||||
article h3, article h4, article h5 { #000000; font-weight: bold; margin: 2em 0 0 0; }
|
||||
article h6, article h7, article h8 { color: #000000; font-weight: bold; margin: 2em 0 0 0; }
|
||||
article a { background-color: #FFFFFF; color: #000000; text-decoration: none; }
|
||||
article a:hover { text-decoration: none; background-color: #000000; color: #FFFFFF; }
|
||||
article a img { display: block; border: 0 none; }
|
||||
|
||||
/* footer */
|
||||
footer { color: #000000; background-color: #FFFFFF; }
|
||||
footer a { background-color: #FFFFFF; color: #000000; }
|
||||
footer div { padding: 1em; }
|
||||
|
||||
input, textarea, select, option {
|
||||
font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', 'Bitstream Sans Vera', Sans-Serif;
|
||||
font-size:100%;
|
||||
padding: 2px;
|
||||
background : #eee;
|
||||
color : #111;
|
||||
border: 1px solid #fff;
|
||||
margin: 2px;
|
||||
}
|
||||
|
||||
pre, code, blockquote {
|
||||
white-space: pre-wrap;
|
||||
padding-left: 2em;
|
||||
font-family: Courier, 'Lucida Console','Courier New', Serif;
|
||||
}
|
345
werc/apps/barf/pub/osx.css
Executable file
345
werc/apps/barf/pub/osx.css
Executable file
|
@ -0,0 +1,345 @@
|
|||
/* osx.stanleylieber.com */
|
||||
|
||||
body {
|
||||
font-family :Helvetica, Verdana, Arial, Sans-Serif;
|
||||
font-style : normal;
|
||||
padding: 2px 2em;
|
||||
line-height: 1.5em;
|
||||
font-size: 70%;
|
||||
background: #FFF;
|
||||
color: #111;
|
||||
}
|
||||
|
||||
/* font styles */
|
||||
a { text-decoration: none; color: #000000; }
|
||||
a:hover { background: #7600FC; color: #fff; }
|
||||
li:hover { color: #000000; }
|
||||
li a { color: #000000; }
|
||||
li a:hover { background: #7600FC; color: #fff; }
|
||||
ul { list-style: none; padding-left: 0px; margin: 0px }
|
||||
p {
|
||||
font-size : 100%;
|
||||
font-style : normal;
|
||||
padding: 0px;
|
||||
}
|
||||
h2 {
|
||||
font-size : 140%;
|
||||
}
|
||||
h3 {
|
||||
font-size: 120%;
|
||||
}
|
||||
h4 {
|
||||
font-size: 100%;
|
||||
}
|
||||
h2, h3, h1, h4 {
|
||||
font-family: Helvetica, Verdana, Arial, Sans-Serif;
|
||||
color : #000000;
|
||||
margin: 0px 0px;
|
||||
padding: 2px 0px;
|
||||
clear: both;
|
||||
}
|
||||
/* end font styles */
|
||||
|
||||
hr {
|
||||
border: 1px solid #fff;
|
||||
}
|
||||
|
||||
blockquote, code {
|
||||
background : #eee;
|
||||
padding: 6px;
|
||||
border-left: 3px solid #eee;
|
||||
}
|
||||
|
||||
code, pre {
|
||||
font-family: Courier, 'Lucida Console','Courier New', Sans-Serif;
|
||||
}
|
||||
|
||||
#admin_banner {
|
||||
position: relative;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#admin_body {
|
||||
position: relative;
|
||||
top: 100px;
|
||||
left: 10px;
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
#admin_frames {
|
||||
height: 100%;
|
||||
float: top;
|
||||
|
||||
/* for ie */
|
||||
margin: 0;
|
||||
overflow: auto;
|
||||
/* end for ie */
|
||||
|
||||
}
|
||||
|
||||
#admin_index_body {
|
||||
position: relative;
|
||||
top: 100px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
|
||||
#admin_menu {
|
||||
position: relative;
|
||||
left: 10px;
|
||||
width: 90%;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
#admin_table {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
width: 90%;
|
||||
border-collapse: collapse;
|
||||
border-color: #111;
|
||||
font-family: sans-serif;
|
||||
font-size: 9pt;
|
||||
}
|
||||
|
||||
#admin_table td {
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#admin_table th {
|
||||
background: #111;
|
||||
color: gray;
|
||||
}
|
||||
|
||||
#bottom {
|
||||
float: bottom;
|
||||
position: absolute;
|
||||
bottom: 10px;
|
||||
}
|
||||
|
||||
#button input.submit {
|
||||
background: #111;
|
||||
color: gray;
|
||||
border-top: solid 1px #111;
|
||||
border-bottom: solid 1px #111;
|
||||
border-left: solid 1px #111;
|
||||
border-right: solid 1px #111;
|
||||
width: 15%;
|
||||
}
|
||||
|
||||
#center {
|
||||
position: absolute;
|
||||
top: 155px;
|
||||
left: 1%;
|
||||
width: 65%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#divider {
|
||||
background: #111;
|
||||
height: 1px;
|
||||
}
|
||||
|
||||
/*forms*/
|
||||
input , textarea, select, option {
|
||||
font-family : Helvetica, Verdana, Arial, Sans-Serif;
|
||||
font-size:100%;
|
||||
padding: 2px;
|
||||
background : #eee;
|
||||
color : #111;
|
||||
border: 1px solid #fff;
|
||||
margin: 2px;
|
||||
}
|
||||
fieldset, legend {
|
||||
background:transparent;
|
||||
color : #111;
|
||||
border: none;
|
||||
padding: 5px;
|
||||
}
|
||||
label, legend {
|
||||
font-weight:normal;
|
||||
}
|
||||
|
||||
#header {
|
||||
float: top;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 17%;
|
||||
height: 100%;
|
||||
font-size: 24pt;
|
||||
background: #7600FC;
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
#header a {
|
||||
background: #7600FC;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#left {
|
||||
float: left;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 10%;
|
||||
width: 15%;
|
||||
height: 100%;
|
||||
list-style: none;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
#meta {
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
#page_frames {
|
||||
width: 100%;
|
||||
float: left;
|
||||
|
||||
/* for ie */
|
||||
margin: 0;
|
||||
overflow: auto;
|
||||
/* end for ie */
|
||||
|
||||
}
|
||||
|
||||
#page_category {
|
||||
position: relative;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#page_list {
|
||||
text-align: right;
|
||||
font-size: 9pt;
|
||||
}
|
||||
|
||||
#page_login {
|
||||
position: relative;
|
||||
text-align: right;
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
#page_upload {
|
||||
background: #111; color: #444; font-weight: bold
|
||||
}
|
||||
|
||||
#post {
|
||||
position: relative;
|
||||
left: 13%;
|
||||
width: 86%;
|
||||
padding-bottom: 100px;
|
||||
}
|
||||
|
||||
#post_body {
|
||||
position: relative;
|
||||
top: 10px;
|
||||
bottom: 10px;
|
||||
left: 10px;;
|
||||
}
|
||||
|
||||
#post_date {
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
#post_meta {
|
||||
margin-left: 2px;
|
||||
color: #111;
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
#post_tags {
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
#post_thumb {
|
||||
margin-top: 5px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
#post_title {
|
||||
border: 1px;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
#post_title a {
|
||||
background: red;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#post_title a:hover {
|
||||
background: #7600FC;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#post_title h2 {
|
||||
font-weight: 100;
|
||||
}
|
||||
|
||||
#registration_body {
|
||||
left: 10px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
#right {
|
||||
float: right;
|
||||
position: absolute;
|
||||
top: 150px;
|
||||
right: 1%;
|
||||
width: 33%;
|
||||
height: 100%;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
#rss {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
text-align: center;
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
/* sidebar */
|
||||
#sidebar {
|
||||
position: relative;
|
||||
z-index: 100;
|
||||
width: 90%;
|
||||
top: 10px;
|
||||
right: 10px;
|
||||
left: 10px;
|
||||
margin: 2px;
|
||||
background: #FFFFFF;
|
||||
}
|
||||
#sidebar h2 {
|
||||
margin: 5px 0px 0px;
|
||||
padding: 4px 0px;
|
||||
font-size:100%;
|
||||
}
|
||||
#sidebar ul {
|
||||
margin: 2px;
|
||||
}
|
||||
|
||||
/*searchform*/
|
||||
#searchform label {
|
||||
font-weight:bold;
|
||||
}
|
||||
#searchform input#s {
|
||||
width: 40%;
|
||||
}
|
||||
#searchform input.submit {
|
||||
width: 16%;
|
||||
}
|
||||
|
||||
#top {
|
||||
float: top;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
height: 10%;
|
||||
width: 100%
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.warning {
|
||||
color: #111;
|
||||
font-weight: bold;
|
||||
}
|
67
werc/apps/barf/pub/other.css
Executable file
67
werc/apps/barf/pub/other.css
Executable file
|
@ -0,0 +1,67 @@
|
|||
/* other */
|
||||
body {
|
||||
color: blue;
|
||||
background-color: white;
|
||||
font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', 'Bitstream Sans Vera', Sans-Serif;
|
||||
font-size: 84%; /* Enables font size scaling in MSIE */
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
a { text-decoration: none; color: blue; }
|
||||
a:hover { color: purple; background-color: white; text-decoration: none; }
|
||||
li:hover { color: purple; background-color: white; text-decoration: none; }
|
||||
li a { color: blue; }
|
||||
li a:hover { color: purple; background-color: white; text-decoration: none; }
|
||||
h1 { font-size: 10pt; font-weight: normal; }
|
||||
h2 { font-size: 9pt; font-weight: normal; }
|
||||
input , textarea, select, option { background-color: #eee; border: none; }
|
||||
li ul {
|
||||
padding-left: 0.6em !important;
|
||||
}
|
||||
table { border: none; background-color: transparent; }
|
||||
th {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
text-align: center;
|
||||
}
|
||||
tr:nth-child(odd) { background-color: transparent; }
|
||||
td {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
}
|
||||
hr {
|
||||
border-width: 0px 0px 0.1em 0px;
|
||||
border-color: transparent;
|
||||
}
|
||||
pre, code, blockquote {
|
||||
Courier, 'Lucida Console','Courier New', Serif;
|
||||
margin-left: 2em;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
blockquote {
|
||||
border-left: none;
|
||||
font-style: none;
|
||||
background-color: #eee;
|
||||
}
|
||||
#center {
|
||||
width: 500px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
line-height: 0;
|
||||
}
|
||||
/* #center p {
|
||||
line-height: 1;
|
||||
-webkit-margin-before: 0px;
|
||||
-webkit-margin-after: 0px;
|
||||
} */
|
||||
#footer {
|
||||
font-size: 8pt;
|
||||
background-color: white;
|
||||
color: blue;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
#footer a { color: blue; text-decoration: none; }
|
||||
#footer a:hover { color: purple; background-color: white; text-decoration: none; }
|
||||
#footer table { font-size: 8pt; }
|
||||
#text { line-height: 1; }
|
29
werc/apps/barf/pub/read.css
Executable file
29
werc/apps/barf/pub/read.css
Executable file
|
@ -0,0 +1,29 @@
|
|||
/* black */
|
||||
header { flex-basis: 99%; flex-shrink: 0; padding-left: 1em; padding-bottom: 1em; }
|
||||
header h3 { padding-bottom: 2px; }
|
||||
header a img { vertical-align: bottom; padding-top: 1em; }
|
||||
body { font-family: Helvetica, Verdana, Arial, 'Liberation Sans', FreeSans, sans-serif; background-color: #000000; color: #FFFFFF; }
|
||||
a { text-decoration: none; color: #FFFFFF; background-color: #000000; font-weight: bold; }
|
||||
a:hover { text-decoration: none; background-color: #FFFFFF; color: #000000; }
|
||||
/* footer */
|
||||
footer > nav { margin-left: auto; padding: 1em; }
|
||||
|
||||
/* fixed-width fonts */
|
||||
pre, code { white-space: pre-wrap!important; }
|
||||
pre, code, blockquote {
|
||||
max-width: 100%!important;
|
||||
font-family: Courier, 'Lucida Console','Courier New', Serif;
|
||||
}
|
||||
/* input */
|
||||
input, textarea, select, option {
|
||||
font-family: Sans-Serif;
|
||||
font-size: 100%;
|
||||
padding: 2px;
|
||||
border-top: solid 1px #FFFFFF;
|
||||
border-bottom: solid 1px #FFFFFF;
|
||||
border-left: solid 1px #FFFFFF;
|
||||
border-right: solid 1px #FFFFFF;
|
||||
background-color: #000000;
|
||||
color: #FFFFFF;
|
||||
margin: 2px;
|
||||
}
|
64
werc/apps/barf/pub/stanleylieber.css
Executable file
64
werc/apps/barf/pub/stanleylieber.css
Executable file
|
@ -0,0 +1,64 @@
|
|||
/* nothing */
|
||||
body {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
color: black;
|
||||
background-color: white;
|
||||
font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', 'Bitstream Sans Vera', Sans-Serif;
|
||||
font-size: 84%; /* Enables font size scaling in MSIE */
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
header, article, footer { flex-basis: 100%; }
|
||||
a { text-decoration: none; color: gray; }
|
||||
a:hover { color: #111; text-decoration: none; }
|
||||
a img { display: block; border: 0 none; }
|
||||
li:hover { color: #111; text-decoration: none; }
|
||||
li a { color: gray }
|
||||
li a:hover { color: #111; text-decoration: none; }
|
||||
li ul { padding-left: 0.6em !important; }
|
||||
h1 { font-size: 10pt; font-weight: normal; }
|
||||
h2 { font-size: 9pt; font-weight: normal; }
|
||||
input , textarea, select, option { background-color: gray; border: none; }
|
||||
table { border: none; background-color: transparent; }
|
||||
th {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
text-align: center;
|
||||
}
|
||||
tr:nth-child(odd) { background-color: transparent; }
|
||||
td {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
}
|
||||
|
||||
hr {
|
||||
border-width: 0px 0px 0.1em 0px;
|
||||
border-color: transparent;
|
||||
}
|
||||
pre, code, blockquote {
|
||||
font-family: Courier, 'Lucida Console','Courier New', Serif;
|
||||
margin-left: 2em;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
blockquote {
|
||||
border-left: none;
|
||||
font-style: none;
|
||||
background-color: gray;
|
||||
}
|
||||
#center {
|
||||
width: 500px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
#center h1 { font-size 9pt; }
|
||||
#footer {
|
||||
font-size: 8pt;
|
||||
background-color: white;
|
||||
color: gray;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
#footer a { color: gray; text-decoration: none; }
|
||||
#footer a:hover { color: #111; text-decoration: none; }
|
||||
#footer table { font-size: 8pt; }
|
195
werc/apps/barf/pub/url.css
Executable file
195
werc/apps/barf/pub/url.css
Executable file
|
@ -0,0 +1,195 @@
|
|||
/* url.stanleylieber.com */
|
||||
|
||||
body {
|
||||
font-family: Vera, Helvetica, Verdana, Arial, Sans-Serif;
|
||||
font-style: normal;
|
||||
padding: 2px 2em;
|
||||
line-height: 1.5em;
|
||||
font-size: 70%;
|
||||
background: #FFFFFF;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
a { text-decoration: none; color: #000000; }
|
||||
a:hover { background: #EEEEEE;}
|
||||
li:hover { background: #EEEEEE; }
|
||||
li a:hover { background: #EEEEEE; }
|
||||
ul { list-style: none; }
|
||||
|
||||
p {
|
||||
font-size : 100%;
|
||||
font-style : normal;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
h2 { font-size : 140%; }
|
||||
h3 { font-size: 120%; }
|
||||
h4 { font-size: 100%; }
|
||||
h2, h3, h1, h4 {
|
||||
margin: 0px 0px;
|
||||
padding: 2px 0px;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
hr { border: 1px solid #fff; }
|
||||
|
||||
input {
|
||||
background-color: #EEEEEE;
|
||||
}
|
||||
|
||||
code, pre { font-family: Courier, 'Lucida Console','Courier New', Sans-Serif; }
|
||||
blockquote, code {
|
||||
background : #eee;
|
||||
padding: 6px;
|
||||
border-left: 3px solid #eee;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 10px;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-collapse: collapse;
|
||||
border-color: #000000;
|
||||
background: #FFFFFF;
|
||||
}
|
||||
|
||||
textarea {
|
||||
height: 300px;
|
||||
background-color: #EEEEEE;
|
||||
}
|
||||
|
||||
tr {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-collapse: collapse;
|
||||
border-color: #000000;
|
||||
}
|
||||
|
||||
#add {
|
||||
position: relative;
|
||||
top: 65px;
|
||||
left: 9%;
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
#blank {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-collapse: collapse;
|
||||
border-color: #FFFFFF;
|
||||
}
|
||||
|
||||
#bottom {
|
||||
float: bottom;
|
||||
position: absolute;
|
||||
bottom: 0px;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#center {
|
||||
position: relative;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
top: 130px;
|
||||
width: 90%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#edit {
|
||||
width: 750px;
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
#footer {
|
||||
position: relative;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
bottom: 100px;
|
||||
}
|
||||
|
||||
#header {
|
||||
position: relative;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
top: 40px;
|
||||
width: 83%;
|
||||
}
|
||||
|
||||
#logo { font-size: 40pt; color: #DDDDDD; }
|
||||
#logo a { font-size: 40pt; color: #CCCCCC; }
|
||||
#logo a:hover { background: #EEEEEE;}
|
||||
|
||||
#list {
|
||||
position: relative;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
top: 90px;
|
||||
width: 90%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#meta { font-size: 8pt; }
|
||||
|
||||
#page_list {
|
||||
margin: 20px;
|
||||
text-align: right;
|
||||
font-size: 9pt;
|
||||
}
|
||||
|
||||
#post {
|
||||
position: relative;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
#post_meta { text-align: center; }
|
||||
|
||||
#post_date {
|
||||
width: 200px;
|
||||
text-align: center;
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
#post_edit {
|
||||
width: 100px;
|
||||
text-align: center;
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
#post_table {
|
||||
position: relative;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
padding: 0px;
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
#post_tags {
|
||||
text-align: left;
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
#post_title {
|
||||
text-align: left;
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
#search {
|
||||
position: absolute;
|
||||
top: 90px;
|
||||
right: 9%;
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
#top {
|
||||
float: top;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
height: 100px;
|
||||
width: 100%;
|
||||
}
|
||||
|
1
werc/apps/barf/src/1/body
Normal file
1
werc/apps/barf/src/1/body
Normal file
|
@ -0,0 +1 @@
|
|||
Trust, but verify.
|
1
werc/apps/barf/src/1/date
Normal file
1
werc/apps/barf/src/1/date
Normal file
|
@ -0,0 +1 @@
|
|||
Thu Aug 25 18:35:52 CDT 2011
|
1
werc/apps/barf/src/1/link
Normal file
1
werc/apps/barf/src/1/link
Normal file
|
@ -0,0 +1 @@
|
|||
http://plan9.stanleylieber.com/9front
|
0
werc/apps/barf/src/1/tags/demo
Normal file
0
werc/apps/barf/src/1/tags/demo
Normal file
0
werc/apps/barf/src/1/tags/random
Normal file
0
werc/apps/barf/src/1/tags/random
Normal file
0
werc/apps/barf/src/1/tags/theory
Normal file
0
werc/apps/barf/src/1/tags/theory
Normal file
1
werc/apps/barf/src/1/title
Normal file
1
werc/apps/barf/src/1/title
Normal file
|
@ -0,0 +1 @@
|
|||
This is a BULGE demo post.
|
3
werc/apps/barf/tags
Executable file
3
werc/apps/barf/tags
Executable file
|
@ -0,0 +1,3 @@
|
|||
1/tags/theory
|
||||
1/tags/random
|
||||
1/tags/demo
|
148
werc/apps/blagh/app.rc
Normal file
148
werc/apps/blagh/app.rc
Normal file
|
@ -0,0 +1,148 @@
|
|||
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_blog_only_pull '')
|
||||
conf_blog_only_pull=0
|
||||
|
||||
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 && ! ~ $"conf_blog_only_pull '1') {
|
||||
editor_mode=on
|
||||
if(~ $"post_arg_date '')
|
||||
post_date=`{/bin/date -I|sed 's,-,/,g'}
|
||||
if not
|
||||
post_date=$post_arg_date
|
||||
ll_add handlers_bar_left echo '<a href="'$blagh_uri'new_post">Make a new post</a>'
|
||||
}
|
||||
|
||||
if(~ $req_path $blagh_uri) {
|
||||
handler_body_main=blagh_body
|
||||
u=$blagh_uri'index'
|
||||
extraHeaders=$"extraHeaders ^ \
|
||||
'<link rel="alternate" type="application/atom+xml" title="ATOM" href="'$"u'.atom" />
|
||||
<link rel="alternate" type="application/rss+xml" title="RSS" href="'$"u'.rss" />
|
||||
<link rel="alternate" type="application/json" title="JSON" href="'$"blagh_uri'feed.json" />'
|
||||
}
|
||||
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 {
|
||||
echo '<div class="bfeed">'
|
||||
if (! ~ $"blogTitle '')
|
||||
echo '<h1>'$"blogTitle'</h1>'
|
||||
|
||||
# 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 '<div style="text-align:right">(<a href="index.rss">RSS Feed</a>|<a href="index.atom">Atom Feed</a>)</div>'
|
||||
|
||||
# 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 |
|
||||
sed 's!\([0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]\)!<div class="date">&</div>!'
|
||||
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.
|
||||
echo '</div>'
|
||||
}
|
||||
|
||||
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'
|
||||
}
|
58
werc/apps/blagh/atom.tpl
Normal file
58
werc/apps/blagh/atom.tpl
Normal file
|
@ -0,0 +1,58 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
%{
|
||||
# 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}'}}}
|
||||
%}
|
||||
|
||||
<feed xmlns="http://www.w3.org/2005/Atom"
|
||||
xmlns:thr="http://purl.org/syndication/thread/1.0">
|
||||
|
||||
% if(! ~ $"conf_blog_pubsubdub_hub '') {
|
||||
% echo '<link rel="hub" href="'$conf_blog_pubsubdub_hub'" />'
|
||||
% }
|
||||
|
||||
<link rel="self" href="%($base_url^$req_path%)"/>
|
||||
<id>%($base_url^$req_path%)</id>
|
||||
<icon><![CDATA[/favicon.ico]]></icon>
|
||||
|
||||
<title><![CDATA[%($siteTitle%)]]></title>
|
||||
<subtitle><![CDATA[%($siteSubTitle%)]]></subtitle>
|
||||
|
||||
<updated>%($fupdated%)</updated>
|
||||
<link href="."/>
|
||||
|
||||
% for(f in `{get_post_list $blagh_root$blagh_dirs}) {
|
||||
% statpost $f
|
||||
|
||||
<entry>
|
||||
% # Maybe we should be smarter, see: http://diveintomark.org/archives/2004/05/28/howto-atom-id, example: <id>tag:intertwingly.net,2004:2899</id>
|
||||
<id>%($post_uri%)</id>
|
||||
<link href="%($post_uri%)"/>
|
||||
<title><![CDATA[%($title%)]]></title>
|
||||
% # <link rel="replies" href="2899.atom" thr:count="0"/>
|
||||
<author><name><![CDATA[%($by%)]]></name></author>
|
||||
|
||||
<content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
|
||||
<![CDATA[%($summary%)]]>
|
||||
</div></content>
|
||||
|
||||
% # rfc3339 date when entry was last updated.
|
||||
% eupdated=`{ndate -a `{date `{mtime $f | awk '{print $1}'}}}
|
||||
<updated>%($eupdated%)</updated>
|
||||
</entry>
|
||||
|
||||
% }
|
||||
|
||||
</feed>
|
||||
|
||||
% exit
|
20
werc/apps/blagh/convert.rc
Executable file
20
werc/apps/blagh/convert.rc
Executable file
|
@ -0,0 +1,20 @@
|
|||
#!/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
|
||||
|
||||
}
|
35
werc/apps/blagh/jsonfeed.tpl
Normal file
35
werc/apps/blagh/jsonfeed.tpl
Normal file
|
@ -0,0 +1,35 @@
|
|||
{
|
||||
"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
|
||||
|
11
werc/apps/blagh/new_post.tpl
Normal file
11
werc/apps/blagh/new_post.tpl
Normal file
|
@ -0,0 +1,11 @@
|
|||
<div>
|
||||
% notices_handler
|
||||
<form method="POST"><fieldset>
|
||||
<legend>Submit a new blog post</legend>
|
||||
<textarea cols="94" rows=16" name="body">%($"post_arg_body%)</textarea><br />
|
||||
<label>Title: <input size="64" type="text" name="title" value="%($"post_arg_title%)" /></label>
|
||||
<label>Id: <input size="8" type="text" name="id" value="%($"post_arg_id%)" /></label>
|
||||
<label>Date: <input size="10" maxlength="10" type="text" name="date" value="%($"post_date%)" /></label>
|
||||
<input type="submit" value="Post" />
|
||||
</fieldset></form>
|
||||
</div>
|
43
werc/apps/blagh/rss20.tpl
Normal file
43
werc/apps/blagh/rss20.tpl
Normal file
|
@ -0,0 +1,43 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
%{
|
||||
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} }}
|
||||
}
|
||||
|
||||
%}
|
||||
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<atom:link href="%($base_url^$req_path%)" rel="self" type="application/rss+xml" />
|
||||
<title><![CDATA[%($siteTitle%)]]></title>
|
||||
<link>%($base_url^$req_path%)</link>
|
||||
<description><![CDATA[%($blogDesc%)]]></description>
|
||||
<language>en-us</language>
|
||||
<generator><![CDATA[Tom Duff's rc, and Kris Maglione's clever hackery]]></generator>
|
||||
%{
|
||||
# <webMaster>uriel99+rss@gmail.com (Uriel)</webMaster>
|
||||
# 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 '<lastBuildDate>'$"lbd'</lastBuildDate>'
|
||||
# rfc2822 publication date for content in the channel.
|
||||
pubdate=`{ndate -m}
|
||||
for(f in `{get_post_list $blagh_root$blagh_dirs}){
|
||||
statpost $f
|
||||
%}
|
||||
<item>
|
||||
<title><![CDATA[%($title%)]]></title>
|
||||
<author><![CDATA[%($by%)@noreply.cat-v.org (%($by%))]]></author>
|
||||
<link>%($post_uri%)</link>
|
||||
<guid isPermaLink="true">%($post_uri%)</guid>
|
||||
<pubDate>%($pubdate%)</pubDate>
|
||||
<description> %($summary%) </description>
|
||||
</item>
|
||||
% }
|
||||
</channel>
|
||||
</rss>
|
103
werc/apps/bridge/app.rc
Executable file
103
werc/apps/bridge/app.rc
Executable file
|
@ -0,0 +1,103 @@
|
|||
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 '<hr><p>To post a comment you need to <a href="/_users/login">login</a> first.</p>'
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
}
|
13
werc/apps/bridge/comments_list.tpl
Executable file
13
werc/apps/bridge/comments_list.tpl
Executable file
|
@ -0,0 +1,13 @@
|
|||
<hr>
|
||||
<h2>Comments</h2>
|
||||
|
||||
% for(c in `{ls $comments_dir/}) {
|
||||
% if(test -s $c/body) {
|
||||
<div class="comment">
|
||||
<h5>By: <i>%(`{cat $c/user}%)</i></b> (%(`{cat $c/posted}%))
|
||||
</h5>
|
||||
% cat $c/body | escape_html | sed 's,$,<br>,'
|
||||
<hr></div>
|
||||
% }
|
||||
% }
|
||||
|
37
werc/apps/bridge/foot.tpl
Executable file
37
werc/apps/bridge/foot.tpl
Executable file
|
@ -0,0 +1,37 @@
|
|||
<hr>
|
||||
|
||||
% notices_handler
|
||||
<form action="" method="post">
|
||||
<textarea name="comment_text" id="comment_text" cols="80" rows="16">%($"saved_comment_text%)</textarea>
|
||||
<br>
|
||||
<input type="submit" name="bridge_post" value="Post a comment">
|
||||
|
||||
% if(~ $#logged_user 0) {
|
||||
% if(~ $#allow_new_user_comments 1) {
|
||||
<label>New user name:
|
||||
<input type="text" name="comment_user" value="%($"post_arg_comment_user%)">
|
||||
</label>
|
||||
|
||||
<label>Password:
|
||||
<input type="password" name="comment_passwd" value="">
|
||||
</label>
|
||||
|
||||
<label>Repeat password:
|
||||
<input type="password" name="comment_passwd2" value="">
|
||||
</label>
|
||||
<div style="font-size: 70%">
|
||||
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 <a href="/_users/login">login</a> before posting.
|
||||
</div>
|
||||
% }
|
||||
% if not if(~ $#bridge_anon_comments 1) {
|
||||
<label>Is <a href="http://glenda.cat-v.org">Glenda a cute bunny</a>?
|
||||
<select name='ima_robot'>
|
||||
<option value="yes">No</option>
|
||||
<option value="not">Yes</option>
|
||||
<option value="foobar">I hate bunnies!</option>
|
||||
<option value="robot">I'm a robot!</option>
|
||||
</select>
|
||||
</label>
|
||||
% }
|
||||
% }
|
||||
</form>
|
40
werc/apps/dirdir/app.rc
Executable file
40
werc/apps/dirdir/app.rc
Executable file
|
@ -0,0 +1,40 @@
|
|||
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 <a href="'$"req_path'">'$"req_path'</a>!'
|
||||
}
|
25
werc/apps/dirdir/edit.tpl
Executable file
25
werc/apps/dirdir/edit.tpl
Executable file
|
@ -0,0 +1,25 @@
|
|||
<div>
|
||||
<h1>Editing: <a href="%($req_path%)">%($req_path%)</a></h1>
|
||||
<br>
|
||||
<form action="" method="POST">
|
||||
<textarea name="edit_text" id="edit_text" cols="80" rows="43">%{
|
||||
# FIXME Extra trailing new lines get added to the content somehow, should avoid it.
|
||||
if(~ $#post_arg_edit_text 0 && test -f $dirdir_file)
|
||||
cat $dirdir_file | escape_html
|
||||
if not
|
||||
echo -n $post_arg_edit_text | escape_html
|
||||
|
||||
%}</textarea>
|
||||
<br>
|
||||
<input type="submit" name="dirdir_save" value="Save">
|
||||
<input type="submit" name="dirdir_preview" value="Preview">
|
||||
<small>DirDir documents are written using <a href="http://daringfireball.net/projects/markdown/syntax">Markdown syntax</a>.</small>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
% if(! ~ $"post_arg_dirdir_preview '') {
|
||||
<h2>Preview:</h2>
|
||||
<div id="preview">
|
||||
% echo $post_arg_edit_text | $formatter
|
||||
</div>
|
||||
% }
|
3
werc/apps/dirdir/sidebar_controls.tpl
Executable file
3
werc/apps/dirdir/sidebar_controls.tpl
Executable file
|
@ -0,0 +1,3 @@
|
|||
<form action="" method="POST">
|
||||
<input type="submit" name="dirdir_edit" value="Edit page" />
|
||||
</form>
|
20
werc/apps/duckduckgo/HOWTO
Normal file
20
werc/apps/duckduckgo/HOWTO
Normal file
|
@ -0,0 +1,20 @@
|
|||
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
|
||||
|
30
werc/apps/duckduckgo/app.rc
Executable file
30
werc/apps/duckduckgo/app.rc
Executable file
|
@ -0,0 +1,30 @@
|
|||
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 '
|
||||
<h1>Site search</h1>
|
||||
<h2>using DuckDuckGo</h2>
|
||||
<form action="/_search/" method="POST">
|
||||
<label for="searchtext">Site search:</label>
|
||||
<input type="text" id="searchtext" name="q" placeholder="Search text...">
|
||||
<input type="submit" value="Search">
|
||||
</form>'
|
||||
|
||||
}
|
||||
|
3
werc/apps/duckduckgo/footer.inc.sample
Normal file
3
werc/apps/duckduckgo/footer.inc.sample
Normal file
|
@ -0,0 +1,3 @@
|
|||
<div><a href="http://werc.cat-v.org">Powered by werc</a></div>
|
||||
|
||||
<div><form action="/_search/" method="POST"><label for="searchtext">Site search:</label> <input type="text" id="searchtext" name="q" placeholder="Enter search text..."><input type="submit" display="Search"></form></div>
|
10
werc/apps/hello/app.rc
Executable file
10
werc/apps/hello/app.rc
Executable file
|
@ -0,0 +1,10 @@
|
|||
fn hello_init {
|
||||
if(~ $req_path /hello) {
|
||||
handler_body_main='hello_body'
|
||||
pageTitle='Hi title!'
|
||||
}
|
||||
}
|
||||
|
||||
fn hello_body {
|
||||
echo 'Hello world!'
|
||||
}
|
45
werc/apps/paste/app.rc
Executable file
45
werc/apps/paste/app.rc
Executable file
|
@ -0,0 +1,45 @@
|
|||
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 '<article class="pastebox">
|
||||
<h3 style="text-align: center">pasted data is not publically indexed</h3>
|
||||
<form action="'$paste_url'" method="post" style="margin:2em">
|
||||
<textarea name="paste" cols="120" rows="20" required style="display: block; margin: 0 auto 0 auto" ></textarea><br>
|
||||
<input type="submit" name="submit" value="SUBMIT" style="display: block; margin: 0 auto 0 auto" ><br><br>
|
||||
<span style="display: none"><input type="text" name="url" value="url" > (do not change) </span>
|
||||
</form>
|
||||
</article>
|
||||
'
|
||||
}
|
89
werc/apps/wman/app.rc
Executable file
89
werc/apps/wman/app.rc
Executable file
|
@ -0,0 +1,89 @@
|
|||
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 ' ' '|'}^')\)!<a href="../\2/\1">&</a>!g' \
|
||||
| awk '/^$/ {if(n != 1) print; n=1; next} /./ {n=0; print}' \
|
||||
| col -x
|
||||
}
|
||||
|
||||
|
3
werc/apps/wman/man_page.tpl
Executable file
3
werc/apps/wman/man_page.tpl
Executable file
|
@ -0,0 +1,3 @@
|
|||
<pre>
|
||||
% wman_page_gen $wman_page_file
|
||||
</pre>
|
11
werc/apps/wman/page_list.tpl
Executable file
11
werc/apps/wman/page_list.tpl
Executable file
|
@ -0,0 +1,11 @@
|
|||
% d=`{wman_get_section_desc $wman_cat}
|
||||
<h1>Manual pages - Section %($wman_cat%): %($"d%)</h1>
|
||||
|
||||
<ul style="float:left">
|
||||
%{
|
||||
wman_ls_pages $wman_cat_path \
|
||||
| awk -F/ '{ print "<li><a href=\""$(NF)"\">"$(NF)"</a></li>" }
|
||||
NR%20 == 0 { print "</ul><ul style=\"float: left\">" }'
|
||||
%}
|
||||
</ul>
|
||||
|
20
werc/apps/wman/search.tpl
Executable file
20
werc/apps/wman/search.tpl
Executable file
|
@ -0,0 +1,20 @@
|
|||
<form action="" method="POST">
|
||||
<fieldset>
|
||||
<input type="text" name="wman_search" value="%($"s%)" />
|
||||
<input type="submit" name="go" value="Feel Lucky" />
|
||||
<input type="submit" value="Search" />
|
||||
|
||||
% if(! ~ $"post_arg_wman_search '') {
|
||||
% if(~ $"wman_search_results '') {
|
||||
No matches found for <i>'%($post_arg_wman_search%)'</i>.
|
||||
% }
|
||||
% if not {
|
||||
<ul>
|
||||
% echo $wman_search_results|awk -F/ '$(NF-1) ~ "^[0-9]+$" {printf "<li><a href=\"'$wman_base_uri'%s/%s\" />%s(%s)</a></li>", $(NF-1),$NF, $NF, $(NF-1)}'
|
||||
</ul>
|
||||
% }
|
||||
% }
|
||||
|
||||
</fieldset>
|
||||
</form>
|
||||
|
11
werc/apps/wman/section_list.tpl
Executable file
11
werc/apps/wman/section_list.tpl
Executable file
|
@ -0,0 +1,11 @@
|
|||
<h1>Manual Sections</h1>
|
||||
|
||||
<ul style="text-transform: capitalize;">
|
||||
% for(c in $wman_cat_list) {
|
||||
<li><a href="%($c%)/"><b>Section: %($c%)</b></a>
|
||||
% wman_get_section_desc $c
|
||||
% if(~ $status '' '|')
|
||||
% echo '(<a href="'$c'/intro">intro</a>)'
|
||||
</li>
|
||||
% }
|
||||
</ul>
|
45
werc/apps/xibit/README
Normal file
45
werc/apps/xibit/README
Normal file
|
@ -0,0 +1,45 @@
|
|||
Xibit (tibix) - the image gallery generator for werc
|
||||
Xibit can:
|
||||
- generate thumbnails from almost any picture format
|
||||
- generate preview images with captions
|
||||
- display them (rather brokenly for now)
|
||||
|
||||
|
||||
Dependencies:
|
||||
- Plan9port
|
||||
- Imagemagick
|
||||
- werc
|
||||
|
||||
|
||||
To make it work:
|
||||
1, clone the git repo at git://home.9souldier.org/xibit into $werc_root/apps
|
||||
2, pick a directory to serve the gallery from
|
||||
3, create an _werc and _werc/xibit directory in there, the xibit directory needs to be writable by the webserver to generate the thumbnails (at one point i'll probably make a cronjob, and then this will be optional)
|
||||
4, create an _werc/config file (readable by the webserver), that contains the options for xibit
|
||||
5, add xibit to the enabled_apps in initrc.local (or the local per-directory config file)
|
||||
That should get you going.
|
||||
|
||||
to use captions just create a directory in GALLERY/_werc/xibit called captions, make it readable by the weberver and add the captions as files, using the following naming convention:
|
||||
image.imageextension.md
|
||||
the caption handler accepts markdown formatting
|
||||
|
||||
to enable comments add the comments handler (bridge) to the enabled apps, it'll (should) automatically work with xibit
|
||||
|
||||
Config options:
|
||||
- fmts:
|
||||
file extensions recognised
|
||||
ex. fmts=(jpg gif png svg)
|
||||
- thumbsize:
|
||||
size of thumbnails to generate, accepts
|
||||
ex. thumbsize='140x'
|
||||
- previewsize:
|
||||
size of the previews to generate
|
||||
ex. previewsize='x460'
|
||||
|
||||
check_user:
|
||||
Enforce authentication
|
||||
This has been ripped out of the xibit code, if you want to enable perms enforcing, you should add the following to your config:
|
||||
if ( ! check_user) { #if fyou want to enforce per-group permissions, do "if( ! check_user $group) {"
|
||||
enabled_apps=() #maybe you want to leave some apps on, i just do this on a per-directory besis
|
||||
handler_body_main=(echo '<a href="/_users/login">please log in</a>')
|
||||
}
|
5
werc/apps/xibit/TODO
Normal file
5
werc/apps/xibit/TODO
Normal file
|
@ -0,0 +1,5 @@
|
|||
features:
|
||||
- details list index - filenames with creation, etc..
|
||||
- if format is image format but not one recognised by browsers, convert it to png for preview and thumbnail viewing
|
||||
|
||||
nice css @ http://www.area17.com/03_work/nove/photography/ and http://www.sergiojuncos.com/usa2008/large-2.html and http://jmcpherson.org/photoblog/index.php
|
91
werc/apps/xibit/app.rc
Executable file
91
werc/apps/xibit/app.rc
Executable file
|
@ -0,0 +1,91 @@
|
|||
#xibit is an app that generates image galeries for werc.
|
||||
#the license the mit license, see the license file in the distribution's root directory
|
||||
#until the time i change my mind
|
||||
#comments and suggestions can come to http://redmine.9souldier.org/projects/xibit0/issues/new or johnny@9souldier.org
|
||||
|
||||
fn conf_enable_xibit {
|
||||
xibit_uri=$conf_wd
|
||||
conf_enable_app xibit
|
||||
}
|
||||
|
||||
fn xibit_init {
|
||||
xibit_root=$sitedir$"xibit_uri
|
||||
#SOMEONE PLEASE FIXME if(! ~ $#xibit_uri 0 && test '( -d '^$"xibit_root^'/_werc/xibit ) -a ( -w '^$"xibit_root^'/_werc/xibit )' && convert -help > /dev/null) {
|
||||
if(! ~ $#xibit_uri 0 && test -d $"xibit_root/_werc/xibit && test -w $"xibit_root/_werc/xibit && which convert > /dev/null) {
|
||||
xibitdir=$xibit_root^/_werc/xibit
|
||||
xibit_uri_file=`{echo $req_path |sed 's,^.*/([^/]+)$,\1,g'}
|
||||
mkdir -p $"xibitdir/previews
|
||||
mkdir -p $"xibitdir/thumbs
|
||||
extraHeaders=($extraHeaders '<style>' `{cat apps/xibit/xibit.css} '</style>')
|
||||
if( ~ $"req_path */index */)
|
||||
handler_body_main=xibit_thumb_handler
|
||||
if not {
|
||||
xibit_img=`{echo $req_path |sed 's,^.*/([^/]+)(\.[^\.]+)?$,\1,g'}
|
||||
for(pic in $xibit_img.^$fmts){
|
||||
if(test -f $xibit_root/^$pic)
|
||||
handler_body_main=xibit_img_handler
|
||||
}
|
||||
if ( ~ $#handler_body_main 0 )
|
||||
status='xibit cant to anything here'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn xibit_thumb_handler {
|
||||
cd $xibit_root
|
||||
xibitdir=_werc/xibit
|
||||
rm $"xibitdir/dirstat.md5.tmp > /dev/null >[2] /dev/null
|
||||
if( ! ~ `{ls -l |md5sum |tee $xibitdir/dirstat.md5.tmp} `{cat $xibitdir/dirstat.md5}) {
|
||||
mv $xibitdir/dirstat.md5.tmp $xibitdir/dirstat.md5
|
||||
for(pic in `{ls *.^$fmts >[2] /dev/null}) {
|
||||
if( ! test -f $"xibitdir/thumbs/^$"pic )
|
||||
convert $pic -resize $thumbsize $xibitdir/thumbs/^$pic
|
||||
if( ! test -f $"xibitdir/previews/^$"pic )
|
||||
convert $pic -resize $previewsize $xibitdir/previews/^$pic
|
||||
|
||||
xibit_pics=($xibit_pics $pic)
|
||||
}
|
||||
}
|
||||
if not
|
||||
for(pic in `{ls *.^$fmts >[2] /dev/null})
|
||||
xibit_pics=($xibit_pics $pic)
|
||||
rm $xibitdir/dirstat.md5.tmp > /dev/null >[2] /dev/null
|
||||
cd $werc_root
|
||||
|
||||
if( ! ~ $req_path */details )
|
||||
template apps/xibit/thumbs.tpl
|
||||
if not
|
||||
template apps/xibit/details.tpl
|
||||
}
|
||||
|
||||
|
||||
fn xibit_img_handler {
|
||||
cd $xibit_root
|
||||
for(file in $xibit_uri_file.^$fmts) {
|
||||
if( test -f $file) {
|
||||
xibit_img=`{echo $file |sed 's,^.*/([^/]+),\1,g'}
|
||||
xibit_preview=_werc/xibit/previews/^$xibit_img
|
||||
if (test -r _werc/xibit/captions/^$xibit_img^.md)
|
||||
xibit_caption_file=$xibitdir^/captions/^$xibit_img^.md
|
||||
xibit_nextpic=`{next_pic $xibit_img}
|
||||
xibit_prevpic=`{prev_pic $xibit_img}
|
||||
dprint $xibit_nextpic $xibit_prevpic
|
||||
cd $werc_root
|
||||
}
|
||||
}
|
||||
cd $werc_root
|
||||
xibit_thumb_handler
|
||||
}
|
||||
|
||||
fn prev_pic {
|
||||
findre='/^'^$1^'$/!h; /^'^$1^'$/!d; /^'^$1^'$/g;'
|
||||
if( ! ls -F |sed 1q |grep -s $1 )
|
||||
ls -F |grep -v '_werc' | sed 's,\*$,,g; /\$/d; s,'',,g' | sed $"findre^'; s,\.[^\.]+$,,'
|
||||
}
|
||||
|
||||
fn next_pic {
|
||||
findre='/^'^$1^'$/!d; /^'^$1^'/n; p'
|
||||
if( ! ls -F |tail -1 |grep -s $1 )
|
||||
ls -F |grep -v '_werc' | sed 's,\*$,,g; /\/$/d; s,'',,g' | sed -n $"findre |sed 's,\.[^\.]+$,,'
|
||||
}
|
||||
|
14
werc/apps/xibit/details.tpl
Normal file
14
werc/apps/xibit/details.tpl
Normal file
|
@ -0,0 +1,14 @@
|
|||
<div class="images-details">
|
||||
<ul>
|
||||
% for (pic in $xibit_pics) {
|
||||
<li>
|
||||
<a href="
|
||||
% echo $pic |sed 's,(.*)\..+$,\1,g'
|
||||
" class="thumb" >
|
||||
<img src="%( $xibit_thumbsdir^/^$pic %)" class="thumb"/>
|
||||
</a>
|
||||
% identify $xibit_urlroot/^$pic |awk '{print $4}'
|
||||
</li>
|
||||
% }
|
||||
</ul>
|
||||
</div>
|
21
werc/apps/xibit/image.tpl
Normal file
21
werc/apps/xibit/image.tpl
Normal file
|
@ -0,0 +1,21 @@
|
|||
<div id="main-img">
|
||||
% if ( ! ~ $#xibit_prevpic 0) {
|
||||
<a href="%($xibit_prevpic%)#main-img">Previous</a>
|
||||
% }
|
||||
% if ( ! ~ $#xibit_nextpic 0 && ! ~ $#xibit_prevpic 0 ) {
|
||||
/
|
||||
% }
|
||||
% if ( ! ~ $#xibit_nextpic 0) {
|
||||
<a href="%($xibit_nextpic%)#main-img">Next</a>
|
||||
% }
|
||||
<div class="main-img" id="mainpic">
|
||||
<a href="%($xibit_img%)">
|
||||
<img src="%($xibit_preview%)" />
|
||||
</a>
|
||||
</div>
|
||||
% if ( ! ~ $#xibit_caption_file 0) {
|
||||
<div class="caption">
|
||||
% md_handler $xibit_caption_file
|
||||
</div>
|
||||
% }
|
||||
</div>
|
19
werc/apps/xibit/license
Normal file
19
werc/apps/xibit/license
Normal file
|
@ -0,0 +1,19 @@
|
|||
Copyright (c) 2009 John Soros
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
11
werc/apps/xibit/thumbs.tpl
Normal file
11
werc/apps/xibit/thumbs.tpl
Normal file
|
@ -0,0 +1,11 @@
|
|||
% for (pic in $xibit_pics){
|
||||
% picnoext=`{echo $pic |sed 's,(.*)\..+$,\1,g'}
|
||||
% if(! ~ $pic $xibit_img) {
|
||||
<a href="%($picnoext%)#main-img" class="thumb" >
|
||||
<img src="%( _werc/xibit/thumbs/^$pic %)" class="thumb"/>
|
||||
</a>
|
||||
% }
|
||||
% if not {
|
||||
% template apps/xibit/image.tpl
|
||||
% }
|
||||
% }
|
17
werc/apps/xibit/xibit.css
Normal file
17
werc/apps/xibit/xibit.css
Normal file
|
@ -0,0 +1,17 @@
|
|||
.thumbs-index {
|
||||
float: right;
|
||||
clear: none;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.thumb {
|
||||
clear: none;
|
||||
width: auto;
|
||||
height: auto;
|
||||
padding: 5px;
|
||||
border: 2px;
|
||||
display: inline;
|
||||
}
|
||||
#main-img {
|
||||
text-align: center;
|
||||
clear: none;
|
||||
}
|
33
werc/bin/aux/addwuser.rc
Executable file
33
werc/bin/aux/addwuser.rc
Executable file
|
@ -0,0 +1,33 @@
|
|||
#!/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
|
||||
}
|
||||
|
64
werc/bin/aux/bpst.rc
Executable file
64
werc/bin/aux/bpst.rc
Executable file
|
@ -0,0 +1,64 @@
|
|||
#!/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
|
||||
aspell -c $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!
|
14
werc/bin/aux/gensitemaptxt.rc
Executable file
14
werc/bin/aux/gensitemaptxt.rc
Executable file
|
@ -0,0 +1,14 @@
|
|||
#!/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
|
||||
}
|
||||
|
||||
}
|
16
werc/bin/aux/runtsts.rc
Executable file
16
werc/bin/aux/runtsts.rc
Executable file
|
@ -0,0 +1,16 @@
|
|||
#!/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
|
||||
}
|
||||
}
|
236
werc/bin/cgilib.rc
Executable file
236
werc/bin/cgilib.rc
Executable file
|
@ -0,0 +1,236 @@
|
|||
# Useful CGI stuff
|
||||
|
||||
fn dprint { echo $* >[1=2] }
|
||||
fn dprintv { { for(v in $*) { echo -n $v^'#'^$#$v^'=' $$v '; ' }; echo } >[1=2] }
|
||||
fn echo {if(! ~ $1 -n || ! ~ $2 '') /bin/echo $*}
|
||||
fn escape_html { sed 's/&/\&/g; s/</\</g; s/>/\>/g' $* }
|
||||
|
||||
fn http_redirect {
|
||||
if(~ $1 http://* https://*)
|
||||
t=$1
|
||||
if not if(~ $1 /*)
|
||||
t=$"base_url^$1
|
||||
if not
|
||||
t=$"base_url^$"req_path^$1
|
||||
exec /bin/echo 'Status: '^$2^'
|
||||
Location: '^$t^'
|
||||
|
||||
'
|
||||
exit
|
||||
}
|
||||
fn perm_redirect { http_redirect $1 '301 Moved Permanantly' }
|
||||
fn post_redirect { http_redirect $1 '303 See Other' }
|
||||
|
||||
|
||||
# Note: should check if content type is application/x-www-form-urlencoded?
|
||||
# Should compare with http://www.shelldorado.com/scripts/cmds/urlgetopt.txt
|
||||
fn load_post_args {
|
||||
if(~ $REQUEST_METHOD POST && ~ $#post_args 0) {
|
||||
ifs='&
|
||||
' for(pair in `{cat}) {
|
||||
ifs='=' { pair=`{echo -n $pair} }
|
||||
n='post_arg_'^`{echo $pair(1)|nurldecode|tr -cd 'a-zA-Z0-9_'}
|
||||
post_args=( $post_args $n )
|
||||
ifs=() { $n=`{echo -n $pair(2)|nurldecode|tr -d '
'} }
|
||||
}
|
||||
pair=()
|
||||
}
|
||||
if not
|
||||
status='No POST or post args already loaded'
|
||||
}
|
||||
# Status is () if at least one arg is found. DEPRECATED: access vars directly.
|
||||
fn get_post_args {
|
||||
load_post_args
|
||||
_status='No post arg matches'
|
||||
for(n in $*) {
|
||||
v=post_arg_$n
|
||||
if(! ~ $#$v 0) {
|
||||
$n=$$v
|
||||
_status=()
|
||||
}
|
||||
}
|
||||
status=$_status
|
||||
}
|
||||
|
||||
# This seems slightly improve performance, but might depend on httpd buffering behavior.
|
||||
fn awk_buffer {
|
||||
awk '{
|
||||
buf = buf $0"\n"
|
||||
if(length(buf) > 1400) {
|
||||
printf "%s", buf
|
||||
buf = ""
|
||||
}
|
||||
}
|
||||
END { printf "%s", buf }'
|
||||
}
|
||||
|
||||
fn nurldecode { urlencode -d || url_decode} # GROSS
|
||||
|
||||
fn url_decode {
|
||||
awk '
|
||||
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
|
||||
}
|
||||
'
|
||||
}
|
||||
|
||||
fn nurlencode { urlencode || url_encode } # GROSS
|
||||
|
||||
fn url_encode {
|
||||
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 ""
|
||||
}
|
||||
' $*
|
||||
}
|
||||
|
||||
# Cookies
|
||||
fn set_cookie {
|
||||
# TODO: should check input values more carefully
|
||||
name=$1
|
||||
val=$2
|
||||
extraHttpHeaders=( $extraHttpHeaders 'Set-cookie: '^$"name^'='^$"val^'; path=/;' )
|
||||
}
|
||||
fn get_cookie {
|
||||
ifs=';' { co=`{echo $HTTP_COOKIE} }
|
||||
|
||||
# XXX: we might be adding a trailing new line?
|
||||
# The ' ?' is needed to deal with '; ' inter-cookie delimiter
|
||||
{ for(c in $co) echo $c } | sed -n 's/^ ?'$1'=//p'
|
||||
}
|
||||
|
||||
|
||||
fn static_file {
|
||||
echo -n 'Content-Type: '
|
||||
select_mime $1
|
||||
echo
|
||||
exec cat $1
|
||||
}
|
||||
|
||||
fn select_mime {
|
||||
m='text/plain'
|
||||
if(~ $1 *.css)
|
||||
m='text/css'
|
||||
if not if(~ $1 *.ico)
|
||||
m='image/x-icon'
|
||||
if not if(~ $1 *.png)
|
||||
m='image/png'
|
||||
if not if(~ $1 *.jpg *.jpeg)
|
||||
m='image/jpeg'
|
||||
if not if(~ $1 *.gif)
|
||||
m='image/gif'
|
||||
if not if(~ $1 *.pdf)
|
||||
m='application/pdf'
|
||||
echo $m
|
||||
}
|
||||
|
||||
##############################################
|
||||
# Generic rc programming helpers
|
||||
|
||||
# Manage nested lists
|
||||
fn ll_add {
|
||||
_l=$1^_^$#$1
|
||||
$_l=$*(2-)
|
||||
$1=( $$1 $_l )
|
||||
}
|
||||
# Add to the head: dangerous if you shrink list by hand!
|
||||
fn ll_addh {
|
||||
_l=$1^_^$#$1
|
||||
$_l=$*(2-)
|
||||
$1=( $_l $$1 )
|
||||
}
|
||||
|
||||
|
||||
NEW_LINE='
|
||||
'
|
||||
|
||||
# crop_text [max_lenght [ellipsis]]
|
||||
# TODO: Option to crop only at word-delimiters.
|
||||
fn crop_text {
|
||||
m=512
|
||||
e='...'
|
||||
if(! ~ $#1 0)
|
||||
m=$1
|
||||
if(! ~ $#2 0)
|
||||
e=$2
|
||||
|
||||
awk -v 'max='^$"m -v 'ellipsis='$e '
|
||||
{
|
||||
nc += 1 + length;
|
||||
if(nc > max) {
|
||||
print substr($0, 1, nc - max) " " ellipsis
|
||||
exit
|
||||
}
|
||||
print
|
||||
}'
|
||||
}
|
||||
|
||||
|
27
werc/bin/contrib/fix-rc-scripts
Executable file
27
werc/bin/contrib/fix-rc-scripts
Executable file
|
@ -0,0 +1,27 @@
|
|||
#!/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
|
||||
}
|
||||
}
|
12
werc/bin/contrib/hgweb.config
Executable file
12
werc/bin/contrib/hgweb.config
Executable file
|
@ -0,0 +1,12 @@
|
|||
[web]
|
||||
style = gitweb
|
||||
allow_archive = bz2
|
||||
|
||||
#[paths]
|
||||
#w9 = /gsoc/hg/w9/
|
||||
|
||||
[collections]
|
||||
#allow_archive = bz2 zip
|
||||
/gsoc/hg = /gsoc/hg/
|
||||
#/var/hg = /var/hg/
|
||||
|
47
werc/bin/contrib/hgwebdir.cgi
Executable file
47
werc/bin/contrib/hgwebdir.cgi
Executable file
|
@ -0,0 +1,47 @@
|
|||
#!/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))
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue