git.iko.soy/typeable/pandoc
on master help sign in
Muse writer: do not escape list markers unless preceded by space
commitbdb84246970151dd9bbb7a0713e36707488f9d97 authorAlexander Krotov <ilabdsf@gmail.com> dateSat 31 Mar 2018, 22:44 (9 years ago) parentb960276
3 files changed+37−22
src/Text/Pandoc/Writers/Muse.hs+34−20 test/Tests/Writers/Muse.hs+1 test/writer.muse+2−2
src/Text/Pandoc/Writers/Muse.hs+34−20
@@ -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
test/Tests/Writers/Muse.hs+1
@@ -324,6 +324,7 @@ tests = [ testGroup "block elements"
324324 , "escape ; to avoid accidental comments" =: text "; foo" =?> "<verbatim></verbatim>; foo"
325325 , "escape ; after softbreak" =: text "foo" <> softbreak <> text "; bar" =?> "foo\n<verbatim></verbatim>; bar"
326326 , "escape ; after linebreak" =: text "foo" <> linebreak <> text "; bar" =?> "foo<br>\n<verbatim></verbatim>; bar"
327+ , "do not escape ; inside paragraph" =: text "foo ; bar" =?> "foo ; bar"
327328 ]
328329 , testGroup "emphasis"
329330 [ "emph" =: emph (text "foo") =?> "<em>foo</em>"
test/writer.muse+2−2
@@ -42,7 +42,7 @@ item.
4242Here’s one with a bullet. <verbatim>*</verbatim> criminey.
4343
4444There should be a hard line break<br>
45−<verbatim></verbatim>here.
45+here.
4646
4747----
4848
@@ -245,7 +245,7 @@ Should not be a list item:
245245
246246M.A. 2007
247247
248−<verbatim></verbatim>B. Williams
248+B. Williams
249249
250250----
251251