diff options
| author | John MacFarlane <jgm@berkeley.edu> | 2020-10-07 13:02:36 -0700 |
|---|---|---|
| committer | John MacFarlane <jgm@berkeley.edu> | 2020-10-07 13:12:32 -0700 |
| commit | 428f8b4d204bf90118f01b0a03b6763b626a6532 (patch) | |
| tree | 91f552dc7c9a09d7d498a21a73cbab2ae64dcb68 /src/Text/Pandoc/Readers | |
| parent | 69b030c7dfa0e7dc454cc589747f8fc7f5987510 (diff) | |
| download | pandoc-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.hs | 16 | ||||
| -rw-r--r-- | src/Text/Pandoc/Readers/Metadata.hs | 40 |
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 |
