{-# LANGUAGE OverloadedStrings #-}
{- |
   Module      : Text.Pandoc.Readers.LaTeX.Lang
   Copyright   : Copyright (C) 2018-2022 John MacFarlane
   License     : GNU GPL, version 2 or above

   Maintainer  : John MacFarlane <jgm@berkeley.edu>
   Stability   : alpha
   Portability : portable

Functions for parsing polyglossia and babel language specifiers to
BCP47 'Lang'.
-}
module Text.Pandoc.Readers.LaTeX.Lang
  ( setDefaultLanguage
  , polyglossiaLangToBCP47
  , babelLangToBCP47
  , enquoteCommands
  , inlineLanguageCommands
  )
where
import qualified Data.Map as M
import Data.Text (Text)
import qualified Data.Text as T
import Text.Pandoc.Shared (extractSpaces)
import Text.Collate.Lang (Lang(..), renderLang)
import Text.Pandoc.Class (PandocMonad(..), setTranslations)
import Text.Pandoc.Readers.LaTeX.Parsing
import Text.Pandoc.Parsing (updateState, option, getState, QuoteContext(..),
                            withQuoteContext)
import Text.Pandoc.Builder (Blocks, Inlines, setMeta, str, spanWith,
                            singleQuoted, doubleQuoted)

enquote :: PandocMonad m
        => LP m Inlines
        -> Bool -> Maybe Text -> LP m Inlines
enquote :: LP m Inlines -> Bool -> Maybe Text -> LP m Inlines
enquote tok :: LP m Inlines
tok starred :: Bool
starred mblang :: Maybe Text
mblang = do
  LP m ()
forall (m :: * -> *). PandocMonad m => LP m ()
skipopts
  let lang :: Maybe Lang
lang = Maybe Text
mblang Maybe Text -> (Text -> Maybe Lang) -> Maybe Lang
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Text -> Maybe Lang
babelLangToBCP47
  let langspan :: Inlines -> Inlines
langspan = case Maybe Lang
lang of
                      Nothing -> Inlines -> Inlines
forall a. a -> a
id
                      Just l :: Lang
l  -> Attr -> Inlines -> Inlines
spanWith ("",[],[("lang", Lang -> Text
renderLang Lang
l)])
  QuoteContext
quoteContext <- LaTeXState -> QuoteContext
sQuoteContext (LaTeXState -> QuoteContext)
-> ParsecT [Tok] LaTeXState m LaTeXState
-> ParsecT [Tok] LaTeXState m QuoteContext
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT [Tok] LaTeXState m LaTeXState
forall (m :: * -> *) s u. Monad m => ParsecT s u m u
getState
  if Bool
starred Bool -> Bool -> Bool
|| QuoteContext
quoteContext QuoteContext -> QuoteContext -> Bool
forall a. Eq a => a -> a -> Bool
== QuoteContext
InDoubleQuote
     then Inlines -> Inlines
singleQuoted (Inlines -> Inlines) -> (Inlines -> Inlines) -> Inlines -> Inlines
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inlines -> Inlines
langspan (Inlines -> Inlines) -> LP m Inlines -> LP m Inlines
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> QuoteContext -> LP m Inlines -> LP m Inlines
forall st (m :: * -> *) s a.
HasQuoteContext st m =>
QuoteContext -> ParsecT s st m a -> ParsecT s st m a
withQuoteContext QuoteContext
InSingleQuote LP m Inlines
tok
     else Inlines -> Inlines
doubleQuoted (Inlines -> Inlines) -> (Inlines -> Inlines) -> Inlines -> Inlines
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Inlines -> Inlines
langspan (Inlines -> Inlines) -> LP m Inlines -> LP m Inlines
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> QuoteContext -> LP m Inlines -> LP m Inlines
forall st (m :: * -> *) s a.
HasQuoteContext st m =>
QuoteContext -> ParsecT s st m a -> ParsecT s st m a
withQuoteContext QuoteContext
InDoubleQuote LP m Inlines
tok

enquoteCommands :: PandocMonad m
                => LP m Inlines -> M.Map Text (LP m Inlines)
enquoteCommands :: LP m Inlines -> Map Text (LP m Inlines)
enquoteCommands tok :: LP m Inlines
tok = [(Text, LP m Inlines)] -> Map Text (LP m Inlines)
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList
  [ ("enquote*", LP m Inlines -> Bool -> Maybe Text -> LP m Inlines
forall (m :: * -> *).
PandocMonad m =>
LP m Inlines -> Bool -> Maybe Text -> LP m Inlines
enquote LP m Inlines
tok Bool
True Maybe Text
forall a. Maybe a
Nothing)
  , ("enquote", LP m Inlines -> Bool -> Maybe Text -> LP m Inlines
forall (m :: * -> *).
PandocMonad m =>
LP m Inlines -> Bool -> Maybe Text -> LP m Inlines
enquote LP m Inlines
tok Bool
False Maybe Text
forall a. Maybe a
Nothing)
  -- foreignquote is supposed to use native quote marks
  , ("foreignquote*", LP m [Tok]
forall (m :: * -> *). PandocMonad m => LP m [Tok]
braced LP m [Tok] -> ([Tok] -> LP m Inlines) -> LP m Inlines
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= LP m Inlines -> Bool -> Maybe Text -> LP m Inlines
forall (m :: * -> *).
PandocMonad m =>
LP m Inlines -> Bool -> Maybe Text -> LP m Inlines
enquote LP m Inlines
tok Bool
True (Maybe Text -> LP m Inlines)
-> ([Tok] -> Maybe Text) -> [Tok] -> LP m Inlines
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Maybe Text
forall a. a -> Maybe a
Just (Text -> Maybe Text) -> ([Tok] -> Text) -> [Tok] -> Maybe Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Tok] -> Text
untokenize)
  , ("foreignquote", LP m [Tok]
forall (m :: * -> *). PandocMonad m => LP m [Tok]
braced LP m [Tok] -> ([Tok] -> LP m Inlines) -> LP m Inlines
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= LP m Inlines -> Bool -> Maybe Text -> LP m Inlines
forall (m :: * -> *).
PandocMonad m =>
LP m Inlines -> Bool -> Maybe Text -> LP m Inlines
enquote LP m Inlines
tok Bool
False (Maybe Text -> LP m Inlines)
-> ([Tok] -> Maybe Text) -> [Tok] -> LP m Inlines
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Maybe Text
forall a. a -> Maybe a
Just (Text -> Maybe Text) -> ([Tok] -> Text) -> [Tok] -> Maybe Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Tok] -> Text
untokenize)
  -- hypehnquote uses regular quotes
  , ("hyphenquote*", LP m [Tok]
forall (m :: * -> *). PandocMonad m => LP m [Tok]
braced LP m [Tok] -> ([Tok] -> LP m Inlines) -> LP m Inlines
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= LP m Inlines -> Bool -> Maybe Text -> LP m Inlines
forall (m :: * -> *).
PandocMonad m =>
LP m Inlines -> Bool -> Maybe Text -> LP m Inlines
enquote LP m Inlines
tok Bool
True (Maybe Text -> LP m Inlines)
-> ([Tok] -> Maybe Text) -> [Tok] -> LP m Inlines
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Maybe Text
forall a. a -> Maybe a
Just (Text -> Maybe Text) -> ([Tok] -> Text) -> [Tok] -> Maybe Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Tok] -> Text
untokenize)
  , ("hyphenquote", LP m [Tok]
forall (m :: * -> *). PandocMonad m => LP m [Tok]
braced LP m [Tok] -> ([Tok] -> LP m Inlines) -> LP m Inlines
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= LP m Inlines -> Bool -> Maybe Text -> LP m Inlines
forall (m :: * -> *).
PandocMonad m =>
LP m Inlines -> Bool -> Maybe Text -> LP m Inlines
enquote LP m Inlines
tok Bool
False (Maybe Text -> LP m Inlines)
-> ([Tok] -> Maybe Text) -> [Tok] -> LP m Inlines
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Maybe Text
forall a. a -> Maybe a
Just (Text -> Maybe Text) -> ([Tok] -> Text) -> [Tok] -> Maybe Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Tok] -> Text
untokenize)
  ]

foreignlanguage :: PandocMonad m => LP m Inlines -> LP m Inlines
foreignlanguage :: LP m Inlines -> LP m Inlines
foreignlanguage tok :: LP m Inlines
tok = do
  Text
babelLang <- [Tok] -> Text
untokenize ([Tok] -> Text)
-> ParsecT [Tok] LaTeXState m [Tok]
-> ParsecT [Tok] LaTeXState m Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT [Tok] LaTeXState m [Tok]
forall (m :: * -> *). PandocMonad m => LP m [Tok]
braced
  case Text -> Maybe Lang
babelLangToBCP47 Text
babelLang of
       Just lang :: Lang
lang -> Attr -> Inlines -> Inlines
spanWith ("", [], [("lang",  Lang -> Text
renderLang Lang
lang)]) (Inlines -> Inlines) -> LP m Inlines -> LP m Inlines
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> LP m Inlines
tok
       _ -> LP m Inlines
tok

inlineLanguageCommands :: PandocMonad m
                       => LP m Inlines -> M.Map Text (LP m Inlines)
inlineLanguageCommands :: LP m Inlines -> Map Text (LP m Inlines)
inlineLanguageCommands tok :: LP m Inlines
tok =
  [(Text, LP m Inlines)] -> Map Text (LP m Inlines)
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(Text, LP m Inlines)] -> Map Text (LP m Inlines))
-> [(Text, LP m Inlines)] -> Map Text (LP m Inlines)
forall a b. (a -> b) -> a -> b
$
    ("foreignlanguage", LP m Inlines -> LP m Inlines
forall (m :: * -> *). PandocMonad m => LP m Inlines -> LP m Inlines
foreignlanguage LP m Inlines
tok) (Text, LP m Inlines)
-> [(Text, LP m Inlines)] -> [(Text, LP m Inlines)]
forall a. a -> [a] -> [a]
:
    ((Text, Text -> Lang) -> (Text, LP m Inlines)
forall a.
(Semigroup a, IsString a) =>
(a, Text -> Lang) -> (a, LP m Inlines)
mk ((Text, Text -> Lang) -> (Text, LP m Inlines))
-> [(Text, Text -> Lang)] -> [(Text, LP m Inlines)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Map Text (Text -> Lang) -> [(Text, Text -> Lang)]
forall k a. Map k a -> [(k, a)]
M.toList Map Text (Text -> Lang)
polyglossiaLangToBCP47)
  where
    mk :: (a, Text -> Lang) -> (a, LP m Inlines)
mk (polyglossia :: a
polyglossia, bcp47Func :: Text -> Lang
bcp47Func) =
      ("text" a -> a -> a
forall a. Semigroup a => a -> a -> a
<> a
polyglossia, LP m Inlines -> (Text -> Lang) -> LP m Inlines
forall (m :: * -> *).
PandocMonad m =>
LP m Inlines -> (Text -> Lang) -> LP m Inlines
inlineLanguage LP m Inlines
tok Text -> Lang
bcp47Func)

inlineLanguage :: PandocMonad m
               => LP m Inlines -> (Text -> Lang) -> LP m Inlines
inlineLanguage :: LP m Inlines -> (Text -> Lang) -> LP m Inlines
inlineLanguage tok :: LP m Inlines
tok bcp47Func :: Text -> Lang
bcp47Func = do
  Text
o <- Text
-> ParsecT [Tok] LaTeXState m Text
-> ParsecT [Tok] LaTeXState m Text
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option "" (ParsecT [Tok] LaTeXState m Text
 -> ParsecT [Tok] LaTeXState m Text)
-> ParsecT [Tok] LaTeXState m Text
-> ParsecT [Tok] LaTeXState m Text
forall a b. (a -> b) -> a -> b
$ (Char -> Bool) -> Text -> Text
T.filter (\c :: Char
c -> Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= '[' Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= ']')
                (Text -> Text)
-> ParsecT [Tok] LaTeXState m Text
-> ParsecT [Tok] LaTeXState m Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT [Tok] LaTeXState m Text
forall (m :: * -> *). PandocMonad m => LP m Text
rawopt
  let lang :: Text
lang = Lang -> Text
renderLang (Lang -> Text) -> Lang -> Text
forall a b. (a -> b) -> a -> b
$ Text -> Lang
bcp47Func Text
o
  (Inlines -> Inlines) -> Inlines -> Inlines
extractSpaces (Attr -> Inlines -> Inlines
spanWith ("", [], [("lang", Text
lang)])) (Inlines -> Inlines) -> LP m Inlines -> LP m Inlines
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> LP m Inlines
tok

setDefaultLanguage :: PandocMonad m => LP m Blocks
setDefaultLanguage :: LP m Blocks
setDefaultLanguage = do
  Text
o <- Text
-> ParsecT [Tok] LaTeXState m Text
-> ParsecT [Tok] LaTeXState m Text
forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option "" (ParsecT [Tok] LaTeXState m Text
 -> ParsecT [Tok] LaTeXState m Text)
-> ParsecT [Tok] LaTeXState m Text
-> ParsecT [Tok] LaTeXState m Text
forall a b. (a -> b) -> a -> b
$ (Char -> Bool) -> Text -> Text
T.filter (\c :: Char
c -> Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= '[' Bool -> Bool -> Bool
&& Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= ']')
                (Text -> Text)
-> ParsecT [Tok] LaTeXState m Text
-> ParsecT [Tok] LaTeXState m Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT [Tok] LaTeXState m Text
forall (m :: * -> *). PandocMonad m => LP m Text
rawopt
  Text
polylang <- [Tok] -> Text
untokenize ([Tok] -> Text)
-> ParsecT [Tok] LaTeXState m [Tok]
-> ParsecT [Tok] LaTeXState m Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT [Tok] LaTeXState m [Tok]
forall (m :: * -> *). PandocMonad m => LP m [Tok]
braced
  case Text -> Map Text (Text -> Lang) -> Maybe (Text -> Lang)
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup Text
polylang Map Text (Text -> Lang)
polyglossiaLangToBCP47 of
       Nothing -> Blocks -> LP m Blocks
forall (m :: * -> *) a. Monad m => a -> m a
return Blocks
forall a. Monoid a => a
mempty -- TODO mzero? warning?
       Just langFunc :: Text -> Lang
langFunc -> do
         let l :: Lang
l = Text -> Lang
langFunc Text
o
         Lang -> ParsecT [Tok] LaTeXState m ()
forall (m :: * -> *). PandocMonad m => Lang -> m ()
setTranslations Lang
l
         (LaTeXState -> LaTeXState) -> ParsecT [Tok] LaTeXState m ()
forall (m :: * -> *) u s. Monad m => (u -> u) -> ParsecT s u m ()
updateState ((LaTeXState -> LaTeXState) -> ParsecT [Tok] LaTeXState m ())
-> (LaTeXState -> LaTeXState) -> ParsecT [Tok] LaTeXState m ()
forall a b. (a -> b) -> a -> b
$ Text -> Inlines -> LaTeXState -> LaTeXState
forall a b. (HasMeta a, ToMetaValue b) => Text -> b -> a -> a
setMeta "lang" (Inlines -> LaTeXState -> LaTeXState)
-> Inlines -> LaTeXState -> LaTeXState
forall a b. (a -> b) -> a -> b
$ Text -> Inlines
str (Lang -> Text
renderLang Lang
l)
         Blocks -> LP m Blocks
forall (m :: * -> *) a. Monad m => a -> m a
return Blocks
forall a. Monoid a => a
mempty

polyglossiaLangToBCP47 :: M.Map T.Text (T.Text -> Lang)
polyglossiaLangToBCP47 :: Map Text (Text -> Lang)
polyglossiaLangToBCP47 = [(Text, Text -> Lang)] -> Map Text (Text -> Lang)
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList
  [ ("arabic", \o :: Text
o -> case (Char -> Bool) -> Text -> Text
T.filter (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/=' ') Text
o of
       "locale=algeria"    -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "ar" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "DZ") [] [] []
       "locale=mashriq"    -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "ar" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "SY") [] [] []
       "locale=libya"      -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "ar" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "LY") [] [] []
       "locale=morocco"    -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "ar" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "MA") [] [] []
       "locale=mauritania" -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "ar" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "MR") [] [] []
       "locale=tunisia"    -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "ar" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "TN") [] [] []
       _                   -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "ar" Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing     [] [] [])
  , ("german", \o :: Text
o -> case (Char -> Bool) -> Text -> Text
T.filter (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/=' ') Text
o of
       "spelling=old" -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "de" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "DE") ["1901"] [] []
       "variant=austrian,spelling=old"
                       -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "de" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "AT") ["1901"] [] []
       "variant=austrian" -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "de" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "AT") [] [] []
       "variant=swiss,spelling=old"
                       -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "de" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "CH") ["1901"] [] []
       "variant=swiss" -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "de" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "CH") [] [] []
       _ -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "de" Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing [] [] [])
  , ("lsorbian", \_ -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "dsb" Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing [] [] [])
  , ("greek", \o :: Text
o -> case (Char -> Bool) -> Text -> Text
T.filter (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/=' ') Text
o of
       "variant=poly"    -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "el" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "polyton") [] [] []
       "variant=ancient" -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "grc" Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing [] [] []
       _                 -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "el" Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing [] [] [])
  , ("english", \o :: Text
o -> case (Char -> Bool) -> Text -> Text
T.filter (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/=' ') Text
o of
       "variant=australian" -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "en" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "AU") [] [] []
       "variant=canadian"   -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "en" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "CA") [] [] []
       "variant=british"    -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "en" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "GB") [] [] []
       "variant=newzealand" -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "en" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "NZ") [] [] []
       "variant=american"   -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "en" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "US") [] [] []
       _                    -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "en" Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing     [] [] [])
  , ("usorbian", \_ -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "hsb" Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing [] [] [])
  , ("latin", \o :: Text
o -> case (Char -> Bool) -> Text -> Text
T.filter (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/=' ') Text
o of
       "variant=classic" -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "la" Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing ["x-classic"] [] []
       _                 -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "la" Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing [] [] [])
  , ("slovenian", \_ -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "sl" Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing [] [] [])
  , ("serbianc", \_ -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "sr" (Text -> Maybe Text
forall a. a -> Maybe a
Just "Cyrl") Maybe Text
forall a. Maybe a
Nothing [] [] [])
  , ("pinyin", \_ -> Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "zh" (Text -> Maybe Text
forall a. a -> Maybe a
Just "Latn") Maybe Text
forall a. Maybe a
Nothing ["pinyin"] [] [])
  , ("afrikaans", \_ -> Text -> Lang
simpleLang "af")
  , ("amharic", \_ -> Text -> Lang
simpleLang "am")
  , ("assamese", \_ -> Text -> Lang
simpleLang "as")
  , ("asturian", \_ -> Text -> Lang
simpleLang "ast")
  , ("bulgarian", \_ -> Text -> Lang
simpleLang "bg")
  , ("bengali", \_ -> Text -> Lang
simpleLang "bn")
  , ("tibetan", \_ -> Text -> Lang
simpleLang "bo")
  , ("breton", \_ -> Text -> Lang
simpleLang "br")
  , ("catalan", \_ -> Text -> Lang
simpleLang "ca")
  , ("welsh", \_ -> Text -> Lang
simpleLang "cy")
  , ("czech", \_ -> Text -> Lang
simpleLang "cs")
  , ("coptic", \_ -> Text -> Lang
simpleLang "cop")
  , ("danish", \_ -> Text -> Lang
simpleLang "da")
  , ("divehi", \_ -> Text -> Lang
simpleLang "dv")
  , ("esperanto", \_ -> Text -> Lang
simpleLang "eo")
  , ("spanish", \_ -> Text -> Lang
simpleLang "es")
  , ("estonian", \_ -> Text -> Lang
simpleLang "et")
  , ("basque", \_ -> Text -> Lang
simpleLang "eu")
  , ("farsi", \_ -> Text -> Lang
simpleLang "fa")
  , ("finnish", \_ -> Text -> Lang
simpleLang "fi")
  , ("french", \_ -> Text -> Lang
simpleLang "fr")
  , ("friulan", \_ -> Text -> Lang
simpleLang "fur")
  , ("irish", \_ -> Text -> Lang
simpleLang "ga")
  , ("scottish", \_ -> Text -> Lang
simpleLang "gd")
  , ("ethiopic", \_ -> Text -> Lang
simpleLang "gez")
  , ("galician", \_ -> Text -> Lang
simpleLang "gl")
  , ("hebrew", \_ -> Text -> Lang
simpleLang "he")
  , ("hindi", \_ -> Text -> Lang
simpleLang "hi")
  , ("croatian", \_ -> Text -> Lang
simpleLang "hr")
  , ("magyar", \_ -> Text -> Lang
simpleLang "hu")
  , ("armenian", \_ -> Text -> Lang
simpleLang "hy")
  , ("gujarati", \_ -> Text -> Lang
simpleLang "gu")
  , ("interlingua", \_ -> Text -> Lang
simpleLang "ia")
  , ("indonesian", \_ -> Text -> Lang
simpleLang "id")
  , ("icelandic", \_ -> Text -> Lang
simpleLang "is")
  , ("italian", \_ -> Text -> Lang
simpleLang "it")
  , ("japanese", \_ -> Text -> Lang
simpleLang "jp")
  , ("khmer", \_ -> Text -> Lang
simpleLang "km")
  , ("kurmanji", \_ -> Text -> Lang
simpleLang "kmr")
  , ("kannada", \_ -> Text -> Lang
simpleLang "kn")
  , ("korean", \_ -> Text -> Lang
simpleLang "ko")
  , ("lao", \_ -> Text -> Lang
simpleLang "lo")
  , ("lithuanian", \_ -> Text -> Lang
simpleLang "lt")
  , ("latvian", \_ -> Text -> Lang
simpleLang "lv")
  , ("malayalam", \_ -> Text -> Lang
simpleLang "ml")
  , ("mongolian", \_ -> Text -> Lang
simpleLang "mn")
  , ("marathi", \_ -> Text -> Lang
simpleLang "mr")
  , ("dutch", \_ -> Text -> Lang
simpleLang "nl")
  , ("nynorsk", \_ -> Text -> Lang
simpleLang "nn")
  , ("norsk", \_ -> Text -> Lang
simpleLang "no")
  , ("nko", \_ -> Text -> Lang
simpleLang "nqo")
  , ("occitan", \_ -> Text -> Lang
simpleLang "oc")
  , ("oriya", \_ -> Text -> Lang
simpleLang "or")
  , ("punjabi", \_ -> Text -> Lang
simpleLang "pa")
  , ("polish", \_ -> Text -> Lang
simpleLang "pl")
  , ("piedmontese", \_ -> Text -> Lang
simpleLang "pms")
  , ("portuguese", \_ -> Text -> Lang
simpleLang "pt")
  , ("romansh", \_ -> Text -> Lang
simpleLang "rm")
  , ("romanian", \_ -> Text -> Lang
simpleLang "ro")
  , ("russian", \_ -> Text -> Lang
simpleLang "ru")
  , ("sanskrit", \_ -> Text -> Lang
simpleLang "sa")
  , ("samin", \_ -> Text -> Lang
simpleLang "se")
  , ("slovak", \_ -> Text -> Lang
simpleLang "sk")
  , ("albanian", \_ -> Text -> Lang
simpleLang "sq")
  , ("serbian", \_ -> Text -> Lang
simpleLang "sr")
  , ("swedish", \_ -> Text -> Lang
simpleLang "sv")
  , ("syriac", \_ -> Text -> Lang
simpleLang "syr")
  , ("tamil", \_ -> Text -> Lang
simpleLang "ta")
  , ("telugu", \_ -> Text -> Lang
simpleLang "te")
  , ("thai", \_ -> Text -> Lang
simpleLang "th")
  , ("turkmen", \_ -> Text -> Lang
simpleLang "tk")
  , ("turkish", \_ -> Text -> Lang
simpleLang "tr")
  , ("ukrainian", \_ -> Text -> Lang
simpleLang "uk")
  , ("urdu", \_ -> Text -> Lang
simpleLang "ur")
  , ("vietnamese", \_ -> Text -> Lang
simpleLang "vi")
  ]

simpleLang :: Text -> Lang
simpleLang :: Text -> Lang
simpleLang l :: Text
l = Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang Text
l Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing [] [] []

babelLangToBCP47 :: T.Text -> Maybe Lang
babelLangToBCP47 :: Text -> Maybe Lang
babelLangToBCP47 s :: Text
s =
  case Text
s of
       "austrian" -> Lang -> Maybe Lang
forall a. a -> Maybe a
Just (Lang -> Maybe Lang) -> Lang -> Maybe Lang
forall a b. (a -> b) -> a -> b
$ Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "de" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "AT") ["1901"] [] []
       "naustrian" -> Lang -> Maybe Lang
forall a. a -> Maybe a
Just (Lang -> Maybe Lang) -> Lang -> Maybe Lang
forall a b. (a -> b) -> a -> b
$ Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "de" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "AT") [] [] []
       "swissgerman" -> Lang -> Maybe Lang
forall a. a -> Maybe a
Just (Lang -> Maybe Lang) -> Lang -> Maybe Lang
forall a b. (a -> b) -> a -> b
$ Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "de" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "CH") ["1901"] [] []
       "nswissgerman" -> Lang -> Maybe Lang
forall a. a -> Maybe a
Just (Lang -> Maybe Lang) -> Lang -> Maybe Lang
forall a b. (a -> b) -> a -> b
$ Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "de" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "CH") [] [] []
       "german" -> Lang -> Maybe Lang
forall a. a -> Maybe a
Just (Lang -> Maybe Lang) -> Lang -> Maybe Lang
forall a b. (a -> b) -> a -> b
$ Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "de" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "DE") ["1901"] [] []
       "ngerman" -> Lang -> Maybe Lang
forall a. a -> Maybe a
Just (Lang -> Maybe Lang) -> Lang -> Maybe Lang
forall a b. (a -> b) -> a -> b
$ Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "de" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "DE") [] [] []
       "lowersorbian" -> Lang -> Maybe Lang
forall a. a -> Maybe a
Just (Lang -> Maybe Lang) -> Lang -> Maybe Lang
forall a b. (a -> b) -> a -> b
$ Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "dsb" Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing [] [] []
       "uppersorbian" -> Lang -> Maybe Lang
forall a. a -> Maybe a
Just (Lang -> Maybe Lang) -> Lang -> Maybe Lang
forall a b. (a -> b) -> a -> b
$ Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "hsb" Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing [] [] []
       "polutonikogreek" -> Lang -> Maybe Lang
forall a. a -> Maybe a
Just (Lang -> Maybe Lang) -> Lang -> Maybe Lang
forall a b. (a -> b) -> a -> b
$ Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "el" Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing ["polyton"] [] []
       "slovene" -> Lang -> Maybe Lang
forall a. a -> Maybe a
Just (Lang -> Maybe Lang) -> Lang -> Maybe Lang
forall a b. (a -> b) -> a -> b
$ Text -> Lang
simpleLang "sl"
       "australian" -> Lang -> Maybe Lang
forall a. a -> Maybe a
Just (Lang -> Maybe Lang) -> Lang -> Maybe Lang
forall a b. (a -> b) -> a -> b
$ Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "en" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "AU") [] [] []
       "canadian" -> Lang -> Maybe Lang
forall a. a -> Maybe a
Just (Lang -> Maybe Lang) -> Lang -> Maybe Lang
forall a b. (a -> b) -> a -> b
$ Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "en" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "CA") [] [] []
       "british" -> Lang -> Maybe Lang
forall a. a -> Maybe a
Just (Lang -> Maybe Lang) -> Lang -> Maybe Lang
forall a b. (a -> b) -> a -> b
$ Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "en" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "GB") [] [] []
       "newzealand" -> Lang -> Maybe Lang
forall a. a -> Maybe a
Just (Lang -> Maybe Lang) -> Lang -> Maybe Lang
forall a b. (a -> b) -> a -> b
$ Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "en" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "NZ") [] [] []
       "american" -> Lang -> Maybe Lang
forall a. a -> Maybe a
Just (Lang -> Maybe Lang) -> Lang -> Maybe Lang
forall a b. (a -> b) -> a -> b
$ Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "en" Maybe Text
forall a. Maybe a
Nothing (Text -> Maybe Text
forall a. a -> Maybe a
Just "US") [] [] []
       "classiclatin" -> Lang -> Maybe Lang
forall a. a -> Maybe a
Just (Lang -> Maybe Lang) -> Lang -> Maybe Lang
forall a b. (a -> b) -> a -> b
$ Text
-> Maybe Text
-> Maybe Text
-> [Text]
-> [(Text, [(Text, Text)])]
-> [Text]
-> Lang
Lang "la" Maybe Text
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing ["x-classic"] [] []
       _ -> ((Text -> Lang) -> Text -> Lang
forall a b. (a -> b) -> a -> b
$ "") ((Text -> Lang) -> Lang) -> Maybe (Text -> Lang) -> Maybe Lang
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Map Text (Text -> Lang) -> Maybe (Text -> Lang)
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup Text
s Map Text (Text -> Lang)
polyglossiaLangToBCP47