{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}

-- | Filters and transforms for HTML trees.
module Zenacy.HTML.Internal.Filter
  ( htmlSpaceRemove
  ) where

import Zenacy.HTML.Internal.Core
import Zenacy.HTML.Internal.HTML
import Zenacy.HTML.Internal.Oper
import Data.Maybe
  ( mapMaybe
  )

-- | Removes whitespace and comments from an HTML structure.
-- Document elements are not accepted, and only non-empty text nodes
-- and element nodes are kept. @pre@, @code@, @samp@, and @kdb@ elements
-- are passed without modification, since whitespace is typically
-- significant in those elements.
htmlSpaceRemove :: HTMLNode -> Maybe HTMLNode
htmlSpaceRemove :: HTMLNode -> Maybe HTMLNode
htmlSpaceRemove = HTMLNode -> Maybe HTMLNode
go
  where
    go :: HTMLNode -> Maybe HTMLNode
go HTMLNode
x = case HTMLNode
x of
      HTMLText {}
        | HTMLNode -> Bool
htmlTextSpace HTMLNode
x ->
            forall a. Maybe a
Nothing
        | Bool
otherwise ->
            forall a. a -> Maybe a
Just HTMLNode
x
      HTMLElement Text
n HTMLNamespace
s [HTMLAttr]
a [HTMLNode]
c
        | Text
n forall a. Eq a => a -> a -> Bool
== Text
"pre" Bool -> Bool -> Bool
|| Text
n forall a. Eq a => a -> a -> Bool
== Text
"code" Bool -> Bool -> Bool
|| Text
n forall a. Eq a => a -> a -> Bool
== Text
"samp" Bool -> Bool -> Bool
|| Text
n forall a. Eq a => a -> a -> Bool
== Text
"kbd" ->
            forall a. a -> Maybe a
Just HTMLNode
x
        | Bool
otherwise ->
            forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ Text -> HTMLNamespace -> [HTMLAttr] -> [HTMLNode] -> HTMLNode
HTMLElement Text
n HTMLNamespace
s [HTMLAttr]
a forall a b. (a -> b) -> a -> b
$ forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe HTMLNode -> Maybe HTMLNode
go [HTMLNode]
c
      HTMLNode
_otherwise ->
        forall a. Maybe a
Nothing