git.iko.soy/typeable/pandoc
on master help sign in
CommonMark reader: support `emoji` extension.
714d8a6John MacFarlane
src/Text/Pandoc/Readers/CommonMark.hs+19−1
@@ -40,9 +40,10 @@ import Data.Text (Text, unpack)
40import qualified Data.Map as Map
40import qualified Data.Map as Map
41import Text.Pandoc.Class (PandocMonad)
41import Text.Pandoc.Class (PandocMonad)
42import Text.Pandoc.Definition
42import Text.Pandoc.Definition
43+import Text.Pandoc.Emoji (emojis)
43import Text.Pandoc.Options
44import Text.Pandoc.Options
44import Text.Pandoc.Shared (stringify)
45import Text.Pandoc.Shared (stringify)
45−import Text.Pandoc.Walk (walkM)
46+import Text.Pandoc.Walk (walkM, walk)
46
47
47-- | Parse a CommonMark formatted string into a 'Pandoc' structure.
48-- | Parse a CommonMark formatted string into a 'Pandoc' structure.
48readCommonMark :: PandocMonad m => ReaderOptions -> Text -> m Pandoc
49readCommonMark :: PandocMonad m => ReaderOptions -> Text -> m Pandoc
@@ -50,6 +51,9 @@ readCommonMark opts s = return $
50 (if enabled Ext_gfm_auto_identifiers
51 (if enabled Ext_gfm_auto_identifiers
51 then addHeaderIdentifiers
52 then addHeaderIdentifiers
52 else id) $
53 else id) $
54+ (if enabled Ext_emoji
55+ then addEmojis
56+ else id) $
53 nodeToPandoc $ commonmarkToNode opts' exts s
57 nodeToPandoc $ commonmarkToNode opts' exts s
54 where opts' = [ optSmart | enabled Ext_smart ]
58 where opts' = [ optSmart | enabled Ext_smart ]
55 exts = [ extStrikethrough | enabled Ext_strikeout ] ++
59 exts = [ extStrikethrough | enabled Ext_strikeout ] ++
@@ -57,6 +61,20 @@ readCommonMark opts s = return $
57 [ extAutolink | enabled Ext_autolink_bare_uris ]
61 [ extAutolink | enabled Ext_autolink_bare_uris ]
58 enabled x = extensionEnabled x (readerExtensions opts)
62 enabled x = extensionEnabled x (readerExtensions opts)
59
63
64+addEmojis :: Pandoc -> Pandoc
65+addEmojis = walk go
66+ where go (Str xs) = Str (convertEmojis xs)
67+ go x = x
68+ convertEmojis (':':xs) =
69+ case break (==':') xs of
70+ (ys,':':zs) ->
71+ case Map.lookup ys emojis of
72+ Just s -> s ++ convertEmojis zs
73+ Nothing -> ':' : ys ++ convertEmojis (':':zs)
74+ _ -> ':':xs
75+ convertEmojis (x:xs) = x : convertEmojis xs
76+ convertEmojis [] = []
77+
60addHeaderIdentifiers :: Pandoc -> Pandoc
78addHeaderIdentifiers :: Pandoc -> Pandoc
61addHeaderIdentifiers doc = evalState (walkM addHeaderId doc) mempty
79addHeaderIdentifiers doc = evalState (walkM addHeaderId doc) mempty
62
80