@@ -29,11 +29,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2929Shared utility functions for pandoc writers.
3030-}
3131module Text.Pandoc.Writers.Shared (
32− getLang
33− , parseBCP47
34− , Lang(..)
35− , renderLang
36− , metaToJSON
32+ metaToJSON
3733 , metaToJSON'
3834 , addVariablesToJSON
3935 , getField
@@ -46,97 +42,20 @@ module Text.Pandoc.Writers.Shared (
4642 , gridTable
4743 )
4844where
49−import Control.Monad (liftM, zipWithM, guard)
45+import Control.Monad (liftM, zipWithM)
5046import Data.Aeson (FromJSON (..), Result (..), ToJSON (..), Value (Object),
5147 encode, fromJSON)
52−import Data.Char (isAscii, isLetter, isUpper, isLower)
5348import qualified Data.HashMap.Strict as H
54−import Data.List (groupBy, intersperse, transpose, intercalate)
49+import Data.List (groupBy, intersperse, transpose)
5550import qualified Data.Map as M
5651import Data.Maybe (isJust)
5752import qualified Data.Text as T
5853import qualified Data.Traversable as Traversable
5954import Text.Pandoc.Definition
60−import Text.Pandoc.Class (PandocMonad, report)
61−import Text.Pandoc.Logging
6255import Text.Pandoc.Options
6356import Text.Pandoc.Pretty
6457import Text.Pandoc.UTF8 (toStringLazy)
6558import Text.Pandoc.XML (escapeStringForXML)
66−import qualified Text.Parsec as P
67−
68−-- | Represents BCP 47 language/country code.
69−data Lang = Lang{ langLanguage :: String
70− , langScript :: String
71− , langRegion :: String
72− , langVariants :: [String] }
73− deriving (Eq, Ord, Show)
74−
75−-- | Render a Lang as BCP 47.
76−renderLang :: Lang -> String
77−renderLang lang = intercalate "-" (langLanguage lang : filter (not . null)
78− ([langScript lang, langRegion lang] ++ langVariants lang))
79−
80−-- | Get the contents of the `lang` metadata field or variable.
81−getLang :: PandocMonad m => WriterOptions -> Meta -> m (Maybe Lang)
82−getLang opts meta = case
83− (case lookup "lang" (writerVariables opts) of
84− Just s -> Just s
85− _ ->
86− case lookupMeta "lang" meta of
87− Just (MetaInlines [Str s]) -> Just s
88− Just (MetaString s) -> Just s
89− _ -> Nothing) of
90− Nothing -> return Nothing
91− Just s -> case parseBCP47 s of
92− Left _ -> do
93− report $ InvalidLang s
94− return Nothing
95− Right l -> return (Just l)
96−
97−-- | Parse a BCP 47 string as a Lang.
98−parseBCP47 :: String -> Either String Lang
99−parseBCP47 lang =
100− case P.parse bcp47 "lang" lang of
101− Right r -> Right r
102− Left e -> Left $ show e
103− where bcp47 = do
104− language <- pLanguage
105− script <- P.option "" pScript
106− region <- P.option "" pRegion
107− variants <- P.many pVariant
108− () <$ P.char '-' P.<|> P.eof
109− return $ Lang{ langLanguage = language
110− , langScript = script
111− , langRegion = region
112− , langVariants = variants }
113− asciiLetter = P.satisfy (\c -> isAscii c && isLetter c)
114− pLanguage = do
115− cs <- P.many1 asciiLetter
116− let lcs = length cs
117− guard $ lcs == 2 || lcs == 3
118− return cs
119− pScript = P.try $ do
120− P.char '-'
121− x <- P.satisfy (\c -> isAscii c && isLetter c && isUpper c)
122− xs <- P.count 3
123− (P.satisfy (\c -> isAscii c && isLetter c && isLower c))
124− return (x:xs)
125− pRegion = P.try $ do
126− P.char '-'
127− cs <- P.many1 asciiLetter
128− let lcs = length cs
129− guard $ lcs == 2 || lcs == 3
130− return cs
131− pVariant = P.try $ do
132− P.char '-'
133− ds <- P.option "" (P.count 1 P.digit)
134− cs <- P.many1 asciiLetter
135− let var = ds ++ cs
136− guard $ if null ds
137− then length var >= 5 && length var <= 8
138− else length var == 4
139− return var
14059
14160-- | Create JSON value for template from a 'Meta' and an association list
14261-- of variables, specified at the command line or in the writer.