{-# 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) ])