diff --git a/src/cal_tools/calcat_interface.py b/src/cal_tools/calcat_interface.py index 359280e5b63baf7f809722d2721d7ace4c5eb36d..36f81dedcb57bab9dc8386f0f7aa572380481dc4 100644 --- a/src/cal_tools/calcat_interface.py +++ b/src/cal_tools/calcat_interface.py @@ -16,7 +16,7 @@ from calibration_client.modules import ( PhysicalDetectorUnit, ) -from cal_tools.tools import module_index_to_qm +from cal_tools.tools import module_index_to_qm, DisplayTables __all__ = [ "CalCatError", @@ -754,8 +754,7 @@ class CalibrationData: Defaults to "https://in.xfel.eu/calibration/calibration_constant_versions/". """ - from IPython.display import Markdown, display - from tabulate import tabulate + from IPython.display import display if metadata is None: metadata = self.metadata() @@ -768,6 +767,8 @@ class CalibrationData: cal_groups = [ list(calibrations)[x:x+4] for x in range(0, len(calibrations), 4)] + tables = [] + # Loop over groups of calibrations. for cal_group in cal_groups: table = [["Modules"] + cal_group] @@ -786,22 +787,17 @@ class CalibrationData: c_mdata["begin_validity_at"]).strftime( "%Y-%m-%d %H:%M") mod_consts.append( - f"[{c_time}]({ccvs_url}/{c_mdata['ccv_id']})") + (c_time, f"{ccvs_url}/{c_mdata['ccv_id']}") + ) else: # Constant is not available for this module. mod_consts.append("___") table.append([mod] + mod_consts) - display( - Markdown( - tabulate( - table, - tablefmt="pipe", - headers="firstrow", - ) - ) - ) + tables.append(table) + + display(DisplayTables(tables)) def _build_condition(self, parameters): cond = dict() diff --git a/src/cal_tools/tools.py b/src/cal_tools/tools.py index d9e5e5f9e420a41dfff546b38e95a5fbd81c7bf8..79ec9bd3b64622ea7c6d686de7e3ca650e4d4518 100644 --- a/src/cal_tools/tools.py +++ b/src/cal_tools/tools.py @@ -1065,3 +1065,55 @@ def raw_data_location_string(proposal: str, runs: List[int]): " a preceding 'p'. Example: 'p900203'") return f"proposal:{proposal} runs:{' '.join(map(str, runs))}" + + +class DisplayTables: + def __init__(self, tables): + # list (tables) of lists (rows) of lists (cells). A cell may be str, + # or a (text, url) tuple to make a link. + self.tables = tables + + @staticmethod + def _build_table(table, fmt_link): + res = [] + for row in table: + prepd_row = [] + for cell in row: + if isinstance(cell, tuple): + text, url = cell + else: + text = cell + url = None + + if url is None: + prepd_row.append(text) + else: + prepd_row.append(fmt_link(text, url)) + res.append(prepd_row) + return res + + def _repr_markdown_(self): + from tabulate import tabulate + + def fmt_link(text, url): + return f"[{text}]({url})" + + prepd_tables = [self._build_table(table, fmt_link) for table in self.tables] + + return '\n\n'.join( + tabulate(t, tablefmt="pipe", headers="firstrow") + for t in prepd_tables + ) + + def _repr_latex_(self): + from tabulate import tabulate + + def fmt_link(text, url): + return r'\href{%s}{%s}' % (url, text) + + prepd_tables = [self._build_table(table, fmt_link) for table in self.tables] + + return '\n\n'.join( + tabulate(t, tablefmt="latex_raw", headers="firstrow") + for t in prepd_tables + )