git.iko.soy/typeable/pandoc
on master help sign in
Parse line-oriented markup as LineBlock
c9460e7Albert Krewinkel
src/Text/Pandoc/Readers/DocBook.hs+3−3
@@ -592,8 +592,6 @@ checkInMeta p = do
592 when accepts p
592 when accepts p
593 return mempty
593 return mempty
594
594
595−
596−
597addMeta :: ToMetaValue a => String -> a -> DB ()
595addMeta :: ToMetaValue a => String -> a -> DB ()
598addMeta field val = modify (setMeta field val)
596addMeta field val = modify (setMeta field val)
599
597
@@ -612,7 +610,7 @@ isBlockElement (Elem e) = qName (elName e) `elem` blocktags
612 "important","caution","note","tip","warning","qandadiv",
610 "important","caution","note","tip","warning","qandadiv",
613 "question","answer","abstract","itemizedlist","orderedlist",
611 "question","answer","abstract","itemizedlist","orderedlist",
614 "variablelist","article","book","table","informaltable",
612 "variablelist","article","book","table","informaltable",
615− "informalexample",
613+ "informalexample", "linegroup",
616 "screen","programlisting","example","calloutlist"]
614 "screen","programlisting","example","calloutlist"]
617isBlockElement _ = False
615isBlockElement _ = False
618
616
@@ -779,6 +777,7 @@ parseBlock (Elem e) =
779 "informaltable" -> parseTable
777 "informaltable" -> parseTable
780 "informalexample" -> divWith ("", ["informalexample"], []) <$>
778 "informalexample" -> divWith ("", ["informalexample"], []) <$>
781 getBlocks e
779 getBlocks e
780+ "linegroup" -> lineBlock <$> lineItems
782 "literallayout" -> codeBlockWithLang
781 "literallayout" -> codeBlockWithLang
783 "screen" -> codeBlockWithLang
782 "screen" -> codeBlockWithLang
784 "programlisting" -> codeBlockWithLang
783 "programlisting" -> codeBlockWithLang
@@ -900,6 +899,7 @@ parseBlock (Elem e) =
900 let ident = attrValue "id" e
899 let ident = attrValue "id" e
901 modify $ \st -> st{ dbSectionLevel = n - 1 }
900 modify $ \st -> st{ dbSectionLevel = n - 1 }
902 return $ headerWith (ident,[],[]) n' headerText <> b
901 return $ headerWith (ident,[],[]) n' headerText <> b
902+ lineItems = mapM getInlines $ filterChildren (named "line") e
903 metaBlock = acceptingMetadata (getBlocks e) >> return mempty
903 metaBlock = acceptingMetadata (getBlocks e) >> return mempty
904
904
905getInlines :: Element -> DB Inlines
905getInlines :: Element -> DB Inlines
src/Text/Pandoc/Readers/Markdown.hs+2−2
@@ -32,7 +32,7 @@ Conversion of markdown-formatted plain text to 'Pandoc' document.
32module Text.Pandoc.Readers.Markdown ( readMarkdown,
32module Text.Pandoc.Readers.Markdown ( readMarkdown,
33 readMarkdownWithWarnings ) where
33 readMarkdownWithWarnings ) where
34
34
35−import Data.List ( transpose, sortBy, findIndex, intersperse, intercalate )
35+import Data.List ( transpose, sortBy, findIndex, intercalate )
36import qualified Data.Map as M
36import qualified Data.Map as M
37import Data.Scientific (coefficient, base10Exponent)
37import Data.Scientific (coefficient, base10Exponent)
38import Data.Ord ( comparing )
38import Data.Ord ( comparing )
@@ -1106,7 +1106,7 @@ lineBlock = try $ do
1106 guardEnabled Ext_line_blocks
1106 guardEnabled Ext_line_blocks
1107 lines' <- lineBlockLines >>=
1107 lines' <- lineBlockLines >>=
1108 mapM (parseFromString (trimInlinesF . mconcat <$> many inline))
1108 mapM (parseFromString (trimInlinesF . mconcat <$> many inline))
1109− return $ B.para <$> (mconcat $ intersperse (return B.linebreak) lines')
1109+ return $ B.lineBlock <$> sequence lines'
1110
1110
1111--
1111--
1112-- Tables
1112-- Tables
src/Text/Pandoc/Readers/Org/Blocks.hs+2−2
@@ -50,7 +50,7 @@ import Text.Pandoc.Shared ( compactify', compactify'DL )
50
50
51import Control.Monad ( foldM, guard, mzero, void )
51import Control.Monad ( foldM, guard, mzero, void )
52import Data.Char ( isSpace, toLower, toUpper)
52import Data.Char ( isSpace, toLower, toUpper)
53−import Data.List ( foldl', intersperse, isPrefixOf )
53+import Data.List ( foldl', isPrefixOf )
54import Data.Maybe ( fromMaybe, isNothing )
54import Data.Maybe ( fromMaybe, isNothing )
55import Data.Monoid ((<>))
55import Data.Monoid ((<>))
56
56
@@ -427,7 +427,7 @@ verseBlock :: String -> OrgParser (F Blocks)
427verseBlock blockType = try $ do
427verseBlock blockType = try $ do
428 ignHeaders
428 ignHeaders
429 content <- rawBlockContent blockType
429 content <- rawBlockContent blockType
430− fmap B.para . mconcat . intersperse (pure B.linebreak)
430+ fmap B.lineBlock . sequence
431 <$> mapM parseVerseLine (lines content)
431 <$> mapM parseVerseLine (lines content)
432 where
432 where
433 -- replace initial spaces with nonbreaking spaces to preserve
433 -- replace initial spaces with nonbreaking spaces to preserve
src/Text/Pandoc/Readers/RST.hs+2−2
@@ -39,7 +39,7 @@ import Text.Pandoc.Shared
39import Text.Pandoc.Parsing
39import Text.Pandoc.Parsing
40import Text.Pandoc.Options
40import Text.Pandoc.Options
41import Control.Monad ( when, liftM, guard, mzero )
41import Control.Monad ( when, liftM, guard, mzero )
42−import Data.List ( findIndex, intersperse, intercalate,
42+import Data.List ( findIndex, intercalate,
43 transpose, sort, deleteFirstsBy, isSuffixOf , nub, union)
43 transpose, sort, deleteFirstsBy, isSuffixOf , nub, union)
44import Data.Maybe (fromMaybe)
44import Data.Maybe (fromMaybe)
45import qualified Data.Map as M
45import qualified Data.Map as M
@@ -228,7 +228,7 @@ lineBlock :: RSTParser Blocks
228lineBlock = try $ do
228lineBlock = try $ do
229 lines' <- lineBlockLines
229 lines' <- lineBlockLines
230 lines'' <- mapM parseInlineFromString lines'
230 lines'' <- mapM parseInlineFromString lines'
231− return $ B.para (mconcat $ intersperse B.linebreak lines'')
231+ return $ B.lineBlock lines''
232
232
233--
233--
234-- paragraph block
234-- paragraph block
tests/Tests/Readers/Org.hs+7−10
@@ -1490,14 +1490,11 @@ tests =
1490 mconcat
1490 mconcat
1491 [ para $ spcSep [ "The", "first", "lines", "of"
1491 [ para $ spcSep [ "The", "first", "lines", "of"
1492 , "Goethe's", emph "Faust" <> ":"]
1492 , "Goethe's", emph "Faust" <> ":"]
1493− , para $ mconcat
1493+ , lineBlock
1494− [ spcSep [ "Habe", "nun,", "ach!", "Philosophie," ]
1494+ [ "Habe nun, ach! Philosophie,"
1495− , linebreak
1496− , spcSep [ "Juristerei", "und", "Medizin," ]
1495+ , "Juristerei und Medizin,"
1497− , linebreak
1498− , spcSep [ "Und", "leider", "auch", "Theologie!" ]
1496+ , "Und leider auch Theologie!"
1499− , linebreak
1500− , spcSep [ "Durchaus", "studiert,", "mit", "heißem", "Bemühn." ]
1497+ , "Durchaus studiert, mit heißem Bemühn."
1501 ]
1498 ]
1502 ]
1499 ]
1503
1500
@@ -1508,7 +1505,7 @@ tests =
1508 , "bar"
1505 , "bar"
1509 , "#+END_VERSE"
1506 , "#+END_VERSE"
1510 ] =?>
1507 ] =?>
1511− para ("foo" <> linebreak <> linebreak <> "bar")
1508+ lineBlock [ "foo", mempty, "bar" ]
1512
1509
1513 , "Verse block with varying indentation" =:
1510 , "Verse block with varying indentation" =:
1514 unlines [ "#+BEGIN_VERSE"
1511 unlines [ "#+BEGIN_VERSE"
@@ -1516,7 +1513,7 @@ tests =
1516 , "my old friend"
1513 , "my old friend"
1517 , "#+END_VERSE"
1514 , "#+END_VERSE"
1518 ] =?>
1515 ] =?>
1519− para ("\160\160hello darkness" <> linebreak <> "my old friend")
1516+ lineBlock [ "\160\160hello darkness", "my old friend" ]
1520
1517
1521 , "Raw block LaTeX" =:
1518 , "Raw block LaTeX" =:
1522 unlines [ "#+BEGIN_LaTeX"
1519 unlines [ "#+BEGIN_LaTeX"
tests/Tests/Readers/RST.hs+2−3
@@ -19,8 +19,7 @@ infix 4 =:
19
19
20tests :: [Test]
20tests :: [Test]
21tests = [ "line block with blank line" =:
21tests = [ "line block with blank line" =:
22− "| a\n|\n| b" =?> para (str "a") <>
22+ "| a\n|\n| b" =?> lineBlock [ "a", mempty, "\160b" ]
23− para (str "\160b")
24 , testGroup "field list"
23 , testGroup "field list"
25 [ "general" =: unlines
24 [ "general" =: unlines
26 [ "para"
25 [ "para"
@@ -135,7 +134,7 @@ tests = [ "line block with blank line" =:
135 codeBlock "block quotes\n\ncan go on for many lines" <>
134 codeBlock "block quotes\n\ncan go on for many lines" <>
136 para "but must stop here")
135 para "but must stop here")
137 , "line block with 3 lines" =: "| a\n| b\n| c"
136 , "line block with 3 lines" =: "| a\n| b\n| c"
138− =?> para ("a" <> linebreak <> "b" <> linebreak <> "c")
137+ =?> lineBlock ["a", "b", "c"]
139 , "quoted literal block using >" =: "::\n\n> quoted\n> block\n\nOrdinary paragraph"
138 , "quoted literal block using >" =: "::\n\n> quoted\n> block\n\nOrdinary paragraph"
140 =?> codeBlock "> quoted\n> block" <> para "Ordinary paragraph"
139 =?> codeBlock "> quoted\n> block" <> para "Ordinary paragraph"
141 , "quoted literal block using | (not a line block)" =: "::\n\n| quoted\n| block\n\nOrdinary paragraph"
140 , "quoted literal block using | (not a line block)" =: "::\n\n| quoted\n| block\n\nOrdinary paragraph"
tests/markdown-reader-more.native+8−2
@@ -84,8 +84,14 @@ Pandoc (Meta {unMeta = fromList [("author",MetaList [MetaInlines [Str "Author",S
84,BlockQuote
84,BlockQuote
85 [Header 2 ("foobar",["baz"],[("key","val")]) [Str "Header",Space,Str "attributes",Space,Str "inside",Space,Str "block",Space,Str "quote"]]
85 [Header 2 ("foobar",["baz"],[("key","val")]) [Str "Header",Space,Str "attributes",Space,Str "inside",Space,Str "block",Space,Str "quote"]]
86,Header 2 ("line-blocks",[],[]) [Str "Line",Space,Str "blocks"]
86,Header 2 ("line-blocks",[],[]) [Str "Line",Space,Str "blocks"]
87+,LineBlock
88+ [[Str "But",Space,Str "can",Space,Str "a",Space,Str "bee",Space,Str "be",Space,Str "said",Space,Str "to",Space,Str "be"]
89+ ,[Str "\160\160\160\160or",Space,Str "not",Space,Str "to",Space,Str "be",Space,Str "an",Space,Str "entire",Space,Str "bee,"]
87−,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 "\160\160\160\160or",Space,Str "not",Space,Str "to",Space,Str "be",Space,Str "an",Space,Str "entire",Space,Str "bee,",LineBreak,Str "\160\160\160\160\160\160\160\160when",Space,Str "half",Space,Str "the",Space,Str "bee",Space,Str "is",Space,Str "not",Space,Str "a",Space,Str "bee,",LineBreak,Str "\160\160\160\160\160\160\160\160\160\160\160\160due",Space,Str "to",Space,Str "some",Space,Str "ancient",Space,Str "injury?"]
90+ ,[Str "\160\160\160\160\160\160\160\160when",Space,Str "half",Space,Str "the",Space,Str "bee",Space,Str "is",Space,Str "not",Space,Str "a",Space,Str "bee,"]
91+ ,[Str "\160\160\160\160\160\160\160\160\160\160\160\160due",Space,Str "to",Space,Str "some",Space,Str "ancient",Space,Str "injury?"]
92+ ,[]
88−,Para [Str "Continuation",Space,Str "line",LineBreak,Str "\160\160and",Space,Str "another"]
93+ ,[Str "Continuation",Space,Str "line"]
94+ ,[Str "\160\160and",Space,Str "another"]]
89,Header 2 ("grid-tables",[],[]) [Str "Grid",Space,Str "Tables"]
95,Header 2 ("grid-tables",[],[]) [Str "Grid",Space,Str "Tables"]
90,Table [] [AlignDefault,AlignDefault,AlignDefault] [0.2638888888888889,0.16666666666666666,0.18055555555555555]
96,Table [] [AlignDefault,AlignDefault,AlignDefault] [0.2638888888888889,0.16666666666666666,0.18055555555555555]
91 [[Plain [Str "col",Space,Str "1"]]
97 [[Plain [Str "col",Space,Str "1"]]
tests/rst-reader.native+8−2
@@ -230,8 +230,14 @@ Pandoc (Meta {unMeta = fromList [("author",MetaList [MetaInlines [Str "John",Spa
230,Para [Str "Another",Space,Str "paragraph"]
230,Para [Str "Another",Space,Str "paragraph"]
231,Para [Str "A",Space,Str "third",Space,Str "paragraph"]
231,Para [Str "A",Space,Str "third",Space,Str "paragraph"]
232,Header 1 ("line-blocks",[],[]) [Str "Line",Space,Str "blocks"]
232,Header 1 ("line-blocks",[],[]) [Str "Line",Space,Str "blocks"]
233+,LineBlock
234+ [[Str "But",Space,Str "can",Space,Str "a",Space,Str "bee",Space,Str "be",Space,Str "said",Space,Str "to",Space,Str "be"]
235+ ,[Str "\160\160\160\160or",Space,Str "not",Space,Str "to",Space,Str "be",Space,Str "an",Space,Str "entire",Space,Str "bee,"]
233−,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 "\160\160\160\160or",Space,Str "not",Space,Str "to",Space,Str "be",Space,Str "an",Space,Str "entire",Space,Str "bee,",LineBreak,Str "\160\160\160\160\160\160\160\160when",Space,Str "half",Space,Str "the",Space,Str "bee",Space,Str "is",Space,Str "not",Space,Str "a",Space,Str "bee,",LineBreak,Str "\160\160\160\160\160\160\160\160\160\160\160\160due",Space,Str "to",Space,Str "some",Space,Str "ancient",Space,Str "injury?"]
236+ ,[Str "\160\160\160\160\160\160\160\160when",Space,Str "half",Space,Str "the",Space,Str "bee",Space,Str "is",Space,Str "not",Space,Str "a",Space,Str "bee,"]
237+ ,[Str "\160\160\160\160\160\160\160\160\160\160\160\160due",Space,Str "to",Space,Str "some",Space,Str "ancient",Space,Str "injury?"]
238+ ,[]
234−,Para [Str "Continuation",Space,Str "line",LineBreak,Str "\160\160and",Space,Str "another"]
239+ ,[Str "Continuation",Space,Str "line"]
240+ ,[Str "\160\160and",Space,Str "another"]]
235,Header 1 ("simple-tables",[],[]) [Str "Simple",Space,Str "Tables"]
241,Header 1 ("simple-tables",[],[]) [Str "Simple",Space,Str "Tables"]
236,Table [] [AlignDefault,AlignDefault,AlignDefault] [0.0,0.0,0.0]
242,Table [] [AlignDefault,AlignDefault,AlignDefault] [0.0,0.0,0.0]
237 [[Plain [Str "col",Space,Str "1"]]
243 [[Plain [Str "col",Space,Str "1"]]