summaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Writers/Shared.hs
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2017-06-25 15:36:30 +0200
committerJohn MacFarlane <jgm@berkeley.edu>2017-06-25 15:36:30 +0200
commite7cd3cb4668b119b61eb69eed857b0254a614ad9 (patch)
tree79b8564cf255852055009c0f0b56dde6af8b33dc /src/Text/Pandoc/Writers/Shared.hs
parent3ae4105d143dbec44afa713f6c3fa28f7a8c1d1f (diff)
Writers.Shared: refactored getLang, splitLang...
into `Lang(..)`, `getLang`, `parceBCP47`.
Diffstat (limited to 'src/Text/Pandoc/Writers/Shared.hs')
-rw-r--r--src/Text/Pandoc/Writers/Shared.hs35
1 files changed, 24 insertions, 11 deletions
diff --git a/src/Text/Pandoc/Writers/Shared.hs b/src/Text/Pandoc/Writers/Shared.hs
index 0b35d27f6..efb553ac2 100644
--- a/src/Text/Pandoc/Writers/Shared.hs
+++ b/src/Text/Pandoc/Writers/Shared.hs
@@ -30,7 +30,9 @@ Shared utility functions for pandoc writers.
-}
module Text.Pandoc.Writers.Shared (
getLang
- , splitLang
+ , parseBCP47
+ , Lang(..)
+ , renderLang
, metaToJSON
, metaToJSON'
, addVariablesToJSON
@@ -62,30 +64,41 @@ import Text.Pandoc.Shared (splitBy)
import Text.Pandoc.UTF8 (toStringLazy)
import Text.Pandoc.XML (escapeStringForXML)
+-- | Represents BCP 47 language/country code.
+data Lang = Lang String String
+
+-- | Render a Lang as BCP 47.
+renderLang :: Lang -> String
+renderLang (Lang la co) = la ++ if null co
+ then ""
+ else '-':co
+
-- | Get the contents of the `lang` metadata field or variable.
-getLang :: WriterOptions -> Meta -> Maybe String
-getLang opts meta =
- lookup "lang" (writerVariables opts)
+getLang :: PandocMonad m => WriterOptions -> Meta -> m (Maybe Lang)
+getLang opts meta = maybe (return Nothing) parseBCP47 $
+ case lookup "lang" (writerVariables opts) of
+ Just s -> Just s
+ _ -> Nothing
`mplus`
case lookupMeta "lang" meta of
Just (MetaInlines [Str s]) -> Just s
Just (MetaString s) -> Just s
_ -> Nothing
--- | Split `lang` field into lang and country, issuing warning
--- if it doesn't look valid.
-splitLang :: PandocMonad m => String -> m (Maybe String, Maybe String)
-splitLang lang =
+-- | Parse a BCP 47 string as a Lang, issuing a warning if there
+-- are issues.
+parseBCP47 :: PandocMonad m => String -> m (Maybe Lang)
+parseBCP47 lang =
case splitBy (== '-') lang of
[la,co]
| length la == 2 && length co == 2
- -> return (Just la, Just co)
+ -> return $ Just $ Lang la co
[la]
| length la == 2
- -> return (Just la, Nothing)
+ -> return $ Just $ Lang la ""
_ -> do
report $ InvalidLang lang
- return (Nothing, Nothing)
+ return Nothing
-- | Create JSON value for template from a 'Meta' and an association list
-- of variables, specified at the command line or in the writer.