@@ -25,8 +25,12 @@ import Text.Pandoc.Class.PandocMonad (PandocMonad)
2525import Text.Pandoc.Definition
2626import Text.Pandoc.Builder as B
2727import Text.Pandoc.Options
28+import Text.Pandoc.Walk (walkM)
29+import Text.Pandoc.Shared (uniqueIdent)
2830import Text.Pandoc.Error
2931import Control.Monad.Except
32+import Control.Monad.State
33+import qualified Data.Set as Set
3034
3135-- | Parse a CommonMark formatted string into a 'Pandoc' structure.
3236readCommonMark :: PandocMonad m => ReaderOptions -> Text -> m Pandoc
@@ -35,7 +39,10 @@ readCommonMark opts s = do
3539 (foldr (<>) defaultSyntaxSpec exts) (tokenize "input" s)
3640 case res of
3741 Left err -> throwError $ PandocParsecError s err
38− Right (Cm bls :: Cm () Blocks) -> return $ B.doc bls
42+ Right (Cm bls :: Cm () Blocks) -> return $
43+ (if isEnabled Ext_auto_identifiers opts
44+ then addHeaderIdentifiers opts
45+ else id) $ B.doc bls
3946 where
4047 exts = [ hardLineBreaksSpec | isEnabled Ext_hard_line_breaks opts ] ++
4148 [ smartPunctuationSpec | isEnabled Ext_smart opts ] ++
@@ -55,7 +62,17 @@ readCommonMark opts s = do
5562 isEnabled Ext_inline_code_attributes opts ] ++
5663 [ pipeTableSpec | isEnabled Ext_pipe_tables opts ] ++
5764 [ autolinkSpec | isEnabled Ext_autolink_bare_uris opts ] ++
58− [ autoIdentifiersSpec | isEnabled Ext_auto_identifiers opts ] ++
5965 [ emojiSpec | isEnabled Ext_emoji opts ] -- ++
6066 -- [ taskListSpec | isEnabled Ext_task_lists opts ]
6167
68+addHeaderIdentifiers :: ReaderOptions -> Pandoc -> Pandoc
69+addHeaderIdentifiers opts d =
70+ evalState (walkM (addHeaderId opts) d) mempty
71+
72+addHeaderId :: ReaderOptions -> Block -> State (Set.Set Text) Block
73+addHeaderId opts (Header lev (_,classes,kvs) ils) = do
74+ ids <- get
75+ let ident = uniqueIdent (readerExtensions opts) ils ids
76+ modify (Set.insert ident)
77+ return $ Header lev (ident,classes,kvs) ils
78+addHeaderId _ x = return x