git.iko.soy/typeable/pandoc
on master help sign in
`--defaults` improvements.

- ToYAML instance is now for `Opt -> Opt`, rather than `Opt`. - This allows us to handle `--defaults` without clobbering all the options that occur prior to `--defaults` on the command line. (Note, however, that options in `--defaults` can replace these options if the `--defaults` option is used after them, which may be a bit confusing given the name.) - `--defaults` may now be used multiple times on the command line, allowing users to break defaults into different chunks.

commitbf9e3faa3589e76e740bb272555c620975b97346 authorJohn MacFarlane <jgm@berkeley.edu> dateFri 1 Nov 2019, 09:03 (7 years ago) parent4e902b1
3 files changed+117−95
MANUAL.txt+3−6 src/Text/Pandoc/App/CommandLineOptions.hs+1−1 src/Text/Pandoc/App/Opt.hs+113−88
MANUAL.txt+3−6
@@ -366,12 +366,9 @@ header when requesting a document from a URL:
366366 the `defaults` subdirectory of the user data directory
367367 (see `--data-dir`). The `.yaml` extension may be omitted.
368368 See the section [Default files] for more information on the
369− file format.
370−
371− If a defaults file is used, its defaults will replace
372− any options that have been previously specified on the
373− command line, and they may be overridden by subsequent
374− options on the command line.
369+ file format. Settings from the defaults file may be
370+ overridden or extended by subsequent options on the command
371+ line.
375372
376373`--bash-completion`
377374
src/Text/Pandoc/App/CommandLineOptions.hs+1−1
@@ -174,7 +174,7 @@ options =
174174 fp' <- fromMaybe fp <$> findFile fps
175175 inp <- readFileLazy fp'
176176 case Y.decode1 inp of
177− Right (newopts :: Opt) -> return newopts
177+ Right (f :: Opt -> Opt) -> return $ f opt
178178 Left (errpos, errmsg) -> throwError $
179179 PandocParseError $
180180 "Error parsing " ++ fp' ++ " line " ++
src/Text/Pandoc/App/Opt.hs+113−88
@@ -4,6 +4,7 @@
44{-# LANGUAGE CPP #-}
55{-# LANGUAGE DeriveGeneric #-}
66{-# LANGUAGE TemplateHaskell #-}
7+{-# LANGUAGE FlexibleInstances #-}
78{- |
89 Module : Text.Pandoc.App.Opt
910 Copyright : Copyright (C) 2006-2019 John MacFarlane
@@ -41,7 +42,6 @@ import qualified Data.Map as M
4142import Text.Pandoc.Definition (Meta(..), MetaValue(..))
4243import Data.Aeson (defaultOptions, Options(..))
4344import Data.Aeson.TH (deriveJSON)
44−import Control.Monad (foldM)
4545import Control.Applicative ((<|>))
4646import Data.YAML
4747
@@ -144,184 +144,209 @@ data Opt = Opt
144144 , optStripComments :: Bool -- ^ Skip HTML comments
145145 } deriving (Generic, Show)
146146
147−instance FromYAML Opt where
147+instance FromYAML (Opt -> Opt) where
148148 parseYAML (Mapping _ _ m) =
149− foldM doOpt defaultOpts (M.toList m)
149+ foldr (.) id <$> mapM doOpt (M.toList m)
150150 parseYAML n = failAtNode n "Expected a mapping"
151151
152−doOpt :: Opt -> (Node Pos, Node Pos) -> Parser Opt
153−doOpt opt (k',v) = do
152+doOpt :: (Node Pos, Node Pos) -> Parser (Opt -> Opt)
153+doOpt (k',v) = do
154154 k <- case k' of
155155 Scalar _ (SStr t) -> return t
156156 Scalar _ _ -> failAtNode k' "Non-string key"
157157 _ -> failAtNode k' "Non-scalar key"
158158 case k of
159159 "tab-stop" ->
160− parseYAML v >>= \x -> return opt{ optTabStop = x }
160+ parseYAML v >>= \x -> return (\o -> o{ optTabStop = x })
161161 "preserve-tabs" ->
162− parseYAML v >>= \x -> return opt { optPreserveTabs = x }
162+ parseYAML v >>= \x -> return (\o -> o{ optPreserveTabs = x })
163163 "standalone" ->
164− parseYAML v >>= \x -> return opt { optStandalone = x }
164+ parseYAML v >>= \x -> return (\o -> o{ optStandalone = x })
165165 "table-of-contents" ->
166− parseYAML v >>= \x -> return opt { optTableOfContents = x }
166+ parseYAML v >>= \x -> return (\o -> o{ optTableOfContents = x })
167167 "toc" ->
168− parseYAML v >>= \x -> return opt { optTableOfContents = x }
168+ parseYAML v >>= \x -> return (\o -> o{ optTableOfContents = x })
169169 "from" ->
170− parseYAML v >>= \x -> return opt { optFrom = unpack <$> x }
170+ parseYAML v >>= \x -> return (\o -> o{ optFrom = unpack <$> x })
171171 "reader" ->
172− parseYAML v >>= \x -> return opt { optFrom = unpack <$> x }
172+ parseYAML v >>= \x -> return (\o -> o{ optFrom = unpack <$> x })
173173 "to" ->
174− parseYAML v >>= \x -> return opt { optTo = unpack <$> x }
174+ parseYAML v >>= \x -> return (\o -> o{ optTo = unpack <$> x })
175175 "writer" ->
176− parseYAML v >>= \x -> return opt { optTo = unpack <$> x }
176+ parseYAML v >>= \x -> return (\o -> o{ optTo = unpack <$> x })
177177 "shift-heading-level-by" ->
178− parseYAML v >>= \x -> return opt { optShiftHeadingLevelBy = x }
178+ parseYAML v >>= \x -> return (\o -> o{ optShiftHeadingLevelBy = x })
179179 "template" ->
180− parseYAML v >>= \x -> return opt { optTemplate = unpack <$> x }
180+ parseYAML v >>= \x -> return (\o -> o{ optTemplate = unpack <$> x })
181181 "variables" ->
182− parseYAML v >>= \x -> return opt { optVariables = x }
182+ parseYAML v >>= \x -> return (\o -> o{ optVariables = x })
183183 "metadata" ->
184− parseYAML v >>= \x -> return opt { optMetadata = contextToMeta x }
184+ parseYAML v >>= \x -> return (\o -> o{ optMetadata = contextToMeta x })
185185 "metadata-files" ->
186− (parseYAML v >>= \x -> return opt { optMetadataFiles = map unpack x })
186+ (parseYAML v >>= \x ->
187+ return (\o -> o{ optMetadataFiles = map unpack x }))
187188 "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 }))
189190 <|>
190− (parseYAML v >>= \x -> return opt { optMetadataFiles = [unpack x] })
191+ (parseYAML v >>= \x ->
192+ return (\o -> o{ optMetadataFiles = [unpack x] }))
191193 "output-file" ->
192− parseYAML v >>= \x -> return opt { optOutputFile = unpack <$> x }
194+ parseYAML v >>= \x -> return (\o -> o{ optOutputFile = unpack <$> x })
193195 "input-files" ->
194− parseYAML v >>= \x -> return opt { optInputFiles = map unpack x }
196+ parseYAML v >>= \x -> return (\o -> o{ optInputFiles = map unpack x })
195197 "number-sections" ->
196− parseYAML v >>= \x -> return opt { optNumberSections = x }
198+ parseYAML v >>= \x -> return (\o -> o{ optNumberSections = x })
197199 "number-offset" ->
198− parseYAML v >>= \x -> return opt { optNumberOffset = x }
200+ parseYAML v >>= \x -> return (\o -> o{ optNumberOffset = x })
199201 "section-divs" ->
200− parseYAML v >>= \x -> return opt { optSectionDivs = x }
202+ parseYAML v >>= \x -> return (\o -> o{ optSectionDivs = x })
201203 "incremental" ->
202− parseYAML v >>= \x -> return opt { optIncremental = x }
204+ parseYAML v >>= \x -> return (\o -> o{ optIncremental = x })
203205 "self-contained" ->
204− parseYAML v >>= \x -> return opt { optSelfContained = x }
206+ parseYAML v >>= \x -> return (\o -> o{ optSelfContained = x })
205207 "html-q-tags" ->
206− parseYAML v >>= \x -> return opt { optHtmlQTags = x }
208+ parseYAML v >>= \x -> return (\o -> o{ optHtmlQTags = x })
207209 "highlight-style" ->
208− parseYAML v >>= \x -> return opt { optHighlightStyle = unpack <$> x }
210+ parseYAML v >>= \x -> return (\o -> o{ optHighlightStyle = unpack <$> x })
209211 "syntax-definition" ->
210− (parseYAML v >>= \x -> return opt { optSyntaxDefinitions = map unpack x })
212+ (parseYAML v >>= \x ->
213+ return (\o -> o{ optSyntaxDefinitions = map unpack x }))
211214 <|>
212− (parseYAML v >>= \x -> return opt { optSyntaxDefinitions = [unpack x] })
215+ (parseYAML v >>= \x ->
216+ return (\o -> o{ optSyntaxDefinitions = [unpack x] }))
213217 "syntax-definitions" ->
214− parseYAML v >>= \x -> return opt { optSyntaxDefinitions = map unpack x }
218+ parseYAML v >>= \x ->
219+ return (\o -> o{ optSyntaxDefinitions = map unpack x })
215220 "top-level-division" ->
216− parseYAML v >>= \x -> return opt { optTopLevelDivision = x }
221+ parseYAML v >>= \x -> return (\o -> o{ optTopLevelDivision = x })
217222 "html-math-method" ->
218− parseYAML v >>= \x -> return opt { optHTMLMathMethod = x }
223+ parseYAML v >>= \x -> return (\o -> o{ optHTMLMathMethod = x })
219224 "abbreviations" ->
220− parseYAML v >>= \x -> return opt { optAbbreviations = unpack <$> x }
225+ parseYAML v >>= \x ->
226+ return (\o -> o{ optAbbreviations = unpack <$> x })
221227 "reference-doc" ->
222− parseYAML v >>= \x -> return opt { optReferenceDoc = unpack <$> x }
228+ parseYAML v >>= \x ->
229+ return (\o -> o{ optReferenceDoc = unpack <$> x })
223230 "epub-subdirectory" ->
224− parseYAML v >>= \x -> return opt { optEpubSubdirectory = unpack x }
231+ parseYAML v >>= \x ->
232+ return (\o -> o{ optEpubSubdirectory = unpack x })
225233 "epub-metadata" ->
226− parseYAML v >>= \x -> return opt { optEpubMetadata = unpack <$> x }
234+ parseYAML v >>= \x ->
235+ return (\o -> o{ optEpubMetadata = unpack <$> x })
227236 "epub-fonts" ->
228− parseYAML v >>= \x -> return opt { optEpubFonts = map unpack x }
237+ parseYAML v >>= \x -> return (\o -> o{ optEpubFonts = map unpack x })
229238 "epub-chapter-level" ->
230− parseYAML v >>= \x -> return opt { optEpubChapterLevel = x }
239+ parseYAML v >>= \x -> return (\o -> o{ optEpubChapterLevel = x })
231240 "epub-cover-image" ->
232− parseYAML v >>= \x -> return opt { optEpubCoverImage = unpack <$> x }
241+ parseYAML v >>= \x ->
242+ return (\o -> o{ optEpubCoverImage = unpack <$> x })
233243 "toc-depth" ->
234− parseYAML v >>= \x -> return opt { optTOCDepth = x }
244+ parseYAML v >>= \x -> return (\o -> o{ optTOCDepth = x })
235245 "dump-args" ->
236− parseYAML v >>= \x -> return opt { optDumpArgs = x }
246+ parseYAML v >>= \x -> return (\o -> o{ optDumpArgs = x })
237247 "ignore-args" ->
238− parseYAML v >>= \x -> return opt { optIgnoreArgs = x }
248+ parseYAML v >>= \x -> return (\o -> o{ optIgnoreArgs = x })
239249 "verbosity" ->
240− parseYAML v >>= \x -> return opt { optVerbosity = x }
250+ parseYAML v >>= \x -> return (\o -> o{ optVerbosity = x })
241251 "trace" ->
242− parseYAML v >>= \x -> return opt { optTrace = x }
252+ parseYAML v >>= \x -> return (\o -> o{ optTrace = x })
243253 "log-file" ->
244− parseYAML v >>= \x -> return opt { optLogFile = unpack <$> x }
254+ parseYAML v >>= \x -> return (\o -> o{ optLogFile = unpack <$> x })
245255 "fail-if-warnings" ->
246− parseYAML v >>= \x -> return opt { optFailIfWarnings = x }
256+ parseYAML v >>= \x -> return (\o -> o{ optFailIfWarnings = x })
247257 "reference-links" ->
248− parseYAML v >>= \x -> return opt { optReferenceLinks = x }
258+ parseYAML v >>= \x -> return (\o -> o{ optReferenceLinks = x })
249259 "reference-location" ->
250− parseYAML v >>= \x -> return opt { optReferenceLocation = x }
260+ parseYAML v >>= \x -> return (\o -> o{ optReferenceLocation = x })
251261 "dpi" ->
252− parseYAML v >>= \x -> return opt { optDpi = x }
262+ parseYAML v >>= \x -> return (\o -> o{ optDpi = x })
253263 "wrap" ->
254− parseYAML v >>= \x -> return opt { optWrap = x }
264+ parseYAML v >>= \x -> return (\o -> o{ optWrap = x })
255265 "columns" ->
256− parseYAML v >>= \x -> return opt { optColumns = x }
266+ parseYAML v >>= \x -> return (\o -> o{ optColumns = x })
257267 "filters" ->
258− parseYAML v >>= \x -> return opt { optFilters = x }
268+ parseYAML v >>= \x -> return (\o -> o{ optFilters = x })
259269 "email-obfuscation" ->
260− parseYAML v >>= \x -> return opt { optEmailObfuscation = x }
270+ parseYAML v >>= \x -> return (\o -> o{ optEmailObfuscation = x })
261271 "identifier-prefix" ->
262− parseYAML v >>= \x -> return opt { optIdentifierPrefix = unpack x }
272+ parseYAML v >>= \x ->
273+ return (\o -> o{ optIdentifierPrefix = unpack x })
263274 "strip-empty-paragraphs" ->
264− parseYAML v >>= \x -> return opt { optStripEmptyParagraphs = x }
275+ parseYAML v >>= \x -> return (\o -> o{ optStripEmptyParagraphs = x })
265276 "indented-code-classes" ->
266− parseYAML v >>= \x -> return opt { optIndentedCodeClasses = map unpack x }
277+ parseYAML v >>= \x ->
278+ return (\o -> o{ optIndentedCodeClasses = map unpack x })
267279 "data-dir" ->
268− parseYAML v >>= \x -> return opt { optDataDir = unpack <$> x }
280+ parseYAML v >>= \x -> return (\o -> o{ optDataDir = unpack <$> x })
269281 "cite-method" ->
270− parseYAML v >>= \x -> return opt { optCiteMethod = x }
282+ parseYAML v >>= \x -> return (\o -> o{ optCiteMethod = x })
271283 "listings" ->
272− parseYAML v >>= \x -> return opt { optListings = x }
284+ parseYAML v >>= \x -> return (\o -> o{ optListings = x })
273285 "pdf-engine" ->
274− parseYAML v >>= \x -> return opt { optPdfEngine = unpack <$> x }
286+ parseYAML v >>= \x -> return (\o -> o{ optPdfEngine = unpack <$> x })
275287 "pdf-engine-opts" ->
276− parseYAML v >>= \x -> return opt { optPdfEngineOpts = map unpack x }
288+ parseYAML v >>= \x ->
289+ return (\o -> o{ optPdfEngineOpts = map unpack x })
277290 "pdf-engine-opt" ->
278− (parseYAML v >>= \x -> return opt { optPdfEngineOpts = map unpack x })
291+ (parseYAML v >>= \x ->
292+ return (\o -> o{ optPdfEngineOpts = map unpack x }))
279293 <|>
280− (parseYAML v >>= \x -> return opt { optPdfEngineOpts = [unpack x] })
294+ (parseYAML v >>= \x ->
295+ return (\o -> o{ optPdfEngineOpts = [unpack x] }))
281296 "slide-level" ->
282− parseYAML v >>= \x -> return opt { optSlideLevel = x }
297+ parseYAML v >>= \x -> return (\o -> o{ optSlideLevel = x })
283298 "setext-headers" ->
284− parseYAML v >>= \x -> return opt { optSetextHeaders = x }
299+ parseYAML v >>= \x -> return (\o -> o{ optSetextHeaders = x })
285300 "ascii" ->
286− parseYAML v >>= \x -> return opt { optAscii = x }
301+ parseYAML v >>= \x -> return (\o -> o{ optAscii = x })
287302 "default-image-extension" ->
288− parseYAML v >>= \x -> return opt { optDefaultImageExtension = unpack x }
303+ parseYAML v >>= \x ->
304+ return (\o -> o{ optDefaultImageExtension = unpack x })
289305 "extract-media" ->
290− parseYAML v >>= \x -> return opt { optExtractMedia = unpack <$> x }
306+ parseYAML v >>= \x ->
307+ return (\o -> o{ optExtractMedia = unpack <$> x })
291308 "track-changes" ->
292− parseYAML v >>= \x -> return opt { optTrackChanges = x }
309+ parseYAML v >>= \x -> return (\o -> o{ optTrackChanges = x })
293310 "file-scope" ->
294− parseYAML v >>= \x -> return opt { optFileScope = x }
311+ parseYAML v >>= \x -> return (\o -> o{ optFileScope = x })
295312 "title-prefix" ->
296− parseYAML v >>= \x -> return opt { optTitlePrefix = unpack <$> x }
313+ parseYAML v >>= \x -> return (\o -> o{ optTitlePrefix = unpack <$> x })
297314 "css" ->
298− (parseYAML v >>= \x -> return opt { optCss = map unpack x })
315+ (parseYAML v >>= \x -> return (\o -> o{ optCss = map unpack x }))
299316 <|>
300− (parseYAML v >>= \x -> return opt { optCss = [unpack x] })
317+ (parseYAML v >>= \x -> return (\o -> o{ optCss = [unpack x] }))
301318 "ipynb-output" ->
302− parseYAML v >>= \x -> return opt { optIpynbOutput = x }
319+ parseYAML v >>= \x -> return (\o -> o{ optIpynbOutput = x })
303320 "include-before-body" ->
304− (parseYAML v >>= \x -> return opt { optIncludeBeforeBody = map unpack x })
321+ (parseYAML v >>= \x ->
322+ return (\o -> o{ optIncludeBeforeBody = map unpack x }))
305323 <|>
306− (parseYAML v >>= \x -> return opt { optIncludeBeforeBody = [unpack x] })
324+ (parseYAML v >>= \x ->
325+ return (\o -> o{ optIncludeBeforeBody = [unpack x] }))
307326 "include-after-body" ->
308− (parseYAML v >>= \x -> return opt { optIncludeAfterBody = map unpack x })
327+ (parseYAML v >>= \x ->
328+ return (\o -> o{ optIncludeAfterBody = map unpack x }))
309329 <|>
310− (parseYAML v >>= \x -> return opt { optIncludeAfterBody = [unpack x] })
330+ (parseYAML v >>= \x ->
331+ return (\o -> o{ optIncludeAfterBody = [unpack x] }))
311332 "include-in-header" ->
312− (parseYAML v >>= \x -> return opt { optIncludeInHeader = map unpack x })
333+ (parseYAML v >>= \x ->
334+ return (\o -> o{ optIncludeInHeader = map unpack x }))
313335 <|>
314− (parseYAML v >>= \x -> return opt { optIncludeInHeader = [unpack x] })
336+ (parseYAML v >>= \x ->
337+ return (\o -> o{ optIncludeInHeader = [unpack x] }))
315338 "resource-path" ->
316− parseYAML v >>= \x -> return opt { optResourcePath = map unpack x }
339+ parseYAML v >>= \x ->
340+ return (\o -> o{ optResourcePath = map unpack x })
317341 "request-headers" ->
318− parseYAML v >>= \x -> return opt { optRequestHeaders =
342+ parseYAML v >>= \x ->
343+ return (\o -> o{ optRequestHeaders =
319344 map (\(key,val) ->
320− (unpack key, unpack val)) x }
345+ (unpack key, unpack val)) x })
321346 "eol" ->
322− parseYAML v >>= \x -> return opt { optEol = x }
347+ parseYAML v >>= \x -> return (\o -> o{ optEol = x })
323348 "strip-comments" ->
324− parseYAML v >>= \x -> return opt { optStripComments = x }
349+ parseYAML v >>= \x -> return (\o -> o { optStripComments = x })
325350 _ -> failAtNode k' $ "Unknown option " ++ show k
326351
327352-- | Defaults for command-line options.