> On Jan 22, 2018, at 4:38 PM, Joel Dueck <dueckofe...@gmail.com> wrote:
> 
> We’re getting heavy snow all day today here in Minneapolis, so I took the day 
> off. I spent some of the down time writing up my approach for implementing 
> footnotes in an upcoming project: 
> https://thenotepad.org/posts/pollen-footnotes-approach.html

Thanks a lot for this Joel. I was drawn to your comment in the article:

"The output for footnotes (given my requirements) can’t very well be handled 
within individual tag functions; it demands a top-down approach."

I was curious why this was necessarily so. I tried refactoring your footnote 
mechanism into tag functions. (I left out the MD5 fingerprinting and the 
blank-footnote requirement.) Result below. It seems to work with your samples. 
Where does this approach break down?


;;;;;;;;;;;;;;;;;

#lang racket/base
(provide (all-defined-out))

(define (fn-id x) (string-append x "_fn"))
(define (fnref-id x) (string-append x "_fnref"))

(define fn-names null)
(define (fn name-in)
  (define name (format "~a" name-in))
  (set! fn-names (if (member name fn-names) fn-names (cons name fn-names)))
  `(sup (a ((href ,(string-append "#" (fnref-id name)))
            (id ,(fn-id name)))
           ,(format "(~a)" (length fn-names)))))

(define fndefs (make-hash))
(define (fndef name . xs) (hash-set! fndefs (format "~a" name) xs))

(define (footnote-block)
  (define note-items
    (for/list ([fn-name (in-list (reverse fn-names))])
              `(li ((id ,(fnref-id fn-name)))
                   ,@(append
                      (hash-ref fndefs fn-name)
                      (list `(a ((href ,(string-append "#" (fn-id fn-name)))) 
"↩"))))))
  `(section ((class "footnotes")) (ol ,@note-items)))

(define (root . elements)
  `(root ,@elements ,(footnote-block)))






-- 
You received this message because you are subscribed to the Google Groups 
"Pollen" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to pollenpub+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to