{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE NoImplicitPrelude #-}

-- | Special Zettel links in Markdown
module Neuron.Zettelkasten.Link where

import Neuron.Zettelkasten.Link.Action
import Neuron.Zettelkasten.Link.View
import Neuron.Zettelkasten.Store
import Relude
import qualified Text.MMark.Extension as Ext
import Text.MMark.Extension (Extension, Inline (..))

-- | MMark extension to transform @z:/@ links in Markdown
linkActionExt :: ZettelStore -> Extension
linkActionExt :: ZettelStore -> Extension
linkActionExt store :: ZettelStore
store =
  ((Inline -> Html ()) -> Inline -> Html ()) -> Extension
Ext.inlineRender (((Inline -> Html ()) -> Inline -> Html ()) -> Extension)
-> ((Inline -> Html ()) -> Inline -> Html ()) -> Extension
forall a b. (a -> b) -> a -> b
$ \f :: Inline -> Html ()
f -> \case
    inline :: Inline
inline@(Link inner :: NonEmpty Inline
inner uri :: URI
uri _title :: Maybe Text
_title) ->
      case URI -> Maybe LinkAction
linkActionFromUri URI
uri of
        Just lact :: LinkAction
lact ->
          let mlink :: MarkdownLink
mlink = Text -> URI -> MarkdownLink
MarkdownLink (NonEmpty Inline -> Text
Ext.asPlainText NonEmpty Inline
inner) URI
uri
           in ZettelStore -> MarkdownLink -> LinkAction -> Html ()
forall (m :: * -> *).
Monad m =>
ZettelStore -> MarkdownLink -> LinkAction -> HtmlT m ()
linkActionRender ZettelStore
store MarkdownLink
mlink LinkAction
lact
        Nothing ->
          Inline -> Html ()
f Inline
inline
    inline :: Inline
inline ->
      Inline -> Html ()
f Inline
inline