{-# 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
autoIdentifiersSpec :: forall (m :: * -> *) il bl.
(Monad m, IsBlock il bl, IsInline il, ToPlainText il) =>
SyntaxSpec m il bl
autoIdentifiersSpec = 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]
  }

-- Go through the node stack and add identifiers where they
-- are missing.
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
'>')
  ]