maidr 1.5.0__tar.gz → 1.6.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. {maidr-1.5.0 → maidr-1.6.0}/CHANGELOG.md +14 -0
  2. {maidr-1.5.0 → maidr-1.6.0}/PKG-INFO +1 -1
  3. {maidr-1.5.0 → maidr-1.6.0}/maidr/__init__.py +1 -1
  4. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/maidr.py +44 -1
  5. {maidr-1.5.0 → maidr-1.6.0}/maidr/util/environment.py +89 -0
  6. {maidr-1.5.0 → maidr-1.6.0}/pyproject.toml +1 -1
  7. {maidr-1.5.0 → maidr-1.6.0}/uv.lock +1 -1
  8. {maidr-1.5.0 → maidr-1.6.0}/.commitlintrc.cjs +0 -0
  9. {maidr-1.5.0 → maidr-1.6.0}/.editorconfig +0 -0
  10. {maidr-1.5.0 → maidr-1.6.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  11. {maidr-1.5.0 → maidr-1.6.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  12. {maidr-1.5.0 → maidr-1.6.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  13. {maidr-1.5.0 → maidr-1.6.0}/.github/copilot-instructions.md +0 -0
  14. {maidr-1.5.0 → maidr-1.6.0}/.github/workflows/ci.yml +0 -0
  15. {maidr-1.5.0 → maidr-1.6.0}/.github/workflows/docs.yml +0 -0
  16. {maidr-1.5.0 → maidr-1.6.0}/.github/workflows/release.yml +0 -0
  17. {maidr-1.5.0 → maidr-1.6.0}/.gitignore +0 -0
  18. {maidr-1.5.0 → maidr-1.6.0}/.pre-commit-config.yaml +0 -0
  19. {maidr-1.5.0 → maidr-1.6.0}/.vscode/extensions.json +0 -0
  20. {maidr-1.5.0 → maidr-1.6.0}/.vscode/settings.json +0 -0
  21. {maidr-1.5.0 → maidr-1.6.0}/CONDUCT.md +0 -0
  22. {maidr-1.5.0 → maidr-1.6.0}/CONTRIBUTING.md +0 -0
  23. {maidr-1.5.0 → maidr-1.6.0}/LICENSE +0 -0
  24. {maidr-1.5.0 → maidr-1.6.0}/README.md +0 -0
  25. {maidr-1.5.0 → maidr-1.6.0}/docs/.gitignore +0 -0
  26. {maidr-1.5.0 → maidr-1.6.0}/docs/CNAME +0 -0
  27. {maidr-1.5.0 → maidr-1.6.0}/docs/_environment +0 -0
  28. {maidr-1.5.0 → maidr-1.6.0}/docs/_extensions/machow/interlinks/.gitignore +0 -0
  29. {maidr-1.5.0 → maidr-1.6.0}/docs/_extensions/machow/interlinks/_extension.yml +0 -0
  30. {maidr-1.5.0 → maidr-1.6.0}/docs/_extensions/machow/interlinks/interlinks.lua +0 -0
  31. {maidr-1.5.0 → maidr-1.6.0}/docs/_extensions/shafayetShafee/line-highlight/_extension.yml +0 -0
  32. {maidr-1.5.0 → maidr-1.6.0}/docs/_extensions/shafayetShafee/line-highlight/line-highlight.lua +0 -0
  33. {maidr-1.5.0 → maidr-1.6.0}/docs/_extensions/shafayetShafee/line-highlight/resources/css/line-highlight.css +0 -0
  34. {maidr-1.5.0 → maidr-1.6.0}/docs/_extensions/shafayetShafee/line-highlight/resources/js/line-highlight.js +0 -0
  35. {maidr-1.5.0 → maidr-1.6.0}/docs/_quarto.yml +0 -0
  36. {maidr-1.5.0 → maidr-1.6.0}/docs/examples.qmd +0 -0
  37. {maidr-1.5.0 → maidr-1.6.0}/docs/index.qmd +0 -0
  38. {maidr-1.5.0 → maidr-1.6.0}/docs/styles.css +0 -0
  39. {maidr-1.5.0 → maidr-1.6.0}/example/bar/example_bar_plot.ipynb +0 -0
  40. {maidr-1.5.0 → maidr-1.6.0}/example/bar/matplotlib/example_mpl_bar_plot.py +0 -0
  41. {maidr-1.5.0 → maidr-1.6.0}/example/bar/seaborn/example_sns_bar_plot.py +0 -0
  42. {maidr-1.5.0 → maidr-1.6.0}/example/box/example_box_plot.ipynb +0 -0
  43. {maidr-1.5.0 → maidr-1.6.0}/example/box/matplotlib/example_mpl_box.py +0 -0
  44. {maidr-1.5.0 → maidr-1.6.0}/example/box/seaborn/example_sns_box.py +0 -0
  45. {maidr-1.5.0 → maidr-1.6.0}/example/candle_stick/legacy_candlestick_example.py +0 -0
  46. {maidr-1.5.0 → maidr-1.6.0}/example/candle_stick/mplfinance_candlestick_example.py +0 -0
  47. {maidr-1.5.0 → maidr-1.6.0}/example/candle_stick/volcandat.csv +0 -0
  48. {maidr-1.5.0 → maidr-1.6.0}/example/count/example_count_plot.ipynb +0 -0
  49. {maidr-1.5.0 → maidr-1.6.0}/example/count/seaborn/example_sns_count_plot.py +0 -0
  50. {maidr-1.5.0 → maidr-1.6.0}/example/dodged/matplotlib/example_mpl_dodged.py +0 -0
  51. {maidr-1.5.0 → maidr-1.6.0}/example/dodged/seaborn/example_sns_dodged.py +0 -0
  52. {maidr-1.5.0 → maidr-1.6.0}/example/facet-subplots/matplotlib/example_mpl_facet_bar_plot.py +0 -0
  53. {maidr-1.5.0 → maidr-1.6.0}/example/facet-subplots/matplotlib/example_mpl_facet_combined_plot.py +0 -0
  54. {maidr-1.5.0 → maidr-1.6.0}/example/facet-subplots/seaborn/example_sns_facet_bar_plot.py +0 -0
  55. {maidr-1.5.0 → maidr-1.6.0}/example/facet-subplots/seaborn/example_sns_facet_combined_plot.py +0 -0
  56. {maidr-1.5.0 → maidr-1.6.0}/example/flask/test_flask_app.py +0 -0
  57. {maidr-1.5.0 → maidr-1.6.0}/example/heatmap/example_heatmap_plot.ipynb +0 -0
  58. {maidr-1.5.0 → maidr-1.6.0}/example/heatmap/matplotlib/example_mpl_heatmap.py +0 -0
  59. {maidr-1.5.0 → maidr-1.6.0}/example/heatmap/seaborn/example_sns_heatmap.py +0 -0
  60. {maidr-1.5.0 → maidr-1.6.0}/example/histogram/example_histogram_plot.ipynb +0 -0
  61. {maidr-1.5.0 → maidr-1.6.0}/example/histogram/matplotlib/example_mpl_hist.py +0 -0
  62. {maidr-1.5.0 → maidr-1.6.0}/example/histogram/matplotlib/histogram_with_kde_matplotlib.py +0 -0
  63. {maidr-1.5.0 → maidr-1.6.0}/example/histogram/seaborn/example_sns_hist.py +0 -0
  64. {maidr-1.5.0 → maidr-1.6.0}/example/histogram/seaborn/histogram_with_kde_seaborn.py +0 -0
  65. {maidr-1.5.0 → maidr-1.6.0}/example/kde/example_kde_plots.ipynb +0 -0
  66. {maidr-1.5.0 → maidr-1.6.0}/example/kde/matplotlib/multiple_kde_matplotlib.py +0 -0
  67. {maidr-1.5.0 → maidr-1.6.0}/example/kde/matplotlib/single_kde_matplotlib.py +0 -0
  68. {maidr-1.5.0 → maidr-1.6.0}/example/kde/seaborn/multiple_kde_seaborn.py +0 -0
  69. {maidr-1.5.0 → maidr-1.6.0}/example/kde/seaborn/single_kde_seaborn.py +0 -0
  70. {maidr-1.5.0 → maidr-1.6.0}/example/line/example_line_plot.ipynb +0 -0
  71. {maidr-1.5.0 → maidr-1.6.0}/example/line/matplotlib/example_mpl_line.py +0 -0
  72. {maidr-1.5.0 → maidr-1.6.0}/example/line/seaborn/example_sns_line.py +0 -0
  73. {maidr-1.5.0 → maidr-1.6.0}/example/multilayer/example_mpl_multilayer.py +0 -0
  74. {maidr-1.5.0 → maidr-1.6.0}/example/multilayer/example_multilayer_plot.ipynb +0 -0
  75. {maidr-1.5.0 → maidr-1.6.0}/example/multiline/example_multiline_plot.ipynb +0 -0
  76. {maidr-1.5.0 → maidr-1.6.0}/example/multiline/matplotlib/example_mpl_multiline.py +0 -0
  77. {maidr-1.5.0 → maidr-1.6.0}/example/multiline/seaborn/example_sns_multiline.py +0 -0
  78. {maidr-1.5.0 → maidr-1.6.0}/example/multipanel/example_multipanel_plot.ipynb +0 -0
  79. {maidr-1.5.0 → maidr-1.6.0}/example/multipanel/matplotlib/example_mpl_multipanel.py +0 -0
  80. {maidr-1.5.0 → maidr-1.6.0}/example/multipanel/seaborn/example_sns_multipanel.py +0 -0
  81. {maidr-1.5.0 → maidr-1.6.0}/example/quarto/demo.qmd +0 -0
  82. {maidr-1.5.0 → maidr-1.6.0}/example/reg/example_reg_plots.ipynb +0 -0
  83. {maidr-1.5.0 → maidr-1.6.0}/example/reg/matplotlib/example_matplotlib_smooth_plot.py +0 -0
  84. {maidr-1.5.0 → maidr-1.6.0}/example/reg/seaborn/example_sns_reg.py +0 -0
  85. {maidr-1.5.0 → maidr-1.6.0}/example/scatter/example_scatter_plot.ipynb +0 -0
  86. {maidr-1.5.0 → maidr-1.6.0}/example/scatter/matplotlib/example_mpl_scatter.py +0 -0
  87. {maidr-1.5.0 → maidr-1.6.0}/example/scatter/seaborn/example_sns_scatter.py +0 -0
  88. {maidr-1.5.0 → maidr-1.6.0}/example/shiny/example_shiny_scatter.py +0 -0
  89. {maidr-1.5.0 → maidr-1.6.0}/example/stacked/matplotlib/example_mpl_stacked.html +0 -0
  90. {maidr-1.5.0 → maidr-1.6.0}/example/stacked/matplotlib/example_mpl_stacked.py +0 -0
  91. {maidr-1.5.0 → maidr-1.6.0}/example/stacked/seaborn/example_sns_stacked.html +0 -0
  92. {maidr-1.5.0 → maidr-1.6.0}/example/stacked/seaborn/example_sns_stacked.py +0 -0
  93. {maidr-1.5.0 → maidr-1.6.0}/example/streamlit/example_streamlit_app.py +0 -0
  94. {maidr-1.5.0 → maidr-1.6.0}/maidr/api.py +0 -0
  95. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/__init__.py +0 -0
  96. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/context_manager.py +0 -0
  97. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/enum/__init__.py +0 -0
  98. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/enum/library.py +0 -0
  99. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/enum/maidr_key.py +0 -0
  100. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/enum/plot_type.py +0 -0
  101. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/enum/smooth_keywords.py +0 -0
  102. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/figure_manager.py +0 -0
  103. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/plot/__init__.py +0 -0
  104. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/plot/barplot.py +0 -0
  105. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/plot/boxplot.py +0 -0
  106. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/plot/candlestick.py +0 -0
  107. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/plot/grouped_barplot.py +0 -0
  108. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/plot/heatmap.py +0 -0
  109. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/plot/histogram.py +0 -0
  110. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/plot/lineplot.py +0 -0
  111. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/plot/maidr_plot.py +0 -0
  112. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/plot/maidr_plot_factory.py +0 -0
  113. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/plot/mplfinance_barplot.py +0 -0
  114. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/plot/mplfinance_lineplot.py +0 -0
  115. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/plot/regplot.py +0 -0
  116. {maidr-1.5.0 → maidr-1.6.0}/maidr/core/plot/scatterplot.py +0 -0
  117. {maidr-1.5.0 → maidr-1.6.0}/maidr/exception/__init__.py +0 -0
  118. {maidr-1.5.0 → maidr-1.6.0}/maidr/exception/extraction_error.py +0 -0
  119. {maidr-1.5.0 → maidr-1.6.0}/maidr/patch/__init__.py +0 -0
  120. {maidr-1.5.0 → maidr-1.6.0}/maidr/patch/barplot.py +0 -0
  121. {maidr-1.5.0 → maidr-1.6.0}/maidr/patch/boxplot.py +0 -0
  122. {maidr-1.5.0 → maidr-1.6.0}/maidr/patch/candlestick.py +0 -0
  123. {maidr-1.5.0 → maidr-1.6.0}/maidr/patch/clear.py +0 -0
  124. {maidr-1.5.0 → maidr-1.6.0}/maidr/patch/common.py +0 -0
  125. {maidr-1.5.0 → maidr-1.6.0}/maidr/patch/heatmap.py +0 -0
  126. {maidr-1.5.0 → maidr-1.6.0}/maidr/patch/highlight.py +0 -0
  127. {maidr-1.5.0 → maidr-1.6.0}/maidr/patch/histogram.py +0 -0
  128. {maidr-1.5.0 → maidr-1.6.0}/maidr/patch/kdeplot.py +0 -0
  129. {maidr-1.5.0 → maidr-1.6.0}/maidr/patch/lineplot.py +0 -0
  130. {maidr-1.5.0 → maidr-1.6.0}/maidr/patch/mplfinance.py +0 -0
  131. {maidr-1.5.0 → maidr-1.6.0}/maidr/patch/regplot.py +0 -0
  132. {maidr-1.5.0 → maidr-1.6.0}/maidr/patch/scatterplot.py +0 -0
  133. {maidr-1.5.0 → maidr-1.6.0}/maidr/util/__init__.py +0 -0
  134. {maidr-1.5.0 → maidr-1.6.0}/maidr/util/dedup_utils.py +0 -0
  135. {maidr-1.5.0 → maidr-1.6.0}/maidr/util/mixin/__init__.py +0 -0
  136. {maidr-1.5.0 → maidr-1.6.0}/maidr/util/mixin/extractor_mixin.py +0 -0
  137. {maidr-1.5.0 → maidr-1.6.0}/maidr/util/mixin/merger_mixin.py +0 -0
  138. {maidr-1.5.0 → maidr-1.6.0}/maidr/util/mplfinance_utils.py +0 -0
  139. {maidr-1.5.0 → maidr-1.6.0}/maidr/util/plot_detection.py +0 -0
  140. {maidr-1.5.0 → maidr-1.6.0}/maidr/util/regression_line_utils.py +0 -0
  141. {maidr-1.5.0 → maidr-1.6.0}/maidr/util/svg_utils.py +0 -0
  142. {maidr-1.5.0 → maidr-1.6.0}/maidr/widget/__init__.py +0 -0
  143. {maidr-1.5.0 → maidr-1.6.0}/maidr/widget/shiny.py +0 -0
  144. {maidr-1.5.0 → maidr-1.6.0}/tests/__init__.py +0 -0
  145. {maidr-1.5.0 → maidr-1.6.0}/tests/conftest.py +0 -0
  146. {maidr-1.5.0 → maidr-1.6.0}/tests/core/__init__.py +0 -0
  147. {maidr-1.5.0 → maidr-1.6.0}/tests/core/enum/__init__.py +0 -0
  148. {maidr-1.5.0 → maidr-1.6.0}/tests/core/plot/__init__.py +0 -0
  149. {maidr-1.5.0 → maidr-1.6.0}/tests/core/test_figure_manager.py +0 -0
  150. {maidr-1.5.0 → maidr-1.6.0}/tests/core/test_maidr_plot.py +0 -0
  151. {maidr-1.5.0 → maidr-1.6.0}/tests/core/test_maidr_plot_factory.py +0 -0
  152. {maidr-1.5.0 → maidr-1.6.0}/tests/fixture/__init__.py +0 -0
  153. {maidr-1.5.0 → maidr-1.6.0}/tests/fixture/library_factory.py +0 -0
  154. {maidr-1.5.0 → maidr-1.6.0}/tests/fixture/matplotlib_factory.py +0 -0
  155. {maidr-1.5.0 → maidr-1.6.0}/tests/fixture/seaborn_factory.py +0 -0
  156. {maidr-1.5.0 → maidr-1.6.0}/tox.ini +0 -0
@@ -1,6 +1,20 @@
1
1
  # CHANGELOG
2
2
 
3
3
 
4
+ ## v1.6.0 (2025-08-04)
5
+
6
+ ### Continuous Integration
7
+
8
+ - Update uv.lock ([#227](https://github.com/xability/py-maidr/pull/227),
9
+ [`f162971`](https://github.com/xability/py-maidr/commit/f162971f4e2585e055de3c837ce9342b292cb378))
10
+
11
+ ### Features
12
+
13
+ - Add WSL compatibility for opening HTML files
14
+ ([#224](https://github.com/xability/py-maidr/pull/224),
15
+ [`2f2a899`](https://github.com/xability/py-maidr/commit/2f2a899b1df4137db94aeb843099ee6f0df952f0))
16
+
17
+
4
18
  ## v1.5.0 (2025-08-04)
5
19
 
6
20
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: maidr
3
- Version: 1.5.0
3
+ Version: 1.6.0
4
4
  Summary: Multimodal Access and Interactive Data Representations
5
5
  Project-URL: Homepage, https://xability.github.io/py-maidr
6
6
  Project-URL: Repository, https://github.com/xability/py-maidr
@@ -1,4 +1,4 @@
1
- __version__ = "1.5.0"
1
+ __version__ = "1.6.0"
2
2
 
3
3
  from .api import close, render, save_html, show, stacked
4
4
  from .core import Maidr
@@ -7,6 +7,8 @@ import os
7
7
  import tempfile
8
8
  import uuid
9
9
  import webbrowser
10
+ import subprocess
11
+ from pathlib import Path
10
12
  from typing import Any, Literal, cast
11
13
 
12
14
  import matplotlib.pyplot as plt
@@ -137,7 +139,48 @@ class Maidr:
137
139
  html_file_path = self.save_html(
138
140
  temp_file_path
139
141
  ) # This will use use_iframe=False
140
- webbrowser.open(f"file://{html_file_path}")
142
+ if Environment.is_wsl():
143
+ wsl_distro_name = Environment.get_wsl_distro_name()
144
+
145
+ # Validate that WSL distro name is available
146
+ if not wsl_distro_name:
147
+ raise ValueError(
148
+ "WSL_DISTRO_NAME environment variable is not set or is empty. "
149
+ "Cannot construct WSL file URL. Please ensure you are running in a WSL environment."
150
+ )
151
+
152
+ # Ensure html_file_path is an absolute POSIX path for proper WSL URL construction
153
+ html_file_path = Path(html_file_path).resolve().as_posix()
154
+
155
+ url = f"file://wsl$/{wsl_distro_name}{html_file_path}"
156
+
157
+ # Try to open the file in Windows using explorer.exe with robust path detection
158
+ explorer_path = Environment.find_explorer_path()
159
+ if explorer_path:
160
+ try:
161
+ result = subprocess.run(
162
+ [explorer_path, url],
163
+ capture_output=True,
164
+ text=True,
165
+ timeout=10
166
+ )
167
+
168
+ if result.returncode == 0:
169
+ return
170
+ else:
171
+ # Fall back to webbrowser.open() if explorer.exe fails
172
+ webbrowser.open(url)
173
+
174
+ except subprocess.TimeoutExpired:
175
+ webbrowser.open(url)
176
+ except Exception:
177
+ # Fall back to webbrowser.open() if explorer.exe fails
178
+ webbrowser.open(url)
179
+ else:
180
+ webbrowser.open(url)
181
+
182
+ else:
183
+ webbrowser.open(f"file://{html_file_path}")
141
184
 
142
185
  def _create_html_tag(self, use_iframe: bool = True) -> Tag:
143
186
  """Create the MAIDR HTML using HTML tags."""
@@ -1,6 +1,8 @@
1
1
  import json
2
2
  import os
3
+ import subprocess
3
4
  import sys
5
+ from typing import Union
4
6
 
5
7
 
6
8
  class Environment:
@@ -99,6 +101,93 @@ class Environment:
99
101
  return False
100
102
  except ImportError:
101
103
  return False
104
+ @staticmethod
105
+ def is_wsl() -> bool:
106
+ """
107
+ Check if the current environment is WSL (Windows Subsystem for Linux).
108
+
109
+ This method detects WSL environments by reading the `/proc/version` file
110
+ and checking for 'microsoft' or 'wsl' keywords in the version string.
111
+ WSL environments typically contain these identifiers in their kernel version.
112
+
113
+ Returns
114
+ -------
115
+ bool
116
+ True if the environment is WSL, False otherwise.
117
+
118
+ Examples
119
+ --------
120
+ >>> from maidr.util.environment import Environment
121
+ >>> Environment.is_wsl()
122
+ False # When not in WSL
123
+ """
124
+ try:
125
+ with open('/proc/version', 'r') as f:
126
+ version_info = f.read().lower()
127
+ if 'microsoft' in version_info or 'wsl' in version_info:
128
+ return True
129
+ except FileNotFoundError:
130
+ pass
131
+ return False
132
+
133
+ @staticmethod
134
+ def get_wsl_distro_name() -> str:
135
+ """
136
+ Get the WSL distribution name from environment variables.
137
+
138
+ This method retrieves the WSL distribution name from the `WSL_DISTRO_NAME`
139
+ environment variable, which is automatically set by WSL when running
140
+ in a WSL environment.
141
+
142
+ Returns
143
+ -------
144
+ str
145
+ The WSL distribution name (e.g., 'Ubuntu-20.04', 'Debian') if set,
146
+ otherwise an empty string.
147
+
148
+ Examples
149
+ --------
150
+ >>> from maidr.util.environment import Environment
151
+ >>> Environment.get_wsl_distro_name()
152
+ '' # When not in WSL or WSL_DISTRO_NAME not set
153
+ """
154
+ return os.environ.get('WSL_DISTRO_NAME', '')
155
+
156
+ @staticmethod
157
+ def find_explorer_path() -> Union[str, None]:
158
+ """
159
+ Find the correct path to explorer.exe in WSL environment.
160
+
161
+ This method checks if explorer.exe is available in the PATH
162
+ and returns the path if found.
163
+
164
+ Returns
165
+ -------
166
+ str | None
167
+ The path to explorer.exe if found, None otherwise.
168
+
169
+ Examples
170
+ --------
171
+ >>> from maidr.util.environment import Environment
172
+ >>> Environment.find_explorer_path()
173
+ '/mnt/c/Windows/explorer.exe' # When found
174
+ """
175
+ # Check if explorer.exe is in PATH
176
+ try:
177
+ result = subprocess.run(
178
+ ['which', 'explorer.exe'],
179
+ capture_output=True,
180
+ text=True,
181
+ timeout=5
182
+ )
183
+ if result.returncode == 0:
184
+ return result.stdout.strip()
185
+ except Exception:
186
+ pass
187
+
188
+ return None
189
+
190
+
102
191
 
103
192
  @staticmethod
104
193
  def get_renderer() -> str:
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "maidr"
7
- version = "1.5.0"
7
+ version = "1.6.0"
8
8
  description = "Multimodal Access and Interactive Data Representations"
9
9
  authors = [
10
10
  { name = "JooYoung Seo", email = "jseo1005@illinois.edu" },
@@ -1675,7 +1675,7 @@ wheels = [
1675
1675
 
1676
1676
  [[package]]
1677
1677
  name = "maidr"
1678
- version = "1.4.10"
1678
+ version = "1.5.0"
1679
1679
  source = { editable = "." }
1680
1680
  dependencies = [
1681
1681
  { name = "htmltools" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes