@@ -22,7 +22,6 @@ module Text.Pandoc.App.Opt (
2222 , IpynbOutput (..)
2323 , DefaultsState (..)
2424 , defaultOpts
25− , addMeta
2625 , applyDefaults
2726 , fullDefaultsPath
2827 ) where
@@ -32,7 +31,6 @@ import System.FilePath ( addExtension, (</>), takeExtension )
3231import Data.Char (isLower, toLower)
3332import Data.Maybe (fromMaybe)
3433import GHC.Generics hiding (Meta)
35−import Text.Pandoc.Builder (setMeta)
3634import Text.Pandoc.Filter (Filter (..))
3735import Text.Pandoc.Logging (Verbosity (WARNING))
3836import Text.Pandoc.Options (TopLevelDivision (TopLevelDefault),
@@ -52,7 +50,7 @@ import Data.Text (Text, unpack)
5250import Data.Default (def)
5351import qualified Data.Text as T
5452import qualified Data.Map as M
55−import Text.Pandoc.Definition (Meta(..), MetaValue(..), lookupMeta)
53+import Text.Pandoc.Definition (Meta(..), MetaValue(..))
5654import Data.Aeson (defaultOptions, Options(..))
5755import Data.Aeson.TH (deriveJSON)
5856import Control.Applicative ((<|>))
@@ -156,6 +154,9 @@ data Opt = Opt
156154 , optNoCheckCertificate :: Bool -- ^ Disable certificate validation
157155 , optEol :: LineEnding -- ^ Style of line-endings to use
158156 , optStripComments :: Bool -- ^ Skip HTML comments
157+ , optCSL :: Maybe FilePath -- ^ CSL stylesheet
158+ , optBibliography :: [FilePath] -- ^ Bibliography files
159+ , optCitationAbbreviations :: Maybe FilePath -- ^ Citation abbreviations
159160 } deriving (Generic, Show)
160161
161162instance FromYAML (Opt -> Opt) where
@@ -428,26 +429,18 @@ doOpt (k',v) = do
428429 (parseYAML v >>= \x -> return (\o -> o{ optCss = optCss o <>
429430 [unpack x] }))
430431 "bibliography" ->
431− do let addItem x o = o{ optMetadata =
432− addMeta "bibliography" (T.unpack x)
433− (optMetadata o) }
434− (parseYAML v >>= \(xs :: [Text]) -> return $ \o ->
435− foldr addItem o xs)
436− <|>
437− (parseYAML v >>= \(x :: Text) -> return $ \o -> addItem x o)
432+ (parseYAML v >>= \x -> return (\o ->
433+ o{ optBibliography = optBibliography o <>
434+ map unpack x }))
435+ <|>
436+ (parseYAML v >>= \x -> return (\o ->
437+ o{ optBibliography = optBibliography o <>
438+ [unpack x] }))
438439 "csl" ->
439− do let addItem x o = o{ optMetadata =
440− addMeta "csl" (T.unpack x)
441− (optMetadata o) }
442− (parseYAML v >>= \(xs :: [Text]) -> return $ \o ->
443− foldr addItem o xs)
444− <|>
445− (parseYAML v >>= \(x :: Text) -> return $ \o -> addItem x o)
440+ parseYAML v >>= \x -> return (\o -> o{ optCSL = unpack <$> x })
446441 "citation-abbreviations" ->
447− parseYAML v >>= \x ->
448− return (\o -> o{ optMetadata =
449− addMeta "citation-abbreviations" (T.unpack x)
450− (optMetadata o) })
442+ parseYAML v >>= \x -> return (\o -> o{ optCitationAbbreviations =
443+ unpack <$> x })
451444 "ipynb-output" ->
452445 parseYAML v >>= \x -> return (\o -> o{ optIpynbOutput = x })
453446 "include-before-body" ->
@@ -562,6 +555,9 @@ defaultOpts = Opt
562555 , optNoCheckCertificate = False
563556 , optEol = Native
564557 , optStripComments = False
558+ , optCSL = Nothing
559+ , optBibliography = []
560+ , optCitationAbbreviations = Nothing
565561 }
566562
567563parseStringKey :: Node Pos -> Parser Text
@@ -579,27 +575,6 @@ yamlToMeta (Mapping _ _ m) =
579575 >>= fmap (Meta . flip P.runF def)
580576yamlToMeta _ = return mempty
581577
582−addMeta :: String -> String -> Meta -> Meta
583−addMeta k v meta =
584− case lookupMeta k' meta of
585− Nothing -> setMeta k' v' meta
586− Just (MetaList xs) ->
587− setMeta k' (MetaList (xs ++ [v'])) meta
588− Just x -> setMeta k' (MetaList [x, v']) meta
589− where
590− v' = readMetaValue v
591− k' = T.pack k
592−
593−readMetaValue :: String -> MetaValue
594−readMetaValue s
595− | s == "true" = MetaBool True
596− | s == "True" = MetaBool True
597− | s == "TRUE" = MetaBool True
598− | s == "false" = MetaBool False
599− | s == "False" = MetaBool False
600− | s == "FALSE" = MetaBool False
601− | otherwise = MetaString $ T.pack s
602−
603578-- | Apply defaults from --defaults file.
604579applyDefaults :: (PandocMonad m, MonadIO m)
605580 => Opt
@@ -625,12 +600,9 @@ fullDefaultsPath dataDir file = do
625600 let fp = if null (takeExtension file)
626601 then addExtension file "yaml"
627602 else file
628− dataDirs <- liftIO defaultUserDataDirs
629− let fps = fp : case dataDir of
630− Nothing -> map (</> ("defaults" </> fp))
631− dataDirs
632− Just dd -> [dd </> "defaults" </> fp]
633− fromMaybe fp <$> findM fileExists fps
603+ defaultDataDir <- liftIO defaultUserDataDir
604+ let defaultFp = fromMaybe defaultDataDir dataDir </> "defaults" </> fp
605+ fromMaybe fp <$> findM fileExists [fp, defaultFp]
634606
635607-- | In a list of lists, append another list in front of every list which
636608-- starts with specific element.