Source code for pyphyschemtools.visualID_Eng

import os, sys, platform
import datetime, time
#from IPython.core.display import display,Image,Markdown,HTML
from IPython.display import display,Image,Markdown,HTML
from urllib.request import urlopen

__author__ = "Romuald POTEAU"
__maintainer__ =  "Romuald POTEAU"
__email__ = "romuald.poteau@univ-tlse3.fr"
__status__ = "Development"

# Get the absolute path to this file's directory within the package
_PKG_PATH = os.path.dirname(__file__)

_start_time   = None
_end_time     = None
_chrono_start = None
_chrono_stop  = None

[docs] class color: PURPLE = '\033[95m' CYAN = '\033[96m' DARKCYAN = '\033[36m' BLUE = '\033[94m' GREEN = '\033[92m' YELLOW = '\033[93m' RED = '\033[91m' BOLD = '\033[1m' UNDERLINE = '\033[4m' OFF = '\033[0m'
[docs] class fg: PURPLE = '\033[95m' CYAN = '\033[96m' DARKCYAN = '\033[36m' BLUE = '\033[94m' GREEN = '\033[92m' YELLOW = '\033[93m' RED = '\033[91m' LIGHTGRAY = "\033[37m" DARKGRAY = "\033[90m" BLACK = '\033[30m' WHITE = "\033[38;5;231m" OFF = '\033[0m'
[docs] class hl: BLINK = "\033[5m" blink = "\033[25m" #reset blink BOLD = '\033[1m' bold = "\033[21m" #reset bold UNDERL = '\033[4m' underl = "\033[24m" #reset underline ITALIC = "\033[3m" italic = "\033[23m" OFF = '\033[0m'
[docs] class bg: DARKRED = "\033[38;5;231;48;5;52m" DARKREDB = "\033[38;5;231;48;5;52;1m" LIGHTRED = "\033[48;5;217m" LIGHTREDB = "\033[48;5;217;1m" LIGHTYELLOW = "\033[48;5;228m" LIGHTYELLOWB = "\033[48;5;228;1m" LIGHTGREEN = "\033[48;5;156m" LIGHTGREENB = "\033[48;5;156;1m" LIGHTBLUE = "\033[48;5;117m" LIGHTBLUEB = "\033[48;5;117;1m" OFF = "\033[0m"
[docs] def apply_css_style(): """ Explicitly reads and applies the visualID CSS stylesheet from the package resources. """ css_path = os.path.join(_PKG_PATH, "resources", "css", "visualID.css") if os.path.exists(css_path): with open(css_path, "r") as f: styles = f.read() # Some CSS files might not have the <style> tag if they are raw CSS if not styles.strip().startswith("<style>"): styles = f"<style>{styles}</style>" display(HTML(styles)) else: print(f"[Warning] CSS file not found at {css_path}")
[docs] def init(which=None): """ Initializes the notebook environment: applies CSS, displays the banner, and shows hostname/time. """ global _start_time _start_time = datetime.datetime.now() # 1. Call the explicit CSS function apply_css_style() # 2. Display the banner if which == "Research": banner = "pyPC_LPCNO_Banner.svg" elif which== "t4pPC": banner = "tools4pyPC_banner.svg" else: banner = "pyPhysChemBanner.svg" banner_path = os.path.join(_PKG_PATH, "resources", "svg", banner) if os.path.exists(banner_path): with open(banner_path, "r") as f: svg_data = f.read() display(HTML(f'<div style="text-align: center; max-width: 100%; height: auto;">{svg_data}</div>')) # 3. Environment Info now = datetime.datetime.now().strftime("%A %d %B %Y, %H:%M:%S") display(Markdown(f"**Environment initialized:** {now} on {platform.node()}"))
[docs] def display_md(text): display(Markdown(text))
[docs] def hdelay(sec): return str(datetime.timedelta(seconds=int(sec)))
# Return human delay like 01:14:28 543ms # delay can be timedelta or seconds
[docs] def hdelay_ms(delay): if type(delay) is not datetime.timedelta: delay=datetime.timedelta(seconds=delay) sec = delay.total_seconds() hh = sec // 3600 mm = (sec // 60) - (hh * 60) ss = sec - hh*3600 - mm*60 ms = (sec - int(sec))*1000 return f'{hh:02.0f}:{mm:02.0f}:{ss:02.0f} {ms:03.0f}ms'
[docs] def chrono_start(): global _chrono_start, _chrono_stop _chrono_start=time.time()
# return delay in seconds or in humain format
[docs] def chrono_stop(hdelay=False): global _chrono_start, _chrono_stop _chrono_stop = time.time() sec = _chrono_stop - _chrono_start if hdelay : return hdelay_ms(sec) return sec
[docs] def chrono_show(): print('\nDuration : ', hdelay_ms(time.time() - _chrono_start))
[docs] def end(): """ Terminates the notebook session: displays duration, end time, and the termination logo from package resources. """ global _start_time, _end_time # 1. Calcul du temps _end_time = datetime.datetime.now() end_str = _end_time.strftime("%A %d %B %Y, %H:%M:%S") # Calcul de la durée si _start_time existe if _start_time: duration = hdelay_ms(_end_time - _start_time) else: duration = "Unknown (init() was not called)" # 2. Affichage des infos de fin md = f'**End at:** {end_str} \n' md += f'**Duration:** {duration}' # 3. Affichage du logo de fin (depuis le package) # On suppose que le logo s'appelle logoEnd.svg et est dans resources/svg/ logo_path = os.path.join(_PKG_PATH, "resources", "svg", "logoEnd.svg") if os.path.exists(logo_path): with open(logo_path, "r") as f: svg_data = f.read() display(HTML(f'<div style="text-align: center; width: 800px; margin: auto;">{svg_data}</div>')) else: # Fallback si le logo est manquant print(f"[Warning] End logo not found at {logo_path}") display_md(md)