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,355 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: 2025-12-15
4
+ # Author: ywatanabe / Claude
5
+ # File: scitex/diagram/_diagram.py
6
+
7
+ """
8
+ Main Diagram class - the user-facing API.
9
+ """
10
+
11
+ from pathlib import Path
12
+ from typing import Optional, Union, List
13
+ import yaml
14
+ import re
15
+
16
+ from scitex.diagram._schema import DiagramSpec, DiagramType, NodeSpec, EdgeSpec, PaperMode
17
+ from scitex.diagram._compile import compile_to_mermaid, compile_to_graphviz
18
+ from scitex.diagram._presets import get_preset
19
+ from scitex.diagram._split import split_diagram, SplitConfig, SplitStrategy, SplitResult
20
+
21
+
22
+ class Diagram:
23
+ """
24
+ Paper-optimized diagram with semantic specification.
25
+
26
+ This class provides the main interface for creating diagrams
27
+ that compile to Mermaid or Graphviz with paper-appropriate
28
+ layout constraints.
29
+
30
+ Examples
31
+ --------
32
+ >>> # From YAML spec
33
+ >>> d = Diagram.from_yaml("workflow.diagram.yaml")
34
+ >>> d.to_mermaid("workflow.mmd")
35
+
36
+ >>> # From existing Mermaid (parse and enhance)
37
+ >>> d = Diagram.from_mermaid("existing.mmd", diagram_type="workflow")
38
+ >>> d.spec.paper.column = "double"
39
+ >>> d.to_mermaid("enhanced.mmd")
40
+
41
+ >>> # Programmatic creation
42
+ >>> d = Diagram(type="pipeline")
43
+ >>> d.add_node("input", "Raw Data")
44
+ >>> d.add_node("process", "Transform", emphasis="primary")
45
+ >>> d.add_node("output", "Results")
46
+ >>> d.add_edge("input", "process")
47
+ >>> d.add_edge("process", "output")
48
+ >>> print(d.to_mermaid())
49
+ """
50
+
51
+ def __init__(
52
+ self,
53
+ type: str = "workflow",
54
+ title: str = "",
55
+ column: str = "single",
56
+ ):
57
+ """
58
+ Initialize a new diagram.
59
+
60
+ Parameters
61
+ ----------
62
+ type : str
63
+ Diagram type: workflow, decision, pipeline, hierarchy.
64
+ title : str
65
+ Diagram title.
66
+ column : str
67
+ Paper column: single or double.
68
+ """
69
+ self.spec = DiagramSpec(
70
+ type=DiagramType(type),
71
+ title=title,
72
+ )
73
+ self.spec.paper.column = column
74
+
75
+ @classmethod
76
+ def from_yaml(cls, path: Union[str, Path]) -> "Diagram":
77
+ """
78
+ Load diagram from YAML specification file.
79
+
80
+ Parameters
81
+ ----------
82
+ path : str or Path
83
+ Path to YAML file.
84
+
85
+ Returns
86
+ -------
87
+ Diagram
88
+ Loaded diagram.
89
+ """
90
+ path = Path(path)
91
+ with open(path, "r", encoding="utf-8") as f:
92
+ data = yaml.safe_load(f)
93
+
94
+ diagram = cls.__new__(cls)
95
+ diagram.spec = DiagramSpec.from_dict(data)
96
+ return diagram
97
+
98
+ @classmethod
99
+ def from_mermaid(
100
+ cls,
101
+ path: Union[str, Path],
102
+ diagram_type: str = "workflow",
103
+ ) -> "Diagram":
104
+ """
105
+ Parse existing Mermaid file and create enhanced Diagram.
106
+
107
+ This allows upgrading existing Mermaid files with SciTeX
108
+ paper constraints while preserving the original structure.
109
+
110
+ Parameters
111
+ ----------
112
+ path : str or Path
113
+ Path to .mmd file.
114
+ diagram_type : str
115
+ Inferred diagram type.
116
+
117
+ Returns
118
+ -------
119
+ Diagram
120
+ Parsed diagram (can be enhanced and re-exported).
121
+ """
122
+ path = Path(path)
123
+ with open(path, "r", encoding="utf-8") as f:
124
+ content = f.read()
125
+
126
+ diagram = cls(type=diagram_type)
127
+ diagram._parse_mermaid(content)
128
+ return diagram
129
+
130
+ def _parse_mermaid(self, content: str):
131
+ """Parse Mermaid content to extract structure."""
132
+ # Extract nodes
133
+ # Pattern: ID["Label"] or ID("Label") etc.
134
+ node_pattern = r'(\w+)\s*[\[\(\{<][\"\']?([^"\'\]\)\}>]+)[\"\']?[\]\)\}>]'
135
+
136
+ for match in re.finditer(node_pattern, content):
137
+ node_id = match.group(1)
138
+ label = match.group(2).strip()
139
+ # Skip if it looks like a subgraph name
140
+ if node_id.lower() not in ["subgraph", "end", "style", "graph", "direction"]:
141
+ # Check for duplicates
142
+ existing = [n for n in self.spec.nodes if n.id == node_id]
143
+ if not existing:
144
+ self.spec.nodes.append(NodeSpec(id=node_id, label=label))
145
+
146
+ # Extract edges
147
+ # Pattern: A --> B or A -->|label| B
148
+ edge_pattern = r'(\w+)\s*(-->|-.->|-----|---)\s*(?:\|["\']?([^|"\']+)["\']?\|)?\s*(\w+)'
149
+
150
+ for match in re.finditer(edge_pattern, content):
151
+ source = match.group(1)
152
+ arrow = match.group(2)
153
+ label = match.group(3)
154
+ target = match.group(4)
155
+
156
+ style = "solid"
157
+ if "-.->" in arrow or "-.." in arrow:
158
+ style = "dashed"
159
+
160
+ self.spec.edges.append(EdgeSpec(
161
+ source=source,
162
+ target=target,
163
+ label=label.strip() if label else None,
164
+ style=style,
165
+ ))
166
+
167
+ # Extract subgraphs as groups
168
+ subgraph_pattern = r'subgraph\s+(\w+)\s*\[?"?([^"\]]*)"?\]?'
169
+ for match in re.finditer(subgraph_pattern, content):
170
+ group_id = match.group(1)
171
+ group_name = match.group(2) or group_id
172
+ self.spec.layout.groups[group_name] = []
173
+
174
+ def add_node(
175
+ self,
176
+ id: str,
177
+ label: str,
178
+ shape: str = "box",
179
+ emphasis: str = "normal",
180
+ ):
181
+ """Add a node to the diagram."""
182
+ self.spec.nodes.append(NodeSpec(
183
+ id=id,
184
+ label=label,
185
+ shape=shape,
186
+ emphasis=emphasis,
187
+ ))
188
+
189
+ def add_edge(
190
+ self,
191
+ source: str,
192
+ target: str,
193
+ label: Optional[str] = None,
194
+ style: str = "solid",
195
+ ):
196
+ """Add an edge between nodes."""
197
+ self.spec.edges.append(EdgeSpec(
198
+ source=source,
199
+ target=target,
200
+ label=label,
201
+ style=style,
202
+ ))
203
+
204
+ def set_group(self, group_name: str, node_ids: list):
205
+ """Define a group of nodes (rendered as subgraph)."""
206
+ self.spec.layout.groups[group_name] = node_ids
207
+
208
+ def emphasize(self, *node_ids: str):
209
+ """Mark nodes as emphasized (primary styling)."""
210
+ self.spec.paper.emphasize.extend(node_ids)
211
+
212
+ def to_mermaid(self, path: Optional[Union[str, Path]] = None) -> str:
213
+ """
214
+ Compile to Mermaid format.
215
+
216
+ Parameters
217
+ ----------
218
+ path : str or Path, optional
219
+ If provided, write to file.
220
+
221
+ Returns
222
+ -------
223
+ str
224
+ Mermaid source code.
225
+ """
226
+ result = compile_to_mermaid(self.spec)
227
+
228
+ if path:
229
+ path = Path(path)
230
+ with open(path, "w", encoding="utf-8") as f:
231
+ f.write(result)
232
+
233
+ return result
234
+
235
+ def to_graphviz(self, path: Optional[Union[str, Path]] = None) -> str:
236
+ """
237
+ Compile to Graphviz DOT format.
238
+
239
+ Parameters
240
+ ----------
241
+ path : str or Path, optional
242
+ If provided, write to file.
243
+
244
+ Returns
245
+ -------
246
+ str
247
+ Graphviz DOT source code.
248
+ """
249
+ result = compile_to_graphviz(self.spec)
250
+
251
+ if path:
252
+ path = Path(path)
253
+ with open(path, "w", encoding="utf-8") as f:
254
+ f.write(result)
255
+
256
+ return result
257
+
258
+ def to_yaml(self, path: Optional[Union[str, Path]] = None) -> str:
259
+ """
260
+ Export specification as YAML.
261
+
262
+ Parameters
263
+ ----------
264
+ path : str or Path, optional
265
+ If provided, write to file.
266
+
267
+ Returns
268
+ -------
269
+ str
270
+ YAML specification.
271
+ """
272
+ data = {
273
+ "type": self.spec.type.value,
274
+ "title": self.spec.title,
275
+ "paper": {
276
+ "column": self.spec.paper.column.value if hasattr(self.spec.paper.column, 'value') else self.spec.paper.column,
277
+ "max_width_mm": self.spec.paper.max_width_mm,
278
+ "reading_direction": self.spec.paper.reading_direction,
279
+ "mode": self.spec.paper.mode.value if hasattr(self.spec.paper.mode, 'value') else self.spec.paper.mode,
280
+ "emphasize": self.spec.paper.emphasize,
281
+ },
282
+ "layout": {
283
+ "groups": self.spec.layout.groups,
284
+ "layers": self.spec.layout.layers,
285
+ "layer_gap": self.spec.layout.layer_gap.value,
286
+ "node_gap": self.spec.layout.node_gap.value,
287
+ },
288
+ "nodes": [
289
+ {"id": n.id, "label": n.label, "shape": n.shape, "emphasis": n.emphasis}
290
+ for n in self.spec.nodes
291
+ ],
292
+ "edges": [
293
+ {"from": e.source, "to": e.target, "label": e.label, "style": e.style}
294
+ for e in self.spec.edges
295
+ ],
296
+ }
297
+
298
+ result = yaml.dump(data, default_flow_style=False, allow_unicode=True)
299
+
300
+ if path:
301
+ path = Path(path)
302
+ with open(path, "w", encoding="utf-8") as f:
303
+ f.write(result)
304
+
305
+ return result
306
+
307
+ def split(
308
+ self,
309
+ max_nodes: int = 12,
310
+ strategy: str = "by_groups",
311
+ keep_hubs: bool = True,
312
+ ) -> List["Diagram"]:
313
+ """
314
+ Split diagram into multiple figures if too large.
315
+
316
+ Parameters
317
+ ----------
318
+ max_nodes : int
319
+ Maximum nodes per figure before splitting.
320
+ strategy : str
321
+ Split strategy: "by_groups" or "by_articulation".
322
+ keep_hubs : bool
323
+ Show hub nodes as ghosts in both parts.
324
+
325
+ Returns
326
+ -------
327
+ List[Diagram]
328
+ List of split diagrams (or single diagram if no split needed).
329
+
330
+ Examples
331
+ --------
332
+ >>> d = Diagram.from_yaml("large_workflow.yaml")
333
+ >>> parts = d.split(max_nodes=8)
334
+ >>> for i, part in enumerate(parts):
335
+ ... part.to_mermaid(f"workflow_part_{i+1}.mmd")
336
+ """
337
+ config = SplitConfig(
338
+ enabled=True,
339
+ max_nodes=max_nodes,
340
+ strategy=SplitStrategy(strategy),
341
+ keep_hubs=keep_hubs,
342
+ )
343
+
344
+ result = split_diagram(self.spec, config)
345
+
346
+ # Wrap each spec in a Diagram object
347
+ diagrams = []
348
+ for fig_spec, label in zip(result.figures, result.labels):
349
+ d = Diagram.__new__(Diagram)
350
+ d.spec = fig_spec
351
+ if label:
352
+ d.spec.title = f"{self.spec.title} ({label})" if self.spec.title else f"Part {label}"
353
+ diagrams.append(d)
354
+
355
+ return diagrams
@@ -0,0 +1,173 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: 2025-12-15
4
+ # Author: ywatanabe / Claude
5
+ # File: scitex/diagram/_presets.py
6
+
7
+ """
8
+ Presets for common diagram types in scientific papers.
9
+
10
+ Each preset defines rules for compiling the semantic spec to backend formats.
11
+ These encode domain knowledge about "what makes a good paper figure."
12
+ """
13
+
14
+ from dataclasses import dataclass
15
+ from typing import Dict, Any, List
16
+
17
+
18
+ @dataclass
19
+ class DiagramPreset:
20
+ """Rules for compiling a diagram type."""
21
+
22
+ # Mermaid settings
23
+ mermaid_direction: str # TB, LR, RL, BT
24
+ mermaid_theme: Dict[str, str]
25
+
26
+ # Graphviz settings
27
+ graphviz_rankdir: str # TB, LR, RL, BT
28
+ graphviz_ranksep: float
29
+ graphviz_nodesep: float
30
+
31
+ # Spacing mappings
32
+ spacing_map: Dict[str, Dict[str, float]]
33
+
34
+ # Shape mappings (semantic -> backend)
35
+ mermaid_shapes: Dict[str, str]
36
+ graphviz_shapes: Dict[str, str]
37
+
38
+ # Emphasis styles (colors, borders)
39
+ emphasis_styles: Dict[str, Dict[str, str]]
40
+
41
+
42
+ # Workflow preset: sequential processes, emphasize flow
43
+ WORKFLOW_PRESET = DiagramPreset(
44
+ mermaid_direction="LR", # Left-to-right for workflows
45
+ mermaid_theme={
46
+ "primaryColor": "#1a2634",
47
+ "primaryTextColor": "#e0e0e0",
48
+ "primaryBorderColor": "#3a4a5a",
49
+ "lineColor": "#5a9fcf",
50
+ },
51
+ graphviz_rankdir="LR",
52
+ graphviz_ranksep=0.8,
53
+ graphviz_nodesep=0.5,
54
+ spacing_map={
55
+ "tight": {"ranksep": 0.3, "nodesep": 0.2}, # Publication: minimal
56
+ "compact": {"ranksep": 0.4, "nodesep": 0.3},
57
+ "medium": {"ranksep": 0.8, "nodesep": 0.5},
58
+ "large": {"ranksep": 1.2, "nodesep": 0.8},
59
+ },
60
+ mermaid_shapes={
61
+ "box": '["__LABEL__"]',
62
+ "rounded": '("__LABEL__")',
63
+ "diamond": '{"__LABEL__"}',
64
+ "circle": '(("__LABEL__"))',
65
+ "stadium": '(["__LABEL__"])',
66
+ },
67
+ graphviz_shapes={
68
+ "box": "box",
69
+ "rounded": "box", # with style=rounded
70
+ "diamond": "diamond",
71
+ "circle": "circle",
72
+ "stadium": "box", # with style=rounded
73
+ },
74
+ emphasis_styles={
75
+ "primary": {"fill": "#0d4a6b", "stroke": "#5a9fcf", "stroke-width": "2px"},
76
+ "success": {"fill": "#ccffcc", "stroke": "#00cc00"},
77
+ "warning": {"fill": "#ffcccc", "stroke": "#cc0000"},
78
+ "muted": {"fill": "#f0f0f0", "stroke": "#999999"},
79
+ "normal": {"fill": "#1a2634", "stroke": "#3a4a5a"},
80
+ },
81
+ )
82
+
83
+ # Decision tree preset: top-to-bottom with branches
84
+ DECISION_PRESET = DiagramPreset(
85
+ mermaid_direction="TB",
86
+ mermaid_theme={
87
+ "primaryColor": "#f5f5f5",
88
+ "primaryTextColor": "#333333",
89
+ "primaryBorderColor": "#666666",
90
+ "lineColor": "#666666",
91
+ },
92
+ graphviz_rankdir="TB",
93
+ graphviz_ranksep=1.0,
94
+ graphviz_nodesep=0.6,
95
+ spacing_map={
96
+ "compact": {"ranksep": 0.6, "nodesep": 0.4},
97
+ "medium": {"ranksep": 1.0, "nodesep": 0.6},
98
+ "large": {"ranksep": 1.5, "nodesep": 1.0},
99
+ },
100
+ mermaid_shapes={
101
+ "box": '["__LABEL__"]',
102
+ "rounded": '("__LABEL__")',
103
+ "diamond": '{"__LABEL__"}',
104
+ "circle": '(("__LABEL__"))',
105
+ "stadium": '(["__LABEL__"])',
106
+ },
107
+ graphviz_shapes={
108
+ "box": "box",
109
+ "rounded": "box",
110
+ "diamond": "diamond",
111
+ "circle": "circle",
112
+ "stadium": "box",
113
+ },
114
+ emphasis_styles={
115
+ "primary": {"fill": "#e6f3ff", "stroke": "#0066cc", "stroke-width": "2px"},
116
+ "success": {"fill": "#e6ffe6", "stroke": "#00aa00"},
117
+ "warning": {"fill": "#ffe6e6", "stroke": "#cc0000"},
118
+ "muted": {"fill": "#f0f0f0", "stroke": "#aaaaaa"},
119
+ "normal": {"fill": "#ffffff", "stroke": "#666666"},
120
+ },
121
+ )
122
+
123
+ # Pipeline preset: strict horizontal stages
124
+ PIPELINE_PRESET = DiagramPreset(
125
+ mermaid_direction="LR",
126
+ mermaid_theme={
127
+ "primaryColor": "#ffffff",
128
+ "primaryTextColor": "#333333",
129
+ "primaryBorderColor": "#0066cc",
130
+ "lineColor": "#0066cc",
131
+ },
132
+ graphviz_rankdir="LR",
133
+ graphviz_ranksep=1.2,
134
+ graphviz_nodesep=0.4,
135
+ spacing_map={
136
+ "compact": {"ranksep": 0.8, "nodesep": 0.3},
137
+ "medium": {"ranksep": 1.2, "nodesep": 0.4},
138
+ "large": {"ranksep": 1.8, "nodesep": 0.6},
139
+ },
140
+ mermaid_shapes={
141
+ "box": '["__LABEL__"]',
142
+ "rounded": '("__LABEL__")',
143
+ "diamond": '{"__LABEL__"}',
144
+ "circle": '(("__LABEL__"))',
145
+ "stadium": '(["__LABEL__"])',
146
+ },
147
+ graphviz_shapes={
148
+ "box": "box",
149
+ "rounded": "box",
150
+ "diamond": "diamond",
151
+ "circle": "circle",
152
+ "stadium": "box",
153
+ },
154
+ emphasis_styles={
155
+ "primary": {"fill": "#e6f0ff", "stroke": "#0044aa", "stroke-width": "2px"},
156
+ "success": {"fill": "#e6ffe6", "stroke": "#00aa00"},
157
+ "warning": {"fill": "#fff3e6", "stroke": "#ff8800"},
158
+ "muted": {"fill": "#f5f5f5", "stroke": "#cccccc"},
159
+ "normal": {"fill": "#ffffff", "stroke": "#0066cc"},
160
+ },
161
+ )
162
+
163
+
164
+ def get_preset(diagram_type: str) -> DiagramPreset:
165
+ """Get preset for diagram type."""
166
+ presets = {
167
+ "workflow": WORKFLOW_PRESET,
168
+ "decision": DECISION_PRESET,
169
+ "pipeline": PIPELINE_PRESET,
170
+ "hierarchy": DECISION_PRESET, # Same as decision for now
171
+ "comparison": WORKFLOW_PRESET, # Override direction in compiler
172
+ }
173
+ return presets.get(diagram_type.lower(), WORKFLOW_PRESET)