scitex 2.7.0__py3-none-any.whl → 2.8.1__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 (355) 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/diagram/README.md +197 -0
  79. scitex/diagram/__init__.py +48 -0
  80. scitex/diagram/_compile.py +312 -0
  81. scitex/diagram/_diagram.py +355 -0
  82. scitex/diagram/_presets.py +173 -0
  83. scitex/diagram/_schema.py +182 -0
  84. scitex/diagram/_split.py +278 -0
  85. scitex/fig/__init__.py +352 -0
  86. scitex/{vis → fig}/backend/_parser.py +1 -1
  87. scitex/{vis → fig}/canvas.py +1 -1
  88. scitex/{vis → fig}/editor/__init__.py +5 -2
  89. scitex/{vis → fig}/editor/_dearpygui_editor.py +1 -1
  90. scitex/{vis → fig}/editor/_defaults.py +70 -5
  91. scitex/{vis → fig}/editor/_mpl_editor.py +1 -1
  92. scitex/{vis → fig}/editor/_qt_editor.py +182 -2
  93. scitex/{vis → fig}/editor/_tkinter_editor.py +1 -1
  94. scitex/fig/editor/edit/__init__.py +50 -0
  95. scitex/fig/editor/edit/backend_detector.py +109 -0
  96. scitex/fig/editor/edit/bundle_resolver.py +240 -0
  97. scitex/fig/editor/edit/editor_launcher.py +239 -0
  98. scitex/fig/editor/edit/manual_handler.py +53 -0
  99. scitex/fig/editor/edit/panel_loader.py +232 -0
  100. scitex/fig/editor/edit/path_resolver.py +67 -0
  101. scitex/fig/editor/flask_editor/_bbox.py +1299 -0
  102. scitex/fig/editor/flask_editor/_core.py +1429 -0
  103. scitex/{vis → fig}/editor/flask_editor/_plotter.py +38 -4
  104. scitex/fig/editor/flask_editor/_renderer.py +813 -0
  105. scitex/fig/editor/flask_editor/static/css/base/reset.css +41 -0
  106. scitex/fig/editor/flask_editor/static/css/base/typography.css +16 -0
  107. scitex/fig/editor/flask_editor/static/css/base/variables.css +85 -0
  108. scitex/fig/editor/flask_editor/static/css/components/buttons.css +217 -0
  109. scitex/fig/editor/flask_editor/static/css/components/context-menu.css +93 -0
  110. scitex/fig/editor/flask_editor/static/css/components/dropdown.css +57 -0
  111. scitex/fig/editor/flask_editor/static/css/components/forms.css +112 -0
  112. scitex/fig/editor/flask_editor/static/css/components/modal.css +59 -0
  113. scitex/fig/editor/flask_editor/static/css/components/sections.css +212 -0
  114. scitex/fig/editor/flask_editor/static/css/features/canvas.css +176 -0
  115. scitex/fig/editor/flask_editor/static/css/features/element-inspector.css +190 -0
  116. scitex/fig/editor/flask_editor/static/css/features/loading.css +59 -0
  117. scitex/fig/editor/flask_editor/static/css/features/overlay.css +45 -0
  118. scitex/fig/editor/flask_editor/static/css/features/panel-grid.css +95 -0
  119. scitex/fig/editor/flask_editor/static/css/features/selection.css +101 -0
  120. scitex/fig/editor/flask_editor/static/css/features/statistics.css +138 -0
  121. scitex/fig/editor/flask_editor/static/css/index.css +31 -0
  122. scitex/fig/editor/flask_editor/static/css/layout/container.css +7 -0
  123. scitex/fig/editor/flask_editor/static/css/layout/controls.css +56 -0
  124. scitex/fig/editor/flask_editor/static/css/layout/preview.css +78 -0
  125. scitex/fig/editor/flask_editor/static/js/alignment/axis.js +314 -0
  126. scitex/fig/editor/flask_editor/static/js/alignment/basic.js +107 -0
  127. scitex/fig/editor/flask_editor/static/js/alignment/distribute.js +54 -0
  128. scitex/fig/editor/flask_editor/static/js/canvas/canvas.js +172 -0
  129. scitex/fig/editor/flask_editor/static/js/canvas/dragging.js +258 -0
  130. scitex/fig/editor/flask_editor/static/js/canvas/resize.js +48 -0
  131. scitex/fig/editor/flask_editor/static/js/canvas/selection.js +71 -0
  132. scitex/fig/editor/flask_editor/static/js/core/api.js +288 -0
  133. scitex/fig/editor/flask_editor/static/js/core/state.js +143 -0
  134. scitex/fig/editor/flask_editor/static/js/core/utils.js +245 -0
  135. scitex/fig/editor/flask_editor/static/js/dev/element-inspector.js +992 -0
  136. scitex/fig/editor/flask_editor/static/js/editor/bbox.js +339 -0
  137. scitex/fig/editor/flask_editor/static/js/editor/element-drag.js +286 -0
  138. scitex/fig/editor/flask_editor/static/js/editor/overlay.js +371 -0
  139. scitex/fig/editor/flask_editor/static/js/editor/preview.js +293 -0
  140. scitex/fig/editor/flask_editor/static/js/main.js +426 -0
  141. scitex/fig/editor/flask_editor/static/js/shortcuts/context-menu.js +152 -0
  142. scitex/fig/editor/flask_editor/static/js/shortcuts/keyboard.js +265 -0
  143. scitex/fig/editor/flask_editor/static/js/ui/controls.js +184 -0
  144. scitex/fig/editor/flask_editor/static/js/ui/download.js +57 -0
  145. scitex/fig/editor/flask_editor/static/js/ui/help.js +100 -0
  146. scitex/fig/editor/flask_editor/static/js/ui/theme.js +34 -0
  147. scitex/fig/editor/flask_editor/templates/__init__.py +123 -0
  148. scitex/fig/editor/flask_editor/templates/_html.py +852 -0
  149. scitex/fig/editor/flask_editor/templates/_scripts.py +4933 -0
  150. scitex/fig/editor/flask_editor/templates/_styles.py +1658 -0
  151. scitex/{vis → fig}/io/__init__.py +13 -1
  152. scitex/fig/io/_bundle.py +1058 -0
  153. scitex/{vis → fig}/io/_canvas.py +1 -1
  154. scitex/{vis → fig}/io/_data.py +1 -1
  155. scitex/{vis → fig}/io/_export.py +1 -1
  156. scitex/{vis → fig}/io/_load.py +1 -1
  157. scitex/{vis → fig}/io/_panel.py +1 -1
  158. scitex/{vis → fig}/io/_save.py +1 -1
  159. scitex/{vis → fig}/model/__init__.py +1 -1
  160. scitex/{vis → fig}/model/_annotations.py +1 -1
  161. scitex/{vis → fig}/model/_axes.py +1 -1
  162. scitex/{vis → fig}/model/_figure.py +1 -1
  163. scitex/{vis → fig}/model/_guides.py +1 -1
  164. scitex/{vis → fig}/model/_plot.py +1 -1
  165. scitex/{vis → fig}/model/_styles.py +1 -1
  166. scitex/{vis → fig}/utils/__init__.py +1 -1
  167. scitex/io/__init__.py +22 -26
  168. scitex/io/_bundle.py +493 -0
  169. scitex/io/_flush.py +5 -2
  170. scitex/io/_load.py +98 -0
  171. scitex/io/_load_modules/_H5Explorer.py +5 -2
  172. scitex/io/_load_modules/_canvas.py +2 -2
  173. scitex/io/_load_modules/_image.py +3 -4
  174. scitex/io/_load_modules/_txt.py +4 -2
  175. scitex/io/_metadata.py +34 -324
  176. scitex/io/_metadata_modules/__init__.py +46 -0
  177. scitex/io/_metadata_modules/_embed.py +70 -0
  178. scitex/io/_metadata_modules/_read.py +64 -0
  179. scitex/io/_metadata_modules/_utils.py +79 -0
  180. scitex/io/_metadata_modules/embed_metadata_jpeg.py +74 -0
  181. scitex/io/_metadata_modules/embed_metadata_pdf.py +53 -0
  182. scitex/io/_metadata_modules/embed_metadata_png.py +26 -0
  183. scitex/io/_metadata_modules/embed_metadata_svg.py +62 -0
  184. scitex/io/_metadata_modules/read_metadata_jpeg.py +57 -0
  185. scitex/io/_metadata_modules/read_metadata_pdf.py +51 -0
  186. scitex/io/_metadata_modules/read_metadata_png.py +39 -0
  187. scitex/io/_metadata_modules/read_metadata_svg.py +44 -0
  188. scitex/io/_qr_utils.py +5 -3
  189. scitex/io/_save.py +548 -30
  190. scitex/io/_save_modules/_canvas.py +3 -3
  191. scitex/io/_save_modules/_image.py +5 -9
  192. scitex/io/_save_modules/_tex.py +7 -4
  193. scitex/io/_zip_bundle.py +439 -0
  194. scitex/io/utils/h5_to_zarr.py +11 -9
  195. scitex/msword/__init__.py +255 -0
  196. scitex/msword/profiles.py +357 -0
  197. scitex/msword/reader.py +753 -0
  198. scitex/msword/utils.py +289 -0
  199. scitex/msword/writer.py +362 -0
  200. scitex/plt/__init__.py +5 -2
  201. scitex/plt/_subplots/_AxesWrapper.py +6 -6
  202. scitex/plt/_subplots/_AxisWrapper.py +15 -9
  203. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/__init__.py +36 -0
  204. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_labels.py +264 -0
  205. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_metadata.py +213 -0
  206. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_visual.py +128 -0
  207. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +59 -0
  208. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_base.py +34 -0
  209. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_scientific.py +593 -0
  210. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_statistical.py +654 -0
  211. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_stx_aliases.py +527 -0
  212. scitex/plt/_subplots/_AxisWrapperMixins/_RawMatplotlibMixin.py +321 -0
  213. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/__init__.py +33 -0
  214. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_base.py +152 -0
  215. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +600 -0
  216. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +79 -5
  217. scitex/plt/_subplots/_FigWrapper.py +6 -6
  218. scitex/plt/_subplots/_SubplotsWrapper.py +28 -18
  219. scitex/plt/_subplots/_export_as_csv.py +35 -5
  220. scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +8 -0
  221. scitex/plt/_subplots/_export_as_csv_formatters/_format_annotate.py +10 -21
  222. scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +18 -7
  223. scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +28 -12
  224. scitex/plt/_subplots/_export_as_csv_formatters/_format_matshow.py +10 -4
  225. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_imshow.py +13 -1
  226. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +12 -2
  227. scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter.py +10 -3
  228. scitex/plt/_subplots/_export_as_csv_formatters/_format_quiver.py +10 -4
  229. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +18 -3
  230. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +44 -36
  231. scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +14 -2
  232. scitex/plt/_subplots/_export_as_csv_formatters/_format_streamplot.py +11 -5
  233. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_bar.py +84 -0
  234. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_barh.py +85 -0
  235. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_conf_mat.py +14 -3
  236. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_contour.py +54 -0
  237. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_ecdf.py +14 -2
  238. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_errorbar.py +120 -0
  239. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_heatmap.py +16 -6
  240. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_image.py +29 -19
  241. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_imshow.py +63 -0
  242. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_joyplot.py +22 -5
  243. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_ci.py +18 -14
  244. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_std.py +18 -14
  245. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_median_iqr.py +18 -14
  246. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_raster.py +10 -2
  247. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter.py +51 -0
  248. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter_hist.py +18 -9
  249. scitex/plt/ax/_plot/_stx_ecdf.py +4 -2
  250. scitex/plt/gallery/_generate.py +421 -14
  251. scitex/plt/io/__init__.py +53 -0
  252. scitex/plt/io/_bundle.py +490 -0
  253. scitex/plt/io/_layered_bundle.py +1343 -0
  254. scitex/plt/styles/SCITEX_STYLE.yaml +26 -0
  255. scitex/plt/styles/__init__.py +14 -0
  256. scitex/plt/styles/presets.py +78 -0
  257. scitex/plt/utils/__init__.py +13 -1
  258. scitex/plt/utils/_collect_figure_metadata.py +10 -14
  259. scitex/plt/utils/_configure_mpl.py +6 -18
  260. scitex/plt/utils/_crop.py +32 -14
  261. scitex/plt/utils/_csv_column_naming.py +54 -0
  262. scitex/plt/utils/_figure_mm.py +116 -1
  263. scitex/plt/utils/_hitmap.py +1643 -0
  264. scitex/plt/utils/metadata/__init__.py +25 -0
  265. scitex/plt/utils/metadata/_core.py +9 -10
  266. scitex/plt/utils/metadata/_dimensions.py +6 -3
  267. scitex/plt/utils/metadata/_editable_export.py +405 -0
  268. scitex/plt/utils/metadata/_geometry_extraction.py +570 -0
  269. scitex/schema/__init__.py +109 -16
  270. scitex/schema/_canvas.py +1 -1
  271. scitex/schema/_plot.py +1015 -0
  272. scitex/schema/_stats.py +2 -2
  273. scitex/stats/__init__.py +117 -0
  274. scitex/stats/io/__init__.py +29 -0
  275. scitex/stats/io/_bundle.py +156 -0
  276. scitex/tex/__init__.py +4 -0
  277. scitex/tex/_export.py +890 -0
  278. {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/METADATA +11 -1
  279. {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/RECORD +294 -170
  280. scitex/io/memo.md +0 -2827
  281. scitex/plt/REQUESTS.md +0 -191
  282. scitex/plt/_subplots/TODO.md +0 -53
  283. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +0 -559
  284. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +0 -1609
  285. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +0 -447
  286. scitex/plt/templates/research-master/scitex/vis/gallery/area/fill_between.json +0 -110
  287. scitex/plt/templates/research-master/scitex/vis/gallery/area/fill_betweenx.json +0 -88
  288. scitex/plt/templates/research-master/scitex/vis/gallery/area/stx_fill_between.json +0 -103
  289. scitex/plt/templates/research-master/scitex/vis/gallery/area/stx_fillv.json +0 -106
  290. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/bar.json +0 -92
  291. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/barh.json +0 -92
  292. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/boxplot.json +0 -92
  293. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_bar.json +0 -84
  294. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_barh.json +0 -84
  295. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_box.json +0 -83
  296. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_boxplot.json +0 -93
  297. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_violin.json +0 -91
  298. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_violinplot.json +0 -91
  299. scitex/plt/templates/research-master/scitex/vis/gallery/categorical/violinplot.json +0 -91
  300. scitex/plt/templates/research-master/scitex/vis/gallery/contour/contour.json +0 -97
  301. scitex/plt/templates/research-master/scitex/vis/gallery/contour/contourf.json +0 -98
  302. scitex/plt/templates/research-master/scitex/vis/gallery/contour/stx_contour.json +0 -84
  303. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/hist.json +0 -101
  304. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/hist2d.json +0 -96
  305. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_ecdf.json +0 -95
  306. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_joyplot.json +0 -95
  307. scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_kde.json +0 -93
  308. scitex/plt/templates/research-master/scitex/vis/gallery/grid/imshow.json +0 -95
  309. scitex/plt/templates/research-master/scitex/vis/gallery/grid/matshow.json +0 -95
  310. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_conf_mat.json +0 -83
  311. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_heatmap.json +0 -92
  312. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_image.json +0 -121
  313. scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_imshow.json +0 -84
  314. scitex/plt/templates/research-master/scitex/vis/gallery/line/plot.json +0 -110
  315. scitex/plt/templates/research-master/scitex/vis/gallery/line/step.json +0 -92
  316. scitex/plt/templates/research-master/scitex/vis/gallery/line/stx_line.json +0 -95
  317. scitex/plt/templates/research-master/scitex/vis/gallery/line/stx_shaded_line.json +0 -96
  318. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/hexbin.json +0 -95
  319. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/scatter.json +0 -95
  320. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/stem.json +0 -92
  321. scitex/plt/templates/research-master/scitex/vis/gallery/scatter/stx_scatter.json +0 -84
  322. scitex/plt/templates/research-master/scitex/vis/gallery/special/pie.json +0 -94
  323. scitex/plt/templates/research-master/scitex/vis/gallery/special/stx_raster.json +0 -109
  324. scitex/plt/templates/research-master/scitex/vis/gallery/special/stx_rectangle.json +0 -108
  325. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/errorbar.json +0 -93
  326. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_errorbar.json +0 -84
  327. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_mean_ci.json +0 -96
  328. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_mean_std.json +0 -96
  329. scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_median_iqr.json +0 -96
  330. scitex/plt/templates/research-master/scitex/vis/gallery/vector/quiver.json +0 -99
  331. scitex/plt/templates/research-master/scitex/vis/gallery/vector/streamplot.json +0 -100
  332. scitex/vis/__init__.py +0 -177
  333. scitex/vis/editor/_edit.py +0 -390
  334. scitex/vis/editor/flask_editor/_bbox.py +0 -529
  335. scitex/vis/editor/flask_editor/_core.py +0 -168
  336. scitex/vis/editor/flask_editor/_renderer.py +0 -393
  337. scitex/vis/editor/flask_editor/templates/__init__.py +0 -33
  338. scitex/vis/editor/flask_editor/templates/_html.py +0 -513
  339. scitex/vis/editor/flask_editor/templates/_scripts.py +0 -1261
  340. scitex/vis/editor/flask_editor/templates/_styles.py +0 -739
  341. /scitex/{vis → fig}/README.md +0 -0
  342. /scitex/{vis → fig}/backend/__init__.py +0 -0
  343. /scitex/{vis → fig}/backend/_export.py +0 -0
  344. /scitex/{vis → fig}/backend/_render.py +0 -0
  345. /scitex/{vis → fig}/docs/CANVAS_ARCHITECTURE.md +0 -0
  346. /scitex/{vis → fig}/editor/_flask_editor.py +0 -0
  347. /scitex/{vis → fig}/editor/flask_editor/__init__.py +0 -0
  348. /scitex/{vis → fig}/editor/flask_editor/_utils.py +0 -0
  349. /scitex/{vis → fig}/io/_directory.py +0 -0
  350. /scitex/{vis → fig}/model/_plot_types.py +0 -0
  351. /scitex/{vis → fig}/utils/_defaults.py +0 -0
  352. /scitex/{vis → fig}/utils/_validate.py +0 -0
  353. {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/WHEEL +0 -0
  354. {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/entry_points.txt +0 -0
  355. {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,182 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: 2025-12-15
4
+ # Author: ywatanabe / Claude
5
+ # File: scitex/diagram/_schema.py
6
+
7
+ """
8
+ Schema definitions for SciTeX Diagram.
9
+
10
+ The schema defines paper-specific constraints that Mermaid/Graphviz don't know:
11
+ - Paper layout (single/double column, max width)
12
+ - Reading direction preferences
13
+ - Node emphasis for scientific communication
14
+ - Semantic layer grouping
15
+ """
16
+
17
+ from dataclasses import dataclass, field
18
+ from enum import Enum
19
+ from typing import List, Dict, Optional, Literal
20
+
21
+
22
+ class DiagramType(Enum):
23
+ """Semantic type of diagram - affects layout strategy."""
24
+ WORKFLOW = "workflow" # Sequential process, prefer LR/TB flow
25
+ DECISION = "decision" # Decision tree, prefer TB with branches
26
+ PIPELINE = "pipeline" # Data pipeline, strict LR with stages
27
+ HIERARCHY = "hierarchy" # Tree structure, TB with levels
28
+ COMPARISON = "comparison" # Side-by-side, two columns
29
+
30
+
31
+ class ColumnLayout(Enum):
32
+ """Paper column layout."""
33
+ SINGLE = "single" # Full width (~170mm)
34
+ DOUBLE = "double" # Half width (~85mm)
35
+
36
+
37
+ class SpacingLevel(Enum):
38
+ """Abstract spacing levels - mapped to backend-specific values."""
39
+ TIGHT = "tight" # Publication: minimal whitespace
40
+ COMPACT = "compact"
41
+ MEDIUM = "medium"
42
+ LARGE = "large"
43
+
44
+
45
+ class PaperMode(Enum):
46
+ """Paper mode affects layout density and edge visibility."""
47
+ DRAFT = "draft" # Full arrows, visible bidirectional, medium spacing
48
+ PUBLICATION = "publication" # Compact, return edges hidden/dotted
49
+
50
+
51
+ @dataclass
52
+ class PaperConstraints:
53
+ """Paper-specific constraints that affect layout."""
54
+ column: ColumnLayout = ColumnLayout.SINGLE
55
+ max_width_mm: int = 170
56
+ reading_direction: Literal["left_to_right", "top_to_bottom"] = "left_to_right"
57
+ mode: PaperMode = PaperMode.DRAFT # draft: full details, publication: compact
58
+ emphasize: List[str] = field(default_factory=list) # Node IDs to highlight
59
+
60
+ # Scientific communication hints
61
+ main_flow: List[str] = field(default_factory=list) # Critical path nodes
62
+ secondary_flow: List[str] = field(default_factory=list) # Supporting elements
63
+ return_edges: List[tuple] = field(default_factory=list) # Edges to hide in publication
64
+
65
+
66
+ @dataclass
67
+ class LayoutHints:
68
+ """Abstract layout hints - compiled to backend directives."""
69
+ layers: List[List[str]] = field(default_factory=list) # Nodes grouped by rank
70
+ alignment: Dict[str, str] = field(default_factory=dict) # Node alignment hints
71
+ layer_gap: SpacingLevel = SpacingLevel.MEDIUM
72
+ node_gap: SpacingLevel = SpacingLevel.MEDIUM
73
+
74
+ # Subgraph organization
75
+ groups: Dict[str, List[str]] = field(default_factory=dict) # Named groups
76
+
77
+
78
+ @dataclass
79
+ class NodeSpec:
80
+ """Specification for a single node."""
81
+ id: str
82
+ label: str
83
+ shape: Literal["box", "rounded", "diamond", "circle", "stadium"] = "box"
84
+ emphasis: Literal["normal", "primary", "success", "warning", "muted"] = "normal"
85
+
86
+ def short_label(self, max_chars: int = 20) -> str:
87
+ """Return truncated label for compact layouts."""
88
+ if len(self.label) <= max_chars:
89
+ return self.label
90
+ return self.label[:max_chars-3] + "..."
91
+
92
+
93
+ @dataclass
94
+ class EdgeSpec:
95
+ """Specification for an edge between nodes."""
96
+ source: str
97
+ target: str
98
+ label: Optional[str] = None
99
+ style: Literal["solid", "dashed", "dotted"] = "solid"
100
+ arrow: Literal["normal", "none", "open"] = "normal"
101
+
102
+
103
+ @dataclass
104
+ class DiagramSpec:
105
+ """Complete diagram specification - the semantic layer."""
106
+
107
+ # Metadata
108
+ type: DiagramType = DiagramType.WORKFLOW
109
+ title: str = ""
110
+
111
+ # Paper constraints
112
+ paper: PaperConstraints = field(default_factory=PaperConstraints)
113
+
114
+ # Layout hints
115
+ layout: LayoutHints = field(default_factory=LayoutHints)
116
+
117
+ # Content
118
+ nodes: List[NodeSpec] = field(default_factory=list)
119
+ edges: List[EdgeSpec] = field(default_factory=list)
120
+
121
+ # Theme
122
+ theme: Dict[str, str] = field(default_factory=dict)
123
+
124
+ @classmethod
125
+ def from_dict(cls, data: dict) -> "DiagramSpec":
126
+ """Create DiagramSpec from dictionary (parsed YAML)."""
127
+ spec = cls()
128
+
129
+ # Parse type
130
+ if "type" in data:
131
+ spec.type = DiagramType(data["type"])
132
+
133
+ spec.title = data.get("title", "")
134
+
135
+ # Parse paper constraints
136
+ if "paper" in data:
137
+ p = data["paper"]
138
+ spec.paper = PaperConstraints(
139
+ column=ColumnLayout(p.get("column", "single")),
140
+ max_width_mm=p.get("max_width_mm", 170),
141
+ reading_direction=p.get("reading_direction", "left_to_right"),
142
+ mode=PaperMode(p.get("mode", "draft")),
143
+ emphasize=p.get("emphasize", []),
144
+ main_flow=p.get("main_flow", []),
145
+ secondary_flow=p.get("secondary_flow", []),
146
+ return_edges=[tuple(e) for e in p.get("return_edges", [])],
147
+ )
148
+
149
+ # Parse layout hints
150
+ if "layout" in data:
151
+ lt = data["layout"]
152
+ spec.layout = LayoutHints(
153
+ layers=lt.get("layers", []),
154
+ alignment=lt.get("alignment", {}),
155
+ layer_gap=SpacingLevel(lt.get("layer_gap", "medium")),
156
+ node_gap=SpacingLevel(lt.get("node_gap", "medium")),
157
+ groups=lt.get("groups", {}),
158
+ )
159
+
160
+ # Parse nodes
161
+ for n in data.get("nodes", []):
162
+ spec.nodes.append(NodeSpec(
163
+ id=n["id"],
164
+ label=n.get("label", n["id"]),
165
+ shape=n.get("shape", "box"),
166
+ emphasis=n.get("emphasis", "normal"),
167
+ ))
168
+
169
+ # Parse edges
170
+ for e in data.get("edges", []):
171
+ spec.edges.append(EdgeSpec(
172
+ source=e["from"] if "from" in e else e["source"],
173
+ target=e["to"] if "to" in e else e["target"],
174
+ label=e.get("label"),
175
+ style=e.get("style", "solid"),
176
+ arrow=e.get("arrow", "normal"),
177
+ ))
178
+
179
+ # Theme
180
+ spec.theme = data.get("theme", {})
181
+
182
+ return spec
@@ -0,0 +1,278 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: 2025-12-15
4
+ # Author: ywatanabe / Claude
5
+ # File: scitex/diagram/_split.py
6
+
7
+ """
8
+ Auto-split large diagrams into multiple figures.
9
+
10
+ Strategies:
11
+ - by_groups: Split by existing layout.groups (deterministic, paper-friendly)
12
+ - by_articulation: Split at hub nodes (graph-theoretic)
13
+
14
+ The split preserves "ghost nodes" at boundaries for visual continuity.
15
+ """
16
+
17
+ from dataclasses import dataclass, field
18
+ from typing import List, Dict, Set, Optional, Tuple
19
+ from copy import deepcopy
20
+ from enum import Enum
21
+
22
+ from scitex.diagram._schema import DiagramSpec, NodeSpec, EdgeSpec
23
+
24
+
25
+ class SplitStrategy(Enum):
26
+ BY_GROUPS = "by_groups" # Split by layout.groups
27
+ BY_ARTICULATION = "by_articulation" # Split at hub nodes
28
+
29
+
30
+ @dataclass
31
+ class SplitConfig:
32
+ """Configuration for auto-splitting."""
33
+ enabled: bool = False
34
+ max_nodes: int = 12 # Split if more nodes than this
35
+ strategy: SplitStrategy = SplitStrategy.BY_GROUPS
36
+ keep_hubs: bool = True # Show hub nodes in both parts
37
+ ghost_style: str = "muted" # Style for ghost nodes
38
+
39
+
40
+ @dataclass
41
+ class SplitResult:
42
+ """Result of splitting a diagram."""
43
+ figures: List[DiagramSpec]
44
+ labels: List[str] # Figure labels (A, B, C, ...)
45
+ cut_nodes: Set[str] # Nodes that appear in multiple figures
46
+
47
+
48
+ def split_diagram(
49
+ spec: DiagramSpec,
50
+ config: Optional[SplitConfig] = None,
51
+ group_assignments: Optional[List[List[str]]] = None,
52
+ ) -> SplitResult:
53
+ """
54
+ Split a diagram into multiple figures.
55
+
56
+ Parameters
57
+ ----------
58
+ spec : DiagramSpec
59
+ Original diagram specification.
60
+ config : SplitConfig, optional
61
+ Split configuration.
62
+ group_assignments : List[List[str]], optional
63
+ Manual group assignments for splitting.
64
+ If provided, overrides automatic detection.
65
+
66
+ Returns
67
+ -------
68
+ SplitResult
69
+ List of split diagram specifications.
70
+ """
71
+ if config is None:
72
+ config = SplitConfig(enabled=True)
73
+
74
+ # Check if split is needed
75
+ if not config.enabled or len(spec.nodes) <= config.max_nodes:
76
+ return SplitResult(figures=[spec], labels=[""], cut_nodes=set())
77
+
78
+ # Determine groups to split by
79
+ if group_assignments:
80
+ groups = group_assignments
81
+ elif config.strategy == SplitStrategy.BY_GROUPS:
82
+ groups = _split_by_groups(spec, max_nodes=config.max_nodes)
83
+ else: # BY_ARTICULATION
84
+ groups = _split_by_articulation(spec)
85
+
86
+ # Create split figures
87
+ figures = []
88
+ labels = []
89
+ cut_nodes = set()
90
+
91
+ for i, group_nodes in enumerate(groups):
92
+ fig, cuts = _create_split_figure(spec, group_nodes, config)
93
+ figures.append(fig)
94
+ labels.append(chr(ord('A') + i))
95
+ cut_nodes.update(cuts)
96
+
97
+ return SplitResult(figures=figures, labels=labels, cut_nodes=cut_nodes)
98
+
99
+
100
+ def _split_by_groups(spec: DiagramSpec, max_nodes: int = 12) -> List[List[str]]:
101
+ """
102
+ Split by existing layout.groups using greedy packing.
103
+
104
+ Packs groups into figures until max_nodes is exceeded,
105
+ then starts a new figure.
106
+
107
+ Returns list of node ID lists, one per split figure.
108
+ """
109
+ if not spec.layout.groups:
110
+ # No groups defined - try to split in half
111
+ node_ids = [n.id for n in spec.nodes]
112
+ mid = len(node_ids) // 2
113
+ return [node_ids[:mid], node_ids[mid:]]
114
+
115
+ # Group keys in order
116
+ group_names = list(spec.layout.groups.keys())
117
+
118
+ # Greedy packing: add groups until max_nodes exceeded
119
+ figures = []
120
+ current_figure = []
121
+ current_count = 0
122
+
123
+ for group_name in group_names:
124
+ group_nodes = spec.layout.groups[group_name]
125
+ group_size = len(group_nodes)
126
+
127
+ # If adding this group exceeds max and we have something, start new figure
128
+ if current_count + group_size > max_nodes and current_figure:
129
+ figures.append(current_figure)
130
+ current_figure = []
131
+ current_count = 0
132
+
133
+ # Add group to current figure
134
+ current_figure.extend(group_nodes)
135
+ current_count += group_size
136
+
137
+ # Don't forget the last figure
138
+ if current_figure:
139
+ figures.append(current_figure)
140
+
141
+ # Add ungrouped nodes to first figure
142
+ grouped = set()
143
+ for fig in figures:
144
+ grouped.update(fig)
145
+ for n in spec.nodes:
146
+ if n.id not in grouped:
147
+ if figures:
148
+ figures[0].append(n.id)
149
+ else:
150
+ figures.append([n.id])
151
+
152
+ # Ensure at least 2 figures if we have enough nodes
153
+ if len(figures) == 1 and len(figures[0]) > max_nodes:
154
+ # Force split in half
155
+ nodes = figures[0]
156
+ mid = len(nodes) // 2
157
+ figures = [nodes[:mid], nodes[mid:]]
158
+
159
+ return figures
160
+
161
+
162
+ def _split_by_articulation(spec: DiagramSpec) -> List[List[str]]:
163
+ """
164
+ Split at articulation points (hub nodes).
165
+
166
+ This finds nodes that, if removed, would disconnect the graph.
167
+ These are natural split points for large diagrams.
168
+ """
169
+ # Build adjacency
170
+ adj: Dict[str, Set[str]] = {n.id: set() for n in spec.nodes}
171
+ for e in spec.edges:
172
+ adj[e.source].add(e.target)
173
+ adj[e.target].add(e.source)
174
+
175
+ # Find node with most connections (hub)
176
+ hub = max(adj.keys(), key=lambda x: len(adj[x]))
177
+
178
+ # BFS from first node, stopping at hub
179
+ visited = {hub} # Block the hub
180
+ node_ids = [n.id for n in spec.nodes if n.id != hub]
181
+
182
+ if not node_ids:
183
+ return [[hub]]
184
+
185
+ # Find components when hub is removed
186
+ components = []
187
+ for start in node_ids:
188
+ if start in visited:
189
+ continue
190
+ component = []
191
+ queue = [start]
192
+ while queue:
193
+ curr = queue.pop(0)
194
+ if curr in visited:
195
+ continue
196
+ visited.add(curr)
197
+ component.append(curr)
198
+ for neighbor in adj[curr]:
199
+ if neighbor not in visited:
200
+ queue.append(neighbor)
201
+ if component:
202
+ components.append(component)
203
+
204
+ # Add hub to each component (as ghost)
205
+ for comp in components:
206
+ comp.append(hub)
207
+
208
+ return components if components else [[n.id for n in spec.nodes]]
209
+
210
+
211
+ def _create_split_figure(
212
+ spec: DiagramSpec,
213
+ node_ids: List[str],
214
+ config: SplitConfig,
215
+ ) -> Tuple[DiagramSpec, Set[str]]:
216
+ """
217
+ Create a split figure containing specified nodes.
218
+
219
+ Returns (figure_spec, ghost_node_ids).
220
+ """
221
+ node_id_set = set(node_ids)
222
+
223
+ # Find edges that cross the boundary
224
+ boundary_nodes = set()
225
+ for edge in spec.edges:
226
+ src_in = edge.source in node_id_set
227
+ tgt_in = edge.target in node_id_set
228
+ if src_in and not tgt_in:
229
+ if config.keep_hubs:
230
+ boundary_nodes.add(edge.target)
231
+ elif tgt_in and not src_in:
232
+ if config.keep_hubs:
233
+ boundary_nodes.add(edge.source)
234
+
235
+ # Create new spec
236
+ new_spec = DiagramSpec(
237
+ type=spec.type,
238
+ title=spec.title,
239
+ paper=deepcopy(spec.paper),
240
+ layout=deepcopy(spec.layout),
241
+ theme=dict(spec.theme),
242
+ )
243
+
244
+ # Filter nodes
245
+ node_map = {n.id: n for n in spec.nodes}
246
+ for node_id in node_ids:
247
+ if node_id in node_map:
248
+ new_spec.nodes.append(deepcopy(node_map[node_id]))
249
+
250
+ # Add ghost nodes (boundary nodes not in this split)
251
+ for ghost_id in boundary_nodes:
252
+ if ghost_id in node_map and ghost_id not in node_id_set:
253
+ ghost = deepcopy(node_map[ghost_id])
254
+ ghost.emphasis = config.ghost_style
255
+ ghost.label = f"→ {ghost.label}" # Mark as continuation
256
+ new_spec.nodes.append(ghost)
257
+
258
+ # Filter edges
259
+ all_ids = node_id_set | boundary_nodes
260
+ for edge in spec.edges:
261
+ if edge.source in all_ids and edge.target in all_ids:
262
+ new_spec.edges.append(deepcopy(edge))
263
+
264
+ # Filter groups
265
+ new_spec.layout.groups = {}
266
+ for group_name, group_nodes in spec.layout.groups.items():
267
+ filtered = [n for n in group_nodes if n in all_ids]
268
+ if filtered:
269
+ new_spec.layout.groups[group_name] = filtered
270
+
271
+ # Filter layers
272
+ new_spec.layout.layers = []
273
+ for layer in spec.layout.layers:
274
+ filtered = [n for n in layer if n in all_ids]
275
+ if filtered:
276
+ new_spec.layout.layers.append(filtered)
277
+
278
+ return new_spec, boundary_nodes