@@ -4,6 +4,7 @@
4{-# LANGUAGE CPP #-}
4{-# LANGUAGE CPP #-}
5{-# LANGUAGE DeriveGeneric #-}
5{-# LANGUAGE DeriveGeneric #-}
6{-# LANGUAGE TemplateHaskell #-}
6{-# LANGUAGE TemplateHaskell #-}
7+{-# LANGUAGE FlexibleInstances #-}
8 Module : Text.Pandoc.App.Opt
9 Module : Text.Pandoc.App.Opt
9 Copyright : Copyright (C) 2006-2019 John MacFarlane
10 Copyright : Copyright (C) 2006-2019 John MacFarlane
@@ -41,7 +42,6 @@ import qualified Data.Map as M
41import Text.Pandoc.Definition (Meta(..), MetaValue(..))
42import Text.Pandoc.Definition (Meta(..), MetaValue(..))
42import Data.Aeson (defaultOptions, Options(..))
43import Data.Aeson (defaultOptions, Options(..))
43import Data.Aeson.TH (deriveJSON)
44import Data.Aeson.TH (deriveJSON)
44−import Control.Monad (foldM)
45import Control.Applicative ((<|>))
45import Control.Applicative ((<|>))
46import Data.YAML
46import Data.YAML
@@ -144,184 +144,209 @@ data Opt = Opt
144 , optStripComments :: Bool -- ^ Skip HTML comments
144 , optStripComments :: Bool -- ^ Skip HTML comments
145 } deriving (Generic, Show)
145 } deriving (Generic, Show)
147−instance FromYAML Opt where
147+instance FromYAML (Opt -> Opt) where
148 parseYAML (Mapping _ _ m) =
148 parseYAML (Mapping _ _ m) =
149− foldM doOpt defaultOpts (M.toList m)
149+ foldr (.) id <$> mapM doOpt (M.toList m)
150 parseYAML n = failAtNode n "Expected a mapping"
150 parseYAML n = failAtNode n "Expected a mapping"
152−doOpt :: Opt -> (Node Pos, Node Pos) -> Parser Opt
152+doOpt :: (Node Pos, Node Pos) -> Parser (Opt -> Opt)
153−doOpt opt (k',v) = do
153+doOpt (k',v) = do
154 k <- case k' of
154 k <- case k' of
155 Scalar _ (SStr t) -> return t
155 Scalar _ (SStr t) -> return t
156 Scalar _ _ -> failAtNode k' "Non-string key"
156 Scalar _ _ -> failAtNode k' "Non-string key"
157 _ -> failAtNode k' "Non-scalar key"
157 _ -> failAtNode k' "Non-scalar key"
158 case k of
158 case k of
159 "tab-stop" ->
159 "tab-stop" ->
160− parseYAML v >>= \x -> return opt{ optTabStop = x }
160+ parseYAML v >>= \x -> return (\o -> o{ optTabStop = x })
161 "preserve-tabs" ->
161 "preserve-tabs" ->
162− parseYAML v >>= \x -> return opt { optPreserveTabs = x }
162+ parseYAML v >>= \x -> return (\o -> o{ optPreserveTabs = x })
163 "standalone" ->
163 "standalone" ->
164− parseYAML v >>= \x -> return opt { optStandalone = x }
164+ parseYAML v >>= \x -> return (\o -> o{ optStandalone = x })
165 "table-of-contents" ->
165 "table-of-contents" ->
166− parseYAML v >>= \x -> return opt { optTableOfContents = x }
166+ parseYAML v >>= \x -> return (\o -> o{ optTableOfContents = x })
168− parseYAML v >>= \x -> return opt { optTableOfContents = x }
168+ parseYAML v >>= \x -> return (\o -> o{ optTableOfContents = x })
169 "from" ->
169 "from" ->
170− parseYAML v >>= \x -> return opt { optFrom = unpack <$> x }
170+ parseYAML v >>= \x -> return (\o -> o{ optFrom = unpack <$> x })
171 "reader" ->
171 "reader" ->
172− parseYAML v >>= \x -> return opt { optFrom = unpack <$> x }
172+ parseYAML v >>= \x -> return (\o -> o{ optFrom = unpack <$> x })
174− parseYAML v >>= \x -> return opt { optTo = unpack <$> x }
174+ parseYAML v >>= \x -> return (\o -> o{ optTo = unpack <$> x })
175 "writer" ->
175 "writer" ->
176− parseYAML v >>= \x -> return opt { optTo = unpack <$> x }
176+ parseYAML v >>= \x -> return (\o -> o{ optTo = unpack <$> x })
177 "shift-heading-level-by" ->
177 "shift-heading-level-by" ->
178− parseYAML v >>= \x -> return opt { optShiftHeadingLevelBy = x }
178+ parseYAML v >>= \x -> return (\o -> o{ optShiftHeadingLevelBy = x })
179 "template" ->
179 "template" ->
180− parseYAML v >>= \x -> return opt { optTemplate = unpack <$> x }
180+ parseYAML v >>= \x -> return (\o -> o{ optTemplate = unpack <$> x })
181 "variables" ->
181 "variables" ->
182− parseYAML v >>= \x -> return opt { optVariables = x }
182+ parseYAML v >>= \x -> return (\o -> o{ optVariables = x })
183 "metadata" ->
183 "metadata" ->
184− parseYAML v >>= \x -> return opt { optMetadata = contextToMeta x }
184+ parseYAML v >>= \x -> return (\o -> o{ optMetadata = contextToMeta x })
185 "metadata-files" ->
185 "metadata-files" ->
186+ (parseYAML v >>= \x ->
186− (parseYAML v >>= \x -> return opt { optMetadataFiles = map unpack x })
187+ return (\o -> o{ optMetadataFiles = map unpack x }))
187 "metadata-file" -> -- allow either a list or a single value
188 "metadata-file" -> -- allow either a list or a single value
188− (parseYAML v >>= \x -> return opt { optMetadataFiles = map unpack x })
189+ (parseYAML v >>= \x -> return (\o -> o{ optMetadataFiles = map unpack x }))
191+ (parseYAML v >>= \x ->
190− (parseYAML v >>= \x -> return opt { optMetadataFiles = [unpack x] })
192+ return (\o -> o{ optMetadataFiles = [unpack x] }))
191 "output-file" ->
193 "output-file" ->
192− parseYAML v >>= \x -> return opt { optOutputFile = unpack <$> x }
194+ parseYAML v >>= \x -> return (\o -> o{ optOutputFile = unpack <$> x })
193 "input-files" ->
195 "input-files" ->
194− parseYAML v >>= \x -> return opt { optInputFiles = map unpack x }
196+ parseYAML v >>= \x -> return (\o -> o{ optInputFiles = map unpack x })
195 "number-sections" ->
197 "number-sections" ->
196− parseYAML v >>= \x -> return opt { optNumberSections = x }
198+ parseYAML v >>= \x -> return (\o -> o{ optNumberSections = x })
197 "number-offset" ->
199 "number-offset" ->
198− parseYAML v >>= \x -> return opt { optNumberOffset = x }
200+ parseYAML v >>= \x -> return (\o -> o{ optNumberOffset = x })
199 "section-divs" ->
201 "section-divs" ->
200− parseYAML v >>= \x -> return opt { optSectionDivs = x }
202+ parseYAML v >>= \x -> return (\o -> o{ optSectionDivs = x })
201 "incremental" ->
203 "incremental" ->
202− parseYAML v >>= \x -> return opt { optIncremental = x }
204+ parseYAML v >>= \x -> return (\o -> o{ optIncremental = x })
203 "self-contained" ->
205 "self-contained" ->
204− parseYAML v >>= \x -> return opt { optSelfContained = x }
206+ parseYAML v >>= \x -> return (\o -> o{ optSelfContained = x })
205 "html-q-tags" ->
207 "html-q-tags" ->
206− parseYAML v >>= \x -> return opt { optHtmlQTags = x }
208+ parseYAML v >>= \x -> return (\o -> o{ optHtmlQTags = x })
207 "highlight-style" ->
209 "highlight-style" ->
208− parseYAML v >>= \x -> return opt { optHighlightStyle = unpack <$> x }
210+ parseYAML v >>= \x -> return (\o -> o{ optHighlightStyle = unpack <$> x })
209 "syntax-definition" ->
211 "syntax-definition" ->
212+ (parseYAML v >>= \x ->
210− (parseYAML v >>= \x -> return opt { optSyntaxDefinitions = map unpack x })
213+ return (\o -> o{ optSyntaxDefinitions = map unpack x }))
215+ (parseYAML v >>= \x ->
212− (parseYAML v >>= \x -> return opt { optSyntaxDefinitions = [unpack x] })
216+ return (\o -> o{ optSyntaxDefinitions = [unpack x] }))
213 "syntax-definitions" ->
217 "syntax-definitions" ->
218+ parseYAML v >>= \x ->
214− parseYAML v >>= \x -> return opt { optSyntaxDefinitions = map unpack x }
219+ return (\o -> o{ optSyntaxDefinitions = map unpack x })
215 "top-level-division" ->
220 "top-level-division" ->
216− parseYAML v >>= \x -> return opt { optTopLevelDivision = x }
221+ parseYAML v >>= \x -> return (\o -> o{ optTopLevelDivision = x })
217 "html-math-method" ->
222 "html-math-method" ->
218− parseYAML v >>= \x -> return opt { optHTMLMathMethod = x }
223+ parseYAML v >>= \x -> return (\o -> o{ optHTMLMathMethod = x })
219 "abbreviations" ->
224 "abbreviations" ->
225+ parseYAML v >>= \x ->
220− parseYAML v >>= \x -> return opt { optAbbreviations = unpack <$> x }
226+ return (\o -> o{ optAbbreviations = unpack <$> x })
221 "reference-doc" ->
227 "reference-doc" ->
228+ parseYAML v >>= \x ->
222− parseYAML v >>= \x -> return opt { optReferenceDoc = unpack <$> x }
229+ return (\o -> o{ optReferenceDoc = unpack <$> x })
223 "epub-subdirectory" ->
230 "epub-subdirectory" ->
231+ parseYAML v >>= \x ->
224− parseYAML v >>= \x -> return opt { optEpubSubdirectory = unpack x }
232+ return (\o -> o{ optEpubSubdirectory = unpack x })
225 "epub-metadata" ->
233 "epub-metadata" ->
234+ parseYAML v >>= \x ->
226− parseYAML v >>= \x -> return opt { optEpubMetadata = unpack <$> x }
235+ return (\o -> o{ optEpubMetadata = unpack <$> x })
227 "epub-fonts" ->
236 "epub-fonts" ->
228− parseYAML v >>= \x -> return opt { optEpubFonts = map unpack x }
237+ parseYAML v >>= \x -> return (\o -> o{ optEpubFonts = map unpack x })
229 "epub-chapter-level" ->
238 "epub-chapter-level" ->
230− parseYAML v >>= \x -> return opt { optEpubChapterLevel = x }
239+ parseYAML v >>= \x -> return (\o -> o{ optEpubChapterLevel = x })
231 "epub-cover-image" ->
240 "epub-cover-image" ->
241+ parseYAML v >>= \x ->
232− parseYAML v >>= \x -> return opt { optEpubCoverImage = unpack <$> x }
242+ return (\o -> o{ optEpubCoverImage = unpack <$> x })
233 "toc-depth" ->
243 "toc-depth" ->
234− parseYAML v >>= \x -> return opt { optTOCDepth = x }
244+ parseYAML v >>= \x -> return (\o -> o{ optTOCDepth = x })
235 "dump-args" ->
245 "dump-args" ->
236− parseYAML v >>= \x -> return opt { optDumpArgs = x }
246+ parseYAML v >>= \x -> return (\o -> o{ optDumpArgs = x })
237 "ignore-args" ->
247 "ignore-args" ->
238− parseYAML v >>= \x -> return opt { optIgnoreArgs = x }
248+ parseYAML v >>= \x -> return (\o -> o{ optIgnoreArgs = x })
239 "verbosity" ->
249 "verbosity" ->
240− parseYAML v >>= \x -> return opt { optVerbosity = x }
250+ parseYAML v >>= \x -> return (\o -> o{ optVerbosity = x })
241 "trace" ->
251 "trace" ->
242− parseYAML v >>= \x -> return opt { optTrace = x }
252+ parseYAML v >>= \x -> return (\o -> o{ optTrace = x })
243 "log-file" ->
253 "log-file" ->
244− parseYAML v >>= \x -> return opt { optLogFile = unpack <$> x }
254+ parseYAML v >>= \x -> return (\o -> o{ optLogFile = unpack <$> x })
245 "fail-if-warnings" ->
255 "fail-if-warnings" ->
246− parseYAML v >>= \x -> return opt { optFailIfWarnings = x }
256+ parseYAML v >>= \x -> return (\o -> o{ optFailIfWarnings = x })
247 "reference-links" ->
257 "reference-links" ->
248− parseYAML v >>= \x -> return opt { optReferenceLinks = x }
258+ parseYAML v >>= \x -> return (\o -> o{ optReferenceLinks = x })
249 "reference-location" ->
259 "reference-location" ->
250− parseYAML v >>= \x -> return opt { optReferenceLocation = x }
260+ parseYAML v >>= \x -> return (\o -> o{ optReferenceLocation = x })
252− parseYAML v >>= \x -> return opt { optDpi = x }
262+ parseYAML v >>= \x -> return (\o -> o{ optDpi = x })
253 "wrap" ->
263 "wrap" ->
254− parseYAML v >>= \x -> return opt { optWrap = x }
264+ parseYAML v >>= \x -> return (\o -> o{ optWrap = x })
255 "columns" ->
265 "columns" ->
256− parseYAML v >>= \x -> return opt { optColumns = x }
266+ parseYAML v >>= \x -> return (\o -> o{ optColumns = x })
257 "filters" ->
267 "filters" ->
258− parseYAML v >>= \x -> return opt { optFilters = x }
268+ parseYAML v >>= \x -> return (\o -> o{ optFilters = x })
259 "email-obfuscation" ->
269 "email-obfuscation" ->
260− parseYAML v >>= \x -> return opt { optEmailObfuscation = x }
270+ parseYAML v >>= \x -> return (\o -> o{ optEmailObfuscation = x })
261 "identifier-prefix" ->
271 "identifier-prefix" ->
272+ parseYAML v >>= \x ->
262− parseYAML v >>= \x -> return opt { optIdentifierPrefix = unpack x }
273+ return (\o -> o{ optIdentifierPrefix = unpack x })
263 "strip-empty-paragraphs" ->
274 "strip-empty-paragraphs" ->
264− parseYAML v >>= \x -> return opt { optStripEmptyParagraphs = x }
275+ parseYAML v >>= \x -> return (\o -> o{ optStripEmptyParagraphs = x })
265 "indented-code-classes" ->
276 "indented-code-classes" ->
277+ parseYAML v >>= \x ->
266− parseYAML v >>= \x -> return opt { optIndentedCodeClasses = map unpack x }
278+ return (\o -> o{ optIndentedCodeClasses = map unpack x })
267 "data-dir" ->
279 "data-dir" ->
268− parseYAML v >>= \x -> return opt { optDataDir = unpack <$> x }
280+ parseYAML v >>= \x -> return (\o -> o{ optDataDir = unpack <$> x })
269 "cite-method" ->
281 "cite-method" ->
270− parseYAML v >>= \x -> return opt { optCiteMethod = x }
282+ parseYAML v >>= \x -> return (\o -> o{ optCiteMethod = x })
271 "listings" ->
283 "listings" ->
272− parseYAML v >>= \x -> return opt { optListings = x }
284+ parseYAML v >>= \x -> return (\o -> o{ optListings = x })
273 "pdf-engine" ->
285 "pdf-engine" ->
274− parseYAML v >>= \x -> return opt { optPdfEngine = unpack <$> x }
286+ parseYAML v >>= \x -> return (\o -> o{ optPdfEngine = unpack <$> x })
275 "pdf-engine-opts" ->
287 "pdf-engine-opts" ->
288+ parseYAML v >>= \x ->
276− parseYAML v >>= \x -> return opt { optPdfEngineOpts = map unpack x }
289+ return (\o -> o{ optPdfEngineOpts = map unpack x })
277 "pdf-engine-opt" ->
290 "pdf-engine-opt" ->
291+ (parseYAML v >>= \x ->
278− (parseYAML v >>= \x -> return opt { optPdfEngineOpts = map unpack x })
292+ return (\o -> o{ optPdfEngineOpts = map unpack x }))
294+ (parseYAML v >>= \x ->
280− (parseYAML v >>= \x -> return opt { optPdfEngineOpts = [unpack x] })
295+ return (\o -> o{ optPdfEngineOpts = [unpack x] }))
281 "slide-level" ->
296 "slide-level" ->
282− parseYAML v >>= \x -> return opt { optSlideLevel = x }
297+ parseYAML v >>= \x -> return (\o -> o{ optSlideLevel = x })
283 "setext-headers" ->
298 "setext-headers" ->
284− parseYAML v >>= \x -> return opt { optSetextHeaders = x }
299+ parseYAML v >>= \x -> return (\o -> o{ optSetextHeaders = x })
285 "ascii" ->
300 "ascii" ->
286− parseYAML v >>= \x -> return opt { optAscii = x }
301+ parseYAML v >>= \x -> return (\o -> o{ optAscii = x })
287 "default-image-extension" ->
302 "default-image-extension" ->
303+ parseYAML v >>= \x ->
288− parseYAML v >>= \x -> return opt { optDefaultImageExtension = unpack x }
304+ return (\o -> o{ optDefaultImageExtension = unpack x })
289 "extract-media" ->
305 "extract-media" ->
306+ parseYAML v >>= \x ->
290− parseYAML v >>= \x -> return opt { optExtractMedia = unpack <$> x }
307+ return (\o -> o{ optExtractMedia = unpack <$> x })
291 "track-changes" ->
308 "track-changes" ->
292− parseYAML v >>= \x -> return opt { optTrackChanges = x }
309+ parseYAML v >>= \x -> return (\o -> o{ optTrackChanges = x })
293 "file-scope" ->
310 "file-scope" ->
294− parseYAML v >>= \x -> return opt { optFileScope = x }
311+ parseYAML v >>= \x -> return (\o -> o{ optFileScope = x })
295 "title-prefix" ->
312 "title-prefix" ->
296− parseYAML v >>= \x -> return opt { optTitlePrefix = unpack <$> x }
313+ parseYAML v >>= \x -> return (\o -> o{ optTitlePrefix = unpack <$> x })
298− (parseYAML v >>= \x -> return opt { optCss = map unpack x })
315+ (parseYAML v >>= \x -> return (\o -> o{ optCss = map unpack x }))
300− (parseYAML v >>= \x -> return opt { optCss = [unpack x] })
317+ (parseYAML v >>= \x -> return (\o -> o{ optCss = [unpack x] }))
301 "ipynb-output" ->
318 "ipynb-output" ->
302− parseYAML v >>= \x -> return opt { optIpynbOutput = x }
319+ parseYAML v >>= \x -> return (\o -> o{ optIpynbOutput = x })
303 "include-before-body" ->
320 "include-before-body" ->
321+ (parseYAML v >>= \x ->
304− (parseYAML v >>= \x -> return opt { optIncludeBeforeBody = map unpack x })
322+ return (\o -> o{ optIncludeBeforeBody = map unpack x }))
324+ (parseYAML v >>= \x ->
306− (parseYAML v >>= \x -> return opt { optIncludeBeforeBody = [unpack x] })
325+ return (\o -> o{ optIncludeBeforeBody = [unpack x] }))
307 "include-after-body" ->
326 "include-after-body" ->
327+ (parseYAML v >>= \x ->
308− (parseYAML v >>= \x -> return opt { optIncludeAfterBody = map unpack x })
328+ return (\o -> o{ optIncludeAfterBody = map unpack x }))
330+ (parseYAML v >>= \x ->
310− (parseYAML v >>= \x -> return opt { optIncludeAfterBody = [unpack x] })
331+ return (\o -> o{ optIncludeAfterBody = [unpack x] }))
311 "include-in-header" ->
332 "include-in-header" ->
333+ (parseYAML v >>= \x ->
312− (parseYAML v >>= \x -> return opt { optIncludeInHeader = map unpack x })
334+ return (\o -> o{ optIncludeInHeader = map unpack x }))
336+ (parseYAML v >>= \x ->
314− (parseYAML v >>= \x -> return opt { optIncludeInHeader = [unpack x] })
337+ return (\o -> o{ optIncludeInHeader = [unpack x] }))
315 "resource-path" ->
338 "resource-path" ->
339+ parseYAML v >>= \x ->
316− parseYAML v >>= \x -> return opt { optResourcePath = map unpack x }
340+ return (\o -> o{ optResourcePath = map unpack x })
317 "request-headers" ->
341 "request-headers" ->
342+ parseYAML v >>= \x ->
318− parseYAML v >>= \x -> return opt { optRequestHeaders =
343+ return (\o -> o{ optRequestHeaders =
319 map (\(key,val) ->
344 map (\(key,val) ->
320− (unpack key, unpack val)) x }
345+ (unpack key, unpack val)) x })
322− parseYAML v >>= \x -> return opt { optEol = x }
347+ parseYAML v >>= \x -> return (\o -> o{ optEol = x })
323 "strip-comments" ->
348 "strip-comments" ->
324− parseYAML v >>= \x -> return opt { optStripComments = x }
349+ parseYAML v >>= \x -> return (\o -> o { optStripComments = x })
325 _ -> failAtNode k' $ "Unknown option " ++ show k
350 _ -> failAtNode k' $ "Unknown option " ++ show k
327-- | Defaults for command-line options.
352-- | Defaults for command-line options.