aboutsummaryrefslogtreecommitdiff
path: root/haddock-library/src
diff options
context:
space:
mode:
authorAlexander Biehl <alexbiehl@gmail.com>2017-12-17 11:40:03 +0100
committerAlexander Biehl <alexbiehl@gmail.com>2018-02-01 14:58:18 +0100
commit56c0e317093d2e25412cfa7dd10099c1fe729640 (patch)
tree20165c4f80e789db6a26bee7e2b7963dec3560b8 /haddock-library/src
parent93c1e6eb9e829a66ff213ec076d529ab008880b3 (diff)
Treat escaped \] better in definition lists (#717)
This fixes #546.
Diffstat (limited to 'haddock-library/src')
-rw-r--r--haddock-library/src/Documentation/Haddock/Parser.hs15
1 files changed, 14 insertions, 1 deletions
diff --git a/haddock-library/src/Documentation/Haddock/Parser.hs b/haddock-library/src/Documentation/Haddock/Parser.hs
index 8dc2a801..dd1044cb 100644
--- a/haddock-library/src/Documentation/Haddock/Parser.hs
+++ b/haddock-library/src/Documentation/Haddock/Parser.hs
@@ -338,7 +338,7 @@ definitionList :: BS.ByteString -> Parser (DocH mod Identifier)
definitionList indent = DocDefList <$> p
where
p = do
- label <- "[" *> (parseStringBS <$> takeWhile1 (notInClass "]\n")) <* ("]" <* optional ":")
+ label <- "[" *> (parseStringBS <$> scan False accept) <* ("]" <* optional ":")
c <- takeLine
(cs, items) <- more indent p
let contents = parseString . dropNLs . unlines $ c : cs
@@ -346,6 +346,19 @@ definitionList indent = DocDefList <$> p
Left x -> [(label, contents `docAppend` x)]
Right i -> (label, contents) : i
+ -- handle '\]' escapes
+ accept True ']' = Just False
+
+ -- stop on ']' or '\n'
+ accept _ ']' = Nothing
+ accept _ '\n' = Nothing
+
+ -- starting an escape sequence
+ accept _ '\\' = Just True
+
+ -- anything else
+ accept _ _ = Just False
+
-- | Drops all trailing newlines.
dropNLs :: String -> String
dropNLs = reverse . dropWhile (== '\n') . reverse