git.iko.soy/typeable/pandoc
on master help sign in
Added stateSubstitutions to ParserState, use for RST substitutions.
1be27ffJohn MacFarlane
src/Text/Pandoc/Parsing.hs+5
@@ -71,6 +71,7 @@ module Text.Pandoc.Parsing ( (>>~),
71 NoteTable,
71 NoteTable,
72 NoteTable',
72 NoteTable',
73 KeyTable,
73 KeyTable,
74+ SubstTable,
74 Key (..),
75 Key (..),
75 toKey,
76 toKey,
76 smartPunctuation,
77 smartPunctuation,
@@ -720,6 +721,7 @@ data ParserState = ParserState
720 stateMaxNestingLevel :: Int, -- ^ Max # of nested Strong/Emph
721 stateMaxNestingLevel :: Int, -- ^ Max # of nested Strong/Emph
721 stateLastStrPos :: Maybe SourcePos, -- ^ Position after last str parsed
722 stateLastStrPos :: Maybe SourcePos, -- ^ Position after last str parsed
722 stateKeys :: KeyTable, -- ^ List of reference keys (with fallbacks)
723 stateKeys :: KeyTable, -- ^ List of reference keys (with fallbacks)
724+ stateSubstitutions :: SubstTable, -- ^ List of substitution references
723 stateNotes :: NoteTable, -- ^ List of notes (raw bodies)
725 stateNotes :: NoteTable, -- ^ List of notes (raw bodies)
724 stateNotes' :: NoteTable', -- ^ List of notes (parsed bodies)
726 stateNotes' :: NoteTable', -- ^ List of notes (parsed bodies)
725 stateTitle :: [Inline], -- ^ Title of document
727 stateTitle :: [Inline], -- ^ Title of document
@@ -745,6 +747,7 @@ defaultParserState =
745 stateMaxNestingLevel = 6,
747 stateMaxNestingLevel = 6,
746 stateLastStrPos = Nothing,
748 stateLastStrPos = Nothing,
747 stateKeys = M.empty,
749 stateKeys = M.empty,
750+ stateSubstitutions = M.empty,
748 stateNotes = [],
751 stateNotes = [],
749 stateNotes' = [],
752 stateNotes' = [],
750 stateTitle = [],
753 stateTitle = [],
@@ -795,6 +798,8 @@ toKey = Key . map toLower . unwords . words
795
798
796type KeyTable = M.Map Key Target
799type KeyTable = M.Map Key Target
797
800
801+type SubstTable = M.Map Key Inline
802+
798-- | Fail unless we're in "smart typography" mode.
803-- | Fail unless we're in "smart typography" mode.
799failUnlessSmart :: Parser [tok] ParserState ()
804failUnlessSmart :: Parser [tok] ParserState ()
800failUnlessSmart = getOption readerSmart >>= guard
805failUnlessSmart = getOption readerSmart >>= guard
src/Text/Pandoc/Readers/RST.hs+18−12
@@ -95,8 +95,8 @@ parseRST = do
95 startPos <- getPosition
95 startPos <- getPosition
96 -- go through once just to get list of reference keys and notes
96 -- go through once just to get list of reference keys and notes
97 -- docMinusKeys is the raw document with blanks where the keys were...
97 -- docMinusKeys is the raw document with blanks where the keys were...
98− docMinusKeys <- manyTill (referenceKey <|> noteBlock <|> lineClump) eof >>=
98+ docMinusKeys <- manyTill (referenceKey <|> imageKey <|>
99− return . concat
99+ noteBlock <|> lineClump) eof >>= return . concat
100 setInput docMinusKeys
100 setInput docMinusKeys
101 setPosition startPos
101 setPosition startPos
102 st' <- getState
102 st' <- getState
@@ -652,7 +652,7 @@ referenceName = quotedReferenceName <|>
652referenceKey :: Parser [Char] ParserState [Char]
652referenceKey :: Parser [Char] ParserState [Char]
653referenceKey = do
653referenceKey = do
654 startPos <- getPosition
654 startPos <- getPosition
655− (key, target) <- choice [imageKey, anonymousKey, regularKey]
655+ (key, target) <- choice [anonymousKey, regularKey]
656 st <- getState
656 st <- getState
657 let oldkeys = stateKeys st
657 let oldkeys = stateKeys st
658 updateState $ \s -> s { stateKeys = M.insert key target oldkeys }
658 updateState $ \s -> s { stateKeys = M.insert key target oldkeys }
@@ -670,14 +670,21 @@ targetURI = do
670 blanklines
670 blanklines
671 return $ escapeURI $ removeLeadingTrailingSpace $ contents
671 return $ escapeURI $ removeLeadingTrailingSpace $ contents
672
672
673−imageKey :: Parser [Char] ParserState (Key, Target)
673+imageKey :: Parser [Char] ParserState [Char]
674imageKey = try $ do
674imageKey = try $ do
675+ startPos <- getPosition
675 string ".. |"
676 string ".. |"
676− (_,ref) <- withRaw (manyTill inline (char '|'))
677+ (alt,ref) <- withRaw (manyTill inline (char '|'))
677 skipSpaces
678 skipSpaces
678 string "image::"
679 string "image::"
679 src <- targetURI
680 src <- targetURI
681+ let img = Image alt (src,"")
680− return (toKey $ init ref, (src, ""))
682+ let key = toKey $ init ref
683+ updateState $ \s -> s{ stateSubstitutions = M.insert key img $ stateSubstitutions s }
684+ optional blanklines
685+ endPos <- getPosition
686+ -- return enough blanks to replace key
687+ return $ replicate (sourceLine endPos - sourceLine startPos) '\n'
681
688
682anonymousKey :: Parser [Char] st (Key, Target)
689anonymousKey :: Parser [Char] st (Key, Target)
683anonymousKey = try $ do
690anonymousKey = try $ do
@@ -965,13 +972,12 @@ autoLink = autoURI <|> autoEmail
965image :: Parser [Char] ParserState Inline
972image :: Parser [Char] ParserState Inline
966image = try $ do
973image = try $ do
967 char '|'
974 char '|'
968− (alt,ref) <- withRaw (manyTill inline (char '|'))
975+ (_,ref) <- withRaw (manyTill inline (char '|'))
969 state <- getState
976 state <- getState
970− let keyTable = stateKeys state
977+ let substTable = stateSubstitutions state
971− (src,tit) <- case M.lookup (toKey $ init ref) keyTable of
978+ case M.lookup (toKey $ init ref) substTable of
972− Nothing -> fail "no corresponding key"
979+ Nothing -> fail "no corresponding key"
973− Just target -> return target
980+ Just target -> return target
974− return $ Image (normalizeSpaces alt) (src, tit)
975
981
976note :: Parser [Char] ParserState Inline
982note :: Parser [Char] ParserState Inline
977note = try $ do
983note = try $ do