-- GFM Task List, https://github.github.com/gfm/#task-list-items-extension-
module Heist.Extra.Splices.Pandoc.TaskList (
  parseTaskFromInlines,
  queryTasks,
) where

import Text.Pandoc.Builder qualified as B
import Text.Pandoc.Walk qualified as W

parseTaskFromInlines :: [B.Inline] -> Maybe (Bool, [B.Inline])
parseTaskFromInlines :: [Inline] -> Maybe (Bool, [Inline])
parseTaskFromInlines = \case
  B.Str Text
"[" : Inline
B.Space : B.Str Text
"]" : Inline
B.Space : [Inline]
taskInlines ->
    forall (f :: Type -> Type) a. Applicative f => a -> f a
pure (Bool
False, [Inline]
taskInlines)
  B.Str Text
"[x]" : Inline
B.Space : [Inline]
taskInlines ->
    forall (f :: Type -> Type) a. Applicative f => a -> f a
pure (Bool
True, [Inline]
taskInlines)
  [Inline]
_ ->
    forall a. Maybe a
Nothing

queryTasks :: W.Walkable B.Block b => b -> [(Bool, [B.Inline])]
queryTasks :: forall b. Walkable Block b => b -> [(Bool, [Inline])]
queryTasks =
  forall a b c. (Walkable a b, Monoid c) => (a -> c) -> b -> c
W.query forall a b. (a -> b) -> a -> b
$ \case
    B.Plain [Inline]
is ->
      forall a. Maybe a -> [a]
maybeToList forall a b. (a -> b) -> a -> b
$ [Inline] -> Maybe (Bool, [Inline])
parseTaskFromInlines [Inline]
is
    B.Para [Inline]
is ->
      forall a. Maybe a -> [a]
maybeToList forall a b. (a -> b) -> a -> b
$ [Inline] -> Maybe (Bool, [Inline])
parseTaskFromInlines [Inline]
is
    Block
_ ->
      forall a. Monoid a => a
mempty