[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: tagged string builder
From: |
Martin Grabmueller |
Subject: |
Re: tagged string builder |
Date: |
Mon, 26 Mar 2001 11:28:37 +0200 |
> From: Keisuke Nishida <address@hidden>
> Date: Sun, 25 Mar 2001 13:01:24 -0500
>
> By the way, is it a good idea to rewrite Guile's web pages
> using this notation? I generate my personal pages like this:
[...snip...]
Just for those who are interested in generating HTML with Guile: Some
time ago, I wrote a little skript for generating my personal pages,
which is small, simple to use and closer to writing HTML (for example,
you can use Emacs' html-mode without great problems.
Example input looks like this:
%(define title "mgrabmue's home")
%(define author-email "address@hidden")
<html>
<head>
<title>
%title
</title>
<body>
<h2>%title </h2>
</body>
<address>%author-email </address>
</html>
Have fun,
'martin
===8<----------------------------------------------------------------
#! /bin/sh
exec guile -s $0 $*
!#
; html-pp.scm
;
; This fine tool can be used to preprocess text files (I mainly use it
; to generate web pages. Usage is simple. Just pass the name of the
; file to preprocess on the commandline and the processed output will
; be written to stdout. If no file name is given, standard input is
; used to read the data.
;
; Syntax of the source files:
; ===========================
;
; Normal text in source files are simply written to standard output.
;
; Preprocessing is triggered by using the character `%' in the input
; file. The Scheme expression immediately following this character is
; read and evaluated, the result of evaluation is then written to
; standard output, if it is a string, otherwise it is only evaluated
; for side effects.
;
; Note that any whitespace following a Scheme expression is discarded
; and thus does not appear in the output.
;
; See the example source file `boo.scmtml' for how to use this script.
;;; File handling ====================================================
;; Process all expressions available on port IN-PORT.
(define (handle-file in-port)
(let loop ((ch (read-char in-port)))
(cond ((eof-object? ch)
#f)
((char=? ch #\%)
(let* ((expr (read in-port))
(res (eval expr (interaction-environment))))
(if (string? res)
(display res)))
(loop (read-char in-port)))
(else
(display ch)
(loop (read-char in-port))))))
;; Process all files whose filenames are on the list FILES. Use STDIN
;; if the given list is empty.
(define (handle-files files)
(if (pair? files)
(for-each (lambda (file)
(call-with-input-file file handle-file))
files)
(handle-file (current-input-port))))
(let ((cmdline (command-line)))
(handle-files (if (pair? cmdline) (cdr cmdline) '())))