cust)) default-in-line-re (let ((v (car cust))) (cond ((regexp? v) v) ((string? v) (make-regexp v)) (else default-in-line-re))))) (after-line-re (if (> 2 (length cust)) default-after-line-re (let ((v (cadr cust))) (cond ((regexp? v) v) ((string? v) (make-regexp v)) (else default-after-line-re))))) (scrub (if (> 3 (length cust)) default-scrub (let ((v (caddr cust))) (cond ((procedure? v) v) (else default-scrub)))))) (call-with-input-file filename (lambda (port) (let loop ((line (read-delimited "\n" port)) (doc "") (parse-state 'before)) (if (or (eof-object? line) (eq? 'after parse-state)) doc (let ((new-state (cond ((regexp-exec in-line-re line) 'in) ((regexp-exec after-line-re line) 'after) (else parse-state)))) (if (eq? 'after new-state) doc (loop (read-delimited "\n" port) (if (and (eq? 'in new-state) (eq? 'in parse-state)) (string-append doc (scrub line) "\n") doc) new-state)))))))))