Fixed performance problems with '--strict' option:

+ Replaced skipEndline with "option ' ' newline" where possible.
+ Replaced "notFollowedBy' header" in definition of endline with
  a faster but equally accurate test for a folliwng header.
+ Removed check at the beginning of 'reference' for
  a noteStart: This is not needed, because note comes before
  referenceKey in the definition of block.
+ Replaced check for a following anyHtmlBlockTag in autoLink
  with a check for anyHtmlTag or anyHtmlEndTag.
+ Other small code cleanups.  


git-svn-id: https://pandoc.googlecode.com/svn/trunk@444 788f1e2b-df1e-0410-8736-df70ead52e1b
This commit is contained in:
fiddlosopher 2007-01-07 00:48:46 +00:00
parent 233148f963
commit 1bc585837c
2 changed files with 18 additions and 17 deletions

View file

@ -285,7 +285,7 @@ note = try (do
ref <- noteMarker
char ':'
skipSpaces
skipEndline
skipEndline
raw <- sepBy rawLines (try (do {blankline; indentSpaces}))
option "" blanklines
-- parse the extracted text, which may contain various block elements:
@ -510,7 +510,7 @@ referenceKey = try (do
blanklines
state <- getState
let keysUsed = stateKeysUsed state
updateState (\st -> st { stateKeysUsed = (label:keysUsed) })
setState state { stateKeysUsed = (label:keysUsed) }
return $ Key label (Src (removeTrailingSpace src) tit))
--
@ -652,7 +652,6 @@ emDash = try (do
skipSpaces
oneOfStrings ["---", "--"]
skipSpaces
option ' ' newline
return EmDash)
whitespace = do
@ -684,7 +683,9 @@ endline = try (do
if stateStrict st
then do
notFollowedBy' emailBlockQuoteStart
notFollowedBy' header
notFollowedBy (char atxHChar) -- atx header
notFollowedBy (try (do{manyTill anyChar newline;
oneOf setextHChars})) -- setext header
else return ()
-- parse potential list-starts differently if in a list:
if (stateParserContext st) == ListItemState
@ -705,7 +706,6 @@ rawLabel = try $ do
-- a reference label for a link
reference = try $ do
notFollowedBy (try (do{char labelStart; char noteStart}))
raw <- rawLabel
oldInput <- getInput
setInput raw
@ -726,13 +726,13 @@ source = try (do
titleWith startChar endChar = try (do
skipSpaces
skipEndline -- a title can be on the next line from the source
option ' ' newline -- a title can be on the next line from the source
skipSpaces
char startChar
tit <- manyTill anyChar (try (do
char endChar
skipSpaces
followedBy' (char ')' <|> newline)))
notFollowedBy (noneOf ")\n")))
let tit' = gsub "\"" "&quot;" tit
return tit')
@ -753,13 +753,14 @@ referenceLink = choice [referenceLinkDouble, referenceLinkSingle]
referenceLinkDouble = try (do
label <- reference
skipSpaces
skipEndline
option ' ' newline
skipSpaces
ref <- reference
let ref' = if null ref then label else ref
state <- getState
if ref' `elem` (stateKeysUsed state)
then return () else fail "no corresponding key"
then return ()
else fail "no corresponding key"
return (Link label (Ref ref')))
-- a link like [this]
@ -767,12 +768,13 @@ referenceLinkSingle = try (do
label <- reference
state <- getState
if label `elem` (stateKeysUsed state)
then return () else fail "no corresponding key"
then return ()
else fail "no corresponding key"
return (Link label (Ref label)))
-- a link <like.this.com>
autoLink = try (do
notFollowedBy' anyHtmlBlockTag
notFollowedBy' (anyHtmlTag <|> anyHtmlEndTag)
src <- between (char autoLinkStart) (char autoLinkEnd)
(many (noneOf (spaceChars ++ endLineChars ++ [autoLinkEnd])))
case (matchRegex emailAddress src) of
@ -797,7 +799,7 @@ noteRef = try (do
ref <- noteMarker
state <- getState
let identifiers = (stateNoteIdentifiers state) ++ [ref]
updateState (\st -> st {stateNoteIdentifiers = identifiers})
setState state {stateNoteIdentifiers = identifiers}
return (NoteRef (show (length identifiers))))
inlineNote = try (do
@ -809,9 +811,9 @@ inlineNote = try (do
let identifiers = stateNoteIdentifiers state
let ref = show $ (length identifiers) + 1
let noteBlocks = stateNoteBlocks state
updateState (\st -> st {stateNoteIdentifiers = (identifiers ++ [ref]),
stateNoteBlocks =
(Note ref [Para contents]):noteBlocks})
setState state {stateNoteIdentifiers = (identifiers ++ [ref]),
stateNoteBlocks =
(Note ref [Para contents]):noteBlocks}
return (NoteRef ref))
rawLaTeXInline' = do

View file

@ -81,8 +81,7 @@ blankline = try (do
-- | Parses one or more blank lines and returns a string of newlines.
blanklines :: GenParser Char st [Char]
blanklines = try (do
many1 blankline)
blanklines = try (many1 blankline)
-- | Parses backslash, then applies character parser.
escaped :: GenParser Char st Char -- ^ Parser for character to escape