{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Commonmark.Extensions.AutoIdentifiers
( autoIdentifiersSpec
, autoIdentifiersAsciiSpec
)
where
import Commonmark.Types
import Commonmark.Syntax
import Commonmark.Blocks
import Data.Char (isSpace, isAlphaNum, isAscii, isMark,
generalCategory, GeneralCategory(ConnectorPunctuation))
import Data.Dynamic
import qualified Data.Map as M
import qualified Data.Text as T
import Text.Parsec
autoIdentifiersSpec :: (Monad m, IsBlock il bl, IsInline il, ToPlainText il)
=> SyntaxSpec m il bl
= forall a. Monoid a => a
mempty
{ syntaxFinalParsers :: [BlockParser m il bl bl]
syntaxFinalParsers = [forall (m :: * -> *) il bl.
(Monad m, IsBlock il bl, IsInline il, ToPlainText il) =>
Bool -> BlockParser m il bl bl
addAutoIdentifiers Bool
False]
}
autoIdentifiersAsciiSpec
:: (Monad m, IsBlock il bl, IsInline il, ToPlainText il)
=> SyntaxSpec m il bl
autoIdentifiersAsciiSpec :: forall (m :: * -> *) il bl.
(Monad m, IsBlock il bl, IsInline il, ToPlainText il) =>
SyntaxSpec m il bl
autoIdentifiersAsciiSpec = forall a. Monoid a => a
mempty
{ syntaxFinalParsers :: [BlockParser m il bl bl]
syntaxFinalParsers = [forall (m :: * -> *) il bl.
(Monad m, IsBlock il bl, IsInline il, ToPlainText il) =>
Bool -> BlockParser m il bl bl
addAutoIdentifiers Bool
True]
}
addAutoIdentifiers :: (Monad m, IsBlock il bl, IsInline il, ToPlainText il)
=> Bool -> BlockParser m il bl bl
addAutoIdentifiers :: forall (m :: * -> *) il bl.
(Monad m, IsBlock il bl, IsInline il, ToPlainText il) =>
Bool -> BlockParser m il bl bl
addAutoIdentifiers Bool
ascii = do
[BlockNode m il bl]
nodes <- forall (m :: * -> *) il bl. BPState m il bl -> [BlockNode m il bl]
nodeStack forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
[BlockNode m il bl]
nodes' <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) il bl.
(Monad m, IsBlock il bl, IsInline il, ToPlainText il) =>
Bool
-> BlockData m il bl -> BlockParser m il bl (BlockData m il bl)
addId Bool
ascii) [BlockNode m il bl]
nodes
forall (m :: * -> *) u s. Monad m => (u -> u) -> ParsecT s u m ()
updateState forall a b. (a -> b) -> a -> b
$ \BPState m il bl
st -> BPState m il bl
st{ nodeStack :: [BlockNode m il bl]
nodeStack = [BlockNode m il bl]
nodes' }
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$! forall a. Monoid a => a
mempty
addId :: (Monad m, IsBlock il bl, IsInline il, ToPlainText il)
=> Bool -> BlockData m il bl -> BlockParser m il bl (BlockData m il bl)
addId :: forall (m :: * -> *) il bl.
(Monad m, IsBlock il bl, IsInline il, ToPlainText il) =>
Bool
-> BlockData m il bl -> BlockParser m il bl (BlockData m il bl)
addId Bool
ascii BlockData m il bl
bd
| forall (m :: * -> *) il bl. BlockSpec m il bl -> Text
blockType (forall (m :: * -> *) il bl. BlockData m il bl -> BlockSpec m il bl
blockSpec BlockData m il bl
bd) forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Text
"ATXHeading", Text
"SetextHeading"] =
case forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup Text
"id" (forall (m :: * -> *) il bl. BlockData m il bl -> Attributes
blockAttributes BlockData m il bl
bd) of
Maybe Text
Nothing -> do
il
contents <- forall (m :: * -> *) il bl.
Monad m =>
[Tok] -> BlockParser m il bl il
runInlineParser
([Tok] -> [Tok]
removeIndent forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Monoid a => [a] -> a
mconcat forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. [a] -> [a]
reverse forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) il bl. BlockData m il bl -> [[Tok]]
blockLines forall a b. (a -> b) -> a -> b
$ BlockData m il bl
bd)
let ident :: Text
ident = Bool -> Text -> Text
makeIdentifier Bool
ascii (forall a. ToPlainText a => a -> Text
toPlainText il
contents)
Map Text Dynamic
counterMap <- forall (m :: * -> *) il bl. BPState m il bl -> Map Text Dynamic
counters forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
let key :: Text
key = Text
"identifier:" forall a. Semigroup a => a -> a -> a
<> Text
ident
Int
cnt <- case forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup Text
key Map Text Dynamic
counterMap of
Maybe Dynamic
Nothing -> forall (m :: * -> *) a. Monad m => a -> m a
return Int
0
Just Dynamic
x -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$! (forall a. Typeable a => Dynamic -> a -> a
fromDyn Dynamic
x (Int
0 :: Int) forall a. Num a => a -> a -> a
+ Int
1)
let ident' :: Text
ident' = if Int
cnt forall a. Eq a => a -> a -> Bool
== Int
0
then Text
ident
else Text
ident forall a. Semigroup a => a -> a -> a
<> Text
"-" forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (forall a. Show a => a -> String
show Int
cnt)
forall (m :: * -> *) u s. Monad m => (u -> u) -> ParsecT s u m ()
updateState forall a b. (a -> b) -> a -> b
$ \BPState m il bl
st ->
BPState m il bl
st{ counters :: Map Text Dynamic
counters = forall k a. Ord k => k -> a -> Map k a -> Map k a
M.insert Text
key (forall a. Typeable a => a -> Dynamic
toDyn Int
cnt) Map Text Dynamic
counterMap }
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$! BlockData m il bl
bd{ blockAttributes :: Attributes
blockAttributes = (Text
"id",Text
ident') forall a. a -> [a] -> [a]
: forall (m :: * -> *) il bl. BlockData m il bl -> Attributes
blockAttributes BlockData m il bl
bd }
Just Text
_ -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$! BlockData m il bl
bd
| Bool
otherwise = forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$! BlockData m il bl
bd
makeIdentifier :: Bool -> T.Text -> T.Text
makeIdentifier :: Bool -> Text -> Text
makeIdentifier Bool
ascii = Text -> Text
toIdent forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text
T.toLower
where
toIdent :: Text -> Text
toIdent = (Char -> Text) -> Text -> Text
T.concatMap Char -> Text
f
f :: Char -> Text
f Char
'-' = Text
"-"
f Char
'_' = Text
"_"
f Char
c | Char -> Bool
isSpace Char
c = Text
"-"
f Char
c | Char -> Bool
isAlphaNum Char
c Bool -> Bool -> Bool
|| Char -> Bool
isMark Char
c Bool -> Bool -> Bool
||
Char -> GeneralCategory
generalCategory Char
c forall a. Eq a => a -> a -> Bool
== GeneralCategory
ConnectorPunctuation
= Char -> Text
fromchar Char
c
| Bool
otherwise = forall a. Monoid a => a
mempty
fromchar :: Char -> Text
fromchar Char
c
| Bool
ascii
, Bool -> Bool
not (Char -> Bool
isAscii Char
c) = forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty Char -> Text
T.singleton forall a b. (a -> b) -> a -> b
$ forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup Char
c Map Char Char
asciiMap
| Bool
otherwise = Char -> Text
T.singleton Char
c
asciiMap :: M.Map Char Char
asciiMap :: Map Char Char
asciiMap = forall k a. Ord k => [(k, a)] -> Map k a
M.fromList
[(Char
'\192',Char
'A')
,(Char
'\193',Char
'A')
,(Char
'\194',Char
'A')
,(Char
'\195',Char
'A')
,(Char
'\196',Char
'A')
,(Char
'\197',Char
'A')
,(Char
'\199',Char
'C')
,(Char
'\200',Char
'E')
,(Char
'\201',Char
'E')
,(Char
'\202',Char
'E')
,(Char
'\203',Char
'E')
,(Char
'\204',Char
'I')
,(Char
'\205',Char
'I')
,(Char
'\206',Char
'I')
,(Char
'\207',Char
'I')
,(Char
'\209',Char
'N')
,(Char
'\210',Char
'O')
,(Char
'\211',Char
'O')
,(Char
'\212',Char
'O')
,(Char
'\213',Char
'O')
,(Char
'\214',Char
'O')
,(Char
'\217',Char
'U')
,(Char
'\218',Char
'U')
,(Char
'\219',Char
'U')
,(Char
'\220',Char
'U')
,(Char
'\221',Char
'Y')
,(Char
'\224',Char
'a')
,(Char
'\225',Char
'a')
,(Char
'\226',Char
'a')
,(Char
'\227',Char
'a')
,(Char
'\228',Char
'a')
,(Char
'\229',Char
'a')
,(Char
'\231',Char
'c')
,(Char
'\232',Char
'e')
,(Char
'\233',Char
'e')
,(Char
'\234',Char
'e')
,(Char
'\235',Char
'e')
,(Char
'\236',Char
'i')
,(Char
'\237',Char
'i')
,(Char
'\238',Char
'i')
,(Char
'\239',Char
'i')
,(Char
'\241',Char
'n')
,(Char
'\242',Char
'o')
,(Char
'\243',Char
'o')
,(Char
'\244',Char
'o')
,(Char
'\245',Char
'o')
,(Char
'\246',Char
'o')
,(Char
'\249',Char
'u')
,(Char
'\250',Char
'u')
,(Char
'\251',Char
'u')
,(Char
'\252',Char
'u')
,(Char
'\253',Char
'y')
,(Char
'\255',Char
'y')
,(Char
'\256',Char
'A')
,(Char
'\257',Char
'a')
,(Char
'\258',Char
'A')
,(Char
'\259',Char
'a')
,(Char
'\260',Char
'A')
,(Char
'\261',Char
'a')
,(Char
'\262',Char
'C')
,(Char
'\263',Char
'c')
,(Char
'\264',Char
'C')
,(Char
'\265',Char
'c')
,(Char
'\266',Char
'C')
,(Char
'\267',Char
'c')
,(Char
'\268',Char
'C')
,(Char
'\269',Char
'c')
,(Char
'\270',Char
'D')
,(Char
'\271',Char
'd')
,(Char
'\274',Char
'E')
,(Char
'\275',Char
'e')
,(Char
'\276',Char
'E')
,(Char
'\277',Char
'e')
,(Char
'\278',Char
'E')
,(Char
'\279',Char
'e')
,(Char
'\280',Char
'E')
,(Char
'\281',Char
'e')
,(Char
'\282',Char
'E')
,(Char
'\283',Char
'e')
,(Char
'\284',Char
'G')
,(Char
'\285',Char
'g')
,(Char
'\286',Char
'G')
,(Char
'\287',Char
'g')
,(Char
'\288',Char
'G')
,(Char
'\289',Char
'g')
,(Char
'\290',Char
'G')
,(Char
'\291',Char
'g')
,(Char
'\292',Char
'H')
,(Char
'\293',Char
'h')
,(Char
'\296',Char
'I')
,(Char
'\297',Char
'i')
,(Char
'\298',Char
'I')
,(Char
'\299',Char
'i')
,(Char
'\300',Char
'I')
,(Char
'\301',Char
'i')
,(Char
'\302',Char
'I')
,(Char
'\303',Char
'i')
,(Char
'\304',Char
'I')
,(Char
'\305',Char
'i')
,(Char
'\308',Char
'J')
,(Char
'\309',Char
'j')
,(Char
'\310',Char
'K')
,(Char
'\311',Char
'k')
,(Char
'\313',Char
'L')
,(Char
'\314',Char
'l')
,(Char
'\315',Char
'L')
,(Char
'\316',Char
'l')
,(Char
'\317',Char
'L')
,(Char
'\318',Char
'l')
,(Char
'\323',Char
'N')
,(Char
'\324',Char
'n')
,(Char
'\325',Char
'N')
,(Char
'\326',Char
'n')
,(Char
'\327',Char
'N')
,(Char
'\328',Char
'n')
,(Char
'\332',Char
'O')
,(Char
'\333',Char
'o')
,(Char
'\334',Char
'O')
,(Char
'\335',Char
'o')
,(Char
'\336',Char
'O')
,(Char
'\337',Char
'o')
,(Char
'\340',Char
'R')
,(Char
'\341',Char
'r')
,(Char
'\342',Char
'R')
,(Char
'\343',Char
'r')
,(Char
'\344',Char
'R')
,(Char
'\345',Char
'r')
,(Char
'\346',Char
'S')
,(Char
'\347',Char
's')
,(Char
'\348',Char
'S')
,(Char
'\349',Char
's')
,(Char
'\350',Char
'S')
,(Char
'\351',Char
's')
,(Char
'\352',Char
'S')
,(Char
'\353',Char
's')
,(Char
'\354',Char
'T')
,(Char
'\355',Char
't')
,(Char
'\356',Char
'T')
,(Char
'\357',Char
't')
,(Char
'\360',Char
'U')
,(Char
'\361',Char
'u')
,(Char
'\362',Char
'U')
,(Char
'\363',Char
'u')
,(Char
'\364',Char
'U')
,(Char
'\365',Char
'u')
,(Char
'\366',Char
'U')
,(Char
'\367',Char
'u')
,(Char
'\368',Char
'U')
,(Char
'\369',Char
'u')
,(Char
'\370',Char
'U')
,(Char
'\371',Char
'u')
,(Char
'\372',Char
'W')
,(Char
'\373',Char
'w')
,(Char
'\374',Char
'Y')
,(Char
'\375',Char
'y')
,(Char
'\376',Char
'Y')
,(Char
'\377',Char
'Z')
,(Char
'\378',Char
'z')
,(Char
'\379',Char
'Z')
,(Char
'\380',Char
'z')
,(Char
'\381',Char
'Z')
,(Char
'\382',Char
'z')
,(Char
'\416',Char
'O')
,(Char
'\417',Char
'o')
,(Char
'\431',Char
'U')
,(Char
'\432',Char
'u')
,(Char
'\461',Char
'A')
,(Char
'\462',Char
'a')
,(Char
'\463',Char
'I')
,(Char
'\464',Char
'i')
,(Char
'\465',Char
'O')
,(Char
'\466',Char
'o')
,(Char
'\467',Char
'U')
,(Char
'\468',Char
'u')
,(Char
'\486',Char
'G')
,(Char
'\487',Char
'g')
,(Char
'\488',Char
'K')
,(Char
'\489',Char
'k')
,(Char
'\490',Char
'O')
,(Char
'\491',Char
'o')
,(Char
'\496',Char
'j')
,(Char
'\500',Char
'G')
,(Char
'\501',Char
'g')
,(Char
'\504',Char
'N')
,(Char
'\505',Char
'n')
,(Char
'\512',Char
'A')
,(Char
'\513',Char
'a')
,(Char
'\514',Char
'A')
,(Char
'\515',Char
'a')
,(Char
'\516',Char
'E')
,(Char
'\517',Char
'e')
,(Char
'\518',Char
'E')
,(Char
'\519',Char
'e')
,(Char
'\520',Char
'I')
,(Char
'\521',Char
'i')
,(Char
'\522',Char
'I')
,(Char
'\523',Char
'i')
,(Char
'\524',Char
'O')
,(Char
'\525',Char
'o')
,(Char
'\526',Char
'O')
,(Char
'\527',Char
'o')
,(Char
'\528',Char
'R')
,(Char
'\529',Char
'r')
,(Char
'\530',Char
'R')
,(Char
'\531',Char
'r')
,(Char
'\532',Char
'U')
,(Char
'\533',Char
'u')
,(Char
'\534',Char
'U')
,(Char
'\535',Char
'u')
,(Char
'\536',Char
'S')
,(Char
'\537',Char
's')
,(Char
'\538',Char
'T')
,(Char
'\539',Char
't')
,(Char
'\542',Char
'H')
,(Char
'\543',Char
'h')
,(Char
'\550',Char
'A')
,(Char
'\551',Char
'a')
,(Char
'\552',Char
'E')
,(Char
'\553',Char
'e')
,(Char
'\558',Char
'O')
,(Char
'\559',Char
'o')
,(Char
'\562',Char
'Y')
,(Char
'\563',Char
'y')
,(Char
'\894',Char
';')
,(Char
'\7680',Char
'A')
,(Char
'\7681',Char
'a')
,(Char
'\7682',Char
'B')
,(Char
'\7683',Char
'b')
,(Char
'\7684',Char
'B')
,(Char
'\7685',Char
'b')
,(Char
'\7686',Char
'B')
,(Char
'\7687',Char
'b')
,(Char
'\7690',Char
'D')
,(Char
'\7691',Char
'd')
,(Char
'\7692',Char
'D')
,(Char
'\7693',Char
'd')
,(Char
'\7694',Char
'D')
,(Char
'\7695',Char
'd')
,(Char
'\7696',Char
'D')
,(Char
'\7697',Char
'd')
,(Char
'\7698',Char
'D')
,(Char
'\7699',Char
'd')
,(Char
'\7704',Char
'E')
,(Char
'\7705',Char
'e')
,(Char
'\7706',Char
'E')
,(Char
'\7707',Char
'e')
,(Char
'\7710',Char
'F')
,(Char
'\7711',Char
'f')
,(Char
'\7712',Char
'G')
,(Char
'\7713',Char
'g')
,(Char
'\7714',Char
'H')
,(Char
'\7715',Char
'h')
,(Char
'\7716',Char
'H')
,(Char
'\7717',Char
'h')
,(Char
'\7718',Char
'H')
,(Char
'\7719',Char
'h')
,(Char
'\7720',Char
'H')
,(Char
'\7721',Char
'h')
,(Char
'\7722',Char
'H')
,(Char
'\7723',Char
'h')
,(Char
'\7724',Char
'I')
,(Char
'\7725',Char
'i')
,(Char
'\7728',Char
'K')
,(Char
'\7729',Char
'k')
,(Char
'\7730',Char
'K')
,(Char
'\7731',Char
'k')
,(Char
'\7732',Char
'K')
,(Char
'\7733',Char
'k')
,(Char
'\7734',Char
'L')
,(Char
'\7735',Char
'l')
,(Char
'\7738',Char
'L')
,(Char
'\7739',Char
'l')
,(Char
'\7740',Char
'L')
,(Char
'\7741',Char
'l')
,(Char
'\7742',Char
'M')
,(Char
'\7743',Char
'm')
,(Char
'\7744',Char
'M')
,(Char
'\7745',Char
'm')
,(Char
'\7746',Char
'M')
,(Char
'\7747',Char
'm')
,(Char
'\7748',Char
'N')
,(Char
'\7749',Char
'n')
,(Char
'\7750',Char
'N')
,(Char
'\7751',Char
'n')
,(Char
'\7752',Char
'N')
,(Char
'\7753',Char
'n')
,(Char
'\7754',Char
'N')
,(Char
'\7755',Char
'n')
,(Char
'\7764',Char
'P')
,(Char
'\7765',Char
'p')
,(Char
'\7766',Char
'P')
,(Char
'\7767',Char
'p')
,(Char
'\7768',Char
'R')
,(Char
'\7769',Char
'r')
,(Char
'\7770',Char
'R')
,(Char
'\7771',Char
'r')
,(Char
'\7774',Char
'R')
,(Char
'\7775',Char
'r')
,(Char
'\7776',Char
'S')
,(Char
'\7777',Char
's')
,(Char
'\7778',Char
'S')
,(Char
'\7779',Char
's')
,(Char
'\7786',Char
'T')
,(Char
'\7787',Char
't')
,(Char
'\7788',Char
'T')
,(Char
'\7789',Char
't')
,(Char
'\7790',Char
'T')
,(Char
'\7791',Char
't')
,(Char
'\7792',Char
'T')
,(Char
'\7793',Char
't')
,(Char
'\7794',Char
'U')
,(Char
'\7795',Char
'u')
,(Char
'\7796',Char
'U')
,(Char
'\7797',Char
'u')
,(Char
'\7798',Char
'U')
,(Char
'\7799',Char
'u')
,(Char
'\7804',Char
'V')
,(Char
'\7805',Char
'v')
,(Char
'\7806',Char
'V')
,(Char
'\7807',Char
'v')
,(Char
'\7808',Char
'W')
,(Char
'\7809',Char
'w')
,(Char
'\7810',Char
'W')
,(Char
'\7811',Char
'w')
,(Char
'\7812',Char
'W')
,(Char
'\7813',Char
'w')
,(Char
'\7814',Char
'W')
,(Char
'\7815',Char
'w')
,(Char
'\7816',Char
'W')
,(Char
'\7817',Char
'w')
,(Char
'\7818',Char
'X')
,(Char
'\7819',Char
'x')
,(Char
'\7820',Char
'X')
,(Char
'\7821',Char
'x')
,(Char
'\7822',Char
'Y')
,(Char
'\7823',Char
'y')
,(Char
'\7824',Char
'Z')
,(Char
'\7825',Char
'z')
,(Char
'\7826',Char
'Z')
,(Char
'\7827',Char
'z')
,(Char
'\7828',Char
'Z')
,(Char
'\7829',Char
'z')
,(Char
'\7830',Char
'h')
,(Char
'\7831',Char
't')
,(Char
'\7832',Char
'w')
,(Char
'\7833',Char
'y')
,(Char
'\7840',Char
'A')
,(Char
'\7841',Char
'a')
,(Char
'\7842',Char
'A')
,(Char
'\7843',Char
'a')
,(Char
'\7864',Char
'E')
,(Char
'\7865',Char
'e')
,(Char
'\7866',Char
'E')
,(Char
'\7867',Char
'e')
,(Char
'\7868',Char
'E')
,(Char
'\7869',Char
'e')
,(Char
'\7880',Char
'I')
,(Char
'\7881',Char
'i')
,(Char
'\7882',Char
'I')
,(Char
'\7883',Char
'i')
,(Char
'\7884',Char
'O')
,(Char
'\7885',Char
'o')
,(Char
'\7886',Char
'O')
,(Char
'\7887',Char
'o')
,(Char
'\7908',Char
'U')
,(Char
'\7909',Char
'u')
,(Char
'\7910',Char
'U')
,(Char
'\7911',Char
'u')
,(Char
'\7922',Char
'Y')
,(Char
'\7923',Char
'y')
,(Char
'\7924',Char
'Y')
,(Char
'\7925',Char
'y')
,(Char
'\7926',Char
'Y')
,(Char
'\7927',Char
'y')
,(Char
'\7928',Char
'Y')
,(Char
'\7929',Char
'y')
,(Char
'\8175',Char
'`')
,(Char
'\8490',Char
'K')
,(Char
'\8800',Char
'=')
,(Char
'\8814',Char
'<')
,(Char
'\8815',Char
'>')
]