{-# LANGUAGE LambdaCase #-} {-# LANGUAGE ScopedTypeVariables #-} module Reflex.Dom.Pandoc.URILink where import Control.Monad (guard) import Data.Maybe import Text.Pandoc.Definition import qualified Text.Pandoc.Walk as W import Text.URI (URI, mkURI) -- | A Pandoc Link node with a valid URI data URILink = URILink { -- | This is set to Nothing for autolinks _uriLink_inner :: Maybe [Inline], _uriLink_uri :: URI } deriving (Eq, Show, Ord) uriLinkFromInline :: Inline -> Maybe URILink uriLinkFromInline = \case Link _attr inlines (url, _title) -> do uri <- mkURI url let inner = do guard $ inlines /= [Str url] pure inlines pure $ URILink inner uri _ -> Nothing queryURILinks :: Pandoc -> [URILink] queryURILinks = W.query go where go :: Inline -> [URILink] go = maybeToList . uriLinkFromInline