linkcheck 0.2.0.0 → 0.3.0.0
raw patch · 3 files changed
+44/−12 lines, 3 files
Files
- CHANGELOG.md +9/−0
- linkcheck.cabal +2/−2
- src/LinkCheck.hs +33/−10
CHANGELOG.md view
@@ -1,5 +1,14 @@ # Changelog +## [0.3.0.0] - 2026-03-08++### Added++* Check URLs in `<script>`, `<iframe>`, `<video>`, `<audio>`, `<source>`, `<embed>`, and `<object>` tags.+* Check `<video poster>` attribute for broken URLs.+* Check `<form action>` attribute for broken URLs.+* Parse `srcset` attributes on `<img>` and `<source>` tags for broken URLs.+ ## [0.2.0.0] - 2026-03-08 ### Added
linkcheck.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: c4572d1f18f5023bc2017ff15d83d0fd2c1330a48896a18725cb11725624109f+-- hash: e53500fa97c543cf1a41fad189249bca445f70accd68c37c3228c7e2314b5441 name: linkcheck-version: 0.2.0.0+version: 0.3.0.0 synopsis: Check for broken links in CI homepage: https://github.com/NorfairKing/linkcheck#readme bug-reports: https://github.com/NorfairKing/linkcheck/issues
src/LinkCheck.hs view
@@ -15,6 +15,7 @@ import Control.Monad.Logger import Control.Retry import qualified Data.ByteString as SB+import qualified Data.ByteString.Char8 as SB8 import qualified Data.ByteString.Lazy as LB import Data.Cache.LRU (LRU, newLRU) import qualified Data.Cache.LRU as LRU@@ -337,9 +338,12 @@ let removeFragment u = u {uriFragment = ""} let uris = (if workerSetCheckFragments then id else map removeFragment) $- mapMaybe (parseURIRelativeTo queueURI) $- mapMaybe (fmap T.unpack . rightToMaybe . TE.decodeUtf8') $- mapMaybe aTagHref tags+ concatMap+ ( mapMaybe (parseURIRelativeTo queueURI)+ . mapMaybe (fmap T.unpack . rightToMaybe . TE.decodeUtf8')+ . tagURLs+ )+ tags let urisToAddToQueue = map@@ -397,13 +401,32 @@ Left _ -> Nothing Right a -> Just a -aTagHref :: (Eq str, IsString str) => Tag str -> Maybe str-aTagHref = \case- TagOpen "a" as -> lookup "href" as- TagOpen "link" as -> lookup "href" as- TagOpen "img" as -> lookup "src" as- TagOpen "meta" as -> metaImageContent as- _ -> Nothing+tagURLs :: Tag SB.ByteString -> [SB.ByteString]+tagURLs = \case+ TagOpen "a" as -> maybeToList $ lookup "href" as+ TagOpen "link" as -> maybeToList $ lookup "href" as+ TagOpen "img" as -> maybeToList (lookup "src" as) ++ parseSrcset (lookup "srcset" as)+ TagOpen "script" as -> maybeToList $ lookup "src" as+ TagOpen "iframe" as -> maybeToList $ lookup "src" as+ TagOpen "video" as -> maybeToList $ lookup "src" as `mplus` lookup "poster" as+ TagOpen "audio" as -> maybeToList $ lookup "src" as+ TagOpen "source" as -> maybeToList (lookup "src" as) ++ parseSrcset (lookup "srcset" as)+ TagOpen "embed" as -> maybeToList $ lookup "src" as+ TagOpen "object" as -> maybeToList $ lookup "data" as+ TagOpen "form" as -> maybeToList $ lookup "action" as+ TagOpen "meta" as -> maybeToList $ metaImageContent as+ _ -> []++-- | Parse a srcset attribute value into individual URLs.+-- The srcset format is: "url1 descriptor1, url2 descriptor2, ..."+parseSrcset :: Maybe SB.ByteString -> [SB.ByteString]+parseSrcset Nothing = []+parseSrcset (Just s) =+ mapMaybe extractURL $ SB8.split ',' s+ where+ extractURL entry = case SB8.words entry of+ [] -> Nothing+ (url : _) -> Just url -- | Extract the content attribute from meta tags that reference images. -- Covers og:image, twitter:image, and similar.