From 0fe906ae7453aa684e998bbcc7a78b62d84f0206 Mon Sep 17 00:00:00 2001 From: Joris Guyonvarch Date: Sun, 6 Apr 2014 22:55:16 +0200 Subject: Show resume and projects from a configuration file --- src/View/LaTeX/Resume.hs | 148 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 src/View/LaTeX/Resume.hs (limited to 'src/View/LaTeX') diff --git a/src/View/LaTeX/Resume.hs b/src/View/LaTeX/Resume.hs new file mode 100644 index 0000000..6ec717f --- /dev/null +++ b/src/View/LaTeX/Resume.hs @@ -0,0 +1,148 @@ +{-# LANGUAGE OverloadedStrings #-} + +module View.LaTeX.Resume + ( resumeLaTeX + ) where + +import Text.LaTeX +import Text.LaTeX.Base.Syntax (LaTeX (TeXComm), TeXArg (FixArg)) + +import Data.Maybe (fromMaybe, listToMaybe) + +import Conf (Conf) +import qualified Conf as Conf + +import Model (Model) +import qualified Model as M +import qualified Model.Company as C +import Model.Date (Date) +import Model.Degree (Degree) +import qualified Model.Degree as D +import Model.Identity (Identity) +import qualified Model.Identity as I +import Model.Job (Job) +import qualified Model.Job as J +import qualified Model.School as S +import Model.SkillType (SkillType) +import qualified Model.SkillType as ST + +import Model.Translated +import Model.Translation.Key (Key) +import qualified Model.Translation.Key as K +import Model.Translation.Language +import Model.Translation.Message + +import View.Interval (renderDurationAndInterval) + +import Utils.String + +resumeLaTeX :: Conf -> Language -> Date -> Model -> LaTeX +resumeLaTeX conf language currentDate model = + preamble + <> document (body conf language currentDate model) + +preamble :: LaTeX +preamble = documentclass [] "resume" + +body :: Conf -> Language -> Date -> Model -> LaTeX +body conf language currentDate model = + identityLaTeX conf language (M.identity model) (M.jobs model) + <> jobsLaTeX language currentDate (M.jobs model) + <> degreesLaTeX language (M.degrees model) + <> skillTypesLaTeX language (M.skillTypes model) + <> interestsLaTeX language (M.interests model) + +identityLaTeX :: Conf -> Language -> Identity -> [Job] -> LaTeX +identityLaTeX conf language identity jobs = + TeXComm "header" + [ FixArg (fromString $ I.name identity) + , FixArg (fromString . fromMaybe "" . (fmap (getTranslation language . J.name)) . listToMaybe $ jobs) + , FixArg (fromString $ I.website identity) + , FixArg (fromString $ Conf.git conf) + , FixArg (fromString $ I.git identity) + ] + +jobsLaTeX :: Language -> Date -> [Job] -> LaTeX +jobsLaTeX language currentDate jobs = + translatedSection K.Experience language + <> mconcat (map (jobLaTeX language currentDate) jobs) + +jobLaTeX :: Language -> Date -> Job -> LaTeX +jobLaTeX language currentDate job = + customCommand "position" + [ fromString . getTranslation language $ J.name job + , fromString $ renderDurationAndInterval language currentDate (J.beginDate job) (J.endDate job) + , fromString $ ((C.name . J.company) job) ++ ", " ++ ((C.location . J.company) job) + , (fromString . getTranslation language . J.description $ job) + , case J.details job of + Just details@(_:_) -> translatedBullets language details + _ -> mempty + , case J.technos job of + Just ts -> technos ts + _ -> mempty + ] + +degreesLaTeX :: Language -> [Degree] -> LaTeX +degreesLaTeX language degrees = + translatedSection K.EducationalBackground language + <> mconcat (map (degreeLaTeX language) degrees) + +degreeLaTeX :: Language -> Degree -> LaTeX +degreeLaTeX language degree = + customCommand "position" + [ fromString . getTranslation language $ D.name degree + , fromString . show . D.year $ degree + , fromString $ S.name school ++ (fromMaybe "" (((++) ", ") <$> S.location school)) + , mempty + , translatedBullets language $ D.topics degree + , mempty + ] + where school = D.school degree + +skillTypesLaTeX :: Language -> [SkillType] -> LaTeX +skillTypesLaTeX language skillTypes = + translatedSection K.Skills language + <> (mconcat . map (skillTypeLaTeX language) $ skillTypes) + +skillTypeLaTeX :: Language -> SkillType -> LaTeX +skillTypeLaTeX language skillType = + subsection (fromString . capitalizeFirstWord . getTranslation language . ST.name $ skillType) + <> translatedBullets language (ST.skills skillType) + +interestsLaTeX :: Language -> [Translated] -> LaTeX +interestsLaTeX language interests = + translatedSection K.Interests language + <> translatedBullets language interests + +translatedBullets :: Language -> [Translated] -> LaTeX +translatedBullets language = itemsEnv "bullets" . map (getTranslation language) + +itemsEnv :: String -> [String] -> LaTeX +itemsEnv name items = + environment name . mconcat . concat . map getItem $ items + where getItem i = + [ item Nothing + , fromString . capitalizeFirstWord $ i + ] + +technos :: [String] -> LaTeX +technos names = + environment "technos" . mconcat . concat . map getItem $ names + where getItem name = + [ item Nothing + , TeXComm "techno" [ FixArg (fromString name) ] + ] + +translatedSection :: Key -> Language -> LaTeX +translatedSection key language = + section (fromString . capitalizeWords $ getMessage key language) + +customCommand :: String -> [LaTeX] -> LaTeX +customCommand commandName commandParameters = + TeXComm commandName (map FixArg commandParameters) + +environment :: String -> LaTeX -> LaTeX +environment name inside = + (TeXComm "begin" [ FixArg (fromString name) ]) + <> inside + <> (TeXComm "end" [ FixArg (fromString name) ]) -- cgit v1.2.3