{-# 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 qualified Text.Emoji as Emoji
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 = SyntaxSpec m il bl
forall a. Monoid a => a
mempty
  { syntaxFinalParsers = [addAutoIdentifiers 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 = SyntaxSpec m il bl
forall a. Monoid a => a
mempty
  { syntaxFinalParsers = [addAutoIdentifiers 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 <- BPState m il bl -> [BlockNode m il bl]
forall (m :: * -> *) il bl. BPState m il bl -> [BlockNode m il bl]
nodeStack (BPState m il bl -> [BlockNode m il bl])
-> ParsecT [Tok] (BPState m il bl) m (BPState m il bl)
-> ParsecT [Tok] (BPState m il bl) m [BlockNode m il bl]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT [Tok] (BPState m il bl) m (BPState m il bl)
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
  [BlockNode m il bl]
nodes' <- (BlockNode m il bl
 -> ParsecT [Tok] (BPState m il bl) m (BlockNode m il bl))
-> [BlockNode m il bl]
-> ParsecT [Tok] (BPState m il bl) m [BlockNode m il bl]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM ((BlockData m il bl
 -> ParsecT [Tok] (BPState m il bl) m (BlockData m il bl))
-> BlockNode m il bl
-> ParsecT [Tok] (BPState m il bl) m (BlockNode m il bl)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Tree a -> f (Tree b)
traverse ((BlockData m il bl
  -> ParsecT [Tok] (BPState m il bl) m (BlockData m il bl))
 -> BlockNode m il bl
 -> ParsecT [Tok] (BPState m il bl) m (BlockNode m il bl))
-> (BlockData m il bl
    -> ParsecT [Tok] (BPState m il bl) m (BlockData m il bl))
-> BlockNode m il bl
-> ParsecT [Tok] (BPState m il bl) m (BlockNode m il bl)
forall a b. (a -> b) -> a -> b
$ Bool
-> BlockData m il bl
-> ParsecT [Tok] (BPState m il bl) m (BlockData m il bl)
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
  (BPState m il bl -> BPState m il bl)
-> ParsecT [Tok] (BPState m il bl) m ()
forall (m :: * -> *) u s. Monad m => (u -> u) -> ParsecT s u m ()
updateState ((BPState m il bl -> BPState m il bl)
 -> ParsecT [Tok] (BPState m il bl) m ())
-> (BPState m il bl -> BPState m il bl)
-> ParsecT [Tok] (BPState m il bl) m ()
forall a b. (a -> b) -> a -> b
$ \BPState m il bl
st -> BPState m il bl
st{ nodeStack = nodes' }
  bl -> BlockParser m il bl bl
forall a. a -> ParsecT [Tok] (BPState m il bl) m a
forall (m :: * -> *) a. Monad m => a -> m a
return (bl -> BlockParser m il bl bl) -> bl -> BlockParser m il bl bl
forall a b. (a -> b) -> a -> b
$! bl
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
  | BlockSpec m il bl -> Text
forall (m :: * -> *) il bl. BlockSpec m il bl -> Text
blockType (BlockData m il bl -> BlockSpec m il bl
forall (m :: * -> *) il bl. BlockData m il bl -> BlockSpec m il bl
blockSpec BlockData m il bl
bd) Text -> [Text] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Text
"ATXHeading", Text
"SetextHeading"] =
    case Text -> [(Text, Text)] -> Maybe Text
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup Text
"id" (BlockData m il bl -> [(Text, Text)]
forall (m :: * -> *) il bl. BlockData m il bl -> [(Text, Text)]
blockAttributes BlockData m il bl
bd) of
      Maybe Text
Nothing  -> do
        il
contents <- [Tok] -> BlockParser m il bl il
forall (m :: * -> *) il bl.
Monad m =>
[Tok] -> BlockParser m il bl il
runInlineParser
                    ([Tok] -> [Tok]
removeIndent ([Tok] -> [Tok])
-> (BlockData m il bl -> [Tok]) -> BlockData m il bl -> [Tok]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[Tok]] -> [Tok]
forall a. Monoid a => [a] -> a
mconcat ([[Tok]] -> [Tok])
-> (BlockData m il bl -> [[Tok]]) -> BlockData m il bl -> [Tok]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[Tok]] -> [[Tok]]
forall a. [a] -> [a]
reverse ([[Tok]] -> [[Tok]])
-> (BlockData m il bl -> [[Tok]]) -> BlockData m il bl -> [[Tok]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BlockData m il bl -> [[Tok]]
forall (m :: * -> *) il bl. BlockData m il bl -> [[Tok]]
blockLines (BlockData m il bl -> [Tok]) -> BlockData m il bl -> [Tok]
forall a b. (a -> b) -> a -> b
$ BlockData m il bl
bd)
        let ident :: Text
ident = Bool -> Text -> Text
makeIdentifier Bool
ascii
                     ((Text -> [Text] -> Text) -> Text -> Text
Emoji.replaceEmojis Text -> [Text] -> Text
emojiToAlias (Text -> Text) -> Text -> Text
forall a b. (a -> b) -> a -> b
$ il -> Text
forall a. ToPlainText a => a -> Text
toPlainText il
contents)
        Map Text Dynamic
counterMap <- BPState m il bl -> Map Text Dynamic
forall (m :: * -> *) il bl. BPState m il bl -> Map Text Dynamic
counters (BPState m il bl -> Map Text Dynamic)
-> ParsecT [Tok] (BPState m il bl) m (BPState m il bl)
-> ParsecT [Tok] (BPState m il bl) m (Map Text Dynamic)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT [Tok] (BPState m il bl) m (BPState m il bl)
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
        let key :: Text
key = Text
"identifier:" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
ident
        Int
cnt <- case Text -> Map Text Dynamic -> Maybe Dynamic
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup Text
key Map Text Dynamic
counterMap of
                    Maybe Dynamic
Nothing -> Int -> ParsecT [Tok] (BPState m il bl) m Int
forall a. a -> ParsecT [Tok] (BPState m il bl) m a
forall (m :: * -> *) a. Monad m => a -> m a
return Int
0
                    Just Dynamic
x  -> Int -> ParsecT [Tok] (BPState m il bl) m Int
forall a. a -> ParsecT [Tok] (BPState m il bl) m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Int -> ParsecT [Tok] (BPState m il bl) m Int)
-> Int -> ParsecT [Tok] (BPState m il bl) m Int
forall a b. (a -> b) -> a -> b
$! (Dynamic -> Int -> Int
forall a. Typeable a => Dynamic -> a -> a
fromDyn Dynamic
x (Int
0 :: Int) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
        let ident' :: Text
ident' = if Int
cnt Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0
                        then Text
ident
                        else Text
ident Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"-" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (Int -> String
forall a. Show a => a -> String
show Int
cnt)
        (BPState m il bl -> BPState m il bl)
-> ParsecT [Tok] (BPState m il bl) m ()
forall (m :: * -> *) u s. Monad m => (u -> u) -> ParsecT s u m ()
updateState ((BPState m il bl -> BPState m il bl)
 -> ParsecT [Tok] (BPState m il bl) m ())
-> (BPState m il bl -> BPState m il bl)
-> ParsecT [Tok] (BPState m il bl) m ()
forall a b. (a -> b) -> a -> b
$ \BPState m il bl
st ->
          BPState m il bl
st{ counters = M.insert key (toDyn cnt) counterMap }
        BlockData m il bl -> BlockParser m il bl (BlockData m il bl)
forall a. a -> ParsecT [Tok] (BPState m il bl) m a
forall (m :: * -> *) a. Monad m => a -> m a
return (BlockData m il bl -> BlockParser m il bl (BlockData m il bl))
-> BlockData m il bl -> BlockParser m il bl (BlockData m il bl)
forall a b. (a -> b) -> a -> b
$! BlockData m il bl
bd{ blockAttributes = ("id",ident') : blockAttributes bd }
      Just Text
_ -> BlockData m il bl -> BlockParser m il bl (BlockData m il bl)
forall a. a -> ParsecT [Tok] (BPState m il bl) m a
forall (m :: * -> *) a. Monad m => a -> m a
return (BlockData m il bl -> BlockParser m il bl (BlockData m il bl))
-> BlockData m il bl -> BlockParser m il bl (BlockData m il bl)
forall a b. (a -> b) -> a -> b
$! BlockData m il bl
bd
  | Bool
otherwise = BlockData m il bl -> BlockParser m il bl (BlockData m il bl)
forall a. a -> ParsecT [Tok] (BPState m il bl) m a
forall (m :: * -> *) a. Monad m => a -> m a
return (BlockData m il bl -> BlockParser m il bl (BlockData m il bl))
-> BlockData m il bl -> BlockParser m il bl (BlockData m il bl)
forall a b. (a -> b) -> a -> b
$! BlockData m il bl
bd

emojiToAlias :: T.Text -> [T.Text] -> T.Text
emojiToAlias :: Text -> [Text] -> Text
emojiToAlias Text
t [] = Text
t
emojiToAlias Text
_ (Text
a:[Text]
_) = Text
a

makeIdentifier :: Bool -> T.Text -> T.Text
makeIdentifier :: Bool -> Text -> Text
makeIdentifier Bool
ascii = Text -> Text
toIdent (Text -> Text) -> (Text -> Text) -> Text -> Text
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 GeneralCategory -> GeneralCategory -> Bool
forall a. Eq a => a -> a -> Bool
== GeneralCategory
ConnectorPunctuation
                    = Char -> Text
fromchar Char
c
        | Bool
otherwise = Text
forall a. Monoid a => a
mempty
    fromchar :: Char -> Text
fromchar Char
c
      | Bool
ascii =
        if Char -> Bool
isAscii Char
c
           then Char -> Text
T.singleton Char
c
           else case Char -> Map Char Char -> Maybe Char
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup Char
c Map Char Char
asciiMap of
                       Maybe Char
Nothing -> Text
forall a. Monoid a => a
mempty
                       Just Char
d -> Char -> Text
T.singleton Char
d
      | Bool
otherwise = Char -> Text
T.singleton Char
c

asciiMap :: M.Map Char Char
asciiMap :: Map Char Char
asciiMap = [(Char, Char)] -> Map Char Char
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
'>')
  ]