{-# 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
= 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]
}
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 (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
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
'>')
]