{-# LANGUAGE CPP #-}
{-# 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
#if !MIN_VERSION_base(4,11,0)
import Data.Semigroup
#endif

autoIdentifiersSpec :: (Monad m, IsBlock il bl, IsInline il, ToPlainText il)
                    => SyntaxSpec m il bl
autoIdentifiersSpec :: SyntaxSpec m il bl
autoIdentifiersSpec = SyntaxSpec m il bl
forall a. Monoid a => a
mempty
  { syntaxFinalParsers :: [BlockParser m il bl bl]
syntaxFinalParsers = [Bool -> BlockParser m il bl bl
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 :: SyntaxSpec m il bl
autoIdentifiersAsciiSpec = SyntaxSpec m il bl
forall a. Monoid a => a
mempty
  { syntaxFinalParsers :: [BlockParser m il bl bl]
syntaxFinalParsers = [Bool -> BlockParser m il bl bl
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 :: 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)
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)
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 :: [BlockNode m il bl]
nodeStack = [BlockNode m il bl]
nodes' }
  bl -> BlockParser m il bl bl
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 :: 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 (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 (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 (m :: * -> *) a. Monad m => a -> m a
return Int
0
                    Just Dynamic
x  -> Int -> ParsecT [Tok] (BPState m il bl) m Int
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 :: Map Text Dynamic
counters = Text -> Dynamic -> Map Text Dynamic -> Map Text Dynamic
forall k a. Ord k => k -> a -> Map k a -> Map k a
M.insert Text
key (Int -> Dynamic
forall a. Typeable a => a -> Dynamic
toDyn Int
cnt) Map Text Dynamic
counterMap }
        BlockData m il bl -> BlockParser m il bl (BlockData m il bl)
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 :: [(Text, Text)]
blockAttributes = (Text
"id",Text
ident') (Text, Text) -> [(Text, Text)] -> [(Text, Text)]
forall a. a -> [a] -> [a]
: BlockData m il bl -> [(Text, Text)]
forall (m :: * -> *) il bl. BlockData m il bl -> [(Text, Text)]
blockAttributes BlockData m il bl
bd }
      Just Text
_ -> BlockData m il bl -> BlockParser m il bl (BlockData m il bl)
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 (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

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
      , Bool -> Bool
not (Char -> Bool
isAscii Char
c) = Text -> (Char -> Text) -> Maybe Char -> Text
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Text
forall a. Monoid a => a
mempty Char -> Text
T.singleton (Maybe Char -> Text) -> Maybe Char -> Text
forall a b. (a -> b) -> a -> b
$ 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
      | 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
'>')
  ]