diff options
| -rw-r--r-- | src/Text/Pandoc/Readers/Markdown.hs | 67 | ||||
| -rw-r--r-- | tests/markdown-reader-more.native | 9 | ||||
| -rw-r--r-- | tests/markdown-reader-more.txt | 16 | 
3 files changed, 67 insertions, 25 deletions
| diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs index 861f81b23..26ea764be 100644 --- a/src/Text/Pandoc/Readers/Markdown.hs +++ b/src/Text/Pandoc/Readers/Markdown.hs @@ -141,14 +141,16 @@ nonindentSpaces = do       then return sps       else unexpected "indented line" -skipNonindentSpaces :: MarkdownParser () +-- returns number of spaces parsed +skipNonindentSpaces :: MarkdownParser Int  skipNonindentSpaces = do    tabStop <- getOption readerTabStop -  atMostSpaces (tabStop - 1) +  atMostSpaces (tabStop - 1) <* notFollowedBy (char ' ') -atMostSpaces :: Int -> MarkdownParser () -atMostSpaces 0 = notFollowedBy (char ' ') -atMostSpaces n = (char ' ' >> atMostSpaces (n-1)) <|> return () +atMostSpaces :: Int -> MarkdownParser Int +atMostSpaces n +  | n > 0     = (char ' ' >> (+1) <$> atMostSpaces (n-1)) <|> return 0 +  | otherwise = return 0  litChar :: MarkdownParser Char  litChar = escapedChar' @@ -717,35 +719,42 @@ blockQuote = do  bulletListStart :: MarkdownParser ()  bulletListStart = try $ do    optional newline -- if preceded by a Plain block in a list context +  startpos <- sourceColumn <$> getPosition    skipNonindentSpaces    notFollowedBy' (() <$ hrule)     -- because hrules start out just like lists    satisfy isBulletListMarker -  spaceChar <|> lookAhead newline -  skipSpaces +  endpos <- sourceColumn <$> getPosition +  tabStop <- getOption readerTabStop +  lookAhead (newline <|> spaceChar) +  () <$ atMostSpaces (tabStop - (endpos - startpos))  anyOrderedListStart :: MarkdownParser (Int, ListNumberStyle, ListNumberDelim)  anyOrderedListStart = try $ do    optional newline -- if preceded by a Plain block in a list context +  startpos <- sourceColumn <$> getPosition    skipNonindentSpaces    notFollowedBy $ string "p." >> spaceChar >> digit  -- page number -  (guardDisabled Ext_fancy_lists >> -       do many1 digit -          char '.' -          spaceChar -          return (1, DefaultStyle, DefaultDelim)) -   <|> do (num, style, delim) <- anyOrderedListMarker -          -- if it could be an abbreviated first name, insist on more than one space -          if delim == Period && (style == UpperAlpha || (style == UpperRoman && -             num `elem` [1, 5, 10, 50, 100, 500, 1000])) -             then char '\t' <|> (try $ char ' ' >> spaceChar) -             else spaceChar -          skipSpaces -          return (num, style, delim) +  res <- do guardDisabled Ext_fancy_lists +            many1 digit +            char '.' +            return (1, DefaultStyle, DefaultDelim) +     <|> do (num, style, delim) <- anyOrderedListMarker +            -- if it could be an abbreviated first name, +            -- insist on more than one space +            when (delim == Period && (style == UpperAlpha || +                 (style == UpperRoman && +                  num `elem` [1, 5, 10, 50, 100, 500, 1000]))) $ +               () <$ spaceChar +            return (num, style, delim) +  endpos <- sourceColumn <$> getPosition +  tabStop <- getOption readerTabStop +  lookAhead (newline <|> spaceChar) +  atMostSpaces (tabStop - (endpos - startpos)) +  return res  listStart :: MarkdownParser ()  listStart = bulletListStart <|> (anyOrderedListStart >> return ()) --- parse a line of a list item (start = parser for beginning of list item)  listLine :: MarkdownParser String  listLine = try $ do    notFollowedBy' (do indentSpaces @@ -753,19 +762,21 @@ listLine = try $ do                       listStart)    notFollowedByHtmlCloser    optional (() <$ indentSpaces) -  chunks <- manyTill +  listLineCommon + +listLineCommon :: MarkdownParser String +listLineCommon = concat <$> manyTill                (  many1 (satisfy $ \c -> c /= '\n' && c /= '<')               <|> liftM snd (htmlTag isCommentTag)               <|> count 1 anyChar                ) newline -  return $ concat chunks  -- parse raw text for one list item, excluding start marker and continuations  rawListItem :: MarkdownParser a              -> MarkdownParser String  rawListItem start = try $ do    start -  first <- listLine +  first <- listLineCommon    rest <- many (notFollowedBy listStart >> notFollowedBy blankline >> listLine)    blanks <- many blankline    return $ unlines (first:rest) ++ blanks @@ -823,8 +834,14 @@ orderedList = try $ do    items <- fmap sequence $ many1 $ listItem                   ( try $ do                       optional newline -- if preceded by Plain block in a list +                     startpos <- sourceColumn <$> getPosition                       skipNonindentSpaces -                     orderedListMarker style delim ) +                     res <- orderedListMarker style delim +                     endpos <- sourceColumn <$> getPosition +                     tabStop <- getOption readerTabStop +                     lookAhead (newline <|> spaceChar) +                     atMostSpaces (tabStop - (endpos - startpos)) +                     return res )    start' <- option 1 $ guardEnabled Ext_startnum >> return start    return $ B.orderedListWith (start', style, delim) <$> fmap compactify' items diff --git a/tests/markdown-reader-more.native b/tests/markdown-reader-more.native index b4713bc93..3e171e085 100644 --- a/tests/markdown-reader-more.native +++ b/tests/markdown-reader-more.native @@ -22,6 +22,15 @@  ,BulletList   [[Plain [Str "one",Space,RawInline (Format "html") "<!--\n- two\n-->"]]   ,[Plain [Str "three"]]] +,Header 2 ("indented-code-at-beginning-of-list",[],[]) [Str "Indented",Space,Str "code",Space,Str "at",Space,Str "beginning",Space,Str "of",Space,Str "list"] +,BulletList + [[CodeBlock ("",[],[]) "code\ncode"]] +,OrderedList (1,Decimal,Period) + [[CodeBlock ("",[],[]) "code\ncode"] + ,[CodeBlock ("",[],[]) "code\ncode"]] +,BulletList + [[CodeBlock ("",[],[]) "code\ncode"] + ,[Plain [Str "no",Space,Str "code"]]]  ,Header 2 ("backslash-newline",[],[]) [Str "Backslash",Space,Str "newline"]  ,Para [Str "hi",LineBreak,Str "there"]  ,Header 2 ("code-spans",[],[]) [Str "Code",Space,Str "spans"] diff --git a/tests/markdown-reader-more.txt b/tests/markdown-reader-more.txt index 4cd69c9d8..e1ad4f3e6 100644 --- a/tests/markdown-reader-more.txt +++ b/tests/markdown-reader-more.txt @@ -70,6 +70,22 @@ $PATH 90 $PATH  -->  - three +## Indented code at beginning of list + +-       code +        code + +  1.    code +        code + +  12345678.    code +        code + +  -     code +        code + +  -    no code +  ## Backslash newline  hi\ | 
