aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Krotov <ilabdsf@gmail.com>2018-03-31 22:44:24 +0300
committerAlexander Krotov <ilabdsf@gmail.com>2018-03-31 23:40:31 +0300
commitbdb84246970151dd9bbb7a0713e36707488f9d97 (patch)
tree66d0a763e546512de3986e2a379fe187c8b0ec03
parentb9602766d8a3d6c8ed31c67f49cefa8bd1a6871a (diff)
downloadpandoc-bdb84246970151dd9bbb7a0713e36707488f9d97.tar.gz
Muse writer: do not escape list markers unless preceded by space
-rw-r--r--src/Text/Pandoc/Writers/Muse.hs54
-rw-r--r--test/Tests/Writers/Muse.hs1
-rw-r--r--test/writer.muse4
3 files changed, 37 insertions, 22 deletions
diff --git a/src/Text/Pandoc/Writers/Muse.hs b/src/Text/Pandoc/Writers/Muse.hs
index b03ce8f90..44224122e 100644
--- a/src/Text/Pandoc/Writers/Muse.hs
+++ b/src/Text/Pandoc/Writers/Muse.hs
@@ -70,6 +70,8 @@ data WriterEnv =
WriterEnv { envOptions :: WriterOptions
, envTopLevel :: Bool
, envInsideBlock :: Bool
+ , envInlineStart :: Bool
+ , envAfterSpace :: Bool
}
data WriterState =
@@ -95,6 +97,8 @@ writeMuse opts document =
where env = WriterEnv { envOptions = opts
, envTopLevel = True
, envInsideBlock = False
+ , envInlineStart = True
+ , envAfterSpace = True
}
-- | Return Muse representation of document.
@@ -371,29 +375,36 @@ urlEscapeBrackets (']':xs) = '%':'5':'D':urlEscapeBrackets xs
urlEscapeBrackets (x:xs) = x:urlEscapeBrackets xs
urlEscapeBrackets [] = []
-fixOrEscape :: Inline -> Bool
-fixOrEscape (Str "-") = True -- TODO: " - " should be escaped too
-fixOrEscape (Str ";") = True
-fixOrEscape (Str s) = startsWithMarker isDigit s ||
- startsWithMarker isAsciiLower s ||
- startsWithMarker isAsciiUpper s
-fixOrEscape Space = True
-fixOrEscape SoftBreak = True
-fixOrEscape _ = False
+fixOrEscape :: Bool -> Inline -> Bool
+fixOrEscape sp (Str "-") = sp
+fixOrEscape sp (Str ";") = not sp
+fixOrEscape sp (Str s) = sp && (startsWithMarker isDigit s ||
+ startsWithMarker isAsciiLower s ||
+ startsWithMarker isAsciiUpper s)
+fixOrEscape _ Space = True
+fixOrEscape _ SoftBreak = True
+fixOrEscape _ _ = False
-- | Convert list of Pandoc inline elements to Muse
renderInlineList :: PandocMonad m
- => Bool
- -> [Inline]
+ => [Inline]
-> Muse m Doc
-renderInlineList True [] = pure "<verbatim></verbatim>"
-renderInlineList False [] = pure ""
-renderInlineList start (x:xs) = do r <- inlineToMuse x
- opts <- asks envOptions
- lst' <- renderInlineList ((x == SoftBreak && writerWrapText opts == WrapPreserve) || x == LineBreak) xs
- if start && fixOrEscape x
- then pure (text "<verbatim></verbatim>" <> r <> lst')
- else pure (r <> lst')
+renderInlineList [] = do
+ start <- asks envInlineStart
+ pure $ if start then "<verbatim></verbatim>" else ""
+renderInlineList (x:xs) = do
+ start <- asks envInlineStart
+ afterSpace <- asks envAfterSpace
+ topLevel <- asks envTopLevel
+ r <- inlineToMuse x
+ opts <- asks envOptions
+ let isNewline = (x == SoftBreak && writerWrapText opts == WrapPreserve) || x == LineBreak
+ lst' <- local (\env -> env { envInlineStart = isNewline
+ , envAfterSpace = (x == Space || (not topLevel && isNewline))
+ }) $ renderInlineList xs
+ if start && fixOrEscape afterSpace x
+ then pure (text "<verbatim></verbatim>" <> r <> lst')
+ else pure (r <> lst')
-- | Normalize and convert list of Pandoc inline elements to Muse.
inlineListToMuse'' :: PandocMonad m
@@ -402,7 +413,10 @@ inlineListToMuse'' :: PandocMonad m
-> Muse m Doc
inlineListToMuse'' start lst = do
lst' <- (normalizeInlineList . fixNotes) <$> preprocessInlineList (map (removeKeyValues . replaceSmallCaps) lst)
- renderInlineList start lst'
+ topLevel <- asks envTopLevel
+ local (\env -> env { envInlineStart = start
+ , envAfterSpace = start && not topLevel
+ }) $ renderInlineList lst'
inlineListToMuse' :: PandocMonad m => [Inline] -> Muse m Doc
inlineListToMuse' = inlineListToMuse'' True
diff --git a/test/Tests/Writers/Muse.hs b/test/Tests/Writers/Muse.hs
index c1bec1ba2..88d2db8cf 100644
--- a/test/Tests/Writers/Muse.hs
+++ b/test/Tests/Writers/Muse.hs
@@ -324,6 +324,7 @@ tests = [ testGroup "block elements"
, "escape ; to avoid accidental comments" =: text "; foo" =?> "<verbatim></verbatim>; foo"
, "escape ; after softbreak" =: text "foo" <> softbreak <> text "; bar" =?> "foo\n<verbatim></verbatim>; bar"
, "escape ; after linebreak" =: text "foo" <> linebreak <> text "; bar" =?> "foo<br>\n<verbatim></verbatim>; bar"
+ , "do not escape ; inside paragraph" =: text "foo ; bar" =?> "foo ; bar"
]
, testGroup "emphasis"
[ "emph" =: emph (text "foo") =?> "<em>foo</em>"
diff --git a/test/writer.muse b/test/writer.muse
index abb6b63fe..c534b63b3 100644
--- a/test/writer.muse
+++ b/test/writer.muse
@@ -42,7 +42,7 @@ item.
Here’s one with a bullet. <verbatim>*</verbatim> criminey.
There should be a hard line break<br>
-<verbatim></verbatim>here.
+here.
----
@@ -245,7 +245,7 @@ Should not be a list item:
M.A. 2007
-<verbatim></verbatim>B. Williams
+B. Williams
----