scitex 2.7.0__py3-none-any.whl → 2.7.3__py3-none-any.whl
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.
- scitex/__init__.py +6 -2
- scitex/__version__.py +1 -1
- scitex/audio/README.md +52 -0
- scitex/audio/__init__.py +384 -0
- scitex/audio/__main__.py +129 -0
- scitex/audio/_tts.py +334 -0
- scitex/audio/engines/__init__.py +44 -0
- scitex/audio/engines/base.py +275 -0
- scitex/audio/engines/elevenlabs_engine.py +143 -0
- scitex/audio/engines/gtts_engine.py +162 -0
- scitex/audio/engines/pyttsx3_engine.py +131 -0
- scitex/audio/mcp_server.py +757 -0
- scitex/bridge/_helpers.py +1 -1
- scitex/bridge/_plt_vis.py +1 -1
- scitex/bridge/_stats_vis.py +1 -1
- scitex/dev/plt/__init__.py +272 -0
- scitex/dev/plt/plot_mpl_axhline.py +28 -0
- scitex/dev/plt/plot_mpl_axhspan.py +28 -0
- scitex/dev/plt/plot_mpl_axvline.py +28 -0
- scitex/dev/plt/plot_mpl_axvspan.py +28 -0
- scitex/dev/plt/plot_mpl_bar.py +29 -0
- scitex/dev/plt/plot_mpl_barh.py +29 -0
- scitex/dev/plt/plot_mpl_boxplot.py +28 -0
- scitex/dev/plt/plot_mpl_contour.py +31 -0
- scitex/dev/plt/plot_mpl_contourf.py +31 -0
- scitex/dev/plt/plot_mpl_errorbar.py +30 -0
- scitex/dev/plt/plot_mpl_eventplot.py +28 -0
- scitex/dev/plt/plot_mpl_fill.py +30 -0
- scitex/dev/plt/plot_mpl_fill_between.py +31 -0
- scitex/dev/plt/plot_mpl_hexbin.py +28 -0
- scitex/dev/plt/plot_mpl_hist.py +28 -0
- scitex/dev/plt/plot_mpl_hist2d.py +28 -0
- scitex/dev/plt/plot_mpl_imshow.py +29 -0
- scitex/dev/plt/plot_mpl_pcolormesh.py +31 -0
- scitex/dev/plt/plot_mpl_pie.py +29 -0
- scitex/dev/plt/plot_mpl_plot.py +29 -0
- scitex/dev/plt/plot_mpl_quiver.py +31 -0
- scitex/dev/plt/plot_mpl_scatter.py +28 -0
- scitex/dev/plt/plot_mpl_stackplot.py +31 -0
- scitex/dev/plt/plot_mpl_stem.py +29 -0
- scitex/dev/plt/plot_mpl_step.py +29 -0
- scitex/dev/plt/plot_mpl_violinplot.py +28 -0
- scitex/dev/plt/plot_sns_barplot.py +29 -0
- scitex/dev/plt/plot_sns_boxplot.py +29 -0
- scitex/dev/plt/plot_sns_heatmap.py +28 -0
- scitex/dev/plt/plot_sns_histplot.py +29 -0
- scitex/dev/plt/plot_sns_kdeplot.py +29 -0
- scitex/dev/plt/plot_sns_lineplot.py +31 -0
- scitex/dev/plt/plot_sns_scatterplot.py +29 -0
- scitex/dev/plt/plot_sns_stripplot.py +29 -0
- scitex/dev/plt/plot_sns_swarmplot.py +29 -0
- scitex/dev/plt/plot_sns_violinplot.py +29 -0
- scitex/dev/plt/plot_stx_bar.py +29 -0
- scitex/dev/plt/plot_stx_barh.py +29 -0
- scitex/dev/plt/plot_stx_box.py +28 -0
- scitex/dev/plt/plot_stx_boxplot.py +28 -0
- scitex/dev/plt/plot_stx_conf_mat.py +28 -0
- scitex/dev/plt/plot_stx_contour.py +31 -0
- scitex/dev/plt/plot_stx_ecdf.py +28 -0
- scitex/dev/plt/plot_stx_errorbar.py +30 -0
- scitex/dev/plt/plot_stx_fill_between.py +31 -0
- scitex/dev/plt/plot_stx_fillv.py +28 -0
- scitex/dev/plt/plot_stx_heatmap.py +28 -0
- scitex/dev/plt/plot_stx_image.py +28 -0
- scitex/dev/plt/plot_stx_imshow.py +28 -0
- scitex/dev/plt/plot_stx_joyplot.py +28 -0
- scitex/dev/plt/plot_stx_kde.py +28 -0
- scitex/dev/plt/plot_stx_line.py +28 -0
- scitex/dev/plt/plot_stx_mean_ci.py +28 -0
- scitex/dev/plt/plot_stx_mean_std.py +28 -0
- scitex/dev/plt/plot_stx_median_iqr.py +28 -0
- scitex/dev/plt/plot_stx_raster.py +28 -0
- scitex/dev/plt/plot_stx_rectangle.py +28 -0
- scitex/dev/plt/plot_stx_scatter.py +29 -0
- scitex/dev/plt/plot_stx_shaded_line.py +29 -0
- scitex/dev/plt/plot_stx_violin.py +28 -0
- scitex/dev/plt/plot_stx_violinplot.py +28 -0
- scitex/fig/__init__.py +352 -0
- scitex/{vis → fig}/backend/_parser.py +1 -1
- scitex/{vis → fig}/canvas.py +1 -1
- scitex/{vis → fig}/editor/_defaults.py +70 -5
- scitex/fig/editor/_edit.py +751 -0
- scitex/{vis → fig}/editor/_qt_editor.py +181 -1
- scitex/fig/editor/flask_editor/_bbox.py +1276 -0
- scitex/fig/editor/flask_editor/_core.py +624 -0
- scitex/{vis → fig}/editor/flask_editor/_plotter.py +38 -4
- scitex/fig/editor/flask_editor/_renderer.py +739 -0
- scitex/{vis → fig}/editor/flask_editor/templates/__init__.py +1 -1
- scitex/fig/editor/flask_editor/templates/_html.py +834 -0
- scitex/fig/editor/flask_editor/templates/_scripts.py +3136 -0
- scitex/{vis → fig}/editor/flask_editor/templates/_styles.py +625 -18
- scitex/{vis → fig}/io/__init__.py +13 -1
- scitex/fig/io/_bundle.py +973 -0
- scitex/{vis → fig}/io/_canvas.py +1 -1
- scitex/{vis → fig}/io/_data.py +1 -1
- scitex/{vis → fig}/io/_export.py +1 -1
- scitex/{vis → fig}/io/_load.py +1 -1
- scitex/{vis → fig}/io/_panel.py +1 -1
- scitex/{vis → fig}/io/_save.py +1 -1
- scitex/{vis → fig}/model/__init__.py +1 -1
- scitex/{vis → fig}/model/_annotations.py +1 -1
- scitex/{vis → fig}/model/_axes.py +1 -1
- scitex/{vis → fig}/model/_figure.py +1 -1
- scitex/{vis → fig}/model/_guides.py +1 -1
- scitex/{vis → fig}/model/_plot.py +1 -1
- scitex/{vis → fig}/model/_styles.py +1 -1
- scitex/{vis → fig}/utils/__init__.py +1 -1
- scitex/io/__init__.py +10 -26
- scitex/io/_bundle.py +434 -0
- scitex/io/_flush.py +5 -2
- scitex/io/_load.py +98 -0
- scitex/io/_load_modules/_H5Explorer.py +5 -2
- scitex/io/_load_modules/_canvas.py +2 -2
- scitex/io/_load_modules/_image.py +3 -4
- scitex/io/_load_modules/_txt.py +4 -2
- scitex/io/_metadata.py +34 -324
- scitex/io/_metadata_modules/__init__.py +46 -0
- scitex/io/_metadata_modules/_embed.py +70 -0
- scitex/io/_metadata_modules/_read.py +64 -0
- scitex/io/_metadata_modules/_utils.py +79 -0
- scitex/io/_metadata_modules/embed_metadata_jpeg.py +74 -0
- scitex/io/_metadata_modules/embed_metadata_pdf.py +53 -0
- scitex/io/_metadata_modules/embed_metadata_png.py +26 -0
- scitex/io/_metadata_modules/embed_metadata_svg.py +62 -0
- scitex/io/_metadata_modules/read_metadata_jpeg.py +57 -0
- scitex/io/_metadata_modules/read_metadata_pdf.py +51 -0
- scitex/io/_metadata_modules/read_metadata_png.py +39 -0
- scitex/io/_metadata_modules/read_metadata_svg.py +44 -0
- scitex/io/_qr_utils.py +5 -3
- scitex/io/_save.py +548 -30
- scitex/io/_save_modules/_canvas.py +3 -3
- scitex/io/_save_modules/_image.py +5 -9
- scitex/io/_save_modules/_tex.py +7 -4
- scitex/io/utils/h5_to_zarr.py +11 -9
- scitex/msword/__init__.py +255 -0
- scitex/msword/profiles.py +357 -0
- scitex/msword/reader.py +753 -0
- scitex/msword/utils.py +289 -0
- scitex/msword/writer.py +362 -0
- scitex/plt/__init__.py +5 -2
- scitex/plt/_subplots/_AxesWrapper.py +6 -6
- scitex/plt/_subplots/_AxisWrapper.py +15 -9
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/__init__.py +36 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_labels.py +264 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_metadata.py +213 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_visual.py +128 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +59 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_base.py +34 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_scientific.py +593 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_statistical.py +654 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_stx_aliases.py +527 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_RawMatplotlibMixin.py +321 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/__init__.py +33 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_base.py +152 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +600 -0
- scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +79 -5
- scitex/plt/_subplots/_FigWrapper.py +6 -6
- scitex/plt/_subplots/_SubplotsWrapper.py +28 -18
- scitex/plt/_subplots/_export_as_csv.py +35 -5
- scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +8 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_annotate.py +10 -21
- scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +18 -7
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +28 -12
- scitex/plt/_subplots/_export_as_csv_formatters/_format_matshow.py +10 -4
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_imshow.py +13 -1
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +12 -2
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter.py +10 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_quiver.py +10 -4
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +18 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +44 -36
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +14 -2
- scitex/plt/_subplots/_export_as_csv_formatters/_format_streamplot.py +11 -5
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_bar.py +84 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_barh.py +85 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_conf_mat.py +14 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_contour.py +54 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_ecdf.py +14 -2
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_errorbar.py +120 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_heatmap.py +16 -6
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_image.py +29 -19
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_imshow.py +63 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_joyplot.py +22 -5
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_ci.py +18 -14
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_std.py +18 -14
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_median_iqr.py +18 -14
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_raster.py +10 -2
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter.py +51 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter_hist.py +18 -9
- scitex/plt/ax/_plot/_stx_ecdf.py +4 -2
- scitex/plt/gallery/_generate.py +421 -14
- scitex/plt/io/__init__.py +53 -0
- scitex/plt/io/_bundle.py +490 -0
- scitex/plt/io/_layered_bundle.py +1343 -0
- scitex/plt/styles/SCITEX_STYLE.yaml +26 -0
- scitex/plt/styles/__init__.py +14 -0
- scitex/plt/styles/presets.py +78 -0
- scitex/plt/utils/__init__.py +13 -1
- scitex/plt/utils/_collect_figure_metadata.py +10 -14
- scitex/plt/utils/_configure_mpl.py +6 -18
- scitex/plt/utils/_crop.py +32 -14
- scitex/plt/utils/_csv_column_naming.py +54 -0
- scitex/plt/utils/_figure_mm.py +116 -1
- scitex/plt/utils/_hitmap.py +1643 -0
- scitex/plt/utils/metadata/__init__.py +25 -0
- scitex/plt/utils/metadata/_core.py +9 -10
- scitex/plt/utils/metadata/_dimensions.py +6 -3
- scitex/plt/utils/metadata/_editable_export.py +405 -0
- scitex/plt/utils/metadata/_geometry_extraction.py +570 -0
- scitex/schema/__init__.py +109 -16
- scitex/schema/_canvas.py +1 -1
- scitex/schema/_plot.py +1015 -0
- scitex/schema/_stats.py +2 -2
- scitex/stats/__init__.py +117 -0
- scitex/stats/io/__init__.py +29 -0
- scitex/stats/io/_bundle.py +156 -0
- scitex/tex/__init__.py +4 -0
- scitex/tex/_export.py +890 -0
- {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/METADATA +11 -1
- {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/RECORD +238 -170
- scitex/io/memo.md +0 -2827
- scitex/plt/REQUESTS.md +0 -191
- scitex/plt/_subplots/TODO.md +0 -53
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +0 -559
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +0 -1609
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +0 -447
- scitex/plt/templates/research-master/scitex/vis/gallery/area/fill_between.json +0 -110
- scitex/plt/templates/research-master/scitex/vis/gallery/area/fill_betweenx.json +0 -88
- scitex/plt/templates/research-master/scitex/vis/gallery/area/stx_fill_between.json +0 -103
- scitex/plt/templates/research-master/scitex/vis/gallery/area/stx_fillv.json +0 -106
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/bar.json +0 -92
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/barh.json +0 -92
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/boxplot.json +0 -92
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_bar.json +0 -84
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_barh.json +0 -84
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_box.json +0 -83
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_boxplot.json +0 -93
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_violin.json +0 -91
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_violinplot.json +0 -91
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/violinplot.json +0 -91
- scitex/plt/templates/research-master/scitex/vis/gallery/contour/contour.json +0 -97
- scitex/plt/templates/research-master/scitex/vis/gallery/contour/contourf.json +0 -98
- scitex/plt/templates/research-master/scitex/vis/gallery/contour/stx_contour.json +0 -84
- scitex/plt/templates/research-master/scitex/vis/gallery/distribution/hist.json +0 -101
- scitex/plt/templates/research-master/scitex/vis/gallery/distribution/hist2d.json +0 -96
- scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_ecdf.json +0 -95
- scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_joyplot.json +0 -95
- scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_kde.json +0 -93
- scitex/plt/templates/research-master/scitex/vis/gallery/grid/imshow.json +0 -95
- scitex/plt/templates/research-master/scitex/vis/gallery/grid/matshow.json +0 -95
- scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_conf_mat.json +0 -83
- scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_heatmap.json +0 -92
- scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_image.json +0 -121
- scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_imshow.json +0 -84
- scitex/plt/templates/research-master/scitex/vis/gallery/line/plot.json +0 -110
- scitex/plt/templates/research-master/scitex/vis/gallery/line/step.json +0 -92
- scitex/plt/templates/research-master/scitex/vis/gallery/line/stx_line.json +0 -95
- scitex/plt/templates/research-master/scitex/vis/gallery/line/stx_shaded_line.json +0 -96
- scitex/plt/templates/research-master/scitex/vis/gallery/scatter/hexbin.json +0 -95
- scitex/plt/templates/research-master/scitex/vis/gallery/scatter/scatter.json +0 -95
- scitex/plt/templates/research-master/scitex/vis/gallery/scatter/stem.json +0 -92
- scitex/plt/templates/research-master/scitex/vis/gallery/scatter/stx_scatter.json +0 -84
- scitex/plt/templates/research-master/scitex/vis/gallery/special/pie.json +0 -94
- scitex/plt/templates/research-master/scitex/vis/gallery/special/stx_raster.json +0 -109
- scitex/plt/templates/research-master/scitex/vis/gallery/special/stx_rectangle.json +0 -108
- scitex/plt/templates/research-master/scitex/vis/gallery/statistical/errorbar.json +0 -93
- scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_errorbar.json +0 -84
- scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_mean_ci.json +0 -96
- scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_mean_std.json +0 -96
- scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_median_iqr.json +0 -96
- scitex/plt/templates/research-master/scitex/vis/gallery/vector/quiver.json +0 -99
- scitex/plt/templates/research-master/scitex/vis/gallery/vector/streamplot.json +0 -100
- scitex/vis/__init__.py +0 -177
- scitex/vis/editor/_edit.py +0 -390
- scitex/vis/editor/flask_editor/_bbox.py +0 -529
- scitex/vis/editor/flask_editor/_core.py +0 -168
- scitex/vis/editor/flask_editor/_renderer.py +0 -393
- scitex/vis/editor/flask_editor/templates/_html.py +0 -513
- scitex/vis/editor/flask_editor/templates/_scripts.py +0 -1261
- /scitex/{vis → fig}/README.md +0 -0
- /scitex/{vis → fig}/backend/__init__.py +0 -0
- /scitex/{vis → fig}/backend/_export.py +0 -0
- /scitex/{vis → fig}/backend/_render.py +0 -0
- /scitex/{vis → fig}/docs/CANVAS_ARCHITECTURE.md +0 -0
- /scitex/{vis → fig}/editor/__init__.py +0 -0
- /scitex/{vis → fig}/editor/_dearpygui_editor.py +0 -0
- /scitex/{vis → fig}/editor/_flask_editor.py +0 -0
- /scitex/{vis → fig}/editor/_mpl_editor.py +0 -0
- /scitex/{vis → fig}/editor/_tkinter_editor.py +0 -0
- /scitex/{vis → fig}/editor/flask_editor/__init__.py +0 -0
- /scitex/{vis → fig}/editor/flask_editor/_utils.py +0 -0
- /scitex/{vis → fig}/io/_directory.py +0 -0
- /scitex/{vis → fig}/model/_plot_types.py +0 -0
- /scitex/{vis → fig}/utils/_defaults.py +0 -0
- /scitex/{vis → fig}/utils/_validate.py +0 -0
- {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/WHEEL +0 -0
- {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/entry_points.txt +0 -0
- {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# Timestamp: 2025-12-08
|
|
4
4
|
# File: /home/ywatanabe/proj/scitex-code/src/scitex/io/_save_modules/_canvas.py
|
|
5
5
|
"""
|
|
6
|
-
Save canvas directory (.canvas) for scitex.
|
|
6
|
+
Save canvas directory (.canvas) for scitex.fig.
|
|
7
7
|
|
|
8
8
|
Canvas directories are portable figure bundles containing:
|
|
9
9
|
- canvas.json: Layout, panels, composition settings
|
|
@@ -113,7 +113,7 @@ def _export_canvas_figures(
|
|
|
113
113
|
formats = ["png", "pdf", "svg"]
|
|
114
114
|
|
|
115
115
|
try:
|
|
116
|
-
from scitex.
|
|
116
|
+
from scitex.fig.io.export import _compose_and_export
|
|
117
117
|
import json
|
|
118
118
|
|
|
119
119
|
# Load canvas.json
|
|
@@ -136,7 +136,7 @@ def _export_canvas_figures(
|
|
|
136
136
|
transparent=False,
|
|
137
137
|
)
|
|
138
138
|
except ImportError:
|
|
139
|
-
# scitex.
|
|
139
|
+
# scitex.fig not available
|
|
140
140
|
pass
|
|
141
141
|
except Exception as e:
|
|
142
142
|
# Log but don't fail save if export fails
|
|
@@ -8,11 +8,12 @@ import os
|
|
|
8
8
|
__FILE__ = __file__
|
|
9
9
|
|
|
10
10
|
import io as _io
|
|
11
|
-
import logging
|
|
12
11
|
|
|
13
12
|
import plotly
|
|
14
13
|
from PIL import Image
|
|
15
14
|
|
|
15
|
+
from scitex import logging
|
|
16
|
+
|
|
16
17
|
logger = logging.getLogger(__name__)
|
|
17
18
|
|
|
18
19
|
|
|
@@ -66,9 +67,7 @@ def save_image(
|
|
|
66
67
|
fig = obj if hasattr(obj, "savefig") else obj.figure
|
|
67
68
|
obj = add_qr_to_figure(fig, metadata, position=qr_position)
|
|
68
69
|
except Exception as e:
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
warnings.warn(f"Failed to add QR code: {e}")
|
|
70
|
+
logger.warning(f"Failed to add QR code: {e}")
|
|
72
71
|
|
|
73
72
|
# png
|
|
74
73
|
if fmt == 'png':
|
|
@@ -216,9 +215,7 @@ def save_image(
|
|
|
216
215
|
if verbose:
|
|
217
216
|
logger.debug(f" • Embedded metadata: {metadata}")
|
|
218
217
|
except Exception as e:
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
warnings.warn(f"Failed to embed metadata: {e}")
|
|
218
|
+
logger.warning(f"Failed to embed metadata: {e}")
|
|
222
219
|
|
|
223
220
|
def _save_stats_from_figure(obj, spath, verbose=False):
|
|
224
221
|
"""
|
|
@@ -297,8 +294,7 @@ def _save_stats_from_figure(obj, spath, verbose=False):
|
|
|
297
294
|
logger.info(f" • Auto-saved stats to: {stats_path}")
|
|
298
295
|
|
|
299
296
|
except Exception as e:
|
|
300
|
-
|
|
301
|
-
warnings.warn(f"Failed to auto-save stats: {e}")
|
|
297
|
+
logger.warning(f"Failed to auto-save stats: {e}")
|
|
302
298
|
|
|
303
299
|
|
|
304
300
|
# EOF
|
scitex/io/_save_modules/_tex.py
CHANGED
|
@@ -20,7 +20,10 @@ Supports multiple input types:
|
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
22
|
from typing import Union, Optional, Any
|
|
23
|
-
|
|
23
|
+
|
|
24
|
+
from scitex import logging
|
|
25
|
+
|
|
26
|
+
logger = logging.getLogger(__name__)
|
|
24
27
|
|
|
25
28
|
|
|
26
29
|
def save_tex(
|
|
@@ -121,21 +124,21 @@ def save_tex(
|
|
|
121
124
|
tex_content = _wrap_with_table_env(tex_content, caption, label)
|
|
122
125
|
|
|
123
126
|
except ImportError:
|
|
124
|
-
|
|
127
|
+
logger.warning(
|
|
125
128
|
"Cannot convert dict/list to LaTeX: "
|
|
126
129
|
"scitex.stats.utils.convert_results not available. "
|
|
127
130
|
"Converting to string instead."
|
|
128
131
|
)
|
|
129
132
|
tex_content = str(obj)
|
|
130
133
|
except Exception as e:
|
|
131
|
-
|
|
134
|
+
logger.warning(
|
|
132
135
|
f"Failed to convert object to LaTeX: {e}. Converting to string instead."
|
|
133
136
|
)
|
|
134
137
|
tex_content = str(obj)
|
|
135
138
|
|
|
136
139
|
else:
|
|
137
140
|
# Fallback: convert to string
|
|
138
|
-
|
|
141
|
+
logger.warning(
|
|
139
142
|
f"Unsupported type {type(obj)} for LaTeX export. Converting to string."
|
|
140
143
|
)
|
|
141
144
|
tex_content = str(obj)
|
scitex/io/utils/h5_to_zarr.py
CHANGED
|
@@ -33,9 +33,9 @@ import numpy as np
|
|
|
33
33
|
import os
|
|
34
34
|
from pathlib import Path
|
|
35
35
|
from typing import Optional, Union, Dict, Any, List, Tuple
|
|
36
|
-
import warnings
|
|
37
36
|
from tqdm import tqdm
|
|
38
37
|
|
|
38
|
+
from scitex import logging
|
|
39
39
|
from scitex.errors import (
|
|
40
40
|
IOError as SciTeXIOError,
|
|
41
41
|
FileFormatError,
|
|
@@ -46,6 +46,8 @@ from scitex.errors import (
|
|
|
46
46
|
warn_performance,
|
|
47
47
|
)
|
|
48
48
|
|
|
49
|
+
logger = logging.getLogger(__name__)
|
|
50
|
+
|
|
49
51
|
|
|
50
52
|
def _get_zarr_compressor(
|
|
51
53
|
compressor: Optional[Union[str, Any]] = "zstd",
|
|
@@ -114,7 +116,7 @@ def _copy_h5_attributes(
|
|
|
114
116
|
|
|
115
117
|
zarr_obj.attrs[key] = value
|
|
116
118
|
except Exception as e:
|
|
117
|
-
|
|
119
|
+
logger.warning(f"Could not copy attribute '{key}': {e}")
|
|
118
120
|
|
|
119
121
|
|
|
120
122
|
def _migrate_dataset(
|
|
@@ -132,7 +134,7 @@ def _migrate_dataset(
|
|
|
132
134
|
if hasattr(h5_dataset, "dtype"):
|
|
133
135
|
test_dtype = h5_dataset.dtype
|
|
134
136
|
except Exception as e:
|
|
135
|
-
|
|
137
|
+
logger.warning(f"Skipping corrupted dataset '{name}': {e}")
|
|
136
138
|
return None
|
|
137
139
|
|
|
138
140
|
# Get dataset info
|
|
@@ -241,7 +243,7 @@ def _migrate_dataset(
|
|
|
241
243
|
else: # Scalar
|
|
242
244
|
zarr_array[()] = h5_dataset[()]
|
|
243
245
|
except Exception as e:
|
|
244
|
-
|
|
246
|
+
logger.warning(
|
|
245
247
|
f"Error copying data for dataset '{name}': {e}. Leaving empty."
|
|
246
248
|
)
|
|
247
249
|
# The array structure is created but data might be zeros/empty
|
|
@@ -268,14 +270,14 @@ def _migrate_group(
|
|
|
268
270
|
try:
|
|
269
271
|
keys = list(h5_group.keys())
|
|
270
272
|
except Exception as e:
|
|
271
|
-
|
|
273
|
+
logger.warning(f"Cannot access group keys: {e}")
|
|
272
274
|
return
|
|
273
275
|
|
|
274
276
|
for key in keys:
|
|
275
277
|
try:
|
|
276
278
|
item = h5_group[key]
|
|
277
279
|
except Exception as e:
|
|
278
|
-
|
|
280
|
+
logger.warning(f"Cannot access item '{key}': {e}")
|
|
279
281
|
continue
|
|
280
282
|
|
|
281
283
|
if isinstance(item, h5py.Dataset):
|
|
@@ -297,7 +299,7 @@ def _migrate_group(
|
|
|
297
299
|
)
|
|
298
300
|
|
|
299
301
|
else:
|
|
300
|
-
|
|
302
|
+
logger.warning(f"Unknown HDF5 object type for '{key}': {type(item)}")
|
|
301
303
|
|
|
302
304
|
|
|
303
305
|
def migrate_h5_to_zarr(
|
|
@@ -418,7 +420,7 @@ def migrate_h5_to_zarr(
|
|
|
418
420
|
except OSError as e:
|
|
419
421
|
if "Unable to open file" in str(e) or "bad symbol table" in str(e):
|
|
420
422
|
# File is corrupted
|
|
421
|
-
|
|
423
|
+
logger.warning(f"HDF5 file appears to be corrupted: {h5_path}")
|
|
422
424
|
raise FileFormatError(
|
|
423
425
|
str(h5_path), expected_format="HDF5", actual_format="corrupted HDF5"
|
|
424
426
|
)
|
|
@@ -452,7 +454,7 @@ def _validate_migration(
|
|
|
452
454
|
# Compare dtypes (approximately)
|
|
453
455
|
if h5_item.dtype.kind != "O" and zarr_item.dtype.kind != "O":
|
|
454
456
|
if h5_item.dtype != zarr_item.dtype:
|
|
455
|
-
|
|
457
|
+
logger.warning(
|
|
456
458
|
f"Dtype mismatch at {path}: "
|
|
457
459
|
f"HDF5={h5_item.dtype}, Zarr={zarr_item.dtype}"
|
|
458
460
|
)
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: 2025-12-11 15:15:00
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex-code/src/scitex/msword/__init__.py
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
MS Word (DOCX) import/export utilities for SciTeX.
|
|
8
|
+
|
|
9
|
+
This module provides high-level functions to convert between
|
|
10
|
+
MS Word .docx files and SciTeX's internal writer document model.
|
|
11
|
+
|
|
12
|
+
Strategy:
|
|
13
|
+
---------
|
|
14
|
+
- Word users write text only (paragraphs, minimal formatting)
|
|
15
|
+
- SciTeX handles: figures, tables, references, LaTeX generation
|
|
16
|
+
- SciTeX JSON is the "source of truth", Word is just a view/edit layer
|
|
17
|
+
|
|
18
|
+
Typical usage:
|
|
19
|
+
--------------
|
|
20
|
+
from scitex.msword import load_docx, save_docx, list_profiles
|
|
21
|
+
|
|
22
|
+
# Import from Word
|
|
23
|
+
doc = load_docx("input.docx", profile="generic")
|
|
24
|
+
|
|
25
|
+
# Manipulate via scitex.writer...
|
|
26
|
+
# doc.normalize()
|
|
27
|
+
|
|
28
|
+
# Export to Word (different journal template)
|
|
29
|
+
save_docx(doc, "output.docx", profile="mdpi-ijerph")
|
|
30
|
+
|
|
31
|
+
Available profiles:
|
|
32
|
+
-------------------
|
|
33
|
+
- generic: Standard Word with Heading 1/2/3
|
|
34
|
+
- mdpi-ijerph: MDPI IJERPH journal template
|
|
35
|
+
- resna-2025: RESNA 2025 scientific paper template
|
|
36
|
+
- iop-double-anonymous: IOP double-anonymous template
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
from __future__ import annotations
|
|
40
|
+
|
|
41
|
+
from pathlib import Path
|
|
42
|
+
from typing import Any, Optional
|
|
43
|
+
|
|
44
|
+
from .profiles import (
|
|
45
|
+
BaseWordProfile,
|
|
46
|
+
get_profile,
|
|
47
|
+
list_profiles,
|
|
48
|
+
register_profile,
|
|
49
|
+
)
|
|
50
|
+
from .reader import WordReader
|
|
51
|
+
from .writer import WordWriter
|
|
52
|
+
from .utils import (
|
|
53
|
+
link_captions_to_images,
|
|
54
|
+
link_captions_to_images_by_proximity,
|
|
55
|
+
normalize_section_headings,
|
|
56
|
+
validate_document,
|
|
57
|
+
create_post_import_hook,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def load_docx(
|
|
62
|
+
path: str | Path,
|
|
63
|
+
profile: str | None = None,
|
|
64
|
+
extract_images: bool = True,
|
|
65
|
+
) -> dict[str, Any]:
|
|
66
|
+
"""
|
|
67
|
+
Load a DOCX file and convert it into a SciTeX writer document.
|
|
68
|
+
|
|
69
|
+
Parameters
|
|
70
|
+
----------
|
|
71
|
+
path : str | Path
|
|
72
|
+
Path to the .docx file.
|
|
73
|
+
profile : str | None
|
|
74
|
+
Optional profile name that specifies how to interpret Word styles
|
|
75
|
+
(e.g., "mdpi-ijerph", "resna-2025"). If None, "generic" is used.
|
|
76
|
+
extract_images : bool
|
|
77
|
+
If True, extract embedded images and store references.
|
|
78
|
+
|
|
79
|
+
Returns
|
|
80
|
+
-------
|
|
81
|
+
dict
|
|
82
|
+
A SciTeX writer document structure containing:
|
|
83
|
+
- blocks: List of document blocks (headings, paragraphs, captions, etc.)
|
|
84
|
+
- metadata: Profile and source file information
|
|
85
|
+
- images: Extracted image references (if extract_images=True)
|
|
86
|
+
- references: Parsed reference entries
|
|
87
|
+
|
|
88
|
+
Examples
|
|
89
|
+
--------
|
|
90
|
+
>>> from scitex.msword import load_docx
|
|
91
|
+
>>> doc = load_docx("manuscript.docx", profile="mdpi-ijerph")
|
|
92
|
+
>>> print(doc["metadata"]["profile"])
|
|
93
|
+
'mdpi-ijerph'
|
|
94
|
+
"""
|
|
95
|
+
path = Path(path)
|
|
96
|
+
profile_obj: BaseWordProfile = get_profile(profile)
|
|
97
|
+
reader = WordReader(profile=profile_obj, extract_images=extract_images)
|
|
98
|
+
return reader.read(path)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def save_docx(
|
|
102
|
+
writer_doc: dict[str, Any] | Any,
|
|
103
|
+
path: str | Path,
|
|
104
|
+
profile: str | None = None,
|
|
105
|
+
overwrite: bool = True,
|
|
106
|
+
template_path: str | Path | None = None,
|
|
107
|
+
) -> Path:
|
|
108
|
+
"""
|
|
109
|
+
Save a SciTeX writer document as a DOCX file.
|
|
110
|
+
|
|
111
|
+
Parameters
|
|
112
|
+
----------
|
|
113
|
+
writer_doc : dict | Any
|
|
114
|
+
SciTeX writer document instance to export.
|
|
115
|
+
path : str | Path
|
|
116
|
+
Output path for the .docx file.
|
|
117
|
+
profile : str | None
|
|
118
|
+
Optional profile name that controls how sections, headings,
|
|
119
|
+
figures, tables and references are mapped to Word styles.
|
|
120
|
+
If None, "generic" is used.
|
|
121
|
+
overwrite : bool
|
|
122
|
+
If False and the file already exists, raises FileExistsError.
|
|
123
|
+
template_path : str | Path | None
|
|
124
|
+
Optional path to a Word template (.dotx/.docx) to use as base.
|
|
125
|
+
This allows using journal-specific formatting.
|
|
126
|
+
|
|
127
|
+
Returns
|
|
128
|
+
-------
|
|
129
|
+
Path
|
|
130
|
+
The path to the written .docx file.
|
|
131
|
+
|
|
132
|
+
Examples
|
|
133
|
+
--------
|
|
134
|
+
>>> from scitex.msword import save_docx
|
|
135
|
+
>>> save_docx(doc, "submission_resna_2025.docx", profile="resna-2025")
|
|
136
|
+
PosixPath('submission_resna_2025.docx')
|
|
137
|
+
"""
|
|
138
|
+
output_path = Path(path)
|
|
139
|
+
if output_path.exists() and not overwrite:
|
|
140
|
+
raise FileExistsError(f"File already exists: {output_path}")
|
|
141
|
+
|
|
142
|
+
profile_obj: BaseWordProfile = get_profile(profile)
|
|
143
|
+
writer = WordWriter(profile=profile_obj, template_path=template_path)
|
|
144
|
+
writer.write(writer_doc, output_path)
|
|
145
|
+
return output_path
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def convert_docx_to_tex(
|
|
149
|
+
input_path: str | Path,
|
|
150
|
+
output_path: str | Path,
|
|
151
|
+
profile: str | None = None,
|
|
152
|
+
*,
|
|
153
|
+
image_dir: str | Path | None = None,
|
|
154
|
+
link_images: bool = True,
|
|
155
|
+
link_mode: str = "by-number",
|
|
156
|
+
normalize_headings: bool = True,
|
|
157
|
+
validate: bool = True,
|
|
158
|
+
) -> Path:
|
|
159
|
+
"""
|
|
160
|
+
Convert a DOCX file directly to LaTeX.
|
|
161
|
+
|
|
162
|
+
This is a convenience function that:
|
|
163
|
+
1. Loads the DOCX file into SciTeX intermediate format
|
|
164
|
+
2. (Optionally) normalizes headings
|
|
165
|
+
3. (Optionally) links figure captions to images
|
|
166
|
+
4. (Optionally) validates the document and adds warnings
|
|
167
|
+
5. Exports to LaTeX (including figures via image_dir)
|
|
168
|
+
|
|
169
|
+
Parameters
|
|
170
|
+
----------
|
|
171
|
+
input_path : str | Path
|
|
172
|
+
Path to the input .docx file.
|
|
173
|
+
output_path : str | Path
|
|
174
|
+
Path for the output .tex file.
|
|
175
|
+
profile : str | None
|
|
176
|
+
Word profile for interpreting styles
|
|
177
|
+
(e.g., "resna-2025", "iop-double-anonymous").
|
|
178
|
+
image_dir : str | Path | None, optional
|
|
179
|
+
Directory where extracted figure image files will be saved.
|
|
180
|
+
If None, the LaTeX exporter will create "<tex_stem>_figures"
|
|
181
|
+
next to `output_path`.
|
|
182
|
+
link_images : bool, default True
|
|
183
|
+
Whether to link figure captions to extracted images so that
|
|
184
|
+
LaTeX can generate \\includegraphics inside figure environments.
|
|
185
|
+
link_mode : {"by-number", "by-proximity"}, default "by-number"
|
|
186
|
+
Strategy for linking captions to images:
|
|
187
|
+
- "by-number": Figure 1 -> first image, Figure 2 -> second image...
|
|
188
|
+
- "by-proximity": assign images in document order, useful when
|
|
189
|
+
figure numbers and image order don't match.
|
|
190
|
+
normalize_headings : bool, default True
|
|
191
|
+
If True, apply common heading normalizations
|
|
192
|
+
(e.g., "intro" -> "Introduction").
|
|
193
|
+
validate : bool, default True
|
|
194
|
+
If True, run basic structural checks and populate
|
|
195
|
+
doc["warnings"] with any issues.
|
|
196
|
+
|
|
197
|
+
Returns
|
|
198
|
+
-------
|
|
199
|
+
Path
|
|
200
|
+
The path to the written .tex file.
|
|
201
|
+
|
|
202
|
+
Examples
|
|
203
|
+
--------
|
|
204
|
+
>>> from scitex.msword import convert_docx_to_tex
|
|
205
|
+
>>> convert_docx_to_tex(
|
|
206
|
+
... "RESNA 2025 Scientific Paper Template.docx",
|
|
207
|
+
... "manuscript.tex",
|
|
208
|
+
... profile="resna-2025",
|
|
209
|
+
... image_dir="figures",
|
|
210
|
+
... )
|
|
211
|
+
PosixPath('manuscript.tex')
|
|
212
|
+
"""
|
|
213
|
+
# Import here to avoid circular imports
|
|
214
|
+
from scitex.tex import export_tex
|
|
215
|
+
|
|
216
|
+
# 1. DOCX -> SciTeX intermediate format
|
|
217
|
+
doc = load_docx(input_path, profile=profile, extract_images=True)
|
|
218
|
+
|
|
219
|
+
# 2. Normalize headings (optional)
|
|
220
|
+
if normalize_headings:
|
|
221
|
+
doc = normalize_section_headings(doc)
|
|
222
|
+
|
|
223
|
+
# 3. Link captions to images (optional)
|
|
224
|
+
if link_images and doc.get("images"):
|
|
225
|
+
if link_mode == "by-proximity":
|
|
226
|
+
doc = link_captions_to_images_by_proximity(doc)
|
|
227
|
+
else:
|
|
228
|
+
# Default: link by figure number
|
|
229
|
+
doc = link_captions_to_images(doc)
|
|
230
|
+
|
|
231
|
+
# 4. Validate document structure (optional)
|
|
232
|
+
if validate:
|
|
233
|
+
doc = validate_document(doc)
|
|
234
|
+
|
|
235
|
+
# 5. SciTeX -> LaTeX (with figures)
|
|
236
|
+
return export_tex(doc, output_path, image_dir=image_dir)
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
__all__ = [
|
|
240
|
+
"load_docx",
|
|
241
|
+
"save_docx",
|
|
242
|
+
"convert_docx_to_tex",
|
|
243
|
+
"list_profiles",
|
|
244
|
+
"get_profile",
|
|
245
|
+
"register_profile",
|
|
246
|
+
"BaseWordProfile",
|
|
247
|
+
"WordReader",
|
|
248
|
+
"WordWriter",
|
|
249
|
+
# Utility functions for post-processing
|
|
250
|
+
"link_captions_to_images",
|
|
251
|
+
"link_captions_to_images_by_proximity",
|
|
252
|
+
"normalize_section_headings",
|
|
253
|
+
"validate_document",
|
|
254
|
+
"create_post_import_hook",
|
|
255
|
+
]
|