git.iko.soy/typeable/pandoc
on master help sign in
Textile reader: list and HTML block parsing improvements.
6fae136John MacFarlane
src/Text/Pandoc/Readers/Textile.hs+13−16
@@ -56,7 +56,7 @@ import Text.Pandoc.Builder (Inlines, Blocks, trimInlines)
56import qualified Text.Pandoc.Builder as B
56import qualified Text.Pandoc.Builder as B
57import Text.Pandoc.Options
57import Text.Pandoc.Options
58import Text.Pandoc.Parsing
58import Text.Pandoc.Parsing
59−import Text.Pandoc.Readers.HTML ( htmlTag, isInlineTag, isBlockTag )
59+import Text.Pandoc.Readers.HTML ( htmlTag, isBlockTag )
60import Text.Pandoc.Readers.LaTeX ( rawLaTeXInline, rawLaTeXBlock )
60import Text.Pandoc.Readers.LaTeX ( rawLaTeXInline, rawLaTeXBlock )
61import Text.HTML.TagSoup (parseTags, innerText, fromAttrib, Tag(..))
61import Text.HTML.TagSoup (parseTags, innerText, fromAttrib, Tag(..))
62import Text.HTML.TagSoup.Match
62import Text.HTML.TagSoup.Match
@@ -133,12 +133,9 @@ blockParsers = [ codeBlock
133 , rawLaTeXBlock'
133 , rawLaTeXBlock'
134 , maybeExplicitBlock "table" table
134 , maybeExplicitBlock "table" table
135 , maybeExplicitBlock "p" para
135 , maybeExplicitBlock "p" para
136− , endBlock
136+ , mempty <$ blanklines
137 ]
137 ]
138
138
139−endBlock :: Parser [Char] ParserState Blocks
140−endBlock = string "\n\n" >> return mempty
141−
142-- | Any block in the order of definition of blockParsers
139-- | Any block in the order of definition of blockParsers
143block :: Parser [Char] ParserState Blocks
140block :: Parser [Char] ParserState Blocks
144block = do
141block = do
@@ -193,7 +190,7 @@ header = try $ do
193 attr <- attributes
190 attr <- attributes
194 char '.'
191 char '.'
195 lookAhead whitespace
192 lookAhead whitespace
196− name <- trimInlines . mconcat <$> manyTill inline blockBreak
193+ name <- trimInlines . mconcat <$> many inline
197 attr' <- registerHeader attr name
194 attr' <- registerHeader attr name
198 return $ B.headerWith attr' level name
195 return $ B.headerWith attr' level name
199
196
@@ -304,17 +301,12 @@ definitionListItem = try $ do
304 ds <- parseFromString parseBlocks (s ++ "\n\n")
301 ds <- parseFromString parseBlocks (s ++ "\n\n")
305 return [ds]
302 return [ds]
306
303
307−-- | This terminates a block such as a paragraph. Because of raw html
308−-- blocks support, we have to lookAhead for a rawHtmlBlock.
309−blockBreak :: Parser [Char] ParserState ()
310−blockBreak = try (newline >> blanklines >> return ()) <|>
311− try (optional spaces >> lookAhead rawHtmlBlock >> return ())
312−
313-- raw content
304-- raw content
314
305
315-- | A raw Html Block, optionally followed by blanklines
306-- | A raw Html Block, optionally followed by blanklines
316rawHtmlBlock :: Parser [Char] ParserState Blocks
307rawHtmlBlock :: Parser [Char] ParserState Blocks
317rawHtmlBlock = try $ do
308rawHtmlBlock = try $ do
309+ skipMany spaceChar
318 (_,b) <- htmlTag isBlockTag
310 (_,b) <- htmlTag isBlockTag
319 optional blanklines
311 optional blanklines
320 return $ B.rawBlock "html" b
312 return $ B.rawBlock "html" b
@@ -328,7 +320,7 @@ rawLaTeXBlock' = do
328
320
329-- | In textile, paragraphs are separated by blank lines.
321-- | In textile, paragraphs are separated by blank lines.
330para :: Parser [Char] ParserState Blocks
322para :: Parser [Char] ParserState Blocks
331−para = B.para . trimInlines . mconcat <$> manyTill inline blockBreak
323+para = B.para . trimInlines . mconcat <$> many1 inline
332
324
333-- Tables
325-- Tables
334
326
@@ -505,11 +497,14 @@ whitespace = many1 spaceChar >> return B.space <?> "whitespace"
505-- | In Textile, an isolated endline character is a line break
497-- | In Textile, an isolated endline character is a line break
506endline :: Parser [Char] ParserState Inlines
498endline :: Parser [Char] ParserState Inlines
507endline = try $ do
499endline = try $ do
500+ newline
508− newline >> notFollowedBy blankline
501+ notFollowedBy blankline
502+ notFollowedBy listStart
503+ notFollowedBy rawHtmlBlock
509 return B.linebreak
504 return B.linebreak
510
505
511rawHtmlInline :: Parser [Char] ParserState Inlines
506rawHtmlInline :: Parser [Char] ParserState Inlines
512−rawHtmlInline = B.rawInline "html" . snd <$> htmlTag isInlineTag
507+rawHtmlInline = B.rawInline "html" . snd <$> htmlTag (const True)
513
508
514-- | Raw LaTeX Inline
509-- | Raw LaTeX Inline
515rawLaTeXInline' :: Parser [Char] ParserState Inlines
510rawLaTeXInline' :: Parser [Char] ParserState Inlines
@@ -561,7 +556,9 @@ escapedTag = B.str <$>
561
556
562-- | Any special symbol defined in wordBoundaries
557-- | Any special symbol defined in wordBoundaries
563symbol :: Parser [Char] ParserState Inlines
558symbol :: Parser [Char] ParserState Inlines
559+symbol = B.str . singleton <$> (notFollowedBy newline *>
560+ notFollowedBy rawHtmlBlock *>
564−symbol = B.str . singleton <$> (oneOf wordBoundaries <|> oneOf markupChars)
561+ oneOf wordBoundaries)
565
562
566-- | Inline code
563-- | Inline code
567code :: Parser [Char] ParserState Inlines
564code :: Parser [Char] ParserState Inlines
tests/textile-reader.native+7−6
@@ -67,6 +67,11 @@ Pandoc (Meta {unMeta = fromList []})
67,BulletList
67,BulletList
68 [[Plain [Str "one"]]
68 [[Plain [Str "one"]]
69 ,[Plain [Str "two",LineBreak,Str "->",Space,Str "and",Space,Str "more"]]]
69 ,[Plain [Str "two",LineBreak,Str "->",Space,Str "and",Space,Str "more"]]]
70+,Header 2 ("issue-1513",[],[]) [Str "Issue",Space,Str "#1513"]
71+,Para [Str "List:"]
72+,BulletList
73+ [[Plain [Str "one"]]
74+ ,[Plain [Str "two"]]]
70,Header 2 ("definition-list",[],[]) [Str "Definition",Space,Str "List"]
75,Header 2 ("definition-list",[],[]) [Str "Definition",Space,Str "List"]
71,DefinitionList
76,DefinitionList
72 [([Str "coffee"],
77 [([Str "coffee"],
@@ -145,13 +150,9 @@ Pandoc (Meta {unMeta = fromList []})
145,RawBlock (Format "html") "<div class=\"foobar\">"
150,RawBlock (Format "html") "<div class=\"foobar\">"
146,Para [Str "any",Space,Strong [Str "Raw",Space,Str "HTML",Space,Str "Block"],Space,Str "with",Space,Str "bold"]
151,Para [Str "any",Space,Strong [Str "Raw",Space,Str "HTML",Space,Str "Block"],Space,Str "with",Space,Str "bold"]
147,RawBlock (Format "html") "</div>"
152,RawBlock (Format "html") "</div>"
148−,Para [Str "Html",Space,Str "blocks",Space,Str "can",Space,Str "be"]
153+,Para [Str "Html",Space,Str "blocks",Space,Str "can",Space,Str "be",Space,RawInline (Format "html") "<div>",Str "inlined",RawInline (Format "html") "</div>",Space,Str "as",Space,Str "well."]
149−,RawBlock (Format "html") "<div>"
150−,Para [Str "inlined"]
151−,RawBlock (Format "html") "</div>"
152−,Para [Str "as",Space,Str "well."]
153,BulletList
154,BulletList
154− [[Plain [Str "this",Space,Str "<div>",Space,Str "won\8217t",Space,Str "produce",Space,Str "raw",Space,Str "html",Space,Str "blocks",Space,Str "</div>"]]
155+ [[Plain [Str "this",Space,RawInline (Format "html") "<div>",Space,Str "won\8217t",Space,Str "produce",Space,Str "raw",Space,Str "html",Space,Str "blocks",Space,RawInline (Format "html") "</div>"]]
155 ,[Plain [Str "but",Space,Str "this",Space,RawInline (Format "html") "<strong>",Space,Str "will",Space,Str "produce",Space,Str "inline",Space,Str "html",Space,RawInline (Format "html") "</strong>"]]]
156 ,[Plain [Str "but",Space,Str "this",Space,RawInline (Format "html") "<strong>",Space,Str "will",Space,Str "produce",Space,Str "inline",Space,Str "html",Space,RawInline (Format "html") "</strong>"]]]
156,Para [Str "Can",Space,Str "you",Space,Str "prove",Space,Str "that",Space,Str "2",Space,Str "<",Space,Str "3",Space,Str "?"]
157,Para [Str "Can",Space,Str "you",Space,Str "prove",Space,Str "that",Space,Str "2",Space,Str "<",Space,Str "3",Space,Str "?"]
157,Header 1 ("raw-latex",[],[]) [Str "Raw",Space,Str "LaTeX"]
158,Header 1 ("raw-latex",[],[]) [Str "Raw",Space,Str "LaTeX"]
tests/textile-reader.textile+6
@@ -123,6 +123,12 @@ h2. Issue #1500
123* two
123* two
124-> and more
124-> and more
125
125
126+h2. Issue #1513
127+
128+List:
129+* one
130+* two
131+
126h2. Definition List
132h2. Definition List
127
133
128- coffee := Hot and black
134- coffee := Hot and black