Toggle Light / Dark / Auto color theme
Toggle table of contents sidebar
Source code for immuneML.presentation.html.HTMLBuilder
import os
import shutil
import uuid
from pathlib import Path
from typing import List
import dill
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
from immuneML.util.PathBuilder import PathBuilder
[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 ( 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_style" : Util . get_css_content ( 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 = []
temp_states_dir = PathBuilder . build ( rel_path / 'states' )
for state in states :
presentation_builder = PresentationFactory . make_presentation_builder ( state , PresentationFormat . HTML )
HTMLBuilder . store_state_temp ( state , temp_states_dir )
presentation_path = presentation_builder . build ( 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 )
HTMLBuilder . remove_temp_states ( temp_states_dir )
return presentations
[docs]
@staticmethod
def store_state_temp ( state , path : Path ):
filename = path / f " { state . name } _ { type ( state ) . __name__ } _ { uuid . uuid4 () } .pickle"
with filename . open ( 'wb' ) as file :
dill . dump ( state , file )
[docs]
@staticmethod
def remove_temp_states ( path : Path ):
shutil . rmtree ( path , ignore_errors = True )