python-package/lets_plot/_kbridge.py (90 lines of code) (raw):

# Copyright (c) 2020. JetBrains s.r.o. # Use of this source code is governed by the MIT license that can be found in the LICENSE file. # noinspection PyUnresolvedReferences from typing import Dict, List import lets_plot_kotlin_bridge from ._global_settings import get_js_cdn_url from ._type_utils import standardize_dict def _generate_dynamic_display_html(plot_spec: Dict) -> str: plot_spec = _standardize_plot_spec(plot_spec) # Old implementation (deprecated): # return lets_plot_kotlin_bridge.generate_html(plot_spec) # New implementation using get_display_html_for_raw_spec with default parameters return lets_plot_kotlin_bridge.get_display_html_for_raw_spec( plot_spec, {}, # empty sizing_options -> defaults to notebookCell sizing (MIN width, SCALED height) True, # dynamic_script_loading False, # force_immediate_render False # responsive ) def _generate_svg(plot_spec: Dict, w: float = None, h: float = None, unit: str = None) -> str: plot_spec = _standardize_plot_spec(plot_spec) w = -1.0 if w is None else float(w) h = -1.0 if h is None else float(h) unit = '' if unit is None else str(unit) # None is not a valid value for str type - PyArg_ParseTuple will fail return lets_plot_kotlin_bridge.export_svg(plot_spec, w, h, unit) def _generate_png(bytestring: Dict, output_width: float, output_height: float, unit: str, dpi: int, scale: float) -> str: """ Export a plot to PNG format. Returns base64 encoded string of the PNG image. """ plot_spec = _standardize_plot_spec(bytestring) output_width = -1.0 if output_width is None else float(output_width) output_height = -1.0 if output_height is None else float(output_height) unit = '' if unit is None else str(unit) # None is not a valid value for str type - PyArg_ParseTuple will fail dpi = -1 if dpi is None else int(dpi) scale = -1.0 if scale is None else float(scale) return lets_plot_kotlin_bridge.export_png(plot_spec, output_width, output_height, unit, dpi, scale) def _generate_mvg(bytestring: Dict, output_width: float, output_height: float, unit: str, dpi: int, scale: float) -> str: """ Export a plot to MVG format. For internal use. """ plot_spec = _standardize_plot_spec(bytestring) output_width = -1.0 if output_width is None else float(output_width) output_height = -1.0 if output_height is None else float(output_height) unit = '' if unit is None else str(unit) # None is not a valid value for str type - PyArg_ParseTuple will fail dpi = -1 if dpi is None else int(dpi) scale = -1.0 if scale is None else float(scale) return lets_plot_kotlin_bridge.export_mvg(plot_spec, output_width, output_height, unit, dpi, scale) def _generate_static_html_page(plot_spec: Dict, iframe: bool) -> str: plot_spec = _standardize_plot_spec(plot_spec) scriptUrl = get_js_cdn_url() return lets_plot_kotlin_bridge.export_html(plot_spec, scriptUrl, iframe) def _generate_static_html_page_for_raw_spec( plot_spec: Dict, sizing_options: Dict, dynamic_script_loading: bool = False, force_immediate_render: bool = False, responsive: bool = False, height100pct: bool = False ) -> str: plot_spec = _standardize_plot_spec(plot_spec) sizing_options = standardize_dict(sizing_options) scriptUrl = get_js_cdn_url() return lets_plot_kotlin_bridge.get_static_html_page_for_raw_spec( plot_spec, scriptUrl, sizing_options, dynamic_script_loading, force_immediate_render, responsive, height100pct ) def _standardize_plot_spec(plot_spec: Dict) -> Dict: """ :param plot_spec: dict """ if not isinstance(plot_spec, dict): raise ValueError("dict expected but was {}".format(type(plot_spec))) return standardize_dict(plot_spec) def _generate_static_configure_html() -> str: """ Generate static HTML configuration. Returns ------- str HTML string containing the static configuration with the script URL from global settings. """ scriptUrl = get_js_cdn_url() return lets_plot_kotlin_bridge.get_static_configure_html(scriptUrl) def _generate_display_html_for_raw_spec( plot_spec: Dict, sizing_options: Dict, *, dynamic_script_loading: bool = False, force_immediate_render: bool = False, responsive: bool = False, height100pct: bool = False ) -> str: """ Generate HTML for displaying a plot from 'raw' specification (not processed by plot backend) with customizable options. Parameters ---------- plot_spec : Dict Dict containing the plot specification. sizing_options : Dict Dict containing sizing policy options (width_mode, height_mode, width, height). dynamic_script_loading : bool, default=False Controls how the generated JS code interacts with the lets-plot.js library. If True, assumes the library loads dynamically (asynchronously). If False, assumes the library loads synchronously via a <script> tag in the page header. force_immediate_render : bool, default=False Controls the timing of plot rendering. If True, renders the plot immediately. If False, waits for the ResizeObserver event to ensure proper DOM layout. responsive : bool, default=False If True, makes the plot responsive to container size changes. height100pct : bool, default=False If True, sets the plot container div height to 100%. Returns ------- str HTML string containing the plot with specified options. Notes ----- The sizing_options dict supports the following structure: { 'width_mode': str, # 'fixed', 'min', 'fit', 'scaled' (case-insensitive) 'height_mode': str, # 'fixed', 'min', 'fit', 'scaled' (case-insensitive) 'width': number, # optional 'height': number # optional } Sizing modes determine how the plot dimensions are calculated: 1. FIXED mode: - Uses the explicitly provided width/height values - Falls back to the default figure size if no values are provided - Not responsive to container size 2. MIN mode: Applies the smallest dimension among: - The default figure size - The specified width/height (if provided) - The container size (if available) 3. FIT mode: Uses either: - The specified width/height if provided - Otherwise uses container size if available - Falls back to default figure size if neither is available 4. SCALED mode: - Always preserves the figure's aspect ratio - Typical usage: one dimension (usually width) uses FIXED/MIN/FIT mode, and SCALED height adjusts to maintain aspect ratio - Special case: when both width and height are SCALED: * Requires container size to be available * Fits a figure within container while preserving the aspect ratio * Neither dimension is predetermined """ plot_spec = _standardize_plot_spec(plot_spec) sizing_options = standardize_dict(sizing_options) return lets_plot_kotlin_bridge.get_display_html_for_raw_spec( plot_spec, sizing_options, dynamic_script_loading, force_immediate_render, responsive, height100pct ) def _generate_palette_from_color_scale_spec(scale_spec: Dict, n: int) -> List[str]: """ Generate a list of hex color codes from a color scale specification. Parameters ---------- scale_spec : Dict Dictionary containing the scale specification. n : int Number of colors to generate. Returns ------- List of hex color codes. """ scale_spec = standardize_dict(scale_spec) return lets_plot_kotlin_bridge.get_palette_from_color_scale_spec(scale_spec, n)