@@ -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) =