88-- | Markdown documents markdownScanner.
99
1010module Xrefcheck.Scanners.Markdown
11- ( markdownScanner
11+ ( MarkdownConfig (.. )
12+ , defGithubMdConfig
13+ , markdownScanner
1214 , markdownSupport
1315 , parseFileInfo
1416 ) where
1517
1618import CMarkGFM (Node (.. ), NodeType (.. ), PosInfo (.. ), commonmarkToNode )
1719import Control.Lens ((%=) )
1820import Control.Monad.Trans.Except (Except , runExcept , throwE )
21+ import Data.Aeson.TH (deriveFromJSON )
1922import qualified Data.ByteString.Lazy as BSL
2023import Data.Char (isSpace )
2124import Data.Default (Default (.. ))
@@ -25,6 +28,18 @@ import Fmt (Buildable (..), blockListF, nameF, (+|), (|+))
2528
2629import Xrefcheck.Core
2730import Xrefcheck.Scan
31+ import Xrefcheck.Util
32+
33+ data MarkdownConfig = MarkdownConfig
34+ { mcFlavor :: Flavor
35+ }
36+
37+ deriveFromJSON aesonConfigOption ''MarkdownConfig
38+
39+ defGithubMdConfig :: MarkdownConfig
40+ defGithubMdConfig = MarkdownConfig
41+ { mcFlavor = GitHub
42+ }
2843
2944instance Buildable Node where
3045 build (Node _mpos ty subs) = nameF (show ty) $ blockListF subs
@@ -57,8 +72,8 @@ data IgnoreMode
5772 | File
5873 deriving Eq
5974
60- nodeExtractInfo :: Node -> Except Text FileInfo
61- nodeExtractInfo (Node _ _ docNodes) =
75+ nodeExtractInfo :: MarkdownConfig -> Node -> Except Text FileInfo
76+ nodeExtractInfo config (Node _ _ docNodes) =
6277 if checkIgnoreFile docNodes
6378 then return def
6479 else finaliseFileInfo <$> extractionResult
@@ -90,7 +105,8 @@ nodeExtractInfo (Node _ _ docNodes) =
90105 HTML_BLOCK _ -> processHtmlNode node pos nodes toIgnore
91106 HEADING lvl -> do
92107 let aType = HeaderAnchor lvl
93- let aName = headerToAnchor $ nodeExtractText node
108+ let aName = headerToAnchor (mcFlavor config) $
109+ nodeExtractText node
94110 let aPos = toPosition pos
95111 fiAnchors %= (Anchor {.. } : )
96112 loop nodes toIgnore
@@ -230,17 +246,17 @@ nodeExtractInfo (Node _ _ docNodes) =
230246 (loop nodes . pure ) $ getIgnoreMode node
231247 Nothing -> loop nodes toIgnore
232248
233- parseFileInfo :: LT. Text -> Either Text FileInfo
234- parseFileInfo input = runExcept $ nodeExtractInfo $
249+ parseFileInfo :: MarkdownConfig -> LT. Text -> Either Text FileInfo
250+ parseFileInfo config input = runExcept $ nodeExtractInfo config $
235251 commonmarkToNode [] [] $ toStrict input
236252
237- markdownScanner :: ScanAction
238- markdownScanner path = do
239- errOrInfo <- parseFileInfo . decodeUtf8 <$> BSL. readFile path
253+ markdownScanner :: MarkdownConfig -> ScanAction
254+ markdownScanner config path = do
255+ errOrInfo <- parseFileInfo config . decodeUtf8 <$> BSL. readFile path
240256 case errOrInfo of
241257 Left errTxt -> do
242258 die $ " Error when scanning " <> path <> " : " <> T. unpack errTxt
243259 Right fileInfo -> return fileInfo
244260
245- markdownSupport :: ([Extension ], ScanAction )
246- markdownSupport = ([" .md" ], markdownScanner)
261+ markdownSupport :: MarkdownConfig -> ([Extension ], ScanAction )
262+ markdownSupport config = ([" .md" ], markdownScanner config )
0 commit comments