61 lines
1.9 KiB
Scheme
61 lines
1.9 KiB
Scheme
#lang scheme
|
|
(require scribble/struct
|
|
scribble/decode)
|
|
|
|
(provide new-counter
|
|
counter-target
|
|
counter-ref)
|
|
|
|
(define-struct counter ([n #:mutable] name))
|
|
|
|
(define (new-counter name)
|
|
(make-counter 0 name))
|
|
|
|
(define (counter-target counter tag label . content)
|
|
(let ([content (decode-content content)])
|
|
(make-target-element
|
|
#f
|
|
(list
|
|
(make-collect-element
|
|
#f
|
|
(if label
|
|
(list
|
|
(make-delayed-element
|
|
(lambda (renderer part ri)
|
|
(let ([n (resolve-get part ri `(counter (,(counter-name counter) ,tag "value")))])
|
|
(list* label 'nbsp (format "~a" n)
|
|
content)))
|
|
(lambda () (if label
|
|
(list* label 'nbsp "N" content)
|
|
content))
|
|
(lambda () (if label
|
|
(list* label 'nbsp "N" content)
|
|
content))))
|
|
content)
|
|
(lambda (ci)
|
|
(let ([n (add1 (counter-n counter))])
|
|
(set-counter-n! counter n)
|
|
(collect-put! ci `(counter (,(counter-name counter) ,tag "value")) n)))))
|
|
`(counter (,(counter-name counter) ,tag)))))
|
|
|
|
(define (counter-ref counter tag label)
|
|
(let ([n (make-delayed-element
|
|
(lambda (renderer part ri)
|
|
(let ([n (resolve-get part ri `(counter (,(counter-name counter) ,tag "value")))])
|
|
(list (format "~a" n))))
|
|
(lambda () (if label
|
|
(list label 'nbsp "N")
|
|
(list "N")))
|
|
(lambda () (if label
|
|
(list label 'nbsp "N")
|
|
(list "N"))))])
|
|
(if label
|
|
(make-link-element
|
|
#f
|
|
(list
|
|
label
|
|
'nbsp
|
|
n)
|
|
`(counter (,(counter-name counter) ,tag)))
|
|
n)))
|