From a786f43e8cfcbcd7252a13e36357d78a0bc1f4bf Mon Sep 17 00:00:00 2001
From: fiddlosopher <fiddlosopher@788f1e2b-df1e-0410-8736-df70ead52e1b>
Date: Sat, 14 Jul 2007 03:37:41 +0000
Subject: [PATCH] Change to footnotes in HTML writer:  Instead of putting the
 footnote backlink on a line by itself, after the content of the note, we now
 put it at the end of the last paragraph of the footnote. This saves space and
 looks better.  More specifically: + If the last block of the note is a Para
 or Plain block, the   backlink is put at the end of that block's contents. +
 Otherwise, the backlink is put in a separate Plain block by   itself, after
 the footnote's contents.

git-svn-id: https://pandoc.googlecode.com/svn/trunk@697 788f1e2b-df1e-0410-8736-df70ead52e1b
---
 src/Text/Pandoc/Writers/HTML.hs | 23 ++++++++++++++++++-----
 tests/writer.html               | 20 +++++---------------
 2 files changed, 23 insertions(+), 20 deletions(-)

diff --git a/src/Text/Pandoc/Writers/HTML.hs b/src/Text/Pandoc/Writers/HTML.hs
index 4ed6a3ce9..ad31969ed 100644
--- a/src/Text/Pandoc/Writers/HTML.hs
+++ b/src/Text/Pandoc/Writers/HTML.hs
@@ -363,9 +363,22 @@ inlineToHtml opts inline =
 
 blockListToNote :: WriterOptions -> String -> [Block] -> State WriterState Html
 blockListToNote opts ref blocks =
-  do contents <- blockListToHtml opts blocks
-     let backlink = anchor ! [href ("#fnref" ++ ref), theclass "footnoteBacklink",
-                             title ("Jump back to footnote " ++ ref)] $
-                             (primHtmlChar "#8617")
-     return $ li ! [identifier ("fn" ++ ref)] $ contents +++ backlink
+  -- If last block is Para or Plain, include the backlink at the end of
+  -- that block. Otherwise, insert a new Plain block with the backlink.
+  let backlink = [HtmlInline $ " <a href=\"#fnref" ++ ref ++ 
+                 "\" class=\"footnoteBackLink\"" ++
+                 " title=\"Jump back to footnote " ++ ref ++ "\">&#8617;</a>"]
+      blocks'  = if null blocks
+                    then []
+                    else let lastBlock   = last blocks
+                             otherBlocks = init blocks
+                         in  case lastBlock of
+                                  (Para lst)  -> otherBlocks ++
+                                                 [Para (lst ++ backlink)]
+                                  (Plain lst) -> otherBlocks ++
+                                                 [Plain (lst ++ backlink)]
+                                  _           -> otherBlocks ++ [lastBlock,
+                                                 Plain backlink]
+  in do contents <- blockListToHtml opts blocks'
+        return $ li ! [identifier ("fn" ++ ref)] $ contents
 
diff --git a/tests/writer.html b/tests/writer.html
index 6d8a850bc..10d1c0c4f 100644
--- a/tests/writer.html
+++ b/tests/writer.html
@@ -976,9 +976,7 @@ document.write('<a h'+'ref'+'="ma'+'ilto'+':'+e+'">'+e+'<\/'+'a'+'>');
        /><ol
       ><li id="fn1"
 	><p
-	  >Here is the footnote. It can go anywhere after the footnote reference. It need not be placed at the end of the document.</p
-	  ><a href="#fnref1" class="footnoteBacklink" title="Jump back to footnote 1"
-	  >&#8617;</a
+	  >Here is the footnote. It can go anywhere after the footnote reference. It need not be placed at the end of the document. <a href="#fnref1" class="footnoteBackLink" title="Jump back to footnote 1">&#8617;</a></p
 	  ></li
 	><li id="fn2"
 	><p
@@ -991,9 +989,7 @@ document.write('<a h'+'ref'+'="ma'+'ilto'+':'+e+'">'+e+'<\/'+'a'+'>');
 </code
 	    ></pre
 	  ><p
-	  >If you want, you can indent every line, but you can also be lazy and just indent the first line of each block.</p
-	  ><a href="#fnref2" class="footnoteBacklink" title="Jump back to footnote 2"
-	  >&#8617;</a
+	  >If you want, you can indent every line, but you can also be lazy and just indent the first line of each block. <a href="#fnref2" class="footnoteBackLink" title="Jump back to footnote 2">&#8617;</a></p
 	  ></li
 	><li id="fn3"
 	><p
@@ -1003,21 +999,15 @@ document.write('<a h'+'ref'+'="ma'+'ilto'+':'+e+'">'+e+'<\/'+'a'+'>');
 	    >links</a
 	    > and <code
 	    >]</code
-	    > verbatim characters, as well as [bracketed text].</p
-	  ><a href="#fnref3" class="footnoteBacklink" title="Jump back to footnote 3"
-	  >&#8617;</a
+	    > verbatim characters, as well as [bracketed text]. <a href="#fnref3" class="footnoteBackLink" title="Jump back to footnote 3">&#8617;</a></p
 	  ></li
 	><li id="fn4"
 	><p
-	  >In quote.</p
-	  ><a href="#fnref4" class="footnoteBacklink" title="Jump back to footnote 4"
-	  >&#8617;</a
+	  >In quote. <a href="#fnref4" class="footnoteBackLink" title="Jump back to footnote 4">&#8617;</a></p
 	  ></li
 	><li id="fn5"
 	><p
-	  >In list.</p
-	  ><a href="#fnref5" class="footnoteBacklink" title="Jump back to footnote 5"
-	  >&#8617;</a
+	  >In list. <a href="#fnref5" class="footnoteBackLink" title="Jump back to footnote 5">&#8617;</a></p
 	  ></li
 	></ol
       ></div