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.
Files changed (297) hide show
  1. scitex/__init__.py +6 -2
  2. scitex/__version__.py +1 -1
  3. scitex/audio/README.md +52 -0
  4. scitex/audio/__init__.py +384 -0
  5. scitex/audio/__main__.py +129 -0
  6. scitex/audio/_tts.py +334 -0
  7. scitex/audio/engines/__init__.py +44 -0
  8. scitex/audio/engines/base.py +275 -0
  9. scitex/audio/engines/elevenlabs_engine.py +143 -0
  10. scitex/audio/engines/gtts_engine.py +162 -0
  11. scitex/audio/engines/pyttsx3_engine.py +131 -0
  12. scitex/audio/mcp_server.py +757 -0
  13. scitex/bridge/_helpers.py +1 -1
  14. scitex/bridge/_plt_vis.py +1 -1
  15. scitex/bridge/_stats_vis.py +1 -1
  16. scitex/dev/plt/__init__.py +272 -0
  17. scitex/dev/plt/plot_mpl_axhline.py +28 -0
  18. scitex/dev/plt/plot_mpl_axhspan.py +28 -0
  19. scitex/dev/plt/plot_mpl_axvline.py +28 -0
  20. scitex/dev/plt/plot_mpl_axvspan.py +28 -0
  21. scitex/dev/plt/plot_mpl_bar.py +29 -0
  22. scitex/dev/plt/plot_mpl_barh.py +29 -0
  23. scitex/dev/plt/plot_mpl_boxplot.py +28 -0
  24. scitex/dev/plt/plot_mpl_contour.py +31 -0
  25. scitex/dev/plt/plot_mpl_contourf.py +31 -0
  26. scitex/dev/plt/plot_mpl_errorbar.py +30 -0
  27. scitex/dev/plt/plot_mpl_eventplot.py +28 -0
  28. scitex/dev/plt/plot_mpl_fill.py +30 -0
  29. scitex/dev/plt/plot_mpl_fill_between.py +31 -0
  30. scitex/dev/plt/plot_mpl_hexbin.py +28 -0
  31. scitex/dev/plt/plot_mpl_hist.py +28 -0
  32. scitex/dev/plt/plot_mpl_hist2d.py +28 -0
  33. scitex/dev/plt/plot_mpl_imshow.py +29 -0
  34. scitex/dev/plt/plot_mpl_pcolormesh.py +31 -0
  35. scitex/dev/plt/plot_mpl_pie.py +29 -0
  36. scitex/dev/plt/plot_mpl_plot.py +29 -0
  37. scitex/dev/plt/plot_mpl_quiver.py +31 -0
  38. scitex/dev/plt/plot_mpl_scatter.py +28 -0
  39. scitex/dev/plt/plot_mpl_stackplot.py +31 -0
  40. scitex/dev/plt/plot_mpl_stem.py +29 -0
  41. scitex/dev/plt/plot_mpl_step.py +29 -0
  42. scitex/dev/plt/plot_mpl_violinplot.py +28 -0
  43. scitex/dev/plt/plot_sns_barplot.py +29 -0
  44. scitex/dev/plt/plot_sns_boxplot.py +29 -0
  45. scitex/dev/plt/plot_sns_heatmap.py +28 -0
  46. scitex/dev/plt/plot_sns_histplot.py +29 -0
  47. scitex/dev/plt/plot_sns_kdeplot.py +29 -0
  48. scitex/dev/plt/plot_sns_lineplot.py +31 -0
  49. scitex/dev/plt/plot_sns_scatterplot.py +29 -0
  50. scitex/dev/plt/plot_sns_stripplot.py +29 -0
  51. scitex/dev/plt/plot_sns_swarmplot.py +29 -0
  52. scitex/dev/plt/plot_sns_violinplot.py +29 -0
  53. scitex/dev/plt/plot_stx_bar.py +29 -0
  54. scitex/dev/plt/plot_stx_barh.py +29 -0
  55. scitex/dev/plt/plot_stx_box.py +28 -0
  56. scitex/dev/plt/plot_stx_boxplot.py +28 -0
  57. scitex/dev/plt/plot_stx_conf_mat.py +28 -0
  58. scitex/dev/plt/plot_stx_contour.py +31 -0
  59. scitex/dev/plt/plot_stx_ecdf.py +28 -0
  60. scitex/dev/plt/plot_stx_errorbar.py +30 -0
  61. scitex/dev/plt/plot_stx_fill_between.py +31 -0
  62. scitex/dev/plt/plot_stx_fillv.py +28 -0
  63. scitex/dev/plt/plot_stx_heatmap.py +28 -0
  64. scitex/dev/plt/plot_stx_image.py +28 -0
  65. scitex/dev/plt/plot_stx_imshow.py +28 -0
  66. scitex/dev/plt/plot_stx_joyplot.py +28 -0
  67. scitex/dev/plt/plot_stx_kde.py +28 -0
  68. scitex/dev/plt/plot_stx_line.py +28 -0
  69. scitex/dev/plt/plot_stx_mean_ci.py +28 -0
  70. scitex/dev/plt/plot_stx_mean_std.py +28 -0
  71. scitex/dev/plt/plot_stx_median_iqr.py +28 -0
  72. scitex/dev/plt/plot_stx_raster.py +28 -0
  73. scitex/dev/plt/plot_stx_rectangle.py +28 -0
  74. scitex/dev/plt/plot_stx_scatter.py +29 -0
  75. scitex/dev/plt/plot_stx_shaded_line.py +29 -0
  76. scitex/dev/plt/plot_stx_violin.py +28 -0
  77. scitex/dev/plt/plot_stx_violinplot.py +28 -0
  78. scitex/fig/__init__.py +352 -0
  79. scitex/{vis → fig}/backend/_parser.py +1 -1
  80. scitex/{vis → fig}/canvas.py +1 -1
  81. scitex/{vis → fig}/editor/_defaults.py +70 -5
  82. scitex/fig/editor/_edit.py +751 -0
  83. scitex/{vis → fig}/editor/_qt_editor.py +181 -1
  84. scitex/fig/editor/flask_editor/_bbox.py +1276 -0
  85. scitex/fig/editor/flask_editor/_core.py +624 -0
  86. scitex/{vis → fig}/editor/flask_editor/_plotter.py +38 -4
  87. scitex/fig/editor/flask_editor/_renderer.py +739 -0
  88. scitex/{vis → fig}/editor/flask_editor/templates/__init__.py +1 -1
  89. scitex/fig/editor/flask_editor/templates/_html.py +834 -0
  90. scitex/fig/editor/flask_editor/templates/_scripts.py +3136 -0
  91. scitex/{vis → fig}/editor/flask_editor/templates/_styles.py +625 -18
  92. scitex/{vis → fig}/io/__init__.py +13 -1
  93. scitex/fig/io/_bundle.py +973 -0
  94. scitex/{vis → fig}/io/_canvas.py +1 -1
  95. scitex/{vis → fig}/io/_data.py +1 -1
  96. scitex/{vis → fig}/io/_export.py +1 -1
  97. scitex/{vis → fig}/io/_load.py +1 -1
  98. scitex/{vis → fig}/io/_panel.py +1 -1
  99. scitex/{vis → fig}/io/_save.py +1 -1
  100. scitex/{vis → fig}/model/__init__.py +1 -1
  101. scitex/{vis → fig}/model/_annotations.py +1 -1
  102. scitex/{vis → fig}/model/_axes.py +1 -1
  103. scitex/{vis → fig}/model/_figure.py +1 -1
  104. scitex/{vis → fig}/model/_guides.py +1 -1
  105. scitex/{vis → fig}/model/_plot.py +1 -1
  106. scitex/{vis → fig}/model/_styles.py +1 -1
  107. scitex/{vis → fig}/utils/__init__.py +1 -1
  108. scitex/io/__init__.py +10 -26
  109. scitex/io/_bundle.py +434 -0
  110. scitex/io/_flush.py +5 -2
  111. scitex/io/_load.py +98 -0
  112. scitex/io/_load_modules/_H5Explorer.py +5 -2
  113. scitex/io/_load_modules/_canvas.py +2 -2
  114. scitex/io/_load_modules/_image.py +3 -4
  115. scitex/io/_load_modules/_txt.py +4 -2
  116. scitex/io/_metadata.py +34 -324
  117. scitex/io/_metadata_modules/__init__.py +46 -0
  118. scitex/io/_metadata_modules/_embed.py +70 -0
  119. scitex/io/_metadata_modules/_read.py +64 -0
  120. scitex/io/_metadata_modules/_utils.py +79 -0
  121. scitex/io/_metadata_modules/embed_metadata_jpeg.py +74 -0
  122. scitex/io/_metadata_modules/embed_metadata_pdf.py +53 -0
  123. scitex/io/_metadata_modules/embed_metadata_png.py +26 -0
  124. scitex/io/_metadata_modules/embed_metadata_svg.py +62 -0
  125. scitex/io/_metadata_modules/read_metadata_jpeg.py +57 -0
  126. scitex/io/_metadata_modules/read_metadata_pdf.py +51 -0
  127. scitex/io/_metadata_modules/read_metadata_png.py +39 -0
  128. scitex/io/_metadata_modules/read_metadata_svg.py +44 -0
  129. scitex/io/_qr_utils.py +5 -3
  130. scitex/io/_save.py +548 -30
  131. scitex/io/_save_modules/_canvas.py +3 -3
  132. scitex/io/_save_modules/_image.py +5 -9
  133. scitex/io/_save_modules/_tex.py +7 -4
  134. scitex/io/utils/h5_to_zarr.py +11 -9
  135. scitex/msword/__init__.py +255 -0
  136. scitex/msword/profiles.py +357 -0
  137. scitex/msword/reader.py +753 -0
  138. scitex/msword/utils.py +289 -0
  139. scitex/msword/writer.py +362 -0
  140. scitex/plt/__init__.py +5 -2
  141. scitex/plt/_subplots/_AxesWrapper.py +6 -6
  142. scitex/plt/_subplots/_AxisWrapper.py +15 -9
  143. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/__init__.py +36 -0
  144. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_labels.py +264 -0
  145. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_metadata.py +213 -0
  146. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_visual.py +128 -0
  147. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +59 -0
  148. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_base.py +34 -0
  149. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_scientific.py +593 -0
  150. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_statistical.py +654 -0
  151. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_stx_aliases.py +527 -0
  152. scitex/plt/_subplots/_AxisWrapperMixins/_RawMatplotlibMixin.py +321 -0
  153. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/__init__.py +33 -0
  154. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_base.py +152 -0
  155. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +600 -0
  156. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +79 -5
  157. scitex/plt/_subplots/_FigWrapper.py +6 -6
  158. scitex/plt/_subplots/_SubplotsWrapper.py +28 -18
  159. scitex/plt/_subplots/_export_as_csv.py +35 -5
  160. scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +8 -0
  161. scitex/plt/_subplots/_export_as_csv_formatters/_format_annotate.py +10 -21
  162. scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +18 -7
  163. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +28 -12
  164. scitex/plt/_subplots/_export_as_csv_formatters/_format_matshow.py +10 -4
  165. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_imshow.py +13 -1
  166. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +12 -2
  167. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter.py +10 -3
  168. scitex/plt/_subplots/_export_as_csv_formatters/_format_quiver.py +10 -4
  169. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +18 -3
  170. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +44 -36
  171. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +14 -2
  172. scitex/plt/_subplots/_export_as_csv_formatters/_format_streamplot.py +11 -5
  173. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_bar.py +84 -0
  174. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_barh.py +85 -0
  175. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_conf_mat.py +14 -3
  176. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_contour.py +54 -0
  177. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_ecdf.py +14 -2
  178. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_errorbar.py +120 -0
  179. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_heatmap.py +16 -6
  180. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_image.py +29 -19
  181. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_imshow.py +63 -0
  182. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_joyplot.py +22 -5
  183. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_ci.py +18 -14
  184. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_std.py +18 -14
  185. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_median_iqr.py +18 -14
  186. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_raster.py +10 -2
  187. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter.py +51 -0
  188. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter_hist.py +18 -9
  189. scitex/plt/ax/_plot/_stx_ecdf.py +4 -2
  190. scitex/plt/gallery/_generate.py +421 -14
  191. scitex/plt/io/__init__.py +53 -0
  192. scitex/plt/io/_bundle.py +490 -0
  193. scitex/plt/io/_layered_bundle.py +1343 -0
  194. scitex/plt/styles/SCITEX_STYLE.yaml +26 -0
  195. scitex/plt/styles/__init__.py +14 -0
  196. scitex/plt/styles/presets.py +78 -0
  197. scitex/plt/utils/__init__.py +13 -1
  198. scitex/plt/utils/_collect_figure_metadata.py +10 -14
  199. scitex/plt/utils/_configure_mpl.py +6 -18
  200. scitex/plt/utils/_crop.py +32 -14
  201. scitex/plt/utils/_csv_column_naming.py +54 -0
  202. scitex/plt/utils/_figure_mm.py +116 -1
  203. scitex/plt/utils/_hitmap.py +1643 -0
  204. scitex/plt/utils/metadata/__init__.py +25 -0
  205. scitex/plt/utils/metadata/_core.py +9 -10
  206. scitex/plt/utils/metadata/_dimensions.py +6 -3
  207. scitex/plt/utils/metadata/_editable_export.py +405 -0
  208. scitex/plt/utils/metadata/_geometry_extraction.py +570 -0
  209. scitex/schema/__init__.py +109 -16
  210. scitex/schema/_canvas.py +1 -1
  211. scitex/schema/_plot.py +1015 -0
  212. scitex/schema/_stats.py +2 -2
  213. scitex/stats/__init__.py +117 -0
  214. scitex/stats/io/__init__.py +29 -0
  215. scitex/stats/io/_bundle.py +156 -0
  216. scitex/tex/__init__.py +4 -0
  217. scitex/tex/_export.py +890 -0
  218. {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/METADATA +11 -1
  219. {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/RECORD +238 -170
  220. scitex/io/memo.md +0 -2827
  221. scitex/plt/REQUESTS.md +0 -191
  222. scitex/plt/_subplots/TODO.md +0 -53
  223. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +0 -559
  224. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +0 -1609
  225. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +0 -447
  226. scitex/plt/templates/research-master/scitex/vis/gallery/area/fill_between.json +0 -110
  227. scitex/plt/templates/research-master/scitex/vis/gallery/area/fill_betweenx.json +0 -88
  228. scitex/plt/templates/research-master/scitex/vis/gallery/area/stx_fill_between.json +0 -103
  229. scitex/plt/templates/research-master/scitex/vis/gallery/area/stx_fillv.json +0 -106
  230. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/bar.json +0 -92
  231. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/barh.json +0 -92
  232. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/boxplot.json +0 -92
  233. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_bar.json +0 -84
  234. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_barh.json +0 -84
  235. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_box.json +0 -83
  236. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_boxplot.json +0 -93
  237. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_violin.json +0 -91
  238. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_violinplot.json +0 -91
  239. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/violinplot.json +0 -91
  240. scitex/plt/templates/research-master/scitex/vis/gallery/contour/contour.json +0 -97
  241. scitex/plt/templates/research-master/scitex/vis/gallery/contour/contourf.json +0 -98
  242. scitex/plt/templates/research-master/scitex/vis/gallery/contour/stx_contour.json +0 -84
  243. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/hist.json +0 -101
  244. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/hist2d.json +0 -96
  245. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_ecdf.json +0 -95
  246. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_joyplot.json +0 -95
  247. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_kde.json +0 -93
  248. scitex/plt/templates/research-master/scitex/vis/gallery/grid/imshow.json +0 -95
  249. scitex/plt/templates/research-master/scitex/vis/gallery/grid/matshow.json +0 -95
  250. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_conf_mat.json +0 -83
  251. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_heatmap.json +0 -92
  252. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_image.json +0 -121
  253. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_imshow.json +0 -84
  254. scitex/plt/templates/research-master/scitex/vis/gallery/line/plot.json +0 -110
  255. scitex/plt/templates/research-master/scitex/vis/gallery/line/step.json +0 -92
  256. scitex/plt/templates/research-master/scitex/vis/gallery/line/stx_line.json +0 -95
  257. scitex/plt/templates/research-master/scitex/vis/gallery/line/stx_shaded_line.json +0 -96
  258. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/hexbin.json +0 -95
  259. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/scatter.json +0 -95
  260. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/stem.json +0 -92
  261. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/stx_scatter.json +0 -84
  262. scitex/plt/templates/research-master/scitex/vis/gallery/special/pie.json +0 -94
  263. scitex/plt/templates/research-master/scitex/vis/gallery/special/stx_raster.json +0 -109
  264. scitex/plt/templates/research-master/scitex/vis/gallery/special/stx_rectangle.json +0 -108
  265. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/errorbar.json +0 -93
  266. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_errorbar.json +0 -84
  267. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_mean_ci.json +0 -96
  268. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_mean_std.json +0 -96
  269. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_median_iqr.json +0 -96
  270. scitex/plt/templates/research-master/scitex/vis/gallery/vector/quiver.json +0 -99
  271. scitex/plt/templates/research-master/scitex/vis/gallery/vector/streamplot.json +0 -100
  272. scitex/vis/__init__.py +0 -177
  273. scitex/vis/editor/_edit.py +0 -390
  274. scitex/vis/editor/flask_editor/_bbox.py +0 -529
  275. scitex/vis/editor/flask_editor/_core.py +0 -168
  276. scitex/vis/editor/flask_editor/_renderer.py +0 -393
  277. scitex/vis/editor/flask_editor/templates/_html.py +0 -513
  278. scitex/vis/editor/flask_editor/templates/_scripts.py +0 -1261
  279. /scitex/{vis → fig}/README.md +0 -0
  280. /scitex/{vis → fig}/backend/__init__.py +0 -0
  281. /scitex/{vis → fig}/backend/_export.py +0 -0
  282. /scitex/{vis → fig}/backend/_render.py +0 -0
  283. /scitex/{vis → fig}/docs/CANVAS_ARCHITECTURE.md +0 -0
  284. /scitex/{vis → fig}/editor/__init__.py +0 -0
  285. /scitex/{vis → fig}/editor/_dearpygui_editor.py +0 -0
  286. /scitex/{vis → fig}/editor/_flask_editor.py +0 -0
  287. /scitex/{vis → fig}/editor/_mpl_editor.py +0 -0
  288. /scitex/{vis → fig}/editor/_tkinter_editor.py +0 -0
  289. /scitex/{vis → fig}/editor/flask_editor/__init__.py +0 -0
  290. /scitex/{vis → fig}/editor/flask_editor/_utils.py +0 -0
  291. /scitex/{vis → fig}/io/_directory.py +0 -0
  292. /scitex/{vis → fig}/model/_plot_types.py +0 -0
  293. /scitex/{vis → fig}/utils/_defaults.py +0 -0
  294. /scitex/{vis → fig}/utils/_validate.py +0 -0
  295. {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/WHEEL +0 -0
  296. {scitex-2.7.0.dist-info → scitex-2.7.3.dist-info}/entry_points.txt +0 -0
  297. {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.vis.
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.vis.io.export import _compose_and_export
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.vis not available
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
- import warnings
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
- import warnings
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
- import warnings
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
@@ -20,7 +20,10 @@ Supports multiple input types:
20
20
  """
21
21
 
22
22
  from typing import Union, Optional, Any
23
- import warnings
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
- warnings.warn(
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
- warnings.warn(
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
- warnings.warn(
141
+ logger.warning(
139
142
  f"Unsupported type {type(obj)} for LaTeX export. Converting to string."
140
143
  )
141
144
  tex_content = str(obj)
@@ -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
- warnings.warn(f"Could not copy attribute '{key}': {e}")
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
- warnings.warn(f"Skipping corrupted dataset '{name}': {e}")
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
- warnings.warn(
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
- warnings.warn(f"Cannot access group keys: {e}")
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
- warnings.warn(f"Cannot access item '{key}': {e}")
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
- warnings.warn(f"Unknown HDF5 object type for '{key}': {type(item)}")
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
- warnings.warn(f"HDF5 file appears to be corrupted: {h5_path}")
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
- warnings.warn(
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
+ ]