More progress towards working websockets stuff. Add mime-types.scm to contrib.
authorChristopher Allan Webber <cwebber@dustycloud.org>
Fri, 20 Jan 2017 20:08:21 +0000 (14:08 -0600)
committerChristopher Allan Webber <cwebber@dustycloud.org>
Fri, 20 Jan 2017 20:08:21 +0000 (14:08 -0600)
Makefile.am
data/web-static/js/mudsync.js [new file with mode: 0644]
mudsync/contrib/mime-types.scm [new file with mode: 0644]
mudsync/networking.scm

index f9dfd9be6e0e09a7e7191cc9d3e334c5ce4a2934..b7320605a5ee33fa94e71113d87f0cfd2d60b183 100644 (file)
@@ -55,6 +55,7 @@ SOURCES =  \
        mudsync/run-game.scm \
        mudsync/thing.scm \
        mudsync/package-config.scm \
+       mudsync/contrib/mime-types.scm \
        mudsync.scm
 
 # TESTS =                                                      \
@@ -79,6 +80,8 @@ EXTRA_DIST =                                          \
        COPYING                                         \
        worlds/bricabrac.scm                            \
        worlds/goblin-hq.scm                            \
+       data/web-static/css/main.css                    \
+       data/web-static/js/mudsync.js                   \
        pre-inst-env.in
 
 
diff --git a/data/web-static/js/mudsync.js b/data/web-static/js/mudsync.js
new file mode 100644 (file)
index 0000000..f2edef9
--- /dev/null
@@ -0,0 +1,23 @@
+function displayMessage(data) {
+    console.log("received message");
+    console.log(data);
+}
+
+function installWebsocket() {
+    // TODO: Don't hardcode the websocket path; pull it from the DOM
+    var ws = new WebSocket("ws://127.0.0.1:8888");
+    ws.onmessage = function(evt) {
+        displayMessage(evt.data);
+    };
+    ws.onopen = function() {
+        console.log("connected");
+        ws.send("Hello, there!");
+    };
+    ws.onclose = function () {
+        console.log("closed websocket");
+    };
+}
+
+window.onload = function () {
+    installWebsocket();
+}
diff --git a/mudsync/contrib/mime-types.scm b/mudsync/contrib/mime-types.scm
new file mode 100644 (file)
index 0000000..17fe25d
--- /dev/null
@@ -0,0 +1,556 @@
+;;; Haunt --- Static site generator for GNU Guile
+;;; Copyright © 2015 David Thompson <davet@gnu.org>
+;;;
+;;; This file is part of Haunt.
+;;;
+;;; Haunt is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; Haunt is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;;; General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with Haunt.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; Simple MIME type guesser.
+;;
+;;; Code:
+
+(define-module (mudsync contrib mime-types)
+  #:use-module (ice-9 hash-table)
+  #:use-module (ice-9 regex)
+  #:export (mime-type))
+
+(define %mime-types
+  (alist->hash-table
+   '(("ez" . application/andrew-inset)
+     ("anx" . application/annodex)
+     ("atom" . application/atom+xml)
+     ("atomcat" . application/atomcat+xml)
+     ("atomsrv" . application/atomserv+xml)
+     ("lin" . application/bbolin)
+     ("cap" . application/cap)
+     ("pcap" . application/cap)
+     ("cu" . application/cu-seeme)
+     ("davmount" . application/davmount+xml)
+     ("tsp" . application/dsptype)
+     ("es" . application/ecmascript)
+     ("spl" . application/futuresplash)
+     ("hta" . application/hta)
+     ("jar" . application/java-archive)
+     ("ser" . application/java-serialized-object)
+     ("class" . application/java-vm)
+     ("js" . application/javascript)
+     ("m3g" . application/m3g)
+     ("hqx" . application/mac-binhex40)
+     ("cpt" . application/mac-compactpro)
+     ("nb" . application/mathematica)
+     ("nbp" . application/mathematica)
+     ("mdb" . application/msaccess)
+     ("doc" . application/msword)
+     ("dot" . application/msword)
+     ("mxf" . application/mxf)
+     ("bin" . application/octet-stream)
+     ("oda" . application/oda)
+     ("ogx" . application/ogg)
+     ("pdf" . application/pdf)
+     ("key" . application/pgp-keys)
+     ("pgp" . application/pgp-signature)
+     ("prf" . application/pics-rules)
+     ("ps" . application/postscript)
+     ("ai" . application/postscript)
+     ("eps" . application/postscript)
+     ("epsi" . application/postscript)
+     ("epsf" . application/postscript)
+     ("eps2" . application/postscript)
+     ("eps3" . application/postscript)
+     ("rar" . application/rar)
+     ("rdf" . application/rdf+xml)
+     ("rss" . application/rss+xml)
+     ("rtf" . application/rtf)
+     ("smi" . application/smil)
+     ("smil" . application/smil)
+     ("xhtml" . application/xhtml+xml)
+     ("xht" . application/xhtml+xml)
+     ("xml" . application/xml)
+     ("xsl" . application/xml)
+     ("xsd" . application/xml)
+     ("xspf" . application/xspf+xml)
+     ("zip" . application/zip)
+     ("apk" . application/vnd.android.package-archive)
+     ("cdy" . application/vnd.cinderella)
+     ("kml" . application/vnd.google-earth.kml+xml)
+     ("kmz" . application/vnd.google-earth.kmz)
+     ("xul" . application/vnd.mozilla.xul+xml)
+     ("xls" . application/vnd.ms-excel)
+     ("xlb" . application/vnd.ms-excel)
+     ("xlt" . application/vnd.ms-excel)
+     ("cat" . application/vnd.ms-pki.seccat)
+     ("stl" . application/vnd.ms-pki.stl)
+     ("ppt" . application/vnd.ms-powerpoint)
+     ("pps" . application/vnd.ms-powerpoint)
+     ("odc" . application/vnd.oasis.opendocument.chart)
+     ("odb" . application/vnd.oasis.opendocument.database)
+     ("odf" . application/vnd.oasis.opendocument.formula)
+     ("odg" . application/vnd.oasis.opendocument.graphics)
+     ("otg" . application/vnd.oasis.opendocument.graphics-template)
+     ("odi" . application/vnd.oasis.opendocument.image)
+     ("odp" . application/vnd.oasis.opendocument.presentation)
+     ("otp" . application/vnd.oasis.opendocument.presentation-template)
+     ("ods" . application/vnd.oasis.opendocument.spreadsheet)
+     ("ots" . application/vnd.oasis.opendocument.spreadsheet-template)
+     ("odt" . application/vnd.oasis.opendocument.text)
+     ("odm" . application/vnd.oasis.opendocument.text-master)
+     ("ott" . application/vnd.oasis.opendocument.text-template)
+     ("oth" . application/vnd.oasis.opendocument.text-web)
+     ("xlsx" . application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)
+     ("xltx" . application/vnd.openxmlformats-officedocument.spreadsheetml.template)
+     ("pptx" . application/vnd.openxmlformats-officedocument.presentationml.presentation)
+     ("ppsx" . application/vnd.openxmlformats-officedocument.presentationml.slideshow)
+     ("potx" . application/vnd.openxmlformats-officedocument.presentationml.template)
+     ("docx" . application/vnd.openxmlformats-officedocument.wordprocessingml.document)
+     ("dotx" . application/vnd.openxmlformats-officedocument.wordprocessingml.template)
+     ("cod" . application/vnd.rim.cod)
+     ("mmf" . application/vnd.smaf)
+     ("sdc" . application/vnd.stardivision.calc)
+     ("sds" . application/vnd.stardivision.chart)
+     ("sda" . application/vnd.stardivision.draw)
+     ("sdd" . application/vnd.stardivision.impress)
+     ("sdf" . application/vnd.stardivision.math)
+     ("sdw" . application/vnd.stardivision.writer)
+     ("sgl" . application/vnd.stardivision.writer-global)
+     ("sxc" . application/vnd.sun.xml.calc)
+     ("stc" . application/vnd.sun.xml.calc.template)
+     ("sxd" . application/vnd.sun.xml.draw)
+     ("std" . application/vnd.sun.xml.draw.template)
+     ("sxi" . application/vnd.sun.xml.impress)
+     ("sti" . application/vnd.sun.xml.impress.template)
+     ("sxm" . application/vnd.sun.xml.math)
+     ("sxw" . application/vnd.sun.xml.writer)
+     ("sxg" . application/vnd.sun.xml.writer.global)
+     ("stw" . application/vnd.sun.xml.writer.template)
+     ("sis" . application/vnd.symbian.install)
+     ("vsd" . application/vnd.visio)
+     ("wbxml" . application/vnd.wap.wbxml)
+     ("wmlc" . application/vnd.wap.wmlc)
+     ("wmlsc" . application/vnd.wap.wmlscriptc)
+     ("wpd" . application/vnd.wordperfect)
+     ("wp5" . application/vnd.wordperfect5.1)
+     ("wk" . application/x-123)
+     ("7z" . application/x-7z-compressed)
+     ("bz2" . application/x-bzip2)
+     ("gz" . application/x-gzip)
+     ("abw" . application/x-abiword)
+     ("dmg" . application/x-apple-diskimage)
+     ("bcpio" . application/x-bcpio)
+     ("torrent" . application/x-bittorrent)
+     ("cab" . application/x-cab)
+     ("cbr" . application/x-cbr)
+     ("cbz" . application/x-cbz)
+     ("cdf" . application/x-cdf)
+     ("cda" . application/x-cdf)
+     ("vcd" . application/x-cdlink)
+     ("pgn" . application/x-chess-pgn)
+     ("cpio" . application/x-cpio)
+     ("csh" . application/x-csh)
+     ("deb" . application/x-debian-package)
+     ("udeb" . application/x-debian-package)
+     ("dcr" . application/x-director)
+     ("dir" . application/x-director)
+     ("dxr" . application/x-director)
+     ("dms" . application/x-dms)
+     ("wad" . application/x-doom)
+     ("dvi" . application/x-dvi)
+     ("rhtml" . application/x-httpd-eruby)
+     ("pfa" . application/x-font)
+     ("pfb" . application/x-font)
+     ("gsf" . application/x-font)
+     ("pcf" . application/x-font)
+     ("pcf.Z" . application/x-font)
+     ("mm" . application/x-freemind)
+     ("spl" . application/x-futuresplash)
+     ("gnumeric" . application/x-gnumeric)
+     ("sgf" . application/x-go-sgf)
+     ("gcf" . application/x-graphing-calculator)
+     ("gtar" . application/x-gtar)
+     ("tgz" . application/x-gtar)
+     ("taz" . application/x-gtar)
+     ("tar.gz" . application/x-gtar)
+     ("tar.bz2" . application/x-gtar)
+     ("tbz2" . application/x-gtar)
+     ("hdf" . application/x-hdf)
+     ("phtml" . application/x-httpd-php)
+     ("pht" . application/x-httpd-php)
+     ("php" . application/x-httpd-php)
+     ("phps" . application/x-httpd-php-source)
+     ("php3" . application/x-httpd-php3)
+     ("php3p" . application/x-httpd-php3-preprocessed)
+     ("php4" . application/x-httpd-php4)
+     ("php5" . application/x-httpd-php5)
+     ("ica" . application/x-ica)
+     ("info" . application/x-info)
+     ("ins" . application/x-internet-signup)
+     ("isp" . application/x-internet-signup)
+     ("iii" . application/x-iphone)
+     ("iso" . application/x-iso9660-image)
+     ("jam" . application/x-jam)
+     ("jnlp" . application/x-java-jnlp-file)
+     ("jmz" . application/x-jmol)
+     ("chrt" . application/x-kchart)
+     ("kil" . application/x-killustrator)
+     ("skp" . application/x-koan)
+     ("skd" . application/x-koan)
+     ("skt" . application/x-koan)
+     ("skm" . application/x-koan)
+     ("kpr" . application/x-kpresenter)
+     ("kpt" . application/x-kpresenter)
+     ("ksp" . application/x-kspread)
+     ("kwd" . application/x-kword)
+     ("kwt" . application/x-kword)
+     ("latex" . application/x-latex)
+     ("lha" . application/x-lha)
+     ("lyx" . application/x-lyx)
+     ("lzh" . application/x-lzh)
+     ("lzx" . application/x-lzx)
+     ("frm" . application/x-maker)
+     ("maker" . application/x-maker)
+     ("frame" . application/x-maker)
+     ("fm" . application/x-maker)
+     ("fb" . application/x-maker)
+     ("book" . application/x-maker)
+     ("fbdoc" . application/x-maker)
+     ("mif" . application/x-mif)
+     ("wmd" . application/x-ms-wmd)
+     ("wmz" . application/x-ms-wmz)
+     ("com" . application/x-msdos-program)
+     ("exe" . application/x-msdos-program)
+     ("bat" . application/x-msdos-program)
+     ("dll" . application/x-msdos-program)
+     ("msi" . application/x-msi)
+     ("nc" . application/x-netcdf)
+     ("pac" . application/x-ns-proxy-autoconfig)
+     ("dat" . application/x-ns-proxy-autoconfig)
+     ("nwc" . application/x-nwc)
+     ("o" . application/x-object)
+     ("oza" . application/x-oz-application)
+     ("p7r" . application/x-pkcs7-certreqresp)
+     ("crl" . application/x-pkcs7-crl)
+     ("pyc" . application/x-python-code)
+     ("pyo" . application/x-python-code)
+     ("qgs" . application/x-qgis)
+     ("shp" . application/x-qgis)
+     ("shx" . application/x-qgis)
+     ("qtl" . application/x-quicktimeplayer)
+     ("rpm" . application/x-redhat-package-manager)
+     ("rb" . application/x-ruby)
+     ("sh" . application/x-sh)
+     ("shar" . application/x-shar)
+     ("swf" . application/x-shockwave-flash)
+     ("swfl" . application/x-shockwave-flash)
+     ("scr" . application/x-silverlight)
+     ("sit" . application/x-stuffit)
+     ("sitx" . application/x-stuffit)
+     ("sv4cpio" . application/x-sv4cpio)
+     ("sv4crc" . application/x-sv4crc)
+     ("tar" . application/x-tar)
+     ("tcl" . application/x-tcl)
+     ("gf" . application/x-tex-gf)
+     ("pk" . application/x-tex-pk)
+     ("texinfo" . application/x-texinfo)
+     ("texi" . application/x-texinfo)
+     ("~" . application/x-trash)
+     ("%" . application/x-trash)
+     ("bak" . application/x-trash)
+     ("old" . application/x-trash)
+     ("sik" . application/x-trash)
+     ("t" . application/x-troff)
+     ("tr" . application/x-troff)
+     ("roff" . application/x-troff)
+     ("man" . application/x-troff-man)
+     ("me" . application/x-troff-me)
+     ("ms" . application/x-troff-ms)
+     ("ustar" . application/x-ustar)
+     ("src" . application/x-wais-source)
+     ("wz" . application/x-wingz)
+     ("crt" . application/x-x509-ca-cert)
+     ("xcf" . application/x-xcf)
+     ("fig" . application/x-xfig)
+     ("xpi" . application/x-xpinstall)
+     ("amr" . audio/amr)
+     ("awb" . audio/amr-wb)
+     ("amr" . audio/amr)
+     ("awb" . audio/amr-wb)
+     ("axa" . audio/annodex)
+     ("au" . audio/basic)
+     ("snd" . audio/basic)
+     ("flac" . audio/flac)
+     ("mid" . audio/midi)
+     ("midi" . audio/midi)
+     ("kar" . audio/midi)
+     ("mpga" . audio/mpeg)
+     ("mpega" . audio/mpeg)
+     ("mp2" . audio/mpeg)
+     ("mp3" . audio/mpeg)
+     ("m4a" . audio/mpeg)
+     ("m3u" . audio/mpegurl)
+     ("oga" . audio/ogg)
+     ("ogg" . audio/ogg)
+     ("spx" . audio/ogg)
+     ("sid" . audio/prs.sid)
+     ("aif" . audio/x-aiff)
+     ("aiff" . audio/x-aiff)
+     ("aifc" . audio/x-aiff)
+     ("gsm" . audio/x-gsm)
+     ("m3u" . audio/x-mpegurl)
+     ("wma" . audio/x-ms-wma)
+     ("wax" . audio/x-ms-wax)
+     ("ra" . audio/x-pn-realaudio)
+     ("rm" . audio/x-pn-realaudio)
+     ("ram" . audio/x-pn-realaudio)
+     ("ra" . audio/x-realaudio)
+     ("pls" . audio/x-scpls)
+     ("sd2" . audio/x-sd2)
+     ("wav" . audio/x-wav)
+     ("alc" . chemical/x-alchemy)
+     ("cac" . chemical/x-cache)
+     ("cache" . chemical/x-cache)
+     ("csf" . chemical/x-cache-csf)
+     ("cbin" . chemical/x-cactvs-binary)
+     ("cascii" . chemical/x-cactvs-binary)
+     ("ctab" . chemical/x-cactvs-binary)
+     ("cdx" . chemical/x-cdx)
+     ("cer" . chemical/x-cerius)
+     ("c3d" . chemical/x-chem3d)
+     ("chm" . chemical/x-chemdraw)
+     ("cif" . chemical/x-cif)
+     ("cmdf" . chemical/x-cmdf)
+     ("cml" . chemical/x-cml)
+     ("cpa" . chemical/x-compass)
+     ("bsd" . chemical/x-crossfire)
+     ("csml" . chemical/x-csml)
+     ("csm" . chemical/x-csml)
+     ("ctx" . chemical/x-ctx)
+     ("cxf" . chemical/x-cxf)
+     ("cef" . chemical/x-cxf)
+     ("emb" . chemical/x-embl-dl-nucleotide)
+     ("embl" . chemical/x-embl-dl-nucleotide)
+     ("spc" . chemical/x-galactic-spc)
+     ("inp" . chemical/x-gamess-input)
+     ("gam" . chemical/x-gamess-input)
+     ("gamin" . chemical/x-gamess-input)
+     ("fch" . chemical/x-gaussian-checkpoint)
+     ("fchk" . chemical/x-gaussian-checkpoint)
+     ("cub" . chemical/x-gaussian-cube)
+     ("gau" . chemical/x-gaussian-input)
+     ("gjc" . chemical/x-gaussian-input)
+     ("gjf" . chemical/x-gaussian-input)
+     ("gal" . chemical/x-gaussian-log)
+     ("gcg" . chemical/x-gcg8-sequence)
+     ("gen" . chemical/x-genbank)
+     ("hin" . chemical/x-hin)
+     ("istr" . chemical/x-isostar)
+     ("ist" . chemical/x-isostar)
+     ("jdx" . chemical/x-jcamp-dx)
+     ("dx" . chemical/x-jcamp-dx)
+     ("kin" . chemical/x-kinemage)
+     ("mcm" . chemical/x-macmolecule)
+     ("mmd" . chemical/x-macromodel-input)
+     ("mmod" . chemical/x-macromodel-input)
+     ("mol" . chemical/x-mdl-molfile)
+     ("rd" . chemical/x-mdl-rdfile)
+     ("rxn" . chemical/x-mdl-rxnfile)
+     ("sd" . chemical/x-mdl-sdfile)
+     ("sdf" . chemical/x-mdl-sdfile)
+     ("tgf" . chemical/x-mdl-tgf)
+     ("mcif" . chemical/x-mmcif)
+     ("mol2" . chemical/x-mol2)
+     ("b" . chemical/x-molconn-Z)
+     ("gpt" . chemical/x-mopac-graph)
+     ("mop" . chemical/x-mopac-input)
+     ("mopcrt" . chemical/x-mopac-input)
+     ("mpc" . chemical/x-mopac-input)
+     ("zmt" . chemical/x-mopac-input)
+     ("moo" . chemical/x-mopac-out)
+     ("mvb" . chemical/x-mopac-vib)
+     ("asn" . chemical/x-ncbi-asn1)
+     ("prt" . chemical/x-ncbi-asn1-ascii)
+     ("ent" . chemical/x-ncbi-asn1-ascii)
+     ("val" . chemical/x-ncbi-asn1-binary)
+     ("aso" . chemical/x-ncbi-asn1-binary)
+     ("asn" . chemical/x-ncbi-asn1-spec)
+     ("pdb" . chemical/x-pdb)
+     ("ent" . chemical/x-pdb)
+     ("ros" . chemical/x-rosdal)
+     ("sw" . chemical/x-swissprot)
+     ("vms" . chemical/x-vamas-iso14976)
+     ("vmd" . chemical/x-vmd)
+     ("xtel" . chemical/x-xtel)
+     ("xyz" . chemical/x-xyz)
+     ("gif" . image/gif)
+     ("ief" . image/ief)
+     ("jpeg" . image/jpeg)
+     ("jpg" . image/jpeg)
+     ("jpe" . image/jpeg)
+     ("pcx" . image/pcx)
+     ("png" . image/png)
+     ("svg" . image/svg+xml)
+     ("svgz" . image/svg+xml)
+     ("tiff" . image/tiff)
+     ("tif" . image/tiff)
+     ("djvu" . image/vnd.djvu)
+     ("djv" . image/vnd.djvu)
+     ("wbmp" . image/vnd.wap.wbmp)
+     ("cr2" . image/x-canon-cr2)
+     ("crw" . image/x-canon-crw)
+     ("ras" . image/x-cmu-raster)
+     ("cdr" . image/x-coreldraw)
+     ("pat" . image/x-coreldrawpattern)
+     ("cdt" . image/x-coreldrawtemplate)
+     ("cpt" . image/x-corelphotopaint)
+     ("erf" . image/x-epson-erf)
+     ("ico" . image/x-icon)
+     ("art" . image/x-jg)
+     ("jng" . image/x-jng)
+     ("bmp" . image/x-ms-bmp)
+     ("nef" . image/x-nikon-nef)
+     ("orf" . image/x-olympus-orf)
+     ("psd" . image/x-photoshop)
+     ("pnm" . image/x-portable-anymap)
+     ("pbm" . image/x-portable-bitmap)
+     ("pgm" . image/x-portable-graymap)
+     ("ppm" . image/x-portable-pixmap)
+     ("rgb" . image/x-rgb)
+     ("xbm" . image/x-xbitmap)
+     ("xpm" . image/x-xpixmap)
+     ("xwd" . image/x-xwindowdump)
+     ("eml" . message/rfc822)
+     ("igs" . model/iges)
+     ("iges" . model/iges)
+     ("msh" . model/mesh)
+     ("mesh" . model/mesh)
+     ("silo" . model/mesh)
+     ("wrl" . model/vrml)
+     ("vrml" . model/vrml)
+     ("x3dv" . model/x3d+vrml)
+     ("x3d" . model/x3d+xml)
+     ("x3db" . model/x3d+binary)
+     ("manifest" . text/cache-manifest)
+     ("ics" . text/calendar)
+     ("icz" . text/calendar)
+     ("css" . text/css)
+     ("csv" . text/csv)
+     ("323" . text/h323)
+     ("html" . text/html)
+     ("htm" . text/html)
+     ("shtml" . text/html)
+     ("uls" . text/iuls)
+     ("mml" . text/mathml)
+     ("asc" . text/plain)
+     ("txt" . text/plain)
+     ("text" . text/plain)
+     ("pot" . text/plain)
+     ("brf" . text/plain)
+     ("rtx" . text/richtext)
+     ("sct" . text/scriptlet)
+     ("wsc" . text/scriptlet)
+     ("tm" . text/texmacs)
+     ("ts" . text/texmacs)
+     ("tsv" . text/tab-separated-values)
+     ("jad" . text/vnd.sun.j2me.app-descriptor)
+     ("wml" . text/vnd.wap.wml)
+     ("wmls" . text/vnd.wap.wmlscript)
+     ("bib" . text/x-bibtex)
+     ("boo" . text/x-boo)
+     ("h++" . text/x-c++hdr)
+     ("hpp" . text/x-c++hdr)
+     ("hxx" . text/x-c++hdr)
+     ("hh" . text/x-c++hdr)
+     ("c++" . text/x-c++src)
+     ("cpp" . text/x-c++src)
+     ("cxx" . text/x-c++src)
+     ("cc" . text/x-c++src)
+     ("h" . text/x-chdr)
+     ("htc" . text/x-component)
+     ("csh" . text/x-csh)
+     ("c" . text/x-csrc)
+     ("d" . text/x-dsrc)
+     ("diff" . text/x-diff)
+     ("patch" . text/x-diff)
+     ("hs" . text/x-haskell)
+     ("java" . text/x-java)
+     ("lhs" . text/x-literate-haskell)
+     ("moc" . text/x-moc)
+     ("p" . text/x-pascal)
+     ("pas" . text/x-pascal)
+     ("gcd" . text/x-pcs-gcd)
+     ("pl" . text/x-perl)
+     ("pm" . text/x-perl)
+     ("py" . text/x-python)
+     ("scala" . text/x-scala)
+     ("etx" . text/x-setext)
+     ("sh" . text/x-sh)
+     ("tcl" . text/x-tcl)
+     ("tk" . text/x-tcl)
+     ("tex" . text/x-tex)
+     ("ltx" . text/x-tex)
+     ("sty" . text/x-tex)
+     ("cls" . text/x-tex)
+     ("vcs" . text/x-vcalendar)
+     ("vcf" . text/x-vcard)
+     ("json" . text/javascript)
+     ("3gp" . video/3gpp)
+     ("axv" . video/annodex)
+     ("dl" . video/dl)
+     ("dif" . video/dv)
+     ("dv" . video/dv)
+     ("fli" . video/fli)
+     ("gl" . video/gl)
+     ("mpeg" . video/mpeg)
+     ("mpg" . video/mpeg)
+     ("mpe" . video/mpeg)
+     ("mp4" . video/mp4)
+     ("qt" . video/quicktime)
+     ("mov" . video/quicktime)
+     ("ogv" . video/ogg)
+     ("mxu" . video/vnd.mpegurl)
+     ("flv" . video/x-flv)
+     ("lsf" . video/x-la-asf)
+     ("lsx" . video/x-la-asf)
+     ("mng" . video/x-mng)
+     ("asf" . video/x-ms-asf)
+     ("asx" . video/x-ms-asf)
+     ("wm" . video/x-ms-wm)
+     ("wmv" . video/x-ms-wmv)
+     ("wmx" . video/x-ms-wmx)
+     ("wvx" . video/x-ms-wvx)
+     ("avi" . video/x-msvideo)
+     ("movie" . video/x-sgi-movie)
+     ("mpv" . video/x-matroska)
+     ("mkv" . video/x-matroska)
+     ("ice" . x-conference/x-cooltalk)
+     ("sisx" . x-epoc/x-sisx-app)
+     ("vrm" . x-world/x-vrml)
+     ("vrml" . x-world/x-vrml)
+     ("wrl" . x-world/x-vrml))))
+
+(define %file-ext-regexp
+  (make-regexp "(\\.(.*)|[~%])$"))
+
+(define (file-extension file-name)
+  "Return the file extension for FILE-NAME, or #f if one is not
+found."
+  (and=> (regexp-exec %file-ext-regexp file-name)
+         (lambda (match)
+           (or (match:substring match 2)
+               (match:substring match 1)))))
+
+(define (mime-type file-name)
+  "Guess the MIME type for FILE-NAME based upon its file extension."
+  (or (hash-ref %mime-types (file-extension file-name))
+      'text/plain))
index b938c8a9427bdf53936c44c1e9b7a045abdd4048..1c28b38dcbb4ef872c8e1663e5fa12dac2eb6329 100644 (file)
@@ -32,6 +32,7 @@
   #:use-module (web response)
   #:use-module (web uri)
   #:use-module (mudsync package-config)
+  #:use-module (mudsync contrib mime-types)
   #:use-module (rnrs io ports)
 
   #:export (;; Should we be exporting these?
            (head (title "Mudsync!")
                  (meta (@ (charset "UTF-8")))
                  (link (@ (rel "stylesheet")
-                          (href "/static/css/main.css"))))
+                          (href "/static/css/main.css")))
+                 (script (@ (type "text/javascript")
+                            (src "/static/js/mudsync.js"))))
            (body ,@body-tmpl)))
   (define (write-template-to-string)
     (with-fluids ((%default-port-encoding "UTF-8"))
 
 (define (view:render-static request body static-path)
   (values (build-response #:code 200
-                          ;; #:content-type (mime-type static-path)
-                          )
+                          #:headers `((content-type . (,(mime-type static-path)))))
           (call-with-input-file (web-static-filepath static-path) get-bytevector-all)))
 
 (define (view:standard-four-oh-four . args)