diff options
| author | John MacFarlane <[email protected]> | 2024-12-11 19:38:00 -0800 |
|---|---|---|
| committer | John MacFarlane <[email protected]> | 2024-12-11 19:38:00 -0800 |
| commit | d04e490f1d63e8f459bd9d1875febab2bfe59583 (patch) | |
| tree | 5b9ee3eaeef8ecf794bda1a7f52495ccd18cca59 | |
| parent | 4272e8a7c2d9645d8dc1b6d1874071154228266e (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.hs | 19 |
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) |
