packages feed

submark-0.1.0: test/Text/CommonMark/QQ.hs

{-# LANGUAGE TemplateHaskell #-}
module Text.CommonMark.QQ (doc, node, nodes) where

import CMark
import Data.Text hiding (head)
import qualified Language.Haskell.TH as TH
import Language.Haskell.TH.Quote

doc :: QuasiQuoter
doc = QuasiQuoter
    docQ
    (error "Cannot use [doc|...|] as a pattern")
    (error "Cannot use [doc|...|] as a type")
    (error "Cannot use [doc|...|] as a dec")

nodes :: QuasiQuoter
nodes = QuasiQuoter
    nodesQ
    (error "Cannot use [nodes|...|] as a pattern")
    (error "Cannot use [nodes|...|] as a type")
    (error "Cannot use [nodes|...|] as a dec")

node :: QuasiQuoter
node = QuasiQuoter
    nodeQ
    (error "Cannot use [node|...|] as a pattern")
    (error "Cannot use [node|...|] as a type")
    (error "Cannot use [node|...|] as a dec")

parse :: String -> Node
parse = dropPosInfo . commonmarkToNode [optNormalize] . pack

dropPosInfo :: Node -> Node
dropPosInfo (Node _ nodeType children) =
    Node Nothing nodeType $ fmap dropPosInfo children

docQ :: String -> TH.ExpQ
docQ text = [e|parse text|]

nodesQ :: String -> TH.ExpQ
nodesQ text = [e|let (Node _ _ ns) = parse text in ns|]

nodeQ :: String -> TH.ExpQ
nodeQ text = [e|let (Node _ _ ns) = parse text in head ns|]