diff options
-rw-r--r-- | src/Text/Pandoc/Readers/Org/Blocks.hs | 11 | ||||
-rw-r--r-- | tests/Tests/Readers/Org.hs | 8 |
2 files changed, 18 insertions, 1 deletions
diff --git a/src/Text/Pandoc/Readers/Org/Blocks.hs b/src/Text/Pandoc/Readers/Org/Blocks.hs index 80895e038..6a8bb8b28 100644 --- a/src/Text/Pandoc/Readers/Org/Blocks.hs +++ b/src/Text/Pandoc/Readers/Org/Blocks.hs @@ -422,7 +422,16 @@ verseBlock blockType = try $ do ignHeaders content <- rawBlockContent blockType fmap B.para . mconcat . intersperse (pure B.linebreak) - <$> mapM (parseFromString inlines) (map (++ "\n") . lines $ content) + <$> mapM parseVerseLine (lines content) + where + -- replace initial spaces with nonbreaking spaces to preserve + -- indentation, parse the rest as normal inline + parseVerseLine :: String -> OrgParser (F Inlines) + parseVerseLine cs = do + let (initialSpaces, indentedLine) = span isSpace cs + let nbspIndent = B.str $ map (const '\160') initialSpaces + line <- parseFromString inlines (indentedLine ++ "\n") + return (pure nbspIndent <> line) -- | Read a code block and the associated results block if present. Which of -- boths blocks is included in the output is determined using the "exports" diff --git a/tests/Tests/Readers/Org.hs b/tests/Tests/Readers/Org.hs index 75d70a8bc..0a3f9c222 100644 --- a/tests/Tests/Readers/Org.hs +++ b/tests/Tests/Readers/Org.hs @@ -1440,6 +1440,14 @@ tests = ] =?> para ("foo" <> linebreak <> linebreak <> "bar") + , "Verse block with varying indentation" =: + unlines [ "#+BEGIN_VERSE" + , " hello darkness" + , "my old friend" + , "#+END_VERSE" + ] =?> + para ("\160\160hello darkness" <> linebreak <> "my old friend") + , "Raw block LaTeX" =: unlines [ "#+BEGIN_LaTeX" , "The category $\\cat{Set}$ is adhesive." |