aboutsummaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/BCP47.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Text/Pandoc/BCP47.hs')
-rw-r--r--src/Text/Pandoc/BCP47.hs36
1 files changed, 17 insertions, 19 deletions
diff --git a/src/Text/Pandoc/BCP47.hs b/src/Text/Pandoc/BCP47.hs
index ce8aa99ca..f4afec90c 100644
--- a/src/Text/Pandoc/BCP47.hs
+++ b/src/Text/Pandoc/BCP47.hs
@@ -20,9 +20,7 @@ module Text.Pandoc.BCP47 (
where
import Prelude
import Control.Monad (guard)
-import Data.Char (isAlphaNum, isAscii, isLetter, isLower, isUpper, toLower,
- toUpper)
-import Data.List (intercalate)
+import Data.Char (isAlphaNum, isAscii, isLetter, isLower, isUpper)
import Text.Pandoc.Definition
import Text.Pandoc.Options
import Text.DocTemplates (FromContext(..))
@@ -30,22 +28,22 @@ import qualified Data.Text as T
import qualified Text.Parsec as P
-- | Represents BCP 47 language/country code.
-data Lang = Lang{ langLanguage :: String
- , langScript :: String
- , langRegion :: String
- , langVariants :: [String] }
+data Lang = Lang{ langLanguage :: T.Text
+ , langScript :: T.Text
+ , langRegion :: T.Text
+ , langVariants :: [T.Text] }
deriving (Eq, Ord, Show)
-- | Render a Lang as BCP 47.
-renderLang :: Lang -> String
-renderLang lang = intercalate "-" (langLanguage lang : filter (not . null)
+renderLang :: Lang -> T.Text
+renderLang lang = T.intercalate "-" (langLanguage lang : filter (not . T.null)
([langScript lang, langRegion lang] ++ langVariants lang))
-- | Get the contents of the `lang` metadata field or variable.
-getLang :: WriterOptions -> Meta -> Maybe String
+getLang :: WriterOptions -> Meta -> Maybe T.Text
getLang opts meta =
case lookupContext "lang" (writerVariables opts) of
- Just s -> Just $ T.unpack s
+ Just s -> Just s
_ ->
case lookupMeta "lang" meta of
Just (MetaInlines [Str s]) -> Just s
@@ -55,11 +53,11 @@ getLang opts meta =
-- | Parse a BCP 47 string as a Lang. Currently we parse
-- extensions and private-use fields as "variants," even
-- though officially they aren't.
-parseBCP47 :: String -> Either String Lang
+parseBCP47 :: T.Text -> Either T.Text Lang
parseBCP47 lang =
case P.parse bcp47 "lang" lang of
Right r -> Right r
- Left e -> Left $ show e
+ Left e -> Left $ T.pack $ show e
where bcp47 = do
language <- pLanguage
script <- P.option "" pScript
@@ -75,19 +73,19 @@ parseBCP47 lang =
cs <- P.many1 asciiLetter
let lcs = length cs
guard $ lcs == 2 || lcs == 3
- return $ map toLower cs
+ return $ T.toLower $ T.pack $ cs
pScript = P.try $ do
P.char '-'
x <- P.satisfy (\c -> isAscii c && isLetter c && isUpper c)
xs <- P.count 3
(P.satisfy (\c -> isAscii c && isLetter c && isLower c))
- return $ map toLower (x:xs)
+ return $ T.toLower $ T.pack (x:xs)
pRegion = P.try $ do
P.char '-'
cs <- P.many1 asciiLetter
let lcs = length cs
guard $ lcs == 2 || lcs == 3
- return $ map toUpper cs
+ return $ T.toUpper $ T.pack cs
pVariant = P.try $ do
P.char '-'
ds <- P.option "" (P.count 1 P.digit)
@@ -96,12 +94,12 @@ parseBCP47 lang =
guard $ if null ds
then length var >= 5 && length var <= 8
else length var == 4
- return $ map toLower var
+ return $ T.toLower $ T.pack var
pExtension = P.try $ do
P.char '-'
cs <- P.many1 $ P.satisfy (\c -> isAscii c && isAlphaNum c)
guard $ length cs >= 2 && length cs <= 8
- return $ map toLower cs
+ return $ T.toLower $ T.pack cs
pPrivateUse = P.try $ do
P.char '-'
P.char 'x'
@@ -109,4 +107,4 @@ parseBCP47 lang =
cs <- P.many1 $ P.satisfy (\c -> isAscii c && isAlphaNum c)
guard $ not (null cs) && length cs <= 8
let var = "x-" ++ cs
- return $ map toLower var
+ return $ T.toLower $ T.pack var