aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn MacFarlane <[email protected]>2024-12-11 19:38:00 -0800
committerJohn MacFarlane <[email protected]>2024-12-11 19:38:00 -0800
commitd04e490f1d63e8f459bd9d1875febab2bfe59583 (patch)
tree5b9ee3eaeef8ecf794bda1a7f52495ccd18cca59
parent4272e8a7c2d9645d8dc1b6d1874071154228266e (diff)
Allow YAML bibliographies to be arrays of references.
Previously, they had to be YAML objects with a `references` key. Closes #10452.
-rw-r--r--src/Text/Pandoc/Readers/Metadata.hs19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/Text/Pandoc/Readers/Metadata.hs b/src/Text/Pandoc/Readers/Metadata.hs
index eb38294ed..e319b7c88 100644
--- a/src/Text/Pandoc/Readers/Metadata.hs
+++ b/src/Text/Pandoc/Readers/Metadata.hs
@@ -21,6 +21,7 @@ module Text.Pandoc.Readers.Metadata (
import Control.Monad.Except (throwError)
import qualified Data.ByteString as B
import qualified Data.Map as M
+import qualified Data.Vector as V
import Data.Text (Text)
import qualified Data.Text as T
import qualified Data.Yaml as Yaml
@@ -83,20 +84,24 @@ yamlBsToRefs :: (PandocMonad m, HasLastStrPosition st)
yamlBsToRefs pMetaValue idpred bstr =
case Yaml.decodeAllEither' bstr of
Right (Object m : _) -> do
- let isSelected (String t) = idpred t
- isSelected _ = False
- let hasSelectedId (Object o) =
- case parse (withObject "ref" (.:? "id")) (Object o) of
- Success (Just id') -> isSelected id'
- _ -> False
- hasSelectedId _ = False
case parse (withObject "metadata" (.:? "references")) (Object m) of
Success (Just refs) -> sequence <$>
mapM (yamlToMetaValue pMetaValue) (filter hasSelectedId refs)
_ -> return $ return []
+ Right (Array v : _) -> do
+ let refs = filter hasSelectedId $ V.toList v
+ sequence <$> mapM (yamlToMetaValue pMetaValue) (filter hasSelectedId refs)
Right _ -> return . return $ []
Left err' -> throwError $ PandocParseError
$ T.pack $ Yaml.prettyPrintParseException err'
+ where
+ isSelected (String t) = idpred t
+ isSelected _ = False
+ hasSelectedId (Object o) =
+ case parse (withObject "ref" (.:? "id")) (Object o) of
+ Success (Just id') -> isSelected id'
+ _ -> False
+ hasSelectedId _ = False
normalizeMetaValue :: (PandocMonad m, HasLastStrPosition st)
=> ParsecT Sources st m (Future st MetaValue)