From 67c48776acb4d010162677ef829670d6967bb640 Mon Sep 17 00:00:00 2001 From: Nicolas Date: Fri, 28 Mar 2025 13:30:08 +0100 Subject: [PATCH] first commit --- .flake8 | 21 + .gitignore | 134 ++ README.md | 111 ++ pyproject.toml | 58 + src/pyladoc/__init__.py | 570 ++++++++ src/pyladoc/latex.py | 346 +++++ src/pyladoc/latex_escaping.py | 89 ++ src/pyladoc/templates/default_template.tex | 38 + src/pyladoc/templates/test_template.html | 114 ++ tests/document_validation.py | 64 + tests/out/test_html_render.html | 1525 ++++++++++++++++++++ tests/out/test_latex_render.pdf | Bin 0 -> 164342 bytes tests/out/test_markdown_characters.html | 5 + tests/out/test_markdown_equations.html | 39 + tests/out/test_markdown_style.html | 44 + tests/out/test_markdown_table.html | 77 + tests/test_latex_tools.py | 151 ++ tests/test_rendering_example_doc.py | 108 ++ tests/test_rendering_markdown.py | 152 ++ 19 files changed, 3646 insertions(+) create mode 100644 .flake8 create mode 100644 .gitignore create mode 100644 README.md create mode 100644 pyproject.toml create mode 100644 src/pyladoc/__init__.py create mode 100644 src/pyladoc/latex.py create mode 100644 src/pyladoc/latex_escaping.py create mode 100644 src/pyladoc/templates/default_template.tex create mode 100644 src/pyladoc/templates/test_template.html create mode 100644 tests/document_validation.py create mode 100644 tests/out/test_html_render.html create mode 100644 tests/out/test_latex_render.pdf create mode 100644 tests/out/test_markdown_characters.html create mode 100644 tests/out/test_markdown_equations.html create mode 100644 tests/out/test_markdown_style.html create mode 100644 tests/out/test_markdown_table.html create mode 100644 tests/test_latex_tools.py create mode 100644 tests/test_rendering_example_doc.py create mode 100644 tests/test_rendering_markdown.py diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..eb1eb4f --- /dev/null +++ b/.flake8 @@ -0,0 +1,21 @@ +[flake8] +# Specify the maximum allowed line length +max-line-length = 88 + +# Ignore specific rules +# For example, E501: Line too long, W503: Line break before binary operator +ignore = E501, W503, W504 + +# Exclude specific files or directories +exclude = + .git, + __pycache__, + build, + dist, + .conda + .venv + venv + +# Enable specific plugins or options +# Example: Enabling flake8-docstrings +select = C,E,F,W,D \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..373d2df --- /dev/null +++ b/.gitignore @@ -0,0 +1,134 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +.venv/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +pyModbusTCP_old/ +test.py +test_*.ipynb +settings.json \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..68e35a8 --- /dev/null +++ b/README.md @@ -0,0 +1,111 @@ +# Pyladoc + +## Description +Pyladoc is a python package for programmatically generating HTML and +PDF/LaTex output. This package targets specifically applications where reports +or results with Pandas-tables and Matplotlib-figures are generated programmatically +to be displayed as website and as PDF document without any manual formatting +steps. + +This package focuses on the "Document in Code" approach for cases +where a lot of calculations and data handling is done but not a lot of +document text needs to be displayed. + +As backend for PDF generation LaTex is used. There are excellent engines for +rendering HTML to PDF available, but even if there is no requirement for an +accurate typesetting, placing programmatically content of variable +composition and sizes on fixed size pages without manual intervention +is a hard problem that LaTeX is very capable of. + +### Sported primitives +- Text (can be Markdown or HTML formatted) +- Headings +- Tables (Pandas, Markdown or HTML) +- Matplotlib figures +- LaTex equations +- Named references for figures, tables and equation + +### Key Features +- HTML and PDF/LaTex rendering of the same document +- Single file output including figures +- Figure and equation embedding in HTML by inline SVG, SVG in Base64 or PNG in Base64 +- Figure embedding in LaTex as PGF/TikZ + +### Usage Scenarios +- Webservices +- Report generation for lab equipment + +## Installation +It can be installed with pip: + +```bash +pip install pyladoc +``` + +## Usage +It is easy to use as the following example code shows: + +```python +import pyladoc + +doc = pyladoc.DocumentWriter() + +doc.add_markdown(""" + # Example + This is an example. The @table:pandas_example shows some random data. + """) + +some_data = { + 'Row1': ["Line1", "Line2", "Line3"], + 'Row2': [120, 100, 110], + 'Row3': ['12 g/km', '> 150 g/km', '110 g/km'] +} +df = pd.DataFrame(some_data) +dw.add_table(df, 'This is a pandas example table', 'pandas_example') + +html_code = doc.to_html() + +doc.to_pdf('test.pdf') +``` + +## Example outputs +The following documents are generated by tests/test_rendering_example_doc.py: + +- HTML: [test_html_render.html](tests/out/test_html_render.html) +- PDF: [test_latex_render.pdf](tests/out/test_latex_render.pdf) + +## Contributing +Contributions are welcome, please open an issue or submit a pull request on GitHub. + +## Developer Guide +To get started with developing the `pyladoc` package, follow these steps. + +First, clone the repository to your local machine using Git: + +```bash +git clone https://github.com/Nonannet/pyladoc.git +cd pyladoc +``` + +It's recommended to setup an venv: + +```bash +python -m venv venv +source venv/bin/activate # On Windows use `venv\Scripts\activate` +``` + +Install the package and dev-dependencies while keeping files in the +current directory: + +```bash +pip install -e .[dev] +``` + +Ensure that everything is set up correctly by running the tests: + +```bash +pytest +``` + +## License +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..38b877d --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,58 @@ +[project] +name = "pyladoc" +version = "1.0.0" +authors = [ + { name="Nicolas Kruse", email="nicolas.kruse@nonan.net" }, +] +description = "Package for generating HTML and PDF/latex from python code" +readme = "README.md" +requires-python = ">=3.8" +classifiers = [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", +] +dependencies = [ + "markdown>=3.3.0", + "beautifulsoup4>=4.9.1" +] + +[project.optional-dependencies] +dev = [ + "pytest", "flake8", "mypy", + "lxml", "types-lxml", + "requests", + "matplotlib>=3.1.1", + "pandas>=2.0.0", "Jinja2", +] + +[project.urls] +Homepage = "https://github.com/Nonannet/pyladoc" +Repository = "https://github.com/Nonannet/pyladoc" +Issues = "https://github.com/Nonannet/pyladoc/issues" + +[build-system] +requires = ["setuptools>=61.0", "wheel"] +build-backend = "setuptools.build_meta" + +[tool.setuptools.packages.find] +where = ["src"] + +[tool.setuptools.package-data] +pyladoc = ["templates/*"] + + +[tool.mypy] +files = ["src"] +strict = true +warn_return_any = true +warn_unused_configs = true +check_untyped_defs = true +no_implicit_optional = true +show_error_codes = true + +[tool.pytest.ini_options] +minversion = "6.0" +addopts = "-ra -q" +testpaths = ["tests"] +pythonpath = ["src"] \ No newline at end of file diff --git a/src/pyladoc/__init__.py b/src/pyladoc/__init__.py new file mode 100644 index 0000000..6b7d44a --- /dev/null +++ b/src/pyladoc/__init__.py @@ -0,0 +1,570 @@ +from typing import Callable, Generator, Self, Literal, TYPE_CHECKING +import html +import markdown +from base64 import b64encode +import re +import io +from . import latex +import pkgutil + + +HTML_OUTPUT = 0 +LATEX_OUTPUT = 1 + +if TYPE_CHECKING: + from pandas import DataFrame + from pandas.io.formats.style import Styler + import matplotlib.pyplot as plt + from matplotlib.figure import Figure + from matplotlib.legend import Legend as Mpl_Legend + from matplotlib.text import Text as Mpl_Text + + Table = DataFrame | Styler +else: + try: + from pandas import DataFrame + except ImportError: + DataFrame = None + + try: + from pandas.io.formats.style import Styler + Table = DataFrame | Styler + except ImportError: + Table = DataFrame + + try: + import matplotlib.pyplot as plt + from matplotlib.figure import Figure + from matplotlib.legend import Legend as Mpl_Legend + from matplotlib.text import Text as Mpl_Text + except ImportError: + Figure = None + + +TRenderer = Literal['pandas', 'simple'] +FFormat = Literal['svg', 'png', 'pgf'] + + +def _get_pkgutil_string(path: str) -> str: + data = pkgutil.get_data(__name__, path) + assert data is not None + return data.decode() + + +def _markdown_to_html(text: str) -> str: + prep_text = re.sub(r'\u00A0', ' ', text) # non-breaking space + html = markdown.markdown(prep_text, extensions=['tables', 'fenced_code', 'def_list', 'abbr', 'sane_lists']) + return html.replace('
', '
') + + +def escape_html(text: str) -> str: + """ + Escapes special HTML characters in a given string. + + Args: + text: The text to escape + + Returns: + Escaped text save for inserting into HTML code + """ + ret = re.sub(r'\u00A0', ' ', text) # non-breaking space + ret = html.escape(ret) + return ' '.join(ret.strip().splitlines()) + + +def _clean_svg(svg_text: str) -> str: + # remove all tags not alllowd for inline svg from metadata: + svg_text = re.sub(r'.*?', '', svg_text, flags=re.DOTALL) + + # remove illegal path-tags without d attribute: + return re.sub(r']*\sd=)\s.*?/>', '', svg_text, flags=re.DOTALL) + +# def _get_templ_vars(template: str) -> list[str]: +# return re.findall(".*?", template, re.DOTALL) + + +def _drop_indent(text: str, amount: int) -> str: + """ + Drops a specific number of indentation spaces from a multiline text. + + Args: + text: The text to drop indentation from + amount: The number of indentation space characters to drop + + Returns: + The text with the specified amount of indentation removed + """ + return ''.join(' ' * amount + line for line in text.splitlines(True)) + + +def _save_figure(fig: Figure, buff: io.BytesIO, figure_format: FFormat, font_family: str | None, scale: float) -> None: + """ + Saves a matplotlib figure to a file-like object. + + Args: + fig: The figure to save + buff: The file-like object to save the figure to + figure_format: The format to save the figure in (svg, png or pgf) + font_family: The font family to use for the figure + """ + def get_all_elements() -> Generator[Mpl_Text, None, None]: + for ax in fig.get_axes(): + yield ax.title + yield ax.xaxis.label + yield ax.yaxis.label + yield from ax.get_xticklabels() + ax.get_yticklabels() + legend: Mpl_Legend = ax.get_legend() + if legend: + yield from legend.get_texts() + + # Store current figure settings + old_state = ((e, e.get_fontfamily()) for e in get_all_elements()) + old_size: tuple[float, float] = tuple(fig.get_size_inches()) # type: ignore[unused-ignore] + + # Adjust figure settings + if font_family: + for e, _ in old_state: + e.set_fontfamily(font_family) + + fig.set_size_inches(old_size[0] * scale, old_size[1] * scale, False) + + # Render figure + backends = {'png': 'AGG', 'svg': 'SVG', 'pgf': 'PGF'} + assert figure_format in backends, 'Figure format can be pgf (vector), svg (vector) or png (raster)' + fig.savefig(buff, format=figure_format, backend=backends[figure_format]) # type: ignore[unused-ignore] + + # Reset figure setting + for e, s in old_state: + e.set_fontfamily(s) + + fig.set_size_inches(old_size, None, False) + + +def figure_to_string(fig: Figure, + figure_format: FFormat = 'svg', + font_family: str | None = None, + scale: float = 1, + alt_text: str = '', + base64: bool = False) -> str: + """ + Converts a matplotlib figure to a ascii-string. For png base64 encoding is + used in general, for svg base64 encoding can be enabled. For base64 encoded + figures a img-tag is included in the output. + + Args: + fig: The figure to convert + figure_format: The format to save the figure in (svg, png or pgf) + font_family: The font family to use for the figure + scale: Scaling factor for the figure size + alt_text: The alt text for the figure + base64: If the format is svg this determine if the image is encode in base64 + + Returns: + The figure as ascii-string + """ + assert fig and isinstance(fig, Figure), 'fig parameter must be a matplotlib figure' + with io.BytesIO() as buff: + _save_figure(fig, buff, figure_format, font_family, scale) + buff.seek(0) + if figure_format == 'pgf': + i = buff.read(2028).find(b'\\begingroup%') # skip comments + buff.seek(max(i, 0)) + return latex.to_ascii(buff.read().decode('utf-8')) + + elif figure_format == 'svg' and not base64: + i = buff.read(2028).find(b'' % \ + (escape_html(alt_text), + image_mime[figure_format], + b64encode(buff.read()).decode('ascii')) # base64 assures (7-bit) ascii + + +def latex_to_figure(latex_code: str) -> Figure: + assert Figure, 'Matplotlib is required for rendering LaTex expressions for HTML output.' # type:ignore[truthy-function] + fig, ax = plt.subplots() + ax.set_xticks([]) + ax.set_yticks([]) + ax.axis('off') + text = plt.text(0.5, 0.5, f'${latex_code}$', horizontalalignment='center', + verticalalignment='center', transform=ax.transAxes) + fig.draw_without_rendering() + bbox = text.get_window_extent() + fig.set_size_inches(bbox.width / fig.dpi * 1.2, bbox.height / fig.dpi * 1.2) + return fig + + +def _fillin_fields(template: str, fields: dict[str, str]) -> str: + html_out = template + for variable_name, value in fields.items(): + # Find indentation depths: + ret = re.search(f"^(.*?).*?", html_out, flags=re.MULTILINE) + if ret: + indent_depths = len(ret.group(1)) + html_out = html_out[:ret.start(0)] + _drop_indent(value, indent_depths) + html_out[ret.end(0):] + return html_out + + +def _fillin_reference_names(input_string: str, item_index: dict[str, int]) -> str: + replacements = [(*m.span(), m.group()) for m in re.finditer(r'(?<=@)\w+:[\w\_\-]+', input_string)] + ret: list[str] = [] + current_pos = 0 + for start, end, ref in replacements: + assert ref in item_index, f"Reference {ref} does not exist in the document" + ret.append(input_string[current_pos:start - 1]) + ret.append(str(item_index[ref])) + current_pos = end + return ''.join(ret) + input_string[current_pos:] + + +def _check_latex_references(input_string: str, item_index: dict[str, int]) -> str: + replacements = [m.group() for m in re.finditer(r'(?<=\\ref\{)\w+:[\w\_\\\-]+(?=\})', input_string)] + escaped_items = set(latex.normalize_label_text(item) for item in item_index) + for ref in replacements: + assert ref in escaped_items, f"Reference {ref} does not exist in the document" + return input_string + + +def _normalize_text_indent(text: str) -> str: + text_lines = text.splitlines() + if len(text_lines) > 1 and not text_lines[0].strip(): + text_lines = text_lines[1:] + + if not text_lines: + return '' + + if len(text_lines) > 1 and text_lines[0] and text_lines[0][0] != ' ': + indent_amount = len(text_lines[1]) - len(text_lines[1].lstrip()) + else: + indent_amount = len(text_lines[0]) - len(text_lines[0].lstrip()) + + return '\n'.join( + [' ' * max(0, len(line) - len(line.strip()) - indent_amount) + line.strip() + for line in text_lines]) + + +def _create_document_writer() -> 'DocumentWriter': + new_dwr = DocumentWriter() + return new_dwr + + +def inject_to_template(content: str, template_path: str = '', internal_template: str = '') -> str: + """ + injects a content string into a template. The placeholder + will be replaced by the content. If the placeholder is prefixed with a + '%' comment character, this character will be replaced as well. + + Args: + template_path: Path to a template file + internal_template: Path to a internal default template + + Returns: + Template with included content + """ + if template_path: + with open(template_path, 'r') as f: + template = f.read() + elif internal_template: + template = _get_pkgutil_string(internal_template) + else: + raise Exception('No template provided') + + assert '' in template, 'No expression in template located' + prep_template = re.sub(r"\%?\s*", '', template) + return prep_template.replace('', content) + + +class DocumentWriter(): + """ + A class to create a document for exporting to HTML or LaTeX. + """ + def __init__(self) -> None: + self._doc: list[list[Callable[[], str]]] = [] + self._fields: dict[str, DocumentWriter] = dict() + self._base64_svgs: bool = False + self._figure_format: FFormat = 'svg' + self._table_renderer: TRenderer = 'simple' + self._font_family: str | None = None + self._item_count: dict[str, int] = {} + self._item_index: dict[str, int] = {} + self._fig_scale: float = 1 + + def _add_item(self, ref_id: str, ref_type: str, caption_prefix: str) -> str: + current_index = self._item_count.get(ref_type, 0) + 1 + if not ref_id: + ref_id = str(current_index) + self._item_index[f"{ref_type}:{ref_id}"] = current_index + self._item_count[ref_type] = current_index + return caption_prefix.format(current_index) + + def new_field(self, name: str) -> 'DocumentWriter': + new_dwr = _create_document_writer() + self._fields[name] = new_dwr + return new_dwr + + def add_document(self, doc: Self) -> None: + self._doc += doc._doc + + def add_diagram(self, fig: Figure, caption: str = '', ref_id: str = '', + prefix_pattern: str = 'Figure {}: ', ref_type: str = 'fig', + centered: bool = True) -> None: + caption_prefix = self._add_item(ref_id, ref_type, prefix_pattern) + + def render_to_html() -> str: + return '
%s%s
' % ( + figure_to_string(fig, self._figure_format, base64=self._base64_svgs, scale=self._fig_scale), + '
' + caption_prefix + escape_html(caption) if caption else '') + + def render_to_latex() -> str: + return '\\begin{figure}%s\n%s\n\\caption{%s}\n%s\\end{figure}' % ( + '\n\\centering' if centered else '', + figure_to_string(fig, 'pgf', self._font_family, scale=self._fig_scale), + latex.escape_text(caption), + '\\label{%s}\n' % latex.normalize_label_text(ref_type + ':' + ref_id) if ref_id else '') + + self._doc.append([render_to_html, render_to_latex]) + + def add_table(self, table: Table, caption: str = '', ref_id: str = '', + prefix_pattern: str = 'Table {}: ', ref_type: str = 'table', centered: bool = True) -> None: + assert Table and isinstance(table, Table), 'Table has to be a pandas DataFrame oder DataFrame Styler' + caption_prefix = self._add_item(ref_id, ref_type, prefix_pattern) + styler = table if isinstance(table, Styler) else getattr(table, 'style', None) + assert isinstance(styler, Styler), 'Jinja2 package is required for rendering tables' + + def render_to_html() -> str: + html_string = styler.to_html(table_uuid=ref_id, caption=caption_prefix + escape_html(caption)) + return re.sub(r'.*?', '', html_string, flags=re.DOTALL) + + def render_to_latex() -> str: + if self._table_renderer == 'pandas': + return styler.to_latex( + label=latex.normalize_label_text(ref_type + ':' + ref_id), + hrules=True, + convert_css=True, + siunitx=True, + caption=latex.escape_text(caption), + position_float='centering' if centered else None) + else: + return latex.render_pandas_styler_table(styler, caption, ref_type + ':' + ref_id, centered) + + self._doc.append([render_to_html, render_to_latex]) + + def add_text(self, text: str, section_class: str = '') -> None: + """ + Adds a text paragraph to the document. + + Args: + text: The text to add + section_class: The class for the paragraph + """ + norm_text = _normalize_text_indent(text) + + def render_to_html() -> str: + html = '

' + escape_html(norm_text) + '

' + if section_class: + return '
' + html + '
' + else: + return html + + def render_to_latex() -> str: + return latex.from_html(render_to_html()) + + self._doc.append([render_to_html, render_to_latex]) + + def add_html(self, text: str) -> None: + """ + Adds HTML formatted text to the document. For the LaTeX + export only basic HTML for text formatting and tables + is supported. + + Args: + text: The HTML to add to the document + """ + def render_to_html() -> str: + return text + + def render_to_latex() -> str: + return latex.from_html(text) + + self._doc.append([render_to_html, render_to_latex]) + + def add_h1(self, text: str) -> None: + """ + Adds a h1 heading to the document. + + Args: + text: The text of the heading + """ + def render_to_html() -> str: + return '

' + escape_html(text) + '

' + + def render_to_latex() -> str: + return '\\section{' + latex.escape_text(text) + '}\n' + + self._doc.append([render_to_html, render_to_latex]) + + def add_h2(self, text: str) -> None: + """ + Adds a h2 heading to the document. + + Args: + text: The text of the heading + """ + def render_to_html() -> str: + return '

' + escape_html(text) + '

' + + def render_to_latex() -> str: + return '\\subsection{' + latex.escape_text(text) + '}\n' + + self._doc.append([render_to_html, render_to_latex]) + + def add_h3(self, text: str) -> None: + """ + Adds a h3 heading to the document. + + Args: + text: The text of the heading + """ + def render_to_html() -> str: + return '

' + escape_html(text) + '

' + + def render_to_latex() -> str: + return '\\subsubsection{' + latex.escape_text(text) + '}\n' + + self._doc.append([render_to_html, render_to_latex]) + + def add_equation(self, latex_equation: str, ref_id: str = '', ref_type: str = 'eq') -> None: + """ + Adds a LaTeX equation to the document. + + Args: + latex_equation: LaTeX formatted equation + ref_id: If provided, the equation is displayed with + a number and can be referenced by the ref_id + """ + caption = self._add_item(ref_id, ref_type, '({})') + + def render_to_html() -> str: + fig = latex_to_figure(latex_equation) + return ('
%s
' + '
%s
') % ( + figure_to_string(fig, self._figure_format, base64=self._base64_svgs), + caption) + + def render_to_latex() -> str: + if ref_id: + return '\\begin{equation}\\label{%s:%s}%s\\end{equation}' % ( + ref_type, ref_id, latex_equation) + else: + return '\\[%s\\]' % latex_equation + + self._doc.append([render_to_html, render_to_latex]) + + def add_markdown(self, text: str, section_class: str = '') -> None: + """ + Adds a markdown formatted text to the document. + + Args: + text: The markdown text to add + section_class: The class for the text section + """ + norm_text = _normalize_text_indent(str(text)) + + def render_to_html() -> str: + html = _markdown_to_html(norm_text) + if section_class: + return '
' + html + '
' + else: + return html + + def render_to_latex() -> str: + return latex.from_html(render_to_html()) + + self._doc.append([render_to_html, render_to_latex]) + + def _render_doc(self, doc_type: int) -> str: + fields = {k: f.to_html() for k, f in self._fields.items()} + return _fillin_fields(''.join(el[doc_type]() for el in self._doc), fields) + + def to_html(self, figure_format: FFormat = 'svg', + base64_svgs: bool = False, figure_scale: float = 1) -> str: + """ + Export the document to HTML. Figures will bew embedded in the HTML code. + The format can be selected between png in base64, inline svg or svg in base64. + + Args: + figure_format: The format for embedding the figures in the HTML code (svg or png) + base64_svgs: Whether to encode svg images in base64 + + Returns: + The HTML code + """ + self._figure_format = figure_format + self._base64_svgs = base64_svgs + self._fig_scale = figure_scale + + return _fillin_reference_names(self._render_doc(HTML_OUTPUT), self._item_index) + + def to_latex(self, font_family: Literal[None, 'serif', 'sans-serif'] = None, + table_renderer: TRenderer = 'simple', figure_scale: float = 1) -> str: + """ + Export the document to LaTeX. Figures will be embedded as pgf graphics. + + Args: + font_family: Overwrites the front family for figures + table_renderer: The renderer for tables (simple: renderer with column type + guessing for text and numbers; pandas: using the internal pandas LaTeX renderer) + + Returns: + The LaTeX code + """ + self._font_family = font_family + assert table_renderer in ['simple', 'pandas'], "table_renderer must be 'simple' or 'pandas'" + self._table_renderer = table_renderer + self._fig_scale = figure_scale + + return _check_latex_references(self._render_doc(LATEX_OUTPUT), self._item_index) + + def to_pdf(self, file_path: str, + font_family: Literal[None, 'serif', 'sans-serif'] = None, + table_renderer: TRenderer = 'simple', + latex_template_path: str = '') -> bool: + """ + Export the document to a PDF file using LaTeX. + + Args: + file_path: The path to save the PDF file to + font_family: Overwrites the front family for figures and the template + latex_template_path: Path to a LaTeX template file. The + expression will be replaced by the generated content. + If no path is provided a default template is used. + + Returns: + True if the PDF was successfully created + """ + latex_code = inject_to_template(self.to_latex(font_family, table_renderer), + latex_template_path, + 'templates/default_template.tex') + + if font_family == 'sans-serif': + latex_code = latex.inject_latex_command(latex_code, '\\renewcommand{\\familydefault}{\\sfdefault}') + success, errors, warnings = latex.compile(latex_code, file_path) + + if not success: + print('Errors:') + print('\n'.join(errors)) + print('Warnings:') + print('\n'.join(warnings)) + + return success + + def _repr_html_(self) -> str: + return self.to_html() + + def __repr__(self) -> str: + return self.to_html() diff --git a/src/pyladoc/latex.py b/src/pyladoc/latex.py new file mode 100644 index 0000000..c025332 --- /dev/null +++ b/src/pyladoc/latex.py @@ -0,0 +1,346 @@ +import bs4 +from html.parser import HTMLParser +from typing import Iterator, Generator, Any +from pandas.io.formats.style import Styler +import re +import os +import shutil +import subprocess +import tempfile +from .latex_escaping import unicode_to_latex_dict, latex_escape_dict + + +def basic_formatter(value: Any) -> str: + return escape_text(str(value)) + + +def to_ascii(text: str) -> str: + """ + Replaces/escapes often used unicode characters in latex code or text + with its LaTex ascii equivalents. + + Args: + text: The text to convert. + + Returns: + The escaped text. + """ + regex_filter = ('|'.join(unicode_to_latex_dict)) + + last_s = 0 + ret: list[str] = [] + for m in re.finditer(regex_filter, text): + s1, s2 = m.span() + ret.append(text[last_s:s1]) + ret.append(unicode_to_latex_dict[m.group()]) + last_s = s2 + ret.append(text[last_s:]) + + return ''.join(ret) + + +def normalize_label_text(text: str) -> str: + """ + Replace any special non-allowed character in the lable text. + + Args: + text: Input text + + Returns: + Normalized text + """ + return re.sub(r"[^a-zA-Z0-9.:]", '-', text) + + +def escape_text(text: str) -> str: + """ + Escapes special LaTeX characters and often used unicode characters in a given string. + + Args: + text: The text to escape + + Returns: + Escaped text + """ + + latex_translation = latex_escape_dict | unicode_to_latex_dict + + regex_filter = '|'.join(latex_translation) + + last_s = 0 + ret: list[str] = [] + for m in re.finditer(regex_filter, text): + s1, s2 = m.span() + ret.append(text[last_s:s1]) + matches = [v for k, v in latex_translation.items() if re.match(k, m.group())] + if m.group(1): + ret.append(matches[0].replace(r'\g<1>', normalize_label_text(m.group(1)))) + else: + ret.append(matches[0]) + last_s = s2 + ret.append(text[last_s:]) + + return ''.join(ret) + + +def render_pandas_styler_table(df_style: Styler, caption: str = '', label: str = '', centering: bool = True) -> str: + """ + Converts a pandas Styler object to LaTeX table. + + Args: + df_style: The pandas Styler object to convert. + caption: The caption for the table. + label: Label for referencing the table. + centering: Whether to center the table. + + Returns: + The LaTeX code. + """ + def iter_table(table: dict[str, Any]) -> Generator[str, None, None]: + yield '\\begin{table}\n' + if centering: + yield '\\centering\n' + + # Guess column type + numeric = re.compile(r'^[<>]?\s*(?:\d+,?)+(?:\.\d+)?(?:\s\D.*)?$') + formats = ['S' if all( + (numeric.match(line[ci]['display_value'].strip()) for line in table['body']) + ) else 'l' for ci in range(len(table['body'][0])) if table['body'][0][ci]['is_visible']] + + if caption: + yield f"\\caption{{{escape_text(caption)}}}\n" + if label: + yield f"\\label{{{normalize_label_text(label)}}}\n" + yield f"\\begin{{tabular}}{{{''.join(formats)}}}\n\\toprule\n" + + for head in table['head']: + yield (' & '.join(f"\\text{{{escape_text(c['display_value'].strip())}}}" + for c in head if c['is_visible'])) + yield ' \\\\\n' + + yield '\\midrule\n' + + for body in table['body']: + yield (' & '.join(escape_text(c['display_value'].strip()) + for c in body if c['is_visible'])) + yield ' \\\\\n' + + yield '\\bottomrule\n\\end{tabular}\n\\end{table}' + + str_list = iter_table(df_style._translate(False, False, blank='')) # type: ignore[attr-defined] + + return ''.join(str_list) + + +def from_html_old(html_code: str) -> str: + """ + Converts HTML code to LaTeX code. + + Args: + html_code: The HTML code to convert. + + Returns: + The LaTeX code. + """ + root = bs4.BeautifulSoup(html_code, 'html.parser') + + html_to_latex = { + 'strong': ('\\textbf{', '}'), + 'b': ('\\textbf{', '}'), + 'em': ('\\emph{', '}'), + 'i': ('\\emph{', '}'), + 'p': ('', '\n\n'), + 'h1': ('\\section{', '}'), + 'h2': ('\\subsection{', '}'), + 'h3': ('\\subsubsection{', '}'), + 'ul': ('\\begin{itemize}', '\\end{itemize}'), + 'ol': ('\\begin{enumerate}', '\\end{enumerate}'), + 'li': ('\\item ', ''), + 'latex_eq': ('\\[', '\\]'), + } + + def handle_table(table: bs4.element.Tag) -> str: + rows = table.find_all('tr') + latex_table: str = '' + for row in rows: + assert isinstance(row, bs4.element.Tag), 'HTML table not valid' + cells = row.find_all(['th', 'td']) + if not latex_table: + latex_table = "\\begin{tabular}{|" + "|".join(['l'] * len(cells)) + "|}\\toprule\n" + else: + latex_table += " & ".join(escape_text(cell.get_text(strip=True)) for cell in cells) + " \\\\\n" + latex_table += "\\bottomrule\n\\end{tabular}" + return latex_table + + def parse_node(element: bs4.element.Tag) -> Iterator[str]: + prefix, post = html_to_latex.get(element.name, ('', '')) + yield prefix + + for c in element.children: + if isinstance(c, bs4.element.Tag): + if c.name == 'table': + yield handle_table(c) + else: + yield from parse_node(c) + else: + yield escape_text(c.text) + yield post + + return ''.join(parse_node(root)) + + +def from_html(html_code: str) -> str: + """ + Converts HTML code to LaTeX code using HTMLParser. + + Args: + html_code: The HTML code to convert. + + Returns: + The LaTeX code. + """ + html_to_latex = { + 'strong': ('\\textbf{', '}'), + 'b': ('\\textbf{', '}'), + 'em': ('\\emph{', '}'), + 'i': ('\\emph{', '}'), + 'p': ('', '\n\n'), + 'h1': ('\\section{', '}\n'), + 'h2': ('\\subsection{', '}\n'), + 'h3': ('\\subsubsection{', '}\n'), + 'ul': ('\\begin{itemize}\n', '\\end{itemize}\n'), + 'ol': ('\\begin{enumerate}\n', '\\end{enumerate}\n'), + 'li': ('\\item ', '\n') + } + + class LaTeXHTMLParser(HTMLParser): + def __init__(self) -> None: + super().__init__() + self.latex_code: list[str] = [] + self.header_index: int = -1 + self.column_alignment = '' + self.midrule_flag = False + self.header_flag = False + + def handle_starttag(self, tag: str, attrs: list[tuple[str, str | None]]) -> None: + if tag in html_to_latex: + prefix, _ = html_to_latex[tag] + self.latex_code.append(prefix) + elif tag == 'table': + self.header_index = len(self.latex_code) + self.latex_code.append('') # Placeholder for column header + self.midrule_flag = False + self.header_flag = False + elif tag == 'tr': + self.column_alignment = '' + elif tag in ['th', 'td']: + style = [v for k, v in attrs if k == 'style'] + if style and style[0] and 'right' in style[0]: + self.column_alignment += 'r' + else: + self.column_alignment += 'l' + elif tag == 'a': + href = [v for k, v in attrs if k == 'href'] + assert href, 'Link href attribute is missing' + self.latex_code.append(f"\\href{{{href[0]}}}{{") + + def handle_endtag(self, tag: str) -> None: + if tag in html_to_latex: + _, postfix = html_to_latex[tag] + self.latex_code.append(postfix) + elif tag == 'table': + self.latex_code.append("\\bottomrule\n\\end{tabular}\n") + elif tag == 'tr': + self.latex_code.pop() # Remove column separator after last entry + if self.header_index >= 0: + self.latex_code[self.header_index] = f"\\begin{{tabular}}{{{self.column_alignment}}}\\toprule\n" + self.header_index = -1 + self.latex_code.append(' \\\\\n') + if self.header_flag and not self.midrule_flag: + self.latex_code.append("\\midrule\n") + self.midrule_flag = True + elif tag == 'th': + self.latex_code.append(" & ") + self.header_flag = True + elif tag == 'td': + self.latex_code.append(" & ") + elif tag == 'a': + self.latex_code.append("}") + + def handle_data(self, data: str) -> None: + if data.strip(): + self.latex_code.append(escape_text(data)) + + parser = LaTeXHTMLParser() + parser.feed(html_code) + return ''.join(parser.latex_code) + + +def compile(latex_code: str, output_file: str = '', encoding: str = 'utf-8') -> tuple[bool, list[str], list[str]]: + """ + Compiles LaTeX code to a PDF file. + + Args: + latex_code: The LaTeX code to compile. + output_file: The output file path. + encoding: The encoding of the LaTeX code. + + Returns: + A tuple with three elements: + - A boolean indicating whether the compilation was successful. + - A list of errors. + - A list of warnings. + """ + + with tempfile.TemporaryDirectory() as tmp_path: + command = ['pdflatex', '-halt-on-error', '--output-directory', tmp_path] + + errors: list[str] = [] + warnings: list[str] = [] + + for i in range(1, 4): + rerun_flag = False + error_flag = False + process = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE) + output, error = process.communicate(input=latex_code.encode(encoding)) + + assert not error, 'Compilation error: ' + output.decode(encoding) + + for line in output.decode(encoding).split('\n'): + if 'Warning' in line: + warnings.append(f"Run {i}: " + line) + if 'reference' in line: + rerun_flag = True + if line.startswith('!') or line.startswith('*!'): + error_flag = True + + if error_flag: + errors.append(line) + + if not rerun_flag or errors: + break + + # Copy pdf file + file_list = [f for f in os.listdir(tmp_path) if f.lower().endswith('.pdf')] + if file_list: + pdf_file = os.path.join(tmp_path, file_list[0]) + if output_file: + shutil.copyfile(pdf_file, output_file) + + return not errors, errors, warnings + + +def inject_latex_command(text: str, command: str) -> str: + lines = text.splitlines() + + last_package_index = -1 + for i, line in enumerate(lines): + if line.strip().startswith("\\usepackage"): + last_package_index = i + + if last_package_index != -1: + lines.insert(last_package_index + 1, f"\n{command}\n") + else: + lines.append(f"\n{command}\n") + + return '\n'.join(lines) diff --git a/src/pyladoc/latex_escaping.py b/src/pyladoc/latex_escaping.py new file mode 100644 index 0000000..f932561 --- /dev/null +++ b/src/pyladoc/latex_escaping.py @@ -0,0 +1,89 @@ +unicode_to_latex_dict = { + # Unicode numeric subscripts + '₀': r'\textsubscript{0}', '₁': r'\textsubscript{1}', '₂': r'\textsubscript{2}', '₃': r'\textsubscript{3}', + '₄': r'\textsubscript{4}', '₅': r'\textsubscript{5}', '₆': r'\textsubscript{6}', '₇': r'\textsubscript{7}', + '₈': r'\textsubscript{8}', '₉': r'\textsubscript{9}', + # Unicode numeric superscripts + '⁰': r'\textsuperscript{0}', '¹': r'\textsuperscript{1}', '²': r'\textsuperscript{2}', '³': r'\textsuperscript{3}', + '⁴': r'\textsuperscript{4}', '⁵': r'\textsuperscript{5}', '⁶': r'\textsuperscript{6}', '⁷': r'\textsuperscript{7}', + '⁸': r'\textsuperscript{8}', '⁹': r'\textsuperscript{9}', '⁺': r'\textsuperscript{+}', '⁻': r'\textsuperscript{-}', + # Often used European non-ascii-characters + 'ä': r'{\"a}', + 'ö': r'{\"o}', + 'ü': r'{\"u}', + 'Ä': r'{\"A}', + 'Ö': r'{\"O}', + 'Ü': r'{\"U}', + 'ß': r'{\ss}', + 'é': r"{\'e}", + 'è': r"{\`e}", + 'ê': r"{\^e}", + 'à': r"{\`a}", + 'â': r"{\^a}", + 'ç': r"{\c{c}}", + 'É': r"{\'E}", + 'È': r"{\`E}", + 'Ê': r"{\^E}", + 'À': r"{\`A}", + 'Â': r"{\^A}", + 'Ç': r"{\c{C}}", + 'ó': r"{\'o}", + 'ò': r"{\`o}", + 'ô': r"{\^o}", + 'Ó': r"{\'O}", + 'Ò': r"{\`O}", + 'Ô': r"{\^O}", + 'í': r"{\'i}", + 'ì': r"{\`i}", + 'î': r"{\^i}", + 'Í': r"{\'I}", + 'Ì': r"{\`I}", + 'Î': r"{\^I}", + 'ú': r"{\'u}", + 'ù': r"{\`u}", + 'û': r"{\^u}", + 'Ú': r"{\'U}", + 'Ù': r"{\`U}", + 'Û': r"{\^U}", + 'å': r"{\r{a}}", + 'Å': r"{\r{A}}", + 'ø': r"{\o}", + 'Ø': r"{\O}", + 'æ': r"{\ae}", + 'Æ': r"{\AE}", + 'œ': r"{\oe}", + 'Œ': r"{\OE}", + # Other unicode + '°': r'{\textdegree}', + 'µ': r'{\textmu}', + 'π': r'$\pi$', + '≈': r'$\approx$', + '±': r'$\pm$', + '≠': r'$\neq$', + '∆': r'$\Delta$', + 'Ω': r'$\Omega$', + 'Λ': r'$\Lambda$', + 'Σ': r'$\Sigma$', + # '€': r'{\euro}', + '£': r'{\pounds}', + '¥': r'{\yen}', + '\u00A0': r'~', # Non-breaking space + '\u2007': ' ' # Figure space +} + +latex_escape_dict = { + '&': r'\&', + '%': r'\%', + r'\$': r'\$', + '#': r'\#', + '_': r'\_', + '{': r'\{', + '}': r'\}', + '<': r'{\textless}', + '>': r'{\textgreater}', + '~': r'\textasciitilde{}', + r'\^': r'\textasciicircum{}', + r'\\': r'\textbackslash{}', + # References: + r'@(\w+:[\w\_\-]+)': r'\ref{\g<1>}' +} diff --git a/src/pyladoc/templates/default_template.tex b/src/pyladoc/templates/default_template.tex new file mode 100644 index 0000000..a37d64a --- /dev/null +++ b/src/pyladoc/templates/default_template.tex @@ -0,0 +1,38 @@ +\documentclass[a4paper,12pt]{article} + +% Packages +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{lmodern} % Load Latin Modern font +\usepackage{graphicx} % For including images +\usepackage{amsmath} % For mathematical symbols +\usepackage{amssymb} % For additional symbols +\usepackage{hyperref} % For hyperlinks +\usepackage{caption} % For customizing captions +\usepackage{geometry} % To set margins +\usepackage{natbib} % For citations +\usepackage{float} % For fixing figure positions +\usepackage{siunitx} % For scientific units +\usepackage{booktabs} % For professional-looking tables +\usepackage{pgf} % For using pgf grafics +\usepackage{textcomp, gensymb} % provides \degree symbol + +\sisetup{ + table-align-text-post = false +} + +% Geometry Settings +\geometry{margin=1in} % 1-inch margins + +% Title and Author Information +% \title{Report Title} +% \author{Your Name \\ Department of XYZ \\ \texttt{email@example.com}} +% \date{\today} + +\begin{document} + +% Title Page +% # \maketitle + +% +\end{document} \ No newline at end of file diff --git a/src/pyladoc/templates/test_template.html b/src/pyladoc/templates/test_template.html new file mode 100644 index 0000000..9cafb1d --- /dev/null +++ b/src/pyladoc/templates/test_template.html @@ -0,0 +1,114 @@ + + + + + + Test template + + + +
+ +
+ \ No newline at end of file diff --git a/tests/document_validation.py b/tests/document_validation.py new file mode 100644 index 0000000..fe9eb80 --- /dev/null +++ b/tests/document_validation.py @@ -0,0 +1,64 @@ +from typing import Generator, Any +from lxml import etree +from lxml.etree import _Element as EElement # type: ignore +import requests + + +with open('src/pyladoc/templates/test_template.html', mode='rt', encoding='utf-8') as f: + html_test_template = f.read() + + +def add_line_numbers(multiline_string: str) -> str: + lines = multiline_string.splitlines() + numbered_lines = [f"{i + 1}: {line}" for i, line in enumerate(lines)] + return "\n".join(numbered_lines) + + +def validate_html_with_w3c(html_string: str) -> dict[str, Any]: + validator_url = "https://validator.w3.org/nu/" + + # Parameters for the POST request + headers = { + "Content-Type": "text/html; charset=utf-8", + "User-Agent": "Python HTML Validator"} + + try: + response = requests.post(validator_url, headers=headers, data=html_string, params={"out": "json"}) + + if response.status_code == 200: + return response.json() + else: + return { + "error": f"Failed to validate HTML. Status code: {response.status_code}", + "details": response.text + } + + except requests.RequestException as e: + return {"error": f"An error occurred while connecting to the W3C Validator: {str(e)}"} + + +def validate_html(html_string: str, validate_online: bool = False, check_for: list['str'] = ['table', 'svg', 'div']): + root = etree.fromstring(html_string, parser=etree.HTMLParser(recover=True)) + + def recursive_search(element: EElement) -> Generator[str, None, None]: + if isinstance(element.tag, str): + yield element.tag + + for child in element: + yield from recursive_search(child) + + tags = set(recursive_search(root)) + + for tag_type in check_for: + assert tag_type in tags, f"Tag {tag_type} not found in the html code" + + if validate_online: + test_page = html_test_template.replace('', html_string) + validation_result = validate_html_with_w3c(test_page) + assert 'messages' in validation_result, 'Validate request failed' + if validation_result['messages']: + print(add_line_numbers(test_page)) + for verr in validation_result['messages']: + print(f"- {verr['type']}: {verr['message']} (line: {verr['lastLine']})") + + assert len(validation_result['messages']) == 0, f'{len(validation_result["messages"])} validation error, first error: {validation_result["messages"][0]["message"]}' diff --git a/tests/out/test_html_render.html b/tests/out/test_html_render.html new file mode 100644 index 0000000..6ad2b1a --- /dev/null +++ b/tests/out/test_html_render.html @@ -0,0 +1,1525 @@ + + + + + + Test template + + + +

Special characters

+

ö ä ü Ö Ä Ü ß @ ∆

+

π ≈ ± ∆ Σ

+

£ ¥ $ €

+

Œ

+

Link

+

This is a hyperlink: nonan.net

+

Table

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Anz.TypBeschreibung
12BK9050Buskoppler
2KL11044 Digitaleingänge
2KL24044 Digitalausgänge (0,5 A)
3KL24244 Digitalausgänge (2 A)
2KL40044 Analogausgänge
1KL40022 Analogausgänge
22KL9188Potenzialverteilungsklemme
1KL9100Potenzialeinspeiseklemme
3KL30544 Analogeingänge
5KL3214PT100 4 Temperatureingänge (3-Leiter)
3KL3202PT100 2 Temperatureingänge (3-Leiter)
1KL24044 Digitalausgänge
2KL9010Endklemme
+
+

Equations

+

This line represents a reference to the equation 1.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
(1)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Figure 1: Bar chart with individual bar colors
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1: This is a example table
Row1Row2Row3Row4Row5Row6Row7
Line112012 g/km5 stars3.5000001850 kg600 Nm
Line295 km/h> 150 g/km4 stars7.8000001500 kg250 Nm
Line3110110 g/km5 stars8.5000001400 kg280 Nm
Line4105 km/h1140 g/km4.5 stars6.9000001600 kg320 Nm
Line513013.05 g/km5 stars4.2000001700 kg450 Nm
+ +
+ \ No newline at end of file diff --git a/tests/out/test_latex_render.pdf b/tests/out/test_latex_render.pdf new file mode 100644 index 0000000000000000000000000000000000000000..39dbd38431d986cfc0157452a45fa76bd7a69b3d GIT binary patch literal 164342 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 literal 0 HcmV?d00001 diff --git a/tests/out/test_markdown_characters.html b/tests/out/test_markdown_characters.html new file mode 100644 index 0000000..29796ca --- /dev/null +++ b/tests/out/test_markdown_characters.html @@ -0,0 +1,5 @@ +

Special caracters

+

Umlaute: ÖÄÜ öäü

+

Other: ß, €, @, $, %, ~, µ

+

Units: m³, cm²

+

Controll characters: <, >, ", ', &, |, /, \

\ No newline at end of file diff --git a/tests/out/test_markdown_equations.html b/tests/out/test_markdown_equations.html new file mode 100644 index 0000000..6286051 --- /dev/null +++ b/tests/out/test_markdown_equations.html @@ -0,0 +1,39 @@ +

Source Equations

+
    +
  1. $4(3x + 2) - 5(x - 1) = 3x + 14$
  2. +
  3. $ +rac{2y + 5}{4} + +rac{3y - 1}{2} = 5$
  4. +
  5. $ +rac{5}{x + 2} + +rac{2}{x - 2} = 3$
  6. +
  7. $8(3b - 5) + 4(b + 2) = 60$
  8. +
  9. $2c^2 - 3c - 5 = 0$
  10. +
  11. $4(2d - 1) + 5(3d + 2) = 7d + 28$
  12. +
  13. $q^2 + 6q + 9 = 16$
  14. +
+

Result Equations

+
    +
  1. $x = +rac{1}{4}$
  2. +
  3. $y = +rac{17}{8}$
  4. +
  5. $z = +rac{7}{3}$
  6. +
  7. $x = 1$ or $x = -6$
  8. +
  9. $a = +rac{1}{3}$ or $a = 2$
  10. +
  11. $x = - +rac{2}{3}$ or $x = 3$
  12. +
  13. $b = +rac{23}{7}$
  14. +
+

Step by Step

+
    +
  1. Distribute: $12x + 8 - 5x + 5 = 3x + 14$
  2. +
  3. Combine like terms: $7x + 13 = 3x + 14$
  4. +
  5. Subtract $3x$: $4x + 13 = 14$
  6. +
  7. Subtract $13$: $4x = 1$
  8. +
  9. Divide by $4$: $x = +rac{1}{4}$
  10. +
\ No newline at end of file diff --git a/tests/out/test_markdown_style.html b/tests/out/test_markdown_style.html new file mode 100644 index 0000000..2afc94c --- /dev/null +++ b/tests/out/test_markdown_style.html @@ -0,0 +1,44 @@ +

Below is an in-depth explanation of the AArch64 (ARM64) +unconditional branch instruction—often simply called the +“B” instruction—and how its 26‐bit immediate field (imm26) +is laid out and later relocated during linking.

+
+

Instruction Layout

+

The unconditional branch in AArch64 is encoded in a 32‑bit +instruction. Its layout is as follows:

+
Bits:  31         26 25                           0
+        +-------------+------------------------------+
+        |  Opcode     |          imm26               |
+        +-------------+------------------------------+
+
+
    +
  • Opcode (bits 31:26):
  • +
  • For a plain branch (B), the opcode is 000101.
  • +
  • +

    For a branch with link (BL), which saves the return +address (i.e., a call), the opcode is 100101. +These 6 bits determine the instruction type.

    +
  • +
  • +

    Immediate Field (imm26, bits 25:0):

    +
  • +
  • This 26‑bit field holds a signed immediate value.
  • +
  • +

    Offset Calculation: At runtime, the processor:

    +
      +
    1. Shifts the 26‑bit immediate left by 2 bits. +(Because instructions are 4-byte aligned, +the two least-significant bits are always zero.)
    2. +
    3. Sign-extends the resulting 28‑bit value to +the full register width (typically 64 bits).
    4. +
    5. Adds this value to the program counter +(PC) to obtain the branch target.
    6. +
    +
  • +
  • +

    Reach:

    +
  • +
  • With a 26‑bit signed field that’s effectively 28 bits + after the shift, the branch can cover a range + of approximately ±128 MB from the current instruction.
  • +
\ No newline at end of file diff --git a/tests/out/test_markdown_table.html b/tests/out/test_markdown_table.html new file mode 100644 index 0000000..3499734 --- /dev/null +++ b/tests/out/test_markdown_table.html @@ -0,0 +1,77 @@ +

Klemmen

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Anz.TypBeschreibung
12BK9050Buskoppler
2KL11044 Digitaleingänge
2KL24044 Digitalausgänge (0,5 A)
3KL24244 Digitalausgänge (2 A)
2KL40044 Analogausgänge
1KL40022 Analogausgänge
22KL9188Potenzialverteilungsklemme
1KL9100Potenzialeinspeiseklemme
3KL30544 Analogeingänge
5KL3214PT100 4 Temperatureingänge (3-Leiter)
3KL3202PT100 2 Temperatureingänge (3-Leiter)
1KL24044 Digitalausgänge
2KL9010Endklemme
\ No newline at end of file diff --git a/tests/test_latex_tools.py b/tests/test_latex_tools.py new file mode 100644 index 0000000..89a6edd --- /dev/null +++ b/tests/test_latex_tools.py @@ -0,0 +1,151 @@ +import pyladoc.latex + + +def normalize_latex_code(latex_code: str) -> str: + return '\n'.join(line.strip() for line in latex_code.splitlines() if line) + + +def check_only_ascii(latex_code: str) -> bool: + return all(ord(c) < 128 for c in latex_code) + + +def test_latex_from_html(): + html_code = """ +

Test

+

This is are Umlautes: Ä,Ö and Ü

+

This is a test.

+

And this is another test.

+

And this is a third test.

+

And this is a fourth test.

+

This is a LaTeX command: \\textbf{test}

+

This are typical control characters: {, }, <, >, ", ', &, |, /, \\

+
    +
  • Item 1
  • +
  • Item 2
  • +
+ + + + + + + + + +
Header 1Header 2
Cell 1Cell 2
+ """ + + latex_code = pyladoc.latex.from_html(html_code) + + ref_latex_code = r""" + \section{Test} + This is are Umlautes: {\"A},{\"O} and {\"U} + This is a \textbf{test}. + And this is another \emph{test}. + And this is a \textbf{third} test. + And this is a \emph{fourth} test. + This is a LaTeX command: \textbackslash{}textbf\{test\} + This are typical control characters: \{, \}, {\textless}, {\textgreater}, ", ', \&, |, /, \textbackslash{} + \begin{itemize} + \item Item 1 + \item Item 2 + \end{itemize} + \begin{tabular}{ll}\toprule + Header 1 & Header 2 \\ + \midrule + Cell 1 & Cell 2 \\ + \bottomrule + \end{tabular}""" + + print(latex_code) + + print('--') + + # print(pyladoc.latex.escape_text(html_code)) + + assert check_only_ascii(latex_code), 'Some characters are not ASCII' + assert normalize_latex_code(ref_latex_code) == normalize_latex_code(latex_code) + + +def test_latex_from_markdown(): + markdown_code = """ + ## Test1 + + | Anz.| Typ | Beschreibung + |----:|----------|------------------------------------ + | 12 | BK9050 | Buskoppler + | 2 | KL1104 | 4 Digitaleingänge + | 2 | KL2404 | 4 Digitalausgänge (0,5 A) + | 3 | KL2424 | 4 Digitalausgänge (2 A) + | 2 | KL4004 | 4 Analogausgänge + | 1 | KL4002 | 2 Analogausgänge + | 22 | KL9188 | Potenzialverteilungsklemme + | 1 | KL9100 | Potenzialeinspeiseklemme + | 3 | KL3054 | 4 Analogeingänge + | 5 | KL3214 | PT100 4 Temperatureingänge (3-Leiter) + | 3 | KL3202 | PT100 2 Temperatureingänge (3-Leiter) + | 1 | KL2404 | 4 Digitalausgänge + | 2 | KL9010 | Endklemme + + This is a **test**. + + ## Test2 + + | Anz.| Beschreibung + |----:|------------------------------------ + | 12 | Buskoppler + | 2 | 4 Digitaleingänge + | 2 | 4 Digitalausgänge (0,5 A) + | 3 | 4 Digitalausgänge (2 A) + | 2 | 4 Analogausgänge + | 1 | 2 Analogausgänge + """ + + pyla = pyladoc.DocumentWriter() + pyla.add_markdown(markdown_code) + latex_code = pyladoc.latex.from_html(pyla.to_html()) + + ref_latex_code = r""" + \subsection{Test1} + \begin{tabular}{rll}\toprule + Anz. & Typ & Beschreibung \\ + \midrule + 12 & BK9050 & Buskoppler \\ + 2 & KL1104 & 4 Digitaleing{\"a}nge \\ + 2 & KL2404 & 4 Digitalausg{\"a}nge (0,5 A) \\ + 3 & KL2424 & 4 Digitalausg{\"a}nge (2 A) \\ + 2 & KL4004 & 4 Analogausg{\"a}nge \\ + 1 & KL4002 & 2 Analogausg{\"a}nge \\ + 22 & KL9188 & Potenzialverteilungsklemme \\ + 1 & KL9100 & Potenzialeinspeiseklemme \\ + 3 & KL3054 & 4 Analogeing{\"a}nge \\ + 5 & KL3214 & PT100 4 Temperatureing{\"a}nge (3-Leiter) \\ + 3 & KL3202 & PT100 2 Temperatureing{\"a}nge (3-Leiter) \\ + 1 & KL2404 & 4 Digitalausg{\"a}nge \\ + 2 & KL9010 & Endklemme \\ + \bottomrule + \end{tabular} + This is a \textbf{test}. + + \subsection{Test2} + \begin{tabular}{rl}\toprule + Anz. & Beschreibung \\ + \midrule + 12 & Buskoppler \\ + 2 & 4 Digitaleing{\"a}nge \\ + 2 & 4 Digitalausg{\"a}nge (0,5 A) \\ + 3 & 4 Digitalausg{\"a}nge (2 A) \\ + 2 & 4 Analogausg{\"a}nge \\ + 1 & 2 Analogausg{\"a}nge \\ + \bottomrule + \end{tabular}""" + + print(latex_code) + + assert check_only_ascii(latex_code), 'Some characters are not ASCII' + assert normalize_latex_code(ref_latex_code) == normalize_latex_code(latex_code) + + +if __name__ == '__main__': + test_latex_from_html() + test_latex_from_markdown() diff --git a/tests/test_rendering_example_doc.py b/tests/test_rendering_example_doc.py new file mode 100644 index 0000000..24ae886 --- /dev/null +++ b/tests/test_rendering_example_doc.py @@ -0,0 +1,108 @@ +import pyladoc +import matplotlib.pyplot as plt +import pandas as pd +import document_validation + +VALIDATE_HTML_CODE_ONLINE = False +WRITE_RESULT_FILES = True + + +def make_document(): + dw = pyladoc.DocumentWriter() + + dw.add_markdown(""" + # Special characters + + ö ä ü Ö Ä Ü ß @ ∆ + + π ≈ ± ∆ Σ + + £ ¥ $ € + + Œ + + # Link + + This is a hyperlink: [nonan.net](https://www.nonan.net) + + # Table + + | Anz.| Typ | Beschreibung + |----:|----------|------------------------------------ + | 12 | BK9050 | Buskoppler + | 2 | KL1104 | 4 Digitaleingänge + | 2 | KL2404 | 4 Digitalausgänge (0,5 A) + | 3 | KL2424 | 4 Digitalausgänge (2 A) + | 2 | KL4004 | 4 Analogausgänge + | 1 | KL4002 | 2 Analogausgänge + | 22 | KL9188 | Potenzialverteilungsklemme + | 1 | KL9100 | Potenzialeinspeiseklemme + | 3 | KL3054 | 4 Analogeingänge + | 5 | KL3214 | PT100 4 Temperatureingänge (3-Leiter) + | 3 | KL3202 | PT100 2 Temperatureingänge (3-Leiter) + | 1 | KL2404 | 4 Digitalausgänge + | 2 | KL9010 | Endklemme + + --- + + # Equations + + This line represents a reference to the equation @eq:test1. + """) + + dw.add_equation(r'y = a + b * \sum_{i=0}^{\infty} a_i x^i', 'test1') + + # Figure + fig, ax = plt.subplots() + + fruits = ['apple', 'blueberry', 'cherry', 'orange'] + counts = [40, 100, 30, 55] + bar_labels = ['red', 'blue', '_red', 'orange'] + bar_colors = ['tab:red', 'tab:blue', 'tab:red', 'tab:orange'] + + ax.bar(fruits, counts, label=bar_labels, color=bar_colors) + ax.set_ylabel('fruit supply') + ax.set_title('Fruit supply by kind and color') + ax.legend(title='Fruit color') + + dw.add_diagram(fig, 'Bar chart with individual bar colors') + + # Table + mydataset = { + 'Row1': ["Line1", "Line2", "Line3", "Line4", "Line5"], + 'Row2': [120, '95 km/h', 110, '105 km/h', 130], + 'Row3': ['12 g/km', '> 150 g/km', '110 g/km', '1140 g/km', '13.05 g/km'], + 'Row4': ['5 stars', '4 stars', '5 stars', '4.5 stars', '5 stars'], + 'Row5': [3.5, 7.8, 8.5, 6.9, 4.2], + 'Row6': ['1850 kg', '1500 kg', '1400 kg', '1600 kg', '1700 kg'], + 'Row7': ['600 Nm', '250 Nm', '280 Nm', '320 Nm', '450 Nm'] + } + df = pd.DataFrame(mydataset) + + dw.add_table(df.style.hide(axis="index"), 'This is a example table', 'example1') + + return dw + + +def test_html_render(): + doc = make_document() + html_code = doc.to_html() + + document_validation.validate_html(html_code, VALIDATE_HTML_CODE_ONLINE) + + if WRITE_RESULT_FILES: + with open('tests/out/test_html_render.html', 'w', encoding='utf-8') as f: + f.write(pyladoc.inject_to_template(html_code, internal_template='templates/test_template.html')) + + +def test_latex_render(): + doc = make_document() + + # print(doc.to_latex()) + + assert doc.to_pdf('tests/out/test_latex_render.pdf', font_family='serif') + + +if __name__ == '__main__': + test_html_render() + test_latex_render() diff --git a/tests/test_rendering_markdown.py b/tests/test_rendering_markdown.py new file mode 100644 index 0000000..a602582 --- /dev/null +++ b/tests/test_rendering_markdown.py @@ -0,0 +1,152 @@ +import pyladoc +import document_validation + +VALIDATE_HTML_CODE_ONLINE = False +WRITE_RESULT_FILES = True + + +def test_markdown_styling(): + pyla = pyladoc.DocumentWriter() + pyla.add_markdown( + """ + Below is an in-depth explanation of the AArch64 (ARM64) + unconditional branch instruction—often simply called the + “B” instruction—and how its 26‐bit immediate field (imm26) + is laid out and later relocated during linking. + + --- + + ## Instruction Layout + + The unconditional branch in AArch64 is encoded in a 32‑bit + instruction. Its layout is as follows: + + ``` + Bits: 31 26 25 0 + +-------------+------------------------------+ + | Opcode | imm26 | + +-------------+------------------------------+ + ``` + + - **Opcode (bits 31:26):** + - For a plain branch (`B`), the opcode is `000101`. + - For a branch with link (`BL`), which saves the return + address (i.e., a call), the opcode is `100101`. + These 6 bits determine the instruction type. + + - **Immediate Field (imm26, bits 25:0):** + - This 26‑bit field holds a signed immediate value. + - **Offset Calculation:** At runtime, the processor: + 1. **Shifts** the 26‑bit immediate left by 2 bits. + (Because instructions are 4-byte aligned, + the two least-significant bits are always zero.) + 2. **Sign-extends** the resulting 28‑bit value to + the full register width (typically 64 bits). + 3. **Adds** this value to the program counter + (PC) to obtain the branch target. + + - **Reach:** + - With a 26‑bit signed field that’s effectively 28 bits + after the shift, the branch can cover a range + of approximately ±128 MB from the current instruction. + """) + + html_code = pyla.to_html() + document_validation.validate_html(html_code, check_for=['strong', 'ol', 'li', 'code', 'hr']) + + if WRITE_RESULT_FILES: + with open('tests/out/test_markdown_style.html', 'w', encoding='utf-8') as f: + f.write(html_code) + + +def test_markdown_table(): + pyla = pyladoc.DocumentWriter() + pyla.add_markdown( + """ + ## Klemmen + + | Anz.| Typ | Beschreibung + |----:|----------|------------------------------------ + | 12 | BK9050 | Buskoppler + | 2 | KL1104 | 4 Digitaleingänge + | 2 | KL2404 | 4 Digitalausgänge (0,5 A) + | 3 | KL2424 | 4 Digitalausgänge (2 A) + | 2 | KL4004 | 4 Analogausgänge + | 1 | KL4002 | 2 Analogausgänge + | 22 | KL9188 | Potenzialverteilungsklemme + | 1 | KL9100 | Potenzialeinspeiseklemme + | 3 | KL3054 | 4 Analogeingänge + | 5 | KL3214 | PT100 4 Temperatureingänge (3-Leiter) + | 3 | KL3202 | PT100 2 Temperatureingänge (3-Leiter) + | 1 | KL2404 | 4 Digitalausgänge + | 2 | KL9010 | Endklemme + """) + + html_code = pyla.to_html() + document_validation.validate_html(html_code, check_for=['table']) + + if WRITE_RESULT_FILES: + with open('tests/out/test_markdown_table.html', 'w', encoding='utf-8') as f: + f.write(html_code) + + +def test_markdown_equations(): + pyla = pyladoc.DocumentWriter() + pyla.add_markdown( + """ + # Source Equations + 1. $4(3x + 2) - 5(x - 1) = 3x + 14$ + 2. $\frac{2y + 5}{4} + \frac{3y - 1}{2} = 5$ + 3. $\frac{5}{x + 2} + \frac{2}{x - 2} = 3$ + 4. $8(3b - 5) + 4(b + 2) = 60$ + 5. $2c^2 - 3c - 5 = 0$ + 6. $4(2d - 1) + 5(3d + 2) = 7d + 28$ + 7. $q^2 + 6q + 9 = 16$ + + # Result Equations + 1. $x = \frac{1}{4}$ + 2. $y = \frac{17}{8}$ + 3. $z = \frac{7}{3}$ + 4. $x = 1$ or $x = -6$ + 5. $a = \frac{1}{3}$ or $a = 2$ + 6. $x = -\frac{2}{3}$ or $x = 3$ + 7. $b = \frac{23}{7}$ + + # Step by Step + 1. Distribute: $12x + 8 - 5x + 5 = 3x + 14$ + 2. Combine like terms: $7x + 13 = 3x + 14$ + 3. Subtract $3x$: $4x + 13 = 14$ + 4. Subtract $13$: $4x = 1$ + 5. Divide by $4$: $x = \frac{1}{4}$ + """) + + html_code = pyla.to_html() + document_validation.validate_html(html_code, check_for=['h1']) + + if WRITE_RESULT_FILES: + with open('tests/out/test_markdown_equations.html', 'w', encoding='utf-8') as f: + f.write(html_code) + + +def test_markdown_characters(): + pyla = pyladoc.DocumentWriter() + pyla.add_markdown( + """ + # Special caracters + + Umlaute: ÖÄÜ öäü + + Other: ß, €, @, $, %, ~, µ + + Units: m³, cm² + + Controll characters: <, >, ", ', &, |, /, \\ + + """) + + html_code = pyla.to_html() + document_validation.validate_html(html_code, check_for=['h1']) + + if WRITE_RESULT_FILES: + with open('tests/out/test_markdown_characters.html', 'w', encoding='utf-8') as f: + f.write(html_code)