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:
parent
0fbb676c81
commit
13280a8112
2 changed files with 18 additions and 1 deletions
|
@ -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"
|
||||
|
|
|
@ -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."
|
||||
|
|
Loading…
Reference in a new issue