From 622c3f2fa6c29ecc33502f63ae6f33e59c11c96c Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Sat, 12 Aug 2017 12:17:38 -0700 Subject: Change to yaml for translation files. --- data/translations/de.trans | 19 ------------- data/translations/de.yaml | 19 +++++++++++++ data/translations/en.trans | 19 ------------- data/translations/en.yaml | 19 +++++++++++++ data/translations/fr.trans | 19 ------------- data/translations/fr.yaml | 19 +++++++++++++ pandoc.cabal | 2 +- src/Text/Pandoc/Class.hs | 13 ++++----- src/Text/Pandoc/Translations.hs | 59 ++++++++++++++++++++++++++--------------- 9 files changed, 102 insertions(+), 86 deletions(-) delete mode 100644 data/translations/de.trans create mode 100644 data/translations/de.yaml delete mode 100644 data/translations/en.trans create mode 100644 data/translations/en.yaml delete mode 100644 data/translations/fr.trans create mode 100644 data/translations/fr.yaml diff --git a/data/translations/de.trans b/data/translations/de.trans deleted file mode 100644 index ff7aa049c..000000000 --- a/data/translations/de.trans +++ /dev/null @@ -1,19 +0,0 @@ -Preface: Vorwort -References: Literatur -Abstract: Zusammenfassung -Bibliography: Literaturverzeichnis -Chapter: Kapitel -Appendix: Anhang -Contents: Inhaltsverzeichnis -ListOfFigures: Abbildungsverzeichnis -ListOfTables: Tabellenverzeichnis -Index: Index -Figure: Abbildung -Table: Tabelle -Part: Teil -Page: Seite -Proof: Beweis -See: siehe -SeeAlso: siehe auch -Cc: Verteiler -To: An diff --git a/data/translations/de.yaml b/data/translations/de.yaml new file mode 100644 index 000000000..ff7aa049c --- /dev/null +++ b/data/translations/de.yaml @@ -0,0 +1,19 @@ +Preface: Vorwort +References: Literatur +Abstract: Zusammenfassung +Bibliography: Literaturverzeichnis +Chapter: Kapitel +Appendix: Anhang +Contents: Inhaltsverzeichnis +ListOfFigures: Abbildungsverzeichnis +ListOfTables: Tabellenverzeichnis +Index: Index +Figure: Abbildung +Table: Tabelle +Part: Teil +Page: Seite +Proof: Beweis +See: siehe +SeeAlso: siehe auch +Cc: Verteiler +To: An diff --git a/data/translations/en.trans b/data/translations/en.trans deleted file mode 100644 index 0bdc172af..000000000 --- a/data/translations/en.trans +++ /dev/null @@ -1,19 +0,0 @@ -Preface: Preface -References: References -Abstract: Abstract -Bibliography: Bibliography -Chapter: Chapter -Appendix: Appendix -Contents: Contents -ListOfFigures: ListOfFigures -ListOfTables: ListOfTables -Index: Index -Figure: Figure -Table: Table -Part: Part -Page: page -Proof: Proof -See: see -SeeAlso: see also -Cc: cc -To: To diff --git a/data/translations/en.yaml b/data/translations/en.yaml new file mode 100644 index 000000000..0bdc172af --- /dev/null +++ b/data/translations/en.yaml @@ -0,0 +1,19 @@ +Preface: Preface +References: References +Abstract: Abstract +Bibliography: Bibliography +Chapter: Chapter +Appendix: Appendix +Contents: Contents +ListOfFigures: ListOfFigures +ListOfTables: ListOfTables +Index: Index +Figure: Figure +Table: Table +Part: Part +Page: page +Proof: Proof +See: see +SeeAlso: see also +Cc: cc +To: To diff --git a/data/translations/fr.trans b/data/translations/fr.trans deleted file mode 100644 index a1415d846..000000000 --- a/data/translations/fr.trans +++ /dev/null @@ -1,19 +0,0 @@ -Preface: Préface -References: Références -Abstract: Résumé -Bibliography: Bibliographie -Chapter: Chaptire -Appendix: Annexe -Contents: Table des matières -ListOfFigures: Table des figures -ListOfTables: Liste des tableaux -Index: Index -Figure: Fig. -Table: Tab. -Part: partie -Page: page -Proof: Démonstration -See: voir -SeeAlso: voir aussi -Cc: Copie à -To: diff --git a/data/translations/fr.yaml b/data/translations/fr.yaml new file mode 100644 index 000000000..a1415d846 --- /dev/null +++ b/data/translations/fr.yaml @@ -0,0 +1,19 @@ +Preface: Préface +References: Références +Abstract: Résumé +Bibliography: Bibliographie +Chapter: Chaptire +Appendix: Annexe +Contents: Table des matières +ListOfFigures: Table des figures +ListOfTables: Liste des tableaux +Index: Index +Figure: Fig. +Table: Tab. +Part: partie +Page: page +Proof: Démonstration +See: voir +SeeAlso: voir aussi +Cc: Copie à +To: diff --git a/pandoc.cabal b/pandoc.cabal index 07bb36f95..9392b4430 100644 --- a/pandoc.cabal +++ b/pandoc.cabal @@ -73,7 +73,7 @@ Data-Files: data/templates/default.epub2 data/templates/default.epub3 -- translations - data/translations/*.trans + data/translations/*.yaml -- source files for reference.docx data/docx/[Content_Types].xml data/docx/_rels/.rels diff --git a/src/Text/Pandoc/Class.hs b/src/Text/Pandoc/Class.hs index 80ebd58b4..074181c92 100644 --- a/src/Text/Pandoc/Class.hs +++ b/src/Text/Pandoc/Class.hs @@ -79,7 +79,7 @@ module Text.Pandoc.Class ( PandocMonad(..) , toLang , setTranslations , translateTerm - , Translations(..) + , Translations , Term(..) ) where @@ -135,7 +135,8 @@ import System.IO (stderr) import qualified Data.Map as M import Text.Pandoc.Error import Text.Pandoc.BCP47 (Lang(..), parseBCP47, renderLang) -import Text.Pandoc.Translations (Term(..), Translations(..), readTranslations) +import Text.Pandoc.Translations (Term(..), Translations, lookupTerm, + readTranslations) import qualified Debug.Trace #ifdef EMBED_DATA_FILES import Text.Pandoc.Data (dataFiles) @@ -343,8 +344,8 @@ getTranslations = do Nothing -> return mempty -- no language defined Just (_, Just t) -> return t Just (lang, Nothing) -> do -- read from file - let translationFile = "translations/" ++ renderLang lang ++ ".trans" - let fallbackFile = "translations/" ++ langLanguage lang ++ ".trans" + let translationFile = "translations/" ++ renderLang lang ++ ".yaml" + let fallbackFile = "translations/" ++ langLanguage lang ++ ".yaml" let getTrans bs = case readTranslations (UTF8.toString bs) of Left e -> do @@ -374,8 +375,8 @@ getTranslations = do -- Issue a warning if the term is not defined. translateTerm :: PandocMonad m => Term -> m String translateTerm term = do - Translations termMap <- getTranslations - case M.lookup term termMap of + translations <- getTranslations + case lookupTerm term translations of Just s -> return s Nothing -> do report $ NoTranslation (show term) diff --git a/src/Text/Pandoc/Translations.hs b/src/Text/Pandoc/Translations.hs index 2185366fd..e2091f0a8 100644 --- a/src/Text/Pandoc/Translations.hs +++ b/src/Text/Pandoc/Translations.hs @@ -40,13 +40,19 @@ just the language part. File format is: -} module Text.Pandoc.Translations ( Term(..) - , Translations(..) + , Translations + , lookupTerm , readTranslations ) where +import qualified Data.HashMap.Strict as HM import qualified Data.Map as M import GHC.Generics (Generic) -import Text.Pandoc.Shared (trim, safeRead) +import qualified Text.Pandoc.UTF8 as UTF8 +import Data.Text as T +import Text.Pandoc.Shared (safeRead) +import Data.Yaml as Yaml +import Data.Aeson.Types (typeMismatch) data Term = Preface @@ -68,27 +74,36 @@ data Term = | SeeAlso | Cc | To - deriving (Show, Eq, Ord, Generic, Read) + deriving (Show, Eq, Ord, Generic, Enum, Read) newtype Translations = Translations (M.Map Term String) - deriving (Show, Eq, Ord, Generic, Monoid) + deriving (Show, Generic, Monoid) -readTranslations :: String -> Either String Translations -readTranslations = foldr parseLine (Right mempty) . lines +instance FromJSON Term where + parseJSON (String t) = case safeRead (T.unpack t) of + Just t' -> pure t' + Nothing -> fail $ "Invalid Term name " ++ + show t + parseJSON invalid = typeMismatch "Term" invalid + +instance FromJSON Translations where + parseJSON (Object hm) = do + xs <- mapM addItem (HM.toList hm) + return $ Translations (M.fromList xs) + where addItem (k,v) = + case safeRead (T.unpack k) of + Nothing -> fail $ "Invalid Term name " ++ show k + Just t -> + case v of + (String s) -> return (t, T.unpack $ T.strip s) + inv -> typeMismatch "String" inv + parseJSON invalid = typeMismatch "Translations" invalid -parseLine :: String - -> Either String Translations - -> Either String Translations -parseLine _ (Left s) = Left s -parseLine ('#':_) x = x -parseLine [] x = x -parseLine t (Right (Translations tm)) = - if null rest - then Left $ "no colon in " ++ term - else - case safeRead term of - Nothing -> Left $ term ++ " is not a recognized term name" - Just term' -> Right (Translations $ (M.insert term' defn) tm) - where (trm, rest) = break (\c -> c == ':') t - defn = trim $ drop 1 rest - term = trim trm +lookupTerm :: Term -> Translations -> Maybe String +lookupTerm t (Translations tm) = M.lookup t tm + +readTranslations :: String -> Either String Translations +readTranslations s = + case Yaml.decodeEither' $ UTF8.fromString s of + Left err' -> Left $ prettyPrintParseException err' + Right t -> Right t -- cgit v1.2.3