mirror of https://github.com/eyhc1/rendercv.git
enhance renderer.py
This commit is contained in:
parent
56a0c8dfd7
commit
0cf9f0f6db
|
@ -10,6 +10,8 @@ templates. Then, the $\\LaTeX$ file is rendered into a PDF with
|
||||||
import subprocess
|
import subprocess
|
||||||
import re
|
import re
|
||||||
import pathlib
|
import pathlib
|
||||||
|
import importlib.resources
|
||||||
|
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
|
||||||
|
@ -156,6 +158,13 @@ def make_matched_part_something(
|
||||||
or
|
or
|
||||||
[make_matched_part_non_line_breakable](renderer.md#rendercv.rendering.make_matched_part_non_line_breakable)
|
[make_matched_part_non_line_breakable](renderer.md#rendercv.rendering.make_matched_part_non_line_breakable)
|
||||||
instead.
|
instead.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
value (str): The string to make something.
|
||||||
|
something (str): The LaTeX command to use.
|
||||||
|
match_str (str): The string to match.
|
||||||
|
Returns:
|
||||||
|
str: The string with the matched part something.
|
||||||
"""
|
"""
|
||||||
if match_str is None:
|
if match_str is None:
|
||||||
return f"\\{something}{{{value}}}"
|
return f"\\{something}{{{value}}}"
|
||||||
|
@ -186,6 +195,8 @@ def make_matched_part_bold(value: str, match_str: Optional[str] = None) -> str:
|
||||||
Args:
|
Args:
|
||||||
value (str): The string to make bold.
|
value (str): The string to make bold.
|
||||||
match_str (str): The string to match.
|
match_str (str): The string to match.
|
||||||
|
Returns:
|
||||||
|
str: The string with the matched part bold.
|
||||||
"""
|
"""
|
||||||
return make_matched_part_something(value, "textbf", match_str)
|
return make_matched_part_something(value, "textbf", match_str)
|
||||||
|
|
||||||
|
@ -208,6 +219,8 @@ def make_matched_part_underlined(value: str, match_str: Optional[str] = None) ->
|
||||||
Args:
|
Args:
|
||||||
value (str): The string to make underlined.
|
value (str): The string to make underlined.
|
||||||
match_str (str): The string to match.
|
match_str (str): The string to match.
|
||||||
|
Returns:
|
||||||
|
str: The string with the matched part underlined.
|
||||||
"""
|
"""
|
||||||
return make_matched_part_something(value, "underline", match_str)
|
return make_matched_part_something(value, "underline", match_str)
|
||||||
|
|
||||||
|
@ -230,6 +243,8 @@ def make_matched_part_italic(value: str, match_str: Optional[str] = None) -> str
|
||||||
Args:
|
Args:
|
||||||
value (str): The string to make italic.
|
value (str): The string to make italic.
|
||||||
match_str (str): The string to match.
|
match_str (str): The string to match.
|
||||||
|
Returns:
|
||||||
|
str: The string with the matched part italic.
|
||||||
"""
|
"""
|
||||||
return make_matched_part_something(value, "textit", match_str)
|
return make_matched_part_something(value, "textit", match_str)
|
||||||
|
|
||||||
|
@ -254,6 +269,8 @@ def make_matched_part_non_line_breakable(
|
||||||
Args:
|
Args:
|
||||||
value (str): The string to disable line breaks.
|
value (str): The string to disable line breaks.
|
||||||
match_str (str): The string to match.
|
match_str (str): The string to match.
|
||||||
|
Returns:
|
||||||
|
str: The string with the matched part non line breakable.
|
||||||
"""
|
"""
|
||||||
return make_matched_part_something(value, "mbox", match_str)
|
return make_matched_part_something(value, "mbox", match_str)
|
||||||
|
|
||||||
|
@ -299,6 +316,12 @@ def divide_length_by(length: str, divider: float) -> str:
|
||||||
will return:
|
will return:
|
||||||
|
|
||||||
`#!python "5.2cm"`
|
`#!python "5.2cm"`
|
||||||
|
|
||||||
|
Args:
|
||||||
|
length (str): The length to divide.
|
||||||
|
divider (float): The number to divide the length by.
|
||||||
|
Returns:
|
||||||
|
str: The divided length.
|
||||||
"""
|
"""
|
||||||
# Get the value as a float and the unit as a string:
|
# Get the value as a float and the unit as a string:
|
||||||
value = re.search(r"\d+\.?\d*", length)
|
value = re.search(r"\d+\.?\d*", length)
|
||||||
|
@ -349,19 +372,49 @@ def setup_jinja2_environment() -> jinja2.Environment:
|
||||||
|
|
||||||
@time_the_event_below("Generating the LaTeX file")
|
@time_the_event_below("Generating the LaTeX file")
|
||||||
def generate_latex_file(
|
def generate_latex_file(
|
||||||
rendercv_data_model: dm.RenderCVDataModel, latex_file_path: pathlib.Path
|
rendercv_data_model: dm.RenderCVDataModel, output_directory: pathlib.Path
|
||||||
):
|
) -> pathlib.Path:
|
||||||
"""Generate the $\\LaTeX$ file with the given data model and write it to the given
|
"""Generate the $\\LaTeX$ file with the given data model and write it to the output
|
||||||
path.
|
directory. It also copies the 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.
|
||||||
"""
|
"""
|
||||||
|
# create output directory if it doesn't exist:
|
||||||
|
if not output_directory.is_dir():
|
||||||
|
output_directory.mkdir(parents=True)
|
||||||
|
|
||||||
jinja2_environment = setup_jinja2_environment()
|
jinja2_environment = setup_jinja2_environment()
|
||||||
latex_file_object = LaTeXFile(
|
latex_file_object = LaTeXFile(
|
||||||
rendercv_data_model,
|
rendercv_data_model,
|
||||||
jinja2_environment,
|
jinja2_environment,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
latex_file_name = f"{rendercv_data_model.cv.name.replace(' ', '_')}_CV.tex"
|
||||||
|
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
|
||||||
|
# .py files) to the output directory:
|
||||||
|
theme_directory = importlib.resources.files(
|
||||||
|
f"rendercv.themes.{rendercv_data_model.design.theme}"
|
||||||
|
)
|
||||||
|
for theme_file in theme_directory.iterdir():
|
||||||
|
if not ("j2.tex" in theme_file.name or "py" in theme_file.name):
|
||||||
|
if theme_file.is_dir():
|
||||||
|
shutil.copytree(
|
||||||
|
theme_file,
|
||||||
|
output_directory / theme_file.name,
|
||||||
|
dirs_exist_ok=True,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
shutil.copyfile(theme_file, output_directory / theme_file.name)
|
||||||
|
|
||||||
|
return latex_file_path
|
||||||
|
|
||||||
|
|
||||||
@time_the_event_below("Generating the PDF file")
|
@time_the_event_below("Generating the PDF file")
|
||||||
def latex_to_pdf(latex_file_path: pathlib.Path) -> pathlib.Path:
|
def latex_to_pdf(latex_file_path: pathlib.Path) -> pathlib.Path:
|
||||||
|
|
Loading…
Reference in New Issue