git.iko.soy/typeable/pandoc
on master help sign in
Parsing: removed duplication of Key and Key'.

Now we just use the former Key' (string contents), renamed Key. lookupKeySrc and fromKey are no longer eport. Key', toKey' and KeyTable' have become Key, toKey, and KeyTable.

commita1677b612b85e14dc810b84786d7844a5fc697fa authorJohn MacFarlane <jgm@berkeley.edu> dateWed 1 Aug 2012, 22:40 (14 years ago) parentfadc7b0
3 files changed+28−56
src/Text/Pandoc/Parsing.hs+5−38 src/Text/Pandoc/Readers/Markdown.hs+4−4 src/Text/Pandoc/Readers/RST.hs+19−14
src/Text/Pandoc/Parsing.hs+5−38
@@ -71,13 +71,8 @@ module Text.Pandoc.Parsing ( (>>~),
7171 NoteTable,
7272 NoteTable',
7373 KeyTable,
74− Key,
74+ Key (..),
7575 toKey,
76− fromKey,
77− lookupKeySrc,
78− KeyTable',
79− Key',
80− toKey',
8176 smartPunctuation,
8277 withQuoteContext,
8378 singleQuoteStart,
@@ -145,7 +140,6 @@ where
145140
146141import Text.Pandoc.Definition
147142import Text.Pandoc.Options
148−import Text.Pandoc.Generic
149143import Text.Pandoc.Builder (Blocks)
150144import qualified Text.Pandoc.UTF8 as UTF8 (putStrLn)
151145import Text.Parsec
@@ -706,8 +700,7 @@ data ParserState = ParserState
706700 stateAllowLinks :: Bool, -- ^ Allow parsing of links
707701 stateMaxNestingLevel :: Int, -- ^ Max # of nested Strong/Emph
708702 stateLastStrPos :: Maybe SourcePos, -- ^ Position after last str parsed
709− stateKeys :: KeyTable, -- ^ List of reference keys
710− stateKeys' :: KeyTable', -- ^ List of reference keys (with fallbacks)
703+ stateKeys :: KeyTable, -- ^ List of reference keys (with fallbacks)
711704 stateNotes :: NoteTable, -- ^ List of notes (raw bodies)
712705 stateNotes' :: NoteTable', -- ^ List of notes (parsed bodies)
713706 stateTitle :: [Inline], -- ^ Title of document
@@ -733,7 +726,6 @@ defaultParserState =
733726 stateMaxNestingLevel = 6,
734727 stateLastStrPos = Nothing,
735728 stateKeys = M.empty,
736− stateKeys' = M.empty,
737729 stateNotes = [],
738730 stateNotes' = [],
739731 stateTitle = [],
@@ -777,38 +769,13 @@ type NoteTable = [(String, String)]
777769
778770type NoteTable' = [(String, Reader ParserState Blocks)] -- used in markdown reader
779771
780−newtype Key = Key [Inline] deriving (Show, Read, Eq, Ord)
772+newtype Key = Key String deriving (Show, Read, Eq, Ord)
781773
782−toKey :: [Inline] -> Key
783−toKey = Key . bottomUp lowercase
784− where lowercase :: Inline -> Inline
785− lowercase (Str xs) = Str (map toLower xs)
786− lowercase (Math t xs) = Math t (map toLower xs)
787− lowercase (Code attr xs) = Code attr (map toLower xs)
788− lowercase (RawInline f xs) = RawInline f (map toLower xs)
789− lowercase LineBreak = Space
790− lowercase x = x
791−
792−fromKey :: Key -> [Inline]
793−fromKey (Key xs) = xs
774+toKey :: String -> Key
775+toKey = Key . map toLower . unwords . words
794776
795777type KeyTable = M.Map Key Target
796778
797−newtype Key' = Key' String deriving (Show, Read, Eq, Ord)
798−
799−toKey' :: String -> Key'
800−toKey' = Key' . map toLower . unwords . words
801−
802−type KeyTable' = M.Map Key' Target
803−
804−-- | Look up key in key table and return target object.
805−lookupKeySrc :: KeyTable -- ^ Key table
806− -> Key -- ^ Key
807− -> Maybe Target
808−lookupKeySrc table key = case M.lookup key table of
809− Nothing -> Nothing
810− Just src -> Just src
811−
812779-- | Fail unless we're in "smart typography" mode.
813780failUnlessSmart :: Parser [tok] ParserState ()
814781failUnlessSmart = getOption readerSmart >>= guard
src/Text/Pandoc/Readers/Markdown.hs+4−4
@@ -227,8 +227,8 @@ referenceKey = try $ do
227227 blanklines
228228 let target = (escapeURI $ removeTrailingSpace src, tit)
229229 st <- getState
230− let oldkeys = stateKeys' st
231− updateState $ \s -> s { stateKeys' = M.insert (toKey' raw) target oldkeys }
230+ let oldkeys = stateKeys st
231+ updateState $ \s -> s { stateKeys = M.insert (toKey raw) target oldkeys }
232232 return $ return mempty
233233
234234referenceTitle :: Parser [Char] ParserState String
@@ -1405,7 +1405,7 @@ referenceLink constructor (lab, raw) = do
14051405 raw' <- try (optional (char ' ') >>
14061406 optional (newline >> skipSpaces) >>
14071407 (snd <$> reference)) <|> return ""
1408− let key = toKey' $ if raw' == "[]" || raw' == "" then raw else raw'
1408+ let key = toKey $ if raw' == "[]" || raw' == "" then raw else raw'
14091409 let dropRB (']':xs) = xs
14101410 dropRB xs = xs
14111411 let dropLB ('[':xs) = xs
@@ -1413,7 +1413,7 @@ referenceLink constructor (lab, raw) = do
14131413 let dropBrackets = reverse . dropRB . reverse . dropLB
14141414 fallback <- parseFromString (mconcat <$> many inline) $ dropBrackets raw
14151415 return $ do
1416− keys <- asks stateKeys'
1416+ keys <- asks stateKeys
14171417 case M.lookup key keys of
14181418 Nothing -> (\x -> B.str "[" <> x <> B.str "]" <> B.str raw') <$> fallback
14191419 Just (src,tit) -> constructor src tit <$> lab
src/Text/Pandoc/Readers/RST.hs+19−14
@@ -670,26 +670,31 @@ targetURI = do
670670imageKey :: Parser [Char] ParserState (Key, Target)
671671imageKey = try $ do
672672 string ".. |"
673− ref <- manyTill inline (char '|')
673+ (_,ref) <- withRaw (manyTill inline (char '|'))
674674 skipSpaces
675675 string "image::"
676676 src <- targetURI
677− return (toKey (normalizeSpaces ref), (src, ""))
677+ return (toKey $ init ref, (src, ""))
678678
679679anonymousKey :: Parser [Char] st (Key, Target)
680680anonymousKey = try $ do
681681 oneOfStrings [".. __:", "__"]
682682 src <- targetURI
683683 pos <- getPosition
684− return (toKey [Str $ "_" ++ printf "%09d" (sourceLine pos)], (src, ""))
684+ return (toKey $ "_" ++ printf "%09d" (sourceLine pos), (src, ""))
685+
686+stripTicks :: String -> String
687+stripTicks = reverse . stripTick . reverse . stripTick
688+ where stripTick ('`':xs) = xs
689+ stripTick xs = xs
685690
686691regularKey :: Parser [Char] ParserState (Key, Target)
687692regularKey = try $ do
688693 string ".. _"
689− ref <- referenceName
694+ (_,ref) <- withRaw referenceName
690695 char ':'
691696 src <- targetURI
692− return (toKey (normalizeSpaces ref), (src, ""))
697+ return (toKey $ stripTicks ref, (src, ""))
693698
694699--
695700-- tables
@@ -921,19 +926,19 @@ explicitLink = try $ do
921926
922927referenceLink :: Parser [Char] ParserState Inline
923928referenceLink = try $ do
924− label' <- (quotedReferenceName <|> simpleReferenceName) >>~ char '_'
929+ (label',ref) <- withRaw (quotedReferenceName <|> simpleReferenceName) >>~
930+ char '_'
925931 state <- getState
926932 let keyTable = stateKeys state
927− let isAnonKey x = case fromKey x of
928− [Str ('_':_)] -> True
929− _ -> False
930− key <- option (toKey label') $
933+ let isAnonKey (Key ('_':_)) = True
934+ isAnonKey _ = False
935+ key <- option (toKey $ stripTicks ref) $
931936 do char '_'
932937 let anonKeys = sort $ filter isAnonKey $ M.keys keyTable
933938 if null anonKeys
934939 then mzero
935940 else return (head anonKeys)
936− (src,tit) <- case lookupKeySrc keyTable key of
941+ (src,tit) <- case M.lookup key keyTable of
937942 Nothing -> fail "no corresponding key"
938943 Just target -> return target
939944 -- if anonymous link, remove key so it won't be used again
@@ -957,13 +962,13 @@ autoLink = autoURI <|> autoEmail
957962image :: Parser [Char] ParserState Inline
958963image = try $ do
959964 char '|'
960− ref <- manyTill inline (char '|')
965+ (alt,ref) <- withRaw (manyTill inline (char '|'))
961966 state <- getState
962967 let keyTable = stateKeys state
963− (src,tit) <- case lookupKeySrc keyTable (toKey ref) of
968+ (src,tit) <- case M.lookup (toKey $ init ref) keyTable of
964969 Nothing -> fail "no corresponding key"
965970 Just target -> return target
966− return $ Image (normalizeSpaces ref) (src, tit)
971+ return $ Image (normalizeSpaces alt) (src, tit)
967972
968973note :: Parser [Char] ParserState Inline
969974note = try $ do