Template injection function extended to multiple fields; tests added and adjusted

This commit is contained in:
Nicolas 2025-05-30 12:51:34 +02:00
parent a413d771b3
commit a65bb1c8e5
5 changed files with 56 additions and 9 deletions

View File

@ -246,30 +246,40 @@ def _create_document_writer() -> 'DocumentWriter':
return new_dwr
def inject_to_template(content: str, template_path: str = '', internal_template: str = '') -> str:
def inject_to_template(fields_dict: dict[str, str],
template_path: str = '',
internal_template: str = '',
template_string: str = '',
) -> str:
"""
injects a content string into a template. The placeholder <!--CONTENT-->
injects content fields into a template. The placeholder <!--CONTENT-->
will be replaced by the content. If the placeholder is prefixed with a
'%' comment character, this character will be replaced as well.
Args:
fields_dict: A dictionary with field names as keys and content as values
template_path: Path to a template file
internal_template: Path to a internal default template
template_string: A template string to use directly
Returns:
Template with included content
"""
assert isinstance(fields_dict, dict), 'fields_dict must be a dictionary'
if template_path:
with open(template_path, 'r') as f:
template = f.read()
elif internal_template:
template = _get_pkgutil_string(internal_template)
elif template_string:
template = template_string
else:
raise Exception('No template provided')
assert '<!--CONTENT-->' in template, 'No <!--CONTENT--> expression in template located'
prep_template = re.sub(r"\%?\s*<!--CONTENT-->", '<!--CONTENT-->', template)
return prep_template.replace('<!--CONTENT-->', content)
def replace_field(match: re.Match[str]) -> str:
return fields_dict.get(match.group(1), match.string)
return re.sub(r"(?:\%+\s*)?\<!--(.*?)-->", replace_field, template)
class DocumentWriter():
@ -675,6 +685,7 @@ class DocumentWriter():
font_family: Literal[None, 'serif', 'sans-serif'] = None,
table_renderer: TRenderer = 'simple',
latex_template_path: str = '',
fields_dict: dict[str, str] = {},
figure_scale: float = 1,
engine: latex.LatexEngine = 'pdflatex') -> bool:
"""
@ -683,15 +694,21 @@ class DocumentWriter():
Args:
file_path: The path to save the PDF file to
font_family: Overwrites the front family for figures and the template
table_renderer: The renderer for tables (simple: renderer with column type
guessing for text and numbers; pandas: using the internal pandas LaTeX renderer)
latex_template_path: Path to a LaTeX template file. The
expression <!--CONTENT--> will be replaced by the generated content.
If no path is provided a default template is used.
fields_dict: A dictionary with field names as keys and content as values
replacing the placeholders <!--KEY--> in the template.
figure_scale: Scaling factor for the figure size
engine: LaTeX engine (pdflatex, lualatex, xelatex or tectonic)
Returns:
True if the PDF file was successfully created
"""
latex_code = inject_to_template(self.to_latex(font_family, table_renderer, figure_scale),
content = self.to_latex(font_family, table_renderer, figure_scale)
latex_code = inject_to_template({'CONTENT': content},
latex_template_path,
'templates/default_template.tex')

View File

@ -50,7 +50,7 @@ def validate_html(html_string: str, validate_online: bool = False, check_for: li
assert tag_type in tags, f"Tag {tag_type} not found in the html code"
if validate_online:
test_page = pyladoc.inject_to_template(html_string, internal_template='templates/test_template.html')
test_page = pyladoc.inject_to_template({'CONTENT': html_string}, internal_template='templates/test_template.html')
validation_result = validate_html_with_w3c(test_page)
assert 'messages' in validation_result, 'Validate request failed'
if validation_result['messages']:

View File

@ -158,7 +158,7 @@ def test_html_render():
if WRITE_RESULT_FILES:
with open('tests/out/test_html_render1.html', 'w', encoding='utf-8') as f:
f.write(pyladoc.inject_to_template(html_code, internal_template='templates/test_template.html'))
f.write(pyladoc.inject_to_template({'CONTENT': html_code}, internal_template='templates/test_template.html'))
def test_latex_render():

View File

@ -90,9 +90,11 @@ def test_html_render():
document_validation.validate_html(html_code, VALIDATE_HTML_CODE_ONLINE)
title = 'Test HTML Render 2'
if WRITE_RESULT_FILES:
with open('tests/out/test_html_render2.html', 'w', encoding='utf-8') as f:
f.write(pyladoc.inject_to_template(html_code, internal_template='templates/test_template.html'))
f.write(pyladoc.inject_to_template({'CONTENT': html_code}, internal_template='templates/test_template.html'))
def test_latex_render():

View File

@ -0,0 +1,28 @@
import pyladoc
def test_inject_to_template():
template = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><!--TITLE--></title>
</head>
<!-- some comment -->
<body>
<!--CONTENT-->
</body>
</html>
"""
content = "Hello, World!"
title = "Test Title"
result = pyladoc.inject_to_template({'CONTENT': content, 'TITLE': title},template_string=template)
print(result)
assert "Hello, World!" in result
assert "<title>Test Title</title>" in result