Org reader: preserve indentation of verse lines

Leading spaces in verse lines are converted to non-breaking spaces, so
indentation is preserved.

This fixes #3064.
This commit is contained in:
Albert Krewinkel 2016-08-08 09:40:50 +02:00
parent 0fbb676c81
commit 13280a8112
2 changed files with 18 additions and 1 deletions

View file

@ -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"

View file

@ -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."