{-# LANGUAGE OverloadedStrings #-}

-- | The @babel@ package is used to write documents in languages
--   other than US English.
--
--  CTAN page for babel: <http://ctan.org/pkg/babel>.
module Text.LaTeX.Packages.Babel (
   -- * Babel package
   babel
   -- * Babel languages
 , Language (..)
 , uselanguage
 , LangConf (..)
 , uselanguageconf 
   -- * Babel commands and environments
 , selectlanguage
 , otherlanguage
 , foreignlanguage
   ) where

import Text.LaTeX.Base
import Text.LaTeX.Base.Syntax
import Text.LaTeX.Base.Class
--
import Data.Text (toLower)

-- Babel package
 
-- | Babel package. When writing in a single language, the simplest
--   way of using it is with 'uselanguage'.
--
--   In the preamble, use the following (if your language of choice is Spanish):
--
-- > uselanguage Spanish
--
-- To see a list of available languages, check the 'Language' type.
--
babel :: PackageName
babel :: PackageName
babel = PackageName
"babel"

-- Babel languages

-- | Languages.
data Language =
   Bulgarian  -- ^ Bulgarian.
 | Brazilian  -- ^ Brazilian Portuguese.
 | Canadien   -- ^ Canadian French.
 | Czech      -- ^ Czech.
 | Dutch      -- ^ Dutch.
 | English    -- ^ English.
 | Finnish    -- ^ Finnish.
 | Francais   -- ^ Parisian French.
 | French     -- ^ French.
 | FrenchB    -- ^ French.
 | German     -- ^ Old German.
 | NGerman    -- ^ New German.
 | Icelandic  -- ^ Icelandic.
 | Italian    -- ^ Italian.
 | Magyar     -- ^ Hungarian.
 | Portuguese -- ^ Portuguese.
 | Russian    -- ^ Russian.
 | Spanish    -- ^ Spanish.
 | Ukranian   -- ^ Ukranian.
   deriving Int -> Language -> ShowS
[Language] -> ShowS
Language -> PackageName
forall a.
(Int -> a -> ShowS)
-> (a -> PackageName) -> ([a] -> ShowS) -> Show a
showList :: [Language] -> ShowS
$cshowList :: [Language] -> ShowS
show :: Language -> PackageName
$cshow :: Language -> PackageName
showsPrec :: Int -> Language -> ShowS
$cshowsPrec :: Int -> Language -> ShowS
Show

instance Render Language where
 render :: Language -> Text
render = Text -> Text
toLower forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. IsString a => PackageName -> a
fromString forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => a -> PackageName
show

instance Texy Language where
 texy :: forall l. LaTeXC l => Language -> l
texy = forall t l. (Texy t, LaTeXC l) => t -> l
texy forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Render a => a -> Text
render

-- | Import the 'babel' package using a given 'Language'.
--
-- > uselanguage l = usepackage [texy l] babel
--
--  If you are using more than one language, consider to use
--  'uselanguageconf'.
uselanguage :: LaTeXC l => Language -> l
uselanguage :: forall l. LaTeXC l => Language -> l
uselanguage Language
lang = forall l. LaTeXC l => [l] -> PackageName -> l
usepackage [forall t l. (Texy t, LaTeXC l) => t -> l
texy Language
lang] PackageName
babel

-- | Language configuration. You may use one with 'uselanguageconf'.
data LangConf = LangConf { LangConf -> Language
mainLang :: Language , LangConf -> [Language]
otherLangs :: [Language] }
                 deriving Int -> LangConf -> ShowS
[LangConf] -> ShowS
LangConf -> PackageName
forall a.
(Int -> a -> ShowS)
-> (a -> PackageName) -> ([a] -> ShowS) -> Show a
showList :: [LangConf] -> ShowS
$cshowList :: [LangConf] -> ShowS
show :: LangConf -> PackageName
$cshow :: LangConf -> PackageName
showsPrec :: Int -> LangConf -> ShowS
$cshowsPrec :: Int -> LangConf -> ShowS
Show

-- | Import the 'label' package using a given language
--   configuration, featuring a main language and some
--   others. For example:
--
-- > uselanguageconf $ LangConf English [German]
--
--   This will use English as main language, and German
--   as secondary.
uselanguageconf :: LaTeXC l => LangConf -> l
uselanguageconf :: forall l. LaTeXC l => LangConf -> l
uselanguageconf LangConf
lc = forall l. LaTeXC l => [l] -> PackageName -> l
usepackage [l]
xs PackageName
babel
 where
  x :: l
x = l
"main=" forall a. Semigroup a => a -> a -> a
<> forall t l. (Texy t, LaTeXC l) => t -> l
texy (LangConf -> Language
mainLang LangConf
lc)
  xs :: [l]
xs = l
x forall a. a -> [a] -> [a]
: forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall t l. (Texy t, LaTeXC l) => t -> l
texy (LangConf -> [Language]
otherLangs LangConf
lc)

-- | Switch to a given 'Language'.
selectlanguage :: LaTeXC l => Language -> l
selectlanguage :: forall l. LaTeXC l => Language -> l
selectlanguage Language
lang = forall l. LaTeXC l => LaTeX -> l
fromLaTeX forall a b. (a -> b) -> a -> b
$ PackageName -> [TeXArg] -> LaTeX
TeXComm PackageName
"selectlanguage" [LaTeX -> TeXArg
FixArg forall a b. (a -> b) -> a -> b
$ forall t l. (Texy t, LaTeXC l) => t -> l
texy Language
lang]

-- | Use a 'Language' locally.
otherlanguage :: LaTeXC l => Language -> l -> l
otherlanguage :: forall l. LaTeXC l => Language -> l -> l
otherlanguage Language
lang = forall l. LaTeXC l => (LaTeX -> LaTeX) -> l -> l
liftL forall a b. (a -> b) -> a -> b
$ PackageName -> [TeXArg] -> LaTeX -> LaTeX
TeXEnv PackageName
"otherlanguage" [LaTeX -> TeXArg
FixArg forall a b. (a -> b) -> a -> b
$ forall t l. (Texy t, LaTeXC l) => t -> l
texy Language
lang]

-- | The function 'foreignlanguage' takes two arguments; the second argument is a
--   phrase to be typeset according to the rules of the language named in its first
--   argument.
foreignlanguage :: LaTeXC l => Language -> l -> l
foreignlanguage :: forall l. LaTeXC l => Language -> l -> l
foreignlanguage Language
lang = forall l. LaTeXC l => (LaTeX -> LaTeX) -> l -> l
liftL
          forall a b. (a -> b) -> a -> b
$ \LaTeX
l -> PackageName -> [TeXArg] -> LaTeX
TeXComm PackageName
"foreignlanguage" [LaTeX -> TeXArg
OptArg forall a b. (a -> b) -> a -> b
$ forall t l. (Texy t, LaTeXC l) => t -> l
texy Language
lang, LaTeX -> TeXArg
FixArg LaTeX
l]