80 lines
2.5 KiB

;;;; w w w - f i l e . s t k -- WWW for STk (FILE: protocol)
;;;; Copyright © 1996-1999 Erick Gallesio - I3S-CNRS/ESSI <>
;;;; Permission to use, copy, modify, distribute,and license this
;;;; software and its documentation for any purpose is hereby granted,
;;;; provided that existing copyright notices are retained in all
;;;; copies and that this notice is included verbatim in any
;;;; distributions. No written agreement, license, or royalty fee is
;;;; required for any of the authorized uses.
;;;; This software is provided ``AS IS'' without express or implied
;;;; warranty.
;;;; This version uses some of the enhancements done by Harvey J. Stein:
;;;; Copyright (c) 1995 Harvey J. Stein (
;;;; Author: Erick Gallesio []
;;;; Creation date: 4-Oct-1996 22:14
;;;; Last file update: 3-Sep-1999 19:57 (eg)
;; Add the "FILE:" protocol
(with-module WWW
(define (generate-html-dir dir out)
;; This function generate a listing of the files in "dir" (HTML format)
(let* ((cwd (getcwd))
(all (lambda (dir) (chdir dir) (glob ".*" "*")))
(files (sort (all dir) string<?))
(link (lambda (img ref txt)
(format out "<A HREF=file:~A>" ref)
(format out "<IMG ALIGN=middle SRC=@~A@.gif>~A</A>\n"
img txt))))
(chdir cwd)
;; Print Header
(format out "<pre>\n\n</pre><H2> Directory listing of ~A</H2><HR><PRE>\n" dir)
(link "parentdir"
(canonical-path (string-append dir "/.."))
"Up to higher level directory")
;; Print each file
(for-each (lambda (name)
(unless (or (string=? name ".") (string=? name ".."))
(link (if (file-is-directory? (string-append dir "/" name) )
(canonical-path (string-append dir "/" name))
(define (get-file: url)
;; This function must return a port and the function to close it
(let ((file (url:filename url)))
(if (or (not file) (string=? file ""))
(set! file "/"))
(if (file-is-directory? file)
;; File is a directory. Generate a HTML directory
(let ((p (open-output-string)))
(generate-html-dir file p)
(let ((f (open-input-string (get-output-string p))))
(cons f
(lambda () (close-port f)))))
;; Normal file
(let((f (open-file file "r")))
(cons f
(if f
(lambda () (close-input-port f))
(lambda () #f)))))))
;; Add the protocol
(WWW:add-protocol 'file get-file:)
(provide "www-file")