@@ -19,7 +19,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
1919{- |
2020 Module : Text.Pandoc.Parsing
2121 Copyright : Copyright (C) 2006-2010 John MacFarlane
22− License : GNU GPL, version 2 or above
22+ License : GNU GPL, version 2 or above
2323
2424 Maintainer : John MacFarlane <jgm@berkeley.edu>
2525 Stability : alpha
@@ -27,9 +27,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2727
2828A utility library with parsers used in pandoc readers.
2929-}
30−module Text.Pandoc.Parsing ( GeneralParser,
31− PandocParser,
32− (>>~),
30+module Text.Pandoc.Parsing ( (>>~),
3331 anyLine,
3432 many1Till,
3533 notFollowedBy',
@@ -88,68 +86,64 @@ import Text.Pandoc.Shared
8886import qualified Data.Map as M
8987import Text.TeXMath.Macros (applyMacros, Macro, parseMacroDefinitions)
9088
91−type GeneralParser st a = GenParser Char st a
92−
93−type PandocParser a = GeneralParser ParserState a
94−
9589-- | Like >>, but returns the operation on the left.
9690-- (Suggested by Tillmann Rendel on Haskell-cafe list.)
9791(>>~) :: (Monad m) => m a -> m b -> m a
9892a >>~ b = a >>= \x -> b >> return x
9993
10094-- | Parse any line of text
101−anyLine :: GeneralParser st String
95+anyLine :: GenParser Char st [Char]
10296anyLine = manyTill anyChar newline
10397
10498-- | Like @manyTill@, but reads at least one item.
105−many1Till :: GeneralParser st a
106− -> GeneralParser st end
107− -> GeneralParser st [a]
99+many1Till :: GenParser tok st a
100+ -> GenParser tok st end
101+ -> GenParser tok st [a]
108102many1Till p end = do
109103 first <- p
110104 rest <- manyTill p end
111105 return (first:rest)
112106
113−-- | A more general form of @notFollowedBy@. This one allows any
107+-- | A more general form of @notFollowedBy@. This one allows any
114108-- type of parser to be specified, and succeeds only if that parser fails.
115109-- It does not consume any input.
116−notFollowedBy' :: Show b => GeneralParser st b -> GeneralParser st ()
110+notFollowedBy' :: Show b => GenParser a st b -> GenParser a st ()
117111notFollowedBy' p = try $ join $ do a <- try p
118112 return (unexpected (show a))
119113 <|>
120114 return (return ())
121115-- (This version due to Andrew Pimlott on the Haskell mailing list.)
122116
123−-- | Parses one of a list of strings (tried in order).
124−oneOfStrings :: [String] -> GeneralParser st String
117+-- | Parses one of a list of strings (tried in order).
118+oneOfStrings :: [String] -> GenParser Char st String
125119oneOfStrings listOfStrings = choice $ map (try . string) listOfStrings
126120
127121-- | Parses a space or tab.
128−spaceChar :: GeneralParser st Char
122+spaceChar :: CharParser st Char
129123spaceChar = satisfy $ \c -> c == ' ' || c == '\t'
130124
131125-- | Skips zero or more spaces or tabs.
132−skipSpaces :: GeneralParser st ()
126+skipSpaces :: GenParser Char st ()
133127skipSpaces = skipMany spaceChar
134128
135129-- | Skips zero or more spaces or tabs, then reads a newline.
136−blankline :: GeneralParser st Char
130+blankline :: GenParser Char st Char
137131blankline = try $ skipSpaces >> newline
138132
139133-- | Parses one or more blank lines and returns a string of newlines.
140−blanklines :: GeneralParser st [Char]
134+blanklines :: GenParser Char st [Char]
141135blanklines = many1 blankline
142136
143137-- | Parses material enclosed between start and end parsers.
144−enclosed :: GeneralParser st t -- ^ start parser
145− -> GeneralParser st end -- ^ end parser
146− -> GeneralParser st a -- ^ content parser (to be used repeatedly)
147− -> GeneralParser st [a]
148−enclosed start end parser = try $
138+enclosed :: GenParser Char st t -- ^ start parser
139+ -> GenParser Char st end -- ^ end parser
140+ -> GenParser Char st a -- ^ content parser (to be used repeatedly)
141+ -> GenParser Char st [a]
142+enclosed start end parser = try $
149143 start >> notFollowedBy space >> many1Till parser end
150144
151145-- | Parse string, case insensitive.
152−stringAnyCase :: [Char] -> GeneralParser st String
146+stringAnyCase :: [Char] -> CharParser st String
153147stringAnyCase [] = string ""
154148stringAnyCase (x:xs) = do
155149 firstChar <- char (toUpper x) <|> char (toLower x)
@@ -157,7 +151,7 @@ stringAnyCase (x:xs) = do
157151 return (firstChar:rest)
158152
159153-- | Parse contents of 'str' using 'parser' and return result.
160−parseFromString :: GeneralParser st a -> String -> GeneralParser st a
154+parseFromString :: GenParser tok st a -> [tok] -> GenParser tok st a
161155parseFromString parser str = do
162156 oldPos <- getPosition
163157 oldInput <- getInput
@@ -168,8 +162,8 @@ parseFromString parser str = do
168162 return result
169163
170164-- | Parse raw line block up to and including blank lines.
171−lineClump :: GeneralParser st String
172−lineClump = blanklines
165+lineClump :: GenParser Char st String
166+lineClump = blanklines
173167 <|> (many1 (notFollowedBy blankline >> anyLine) >>= return . unlines)
174168
175169-- | Parse a string of characters between an open character
@@ -178,7 +172,7 @@ lineClump = blanklines
178172-- @charsInBalanced '(' ')'@ will parse "(hello (there))"
179173-- and return "hello (there)". Stop if a blank line is
180174-- encountered.
181−charsInBalanced :: Char -> Char -> GeneralParser st String
175+charsInBalanced :: Char -> Char -> GenParser Char st String
182176charsInBalanced open close = try $ do
183177 char open
184178 raw <- many $ (many1 (satisfy $ \c ->
@@ -190,7 +184,7 @@ charsInBalanced open close = try $ do
190184 return $ concat raw
191185
192186-- | Like @charsInBalanced@, but allow blank lines in the content.
193−charsInBalanced' :: Char -> Char -> GeneralParser st String
187+charsInBalanced' :: Char -> Char -> GenParser Char st String
194188charsInBalanced' open close = try $ do
195189 char open
196190 raw <- many $ (many1 (satisfy $ \c -> c /= open && c /= close))
@@ -209,13 +203,13 @@ uppercaseRomanDigits = map toUpper lowercaseRomanDigits
209203
210204-- | Parses a roman numeral (uppercase or lowercase), returns number.
211205romanNumeral :: Bool -- ^ Uppercase if true
212− -> GeneralParser st Int
206+ -> GenParser Char st Int
213207romanNumeral upperCase = do
214− let romanDigits = if upperCase
215− then uppercaseRomanDigits
208+ let romanDigits = if upperCase
209+ then uppercaseRomanDigits
216210 else lowercaseRomanDigits
217211 lookAhead $ oneOf romanDigits
218− let [one, five, ten, fifty, hundred, fivehundred, thousand] =
212+ let [one, five, ten, fifty, hundred, fivehundred, thousand] =
219213 map char romanDigits
220214 thousands <- many thousand >>= (return . (1000 *) . length)
221215 ninehundreds <- option 0 $ try $ hundred >> thousand >> return 900
@@ -239,14 +233,14 @@ romanNumeral upperCase = do
239233
240234-- Parsers for email addresses and URIs
241235
242−emailChar :: GeneralParser st Char
236+emailChar :: GenParser Char st Char
243237emailChar = alphaNum <|>
244238 satisfy (\c -> c == '-' || c == '+' || c == '_' || c == '.')
245239
246−domainChar :: GeneralParser st Char
240+domainChar :: GenParser Char st Char
247241domainChar = alphaNum <|> char '-'
248242
249−domain :: GeneralParser st [Char]
243+domain :: GenParser Char st [Char]
250244domain = do
251245 first <- many1 domainChar
252246 dom <- many1 $ try (char '.' >> many1 domainChar )
@@ -254,7 +248,7 @@ domain = do
254248
255249-- | Parses an email address; returns original and corresponding
256250-- escaped mailto: URI.
257−emailAddress :: GeneralParser st (String, String)
251+emailAddress :: GenParser Char st (String, String)
258252emailAddress = try $ do
259253 firstLetter <- alphaNum
260254 restAddr <- many emailChar
@@ -265,7 +259,7 @@ emailAddress = try $ do
265259 return (full, escapeURI $ "mailto:" ++ full)
266260
267261-- | Parses a URI. Returns pair of original and URI-escaped version.
268−uri :: GeneralParser st (String, String)
262+uri :: GenParser Char st (String, String)
269263uri = try $ do
270264 let protocols = [ "http:", "https:", "ftp:", "file:", "mailto:",
271265 "news:", "telnet:" ]
@@ -299,8 +293,8 @@ uri = try $ do
299293-- displacement (the difference between the source column at the end
300294-- and the source column at the beginning). Vertical displacement
301295-- (source row) is ignored.
302−withHorizDisplacement :: GeneralParser st a -- ^ Parser to apply
303− -> GeneralParser st (a, Int) -- ^ (result, displacement)
296+withHorizDisplacement :: GenParser Char st a -- ^ Parser to apply
297+ -> GenParser Char st (a, Int) -- ^ (result, displacement)
304298withHorizDisplacement parser = do
305299 pos1 <- getPosition
306300 result <- parser
@@ -309,43 +303,43 @@ withHorizDisplacement parser = do
309303
310304-- | Parses a character and returns 'Null' (so that the parser can move on
311305-- if it gets stuck).
312−nullBlock :: GeneralParser st Block
306+nullBlock :: GenParser Char st Block
313307nullBlock = anyChar >> return Null
314308
315309-- | Fail if reader is in strict markdown syntax mode.
316−failIfStrict :: PandocParser ()
310+failIfStrict :: GenParser a ParserState ()
317311failIfStrict = do
318312 state <- getState
319313 if stateStrict state then fail "strict mode" else return ()
320314
321315-- | Fail unless we're in literate haskell mode.
322−failUnlessLHS :: PandocParser ()
316+failUnlessLHS :: GenParser tok ParserState ()
323317failUnlessLHS = do
324318 state <- getState
325319 if stateLiterateHaskell state then return () else fail "Literate haskell feature"
326320
327321-- | Parses backslash, then applies character parser.
328−escaped :: GeneralParser st Char -- ^ Parser for character to escape
329− -> GeneralParser st Inline
322+escaped :: GenParser Char st Char -- ^ Parser for character to escape
323+ -> GenParser Char st Inline
330324escaped parser = try $ do
331325 char '\\'
332326 result <- parser
333327 return (Str [result])
334328
335329-- | Parses an uppercase roman numeral and returns (UpperRoman, number).
336−upperRoman :: GeneralParser st (ListNumberStyle, Int)
330+upperRoman :: GenParser Char st (ListNumberStyle, Int)
337331upperRoman = do
338332 num <- romanNumeral True
339333 return (UpperRoman, num)
340334
341335-- | Parses a lowercase roman numeral and returns (LowerRoman, number).
342−lowerRoman :: GeneralParser st (ListNumberStyle, Int)
336+lowerRoman :: GenParser Char st (ListNumberStyle, Int)
343337lowerRoman = do
344338 num <- romanNumeral False
345339 return (LowerRoman, num)
346340
347341-- | Parses a decimal numeral and returns (Decimal, number).
348−decimal :: GeneralParser st (ListNumberStyle, Int)
342+decimal :: GenParser Char st (ListNumberStyle, Int)
349343decimal = do
350344 num <- many1 digit
351345 return (Decimal, read num)
@@ -354,7 +348,7 @@ decimal = do
354348-- returns (DefaultStyle, [next example number]). The next
355349-- example number is incremented in parser state, and the label
356350-- (if present) is added to the label table.
357−exampleNum :: PandocParser (ListNumberStyle, Int)
351+exampleNum :: GenParser Char ParserState (ListNumberStyle, Int)
358352exampleNum = do
359353 char '@'
360354 lab <- many (alphaNum <|> satisfy (\c -> c == '_' || c == '-'))
@@ -368,38 +362,38 @@ exampleNum = do
368362 return (Example, num)
369363
370364-- | Parses a '#' returns (DefaultStyle, 1).
371−defaultNum :: GeneralParser st (ListNumberStyle, Int)
365+defaultNum :: GenParser Char st (ListNumberStyle, Int)
372366defaultNum = do
373367 char '#'
374368 return (DefaultStyle, 1)
375369
376370-- | Parses a lowercase letter and returns (LowerAlpha, number).
377−lowerAlpha :: GeneralParser st (ListNumberStyle, Int)
371+lowerAlpha :: GenParser Char st (ListNumberStyle, Int)
378372lowerAlpha = do
379373 ch <- oneOf ['a'..'z']
380374 return (LowerAlpha, ord ch - ord 'a' + 1)
381375
382376-- | Parses an uppercase letter and returns (UpperAlpha, number).
383−upperAlpha :: GeneralParser st (ListNumberStyle, Int)
377+upperAlpha :: GenParser Char st (ListNumberStyle, Int)
384378upperAlpha = do
385379 ch <- oneOf ['A'..'Z']
386380 return (UpperAlpha, ord ch - ord 'A' + 1)
387381
388382-- | Parses a roman numeral i or I
389−romanOne :: GeneralParser st (ListNumberStyle, Int)
383+romanOne :: GenParser Char st (ListNumberStyle, Int)
390384romanOne = (char 'i' >> return (LowerRoman, 1)) <|>
391385 (char 'I' >> return (UpperRoman, 1))
392386
393387-- | Parses an ordered list marker and returns list attributes.
394−anyOrderedListMarker :: PandocParser ListAttributes
395−anyOrderedListMarker = choice $
388+anyOrderedListMarker :: GenParser Char ParserState ListAttributes
389+anyOrderedListMarker = choice $
396390 [delimParser numParser | delimParser <- [inPeriod, inOneParen, inTwoParens],
397391 numParser <- [decimal, exampleNum, defaultNum, romanOne,
398392 lowerAlpha, lowerRoman, upperAlpha, upperRoman]]
399393
400394-- | Parses a list number (num) followed by a period, returns list attributes.
401−inPeriod :: GeneralParser st (ListNumberStyle, Int)
402− -> GeneralParser st ListAttributes
395+inPeriod :: GenParser Char st (ListNumberStyle, Int)
396+ -> GenParser Char st ListAttributes
403397inPeriod num = try $ do
404398 (style, start) <- num
405399 char '.'
@@ -407,18 +401,18 @@ inPeriod num = try $ do
407401 then DefaultDelim
408402 else Period
409403 return (start, style, delim)
410−
404+
411405-- | Parses a list number (num) followed by a paren, returns list attributes.
412−inOneParen :: GeneralParser st (ListNumberStyle, Int)
413− -> GeneralParser st ListAttributes
406+inOneParen :: GenParser Char st (ListNumberStyle, Int)
407+ -> GenParser Char st ListAttributes
414408inOneParen num = try $ do
415409 (style, start) <- num
416410 char ')'
417411 return (start, style, OneParen)
418412
419413-- | Parses a list number (num) enclosed in parens, returns list attributes.
420−inTwoParens :: GeneralParser st (ListNumberStyle, Int)
421− -> GeneralParser st ListAttributes
414+inTwoParens :: GenParser Char st (ListNumberStyle, Int)
415+ -> GenParser Char st ListAttributes
422416inTwoParens num = try $ do
423417 char '('
424418 (style, start) <- num
@@ -427,9 +421,9 @@ inTwoParens num = try $ do
427421
428422-- | Parses an ordered list marker with a given style and delimiter,
429423-- returns number.
430−orderedListMarker :: ListNumberStyle
431− -> ListNumberDelim
432− -> PandocParser Int
424+orderedListMarker :: ListNumberStyle
425+ -> ListNumberDelim
426+ -> GenParser Char ParserState Int
433427orderedListMarker style delim = do
434428 let num = defaultNum <|> -- # can continue any kind of list
435429 case style of
@@ -449,19 +443,19 @@ orderedListMarker style delim = do
449443 return start
450444
451445-- | Parses a character reference and returns a Str element.
452−charRef :: GeneralParser st Inline
446+charRef :: GenParser Char st Inline
453447charRef = do
454448 c <- characterReference
455449 return $ Str [c]
456450
457451-- | Parse a table using 'headerParser', 'rowParser',
458452-- 'lineParser', and 'footerParser'.
459−tableWith :: PandocParser ([[Block]], [Alignment], [Int])
460− -> ([Int] -> PandocParser [[Block]])
461− -> PandocParser sep
462− -> PandocParser end
463− -> PandocParser [Inline]
464− -> PandocParser Block
453+tableWith :: GenParser Char ParserState ([[Block]], [Alignment], [Int])
454+ -> ([Int] -> GenParser Char ParserState [[Block]])
455+ -> GenParser Char ParserState sep
456+ -> GenParser Char ParserState end
457+ -> GenParser Char ParserState [Inline]
458+ -> GenParser Char ParserState Block
465459tableWith headerParser rowParser lineParser footerParser captionParser = try $ do
466460 caption' <- option [] captionParser
467461 (heads, aligns, indices) <- headerParser
@@ -479,8 +473,8 @@ tableWith headerParser rowParser lineParser footerParser captionParser = try $ d
479473widthsFromIndices :: Int -- Number of columns on terminal
480474 -> [Int] -- Indices
481475 -> [Double] -- Fractional relative sizes of columns
482−widthsFromIndices _ [] = []
483−widthsFromIndices numColumns' indices =
476+widthsFromIndices _ [] = []
477+widthsFromIndices numColumns' indices =
484478 let numColumns = max numColumns' (if null indices then 0 else last indices)
485479 lengths' = zipWith (-) indices (0:indices)
486480 lengths = reverse $
@@ -504,10 +498,10 @@ widthsFromIndices numColumns' indices =
504498-- (which may be grid), then the rows,
505499-- which may be grid, separated by blank lines, and
506500-- ending with a footer (dashed line followed by blank line).
507−gridTableWith :: PandocParser Block -- ^ Block parser
508− -> PandocParser [Inline] -- ^ Caption parser
501+gridTableWith :: GenParser Char ParserState Block -- ^ Block parser
502+ -> GenParser Char ParserState [Inline] -- ^ Caption parser
509503 -> Bool -- ^ Headerless table
510− -> PandocParser Block
504+ -> GenParser Char ParserState Block
511505gridTableWith block tableCaption headless =
512506 tableWith (gridTableHeader headless block) (gridTableRow block) (gridTableSep '-') gridTableFooter tableCaption
513507
@@ -515,13 +509,13 @@ gridTableSplitLine :: [Int] -> String -> [String]
515509gridTableSplitLine indices line = map removeFinalBar $ tail $
516510 splitByIndices (init indices) $ removeTrailingSpace line
517511
518−gridPart :: Char -> GeneralParser st (Int, Int)
512+gridPart :: Char -> GenParser Char st (Int, Int)
519513gridPart ch = do
520514 dashes <- many1 (char ch)
521515 char '+'
522516 return (length dashes, length dashes + 1)
523517
524−gridDashedLines :: Char -> GeneralParser st [(Int,Int)]
518+gridDashedLines :: Char -> GenParser Char st [(Int,Int)]
525519gridDashedLines ch = try $ char '+' >> many1 (gridPart ch) >>~ blankline
526520
527521removeFinalBar :: String -> String
@@ -529,18 +523,18 @@ removeFinalBar =
529523 reverse . dropWhile (`elem` " \t") . dropWhile (=='|') . reverse
530524
531525-- | Separator between rows of grid table.
532−gridTableSep :: Char -> PandocParser Char
526+gridTableSep :: Char -> GenParser Char ParserState Char
533527gridTableSep ch = try $ gridDashedLines ch >> return '\n'
534528
535529-- | Parse header for a grid table.
536530gridTableHeader :: Bool -- ^ Headerless table
537− -> PandocParser Block
538− -> PandocParser ([[Block]], [Alignment], [Int])
531+ -> GenParser Char ParserState Block
532+ -> GenParser Char ParserState ([[Block]], [Alignment], [Int])
539533gridTableHeader headless block = try $ do
540534 optional blanklines
541535 dashes <- gridDashedLines '-'
542536 rawContent <- if headless
543− then return $ repeat ""
537+ then return $ repeat ""
544538 else many1
545539 (notFollowedBy (gridTableSep '=') >> char '|' >>
546540 many1Till anyChar newline)
@@ -559,16 +553,16 @@ gridTableHeader headless block = try $ do
559553 map removeLeadingTrailingSpace rawHeads
560554 return (heads, aligns, indices)
561555
562−gridTableRawLine :: [Int] -> PandocParser [String]
556+gridTableRawLine :: [Int] -> GenParser Char ParserState [String]
563557gridTableRawLine indices = do
564558 char '|'
565559 line <- many1Till anyChar newline
566560 return (gridTableSplitLine indices line)
567561
568562-- | Parse row of grid table.
569−gridTableRow :: PandocParser Block
563+gridTableRow :: GenParser Char ParserState Block
570564 -> [Int]
571− -> PandocParser [[Block]]
565+ -> GenParser Char ParserState [[Block]]
572566gridTableRow block indices = do
573567 colLines <- many1 (gridTableRawLine indices)
574568 let cols = map ((++ "\n") . unlines . removeOneLeadingSpace) $
@@ -587,23 +581,23 @@ compactifyCell :: [Block] -> [Block]
587581compactifyCell bs = head $ compactify [bs]
588582
589583-- | Parse footer for a grid table.
590−gridTableFooter :: PandocParser [Char]
584+gridTableFooter :: GenParser Char ParserState [Char]
591585gridTableFooter = blanklines
592586
593587---
594588
595589-- | Parse a string with a given parser and state.
596−readWith :: PandocParser a -- ^ parser
590+readWith :: GenParser t ParserState a -- ^ parser
597591 -> ParserState -- ^ initial state
598− -> String -- ^ input
592+ -> [t] -- ^ input
599593 -> a
600−readWith parser state input =
594+readWith parser state input =
601595 case runParser parser state "source" input of
602596 Left err -> error $ "\nError:\n" ++ show err
603597 Right result -> result
604598
605599-- | Parse a string with @parser@ (for testing).
606−testStringWith :: (Show a) => PandocParser a
600+testStringWith :: (Show a) => GenParser Char ParserState a
607601 -> String
608602 -> IO ()
609603testStringWith parser str = UTF8.putStrLn $ show $
@@ -629,7 +623,7 @@ data ParserState = ParserState
629623 stateHeaderTable :: [HeaderType], -- ^ Ordered list of header types used
630624 stateIndentedCodeClasses :: [String], -- ^ Classes to use for indented code blocks
631625 stateNextExample :: Int, -- ^ Number of next example
632− stateExamples :: M.Map String Int, -- ^ Map from example labels to numbers
626+ stateExamples :: M.Map String Int, -- ^ Map from example labels to numbers
633627 stateHasChapters :: Bool, -- ^ True if \chapter encountered
634628 stateApplyMacros :: Bool, -- ^ Apply LaTeX macros?
635629 stateMacros :: [Macro] -- ^ List of macros defined so far
@@ -637,7 +631,7 @@ data ParserState = ParserState
637631 deriving Show
638632
639633defaultParserState :: ParserState
640−defaultParserState =
634+defaultParserState =
641635 ParserState { stateParseRaw = False,
642636 stateParserContext = NullState,
643637 stateQuoteContext = NoQuote,
@@ -661,12 +655,12 @@ defaultParserState =
661655 stateApplyMacros = True,
662656 stateMacros = []}
663657
664−data HeaderType
658+data HeaderType
665659 = SingleHeader Char -- ^ Single line of characters underneath
666660 | DoubleHeader Char -- ^ Lines of characters above and below
667661 deriving (Eq, Show)
668662
669−data ParserContext
663+data ParserContext
670664 = ListItemState -- ^ Used when running parser on list item contents
671665 | NullState -- ^ Default state
672666 deriving (Eq, Show)
@@ -705,25 +699,25 @@ lookupKeySrc table key = case M.lookup key table of
705699 Just src -> Just src
706700
707701-- | Fail unless we're in "smart typography" mode.
708−failUnlessSmart :: PandocParser ()
702+failUnlessSmart :: GenParser tok ParserState ()
709703failUnlessSmart = getState >>= guard . stateSmart
710704
711−smartPunctuation :: PandocParser Inline
712− -> PandocParser Inline
705+smartPunctuation :: GenParser Char ParserState Inline
706+ -> GenParser Char ParserState Inline
713707smartPunctuation inlineParser = do
714708 failUnlessSmart
715709 choice [ quoted inlineParser, apostrophe, dash, ellipses ]
716710
717−apostrophe :: PandocParser Inline
711+apostrophe :: GenParser Char ParserState Inline
718712apostrophe = (char '\'' <|> char '\8217') >> return Apostrophe
719713
720−quoted :: PandocParser Inline
721− -> PandocParser Inline
714+quoted :: GenParser Char ParserState Inline
715+ -> GenParser Char ParserState Inline
722716quoted inlineParser = doubleQuoted inlineParser <|> singleQuoted inlineParser
723717
724718withQuoteContext :: QuoteContext
725− -> (PandocParser Inline)
726− -> PandocParser Inline
719+ -> (GenParser Char ParserState Inline)
720+ -> GenParser Char ParserState Inline
727721withQuoteContext context parser = do
728722 oldState <- getState
729723 let oldQuoteContext = stateQuoteContext oldState
@@ -733,75 +727,75 @@ withQuoteContext context parser = do
733727 setState newState { stateQuoteContext = oldQuoteContext }
734728 return result
735729
736−singleQuoted :: PandocParser Inline
737− -> PandocParser Inline
730+singleQuoted :: GenParser Char ParserState Inline
731+ -> GenParser Char ParserState Inline
738732singleQuoted inlineParser = try $ do
739733 singleQuoteStart
740734 withQuoteContext InSingleQuote $ many1Till inlineParser singleQuoteEnd >>=
741735 return . Quoted SingleQuote . normalizeSpaces
742736
743−doubleQuoted :: PandocParser Inline
744− -> PandocParser Inline
737+doubleQuoted :: GenParser Char ParserState Inline
738+ -> GenParser Char ParserState Inline
745739doubleQuoted inlineParser = try $ do
746740 doubleQuoteStart
747741 withQuoteContext InDoubleQuote $ do
748742 contents <- manyTill inlineParser doubleQuoteEnd
749743 return . Quoted DoubleQuote . normalizeSpaces $ contents
750744
751−failIfInQuoteContext :: QuoteContext -> PandocParser ()
745+failIfInQuoteContext :: QuoteContext -> GenParser tok ParserState ()
752746failIfInQuoteContext context = do
753747 st <- getState
754748 if stateQuoteContext st == context
755749 then fail "already inside quotes"
756750 else return ()
757751
758−charOrRef :: [Char] -> GeneralParser st Char
752+charOrRef :: [Char] -> GenParser Char st Char
759753charOrRef cs =
760754 oneOf cs <|> try (do c <- characterReference
761755 guard (c `elem` cs)
762756 return c)
763757
764−singleQuoteStart :: PandocParser ()
765−singleQuoteStart = do
758+singleQuoteStart :: GenParser Char ParserState ()
759+singleQuoteStart = do
766760 failIfInQuoteContext InSingleQuote
767761 try $ do charOrRef "'\8216"
768762 notFollowedBy (oneOf ")!],.;:-? \t\n")
769763 notFollowedBy (try (oneOfStrings ["s","t","m","ve","ll","re"] >>
770− satisfy (not . isAlphaNum)))
764+ satisfy (not . isAlphaNum)))
771765 -- possess/contraction
772766 return ()
773767
774−singleQuoteEnd :: GeneralParser st ()
768+singleQuoteEnd :: GenParser Char st ()
775769singleQuoteEnd = try $ do
776770 charOrRef "'\8217"
777771 notFollowedBy alphaNum
778772
779−doubleQuoteStart :: PandocParser ()
773+doubleQuoteStart :: GenParser Char ParserState ()
780774doubleQuoteStart = do
781775 failIfInQuoteContext InDoubleQuote
782776 try $ do charOrRef "\"\8220"
783777 notFollowedBy (satisfy (\c -> c == ' ' || c == '\t' || c == '\n'))
784778
785−doubleQuoteEnd :: GeneralParser st ()
779+doubleQuoteEnd :: GenParser Char st ()
786780doubleQuoteEnd = do
787781 charOrRef "\"\8221"
788782 return ()
789783
790−ellipses :: GeneralParser st Inline
784+ellipses :: GenParser Char st Inline
791785ellipses = do
792786 try (charOrRef "…") <|> try (string "..." >> return '…')
793787 return Ellipses
794788
795−dash :: GeneralParser st Inline
789+dash :: GenParser Char st Inline
796790dash = enDash <|> emDash
797791
798−enDash :: GeneralParser st Inline
792+enDash :: GenParser Char st Inline
799793enDash = do
800794 try (charOrRef "–") <|>
801795 try (char '-' >> lookAhead (satisfy isDigit) >> return '–')
802796 return EnDash
803797
804−emDash :: GeneralParser st Inline
798+emDash :: GenParser Char st Inline
805799emDash = do
806800 try (charOrRef "—") <|> (try $ string "--" >> optional (char '-') >> return '—')
807801 return EmDash
@@ -811,7 +805,7 @@ emDash = do
811805--
812806
813807-- | Parse a \newcommand or \renewcommand macro definition.
814−macro :: PandocParser Block
808+macro :: GenParser Char ParserState Block
815809macro = do
816810 getState >>= guard . stateApplyMacros
817811 inp <- getInput
@@ -823,10 +817,11 @@ macro = do
823817 return Null
824818
825819-- | Apply current macros to string.
826−applyMacros' :: String -> PandocParser String
820+applyMacros' :: String -> GenParser Char ParserState String
827821applyMacros' target = do
828822 apply <- liftM stateApplyMacros getState
829823 if apply
830824 then do macros <- liftM stateMacros getState
831825 return $ applyMacros macros target
832826 else return target
827+