summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--NEWS4
-rw-r--r--src/guile/skribilo/engine/html.scm38
2 files changed, 40 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index 514541f..42cb606 100644
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,10 @@ Copyright (C) 2005, 2006, 2007, 2008, 2009  Ludovic Courtès <ludo@gnu.org>
 ** Using `(image :url ...)' with `lout' yields a warning, not an error
 ** New `rss-2' input syntax, for RSS 2.0 feeds
 ** HTML engine: footnotes now yield hyperlinks back to the call site
+** HTML engine: footnotes are properly printed for same-file chapters
+
+Previously, footnotes would not get printed in the case of chapters that
+are not output in a separate file.
 
 * New in Skribilo 0.9.1
 
diff --git a/src/guile/skribilo/engine/html.scm b/src/guile/skribilo/engine/html.scm
index 0fded86..9f969c5 100644
--- a/src/guile/skribilo/engine/html.scm
+++ b/src/guile/skribilo/engine/html.scm
@@ -39,6 +39,7 @@
   :autoload   (ice-9 rdelim)           (read-line)
   :autoload   (ice-9 regex)            (regexp-substitute/global)
 
+  :use-module (srfi srfi-1)
   :use-module (srfi srfi-13)
   :use-module (srfi srfi-14)
   :use-module (srfi srfi-39)
@@ -1137,6 +1138,23 @@
 
 			  (display "</tbody>\n</table>\n")))))))
 
+(define (section-in-separate-file? n e)
+  ;; Return true if N, a node (chapter, section, etc.), is to be put in a
+  ;; separate file, according to the customs of engine E.
+  (and (container? n)
+       (not (document? n))
+       (or (markup-option n :file)
+           (let ((kind (markup-markup n)))
+             (engine-custom e (string->symbol
+                               (string-append (symbol->string kind)
+                                              "-file")))))))
+
+(define (section-in-current-file? n e)
+  ;; Return true if N is to be output in the current file, or in the main
+  ;; file.
+  (and (container? n)
+       (not (section-in-separate-file? n e))))
+
 ;*---------------------------------------------------------------------*/
 ;*    &html-generic-document ...                                       */
 ;*---------------------------------------------------------------------*/
@@ -1165,8 +1183,24 @@
 		     (ident (string-append id "-footnote"))
 		     (class (markup-class n))
 		     (parent n)
-		     (body (reverse!
-			    (container-env-get n 'footnote-env)))))
+
+		     (body
+                      ;; Collect the footnotes of all the sub-containers that
+                      ;; are to be output in the same file.
+                      (let ((subsections
+                             (find-down (lambda (s)
+                                          (section-in-current-file? s e))
+                                        n)))
+                        (reverse
+                         (let loop ((subsections (cons n subsections))
+                                    (footnotes   '()))
+                           (cond ((pair? subsections)
+                                  (fold loop footnotes subsections))
+                                 ((null? subsections)
+                                  footnotes)
+                                 (else
+                                  (container-env-get subsections
+                                                     'footnote-env)))))))))
 	  (page (new markup
 		   (markup '&html-page)
 		   (ident (string-append id "-page"))