From bdb84246970151dd9bbb7a0713e36707488f9d97 Mon Sep 17 00:00:00 2001 From: Alexander Krotov Date: Sat, 31 Mar 2018 22:44:24 +0300 Subject: Muse writer: do not escape list markers unless preceded by space --- src/Text/Pandoc/Writers/Muse.hs | 54 ++++++++++++++++++++++++++--------------- test/Tests/Writers/Muse.hs | 1 + test/writer.muse | 4 +-- 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 "" -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 "" <> r <> lst') - else pure (r <> lst') +renderInlineList [] = do + start <- asks envInlineStart + pure $ if start then "" 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 "" <> 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" =?> "; foo" , "escape ; after softbreak" =: text "foo" <> softbreak <> text "; bar" =?> "foo\n; bar" , "escape ; after linebreak" =: text "foo" <> linebreak <> text "; bar" =?> "foo
\n; bar" + , "do not escape ; inside paragraph" =: text "foo ; bar" =?> "foo ; bar" ] , testGroup "emphasis" [ "emph" =: emph (text "foo") =?> "foo" 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. * criminey. There should be a hard line break
-here. +here. ---- @@ -245,7 +245,7 @@ Should not be a list item: M.A. 2007 -B. Williams +B. Williams ---- -- cgit v1.2.3