From 4177ee86261f624232cf6022d28dba573af128fd Mon Sep 17 00:00:00 2001
From: John MacFarlane <jgm@berkeley.edu>
Date: Tue, 12 Sep 2017 08:58:47 -0700
Subject: [PATCH] Textile reader: allow 'pre' code in list item.

Closes #3916.
---
 src/Text/Pandoc/Readers/Textile.hs | 12 ++++--------
 test/command/3916.md               | 11 +++++++++++
 2 files changed, 15 insertions(+), 8 deletions(-)
 create mode 100644 test/command/3916.md

diff --git a/src/Text/Pandoc/Readers/Textile.hs b/src/Text/Pandoc/Readers/Textile.hs
index 853d2768f..9cd3d2c36 100644
--- a/src/Text/Pandoc/Readers/Textile.hs
+++ b/src/Text/Pandoc/Readers/Textile.hs
@@ -178,7 +178,6 @@ codeBlockPre :: PandocMonad m => ParserT [Char] ParserState m Blocks
 codeBlockPre = try $ do
   (t@(TagOpen _ attrs),_) <- htmlTag (tagOpen (=="pre") (const True))
   result' <- manyTill anyChar (htmlTag (tagClose (=="pre")))
-  optional blanklines
   -- drop leading newline if any
   let result'' = case result' of
                       '\n':xs -> xs
@@ -262,10 +261,11 @@ orderedListItemAtDepth = genericListItemAtDepth '#'
 genericListItemAtDepth :: PandocMonad m => Char -> Int -> ParserT [Char] ParserState m Blocks
 genericListItemAtDepth c depth = try $ do
   count depth (char c) >> attributes >> whitespace
-  p <- mconcat <$> many listInline
+  contents <- mconcat <$> many ((B.plain . mconcat <$> many1 inline) <|>
+                                try (newline >> codeBlockPre))
   newline
   sublist <- option mempty (anyListAtDepth (depth + 1))
-  return $ (B.plain p) <> sublist
+  return $ contents <> sublist
 
 -- | A definition list is a set of consecutive definition items
 definitionList :: PandocMonad m => ParserT [Char] ParserState m Blocks
@@ -295,10 +295,6 @@ definitionListStart = try $ do
     <|> try (lookAhead (() <$ string ":="))
      )
 
-listInline :: PandocMonad m => ParserT [Char] ParserState m Inlines
-listInline = try (notFollowedBy newline >> inline)
-         <|> try (endline <* notFollowedBy listStart)
-
 -- | A definition list item in textile begins with '- ', followed by
 -- the term defined, then spaces and ":=". The definition follows, on
 -- the same single line, or spaned on multiple line, after a line
@@ -310,7 +306,7 @@ definitionListItem = try $ do
   return (term, def')
   where inlineDef :: PandocMonad m => ParserT [Char] ParserState m [Blocks]
         inlineDef = liftM (\d -> [B.plain d])
-                    $ optional whitespace >> (trimInlines . mconcat <$> many listInline) <* newline
+                    $ optional whitespace >> (trimInlines . mconcat <$> many inline) <* newline
         multilineDef :: PandocMonad m => ParserT [Char] ParserState m [Blocks]
         multilineDef = try $ do
           optional whitespace >> newline
diff --git a/test/command/3916.md b/test/command/3916.md
new file mode 100644
index 000000000..9ac0834d7
--- /dev/null
+++ b/test/command/3916.md
@@ -0,0 +1,11 @@
+```
+% pandoc -f textile -t native
+# text text
+<pre>blabla</pre>
+# more
+^D
+[OrderedList (1,DefaultStyle,DefaultDelim)
+ [[Plain [Str "text",Space,Str "text"]
+  ,CodeBlock ("",[],[]) "blabla"]
+ ,[Plain [Str "more"]]]]
+```