git.iko.soy/typeable/pandoc
on master help sign in
CommonMark reader: Handle ascii_identifiers extension (#4733)

Non-ascii characters were not stripped from identifiers even if the `ascii_identifiers` extension was enabled (which is is by default for gfm). Closes #4742

commit904924d172d2fced32a96aa1d022d47a0fb59cd6 authorAnders Waldenborg <anders@0x63.nu> dateFri 29 Jun 2018, 10:41 (8 years ago) parentbb5a246
2 files changed+43−13
src/Text/Pandoc/Readers/CommonMark.hs+18−13 test/command/4742.md+25
src/Text/Pandoc/Readers/CommonMark.hs+18−13
@@ -39,7 +39,9 @@ import Control.Monad.State
3939import Data.Char (isAlphaNum, isLetter, isSpace, toLower)
4040import Data.List (groupBy)
4141import qualified Data.Map as Map
42+import Data.Maybe (mapMaybe)
4243import Data.Text (Text, unpack)
44+import Text.Pandoc.Asciify (toAsciiChar)
4345import Text.Pandoc.Class (PandocMonad)
4446import Text.Pandoc.Definition
4547import Text.Pandoc.Emoji (emojis)
@@ -51,7 +53,7 @@ import Text.Pandoc.Walk (walkM)
5153readCommonMark :: PandocMonad m => ReaderOptions -> Text -> m Pandoc
5254readCommonMark opts s = return $
5355 (if isEnabled Ext_gfm_auto_identifiers opts
54− then addHeaderIdentifiers
56+ then addHeaderIdentifiers opts
5557 else id) $
5658 nodeToPandoc opts $ commonmarkToNode opts' exts s
5759 where opts' = [ optSmart | isEnabled Ext_smart opts ]
@@ -70,13 +72,13 @@ convertEmojis (':':xs) =
7072convertEmojis (x:xs) = x : convertEmojis xs
7173convertEmojis [] = []
7274
73−addHeaderIdentifiers :: Pandoc -> Pandoc
74−addHeaderIdentifiers doc = evalState (walkM addHeaderId doc) mempty
75+addHeaderIdentifiers :: ReaderOptions -> Pandoc -> Pandoc
76+addHeaderIdentifiers opts doc = evalState (walkM (addHeaderId opts) doc) mempty
7577
76−addHeaderId :: Block -> State (Map.Map String Int) Block
77−addHeaderId (Header lev (_,classes,kvs) ils) = do
78+addHeaderId :: ReaderOptions -> Block -> State (Map.Map String Int) Block
79+addHeaderId opts (Header lev (_,classes,kvs) ils) = do
7880 idmap <- get
79− let ident = toIdent ils
81+ let ident = toIdent opts ils
8082 ident' <- case Map.lookup ident idmap of
8183 Nothing -> do
8284 put (Map.insert ident 1 idmap)
@@ -85,13 +87,16 @@ addHeaderId (Header lev (_,classes,kvs) ils) = do
8587 put (Map.adjust (+ 1) ident idmap)
8688 return (ident ++ "-" ++ show i)
8789 return $ Header lev (ident',classes,kvs) ils
88−addHeaderId x = return x
89−
90−toIdent :: [Inline] -> String
91−toIdent = map (\c -> if isSpace c then '-' else c)
92− . filter (\c -> isLetter c || isAlphaNum c || isSpace c ||
93− c == '_' || c == '-')
94− . map toLower . stringify
90+addHeaderId _ x = return x
91+
92+toIdent :: ReaderOptions -> [Inline] -> String
93+toIdent opts = map (\c -> if isSpace c then '-' else c)
94+ . filterer
95+ . map toLower . stringify
96+ where filterer = if isEnabled Ext_ascii_identifiers opts
97+ then mapMaybe toAsciiChar
98+ else filter (\c -> isLetter c || isAlphaNum c || isSpace c ||
99+ c == '_' || c == '-')
95100
96101nodeToPandoc :: ReaderOptions -> Node -> Pandoc
97102nodeToPandoc opts (Node _ DOCUMENT nodes) =
test/command/4742.mdnew file+25
@@ -0,0 +1,25 @@
1+Check that the commonmark reader handles the `ascii_identifiers`
2+extension properly.
3+
4+```
5+% pandoc -f commonmark+gfm_auto_identifiers+ascii_identifiers -t native
6+# non ascii ⚠️ räksmörgås
7+^D
8+[Header 1 ("non-ascii--raksmorgas",[],[]) [Str "non",Space,Str "ascii",Space,Str "\9888\65039",Space,Str "r\228ksm\246rg\229s"]]
9+```
10+
11+```
12+% pandoc -f commonmark+gfm_auto_identifiers-ascii_identifiers -t native
13+# non ascii ⚠️ räksmörgås
14+^D
15+[Header 1 ("non-ascii-\65039-r\228ksm\246rg\229s",[],[]) [Str "non",Space,Str "ascii",Space,Str "\9888\65039",Space,Str "r\228ksm\246rg\229s"]]
16+```
17+
18+`gfm` should have `ascii_identifiers` enabled by default.
19+
20+```
21+% pandoc -f gfm -t native
22+# non ascii ⚠️ räksmörgås
23+^D
24+[Header 1 ("non-ascii--raksmorgas",[],[]) [Str "non",Space,Str "ascii",Space,Str "\9888\65039",Space,Str "r\228ksm\246rg\229s"]]
25+```