@@ -70,6 +70,8 @@ data WriterEnv =
7070 WriterEnv { envOptions :: WriterOptions
7171 , envTopLevel :: Bool
7272 , envInsideBlock :: Bool
73+ , envInlineStart :: Bool
74+ , envAfterSpace :: Bool
7375 }
7476
7577data WriterState =
@@ -95,6 +97,8 @@ writeMuse opts document =
9597 where env = WriterEnv { envOptions = opts
9698 , envTopLevel = True
9799 , envInsideBlock = False
100+ , envInlineStart = True
101+ , envAfterSpace = True
98102 }
99103
100104-- | Return Muse representation of document.
@@ -371,29 +375,36 @@ urlEscapeBrackets (']':xs) = '%':'5':'D':urlEscapeBrackets xs
371375urlEscapeBrackets (x:xs) = x:urlEscapeBrackets xs
372376urlEscapeBrackets [] = []
373377
374−fixOrEscape :: Inline -> Bool
375−fixOrEscape (Str "-") = True -- TODO: " - " should be escaped too
376−fixOrEscape (Str ";") = True
377−fixOrEscape (Str s) = startsWithMarker isDigit s ||
378− startsWithMarker isAsciiLower s ||
379− startsWithMarker isAsciiUpper s
380−fixOrEscape Space = True
381−fixOrEscape SoftBreak = True
382−fixOrEscape _ = False
378+fixOrEscape :: Bool -> Inline -> Bool
379+fixOrEscape sp (Str "-") = sp
380+fixOrEscape sp (Str ";") = not sp
381+fixOrEscape sp (Str s) = sp && (startsWithMarker isDigit s ||
382+ startsWithMarker isAsciiLower s ||
383+ startsWithMarker isAsciiUpper s)
384+fixOrEscape _ Space = True
385+fixOrEscape _ SoftBreak = True
386+fixOrEscape _ _ = False
383387
384388-- | Convert list of Pandoc inline elements to Muse
385389renderInlineList :: PandocMonad m
386− => Bool
387− -> [Inline]
390+ => [Inline]
388391 -> Muse m Doc
389−renderInlineList True [] = pure "<verbatim></verbatim>"
390−renderInlineList False [] = pure ""
391−renderInlineList start (x:xs) = do r <- inlineToMuse x
392− opts <- asks envOptions
393− lst' <- renderInlineList ((x == SoftBreak && writerWrapText opts == WrapPreserve) || x == LineBreak) xs
394− if start && fixOrEscape x
395− then pure (text "<verbatim></verbatim>" <> r <> lst')
396− else pure (r <> lst')
392+renderInlineList [] = do
393+ start <- asks envInlineStart
394+ pure $ if start then "<verbatim></verbatim>" else ""
395+renderInlineList (x:xs) = do
396+ start <- asks envInlineStart
397+ afterSpace <- asks envAfterSpace
398+ topLevel <- asks envTopLevel
399+ r <- inlineToMuse x
400+ opts <- asks envOptions
401+ let isNewline = (x == SoftBreak && writerWrapText opts == WrapPreserve) || x == LineBreak
402+ lst' <- local (\env -> env { envInlineStart = isNewline
403+ , envAfterSpace = (x == Space || (not topLevel && isNewline))
404+ }) $ renderInlineList xs
405+ if start && fixOrEscape afterSpace x
406+ then pure (text "<verbatim></verbatim>" <> r <> lst')
407+ else pure (r <> lst')
397408
398409-- | Normalize and convert list of Pandoc inline elements to Muse.
399410inlineListToMuse'' :: PandocMonad m
@@ -402,7 +413,10 @@ inlineListToMuse'' :: PandocMonad m
402413 -> Muse m Doc
403414inlineListToMuse'' start lst = do
404415 lst' <- (normalizeInlineList . fixNotes) <$> preprocessInlineList (map (removeKeyValues . replaceSmallCaps) lst)
405− renderInlineList start lst'
416+ topLevel <- asks envTopLevel
417+ local (\env -> env { envInlineStart = start
418+ , envAfterSpace = start && not topLevel
419+ }) $ renderInlineList lst'
406420
407421inlineListToMuse' :: PandocMonad m => [Inline] -> Muse m Doc
408422inlineListToMuse' = inlineListToMuse'' True