enhance renderer.py

This commit is contained in:
Sina Atalay 2024-02-07 19:17:10 +01:00
parent ed93a781f5
commit 43c5cd0cbf
1 changed files with 64 additions and 7 deletions

View File

@ -15,7 +15,7 @@ import importlib.resources
import shutil import shutil
import sys import sys
from datetime import date as Date from datetime import date as Date
from typing import Optional, Literal from typing import Optional, Literal, Any
import jinja2 import jinja2
@ -346,6 +346,33 @@ def divide_length_by(length: str, divider: float) -> str:
return str(float(value) / divider) + " " + unit return str(float(value) / divider) + " " + unit
def get_an_item_with_a_specific_attribute_value(
items: list[Any], attribute: str, value: Any
) -> Any:
"""Get an item from a list of items with a specific attribute value.
This function can be used as a Jinja2 filter in templates.
Args:
items (list[Any]): The list of items.
attribute (str): The attribute to check.
value (Any): The value of the attribute.
Returns:
Any: The item with the specific attribute value.
"""
if items is not None:
for item in items:
if not hasattr(item, attribute):
raise AttributeError(
f"The attribute {attribute} doesn't exist in the item {item}!"
)
else:
if getattr(item, attribute) == value:
return item
return None
def setup_jinja2_environment() -> jinja2.Environment: def setup_jinja2_environment() -> jinja2.Environment:
"""Setup and return the Jinja2 environment for templating the $\\LaTeX$ files. """Setup and return the Jinja2 environment for templating the $\\LaTeX$ files.
@ -376,6 +403,9 @@ def setup_jinja2_environment() -> jinja2.Environment:
environment.filters["make_it_something"] = make_matched_part_something environment.filters["make_it_something"] = make_matched_part_something
environment.filters["divide_length_by"] = divide_length_by environment.filters["divide_length_by"] = divide_length_by
environment.filters["abbreviate_name"] = abbreviate_name environment.filters["abbreviate_name"] = abbreviate_name
environment.filters["get_an_item_with_a_specific_attribute_value"] = (
get_an_item_with_a_specific_attribute_value
)
return environment return environment
@ -384,7 +414,7 @@ def generate_latex_file(
rendercv_data_model: dm.RenderCVDataModel, output_directory: pathlib.Path rendercv_data_model: dm.RenderCVDataModel, output_directory: pathlib.Path
) -> pathlib.Path: ) -> pathlib.Path:
"""Generate the $\\LaTeX$ file with the given data model and write it to the output """Generate the $\\LaTeX$ file with the given data model and write it to the output
directory. It also copies the theme files to the output directory. directory.
Args: Args:
rendercv_data_model (dm.RenderCVDataModel): The data model. rendercv_data_model (dm.RenderCVDataModel): The data model.
@ -406,11 +436,21 @@ def generate_latex_file(
latex_file_path = output_directory / latex_file_name latex_file_path = output_directory / latex_file_name
latex_file_object.write_to_file(latex_file_path) latex_file_object.write_to_file(latex_file_path)
# copy auxiliary theme files (all the folders and files except the .j2.tex files and return latex_file_path
# .py files) to the output directory:
theme_directory = importlib.resources.files(
f"rendercv.themes.{rendercv_data_model.design.theme}" def copy_theme_files_to_output_directory(
) theme_name: str, output_directory: pathlib.Path
):
"""Copy the auxiliary files (all the files that don't end with `.j2.tex` and `.py`)
of the theme to the output directory. For example, the "classic" theme has custom
fonts, and the $\\LaTeX$ needs it.
Args:
theme_name (str): The name of the theme.
output_directory (pathlib.Path): Path to the output directory.
"""
theme_directory = importlib.resources.files(f"rendercv.themes.{theme_name}")
for theme_file in theme_directory.iterdir(): for theme_file in theme_directory.iterdir():
if not ("j2.tex" in theme_file.name or "py" in theme_file.name): if not ("j2.tex" in theme_file.name or "py" in theme_file.name):
if theme_file.is_dir(): if theme_file.is_dir():
@ -422,6 +462,23 @@ def generate_latex_file(
else: else:
shutil.copyfile(str(theme_file), output_directory / theme_file.name) shutil.copyfile(str(theme_file), output_directory / theme_file.name)
def generate_latex_file_and_copy_theme_files(
rendercv_data_model: dm.RenderCVDataModel, output_directory: pathlib.Path
) -> pathlib.Path:
"""Generate the $\\LaTeX$ file with the given data model in the output directory and
copy the auxiliary theme files to the output directory.
Args:
rendercv_data_model (dm.RenderCVDataModel): The data model.
output_directory (pathlib.Path): Path to the output directory.
Returns:
pathlib.Path: The path to the generated $\\LaTeX$ file.
"""
latex_file_path = generate_latex_file(rendercv_data_model, output_directory)
copy_theme_files_to_output_directory(
rendercv_data_model.design.theme, output_directory
)
return latex_file_path return latex_file_path