;; These regexps are sensitive to the precise output of tex2page:
(define re:section (regexp "(<[^>]*>)*[0-9.]+(.*)"))
(define re:chapter (regexp "^(.*)"))
(define re:method (regexp "(.*) in "))
(define (clean-up s)
(regexp-replace*
"^ +"
(regexp-replace*
"&[^;]*;"
(regexp-replace*
"<[^>]*>"
(regexp-replace*
"( )+"
(regexp-replace*
"&"
(regexp-replace*
">"
(regexp-replace*
"<"
s
"<")
">")
"\\&")
" ")
"")
"")
""))
;; Find the closest section title to the anchor
(define (get-title page anchor)
(let ([re:anchor (regexp (regexp-quote anchor))])
(with-handlers ([void (lambda (x) "???")])
(with-input-from-file (build-path dir-to-read page)
(lambda ()
(let loop ([title-so-far "???"])
(let ([r (read-line)])
(if (eof-object? r)
"???"
(let ([title-so-far
(cond
[(regexp-match re:section r)
=> (lambda (m) (caddr m))]
[(regexp-match re:chapter r)
=> (lambda (m) (cadr m))]
[(regexp-match re:method r)
=> (lambda (m) (cadr m))]
[else title-so-far])])
(if (regexp-match re:anchor r)
(if (equal? title-so-far "???")
;; try section on one more line; needed for class sections in MrEd:
(let* ([r (read-line)]
[m (and (string? r)
(regexp-match re:section r))])
(if m
(caddr m)
title-so-far))
title-so-far)
(loop title-so-far)))))))))))