git.iko.soy/typeable/pandoc
on master help sign in
RST reader: Use Text.Pandoc.Builder.

This will give us more flexibility in the future. It also gives built-in normalization. Performance slightly better.

commitab17faf49709bca8a864d1b80f8c8456865fef0c authorJohn MacFarlane <jgm@berkeley.edu> dateThu 27 Sep 2012, 16:45 (14 years ago) parent5c06322
3 files changed+305−299
src/Text/Pandoc/Readers/RST.hs+180−174 tests/rst-reader.native+103−103 tests/tables-rstsubset.native+22−22
src/Text/Pandoc/Readers/RST.hs+180−174
@@ -35,11 +35,14 @@ import Text.Pandoc.Shared
3535import Text.Pandoc.Parsing
3636import Text.Pandoc.Options
3737import Control.Monad ( when, liftM, guard, mzero )
38−import Data.List ( findIndex, intercalate, transpose, sort, deleteFirstsBy )
38+import Data.List ( findIndex, intersperse, intercalate, transpose, sort, deleteFirstsBy )
3939import qualified Data.Map as M
4040import Text.Printf ( printf )
4141import Data.Maybe ( catMaybes )
42−import Control.Applicative ((<$>))
42+import Control.Applicative ((<$>), (<$), (<*), (*>))
43+import Text.Pandoc.Builder (Inlines, Blocks, trimInlines, (<>))
44+import qualified Text.Pandoc.Builder as B
45+import Data.Monoid (mconcat, mempty)
4346
4447-- | Parse reStructuredText string and return Pandoc document.
4548readRST :: ReaderOptions -- ^ Reader options
@@ -104,26 +107,25 @@ parseRST = do
104107 let reversedNotes = stateNotes st'
105108 updateState $ \s -> s { stateNotes = reverse reversedNotes }
106109 -- now parse it for real...
107− blocks <- parseBlocks
108− let blocks' = filter (/= Null) blocks
110+ blocks <- B.toList <$> parseBlocks
109111 standalone <- getOption readerStandalone
110− let (blocks'', title) = if standalone
111− then titleTransform blocks'
112− else (blocks', [])
112+ let (blocks', title) = if standalone
113+ then titleTransform blocks
114+ else (blocks, [])
113115 state <- getState
114116 let authors = stateAuthors state
115117 let date = stateDate state
116− let title' = if (null title) then (stateTitle state) else title
117− return $ Pandoc (Meta title' authors date) blocks''
118+ let title' = if null title then stateTitle state else title
119+ return $ Pandoc (Meta title' authors date) blocks'
118120
119121--
120122-- parsing blocks
121123--
122124
123−parseBlocks :: Parser [Char] ParserState [Block]
124−parseBlocks = manyTill block eof
125+parseBlocks :: Parser [Char] ParserState Blocks
126+parseBlocks = mconcat <$> manyTill block eof
125127
126−block :: Parser [Char] ParserState Block
128+block :: Parser [Char] ParserState Blocks
127129block = choice [ codeBlock
128130 , rawBlock
129131 , blockQuote
@@ -142,7 +144,7 @@ block = choice [ codeBlock
142144 , lhsCodeBlock
143145 , para
144146 , plain
145− , nullBlock ] <?> "block"
147+ ] <?> "block"
146148
147149--
148150-- field list
@@ -161,13 +163,13 @@ rawFieldListItem indent = try $ do
161163 return (name, raw)
162164
163165fieldListItem :: String
164− -> Parser [Char] ParserState (Maybe ([Inline], [[Block]]))
166+ -> Parser [Char] ParserState (Maybe (Inlines, [Blocks]))
165167fieldListItem indent = try $ do
166168 (name, raw) <- rawFieldListItem indent
167− let term = [Str name]
168− contents <- parseFromString (many block) raw
169+ let term = B.str name
170+ contents <- parseFromString parseBlocks raw
169171 optional blanklines
170− case (name, contents) of
172+ case (name, B.toList contents) of
171173 ("Author", x) -> do
172174 updateState $ \st ->
173175 st{ stateAuthors = stateAuthors st ++ [extractContents x] }
@@ -188,19 +190,19 @@ extractContents [Plain auth] = auth
188190extractContents [Para auth] = auth
189191extractContents _ = []
190192
191−fieldList :: Parser [Char] ParserState Block
193+fieldList :: Parser [Char] ParserState Blocks
192194fieldList = try $ do
193195 indent <- lookAhead $ many spaceChar
194196 items <- many1 $ fieldListItem indent
195197 if null items
196− then return Null
197− else return $ DefinitionList $ catMaybes items
198+ then return mempty
199+ else return $ B.definitionList $ catMaybes items
198200
199201--
200202-- line block
201203--
202204
203−lineBlockLine :: Parser [Char] ParserState [Inline]
205+lineBlockLine :: Parser [Char] ParserState Inlines
204206lineBlockLine = try $ do
205207 char '|'
206208 char ' ' <|> lookAhead (char '\n')
@@ -208,87 +210,74 @@ lineBlockLine = try $ do
208210 line <- many $ (notFollowedBy newline >> inline) <|> (try $ endline >>~ char ' ')
209211 optional endline
210212 return $ if null white
211− then normalizeSpaces line
212− else Str white : normalizeSpaces line
213+ then mconcat line
214+ else B.str white <> mconcat line
213215
214−lineBlock :: Parser [Char] ParserState Block
216+lineBlock :: Parser [Char] ParserState Blocks
215217lineBlock = try $ do
216218 lines' <- many1 lineBlockLine
217219 blanklines
218− return $ Para (intercalate [LineBreak] lines')
220+ return $ B.para (mconcat $ intersperse B.linebreak lines')
219221
220222--
221223-- paragraph block
222224--
223225
224−para :: Parser [Char] ParserState Block
225−para = paraBeforeCodeBlock <|> paraNormal <?> "paragraph"
226−
227226codeBlockStart :: Parser [Char] st Char
228227codeBlockStart = string "::" >> blankline >> blankline
229228
230−-- paragraph that ends in a :: starting a code block
231−paraBeforeCodeBlock :: Parser [Char] ParserState Block
232−paraBeforeCodeBlock = try $ do
233− result <- many1 (notFollowedBy' codeBlockStart >> inline)
234− lookAhead (string "::")
235− return $ Para $ if last result == Space
236− then normalizeSpaces result
237− else (normalizeSpaces result) ++ [Str ":"]
238−
239−-- regular paragraph
240−paraNormal :: Parser [Char] ParserState Block
241−paraNormal = try $ do
242− result <- many1 inline
243− newline
244− blanklines
245− return $ Para $ normalizeSpaces result
229+-- note: paragraph can end in a :: starting a code block
230+para :: Parser [Char] ParserState Blocks
231+para = try $ do
232+ result <- trimInlines . mconcat <$>
233+ many1 (notFollowedBy' codeBlockStart >> inline)
234+ (lookAhead codeBlockStart >> return (B.para $ result <> B.str ":"))
235+ <|> (newline >> blanklines >> return (B.para result))
246236
247−plain :: Parser [Char] ParserState Block
248−plain = many1 inline >>= return . Plain . normalizeSpaces
237+plain :: Parser [Char] ParserState Blocks
238+plain = B.plain . trimInlines . mconcat <$> many1 inline
249239
250240--
251241-- image block
252242--
253243
254−imageBlock :: Parser [Char] ParserState Block
244+imageBlock :: Parser [Char] ParserState Blocks
255245imageBlock = try $ do
256246 string ".. "
257− res <- imageDef [Str "image"]
258− return $ Para [res]
247+ res <- imageDef (B.str "image")
248+ return $ B.para res
259249
260−imageDef :: [Inline] -> Parser [Char] ParserState Inline
250+imageDef :: Inlines -> Parser [Char] ParserState Inlines
261251imageDef defaultAlt = try $ do
262252 string "image:: "
263253 src <- escapeURI . removeLeadingTrailingSpace <$> manyTill anyChar newline
264254 fields <- try $ do indent <- lookAhead $ many (oneOf " /t")
265255 many $ rawFieldListItem indent
266256 optional blanklines
267− let alt = maybe defaultAlt (\x -> [Str $ removeTrailingSpace x])
257+ let alt = maybe defaultAlt (\x -> B.str $ removeTrailingSpace x)
268258 $ lookup "alt" fields
269− let img = Image alt (src,"")
259+ let img = B.image src "" alt
270260 return $ case lookup "target" fields of
271− Just t -> Link [img]
272− (escapeURI $ removeLeadingTrailingSpace t,"")
261+ Just t -> B.link (escapeURI $ removeLeadingTrailingSpace t)
262+ "" img
273263 Nothing -> img
274264
275−
276265--
277266-- header blocks
278267--
279268
280−header :: Parser [Char] ParserState Block
269+header :: Parser [Char] ParserState Blocks
281270header = doubleHeader <|> singleHeader <?> "header"
282271
283272-- a header with lines on top and bottom
284−doubleHeader :: Parser [Char] ParserState Block
273+doubleHeader :: Parser [Char] ParserState Blocks
285274doubleHeader = try $ do
286275 c <- oneOf underlineChars
287276 rest <- many (char c) -- the top line
288277 let lenTop = length (c:rest)
289278 skipSpaces
290279 newline
291− txt <- many1 (notFollowedBy blankline >> inline)
280+ txt <- trimInlines . mconcat <$> many1 (notFollowedBy blankline >> inline)
292281 pos <- getPosition
293282 let len = (sourceColumn pos) - 1
294283 if (len > lenTop) then fail "title longer than border" else return ()
@@ -303,13 +292,13 @@ doubleHeader = try $ do
303292 Just ind -> (headerTable, ind + 1)
304293 Nothing -> (headerTable ++ [DoubleHeader c], (length headerTable) + 1)
305294 setState (state { stateHeaderTable = headerTable' })
306− return $ Header level (normalizeSpaces txt)
295+ return $ B.header level txt
307296
308297-- a header with line on the bottom only
309−singleHeader :: Parser [Char] ParserState Block
298+singleHeader :: Parser [Char] ParserState Blocks
310299singleHeader = try $ do
311300 notFollowedBy' whitespace
312− txt <- many1 (do {notFollowedBy blankline; inline})
301+ txt <- trimInlines . mconcat <$> many1 (do {notFollowedBy blankline; inline})
313302 pos <- getPosition
314303 let len = (sourceColumn pos) - 1
315304 blankline
@@ -323,20 +312,20 @@ singleHeader = try $ do
323312 Just ind -> (headerTable, ind + 1)
324313 Nothing -> (headerTable ++ [SingleHeader c], (length headerTable) + 1)
325314 setState (state { stateHeaderTable = headerTable' })
326− return $ Header level (normalizeSpaces txt)
315+ return $ B.header level txt
327316
328317--
329318-- hrule block
330319--
331320
332−hrule :: Parser [Char] st Block
321+hrule :: Parser [Char] st Blocks
333322hrule = try $ do
334323 chr <- oneOf underlineChars
335324 count 3 (char chr)
336325 skipMany (char chr)
337326 blankline
338327 blanklines
339− return HorizontalRule
328+ return B.horizontalRule
340329
341330--
342331-- code blocks
@@ -359,49 +348,49 @@ indentedBlock = try $ do
359348 optional blanklines
360349 return $ unlines lns
361350
362−codeBlock :: Parser [Char] st Block
351+codeBlock :: Parser [Char] st Blocks
363352codeBlock = try $ do
364353 codeBlockStart
365354 result <- indentedBlock
366− return $ CodeBlock ("",[],[]) $ stripTrailingNewlines result
355+ return $ B.codeBlock $ stripTrailingNewlines result
367356
368357-- | The 'code-block' directive (from Sphinx) that allows a language to be
369358-- specified.
370−customCodeBlock :: Parser [Char] st Block
359+customCodeBlock :: Parser [Char] st Blocks
371360customCodeBlock = try $ do
372361 string ".. code-block:: "
373362 language <- manyTill anyChar newline
374363 blanklines
375364 result <- indentedBlock
376− return $ CodeBlock ("", ["sourceCode", language], []) $ stripTrailingNewlines result
377−
365+ return $ B.codeBlockWith ("", ["sourceCode", language], [])
366+ $ stripTrailingNewlines result
378367
379−figureBlock :: Parser [Char] ParserState Block
368+figureBlock :: Parser [Char] ParserState Blocks
380369figureBlock = try $ do
381370 string ".. figure::"
382− src <- removeLeadingTrailingSpace `fmap` manyTill anyChar newline
371+ src <- escapeURI . removeLeadingTrailingSpace <$> manyTill anyChar newline
383372 body <- indentedBlock
384373 caption <- parseFromString extractCaption body
385− return $ Para [Image caption (src,"")]
374+ return $ B.para $ B.image src "" caption
386375
387−extractCaption :: Parser [Char] ParserState [Inline]
376+extractCaption :: Parser [Char] ParserState Inlines
388377extractCaption = try $ do
389378 manyTill anyLine blanklines
390− many inline
379+ trimInlines . mconcat <$> many inline
391380
392381-- | The 'math' directive (from Sphinx) for display math.
393−mathBlock :: Parser [Char] st Block
382+mathBlock :: Parser [Char] st Blocks
394383mathBlock = try $ do
395384 string ".. math::"
396385 mathBlockMultiline <|> mathBlockOneLine
397386
398−mathBlockOneLine :: Parser [Char] st Block
387+mathBlockOneLine :: Parser [Char] st Blocks
399388mathBlockOneLine = try $ do
400389 result <- manyTill anyChar newline
401390 blanklines
402− return $ Para [Math DisplayMath $ removeLeadingTrailingSpace result]
391+ return $ B.para $ B.displayMath $ removeLeadingTrailingSpace result
403392
404−mathBlockMultiline :: Parser [Char] st Block
393+mathBlockMultiline :: Parser [Char] st Blocks
405394mathBlockMultiline = try $ do
406395 blanklines
407396 result <- indentedBlock
@@ -414,9 +403,9 @@ mathBlockMultiline = try $ do
414403 let lns' = dropWhile startsWithColon lns
415404 let eqs = map (removeLeadingTrailingSpace . unlines)
416405 $ filter (not . null) $ splitBy null lns'
417− return $ Para $ map (Math DisplayMath) eqs
406+ return $ B.para $ mconcat $ map B.displayMath eqs
418407
419−lhsCodeBlock :: Parser [Char] ParserState Block
408+lhsCodeBlock :: Parser [Char] ParserState Blocks
420409lhsCodeBlock = try $ do
421410 guardEnabled Ext_literate_haskell
422411 optional codeBlockStart
@@ -428,55 +417,54 @@ lhsCodeBlock = try $ do
428417 then map (drop 1) lns
429418 else lns
430419 blanklines
431− return $ CodeBlock ("", ["sourceCode", "literate", "haskell"], []) $ intercalate "\n" lns'
420+ return $ B.codeBlockWith ("", ["sourceCode", "literate", "haskell"], [])
421+ $ intercalate "\n" lns'
432422
433423birdTrackLine :: Parser [Char] st [Char]
434−birdTrackLine = do
435− char '>'
436− manyTill anyChar newline
424+birdTrackLine = char '>' >> manyTill anyChar newline
437425
438426--
439427-- raw html/latex/etc
440428--
441429
442−rawBlock :: Parser [Char] st Block
430+rawBlock :: Parser [Char] st Blocks
443431rawBlock = try $ do
444432 string ".. raw:: "
445433 lang <- many1 (letter <|> digit)
446434 blanklines
447435 result <- indentedBlock
448− return $ RawBlock lang result
436+ return $ B.rawBlock lang result
449437
450438--
451439-- block quotes
452440--
453441
454−blockQuote :: Parser [Char] ParserState Block
442+blockQuote :: Parser [Char] ParserState Blocks
455443blockQuote = do
456444 raw <- indentedBlock
457445 -- parse the extracted block, which may contain various block elements:
458446 contents <- parseFromString parseBlocks $ raw ++ "\n\n"
459− return $ BlockQuote contents
447+ return $ B.blockQuote contents
460448
461449--
462450-- list blocks
463451--
464452
465−list :: Parser [Char] ParserState Block
453+list :: Parser [Char] ParserState Blocks
466454list = choice [ bulletList, orderedList, definitionList ] <?> "list"
467455
468−definitionListItem :: Parser [Char] ParserState ([Inline], [[Block]])
456+definitionListItem :: Parser [Char] ParserState (Inlines, [Blocks])
469457definitionListItem = try $ do
470458 -- avoid capturing a directive or comment
471459 notFollowedBy (try $ char '.' >> char '.')
472− term <- many1Till inline endline
460+ term <- trimInlines . mconcat <$> many1Till inline endline
473461 raw <- indentedBlock
474462 -- parse the extracted block, which may contain various block elements:
475463 contents <- parseFromString parseBlocks $ raw ++ "\n"
476− return (normalizeSpaces term, [contents])
464+ return (term, [contents])
477465
478−definitionList :: Parser [Char] ParserState Block
479−definitionList = many1 definitionListItem >>= return . DefinitionList
466+definitionList :: Parser [Char] ParserState Blocks
467+definitionList = B.definitionList <$> many1 definitionListItem
480468
481469-- parses bullet list start and returns its length (inc. following whitespace)
482470bulletListStart :: Parser [Char] st Int
@@ -531,7 +519,7 @@ listContinuation markerLength = try $ do
531519 return $ blanks ++ concat result
532520
533521listItem :: Parser [Char] ParserState Int
534− -> Parser [Char] ParserState [Block]
522+ -> Parser [Char] ParserState Blocks
535523listItem start = try $ do
536524 (markerLength, first) <- rawListItem start
537525 rest <- many (listContinuation markerLength)
@@ -548,22 +536,21 @@ listItem start = try $ do
548536 updateState (\st -> st {stateParserContext = oldContext})
549537 return parsed
550538
551−orderedList :: Parser [Char] ParserState Block
539+orderedList :: Parser [Char] ParserState Blocks
552540orderedList = try $ do
553541 (start, style, delim) <- lookAhead (anyOrderedListMarker >>~ spaceChar)
554542 items <- many1 (listItem (orderedListStart style delim))
555− let items' = compactify items
556− return $ OrderedList (start, style, delim) items'
543+ let items' = compactify' items
544+ return $ B.orderedListWith (start, style, delim) items'
557545
558−bulletList :: Parser [Char] ParserState Block
559−bulletList = many1 (listItem bulletListStart) >>=
560− return . BulletList . compactify
546+bulletList :: Parser [Char] ParserState Blocks
547+bulletList = B.bulletList . compactify' <$> many1 (listItem bulletListStart)
561548
562549--
563550-- default-role block
564551--
565552
566−defaultRoleBlock :: Parser [Char] ParserState Block
553+defaultRoleBlock :: Parser [Char] ParserState Blocks
567554defaultRoleBlock = try $ do
568555 string ".. default-role::"
569556 -- doesn't enforce any restrictions on the role name; embedded spaces shouldn't be allowed, for one
@@ -574,20 +561,20 @@ defaultRoleBlock = try $ do
574561 else role
575562 }
576563 -- skip body of the directive if it exists
577− many $ blanklines <|> (spaceChar >> manyTill anyChar newline)
578− return Null
564+ skipMany $ blanklines <|> (spaceChar >> manyTill anyChar newline)
565+ return mempty
579566
580567--
581568-- unknown directive (e.g. comment)
582569--
583570
584−unknownDirective :: Parser [Char] st Block
571+unknownDirective :: Parser [Char] st Blocks
585572unknownDirective = try $ do
586573 string ".."
587574 notFollowedBy (noneOf " \t\n")
588575 manyTill anyChar newline
589576 many $ blanklines <|> (spaceChar >> manyTill anyChar newline)
590− return Null
577+ return mempty
591578
592579---
593580--- note block
@@ -625,15 +612,15 @@ noteMarker = do
625612-- reference key
626613--
627614
628−quotedReferenceName :: Parser [Char] ParserState [Inline]
615+quotedReferenceName :: Parser [Char] ParserState Inlines
629616quotedReferenceName = try $ do
630617 char '`' >> notFollowedBy (char '`') -- `` means inline code!
631− label' <- many1Till inline (char '`')
618+ label' <- trimInlines . mconcat <$> many1Till inline (char '`')
632619 return label'
633620
634−unquotedReferenceName :: Parser [Char] ParserState [Inline]
621+unquotedReferenceName :: Parser [Char] ParserState Inlines
635622unquotedReferenceName = try $ do
636− label' <- many1Till inline (lookAhead $ char ':')
623+ label' <- trimInlines . mconcat <$> many1Till inline (lookAhead $ char ':')
637624 return label'
638625
639626-- Simple reference names are single words consisting of alphanumerics
@@ -647,12 +634,12 @@ simpleReferenceName' = do
647634 <|> (try $ oneOf "-_:+." >> lookAhead alphaNum)
648635 return (x:xs)
649636
650−simpleReferenceName :: Parser [Char] st [Inline]
637+simpleReferenceName :: Parser [Char] st Inlines
651638simpleReferenceName = do
652639 raw <- simpleReferenceName'
653− return [Str raw]
640+ return $ B.str raw
654641
655−referenceName :: Parser [Char] ParserState [Inline]
642+referenceName :: Parser [Char] ParserState Inlines
656643referenceName = quotedReferenceName <|>
657644 (try $ simpleReferenceName >>~ lookAhead (char ':')) <|>
658645 unquotedReferenceName
@@ -678,7 +665,7 @@ targetURI = do
678665imageKey :: Parser [Char] ParserState ()
679666imageKey = try $ do
680667 string ".. |"
681− (alt,ref) <- withRaw (manyTill inline (char '|'))
668+ (alt,ref) <- withRaw (trimInlines . mconcat <$> manyTill inline (char '|'))
682669 skipSpaces
683670 img <- imageDef alt
684671 let key = toKey $ init ref
@@ -753,7 +740,7 @@ simpleTableRow indices = do
753740 firstLine <- simpleTableRawLine indices
754741 colLines <- return [] -- TODO
755742 let cols = map unlines . transpose $ firstLine : colLines
756− mapM (parseFromString (many plain)) cols
743+ mapM (parseFromString (B.toList . mconcat <$> many plain)) cols
757744
758745simpleTableSplitLine :: [Int] -> String -> [String]
759746simpleTableSplitLine indices line =
@@ -775,34 +762,34 @@ simpleTableHeader headless = try $ do
775762 let rawHeads = if headless
776763 then replicate (length dashes) ""
777764 else simpleTableSplitLine indices rawContent
778− heads <- mapM (parseFromString (many plain)) $
765+ heads <- mapM (parseFromString (B.toList . mconcat <$> many plain)) $
779766 map removeLeadingTrailingSpace rawHeads
780767 return (heads, aligns, indices)
781768
782769-- Parse a simple table.
783770simpleTable :: Bool -- ^ Headerless table
784− -> Parser [Char] ParserState Block
771+ -> Parser [Char] ParserState Blocks
785772simpleTable headless = do
786773 Table c a _w h l <- tableWith (simpleTableHeader headless) simpleTableRow sep simpleTableFooter
787774 -- Simple tables get 0s for relative column widths (i.e., use default)
788− return $ Table c a (replicate (length a) 0) h l
775+ return $ B.singleton $ Table c a (replicate (length a) 0) h l
789776 where
790777 sep = return () -- optional (simpleTableSep '-')
791778
792779gridTable :: Bool -- ^ Headerless table
793− -> Parser [Char] ParserState Block
794−gridTable = gridTableWith parseBlocks
780+ -> Parser [Char] ParserState Blocks
781+gridTable headerless = B.singleton
782+ <$> gridTableWith (B.toList <$> parseBlocks) headerless
795783
796−table :: Parser [Char] ParserState Block
784+table :: Parser [Char] ParserState Blocks
797785table = gridTable False <|> simpleTable False <|>
798786 gridTable True <|> simpleTable True <?> "table"
799787
788+--
789+-- inline
790+--
800791
801− --
802− -- inline
803− --
804−
805−inline :: Parser [Char] ParserState Inline
792+inline :: Parser [Char] ParserState Inlines
806793inline = choice [ whitespace
807794 , link
808795 , str
@@ -815,36 +802,36 @@ inline = choice [ whitespace
815802 , subscript
816803 , math
817804 , note
818− , smartPunctuation inline
805+ , smart
819806 , hyphens
820807 , escapedChar
821808 , symbol ] <?> "inline"
822809
823−hyphens :: Parser [Char] ParserState Inline
810+hyphens :: Parser [Char] ParserState Inlines
824811hyphens = do
825812 result <- many1 (char '-')
826− option Space endline
813+ optional endline
827814 -- don't want to treat endline after hyphen or dash as a space
828− return $ Str result
815+ return $ B.str result
829816
830−escapedChar :: Parser [Char] st Inline
817+escapedChar :: Parser [Char] st Inlines
831818escapedChar = do c <- escaped anyChar
832819 return $ if c == ' ' -- '\ ' is null in RST
833− then Str ""
834− else Str [c]
820+ then mempty
821+ else B.str [c]
835822
836−symbol :: Parser [Char] ParserState Inline
823+symbol :: Parser [Char] ParserState Inlines
837824symbol = do
838825 result <- oneOf specialChars
839− return $ Str [result]
826+ return $ B.str [result]
840827
841828-- parses inline code, between codeStart and codeEnd
842−code :: Parser [Char] ParserState Inline
829+code :: Parser [Char] ParserState Inlines
843830code = try $ do
844831 string "``"
845832 result <- manyTill anyChar (try (string "``"))
846− return $ Code nullAttr
847− $ removeLeadingTrailingSpace $ intercalate " " $ lines result
833+ return $ B.code
834+ $ removeLeadingTrailingSpace $ unwords $ lines result
848835
849836-- succeeds only if we're not right after a str (ie. in middle of word)
850837atStart :: Parser [Char] ParserState a -> Parser [Char] ParserState a
@@ -855,13 +842,13 @@ atStart p = do
855842 guard $ stateLastStrPos st /= Just pos
856843 p
857844
858−emph :: Parser [Char] ParserState Inline
859−emph = enclosed (atStart $ char '*') (char '*') inline >>=
860− return . Emph . normalizeSpaces
845+emph :: Parser [Char] ParserState Inlines
846+emph = B.emph . trimInlines . mconcat <$>
847+ enclosed (atStart $ char '*') (char '*') inline
861848
862−strong :: Parser [Char] ParserState Inline
863−strong = enclosed (atStart $ string "**") (try $ string "**") inline >>=
864− return . Strong . normalizeSpaces
849+strong :: Parser [Char] ParserState Inlines
850+strong = B.strong . trimInlines . mconcat <$>
851+ enclosed (atStart $ string "**") (try $ string "**") inline
865852
866853-- Parses inline interpreted text which is required to have the given role.
867854-- This decision is based on the role marker (if present),
@@ -873,8 +860,8 @@ interpreted role = try $ do
873860 then try markedInterpretedText <|> unmarkedInterpretedText
874861 else markedInterpretedText
875862 where
876− markedInterpretedText = try (roleMarker >> unmarkedInterpretedText)
877− <|> (unmarkedInterpretedText >>= (\txt -> roleMarker >> return txt))
863+ markedInterpretedText = try (roleMarker *> unmarkedInterpretedText)
864+ <|> (unmarkedInterpretedText <* roleMarker)
878865 roleMarker = string $ ":" ++ role ++ ":"
879866 -- Note, this doesn't precisely implement the complex rule in
880867 -- http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#inline-markup-recognition-rules
@@ -883,27 +870,27 @@ interpreted role = try $ do
883870 result <- enclosed (atStart $ char '`') (char '`') anyChar
884871 return result
885872
886−superscript :: Parser [Char] ParserState Inline
887−superscript = interpreted "sup" >>= \x -> return (Superscript [Str x])
873+superscript :: Parser [Char] ParserState Inlines
874+superscript = B.superscript . B.str <$> interpreted "sup"
888875
889−subscript :: Parser [Char] ParserState Inline
890−subscript = interpreted "sub" >>= \x -> return (Subscript [Str x])
876+subscript :: Parser [Char] ParserState Inlines
877+subscript = B.subscript . B.str <$> interpreted "sub"
891878
892−math :: Parser [Char] ParserState Inline
893−math = interpreted "math" >>= \x -> return (Math InlineMath x)
879+math :: Parser [Char] ParserState Inlines
880+math = B.math <$> interpreted "math"
894881
895−whitespace :: Parser [Char] ParserState Inline
896−whitespace = many1 spaceChar >> return Space <?> "whitespace"
882+whitespace :: Parser [Char] ParserState Inlines
883+whitespace = B.space <$ skipMany1 spaceChar <?> "whitespace"
897884
898−str :: Parser [Char] ParserState Inline
885+str :: Parser [Char] ParserState Inlines
899886str = do
900887 let strChar = noneOf ("\t\n " ++ specialChars)
901888 result <- many1 strChar
902889 updateLastStrPos
903− return $ Str result
890+ return $ B.str result
904891
905892-- an endline character that can be treated as a space, not a structural break
906−endline :: Parser [Char] ParserState Inline
893+endline :: Parser [Char] ParserState Inlines
907894endline = try $ do
908895 newline
909896 notFollowedBy blankline
@@ -913,28 +900,27 @@ endline = try $ do
913900 then notFollowedBy (anyOrderedListMarker >> spaceChar) >>
914901 notFollowedBy' bulletListStart
915902 else return ()
916− return Space
903+ return B.space
917904
918905--
919906-- links
920907--
921908
922−link :: Parser [Char] ParserState Inline
909+link :: Parser [Char] ParserState Inlines
923910link = choice [explicitLink, referenceLink, autoLink] <?> "link"
924911
925−explicitLink :: Parser [Char] ParserState Inline
912+explicitLink :: Parser [Char] ParserState Inlines
926913explicitLink = try $ do
927914 char '`'
928915 notFollowedBy (char '`') -- `` marks start of inline code
929− label' <- manyTill (notFollowedBy (char '`') >> inline)
930− (try (spaces >> char '<'))
916+ label' <- trimInlines . mconcat <$>
917+ manyTill (notFollowedBy (char '`') >> inline) (char '<')
931918 src <- manyTill (noneOf ">\n") (char '>')
932919 skipSpaces
933920 string "`_"
934− return $ Link (normalizeSpaces label')
935− (escapeURI $ removeLeadingTrailingSpace src, "")
921+ return $ B.link (escapeURI $ removeLeadingTrailingSpace src) "" label'
936922
937−referenceLink :: Parser [Char] ParserState Inline
923+referenceLink :: Parser [Char] ParserState Inlines
938924referenceLink = try $ do
939925 (label',ref) <- withRaw (quotedReferenceName <|> simpleReferenceName) >>~
940926 char '_'
@@ -953,23 +939,23 @@ referenceLink = try $ do
953939 Just target -> return target
954940 -- if anonymous link, remove key so it won't be used again
955941 when (isAnonKey key) $ updateState $ \s -> s{ stateKeys = M.delete key keyTable }
956− return $ Link (normalizeSpaces label') (src, tit)
942+ return $ B.link src tit label'
957943
958−autoURI :: Parser [Char] ParserState Inline
944+autoURI :: Parser [Char] ParserState Inlines
959945autoURI = do
960946 (orig, src) <- uri
961− return $ Link [Str orig] (src, "")
947+ return $ B.link src "" $ B.str orig
962948
963−autoEmail :: Parser [Char] ParserState Inline
949+autoEmail :: Parser [Char] ParserState Inlines
964950autoEmail = do
965951 (orig, src) <- emailAddress
966− return $ Link [Str orig] (src, "")
952+ return $ B.link src "" $ B.str orig
967953
968−autoLink :: Parser [Char] ParserState Inline
954+autoLink :: Parser [Char] ParserState Inlines
969955autoLink = autoURI <|> autoEmail
970956
971957-- For now, we assume that all substitution references are for images.
972−image :: Parser [Char] ParserState Inline
958+image :: Parser [Char] ParserState Inlines
973959image = try $ do
974960 char '|'
975961 (_,ref) <- withRaw (manyTill inline (char '|'))
@@ -979,7 +965,7 @@ image = try $ do
979965 Nothing -> fail "no corresponding key"
980966 Just target -> return target
981967
982−note :: Parser [Char] ParserState Inline
968+note :: Parser [Char] ParserState Inlines
983969note = try $ do
984970 ref <- noteMarker
985971 char '_'
@@ -1000,4 +986,24 @@ note = try $ do
1000986 then deleteFirstsBy (==) notes [(ref,raw)]
1001987 else notes
1002988 updateState $ \st -> st{ stateNotes = newnotes }
1003− return $ Note contents
989+ return $ B.note contents
990+
991+smart :: Parser [Char] ParserState Inlines
992+smart = do
993+ getOption readerSmart >>= guard
994+ doubleQuoted <|> singleQuoted <|>
995+ choice (map (B.singleton <$>) [apostrophe, dash, ellipses])
996+
997+singleQuoted :: Parser [Char] ParserState Inlines
998+singleQuoted = try $ do
999+ singleQuoteStart
1000+ withQuoteContext InSingleQuote $
1001+ B.singleQuoted . trimInlines . mconcat <$>
1002+ many1Till inline singleQuoteEnd
1003+
1004+doubleQuoted :: Parser [Char] ParserState Inlines
1005+doubleQuoted = try $ do
1006+ doubleQuoteStart
1007+ withQuoteContext InDoubleQuote $
1008+ B.doubleQuoted . trimInlines . mconcat <$>
1009+ many1Till inline doubleQuoteEnd
tests/rst-reader.native+103−103
@@ -3,115 +3,115 @@ Pandoc (Meta {docTitle = [Str "Pandoc",Space,Str "Test",Space,Str "Suite",Str ":
33 [([Str "Revision"],
44 [[Para [Str "3"]]])]
55,Header 1 [Str "Level",Space,Str "one",Space,Str "header"]
6−,Para [Str "This",Space,Str "is",Space,Str "a",Space,Str "set",Space,Str "of",Space,Str "tests",Space,Str "for",Space,Str "pandoc",Str ".",Space,Str "Most",Space,Str "of",Space,Str "them",Space,Str "are",Space,Str "adapted",Space,Str "from",Space,Str "John",Space,Str "Gruber",Str "\8217",Str "s",Space,Str "markdown",Space,Str "test",Space,Str "suite",Str "."]
6+,Para [Str "This",Space,Str "is",Space,Str "a",Space,Str "set",Space,Str "of",Space,Str "tests",Space,Str "for",Space,Str "pandoc.",Space,Str "Most",Space,Str "of",Space,Str "them",Space,Str "are",Space,Str "adapted",Space,Str "from",Space,Str "John",Space,Str "Gruber\8217s",Space,Str "markdown",Space,Str "test",Space,Str "suite."]
77,Header 2 [Str "Level",Space,Str "two",Space,Str "header"]
88,Header 3 [Str "Level",Space,Str "three"]
99,Header 4 [Str "Level",Space,Str "four",Space,Str "with",Space,Emph [Str "emphasis"]]
1010,Header 5 [Str "Level",Space,Str "five"]
1111,Header 1 [Str "Paragraphs"]
12−,Para [Str "Here",Str "\8217",Str "s",Space,Str "a",Space,Str "regular",Space,Str "paragraph",Str "."]
13−,Para [Str "In",Space,Str "Markdown",Space,Str "1",Str ".",Str "0",Str ".",Str "0",Space,Str "and",Space,Str "earlier",Str ".",Space,Str "Version",Space,Str "8",Str ".",Space,Str "This",Space,Str "line",Space,Str "turns",Space,Str "into",Space,Str "a",Space,Str "list",Space,Str "item",Str ".",Space,Str "Because",Space,Str "a",Space,Str "hard",Str "-",Str "wrapped",Space,Str "line",Space,Str "in",Space,Str "the",Space,Str "middle",Space,Str "of",Space,Str "a",Space,Str "paragraph",Space,Str "looked",Space,Str "like",Space,Str "a",Space,Str "list",Space,Str "item",Str "."]
14−,Para [Str "Here",Str "\8217",Str "s",Space,Str "one",Space,Str "with",Space,Str "a",Space,Str "bullet",Str ".",Space,Str "*",Space,Str "criminey",Str "."]
15−,Para [Str "Horizontal",Space,Str "rule",Str ":"]
12+,Para [Str "Here\8217s",Space,Str "a",Space,Str "regular",Space,Str "paragraph."]
13+,Para [Str "In",Space,Str "Markdown",Space,Str "1.0.0",Space,Str "and",Space,Str "earlier.",Space,Str "Version",Space,Str "8.",Space,Str "This",Space,Str "line",Space,Str "turns",Space,Str "into",Space,Str "a",Space,Str "list",Space,Str "item.",Space,Str "Because",Space,Str "a",Space,Str "hard-wrapped",Space,Str "line",Space,Str "in",Space,Str "the",Space,Str "middle",Space,Str "of",Space,Str "a",Space,Str "paragraph",Space,Str "looked",Space,Str "like",Space,Str "a",Space,Str "list",Space,Str "item."]
14+,Para [Str "Here\8217s",Space,Str "one",Space,Str "with",Space,Str "a",Space,Str "bullet.",Space,Str "*",Space,Str "criminey."]
15+,Para [Str "Horizontal",Space,Str "rule:"]
1616,HorizontalRule
17−,Para [Str "Another",Str ":"]
17+,Para [Str "Another:"]
1818,HorizontalRule
1919,Header 1 [Str "Block",Space,Str "Quotes"]
20−,Para [Str "Here",Str "\8217",Str "s",Space,Str "a",Space,Str "block",Space,Str "quote",Str ":"]
20+,Para [Str "Here\8217s",Space,Str "a",Space,Str "block",Space,Str "quote:"]
2121,BlockQuote
22− [Para [Str "This",Space,Str "is",Space,Str "a",Space,Str "block",Space,Str "quote",Str ".",Space,Str "It",Space,Str "is",Space,Str "pretty",Space,Str "short",Str "."]]
23−,Para [Str "Here",Str "\8217",Str "s",Space,Str "another,",Space,Str "differently",Space,Str "indented",Str ":"]
22+ [Para [Str "This",Space,Str "is",Space,Str "a",Space,Str "block",Space,Str "quote.",Space,Str "It",Space,Str "is",Space,Str "pretty",Space,Str "short."]]
23+,Para [Str "Here\8217s",Space,Str "another,",Space,Str "differently",Space,Str "indented:"]
2424,BlockQuote
25− [Para [Str "This",Space,Str "is",Space,Str "a",Space,Str "block",Space,Str "quote",Str ".",Space,Str "It",Str "\8217",Str "s",Space,Str "indented",Space,Str "with",Space,Str "a",Space,Str "tab",Str "."]
26− ,Para [Str "Code",Space,Str "in",Space,Str "a",Space,Str "block",Space,Str "quote",Str ":"]
25+ [Para [Str "This",Space,Str "is",Space,Str "a",Space,Str "block",Space,Str "quote.",Space,Str "It\8217s",Space,Str "indented",Space,Str "with",Space,Str "a",Space,Str "tab."]
26+ ,Para [Str "Code",Space,Str "in",Space,Str "a",Space,Str "block",Space,Str "quote:"]
2727 ,CodeBlock ("",[],[]) "sub status {\n print \"working\";\n}"
28− ,Para [Str "List",Space,Str "in",Space,Str "a",Space,Str "block",Space,Str "quote",Str ":"]
28+ ,Para [Str "List",Space,Str "in",Space,Str "a",Space,Str "block",Space,Str "quote:"]
2929 ,OrderedList (1,Decimal,Period)
3030 [[Plain [Str "item",Space,Str "one"]]
3131 ,[Plain [Str "item",Space,Str "two"]]]
32− ,Para [Str "Nested",Space,Str "block",Space,Str "quotes",Str ":"]
32+ ,Para [Str "Nested",Space,Str "block",Space,Str "quotes:"]
3333 ,BlockQuote
3434 [Para [Str "nested"]
3535 ,BlockQuote
3636 [Para [Str "nested"]]]]
3737,Header 1 [Str "Code",Space,Str "Blocks"]
38−,Para [Str "Code",Str ":"]
38+,Para [Str "Code:"]
3939,CodeBlock ("",[],[]) "---- (should be four hyphens)\n\nsub status {\n print \"working\";\n}"
4040,CodeBlock ("",[],[]) "this code block is indented by one tab"
41−,Para [Str "And",Str ":"]
41+,Para [Str "And:"]
4242,CodeBlock ("",[],[]) "this block is indented by two tabs\n\nThese should not be escaped: \\$ \\\\ \\> \\[ \\{"
43−,Para [Str "And",Str ":"]
43+,Para [Str "And:"]
4444,CodeBlock ("",["sourceCode","python"],[]) "def my_function(x):\n return x + 1"
4545,Header 1 [Str "Lists"]
4646,Header 2 [Str "Unordered"]
47−,Para [Str "Asterisks",Space,Str "tight",Str ":"]
47+,Para [Str "Asterisks",Space,Str "tight:"]
4848,BulletList
4949 [[Plain [Str "asterisk",Space,Str "1"]]
5050 ,[Plain [Str "asterisk",Space,Str "2"]]
5151 ,[Plain [Str "asterisk",Space,Str "3"]]]
52−,Para [Str "Asterisks",Space,Str "loose",Str ":"]
52+,Para [Str "Asterisks",Space,Str "loose:"]
5353,BulletList
5454 [[Para [Str "asterisk",Space,Str "1"]]
5555 ,[Para [Str "asterisk",Space,Str "2"]]
5656 ,[Para [Str "asterisk",Space,Str "3"]]]
57−,Para [Str "Pluses",Space,Str "tight",Str ":"]
57+,Para [Str "Pluses",Space,Str "tight:"]
5858,BulletList
5959 [[Plain [Str "Plus",Space,Str "1"]]
6060 ,[Plain [Str "Plus",Space,Str "2"]]
6161 ,[Plain [Str "Plus",Space,Str "3"]]]
62−,Para [Str "Pluses",Space,Str "loose",Str ":"]
62+,Para [Str "Pluses",Space,Str "loose:"]
6363,BulletList
6464 [[Para [Str "Plus",Space,Str "1"]]
6565 ,[Para [Str "Plus",Space,Str "2"]]
6666 ,[Para [Str "Plus",Space,Str "3"]]]
67−,Para [Str "Minuses",Space,Str "tight",Str ":"]
67+,Para [Str "Minuses",Space,Str "tight:"]
6868,BulletList
6969 [[Plain [Str "Minus",Space,Str "1"]]
7070 ,[Plain [Str "Minus",Space,Str "2"]]
7171 ,[Plain [Str "Minus",Space,Str "3"]]]
72−,Para [Str "Minuses",Space,Str "loose",Str ":"]
72+,Para [Str "Minuses",Space,Str "loose:"]
7373,BulletList
7474 [[Para [Str "Minus",Space,Str "1"]]
7575 ,[Para [Str "Minus",Space,Str "2"]]
7676 ,[Para [Str "Minus",Space,Str "3"]]]
7777,Header 2 [Str "Ordered"]
78−,Para [Str "Tight",Str ":"]
78+,Para [Str "Tight:"]
7979,OrderedList (1,Decimal,Period)
8080 [[Plain [Str "First"]]
8181 ,[Plain [Str "Second"]]
8282 ,[Plain [Str "Third"]]]
83−,Para [Str "and",Str ":"]
83+,Para [Str "and:"]
8484,OrderedList (1,Decimal,Period)
8585 [[Plain [Str "One"]]
8686 ,[Plain [Str "Two"]]
8787 ,[Plain [Str "Three"]]]
88−,Para [Str "Loose",Space,Str "using",Space,Str "tabs",Str ":"]
88+,Para [Str "Loose",Space,Str "using",Space,Str "tabs:"]
8989,OrderedList (1,Decimal,Period)
9090 [[Para [Str "First"]]
9191 ,[Para [Str "Second"]]
9292 ,[Para [Str "Third"]]]
93−,Para [Str "and",Space,Str "using",Space,Str "spaces",Str ":"]
93+,Para [Str "and",Space,Str "using",Space,Str "spaces:"]
9494,OrderedList (1,Decimal,Period)
9595 [[Para [Str "One"]]
9696 ,[Para [Str "Two"]]
9797 ,[Para [Str "Three"]]]
98−,Para [Str "Multiple",Space,Str "paragraphs",Str ":"]
98+,Para [Str "Multiple",Space,Str "paragraphs:"]
9999,OrderedList (1,Decimal,Period)
100− [[Para [Str "Item",Space,Str "1,",Space,Str "graf",Space,Str "one",Str "."]
101− ,Para [Str "Item",Space,Str "1",Str ".",Space,Str "graf",Space,Str "two",Str ".",Space,Str "The",Space,Str "quick",Space,Str "brown",Space,Str "fox",Space,Str "jumped",Space,Str "over",Space,Str "the",Space,Str "lazy",Space,Str "dog",Str "\8217",Str "s",Space,Str "back",Str "."]]
102− ,[Para [Str "Item",Space,Str "2",Str "."]]
103− ,[Para [Str "Item",Space,Str "3",Str "."]]]
104−,Para [Str "Nested",Str ":"]
100+ [[Para [Str "Item",Space,Str "1,",Space,Str "graf",Space,Str "one."]
101+ ,Para [Str "Item",Space,Str "1.",Space,Str "graf",Space,Str "two.",Space,Str "The",Space,Str "quick",Space,Str "brown",Space,Str "fox",Space,Str "jumped",Space,Str "over",Space,Str "the",Space,Str "lazy",Space,Str "dog\8217s",Space,Str "back."]]
102+ ,[Para [Str "Item",Space,Str "2."]]
103+ ,[Para [Str "Item",Space,Str "3."]]]
104+,Para [Str "Nested:"]
105105,BulletList
106106 [[Para [Str "Tab"]
107107 ,BulletList
108108 [[Para [Str "Tab"]
109109 ,BulletList
110110 [[Plain [Str "Tab"]]]]]]]
111−,Para [Str "Here",Str "\8217",Str "s",Space,Str "another",Str ":"]
111+,Para [Str "Here\8217s",Space,Str "another:"]
112112,OrderedList (1,Decimal,Period)
113113 [[Para [Str "First"]]
114− ,[Para [Str "Second",Str ":"]
114+ ,[Para [Str "Second:"]
115115 ,BlockQuote
116116 [BulletList
117117 [[Plain [Str "Fee"]]
@@ -129,111 +129,111 @@ Pandoc (Meta {docTitle = [Str "Pandoc",Space,Str "Test",Space,Str "Suite",Str ":
129129 ,OrderedList (1,UpperAlpha,TwoParens)
130130 [[Plain [Str "a",Space,Str "subsublist"]]
131131 ,[Plain [Str "a",Space,Str "subsublist"]]]]]]]
132−,Para [Str "Nesting",Str ":"]
132+,Para [Str "Nesting:"]
133133,OrderedList (1,UpperAlpha,Period)
134134 [[Para [Str "Upper",Space,Str "Alpha"]
135135 ,OrderedList (1,UpperRoman,Period)
136− [[Para [Str "Upper",Space,Str "Roman",Str "."]
136+ [[Para [Str "Upper",Space,Str "Roman."]
137137 ,OrderedList (6,Decimal,TwoParens)
138138 [[Para [Str "Decimal",Space,Str "start",Space,Str "with",Space,Str "6"]
139139 ,OrderedList (3,LowerAlpha,OneParen)
140140 [[Plain [Str "Lower",Space,Str "alpha",Space,Str "with",Space,Str "paren"]]]]]]]]]
141−,Para [Str "Autonumbering",Str ":"]
141+,Para [Str "Autonumbering:"]
142142,OrderedList (1,DefaultStyle,DefaultDelim)
143− [[Plain [Str "Autonumber",Str "."]]
144− ,[Para [Str "More",Str "."]
143+ [[Plain [Str "Autonumber."]]
144+ ,[Para [Str "More."]
145145 ,OrderedList (1,DefaultStyle,DefaultDelim)
146− [[Plain [Str "Nested",Str "."]]]]]
147−,Para [Str "Autonumbering",Space,Str "with",Space,Str "explicit",Space,Str "start",Str ":"]
146+ [[Plain [Str "Nested."]]]]]
147+,Para [Str "Autonumbering",Space,Str "with",Space,Str "explicit",Space,Str "start:"]
148148,OrderedList (4,LowerAlpha,TwoParens)
149149 [[Plain [Str "item",Space,Str "1"]]
150150 ,[Plain [Str "item",Space,Str "2"]]]
151151,Header 2 [Str "Definition"]
152152,DefinitionList
153153 [([Str "term",Space,Str "1"],
154− [[Para [Str "Definition",Space,Str "1",Str "."]]])
154+ [[Para [Str "Definition",Space,Str "1."]]])
155155 ,([Str "term",Space,Str "2"],
156− [[Para [Str "Definition",Space,Str "2,",Space,Str "paragraph",Space,Str "1",Str "."]
157− ,Para [Str "Definition",Space,Str "2,",Space,Str "paragraph",Space,Str "2",Str "."]]])
156+ [[Para [Str "Definition",Space,Str "2,",Space,Str "paragraph",Space,Str "1."]
157+ ,Para [Str "Definition",Space,Str "2,",Space,Str "paragraph",Space,Str "2."]]])
158158 ,([Str "term",Space,Str "with",Space,Emph [Str "emphasis"]],
159− [[Para [Str "Definition",Space,Str "3",Str "."]]])]
159+ [[Para [Str "Definition",Space,Str "3."]]])]
160160,Header 1 [Str "Field",Space,Str "Lists"]
161161,BlockQuote
162162 [DefinitionList
163163 [([Str "address"],
164− [[Para [Str "61",Space,Str "Main",Space,Str "St",Str "."]]])
164+ [[Para [Str "61",Space,Str "Main",Space,Str "St."]]])
165165 ,([Str "city"],
166166 [[Para [Emph [Str "Nowhere"],Str ",",Space,Str "MA,",Space,Str "USA"]]])
167167 ,([Str "phone"],
168− [[Para [Str "123",Str "-",Str "4567"]]])]]
168+ [[Para [Str "123-4567"]]])]]
169169,DefinitionList
170170 [([Str "address"],
171− [[Para [Str "61",Space,Str "Main",Space,Str "St",Str "."]]])
171+ [[Para [Str "61",Space,Str "Main",Space,Str "St."]]])
172172 ,([Str "city"],
173173 [[Para [Emph [Str "Nowhere"],Str ",",Space,Str "MA,",Space,Str "USA"]]])
174174 ,([Str "phone"],
175− [[Para [Str "123",Str "-",Str "4567"]]])]
175+ [[Para [Str "123-4567"]]])]
176176,Header 1 [Str "HTML",Space,Str "Blocks"]
177−,Para [Str "Simple",Space,Str "block",Space,Str "on",Space,Str "one",Space,Str "line",Str ":"]
177+,Para [Str "Simple",Space,Str "block",Space,Str "on",Space,Str "one",Space,Str "line:"]
178178,RawBlock "html" "<div>foo</div>\n"
179−,Para [Str "Now,",Space,Str "nested",Str ":"]
179+,Para [Str "Now,",Space,Str "nested:"]
180180,RawBlock "html" "<div>\n <div>\n <div>\n foo\n </div>\n </div>\n</div>\n"
181181,Header 1 [Str "LaTeX",Space,Str "Block"]
182182,RawBlock "latex" "\\begin{tabular}{|l|l|}\\hline\nAnimal & Number \\\\ \\hline\nDog & 2 \\\\\nCat & 1 \\\\ \\hline\n\\end{tabular}\n"
183183,Header 1 [Str "Inline",Space,Str "Markup"]
184184,Para [Str "This",Space,Str "is",Space,Emph [Str "emphasized"],Str ".",Space,Str "This",Space,Str "is",Space,Strong [Str "strong"],Str "."]
185−,Para [Str "This",Space,Str "is",Space,Str "code",Str ":",Space,Code ("",[],[]) ">",Str ",",Space,Code ("",[],[]) "$",Str ",",Space,Code ("",[],[]) "\\",Str ",",Space,Code ("",[],[]) "\\$",Str ",",Space,Code ("",[],[]) "<html>",Str "."]
185+,Para [Str "This",Space,Str "is",Space,Str "code:",Space,Code ("",[],[]) ">",Str ",",Space,Code ("",[],[]) "$",Str ",",Space,Code ("",[],[]) "\\",Str ",",Space,Code ("",[],[]) "\\$",Str ",",Space,Code ("",[],[]) "<html>",Str "."]
186186,Para [Str "This",Space,Str "is",Subscript [Str "subscripted"],Space,Str "and",Space,Str "this",Space,Str "is",Space,Superscript [Str "superscripted"],Str "."]
187187,Header 1 [Str "Special",Space,Str "Characters"]
188−,Para [Str "Here",Space,Str "is",Space,Str "some",Space,Str "unicode",Str ":"]
188+,Para [Str "Here",Space,Str "is",Space,Str "some",Space,Str "unicode:"]
189189,BulletList
190− [[Plain [Str "I",Space,Str "hat",Str ":",Space,Str "\206"]]
191− ,[Plain [Str "o",Space,Str "umlaut",Str ":",Space,Str "\246"]]
192− ,[Plain [Str "section",Str ":",Space,Str "\167"]]
193− ,[Plain [Str "set",Space,Str "membership",Str ":",Space,Str "\8712"]]
194− ,[Plain [Str "copyright",Str ":",Space,Str "\169"]]]
195−,Para [Str "AT&T",Space,Str "has",Space,Str "an",Space,Str "ampersand",Space,Str "in",Space,Str "their",Space,Str "name",Str "."]
196−,Para [Str "This",Space,Str "&",Space,Str "that",Str "."]
197−,Para [Str "4",Space,Str "<",Space,Str "5",Str "."]
198−,Para [Str "6",Space,Str ">",Space,Str "5",Str "."]
199−,Para [Str "Backslash",Str ":",Space,Str "\\"]
200−,Para [Str "Backtick",Str ":",Space,Str "`"]
201−,Para [Str "Asterisk",Str ":",Space,Str "*"]
202−,Para [Str "Underscore",Str ":",Space,Str "_"]
203−,Para [Str "Left",Space,Str "brace",Str ":",Space,Str "{"]
204−,Para [Str "Right",Space,Str "brace",Str ":",Space,Str "}"]
205−,Para [Str "Left",Space,Str "bracket",Str ":",Space,Str "["]
206−,Para [Str "Right",Space,Str "bracket",Str ":",Space,Str "]"]
207−,Para [Str "Left",Space,Str "paren",Str ":",Space,Str "("]
208−,Para [Str "Right",Space,Str "paren",Str ":",Space,Str ")"]
209−,Para [Str "Greater",Str "-",Str "than",Str ":",Space,Str ">"]
210−,Para [Str "Hash",Str ":",Space,Str "#"]
211−,Para [Str "Period",Str ":",Space,Str "."]
212−,Para [Str "Bang",Str ":",Space,Str "!"]
213−,Para [Str "Plus",Str ":",Space,Str "+"]
214−,Para [Str "Minus",Str ":",Space,Str "-"]
190+ [[Plain [Str "I",Space,Str "hat:",Space,Str "\206"]]
191+ ,[Plain [Str "o",Space,Str "umlaut:",Space,Str "\246"]]
192+ ,[Plain [Str "section:",Space,Str "\167"]]
193+ ,[Plain [Str "set",Space,Str "membership:",Space,Str "\8712"]]
194+ ,[Plain [Str "copyright:",Space,Str "\169"]]]
195+,Para [Str "AT&T",Space,Str "has",Space,Str "an",Space,Str "ampersand",Space,Str "in",Space,Str "their",Space,Str "name."]
196+,Para [Str "This",Space,Str "&",Space,Str "that."]
197+,Para [Str "4",Space,Str "<",Space,Str "5."]
198+,Para [Str "6",Space,Str ">",Space,Str "5."]
199+,Para [Str "Backslash:",Space,Str "\\"]
200+,Para [Str "Backtick:",Space,Str "`"]
201+,Para [Str "Asterisk:",Space,Str "*"]
202+,Para [Str "Underscore:",Space,Str "_"]
203+,Para [Str "Left",Space,Str "brace:",Space,Str "{"]
204+,Para [Str "Right",Space,Str "brace:",Space,Str "}"]
205+,Para [Str "Left",Space,Str "bracket:",Space,Str "["]
206+,Para [Str "Right",Space,Str "bracket:",Space,Str "]"]
207+,Para [Str "Left",Space,Str "paren:",Space,Str "("]
208+,Para [Str "Right",Space,Str "paren:",Space,Str ")"]
209+,Para [Str "Greater-than:",Space,Str ">"]
210+,Para [Str "Hash:",Space,Str "#"]
211+,Para [Str "Period:",Space,Str "."]
212+,Para [Str "Bang:",Space,Str "!"]
213+,Para [Str "Plus:",Space,Str "+"]
214+,Para [Str "Minus:",Space,Str "-"]
215215,Header 1 [Str "Links"]
216−,Para [Str "Explicit",Str ":",Space,Str "a",Space,Link [Str "URL"] ("/url/",""),Str "."]
217−,Para [Str "Two",Space,Str "anonymous",Space,Str "links",Str ":",Space,Link [Str "the",Space,Str "first"] ("/url1/",""),Space,Str "and",Space,Link [Str "the",Space,Str "second"] ("/url2/","")]
218−,Para [Str "Reference",Space,Str "links",Str ":",Space,Link [Str "link1"] ("/url1/",""),Space,Str "and",Space,Link [Str "link2"] ("/url2/",""),Space,Str "and",Space,Link [Str "link1"] ("/url1/",""),Space,Str "again",Str "."]
219−,Para [Str "Here",Str "\8217",Str "s",Space,Str "a",Space,Link [Str "link",Space,Str "with",Space,Str "an",Space,Str "ampersand",Space,Str "in",Space,Str "the",Space,Str "URL"] ("http://example.com/?foo=1&bar=2",""),Str "."]
220−,Para [Str "Here",Str "\8217",Str "s",Space,Str "a",Space,Str "link",Space,Str "with",Space,Str "an",Space,Str "amersand",Space,Str "in",Space,Str "the",Space,Str "link",Space,Str "text",Str ":",Space,Link [Str "AT&T"] ("/url/",""),Str "."]
221−,Para [Str "Autolinks",Str ":",Space,Link [Str "http://example.com/?foo=1&bar=2"] ("http://example.com/?foo=1&bar=2",""),Space,Str "and",Space,Link [Str "nobody@nowhere.net"] ("mailto:nobody@nowhere.net",""),Str "."]
222−,Para [Str "But",Space,Str "not",Space,Str "here",Str ":"]
216+,Para [Str "Explicit:",Space,Str "a",Space,Link [Str "URL"] ("/url/",""),Str "."]
217+,Para [Str "Two",Space,Str "anonymous",Space,Str "links:",Space,Link [Str "the",Space,Str "first"] ("/url1/",""),Space,Str "and",Space,Link [Str "the",Space,Str "second"] ("/url2/","")]
218+,Para [Str "Reference",Space,Str "links:",Space,Link [Str "link1"] ("/url1/",""),Space,Str "and",Space,Link [Str "link2"] ("/url2/",""),Space,Str "and",Space,Link [Str "link1"] ("/url1/",""),Space,Str "again."]
219+,Para [Str "Here\8217s",Space,Str "a",Space,Link [Str "link",Space,Str "with",Space,Str "an",Space,Str "ampersand",Space,Str "in",Space,Str "the",Space,Str "URL"] ("http://example.com/?foo=1&bar=2",""),Str "."]
220+,Para [Str "Here\8217s",Space,Str "a",Space,Str "link",Space,Str "with",Space,Str "an",Space,Str "amersand",Space,Str "in",Space,Str "the",Space,Str "link",Space,Str "text:",Space,Link [Str "AT&T"] ("/url/",""),Str "."]
221+,Para [Str "Autolinks:",Space,Link [Str "http://example.com/?foo=1&bar=2"] ("http://example.com/?foo=1&bar=2",""),Space,Str "and",Space,Link [Str "nobody@nowhere.net"] ("mailto:nobody@nowhere.net",""),Str "."]
222+,Para [Str "But",Space,Str "not",Space,Str "here:"]
223223,CodeBlock ("",[],[]) "http://example.com/"
224224,Header 1 [Str "Images"]
225−,Para [Str "From",Space,Quoted DoubleQuote [Str "Voyage",Space,Str "dans",Space,Str "la",Space,Str "Lune"],Space,Str "by",Space,Str "Georges",Space,Str "Melies",Space,Str "(",Str "1902",Str ")",Str ":"]
225+,Para [Str "From",Space,Quoted DoubleQuote [Str "Voyage",Space,Str "dans",Space,Str "la",Space,Str "Lune"],Space,Str "by",Space,Str "Georges",Space,Str "Melies",Space,Str "(1902):"]
226226,Para [Image [Str "image"] ("lalune.jpg","")]
227227,Para [Image [Str "Voyage dans la Lune"] ("lalune.jpg","")]
228−,Para [Str "Here",Space,Str "is",Space,Str "a",Space,Str "movie",Space,Image [Str "movie"] ("movie.jpg",""),Space,Str "icon",Str "."]
228+,Para [Str "Here",Space,Str "is",Space,Str "a",Space,Str "movie",Space,Image [Str "movie"] ("movie.jpg",""),Space,Str "icon."]
229229,Para [Str "And",Space,Str "an",Space,Link [Image [Str "A movie"] ("movie.jpg","")] ("/url",""),Str "."]
230230,Header 1 [Str "Comments"]
231231,Para [Str "First",Space,Str "paragraph"]
232232,Para [Str "Another",Space,Str "paragraph"]
233233,Para [Str "A",Space,Str "third",Space,Str "paragraph"]
234234,Header 1 [Str "Line",Space,Str "blocks"]
235−,Para [Str "But",Space,Str "can",Space,Str "a",Space,Str "bee",Space,Str "be",Space,Str "said",Space,Str "to",Space,Str "be",LineBreak,Str " ",Str "or",Space,Str "not",Space,Str "to",Space,Str "be",Space,Str "an",Space,Str "entire",Space,Str "bee,",LineBreak,Str " ",Str "when",Space,Str "half",Space,Str "the",Space,Str "bee",Space,Str "is",Space,Str "not",Space,Str "a",Space,Str "bee,",LineBreak,Str " ",Str "due",Space,Str "to",Space,Str "some",Space,Str "ancient",Space,Str "injury?"]
236−,Para [Str "Continuation",Space,Str "line",LineBreak,Str " ",Str "and",Space,Str "another"]
235+,Para [Str "But",Space,Str "can",Space,Str "a",Space,Str "bee",Space,Str "be",Space,Str "said",Space,Str "to",Space,Str "be",LineBreak,Str " or",Space,Str "not",Space,Str "to",Space,Str "be",Space,Str "an",Space,Str "entire",Space,Str "bee,",LineBreak,Str " when",Space,Str "half",Space,Str "the",Space,Str "bee",Space,Str "is",Space,Str "not",Space,Str "a",Space,Str "bee,",LineBreak,Str " due",Space,Str "to",Space,Str "some",Space,Str "ancient",Space,Str "injury?"]
236+,Para [Str "Continuation",Space,Str "line",LineBreak,Str " and",Space,Str "another"]
237237,Header 1 [Str "Simple",Space,Str "Tables"]
238238,Table [] [AlignDefault,AlignDefault,AlignDefault] [0.0,0.0,0.0]
239239 [[Plain [Str "col",Space,Str "1"]]
@@ -302,25 +302,25 @@ Pandoc (Meta {docTitle = [Str "Pandoc",Space,Str "Test",Space,Str "Suite",Str ":
302302 ,[Plain [Str "b",Space,Str "2"]]]]
303303 ,[Plain [Str "c",Space,Str "c",Space,Str "2",Space,Str "c",Space,Str "2"]]]]
304304,Header 1 [Str "Footnotes"]
305−,Para [Note [Para [Str "Note",Space,Str "with",Space,Str "one",Space,Str "line",Str "."]]]
306−,Para [Note [Para [Str "Note",Space,Str "with",Space,Str "continuation",Space,Str "line",Str "."]]]
307−,Para [Note [Para [Str "Note",Space,Str "with"],Para [Str "continuation",Space,Str "block",Str "."]]]
308−,Para [Note [Para [Str "Note",Space,Str "with",Space,Str "continuation",Space,Str "line"],Para [Str "and",Space,Str "a",Space,Str "second",Space,Str "para",Str "."]]]
309−,Para [Str "Not",Space,Str "in",Space,Str "note",Str "."]
305+,Para [Note [Para [Str "Note",Space,Str "with",Space,Str "one",Space,Str "line."]]]
306+,Para [Note [Para [Str "Note",Space,Str "with",Space,Str "continuation",Space,Str "line."]]]
307+,Para [Note [Para [Str "Note",Space,Str "with"],Para [Str "continuation",Space,Str "block."]]]
308+,Para [Note [Para [Str "Note",Space,Str "with",Space,Str "continuation",Space,Str "line"],Para [Str "and",Space,Str "a",Space,Str "second",Space,Str "para."]]]
309+,Para [Str "Not",Space,Str "in",Space,Str "note."]
310310,Header 1 [Str "Math"]
311−,Para [Str "Some",Space,Str "inline",Space,Str "math",Space,Math InlineMath "E=mc^2",Str ".",Space,Str "Now",Space,Str "some",Space,Str "display",Space,Str "math",Str ":"]
311+,Para [Str "Some",Space,Str "inline",Space,Str "math",Space,Math InlineMath "E=mc^2",Str ".",Space,Str "Now",Space,Str "some",Space,Str "display",Space,Str "math:"]
312312,Para [Math DisplayMath "E=mc^2"]
313313,Para [Math DisplayMath "E = mc^2"]
314314,Para [Math DisplayMath "E = mc^2",Math DisplayMath "\\alpha = \\beta"]
315315,Para [Math DisplayMath "E &= mc^2\\\\\nF &= \\pi E",Math DisplayMath "F &= \\gamma \\alpha^2"]
316−,Para [Str "All",Space,Str "done",Str "."]
317−,Header 1 [Str "Default",Str "-",Str "Role"]
318−,Para [Str "Try",Space,Str "changing",Space,Str "the",Space,Str "default",Space,Str "role",Space,Str "to",Space,Str "a",Space,Str "few",Space,Str "different",Space,Str "things",Str "."]
319−,Header 2 [Str "Doesn",Str "\8217",Str "t",Space,Str "Break",Space,Str "Title",Space,Str "Parsing"]
320−,Para [Str "Inline",Space,Str "math",Str ":",Space,Math InlineMath "E=mc^2",Space,Str "or",Space,Math InlineMath "E=mc^2",Space,Str "or",Space,Math InlineMath "E=mc^2",Str ".",Space,Str "Other",Space,Str "roles",Str ":",Space,Superscript [Str "super"],Str ",",Space,Subscript [Str "sub"],Str "."]
316+,Para [Str "All",Space,Str "done."]
317+,Header 1 [Str "Default-Role"]
318+,Para [Str "Try",Space,Str "changing",Space,Str "the",Space,Str "default",Space,Str "role",Space,Str "to",Space,Str "a",Space,Str "few",Space,Str "different",Space,Str "things."]
319+,Header 2 [Str "Doesn\8217t",Space,Str "Break",Space,Str "Title",Space,Str "Parsing"]
320+,Para [Str "Inline",Space,Str "math:",Space,Math InlineMath "E=mc^2",Space,Str "or",Space,Math InlineMath "E=mc^2",Space,Str "or",Space,Math InlineMath "E=mc^2",Str ".",Space,Str "Other",Space,Str "roles:",Space,Superscript [Str "super"],Str ",",Space,Subscript [Str "sub"],Str "."]
321321,Para [Math DisplayMath "\\alpha = beta",Math DisplayMath "E = mc^2"]
322322,Para [Str "Some",Space,Superscript [Str "of"],Space,Str "these",Space,Superscript [Str "words"],Space,Str "are",Space,Str "in",Space,Superscript [Str "superscript"],Str "."]
323−,Para [Str "Reset",Space,Str "default",Str "-",Str "role",Space,Str "to",Space,Str "the",Space,Str "default",Space,Str "default",Str "."]
324−,Para [Str "And",Space,Str "now",Space,Str "`",Str "some",Str "-",Str "invalid",Str "-",Str "string",Str "-",Str "3231231",Str "`",Space,Str "is",Space,Str "nonsense",Str "."]
323+,Para [Str "Reset",Space,Str "default-role",Space,Str "to",Space,Str "the",Space,Str "default",Space,Str "default."]
324+,Para [Str "And",Space,Str "now",Space,Str "`some-invalid-string-3231231`",Space,Str "is",Space,Str "nonsense."]
325325,Header 2 [Str "Literal",Space,Str "symbols"]
326−,Para [Str "2",Str "*",Str "2",Space,Str "=",Space,Str "4",Str "*",Str "1"]]
326+,Para [Str "2*2",Space,Str "=",Space,Str "4*1"]]
tests/tables-rstsubset.native+22−22
@@ -1,4 +1,4 @@
1−[Para [Str "Simple",Space,Str "table",Space,Str "with",Space,Str "caption",Str ":"]
1+[Para [Str "Simple",Space,Str "table",Space,Str "with",Space,Str "caption:"]
22,Table [] [AlignDefault,AlignDefault,AlignDefault,AlignDefault] [0.125,0.1125,0.1375,0.15]
33 [[Plain [Str "Right"]]
44 ,[Plain [Str "Left"]]
@@ -16,8 +16,8 @@
1616 ,[Plain [Str "1"]]
1717 ,[Plain [Str "1"]]
1818 ,[Plain [Str "1"]]]]
19−,Para [Str "Table",Str ":",Space,Str "Demonstration",Space,Str "of",Space,Str "simple",Space,Str "table",Space,Str "syntax",Str "."]
20−,Para [Str "Simple",Space,Str "table",Space,Str "without",Space,Str "caption",Str ":"]
19+,Para [Str "Table:",Space,Str "Demonstration",Space,Str "of",Space,Str "simple",Space,Str "table",Space,Str "syntax."]
20+,Para [Str "Simple",Space,Str "table",Space,Str "without",Space,Str "caption:"]
2121,Table [] [AlignDefault,AlignDefault,AlignDefault,AlignDefault] [0.125,0.1125,0.1375,0.15]
2222 [[Plain [Str "Right"]]
2323 ,[Plain [Str "Left"]]
@@ -35,7 +35,7 @@
3535 ,[Plain [Str "1"]]
3636 ,[Plain [Str "1"]]
3737 ,[Plain [Str "1"]]]]
38−,Para [Str "Simple",Space,Str "table",Space,Str "indented",Space,Str "two",Space,Str "spaces",Str ":"]
38+,Para [Str "Simple",Space,Str "table",Space,Str "indented",Space,Str "two",Space,Str "spaces:"]
3939,Table [] [AlignDefault,AlignDefault,AlignDefault,AlignDefault] [0.125,0.1125,0.1375,0.15]
4040 [[Plain [Str "Right"]]
4141 ,[Plain [Str "Left"]]
@@ -53,8 +53,8 @@
5353 ,[Plain [Str "1"]]
5454 ,[Plain [Str "1"]]
5555 ,[Plain [Str "1"]]]]
56−,Para [Str "Table",Str ":",Space,Str "Demonstration",Space,Str "of",Space,Str "simple",Space,Str "table",Space,Str "syntax",Str "."]
57−,Para [Str "Multiline",Space,Str "table",Space,Str "with",Space,Str "caption",Str ":"]
56+,Para [Str "Table:",Space,Str "Demonstration",Space,Str "of",Space,Str "simple",Space,Str "table",Space,Str "syntax."]
57+,Para [Str "Multiline",Space,Str "table",Space,Str "with",Space,Str "caption:"]
5858,Table [] [AlignDefault,AlignDefault,AlignDefault,AlignDefault] [0.175,0.1625,0.1875,0.3625]
5959 [[Plain [Str "Centered",Space,Str "Header"]]
6060 ,[Plain [Str "Left",Space,Str "Aligned"]]
@@ -62,14 +62,14 @@
6262 ,[Plain [Str "Default",Space,Str "aligned"]]]
6363 [[[Plain [Str "First"]]
6464 ,[Plain [Str "row"]]
65− ,[Plain [Str "12",Str ".",Str "0"]]
66− ,[Plain [Str "Example",Space,Str "of",Space,Str "a",Space,Str "row",Space,Str "that",Space,Str "spans",Space,Str "multiple",Space,Str "lines",Str "."]]]
65+ ,[Plain [Str "12.0"]]
66+ ,[Plain [Str "Example",Space,Str "of",Space,Str "a",Space,Str "row",Space,Str "that",Space,Str "spans",Space,Str "multiple",Space,Str "lines."]]]
6767 ,[[Plain [Str "Second"]]
6868 ,[Plain [Str "row"]]
69− ,[Plain [Str "5",Str ".",Str "0"]]
70− ,[Plain [Str "Here",Str "'",Str "s",Space,Str "another",Space,Str "one",Str ".",Space,Str "Note",Space,Str "the",Space,Str "blank",Space,Str "line",Space,Str "between",Space,Str "rows",Str "."]]]]
71−,Para [Str "Table",Str ":",Space,Str "Here",Str "'",Str "s",Space,Str "the",Space,Str "caption",Str ".",Space,Str "It",Space,Str "may",Space,Str "span",Space,Str "multiple",Space,Str "lines",Str "."]
72−,Para [Str "Multiline",Space,Str "table",Space,Str "without",Space,Str "caption",Str ":"]
69+ ,[Plain [Str "5.0"]]
70+ ,[Plain [Str "Here's",Space,Str "another",Space,Str "one.",Space,Str "Note",Space,Str "the",Space,Str "blank",Space,Str "line",Space,Str "between",Space,Str "rows."]]]]
71+,Para [Str "Table:",Space,Str "Here's",Space,Str "the",Space,Str "caption.",Space,Str "It",Space,Str "may",Space,Str "span",Space,Str "multiple",Space,Str "lines."]
72+,Para [Str "Multiline",Space,Str "table",Space,Str "without",Space,Str "caption:"]
7373,Table [] [AlignDefault,AlignDefault,AlignDefault,AlignDefault] [0.175,0.1625,0.1875,0.3625]
7474 [[Plain [Str "Centered",Space,Str "Header"]]
7575 ,[Plain [Str "Left",Space,Str "Aligned"]]
@@ -77,13 +77,13 @@
7777 ,[Plain [Str "Default",Space,Str "aligned"]]]
7878 [[[Plain [Str "First"]]
7979 ,[Plain [Str "row"]]
80− ,[Plain [Str "12",Str ".",Str "0"]]
81− ,[Plain [Str "Example",Space,Str "of",Space,Str "a",Space,Str "row",Space,Str "that",Space,Str "spans",Space,Str "multiple",Space,Str "lines",Str "."]]]
80+ ,[Plain [Str "12.0"]]
81+ ,[Plain [Str "Example",Space,Str "of",Space,Str "a",Space,Str "row",Space,Str "that",Space,Str "spans",Space,Str "multiple",Space,Str "lines."]]]
8282 ,[[Plain [Str "Second"]]
8383 ,[Plain [Str "row"]]
84− ,[Plain [Str "5",Str ".",Str "0"]]
85− ,[Plain [Str "Here",Str "'",Str "s",Space,Str "another",Space,Str "one",Str ".",Space,Str "Note",Space,Str "the",Space,Str "blank",Space,Str "line",Space,Str "between",Space,Str "rows",Str "."]]]]
86−,Para [Str "Table",Space,Str "without",Space,Str "column",Space,Str "headers",Str ":"]
84+ ,[Plain [Str "5.0"]]
85+ ,[Plain [Str "Here's",Space,Str "another",Space,Str "one.",Space,Str "Note",Space,Str "the",Space,Str "blank",Space,Str "line",Space,Str "between",Space,Str "rows."]]]]
86+,Para [Str "Table",Space,Str "without",Space,Str "column",Space,Str "headers:"]
8787,Table [] [AlignDefault,AlignDefault,AlignDefault,AlignDefault] [0.1,0.1,0.1,0.1]
8888 [[]
8989 ,[]
@@ -101,7 +101,7 @@
101101 ,[Plain [Str "1"]]
102102 ,[Plain [Str "1"]]
103103 ,[Plain [Str "1"]]]]
104−,Para [Str "Multiline",Space,Str "table",Space,Str "without",Space,Str "column",Space,Str "headers",Str ":"]
104+,Para [Str "Multiline",Space,Str "table",Space,Str "without",Space,Str "column",Space,Str "headers:"]
105105,Table [] [AlignDefault,AlignDefault,AlignDefault,AlignDefault] [0.175,0.1625,0.1875,0.3625]
106106 [[]
107107 ,[]
@@ -109,9 +109,9 @@
109109 ,[]]
110110 [[[Plain [Str "First"]]
111111 ,[Plain [Str "row"]]
112− ,[Plain [Str "12",Str ".",Str "0"]]
113− ,[Plain [Str "Example",Space,Str "of",Space,Str "a",Space,Str "row",Space,Str "that",Space,Str "spans",Space,Str "multiple",Space,Str "lines",Str "."]]]
112+ ,[Plain [Str "12.0"]]
113+ ,[Plain [Str "Example",Space,Str "of",Space,Str "a",Space,Str "row",Space,Str "that",Space,Str "spans",Space,Str "multiple",Space,Str "lines."]]]
114114 ,[[Plain [Str "Second"]]
115115 ,[Plain [Str "row"]]
116− ,[Plain [Str "5",Str ".",Str "0"]]
117− ,[Plain [Str "Here",Str "'",Str "s",Space,Str "another",Space,Str "one",Str ".",Space,Str "Note",Space,Str "the",Space,Str "blank",Space,Str "line",Space,Str "between",Space,Str "rows",Str "."]]]]]
116+ ,[Plain [Str "5.0"]]
117+ ,[Plain [Str "Here's",Space,Str "another",Space,Str "one.",Space,Str "Note",Space,Str "the",Space,Str "blank",Space,Str "line",Space,Str "between",Space,Str "rows."]]]]]