{-# LANGUAGE OverloadedStrings #-}
module Text.MMark.Extension.MathJax
( mathJax,
)
where
import Control.Monad
import Data.Text (Text)
import qualified Data.Text as T
import Lucid
import Text.MMark.Extension (Block (..), Extension, Inline (..))
import qualified Text.MMark.Extension as Ext
mathJax ::
Maybe Char ->
Extension
mathJax :: Maybe Char -> Extension
mathJax Maybe Char
mch = Maybe Char -> Extension
mathJaxSpan Maybe Char
mch Extension -> Extension -> Extension
forall a. Semigroup a => a -> a -> a
<> Extension
mathJaxBlock
mathJaxSpan :: Maybe Char -> Extension
mathJaxSpan :: Maybe Char -> Extension
mathJaxSpan Maybe Char
mch = ((Inline -> Html ()) -> Inline -> Html ()) -> Extension
Ext.inlineRender (((Inline -> Html ()) -> Inline -> Html ()) -> Extension)
-> ((Inline -> Html ()) -> Inline -> Html ()) -> Extension
forall a b. (a -> b) -> a -> b
$ \Inline -> Html ()
old Inline
inline ->
case Inline
inline of
s :: Inline
s@(CodeSpan Text
txt) ->
case Maybe Char
mch of
Maybe Char
Nothing -> Text -> Html ()
spn Text
txt
Just Char
ch ->
if Text -> Int
T.length Text
txt Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
2 Bool -> Bool -> Bool
&& Text -> Char
T.head Text
txt Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
ch Bool -> Bool -> Bool
&& Text -> Char
T.last Text
txt Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
ch
then (Text -> Html ()
spn (Text -> Html ()) -> (Text -> Text) -> Text -> Html ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Text -> Text
T.dropEnd Int
1 (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Text -> Text
T.drop Int
1) Text
txt
else Inline -> Html ()
old Inline
s
Inline
other -> Inline -> Html ()
old Inline
other
where
spn :: Text -> Html ()
spn :: Text -> Html ()
spn Text
x =
[Attribute] -> Html () -> Html ()
forall arg result. Term arg result => arg -> result
span_ [Text -> Attribute
class_ Text
"math inline"] (Html () -> Html ()) -> Html () -> Html ()
forall a b. (a -> b) -> a -> b
$
Html ()
"\\(" Html () -> Html () -> Html ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Text -> Html ()
forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml Text
x Html () -> Html () -> Html ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Html ()
"\\)"
mathJaxBlock :: Extension
mathJaxBlock :: Extension
mathJaxBlock = ((Block (Ois, Html ()) -> Html ())
-> Block (Ois, Html ()) -> Html ())
-> Extension
Ext.blockRender (((Block (Ois, Html ()) -> Html ())
-> Block (Ois, Html ()) -> Html ())
-> Extension)
-> ((Block (Ois, Html ()) -> Html ())
-> Block (Ois, Html ()) -> Html ())
-> Extension
forall a b. (a -> b) -> a -> b
$ \Block (Ois, Html ()) -> Html ()
old Block (Ois, Html ())
block ->
case Block (Ois, Html ())
block of
b :: Block (Ois, Html ())
b@(CodeBlock Maybe Text
mlabel Text
txt) ->
if Maybe Text
mlabel Maybe Text -> Maybe Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"mathjax"
then do
Html () -> Html ()
forall arg result. Term arg result => arg -> result
p_ (Html () -> Html ())
-> ((Text -> Html ()) -> Html ()) -> (Text -> Html ()) -> Html ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Text] -> (Text -> Html ()) -> Html ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ (Text -> [Text]
T.lines Text
txt) ((Text -> Html ()) -> Html ()) -> (Text -> Html ()) -> Html ()
forall a b. (a -> b) -> a -> b
$ \Text
x ->
[Attribute] -> Html () -> Html ()
forall arg result. Term arg result => arg -> result
span_ [Text -> Attribute
class_ Text
"math display"] (Html () -> Html ()) -> Html () -> Html ()
forall a b. (a -> b) -> a -> b
$
Html ()
"\\[" Html () -> Html () -> Html ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Text -> Html ()
forall a (m :: * -> *). (ToHtml a, Monad m) => a -> HtmlT m ()
toHtml Text
x Html () -> Html () -> Html ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Html ()
"\\]"
Html ()
"\n"
else Block (Ois, Html ()) -> Html ()
old Block (Ois, Html ())
b
Block (Ois, Html ())
other -> Block (Ois, Html ()) -> Html ()
old Block (Ois, Html ())
other