aboutsummaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Readers
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2020-10-07 13:02:36 -0700
committerJohn MacFarlane <jgm@berkeley.edu>2020-10-07 13:12:32 -0700
commit428f8b4d204bf90118f01b0a03b6763b626a6532 (patch)
tree91f552dc7c9a09d7d498a21a73cbab2ae64dcb68 /src/Text/Pandoc/Readers
parent69b030c7dfa0e7dc454cc589747f8fc7f5987510 (diff)
downloadpandoc-428f8b4d204bf90118f01b0a03b6763b626a6532.tar.gz
Raise informative errors when YAML metadata parsing fails.
Closes #6730. Previously the command would succeed, returning empty metadata, with no errors or warnings. API changes: - Remove now unused CouldNotParseYamlMetadata constructor for LogMessage (T.P.Logging). - Add 'Maybe FilePath' parameter to yamlToMeta in T.P.Readers.Markdown.
Diffstat (limited to 'src/Text/Pandoc/Readers')
-rw-r--r--src/Text/Pandoc/Readers/Markdown.hs16
-rw-r--r--src/Text/Pandoc/Readers/Metadata.hs40
2 files changed, 28 insertions, 28 deletions
diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs
index 1a4c63de0..d8296ea61 100644
--- a/src/Text/Pandoc/Readers/Markdown.hs
+++ b/src/Text/Pandoc/Readers/Markdown.hs
@@ -67,11 +67,17 @@ readMarkdown opts s = do
-- String scalars in the YAML are parsed as Markdown.
yamlToMeta :: PandocMonad m
=> ReaderOptions
+ -> Maybe FilePath
-> BL.ByteString
-> m Meta
-yamlToMeta opts bstr = do
+yamlToMeta opts mbfp bstr = do
let parser = do
+ oldPos <- getPosition
+ case mbfp of
+ Nothing -> return ()
+ Just fp -> setPosition $ initialPos fp
meta <- yamlBsToMeta (fmap B.toMetaValue <$> parseBlocks) bstr
+ setPosition oldPos
return $ runF meta defaultParserState
parsed <- readWithM parser def{ stateOptions = opts } ""
case parsed of
@@ -84,11 +90,17 @@ yamlToMeta opts bstr = do
yamlToRefs :: PandocMonad m
=> (Text -> Bool)
-> ReaderOptions
+ -> Maybe FilePath
-> BL.ByteString
-> m [MetaValue]
-yamlToRefs idpred opts bstr = do
+yamlToRefs idpred opts mbfp bstr = do
let parser = do
+ oldPos <- getPosition
+ case mbfp of
+ Nothing -> return ()
+ Just fp -> setPosition $ initialPos fp
refs <- yamlBsToRefs (fmap B.toMetaValue <$> parseBlocks) idpred bstr
+ setPosition oldPos
return $ runF refs defaultParserState
parsed <- readWithM parser def{ stateOptions = opts } ""
case parsed of
diff --git a/src/Text/Pandoc/Readers/Metadata.hs b/src/Text/Pandoc/Readers/Metadata.hs
index 5154e3174..bdc4c29bf 100644
--- a/src/Text/Pandoc/Readers/Metadata.hs
+++ b/src/Text/Pandoc/Readers/Metadata.hs
@@ -37,21 +37,19 @@ yamlBsToMeta :: PandocMonad m
-> BL.ByteString
-> ParserT Text ParserState m (F Meta)
yamlBsToMeta pMetaValue bstr = do
- pos <- getPosition
case YAML.decodeNode' YAML.failsafeSchemaResolver False False bstr of
Right (YAML.Doc (YAML.Mapping _ _ o):_)
-> fmap Meta <$> yamlMap pMetaValue o
Right [] -> return . return $ mempty
Right [YAML.Doc (YAML.Scalar _ YAML.SNull)]
-> return . return $ mempty
- Right _ -> do logMessage $ CouldNotParseYamlMetadata "not an object"
- pos
- return . return $ mempty
- Left (_pos, err')
- -> do logMessage $ CouldNotParseYamlMetadata
- (T.pack err') pos
- return . return $ mempty
-
+ Right _ -> fail "expected YAML object"
+ Left (yamlpos, err')
+ -> do pos <- getPosition
+ setPosition $ incSourceLine
+ (setSourceColumn pos (YE.posColumn yamlpos))
+ (YE.posLine yamlpos - 1)
+ fail err'
fakePos :: YAML.Pos
fakePos = YAML.Pos (-1) (-1) 1 0
@@ -71,8 +69,7 @@ yamlBsToRefs :: PandocMonad m
-> (Text -> Bool) -- ^ Filter for id
-> BL.ByteString
-> ParserT Text ParserState m (F [MetaValue])
-yamlBsToRefs pMetaValue idpred bstr = do
- pos <- getPosition
+yamlBsToRefs pMetaValue idpred bstr =
case YAML.decodeNode' YAML.failsafeSchemaResolver False False bstr of
Right (YAML.Doc o@(YAML.Mapping _ _ _):_)
-> case lookupYAML "references" o of
@@ -90,26 +87,17 @@ yamlBsToRefs pMetaValue idpred bstr = do
Nothing -> False
sequence <$>
mapM (yamlToMetaValue pMetaValue) (filter g ns)
- Just _ -> do
- logMessage $ CouldNotParseYamlMetadata
- ("expecting sequence in 'references' field") pos
- return . return $ mempty
- Nothing -> do
- logMessage $ CouldNotParseYamlMetadata
- ("expecting 'references' field") pos
- return . return $ mempty
+ Just _ ->
+ fail "expecting sequence in 'references' field"
+ Nothing ->
+ fail "expecting 'references' field"
Right [] -> return . return $ mempty
Right [YAML.Doc (YAML.Scalar _ YAML.SNull)]
-> return . return $ mempty
- Right _ -> do logMessage $ CouldNotParseYamlMetadata "not an object"
- pos
- return . return $ mempty
+ Right _ -> fail "expecting YAML object"
Left (_pos, err')
- -> do logMessage $ CouldNotParseYamlMetadata
- (T.pack err') pos
- return . return $ mempty
-
+ -> fail err'
nodeToKey :: YAML.Node YE.Pos -> Maybe Text