diff options
author | John MacFarlane <jgm@berkeley.edu> | 2020-12-02 10:46:23 -0800 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2020-12-02 10:46:23 -0800 |
commit | 7b11cdee49ec491a33dcade6ea68c3084a425992 (patch) | |
tree | 431807d53abe1685e461c0a3f6b543ab449c03dc /src/Text | |
parent | 4ca0d590e2c433c6ce99d53be58df4b982a587f6 (diff) | |
download | pandoc-7b11cdee49ec491a33dcade6ea68c3084a425992.tar.gz |
Citeproc: ensure that BCP47 lang codes can be used.
We ignore the variants and just use the base lang code
and country code when passing off to citeproc.
Diffstat (limited to 'src/Text')
-rw-r--r-- | src/Text/Pandoc/Citeproc.hs | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/src/Text/Pandoc/Citeproc.hs b/src/Text/Pandoc/Citeproc.hs index a48f97c3b..0de2882ae 100644 --- a/src/Text/Pandoc/Citeproc.hs +++ b/src/Text/Pandoc/Citeproc.hs @@ -16,6 +16,7 @@ import Text.Pandoc.Citeproc.BibTeX (readBibtexString, Variant(..)) import Text.Pandoc.Citeproc.MetaValue (metaValueToReference, metaValueToText) import Text.Pandoc.Readers.Markdown (yamlToRefs) import Text.Pandoc.Class (setResourcePath, getResourcePath, getUserDataDir) +import qualified Text.Pandoc.BCP47 as BCP47 import Data.ByteString (ByteString) import qualified Data.ByteString.Lazy as L import Text.Pandoc.Definition as Pandoc @@ -91,8 +92,9 @@ processCitations (Pandoc meta bs) = do case styleRes of Left err -> throwError $ PandocAppError $ prettyCiteprocError err Right style -> return style{ styleAbbreviations = mbAbbrevs } - let mblang = parseLang <$> - ((lookupMeta "lang" meta <|> lookupMeta "locale" meta) >>= metaValueToText) + mblang <- maybe (return Nothing) bcp47LangToIETF + ((lookupMeta "lang" meta <|> lookupMeta "locale" meta) >>= + metaValueToText) let locale = Citeproc.mergeLocales mblang style let getCiteId (Cite cs _) = Set.fromList $ map B.citationId cs getCiteId _ = mempty @@ -579,3 +581,16 @@ removeFinalPeriod ils = isRightQuote "\8217" = True isRightQuote "\187" = True isRightQuote _ = False + +bcp47LangToIETF :: PandocMonad m => Text -> m (Maybe Lang) +bcp47LangToIETF bcplang = + case BCP47.parseBCP47 bcplang of + Left _ -> do + report $ InvalidLang bcplang + return Nothing + Right lang -> + return $ Just + $ Lang (BCP47.langLanguage lang) + (if T.null (BCP47.langRegion lang) + then Nothing + else Just (BCP47.langRegion lang)) |