git.iko.soy/typeable/pandoc
on master help sign in
Merge pull request #3955 from bucklereed/read-latex-languages

LaTeX reader: read polyglossia/babel \text($LANG){...}.

commit50de421ec597373f80cc811dc3ccc4dd9dd69d95 authorJohn MacFarlane <jgm@berkeley.edu> dateFri 6 Oct 2017, 23:26 (9 years ago) parent23eaf2ac359bdd
2 files changed+149−113
src/Text/Pandoc/Readers/LaTeX.hs+129−113 test/Tests/Readers/LaTeX.hs+20
src/Text/Pandoc/Readers/LaTeX.hs+129−113
@@ -1214,7 +1214,7 @@ inlineEnvironments = M.fromList [
12141214 ]
12151215
12161216inlineCommands :: PandocMonad m => M.Map Text (LP m Inlines)
1217−inlineCommands = M.fromList $
1217+inlineCommands = M.union inlineLanguageCommands $ M.fromList $
12181218 [ ("emph", extractSpaces emph <$> tok)
12191219 , ("textit", extractSpaces emph <$> tok)
12201220 , ("textsl", extractSpaces emph <$> tok)
@@ -1224,7 +1224,6 @@ inlineCommands = M.fromList $
12241224 , ("textrm", extractSpaces (spanWith ("",["roman"],[])) <$> tok)
12251225 , ("textup", extractSpaces (spanWith ("",["upright"],[])) <$> tok)
12261226 , ("texttt", ttfamily)
1227− , ("textenglish", spanWith ("",[],[("lang","en")]) <$> tok)
12281227 , ("sout", extractSpaces strikeout <$> tok)
12291228 , ("lq", return (str "‘"))
12301229 , ("rq", return (str "’"))
@@ -1244,7 +1243,6 @@ inlineCommands = M.fromList $
12441243 , ("dots", lit "…")
12451244 , ("mdots", lit "…")
12461245 , ("sim", lit "~")
1247− , ("textgreek", tok)
12481246 , ("sep", lit ",")
12491247 , ("label", rawInlineOr "label" dolabel)
12501248 , ("ref", rawInlineOr "ref" $ doref "ref")
@@ -1465,6 +1463,19 @@ inlineCommands = M.fromList $
14651463 , ("Rn", romanNumeralLower)
14661464 ]
14671465
1466+inlineLanguageCommands :: PandocMonad m => M.Map Text (LP m Inlines)
1467+inlineLanguageCommands = M.fromList $ mk <$> M.toList polyglossiaLangToBCP47
1468+ where
1469+ mk (polyglossia, bcp47Func) =
1470+ ("text" <> T.pack polyglossia, inlineLanguage bcp47Func)
1471+
1472+inlineLanguage :: PandocMonad m => (String -> Lang) -> LP m Inlines
1473+inlineLanguage bcp47Func = do
1474+ o <- option "" $ (T.unpack . T.filter (\c -> c /= '[' && c /= ']'))
1475+ <$> rawopt
1476+ let lang = renderLang $ bcp47Func o
1477+ extractSpaces (spanWith ("", [], [("lang", lang)])) <$> tok
1478+
14681479hyperlink :: PandocMonad m => LP m Inlines
14691480hyperlink = try $ do
14701481 src <- toksToString <$> braced
@@ -2464,118 +2475,123 @@ setDefaultLanguage = do
24642475 o <- option "" $ (T.unpack . T.filter (\c -> c /= '[' && c /= ']'))
24652476 <$> rawopt
24662477 polylang <- toksToString <$> braced
2467− case polyglossiaLangToBCP47 polylang o of
2478+ case M.lookup polylang polyglossiaLangToBCP47 of
24682479 Nothing -> return mempty -- TODO mzero? warning?
2469− Just l -> do
2480+ Just langFunc -> do
2481+ let l = langFunc o
24702482 setTranslations l
24712483 updateState $ setMeta "lang" $ str (renderLang l)
24722484 return mempty
24732485
2474−polyglossiaLangToBCP47 :: String -> String -> Maybe Lang
2475−polyglossiaLangToBCP47 s o =
2476− case (s, filter (/=' ') o) of
2477− ("arabic", "locale=algeria") -> Just $ Lang "ar" "" "DZ" []
2478− ("arabic", "locale=mashriq") -> Just $ Lang "ar" "" "SY" []
2479− ("arabic", "locale=libya") -> Just $ Lang "ar" "" "LY" []
2480− ("arabic", "locale=morocco") -> Just $ Lang "ar" "" "MA" []
2481− ("arabic", "locale=mauritania") -> Just $ Lang "ar" "" "MR" []
2482− ("arabic", "locale=tunisia") -> Just $ Lang "ar" "" "TN" []
2483− ("german", "spelling=old") -> Just $ Lang "de" "" "DE" ["1901"]
2484− ("german", "variant=austrian,spelling=old")
2485− -> Just $ Lang "de" "" "AT" ["1901"]
2486− ("german", "variant=austrian") -> Just $ Lang "de" "" "AT" []
2487− ("german", "variant=swiss,spelling=old")
2488− -> Just $ Lang "de" "" "CH" ["1901"]
2489− ("german", "variant=swiss") -> Just $ Lang "de" "" "CH" []
2490− ("german", _) -> Just $ Lang "de" "" "" []
2491− ("lsorbian", _) -> Just $ Lang "dsb" "" "" []
2492− ("greek", "variant=poly") -> Just $ Lang "el" "" "polyton" []
2493− ("english", "variant=australian") -> Just $ Lang "en" "" "AU" []
2494− ("english", "variant=canadian") -> Just $ Lang "en" "" "CA" []
2495− ("english", "variant=british") -> Just $ Lang "en" "" "GB" []
2496− ("english", "variant=newzealand") -> Just $ Lang "en" "" "NZ" []
2497− ("english", "variant=american") -> Just $ Lang "en" "" "US" []
2498− ("greek", "variant=ancient") -> Just $ Lang "grc" "" "" []
2499− ("usorbian", _) -> Just $ Lang "hsb" "" "" []
2500− ("latin", "variant=classic") -> Just $ Lang "la" "" "" ["x-classic"]
2501− ("slovenian", _) -> Just $ Lang "sl" "" "" []
2502− ("serbianc", _) -> Just $ Lang "sr" "cyrl" "" []
2503− ("pinyin", _) -> Just $ Lang "zh" "Latn" "" ["pinyin"]
2504− ("afrikaans", _) -> Just $ Lang "af" "" "" []
2505− ("amharic", _) -> Just $ Lang "am" "" "" []
2506− ("arabic", _) -> Just $ Lang "ar" "" "" []
2507− ("assamese", _) -> Just $ Lang "as" "" "" []
2508− ("asturian", _) -> Just $ Lang "ast" "" "" []
2509− ("bulgarian", _) -> Just $ Lang "bg" "" "" []
2510− ("bengali", _) -> Just $ Lang "bn" "" "" []
2511− ("tibetan", _) -> Just $ Lang "bo" "" "" []
2512− ("breton", _) -> Just $ Lang "br" "" "" []
2513− ("catalan", _) -> Just $ Lang "ca" "" "" []
2514− ("welsh", _) -> Just $ Lang "cy" "" "" []
2515− ("czech", _) -> Just $ Lang "cs" "" "" []
2516− ("coptic", _) -> Just $ Lang "cop" "" "" []
2517− ("danish", _) -> Just $ Lang "da" "" "" []
2518− ("divehi", _) -> Just $ Lang "dv" "" "" []
2519− ("greek", _) -> Just $ Lang "el" "" "" []
2520− ("english", _) -> Just $ Lang "en" "" "" []
2521− ("esperanto", _) -> Just $ Lang "eo" "" "" []
2522− ("spanish", _) -> Just $ Lang "es" "" "" []
2523− ("estonian", _) -> Just $ Lang "et" "" "" []
2524− ("basque", _) -> Just $ Lang "eu" "" "" []
2525− ("farsi", _) -> Just $ Lang "fa" "" "" []
2526− ("finnish", _) -> Just $ Lang "fi" "" "" []
2527− ("french", _) -> Just $ Lang "fr" "" "" []
2528− ("friulan", _) -> Just $ Lang "fur" "" "" []
2529− ("irish", _) -> Just $ Lang "ga" "" "" []
2530− ("scottish", _) -> Just $ Lang "gd" "" "" []
2531− ("ethiopic", _) -> Just $ Lang "gez" "" "" []
2532− ("galician", _) -> Just $ Lang "gl" "" "" []
2533− ("hebrew", _) -> Just $ Lang "he" "" "" []
2534− ("hindi", _) -> Just $ Lang "hi" "" "" []
2535− ("croatian", _) -> Just $ Lang "hr" "" "" []
2536− ("magyar", _) -> Just $ Lang "hu" "" "" []
2537− ("armenian", _) -> Just $ Lang "hy" "" "" []
2538− ("interlingua", _) -> Just $ Lang "ia" "" "" []
2539− ("indonesian", _) -> Just $ Lang "id" "" "" []
2540− ("icelandic", _) -> Just $ Lang "is" "" "" []
2541− ("italian", _) -> Just $ Lang "it" "" "" []
2542− ("japanese", _) -> Just $ Lang "jp" "" "" []
2543− ("khmer", _) -> Just $ Lang "km" "" "" []
2544− ("kurmanji", _) -> Just $ Lang "kmr" "" "" []
2545− ("kannada", _) -> Just $ Lang "kn" "" "" []
2546− ("korean", _) -> Just $ Lang "ko" "" "" []
2547− ("latin", _) -> Just $ Lang "la" "" "" []
2548− ("lao", _) -> Just $ Lang "lo" "" "" []
2549− ("lithuanian", _) -> Just $ Lang "lt" "" "" []
2550− ("latvian", _) -> Just $ Lang "lv" "" "" []
2551− ("malayalam", _) -> Just $ Lang "ml" "" "" []
2552− ("mongolian", _) -> Just $ Lang "mn" "" "" []
2553− ("marathi", _) -> Just $ Lang "mr" "" "" []
2554− ("dutch", _) -> Just $ Lang "nl" "" "" []
2555− ("nynorsk", _) -> Just $ Lang "nn" "" "" []
2556− ("norsk", _) -> Just $ Lang "no" "" "" []
2557− ("nko", _) -> Just $ Lang "nqo" "" "" []
2558− ("occitan", _) -> Just $ Lang "oc" "" "" []
2559− ("panjabi", _) -> Just $ Lang "pa" "" "" []
2560− ("polish", _) -> Just $ Lang "pl" "" "" []
2561− ("piedmontese", _) -> Just $ Lang "pms" "" "" []
2562− ("portuguese", _) -> Just $ Lang "pt" "" "" []
2563− ("romansh", _) -> Just $ Lang "rm" "" "" []
2564− ("romanian", _) -> Just $ Lang "ro" "" "" []
2565− ("russian", _) -> Just $ Lang "ru" "" "" []
2566− ("sanskrit", _) -> Just $ Lang "sa" "" "" []
2567− ("samin", _) -> Just $ Lang "se" "" "" []
2568− ("slovak", _) -> Just $ Lang "sk" "" "" []
2569− ("albanian", _) -> Just $ Lang "sq" "" "" []
2570− ("serbian", _) -> Just $ Lang "sr" "" "" []
2571− ("swedish", _) -> Just $ Lang "sv" "" "" []
2572− ("syriac", _) -> Just $ Lang "syr" "" "" []
2573− ("tamil", _) -> Just $ Lang "ta" "" "" []
2574− ("telugu", _) -> Just $ Lang "te" "" "" []
2575− ("thai", _) -> Just $ Lang "th" "" "" []
2576− ("turkmen", _) -> Just $ Lang "tk" "" "" []
2577− ("turkish", _) -> Just $ Lang "tr" "" "" []
2578− ("ukrainian", _) -> Just $ Lang "uk" "" "" []
2579− ("urdu", _) -> Just $ Lang "ur" "" "" []
2580− ("vietnamese", _) -> Just $ Lang "vi" "" "" []
2581− _ -> Nothing
2486+polyglossiaLangToBCP47 :: M.Map String (String -> Lang)
2487+polyglossiaLangToBCP47 = M.fromList
2488+ [ ("arabic", \o -> case filter (/=' ') o of
2489+ "locale=algeria" -> Lang "ar" "" "DZ" []
2490+ "locale=mashriq" -> Lang "ar" "" "SY" []
2491+ "locale=libya" -> Lang "ar" "" "LY" []
2492+ "locale=morocco" -> Lang "ar" "" "MA" []
2493+ "locale=mauritania" -> Lang "ar" "" "MR" []
2494+ "locale=tunisia" -> Lang "ar" "" "TN" []
2495+ _ -> Lang "ar" "" "" [])
2496+ , ("german", \o -> case filter (/=' ') o of
2497+ "spelling=old" -> Lang "de" "" "DE" ["1901"]
2498+ "variant=austrian,spelling=old"
2499+ -> Lang "de" "" "AT" ["1901"]
2500+ "variant=austrian" -> Lang "de" "" "AT" []
2501+ "variant=swiss,spelling=old"
2502+ -> Lang "de" "" "CH" ["1901"]
2503+ "variant=swiss" -> Lang "de" "" "CH" []
2504+ _ -> Lang "de" "" "" [])
2505+ , ("lsorbian", \_ -> Lang "dsb" "" "" [])
2506+ , ("greek", \o -> case filter (/=' ') o of
2507+ "variant=poly" -> Lang "el" "" "polyton" []
2508+ "variant=ancient" -> Lang "grc" "" "" []
2509+ _ -> Lang "el" "" "" [])
2510+ , ("english", \o -> case filter (/=' ') o of
2511+ "variant=australian" -> Lang "en" "" "AU" []
2512+ "variant=canadian" -> Lang "en" "" "CA" []
2513+ "variant=british" -> Lang "en" "" "GB" []
2514+ "variant=newzealand" -> Lang "en" "" "NZ" []
2515+ "variant=american" -> Lang "en" "" "US" []
2516+ _ -> Lang "en" "" "" [])
2517+ , ("usorbian", \_ -> Lang "hsb" "" "" [])
2518+ , ("latin", \o -> case filter (/=' ') o of
2519+ "variant=classic" -> Lang "la" "" "" ["x-classic"]
2520+ _ -> Lang "la" "" "" [])
2521+ , ("slovenian", \_ -> Lang "sl" "" "" [])
2522+ , ("serbianc", \_ -> Lang "sr" "cyrl" "" [])
2523+ , ("pinyin", \_ -> Lang "zh" "Latn" "" ["pinyin"])
2524+ , ("afrikaans", \_ -> Lang "af" "" "" [])
2525+ , ("amharic", \_ -> Lang "am" "" "" [])
2526+ , ("assamese", \_ -> Lang "as" "" "" [])
2527+ , ("asturian", \_ -> Lang "ast" "" "" [])
2528+ , ("bulgarian", \_ -> Lang "bg" "" "" [])
2529+ , ("bengali", \_ -> Lang "bn" "" "" [])
2530+ , ("tibetan", \_ -> Lang "bo" "" "" [])
2531+ , ("breton", \_ -> Lang "br" "" "" [])
2532+ , ("catalan", \_ -> Lang "ca" "" "" [])
2533+ , ("welsh", \_ -> Lang "cy" "" "" [])
2534+ , ("czech", \_ -> Lang "cs" "" "" [])
2535+ , ("coptic", \_ -> Lang "cop" "" "" [])
2536+ , ("danish", \_ -> Lang "da" "" "" [])
2537+ , ("divehi", \_ -> Lang "dv" "" "" [])
2538+ , ("esperanto", \_ -> Lang "eo" "" "" [])
2539+ , ("spanish", \_ -> Lang "es" "" "" [])
2540+ , ("estonian", \_ -> Lang "et" "" "" [])
2541+ , ("basque", \_ -> Lang "eu" "" "" [])
2542+ , ("farsi", \_ -> Lang "fa" "" "" [])
2543+ , ("finnish", \_ -> Lang "fi" "" "" [])
2544+ , ("french", \_ -> Lang "fr" "" "" [])
2545+ , ("friulan", \_ -> Lang "fur" "" "" [])
2546+ , ("irish", \_ -> Lang "ga" "" "" [])
2547+ , ("scottish", \_ -> Lang "gd" "" "" [])
2548+ , ("ethiopic", \_ -> Lang "gez" "" "" [])
2549+ , ("galician", \_ -> Lang "gl" "" "" [])
2550+ , ("hebrew", \_ -> Lang "he" "" "" [])
2551+ , ("hindi", \_ -> Lang "hi" "" "" [])
2552+ , ("croatian", \_ -> Lang "hr" "" "" [])
2553+ , ("magyar", \_ -> Lang "hu" "" "" [])
2554+ , ("armenian", \_ -> Lang "hy" "" "" [])
2555+ , ("interlingua", \_ -> Lang "ia" "" "" [])
2556+ , ("indonesian", \_ -> Lang "id" "" "" [])
2557+ , ("icelandic", \_ -> Lang "is" "" "" [])
2558+ , ("italian", \_ -> Lang "it" "" "" [])
2559+ , ("japanese", \_ -> Lang "jp" "" "" [])
2560+ , ("khmer", \_ -> Lang "km" "" "" [])
2561+ , ("kurmanji", \_ -> Lang "kmr" "" "" [])
2562+ , ("kannada", \_ -> Lang "kn" "" "" [])
2563+ , ("korean", \_ -> Lang "ko" "" "" [])
2564+ , ("lao", \_ -> Lang "lo" "" "" [])
2565+ , ("lithuanian", \_ -> Lang "lt" "" "" [])
2566+ , ("latvian", \_ -> Lang "lv" "" "" [])
2567+ , ("malayalam", \_ -> Lang "ml" "" "" [])
2568+ , ("mongolian", \_ -> Lang "mn" "" "" [])
2569+ , ("marathi", \_ -> Lang "mr" "" "" [])
2570+ , ("dutch", \_ -> Lang "nl" "" "" [])
2571+ , ("nynorsk", \_ -> Lang "nn" "" "" [])
2572+ , ("norsk", \_ -> Lang "no" "" "" [])
2573+ , ("nko", \_ -> Lang "nqo" "" "" [])
2574+ , ("occitan", \_ -> Lang "oc" "" "" [])
2575+ , ("panjabi", \_ -> Lang "pa" "" "" [])
2576+ , ("polish", \_ -> Lang "pl" "" "" [])
2577+ , ("piedmontese", \_ -> Lang "pms" "" "" [])
2578+ , ("portuguese", \_ -> Lang "pt" "" "" [])
2579+ , ("romansh", \_ -> Lang "rm" "" "" [])
2580+ , ("romanian", \_ -> Lang "ro" "" "" [])
2581+ , ("russian", \_ -> Lang "ru" "" "" [])
2582+ , ("sanskrit", \_ -> Lang "sa" "" "" [])
2583+ , ("samin", \_ -> Lang "se" "" "" [])
2584+ , ("slovak", \_ -> Lang "sk" "" "" [])
2585+ , ("albanian", \_ -> Lang "sq" "" "" [])
2586+ , ("serbian", \_ -> Lang "sr" "" "" [])
2587+ , ("swedish", \_ -> Lang "sv" "" "" [])
2588+ , ("syriac", \_ -> Lang "syr" "" "" [])
2589+ , ("tamil", \_ -> Lang "ta" "" "" [])
2590+ , ("telugu", \_ -> Lang "te" "" "" [])
2591+ , ("thai", \_ -> Lang "th" "" "" [])
2592+ , ("turkmen", \_ -> Lang "tk" "" "" [])
2593+ , ("turkish", \_ -> Lang "tr" "" "" [])
2594+ , ("ukrainian", \_ -> Lang "uk" "" "" [])
2595+ , ("urdu", \_ -> Lang "ur" "" "" [])
2596+ , ("vietnamese", \_ -> Lang "vi" "" "" [])
2597+ ]
test/Tests/Readers/LaTeX.hs+20
@@ -166,6 +166,26 @@ tests = [ testGroup "basic"
166166 "\\Rn {13}ok" =?>
167167 para (str "xiiiok")
168168 ]
169+ , testGroup "polyglossia language spans"
170+ [ "french" =:
171+ "hello \\textfrench{bonjour}" =?>
172+ para (str "hello" <> space <> spanWith ("", [], [("lang", "fr")]) (str "bonjour"))
173+ , "nested" =:
174+ "\\textfrench{quelle c'est \\textlatin{primus}?}" =?>
175+ para (spanWith ("", [], [("lang", "fr")]) $
176+ str "quelle" <> space <> str "c\8217est" <> space <>
177+ spanWith ("", [], [("lang", "la")]) (str "primus") <> str "?")
178+ , "with formatting" =:
179+ "\\textgerman{wie \\emph{spaet} ist es?}" =?>
180+ para (spanWith ("", [], [("lang", "de")]) $
181+ str "wie" <> space <> emph (str "spaet") <> space <> str "ist" <> space <> str "es?")
182+ , "language options" =:
183+ "\\textgerman[variant=swiss]{hoechdeutsche}" =?>
184+ para (spanWith ("", [], [("lang", "de-CH")]) $ str "hoechdeutsche")
185+ , "unknown option fallback" =:
186+ "\\textgerman[variant=moon]{ueberhoechdeutsche}" =?>
187+ para (spanWith ("", [], [("lang", "de")]) $ str "ueberhoechdeutsche")
188+ ]
169189 ]
170190
171191baseCitation :: Citation