Source code for immuneML.presentation.html.HTMLBuilder

import os
import shutil
from pathlib import Path
from typing import List

from immuneML.environment.EnvironmentSettings import EnvironmentSettings
from immuneML.ml_methods.util.Util import Util as MLUtil
from immuneML.presentation.InstructionPresentation import InstructionPresentation
from immuneML.presentation.PresentationFactory import PresentationFactory
from immuneML.presentation.PresentationFormat import PresentationFormat
from immuneML.presentation.TemplateParser import TemplateParser
from immuneML.presentation.html.Util import Util


[docs]class HTMLBuilder: """ Outputs HTML results of the analysis. This is currently the only defined format of presentation of results. YAML specification: .. indent with spaces .. code-block:: yaml definitions: ... instructions: ... output: # the output format format: HTML """
[docs] @staticmethod def build_from_objects(states: list, path: Path) -> Path: rel_path = Path(os.path.relpath(str(path))) presentations = HTMLBuilder._collect_all_presentations(states, rel_path) presentation_html_path = HTMLBuilder._make_document(presentations, rel_path) return presentation_html_path
@staticmethod def _make_document(presentations: List[InstructionPresentation], path: Path) -> Path: result_path = path / "index.html" if len(presentations) > 1: html_map = {"instructions": presentations, "css_path": EnvironmentSettings.html_templates_path / "css/custom.css", "full_specs": Util.get_full_specs_path(path), 'immuneML_version': MLUtil.get_immuneML_version()} TemplateParser.parse(template_path=EnvironmentSettings.html_templates_path / "index.html", template_map=html_map, result_path=result_path) elif len(presentations) == 1: shutil.copyfile(str(presentations[0].path), str(result_path)) HTMLBuilder._update_paths(result_path) else: result_path = None return result_path @staticmethod def _update_paths(result_path: Path): with result_path.open('r') as file: lines = [] for line in file.readlines(): if "href=" in line: lines.append(line.split("href=\"")[0] + "href=\"./HTML_output/" + line.split("href=\"")[1]) elif "src=" in line: lines.append(line.split("src=\"")[0] + "src=\"./HTML_output/" + line.split("src=\"")[1]) else: lines.append(line) with result_path.open("w") as file: file.write("\n".join(lines)) @staticmethod def _collect_all_presentations(states: list, rel_path: Path) -> List[InstructionPresentation]: presentations = [] for state in states: presentation_builder = PresentationFactory.make_presentation_builder(state, PresentationFormat.HTML) presentation_path = presentation_builder.build_from_objects(state) if len(states) > 1: presentation_path = Path(os.path.relpath(str(presentation_path), str(rel_path))) instruction_class = type(state).__name__[:-5] presentation = InstructionPresentation(presentation_path, instruction_class, state.name) presentations.append(presentation) return presentations