aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2018-11-24 20:34:54 -0800
committerJohn MacFarlane <jgm@berkeley.edu>2018-11-24 20:34:54 -0800
commit743d1b368f8c8bbd393454915f71a02453659423 (patch)
treee13dda56f165728a9913ff711874362c7ef3062d
parentbbe34da85475675dff0d8b6383e26ac783774060 (diff)
downloadpandoc-743d1b368f8c8bbd393454915f71a02453659423.tar.gz
EPUB writer: handle calibre metadata.
Nodes of the form <meta name="calibre:series" content="Classics on War and Politics"/> are now included from an epub XML metadata file. You can also include this information in your YAML metadata, like so: calibre: series: Classics on War and Policitics In addition, ibooks-specific metadata can now be included via an XML file. (Previously, it could only be included via YAML metadata, see #2693.) Closes #5098.
-rw-r--r--src/Text/Pandoc/Writers/EPUB.hs23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/Text/Pandoc/Writers/EPUB.hs b/src/Text/Pandoc/Writers/EPUB.hs
index a4b841efd..93c685ffa 100644
--- a/src/Text/Pandoc/Writers/EPUB.hs
+++ b/src/Text/Pandoc/Writers/EPUB.hs
@@ -110,6 +110,7 @@ data EPUBMetadata = EPUBMetadata{
, epubStylesheets :: [FilePath]
, epubPageDirection :: Maybe ProgressionDirection
, epubIbooksFields :: [(String, String)]
+ , epubCalibreFields :: [(String, String)]
} deriving Show
data Date = Date{
@@ -250,6 +251,18 @@ addMetadataFromXML e@(Element (QName name _ (Just "dc")) attrs _ _) md
| name == "rights" = md { epubRights = Just $ strContent e }
| otherwise = md
where getAttr n = lookupAttr (opfName n) attrs
+addMetadataFromXML e@(Element (QName "meta" _ _) attrs _ _) md =
+ case getAttr "property" of
+ Just s | "ibooks:" `isPrefixOf` s ->
+ md{ epubIbooksFields = (drop 7 s, strContent e) :
+ epubIbooksFields md }
+ _ -> case getAttr "name" of
+ Just s | "calibre:" `isPrefixOf` s ->
+ md{ epubCalibreFields =
+ (drop 8 s, fromMaybe "" $ getAttr "content") :
+ epubCalibreFields md }
+ _ -> md
+ where getAttr n = lookupAttr (unqual n) attrs
addMetadataFromXML _ md = md
metaValueToString :: MetaValue -> String
@@ -333,6 +346,7 @@ metadataFromMeta opts meta = EPUBMetadata{
, epubStylesheets = stylesheets
, epubPageDirection = pageDirection
, epubIbooksFields = ibooksFields
+ , epubCalibreFields = calibreFields
}
where identifiers = getIdentifier meta
titles = getTitle meta
@@ -364,6 +378,10 @@ metadataFromMeta opts meta = EPUBMetadata{
Just (MetaMap mp)
-> M.toList $ M.map metaValueToString mp
_ -> []
+ calibreFields = case lookupMeta "calibre" meta of
+ Just (MetaMap mp)
+ -> M.toList $ M.map metaValueToString mp
+ _ -> []
-- | Produce an EPUB2 file from a Pandoc document.
writeEPUB2 :: PandocMonad m
@@ -856,7 +874,7 @@ metadataElement version md currentTime =
unode "metadata" ! [("xmlns:dc","http://purl.org/dc/elements/1.1/")
,("xmlns:opf","http://www.idpf.org/2007/opf")] $ mdNodes
where mdNodes = identifierNodes ++ titleNodes ++ dateNodes
- ++ languageNodes ++ ibooksNodes
+ ++ languageNodes ++ ibooksNodes ++ calibreNodes
++ creatorNodes ++ contributorNodes ++ subjectNodes
++ descriptionNodes ++ typeNodes ++ formatNodes
++ publisherNodes ++ sourceNodes ++ relationNodes
@@ -877,6 +895,9 @@ metadataElement version md currentTime =
$ dateText x]
ibooksNodes = map ibooksNode (epubIbooksFields md)
ibooksNode (k, v) = unode "meta" ! [("property", "ibooks:" ++ k)] $ v
+ calibreNodes = map calibreNode (epubCalibreFields md)
+ calibreNode (k, v) = unode "meta" ! [("name", "calibre:" ++ k),
+ ("content", v)] $ ()
languageNodes = [dcTag "language" $ epubLanguage md]
creatorNodes = withIds "epub-creator" (toCreatorNode "creator") $
epubCreator md