From 7318bc91ce58bb6c39e556e334f278e590439c3f Mon Sep 17 00:00:00 2001
From: John MacFarlane <jgm@berkeley.edu>
Date: Tue, 28 Aug 2018 12:34:49 -0700
Subject: [PATCH] EPUB writer: set epub:type on body element intelligently.

epub:type of first section        epub:type of body
--------------------------        ------------------
prologue                          frontmatter
abstract                          frontmatter
acknowledgments                   frontmatter
copyright-page                    frontmatter
dedication                        frontmatter
foreword                          frontmatter
halftitle,                        frontmatter
introduction                      frontmatter
preface                           frontmatter
seriespage                        frontmatter
titlepage                         frontmatter
afterword                         backmatter
appendix                          backmatter
colophon                          backmatter
conclusion                        backmatter
epigraph                          backmatter

Otherwise body will have epub:type 'bodymatter'.
This only affects epub3.

See http://www.idpf.org/epub/profiles/edu/structure/#h.l0bzsloklt10

Closes #4823.
---
 data/templates/default.epub3    |  2 +-
 src/Text/Pandoc/Writers/EPUB.hs | 28 ++++++++++++++++++++++------
 2 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/data/templates/default.epub3 b/data/templates/default.epub3
index b22714963..6428e984c 100644
--- a/data/templates/default.epub3
+++ b/data/templates/default.epub3
@@ -26,7 +26,7 @@ $for(header-includes)$
   $header-includes$
 $endfor$
 </head>
-<body$if(coverpage)$ id="cover"$endif$>
+<body$if(coverpage)$ id="cover"$endif$$if(body-type)$ epub:type="$body-type$"$endif$>
 $if(titlepage)$
 <section epub:type="titlepage">
 $for(title)$
diff --git a/src/Text/Pandoc/Writers/EPUB.hs b/src/Text/Pandoc/Writers/EPUB.hs
index 3c6ab69b9..4c5e73d81 100644
--- a/src/Text/Pandoc/Writers/EPUB.hs
+++ b/src/Text/Pandoc/Writers/EPUB.hs
@@ -461,6 +461,7 @@ pandocToEPUB version opts doc@(Pandoc meta _) = do
   -- title page
   tpContent <- lift $ writeHtml opts'{
                                   writerVariables = ("titlepage","true"):
+                                  ("body-type", "frontmatter"):
                                   ("pagetitle", escapeStringForXML plainTitle):
                                   cssvars True ++ vars }
                                (Pandoc meta [])
@@ -565,13 +566,28 @@ pandocToEPUB version opts doc@(Pandoc meta _) = do
   let chapToEntry num (Chapter mbnum bs) =
         mkEntry ("text/" ++ showChapter num) =<<
         writeHtml opts'{ writerNumberOffset = fromMaybe [] mbnum
-                       , writerVariables = cssvars True ++ vars }
-                 (case bs of
-                     (Header _ _ xs : _) ->
+                       , writerVariables = ("body-type", bodyType) :
+                                           cssvars True ++ vars } pdoc
+         where (pdoc, bodyType) =
+                 case bs of
+                     (Header _ (_,_,kvs) xs : _) ->
                        -- remove notes or we get doubled footnotes
-                       Pandoc (setMeta "title" (walk removeNote $ fromList xs)
-                                 nullMeta) bs
-                     _                   -> Pandoc nullMeta bs)
+                       (Pandoc (setMeta "title"
+                           (walk removeNote $ fromList xs) nullMeta) bs,
+                        case lookup "epub:type" kvs of
+                             Nothing -> "bodymatter"
+                             Just x
+                               | x `elem` frontMatterTypes -> "frontmatter"
+                               | x `elem` backMatterTypes  -> "backmatter"
+                               | otherwise                 -> "bodymatter")
+                     _                   -> (Pandoc nullMeta bs, "bodymatter")
+               frontMatterTypes = ["prologue", "abstract", "acknowledgments",
+                                   "copyright-page", "dedication",
+                                   "foreword", "halftitle",
+                                   "introduction", "preface",
+                                   "seriespage", "titlepage"]
+               backMatterTypes = ["afterword", "appendix", "colophon",
+                                  "conclusion", "epigraph"]
 
   chapterEntries <- zipWithM chapToEntry [1..] chapters