summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2022-01-23 22:13:58 -0800
committerJohn MacFarlane <jgm@berkeley.edu>2022-01-23 22:13:58 -0800
commita9f901cf6b8eebd02fb180cb4197a08b2a1267c2 (patch)
tree64a941f09d6848d095f545a50f8e185168e823c2 /src
parent67f2b25c05c3142aca430f46d53f1a9bb83375f6 (diff)
CommonMark reader: fix source position after YAML metadata.
Closes #7863.
Diffstat (limited to 'src')
-rw-r--r--src/Text/Pandoc/Readers/CommonMark.hs24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/Text/Pandoc/Readers/CommonMark.hs b/src/Text/Pandoc/Readers/CommonMark.hs
index 8152663cd..ecc6505f8 100644
--- a/src/Text/Pandoc/Readers/CommonMark.hs
+++ b/src/Text/Pandoc/Readers/CommonMark.hs
@@ -30,10 +30,10 @@ import Text.Pandoc.Readers.Metadata (yamlMetaBlock)
import Control.Monad.Except
import Data.Functor.Identity (runIdentity)
import Data.Typeable
-import Text.Pandoc.Parsing (runParserT, getInput,
+import Text.Pandoc.Parsing (runParserT, getInput, getPosition,
runF, defaultParserState, option, many1, anyChar,
Sources(..), ToSources(..), ParserT, Future,
- sourceName)
+ sourceName, sourceLine, incSourceLine)
import qualified Data.Text as T
-- | Parse a CommonMark formatted string into a 'Pandoc' structure.
@@ -42,11 +42,19 @@ readCommonMark :: (PandocMonad m, ToSources a)
readCommonMark opts s
| isEnabled Ext_yaml_metadata_block opts = do
let sources = toSources s
+ let firstSourceName = case unSources sources of
+ ((pos,_):_) -> sourceName pos
+ _ -> ""
let toks = concatMap sourceToToks (unSources sources)
res <- runParserT (do meta <- yamlMetaBlock (metaValueParser opts)
+ pos <- getPosition
rest <- getInput
- return (meta, rest))
- defaultParserState "YAML metadata" (toSources s)
+ let rest' = case rest of
+ -- update position of first source (#7863):
+ Sources ((_,t):xs) -> Sources ((pos,t):xs)
+ _ -> rest
+ return (meta, rest'))
+ defaultParserState firstSourceName sources
case res of
Left _ -> readCommonMarkBody opts sources toks
Right (meta, rest) -> do
@@ -60,7 +68,13 @@ readCommonMark opts s
readCommonMarkBody opts sources toks
sourceToToks :: (SourcePos, Text) -> [Tok]
-sourceToToks (pos, s) = tokenize (sourceName pos) s
+sourceToToks (pos, s) = map adjust $ tokenize (sourceName pos) s
+ where
+ adjust = case sourceLine pos of
+ 1 -> id
+ n -> \tok -> tok{ tokPos =
+ incSourceLine (tokPos tok) (n - 1) }
+
metaValueParser :: Monad m
=> ReaderOptions -> ParserT Sources st m (Future st MetaValue)