diff --git a/pandoc.cabal b/pandoc.cabal index a4a13ce0d..694032273 100644 --- a/pandoc.cabal +++ b/pandoc.cabal @@ -246,6 +246,7 @@ extra-source-files: test/command/bar.tex test/command/bar-endinput.tex test/command/yaml-metadata.yaml + test/command/7813-meta.yaml test/command/3510-subdoc.org test/command/3510-export.latex test/command/3510-src.hs diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs index 989cfeb4d..ac6be7729 100644 --- a/src/Text/Pandoc/Readers/Markdown.hs +++ b/src/Text/Pandoc/Readers/Markdown.hs @@ -81,8 +81,12 @@ yamlToMeta opts mbfp bstr = do oldPos <- getPosition setPosition $ initialPos (fromMaybe "" mbfp) meta <- yamlBsToMeta (fmap B.toMetaValue <$> parseBlocks) bstr + checkNotes setPosition oldPos - return $ runF meta defaultParserState + st <- getState + let result = runF meta st + reportLogMessages + return result parsed <- readWithM parser def{ stateOptions = opts } ("" :: Text) case parsed of Right result -> return result @@ -103,7 +107,11 @@ yamlToRefs idpred opts mbfp bstr = do Nothing -> return () Just fp -> setPosition $ initialPos fp refs <- yamlBsToRefs (fmap B.toMetaValue <$> parseBlocks) idpred bstr - return $ runF refs defaultParserState + checkNotes + st <- getState + let result = runF refs st + reportLogMessages + return result parsed <- readWithM parser def{ stateOptions = opts } ("" :: Text) case parsed of Right result -> return result @@ -308,7 +316,17 @@ parseMarkdown = do optional titleBlock blocks <- parseBlocks st <- getState - -- check for notes with no corresponding note references + checkNotes + let doc = runF (do Pandoc _ bs <- B.doc <$> blocks + meta <- stateMeta' st + return $ Pandoc meta bs) st + reportLogMessages + return doc + +-- check for notes with no corresponding note references +checkNotes :: PandocMonad m => MarkdownParser m () +checkNotes = do + st <- getState let notesUsed = stateNoteRefs st let notesDefined = M.keys (stateNotes' st) mapM_ (\n -> unless (n `Set.member` notesUsed) $ @@ -317,11 +335,7 @@ parseMarkdown = do Nothing -> throwError $ PandocShouldNeverHappenError "note not found") notesDefined - let doc = runF (do Pandoc _ bs <- B.doc <$> blocks - meta <- stateMeta' st - return $ Pandoc meta bs) st - reportLogMessages - return doc + referenceKey :: PandocMonad m => MarkdownParser m (F Blocks) referenceKey = try $ do diff --git a/test/command/7813-meta.yaml b/test/command/7813-meta.yaml new file mode 100644 index 000000000..d94a04efc --- /dev/null +++ b/test/command/7813-meta.yaml @@ -0,0 +1,6 @@ +--- +abstract: | + a footnote[^1] in abstract. + + [^1]: content +... diff --git a/test/command/7813.md b/test/command/7813.md new file mode 100644 index 000000000..216a91e36 --- /dev/null +++ b/test/command/7813.md @@ -0,0 +1,26 @@ +``` +% pandoc --metadata-file command/7813-meta.yaml -t native -s +Hi +^D +Pandoc + Meta + { unMeta = + fromList + [ ( "abstract" + , MetaBlocks + [ Para + [ Str "a" + , Space + , Str "footnote" + , Note [ Para [ Str "content" ] ] + , Space + , Str "in" + , Space + , Str "abstract." + ] + ] + ) + ] + } + [ Para [ Str "Hi" ] ] +```