{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
module Commonmark.Extensions.Subscript
  ( HasSubscript(..)
  , subscriptSpec )
where
import Commonmark.Types
import Commonmark.Syntax
import Commonmark.Inlines
import Commonmark.SourceMap
import Commonmark.Html

subscriptSpec :: (Monad m, IsBlock il bl, IsInline il, HasSubscript il)
              => SyntaxSpec m il bl
subscriptSpec :: SyntaxSpec m il bl
subscriptSpec = SyntaxSpec m il bl
forall a. Monoid a => a
mempty
  { syntaxFormattingSpecs :: [FormattingSpec il]
syntaxFormattingSpecs = [
      Char
-> Bool
-> Bool
-> Maybe (il -> il)
-> Maybe (il -> il)
-> Char
-> FormattingSpec il
forall il.
Char
-> Bool
-> Bool
-> Maybe (il -> il)
-> Maybe (il -> il)
-> Char
-> FormattingSpec il
FormattingSpec Char
'~' Bool
True Bool
True ((il -> il) -> Maybe (il -> il)
forall a. a -> Maybe a
Just il -> il
forall a. HasSubscript a => a -> a
subscript) Maybe (il -> il)
forall a. Maybe a
Nothing Char
'~'
      ]
  }

class HasSubscript a where
  subscript :: a -> a

instance HasSubscript (Html a) where
  subscript :: Html a -> Html a
subscript Html a
x = Text -> Maybe (Html a) -> Html a
forall a. Text -> Maybe (Html a) -> Html a
htmlInline Text
"sub" (Html a -> Maybe (Html a)
forall a. a -> Maybe a
Just Html a
x)

instance (HasSubscript i, Monoid i)
        => HasSubscript (WithSourceMap i) where
  subscript :: WithSourceMap i -> WithSourceMap i
subscript WithSourceMap i
x = (i -> i
forall a. HasSubscript a => a -> a
subscript (i -> i) -> WithSourceMap i -> WithSourceMap i
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> WithSourceMap i
x) WithSourceMap i -> WithSourceMap () -> WithSourceMap i
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Text -> WithSourceMap ()
addName Text
"subscript"