{-# LANGUAGE OverloadedStrings, ViewPatterns #-}
-- | Infrastructure for parsing & desugaring text related CSS properties.
module Graphics.Layout.Inline.CSS(
    CSSInline(..), Default(..), UnicodeBidi(..), applyFontInline, applyBidi) where

import Data.CSS.Syntax.Tokens (Token(..))
import Stylist (PropertyParser(..))
import qualified Data.Text as Txt
import Data.Text (Text)
import Data.Text.ParagraphLayout.Rich
import Data.Text.Glyphize (Direction(..))

import Graphics.Layout.CSS.Font (Font'(..), hbUnit)
import Data.Char (isSpace)
import Debug.Trace (trace) -- To report unexpected cases.

-- | Document text with Balkón styling options, CSS stylable.
data CSSInline = CSSInline Txt.Text TextOptions UnicodeBidi
-- | To what degree is the text direction isolated?
data UnicodeBidi = BdNormal | BdEmbed | BdOverride | BdIsolate
        | BdIsolateOverride | BdPlainText deriving (UnicodeBidi -> UnicodeBidi -> Bool
(UnicodeBidi -> UnicodeBidi -> Bool)
-> (UnicodeBidi -> UnicodeBidi -> Bool) -> Eq UnicodeBidi
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: UnicodeBidi -> UnicodeBidi -> Bool
$c/= :: UnicodeBidi -> UnicodeBidi -> Bool
== :: UnicodeBidi -> UnicodeBidi -> Bool
$c== :: UnicodeBidi -> UnicodeBidi -> Bool
Eq, Eq UnicodeBidi
Eq UnicodeBidi =>
(UnicodeBidi -> UnicodeBidi -> Ordering)
-> (UnicodeBidi -> UnicodeBidi -> Bool)
-> (UnicodeBidi -> UnicodeBidi -> Bool)
-> (UnicodeBidi -> UnicodeBidi -> Bool)
-> (UnicodeBidi -> UnicodeBidi -> Bool)
-> (UnicodeBidi -> UnicodeBidi -> UnicodeBidi)
-> (UnicodeBidi -> UnicodeBidi -> UnicodeBidi)
-> Ord UnicodeBidi
UnicodeBidi -> UnicodeBidi -> Bool
UnicodeBidi -> UnicodeBidi -> Ordering
UnicodeBidi -> UnicodeBidi -> UnicodeBidi
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: UnicodeBidi -> UnicodeBidi -> UnicodeBidi
$cmin :: UnicodeBidi -> UnicodeBidi -> UnicodeBidi
max :: UnicodeBidi -> UnicodeBidi -> UnicodeBidi
$cmax :: UnicodeBidi -> UnicodeBidi -> UnicodeBidi
>= :: UnicodeBidi -> UnicodeBidi -> Bool
$c>= :: UnicodeBidi -> UnicodeBidi -> Bool
> :: UnicodeBidi -> UnicodeBidi -> Bool
$c> :: UnicodeBidi -> UnicodeBidi -> Bool
<= :: UnicodeBidi -> UnicodeBidi -> Bool
$c<= :: UnicodeBidi -> UnicodeBidi -> Bool
< :: UnicodeBidi -> UnicodeBidi -> Bool
$c< :: UnicodeBidi -> UnicodeBidi -> Bool
compare :: UnicodeBidi -> UnicodeBidi -> Ordering
$ccompare :: UnicodeBidi -> UnicodeBidi -> Ordering
$cp1Ord :: Eq UnicodeBidi
Ord, Int -> UnicodeBidi
UnicodeBidi -> Int
UnicodeBidi -> [UnicodeBidi]
UnicodeBidi -> UnicodeBidi
UnicodeBidi -> UnicodeBidi -> [UnicodeBidi]
UnicodeBidi -> UnicodeBidi -> UnicodeBidi -> [UnicodeBidi]
(UnicodeBidi -> UnicodeBidi)
-> (UnicodeBidi -> UnicodeBidi)
-> (Int -> UnicodeBidi)
-> (UnicodeBidi -> Int)
-> (UnicodeBidi -> [UnicodeBidi])
-> (UnicodeBidi -> UnicodeBidi -> [UnicodeBidi])
-> (UnicodeBidi -> UnicodeBidi -> [UnicodeBidi])
-> (UnicodeBidi -> UnicodeBidi -> UnicodeBidi -> [UnicodeBidi])
-> Enum UnicodeBidi
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: UnicodeBidi -> UnicodeBidi -> UnicodeBidi -> [UnicodeBidi]
$cenumFromThenTo :: UnicodeBidi -> UnicodeBidi -> UnicodeBidi -> [UnicodeBidi]
enumFromTo :: UnicodeBidi -> UnicodeBidi -> [UnicodeBidi]
$cenumFromTo :: UnicodeBidi -> UnicodeBidi -> [UnicodeBidi]
enumFromThen :: UnicodeBidi -> UnicodeBidi -> [UnicodeBidi]
$cenumFromThen :: UnicodeBidi -> UnicodeBidi -> [UnicodeBidi]
enumFrom :: UnicodeBidi -> [UnicodeBidi]
$cenumFrom :: UnicodeBidi -> [UnicodeBidi]
fromEnum :: UnicodeBidi -> Int
$cfromEnum :: UnicodeBidi -> Int
toEnum :: Int -> UnicodeBidi
$ctoEnum :: Int -> UnicodeBidi
pred :: UnicodeBidi -> UnicodeBidi
$cpred :: UnicodeBidi -> UnicodeBidi
succ :: UnicodeBidi -> UnicodeBidi
$csucc :: UnicodeBidi -> UnicodeBidi
Enum, ReadPrec [UnicodeBidi]
ReadPrec UnicodeBidi
Int -> ReadS UnicodeBidi
ReadS [UnicodeBidi]
(Int -> ReadS UnicodeBidi)
-> ReadS [UnicodeBidi]
-> ReadPrec UnicodeBidi
-> ReadPrec [UnicodeBidi]
-> Read UnicodeBidi
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [UnicodeBidi]
$creadListPrec :: ReadPrec [UnicodeBidi]
readPrec :: ReadPrec UnicodeBidi
$creadPrec :: ReadPrec UnicodeBidi
readList :: ReadS [UnicodeBidi]
$creadList :: ReadS [UnicodeBidi]
readsPrec :: Int -> ReadS UnicodeBidi
$creadsPrec :: Int -> ReadS UnicodeBidi
Read, Int -> UnicodeBidi -> ShowS
[UnicodeBidi] -> ShowS
UnicodeBidi -> String
(Int -> UnicodeBidi -> ShowS)
-> (UnicodeBidi -> String)
-> ([UnicodeBidi] -> ShowS)
-> Show UnicodeBidi
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UnicodeBidi] -> ShowS
$cshowList :: [UnicodeBidi] -> ShowS
show :: UnicodeBidi -> String
$cshow :: UnicodeBidi -> String
showsPrec :: Int -> UnicodeBidi -> ShowS
$cshowsPrec :: Int -> UnicodeBidi -> ShowS
Show)

instance PropertyParser CSSInline where
    temp :: CSSInline
temp = Text -> TextOptions -> UnicodeBidi -> CSSInline
CSSInline "" (Direction -> TextOptions
defaultTextOptions Direction
DirLTR) UnicodeBidi
BdNormal
    inherit :: CSSInline -> CSSInline
inherit (CSSInline _ opts :: TextOptions
opts _) = Text -> TextOptions -> UnicodeBidi -> CSSInline
CSSInline "" TextOptions
opts UnicodeBidi
BdNormal
    priority :: CSSInline -> [Text]
priority _ = ["direction"] -- To inform logical spacing in caller!

    longhand :: CSSInline -> CSSInline -> Text -> [Token] -> Maybe CSSInline
longhand _ (CSSInline _ opts :: TextOptions
opts bidi :: UnicodeBidi
bidi) "content" [Ident "initial"] =
        CSSInline -> Maybe CSSInline
forall a. a -> Maybe a
Just (CSSInline -> Maybe CSSInline) -> CSSInline -> Maybe CSSInline
forall a b. (a -> b) -> a -> b
$ Text -> TextOptions -> UnicodeBidi -> CSSInline
CSSInline "" TextOptions
opts UnicodeBidi
bidi
    longhand _ (CSSInline _ opts :: TextOptions
opts bidi :: UnicodeBidi
bidi) "content" toks :: [Token]
toks
        | (Token -> Bool) -> [Token] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Token -> Bool
isString [Token]
toks =
            CSSInline -> Maybe CSSInline
forall a. a -> Maybe a
Just (CSSInline -> Maybe CSSInline) -> CSSInline -> Maybe CSSInline
forall a b. (a -> b) -> a -> b
$ Text -> TextOptions -> UnicodeBidi -> CSSInline
CSSInline ([Text] -> Text
Txt.concat [Text
x | String x :: Text
x <- [Token]
toks]) TextOptions
opts UnicodeBidi
bidi
      where
        isString :: Token -> Bool
isString (String _) = Bool
True
        isString _ = Bool
False

    longhand _ (CSSInline t :: Text
t o :: TextOptions
o b :: UnicodeBidi
b) "-argo-lang" [Ident kw :: Text
kw]
        | Text
kw Text -> [Text] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ["initial", "auto"] = CSSInline -> Maybe CSSInline
forall a. a -> Maybe a
Just (CSSInline -> Maybe CSSInline) -> CSSInline -> Maybe CSSInline
forall a b. (a -> b) -> a -> b
$ Text -> TextOptions -> UnicodeBidi -> CSSInline
CSSInline Text
t TextOptions
o {textLanguage :: String
textLanguage=""} UnicodeBidi
b
    longhand _ (CSSInline txt :: Text
txt opts :: TextOptions
opts bidi :: UnicodeBidi
bidi) "-argo-lang" [String x :: Text
x] =
        CSSInline -> Maybe CSSInline
forall a. a -> Maybe a
Just (CSSInline -> Maybe CSSInline) -> CSSInline -> Maybe CSSInline
forall a b. (a -> b) -> a -> b
$ Text -> TextOptions -> UnicodeBidi -> CSSInline
CSSInline Text
txt TextOptions
opts { textLanguage :: String
textLanguage = Text -> String
Txt.unpack Text
x } UnicodeBidi
bidi

    longhand _ (CSSInline txt :: Text
txt opts :: TextOptions
opts bidi :: UnicodeBidi
bidi) "direction" [Ident "ltr"] =
        CSSInline -> Maybe CSSInline
forall a. a -> Maybe a
Just (CSSInline -> Maybe CSSInline) -> CSSInline -> Maybe CSSInline
forall a b. (a -> b) -> a -> b
$ Text -> TextOptions -> UnicodeBidi -> CSSInline
CSSInline Text
txt TextOptions
opts { textDirection :: Direction
textDirection = Direction
DirLTR } UnicodeBidi
bidi
    longhand _ (CSSInline txt :: Text
txt opts :: TextOptions
opts bidi :: UnicodeBidi
bidi) "direction" [Ident "rtl"] =
        CSSInline -> Maybe CSSInline
forall a. a -> Maybe a
Just (CSSInline -> Maybe CSSInline) -> CSSInline -> Maybe CSSInline
forall a b. (a -> b) -> a -> b
$ Text -> TextOptions -> UnicodeBidi -> CSSInline
CSSInline Text
txt TextOptions
opts { textDirection :: Direction
textDirection = Direction
DirRTL } UnicodeBidi
bidi
    longhand _ (CSSInline txt :: Text
txt opts :: TextOptions
opts bidi :: UnicodeBidi
bidi) "direction" [Ident "initial"] =
        CSSInline -> Maybe CSSInline
forall a. a -> Maybe a
Just (CSSInline -> Maybe CSSInline) -> CSSInline -> Maybe CSSInline
forall a b. (a -> b) -> a -> b
$ Text -> TextOptions -> UnicodeBidi -> CSSInline
CSSInline Text
txt TextOptions
opts { textDirection :: Direction
textDirection = Direction
DirLTR } UnicodeBidi
bidi

    longhand _ (CSSInline txt :: Text
txt opts :: TextOptions
opts _) "unicode-bidi" [Ident "initial"] =
        CSSInline -> Maybe CSSInline
forall a. a -> Maybe a
Just (CSSInline -> Maybe CSSInline) -> CSSInline -> Maybe CSSInline
forall a b. (a -> b) -> a -> b
$ Text -> TextOptions -> UnicodeBidi -> CSSInline
CSSInline Text
txt TextOptions
opts UnicodeBidi
BdNormal
    longhand _ (CSSInline txt :: Text
txt opts :: TextOptions
opts _) "unicode-bidi" [Ident "normal"] =
        CSSInline -> Maybe CSSInline
forall a. a -> Maybe a
Just (CSSInline -> Maybe CSSInline) -> CSSInline -> Maybe CSSInline
forall a b. (a -> b) -> a -> b
$ Text -> TextOptions -> UnicodeBidi -> CSSInline
CSSInline Text
txt TextOptions
opts UnicodeBidi
BdNormal
    longhand _ (CSSInline txt :: Text
txt opts :: TextOptions
opts _) "unicode-bidi" [Ident "embed"] =
        CSSInline -> Maybe CSSInline
forall a. a -> Maybe a
Just (CSSInline -> Maybe CSSInline) -> CSSInline -> Maybe CSSInline
forall a b. (a -> b) -> a -> b
$ Text -> TextOptions -> UnicodeBidi -> CSSInline
CSSInline Text
txt TextOptions
opts UnicodeBidi
BdEmbed
    longhand _ (CSSInline txt :: Text
txt opts :: TextOptions
opts _) "unicode-bidi" [Ident "isolate"] =
        CSSInline -> Maybe CSSInline
forall a. a -> Maybe a
Just (CSSInline -> Maybe CSSInline) -> CSSInline -> Maybe CSSInline
forall a b. (a -> b) -> a -> b
$ Text -> TextOptions -> UnicodeBidi -> CSSInline
CSSInline Text
txt TextOptions
opts UnicodeBidi
BdIsolate
    longhand _ (CSSInline txt :: Text
txt opts :: TextOptions
opts _) "unicode-bidi" [Ident "bidi-override"] =
        CSSInline -> Maybe CSSInline
forall a. a -> Maybe a
Just (CSSInline -> Maybe CSSInline) -> CSSInline -> Maybe CSSInline
forall a b. (a -> b) -> a -> b
$ Text -> TextOptions -> UnicodeBidi -> CSSInline
CSSInline Text
txt TextOptions
opts UnicodeBidi
BdOverride
    longhand _ (CSSInline txt :: Text
txt opts :: TextOptions
opts _) "unicode-bidi" [Ident "isolate-override"] =
        CSSInline -> Maybe CSSInline
forall a. a -> Maybe a
Just (CSSInline -> Maybe CSSInline) -> CSSInline -> Maybe CSSInline
forall a b. (a -> b) -> a -> b
$ Text -> TextOptions -> UnicodeBidi -> CSSInline
CSSInline Text
txt TextOptions
opts UnicodeBidi
BdIsolateOverride
    longhand _ (CSSInline txt :: Text
txt opts :: TextOptions
opts _) "unicode-bidi" [Ident "plaintext"] =
        CSSInline -> Maybe CSSInline
forall a. a -> Maybe a
Just (CSSInline -> Maybe CSSInline) -> CSSInline -> Maybe CSSInline
forall a b. (a -> b) -> a -> b
$ Text -> TextOptions -> UnicodeBidi -> CSSInline
CSSInline Text
txt TextOptions
opts UnicodeBidi
BdPlainText
    longhand _ _ _ _ = Maybe CSSInline
forall a. Maybe a
Nothing

applyFontInline :: TextOptions -> Font' -> TextOptions
applyFontInline :: TextOptions -> Font' -> TextOptions
applyFontInline opts :: TextOptions
opts font :: Font'
font = TextOptions
opts {
    textFont :: Font
textFont = Font' -> Font
hbFont Font'
font,
    textLineHeight :: LineHeight
textLineHeight = Int32 -> LineHeight
Absolute (Int32 -> LineHeight) -> Int32 -> LineHeight
forall a b. (a -> b) -> a -> b
$ Int -> Int32
forall a. Enum a => Int -> a
toEnum (Int -> Int32) -> Int -> Int32
forall a b. (a -> b) -> a -> b
$ Double -> Int
forall a. Enum a => a -> Int
fromEnum (Double -> Int) -> Double -> Int
forall a b. (a -> b) -> a -> b
$ Font' -> Double
lineheight Font'
font Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
hbUnit
  }
-- | Apply Bidi chars around the inline text. FIXME: Handle the tree!
applyBidi :: Default d => CSSInline -> [InnerNode Text d] -> [InnerNode Text d]
applyBidi :: CSSInline -> [InnerNode Text d] -> [InnerNode Text d]
applyBidi (CSSInline _ _ BdNormal) txt :: [InnerNode Text d]
txt = [InnerNode Text d]
txt
applyBidi (CSSInline _ (TextOptions -> Direction
textDirection -> Direction
DirLTR) BdEmbed) txt :: [InnerNode Text d]
txt =
    InnerNode Text d
forall a. Default a => InnerNode Text a
chLREmbedInnerNode Text d -> [InnerNode Text d] -> [InnerNode Text d]
forall a. a -> [a] -> [a]
:[InnerNode Text d]
txt[InnerNode Text d] -> InnerNode Text d -> [InnerNode Text d]
forall a. [a] -> a -> [a]
+:InnerNode Text d
forall a. Default a => InnerNode Text a
chPopDir
applyBidi (CSSInline _ (TextOptions -> Direction
textDirection -> Direction
DirRTL) BdEmbed) txt :: [InnerNode Text d]
txt =
    InnerNode Text d
forall a. Default a => InnerNode Text a
chRLEmbedInnerNode Text d -> [InnerNode Text d] -> [InnerNode Text d]
forall a. a -> [a] -> [a]
:[InnerNode Text d]
txt[InnerNode Text d] -> InnerNode Text d -> [InnerNode Text d]
forall a. [a] -> a -> [a]
+:InnerNode Text d
forall a. Default a => InnerNode Text a
chPopDir
applyBidi (CSSInline _ (TextOptions -> Direction
textDirection -> Direction
DirLTR) BdIsolate) txt :: [InnerNode Text d]
txt =
    InnerNode Text d
forall a. Default a => InnerNode Text a
chLRIsolateInnerNode Text d -> [InnerNode Text d] -> [InnerNode Text d]
forall a. a -> [a] -> [a]
:[InnerNode Text d]
txt[InnerNode Text d] -> InnerNode Text d -> [InnerNode Text d]
forall a. [a] -> a -> [a]
+:InnerNode Text d
forall a. Default a => InnerNode Text a
chPopDirIsolate
applyBidi (CSSInline _ (TextOptions -> Direction
textDirection -> Direction
DirRTL) BdIsolate) txt :: [InnerNode Text d]
txt =
    InnerNode Text d
forall a. Default a => InnerNode Text a
chRLIsolateInnerNode Text d -> [InnerNode Text d] -> [InnerNode Text d]
forall a. a -> [a] -> [a]
:[InnerNode Text d]
txt[InnerNode Text d] -> InnerNode Text d -> [InnerNode Text d]
forall a. [a] -> a -> [a]
+:InnerNode Text d
forall a. Default a => InnerNode Text a
chPopDirIsolate
applyBidi (CSSInline _ (TextOptions -> Direction
textDirection -> Direction
DirLTR) BdOverride) txt :: [InnerNode Text d]
txt =
    InnerNode Text d
forall a. Default a => InnerNode Text a
chLROverrideInnerNode Text d -> [InnerNode Text d] -> [InnerNode Text d]
forall a. a -> [a] -> [a]
:[InnerNode Text d]
txt[InnerNode Text d] -> InnerNode Text d -> [InnerNode Text d]
forall a. [a] -> a -> [a]
+:InnerNode Text d
forall a. Default a => InnerNode Text a
chPopDir
applyBidi (CSSInline _ (TextOptions -> Direction
textDirection -> Direction
DirRTL) BdOverride) txt :: [InnerNode Text d]
txt =
    InnerNode Text d
forall a. Default a => InnerNode Text a
chRLOverrideInnerNode Text d -> [InnerNode Text d] -> [InnerNode Text d]
forall a. a -> [a] -> [a]
:[InnerNode Text d]
txt[InnerNode Text d] -> InnerNode Text d -> [InnerNode Text d]
forall a. [a] -> a -> [a]
+:InnerNode Text d
forall a. Default a => InnerNode Text a
chPopDir
applyBidi (CSSInline _ (TextOptions -> Direction
textDirection -> Direction
DirLTR) BdIsolateOverride) txt :: [InnerNode Text d]
txt =
    InnerNode Text d
forall a. Default a => InnerNode Text a
ch1stStrongIsolateInnerNode Text d -> [InnerNode Text d] -> [InnerNode Text d]
forall a. a -> [a] -> [a]
:InnerNode Text d
forall a. Default a => InnerNode Text a
chLROverrideInnerNode Text d -> [InnerNode Text d] -> [InnerNode Text d]
forall a. a -> [a] -> [a]
:[InnerNode Text d]
txt[InnerNode Text d] -> InnerNode Text d -> [InnerNode Text d]
forall a. [a] -> a -> [a]
+:InnerNode Text d
forall a. Default a => InnerNode Text a
chPopDir[InnerNode Text d] -> InnerNode Text d -> [InnerNode Text d]
forall a. [a] -> a -> [a]
+:InnerNode Text d
forall a. Default a => InnerNode Text a
chPopDirIsolate
applyBidi (CSSInline _ (TextOptions -> Direction
textDirection -> Direction
DirRTL) BdIsolateOverride) txt :: [InnerNode Text d]
txt =
    InnerNode Text d
forall a. Default a => InnerNode Text a
ch1stStrongIsolateInnerNode Text d -> [InnerNode Text d] -> [InnerNode Text d]
forall a. a -> [a] -> [a]
:InnerNode Text d
forall a. Default a => InnerNode Text a
chRLOverrideInnerNode Text d -> [InnerNode Text d] -> [InnerNode Text d]
forall a. a -> [a] -> [a]
:[InnerNode Text d]
txt[InnerNode Text d] -> InnerNode Text d -> [InnerNode Text d]
forall a. [a] -> a -> [a]
+:InnerNode Text d
forall a. Default a => InnerNode Text a
chPopDir[InnerNode Text d] -> InnerNode Text d -> [InnerNode Text d]
forall a. [a] -> a -> [a]
+:InnerNode Text d
forall a. Default a => InnerNode Text a
chPopDirIsolate
applyBidi (CSSInline _ _ BdPlainText) txt :: [InnerNode Text d]
txt =
    InnerNode Text d
forall a. Default a => InnerNode Text a
ch1stStrongIsolateInnerNode Text d -> [InnerNode Text d] -> [InnerNode Text d]
forall a. a -> [a] -> [a]
:[InnerNode Text d]
txt[InnerNode Text d] -> InnerNode Text d -> [InnerNode Text d]
forall a. [a] -> a -> [a]
+:InnerNode Text d
forall a. Default a => InnerNode Text a
chPopDirIsolate
applyBidi (CSSInline _ (TextOptions -> Direction
textDirection -> Direction
dir) _) txt :: [InnerNode Text d]
txt =
    String -> [InnerNode Text d] -> [InnerNode Text d]
forall a. String -> a -> a
trace ("Unexpected direction! " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Direction -> String
forall a. Show a => a -> String
show Direction
dir) [InnerNode Text d]
txt

a :: [a]
a +: :: [a] -> a -> [a]
+: b :: a
b = [a]
a [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a
b]

chLREmbed, chRLEmbed, chLROverride, chRLOverride, chPopDir,
    chLRIsolate, chRLIsolate, ch1stStrongIsolate, chPopDirIsolate :: Default a =>
        InnerNode Text a
chLREmbed :: InnerNode Text a
chLREmbed = Char -> InnerNode Text a
forall d. Default d => Char -> InnerNode Text d
leaf '\x202A'
chRLEmbed :: InnerNode Text a
chRLEmbed = Char -> InnerNode Text a
forall d. Default d => Char -> InnerNode Text d
leaf '\x202B'
chLROverride :: InnerNode Text a
chLROverride = Char -> InnerNode Text a
forall d. Default d => Char -> InnerNode Text d
leaf '\x202D'
chRLOverride :: InnerNode Text a
chRLOverride = Char -> InnerNode Text a
forall d. Default d => Char -> InnerNode Text d
leaf '\x202E'
chPopDir :: InnerNode Text a
chPopDir = Char -> InnerNode Text a
forall d. Default d => Char -> InnerNode Text d
leaf '\x202C'
chLRIsolate :: InnerNode Text a
chLRIsolate = Char -> InnerNode Text a
forall d. Default d => Char -> InnerNode Text d
leaf '\x2066'
chRLIsolate :: InnerNode Text a
chRLIsolate = Char -> InnerNode Text a
forall d. Default d => Char -> InnerNode Text d
leaf '\x2067'
ch1stStrongIsolate :: InnerNode Text a
ch1stStrongIsolate = Char -> InnerNode Text a
forall d. Default d => Char -> InnerNode Text d
leaf '\x2068'
chPopDirIsolate :: InnerNode Text a
chPopDirIsolate = Char -> InnerNode Text a
forall d. Default d => Char -> InnerNode Text d
leaf '\x2069'

leaf :: Char -> InnerNode Text d
leaf ch :: Char
ch = d -> Text -> InnerNode Text d
forall t d. d -> t -> InnerNode t d
TextSequence d
forall a. Default a => a
def (Text -> InnerNode Text d) -> Text -> InnerNode Text d
forall a b. (a -> b) -> a -> b
$ Char -> Text
Txt.singleton Char
ch

class Default a where
    def :: a