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.
- scitex/__init__.py +6 -2
- scitex/__version__.py +1 -1
- scitex/audio/README.md +52 -0
- scitex/audio/__init__.py +384 -0
- scitex/audio/__main__.py +129 -0
- scitex/audio/_tts.py +334 -0
- scitex/audio/engines/__init__.py +44 -0
- scitex/audio/engines/base.py +275 -0
- scitex/audio/engines/elevenlabs_engine.py +143 -0
- scitex/audio/engines/gtts_engine.py +162 -0
- scitex/audio/engines/pyttsx3_engine.py +131 -0
- scitex/audio/mcp_server.py +757 -0
- scitex/bridge/_helpers.py +1 -1
- scitex/bridge/_plt_vis.py +1 -1
- scitex/bridge/_stats_vis.py +1 -1
- scitex/dev/plt/__init__.py +272 -0
- scitex/dev/plt/plot_mpl_axhline.py +28 -0
- scitex/dev/plt/plot_mpl_axhspan.py +28 -0
- scitex/dev/plt/plot_mpl_axvline.py +28 -0
- scitex/dev/plt/plot_mpl_axvspan.py +28 -0
- scitex/dev/plt/plot_mpl_bar.py +29 -0
- scitex/dev/plt/plot_mpl_barh.py +29 -0
- scitex/dev/plt/plot_mpl_boxplot.py +28 -0
- scitex/dev/plt/plot_mpl_contour.py +31 -0
- scitex/dev/plt/plot_mpl_contourf.py +31 -0
- scitex/dev/plt/plot_mpl_errorbar.py +30 -0
- scitex/dev/plt/plot_mpl_eventplot.py +28 -0
- scitex/dev/plt/plot_mpl_fill.py +30 -0
- scitex/dev/plt/plot_mpl_fill_between.py +31 -0
- scitex/dev/plt/plot_mpl_hexbin.py +28 -0
- scitex/dev/plt/plot_mpl_hist.py +28 -0
- scitex/dev/plt/plot_mpl_hist2d.py +28 -0
- scitex/dev/plt/plot_mpl_imshow.py +29 -0
- scitex/dev/plt/plot_mpl_pcolormesh.py +31 -0
- scitex/dev/plt/plot_mpl_pie.py +29 -0
- scitex/dev/plt/plot_mpl_plot.py +29 -0
- scitex/dev/plt/plot_mpl_quiver.py +31 -0
- scitex/dev/plt/plot_mpl_scatter.py +28 -0
- scitex/dev/plt/plot_mpl_stackplot.py +31 -0
- scitex/dev/plt/plot_mpl_stem.py +29 -0
- scitex/dev/plt/plot_mpl_step.py +29 -0
- scitex/dev/plt/plot_mpl_violinplot.py +28 -0
- scitex/dev/plt/plot_sns_barplot.py +29 -0
- scitex/dev/plt/plot_sns_boxplot.py +29 -0
- scitex/dev/plt/plot_sns_heatmap.py +28 -0
- scitex/dev/plt/plot_sns_histplot.py +29 -0
- scitex/dev/plt/plot_sns_kdeplot.py +29 -0
- scitex/dev/plt/plot_sns_lineplot.py +31 -0
- scitex/dev/plt/plot_sns_scatterplot.py +29 -0
- scitex/dev/plt/plot_sns_stripplot.py +29 -0
- scitex/dev/plt/plot_sns_swarmplot.py +29 -0
- scitex/dev/plt/plot_sns_violinplot.py +29 -0
- scitex/dev/plt/plot_stx_bar.py +29 -0
- scitex/dev/plt/plot_stx_barh.py +29 -0
- scitex/dev/plt/plot_stx_box.py +28 -0
- scitex/dev/plt/plot_stx_boxplot.py +28 -0
- scitex/dev/plt/plot_stx_conf_mat.py +28 -0
- scitex/dev/plt/plot_stx_contour.py +31 -0
- scitex/dev/plt/plot_stx_ecdf.py +28 -0
- scitex/dev/plt/plot_stx_errorbar.py +30 -0
- scitex/dev/plt/plot_stx_fill_between.py +31 -0
- scitex/dev/plt/plot_stx_fillv.py +28 -0
- scitex/dev/plt/plot_stx_heatmap.py +28 -0
- scitex/dev/plt/plot_stx_image.py +28 -0
- scitex/dev/plt/plot_stx_imshow.py +28 -0
- scitex/dev/plt/plot_stx_joyplot.py +28 -0
- scitex/dev/plt/plot_stx_kde.py +28 -0
- scitex/dev/plt/plot_stx_line.py +28 -0
- scitex/dev/plt/plot_stx_mean_ci.py +28 -0
- scitex/dev/plt/plot_stx_mean_std.py +28 -0
- scitex/dev/plt/plot_stx_median_iqr.py +28 -0
- scitex/dev/plt/plot_stx_raster.py +28 -0
- scitex/dev/plt/plot_stx_rectangle.py +28 -0
- scitex/dev/plt/plot_stx_scatter.py +29 -0
- scitex/dev/plt/plot_stx_shaded_line.py +29 -0
- scitex/dev/plt/plot_stx_violin.py +28 -0
- scitex/dev/plt/plot_stx_violinplot.py +28 -0
- scitex/diagram/README.md +197 -0
- scitex/diagram/__init__.py +48 -0
- scitex/diagram/_compile.py +312 -0
- scitex/diagram/_diagram.py +355 -0
- scitex/diagram/_presets.py +173 -0
- scitex/diagram/_schema.py +182 -0
- scitex/diagram/_split.py +278 -0
- scitex/fig/__init__.py +352 -0
- scitex/{vis → fig}/backend/_parser.py +1 -1
- scitex/{vis → fig}/canvas.py +1 -1
- scitex/{vis → fig}/editor/__init__.py +5 -2
- scitex/{vis → fig}/editor/_dearpygui_editor.py +1 -1
- scitex/{vis → fig}/editor/_defaults.py +70 -5
- scitex/{vis → fig}/editor/_mpl_editor.py +1 -1
- scitex/{vis → fig}/editor/_qt_editor.py +182 -2
- scitex/{vis → fig}/editor/_tkinter_editor.py +1 -1
- scitex/fig/editor/edit/__init__.py +50 -0
- scitex/fig/editor/edit/backend_detector.py +109 -0
- scitex/fig/editor/edit/bundle_resolver.py +240 -0
- scitex/fig/editor/edit/editor_launcher.py +239 -0
- scitex/fig/editor/edit/manual_handler.py +53 -0
- scitex/fig/editor/edit/panel_loader.py +232 -0
- scitex/fig/editor/edit/path_resolver.py +67 -0
- scitex/fig/editor/flask_editor/_bbox.py +1299 -0
- scitex/fig/editor/flask_editor/_core.py +1429 -0
- scitex/{vis → fig}/editor/flask_editor/_plotter.py +38 -4
- scitex/fig/editor/flask_editor/_renderer.py +813 -0
- scitex/fig/editor/flask_editor/static/css/base/reset.css +41 -0
- scitex/fig/editor/flask_editor/static/css/base/typography.css +16 -0
- scitex/fig/editor/flask_editor/static/css/base/variables.css +85 -0
- scitex/fig/editor/flask_editor/static/css/components/buttons.css +217 -0
- scitex/fig/editor/flask_editor/static/css/components/context-menu.css +93 -0
- scitex/fig/editor/flask_editor/static/css/components/dropdown.css +57 -0
- scitex/fig/editor/flask_editor/static/css/components/forms.css +112 -0
- scitex/fig/editor/flask_editor/static/css/components/modal.css +59 -0
- scitex/fig/editor/flask_editor/static/css/components/sections.css +212 -0
- scitex/fig/editor/flask_editor/static/css/features/canvas.css +176 -0
- scitex/fig/editor/flask_editor/static/css/features/element-inspector.css +190 -0
- scitex/fig/editor/flask_editor/static/css/features/loading.css +59 -0
- scitex/fig/editor/flask_editor/static/css/features/overlay.css +45 -0
- scitex/fig/editor/flask_editor/static/css/features/panel-grid.css +95 -0
- scitex/fig/editor/flask_editor/static/css/features/selection.css +101 -0
- scitex/fig/editor/flask_editor/static/css/features/statistics.css +138 -0
- scitex/fig/editor/flask_editor/static/css/index.css +31 -0
- scitex/fig/editor/flask_editor/static/css/layout/container.css +7 -0
- scitex/fig/editor/flask_editor/static/css/layout/controls.css +56 -0
- scitex/fig/editor/flask_editor/static/css/layout/preview.css +78 -0
- scitex/fig/editor/flask_editor/static/js/alignment/axis.js +314 -0
- scitex/fig/editor/flask_editor/static/js/alignment/basic.js +107 -0
- scitex/fig/editor/flask_editor/static/js/alignment/distribute.js +54 -0
- scitex/fig/editor/flask_editor/static/js/canvas/canvas.js +172 -0
- scitex/fig/editor/flask_editor/static/js/canvas/dragging.js +258 -0
- scitex/fig/editor/flask_editor/static/js/canvas/resize.js +48 -0
- scitex/fig/editor/flask_editor/static/js/canvas/selection.js +71 -0
- scitex/fig/editor/flask_editor/static/js/core/api.js +288 -0
- scitex/fig/editor/flask_editor/static/js/core/state.js +143 -0
- scitex/fig/editor/flask_editor/static/js/core/utils.js +245 -0
- scitex/fig/editor/flask_editor/static/js/dev/element-inspector.js +992 -0
- scitex/fig/editor/flask_editor/static/js/editor/bbox.js +339 -0
- scitex/fig/editor/flask_editor/static/js/editor/element-drag.js +286 -0
- scitex/fig/editor/flask_editor/static/js/editor/overlay.js +371 -0
- scitex/fig/editor/flask_editor/static/js/editor/preview.js +293 -0
- scitex/fig/editor/flask_editor/static/js/main.js +426 -0
- scitex/fig/editor/flask_editor/static/js/shortcuts/context-menu.js +152 -0
- scitex/fig/editor/flask_editor/static/js/shortcuts/keyboard.js +265 -0
- scitex/fig/editor/flask_editor/static/js/ui/controls.js +184 -0
- scitex/fig/editor/flask_editor/static/js/ui/download.js +57 -0
- scitex/fig/editor/flask_editor/static/js/ui/help.js +100 -0
- scitex/fig/editor/flask_editor/static/js/ui/theme.js +34 -0
- scitex/fig/editor/flask_editor/templates/__init__.py +123 -0
- scitex/fig/editor/flask_editor/templates/_html.py +852 -0
- scitex/fig/editor/flask_editor/templates/_scripts.py +4933 -0
- scitex/fig/editor/flask_editor/templates/_styles.py +1658 -0
- scitex/{vis → fig}/io/__init__.py +13 -1
- scitex/fig/io/_bundle.py +1058 -0
- scitex/{vis → fig}/io/_canvas.py +1 -1
- scitex/{vis → fig}/io/_data.py +1 -1
- scitex/{vis → fig}/io/_export.py +1 -1
- scitex/{vis → fig}/io/_load.py +1 -1
- scitex/{vis → fig}/io/_panel.py +1 -1
- scitex/{vis → fig}/io/_save.py +1 -1
- scitex/{vis → fig}/model/__init__.py +1 -1
- scitex/{vis → fig}/model/_annotations.py +1 -1
- scitex/{vis → fig}/model/_axes.py +1 -1
- scitex/{vis → fig}/model/_figure.py +1 -1
- scitex/{vis → fig}/model/_guides.py +1 -1
- scitex/{vis → fig}/model/_plot.py +1 -1
- scitex/{vis → fig}/model/_styles.py +1 -1
- scitex/{vis → fig}/utils/__init__.py +1 -1
- scitex/io/__init__.py +22 -26
- scitex/io/_bundle.py +493 -0
- scitex/io/_flush.py +5 -2
- scitex/io/_load.py +98 -0
- scitex/io/_load_modules/_H5Explorer.py +5 -2
- scitex/io/_load_modules/_canvas.py +2 -2
- scitex/io/_load_modules/_image.py +3 -4
- scitex/io/_load_modules/_txt.py +4 -2
- scitex/io/_metadata.py +34 -324
- scitex/io/_metadata_modules/__init__.py +46 -0
- scitex/io/_metadata_modules/_embed.py +70 -0
- scitex/io/_metadata_modules/_read.py +64 -0
- scitex/io/_metadata_modules/_utils.py +79 -0
- scitex/io/_metadata_modules/embed_metadata_jpeg.py +74 -0
- scitex/io/_metadata_modules/embed_metadata_pdf.py +53 -0
- scitex/io/_metadata_modules/embed_metadata_png.py +26 -0
- scitex/io/_metadata_modules/embed_metadata_svg.py +62 -0
- scitex/io/_metadata_modules/read_metadata_jpeg.py +57 -0
- scitex/io/_metadata_modules/read_metadata_pdf.py +51 -0
- scitex/io/_metadata_modules/read_metadata_png.py +39 -0
- scitex/io/_metadata_modules/read_metadata_svg.py +44 -0
- scitex/io/_qr_utils.py +5 -3
- scitex/io/_save.py +548 -30
- scitex/io/_save_modules/_canvas.py +3 -3
- scitex/io/_save_modules/_image.py +5 -9
- scitex/io/_save_modules/_tex.py +7 -4
- scitex/io/_zip_bundle.py +439 -0
- scitex/io/utils/h5_to_zarr.py +11 -9
- scitex/msword/__init__.py +255 -0
- scitex/msword/profiles.py +357 -0
- scitex/msword/reader.py +753 -0
- scitex/msword/utils.py +289 -0
- scitex/msword/writer.py +362 -0
- scitex/plt/__init__.py +5 -2
- scitex/plt/_subplots/_AxesWrapper.py +6 -6
- scitex/plt/_subplots/_AxisWrapper.py +15 -9
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/__init__.py +36 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_labels.py +264 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_metadata.py +213 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_visual.py +128 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +59 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_base.py +34 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_scientific.py +593 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_statistical.py +654 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_stx_aliases.py +527 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_RawMatplotlibMixin.py +321 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/__init__.py +33 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_base.py +152 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +600 -0
- scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +79 -5
- scitex/plt/_subplots/_FigWrapper.py +6 -6
- scitex/plt/_subplots/_SubplotsWrapper.py +28 -18
- scitex/plt/_subplots/_export_as_csv.py +35 -5
- scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +8 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_annotate.py +10 -21
- scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +18 -7
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +28 -12
- scitex/plt/_subplots/_export_as_csv_formatters/_format_matshow.py +10 -4
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_imshow.py +13 -1
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +12 -2
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter.py +10 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_quiver.py +10 -4
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +18 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +44 -36
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +14 -2
- scitex/plt/_subplots/_export_as_csv_formatters/_format_streamplot.py +11 -5
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_bar.py +84 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_barh.py +85 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_conf_mat.py +14 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_contour.py +54 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_ecdf.py +14 -2
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_errorbar.py +120 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_heatmap.py +16 -6
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_image.py +29 -19
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_imshow.py +63 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_joyplot.py +22 -5
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_ci.py +18 -14
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_mean_std.py +18 -14
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_median_iqr.py +18 -14
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_raster.py +10 -2
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter.py +51 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter_hist.py +18 -9
- scitex/plt/ax/_plot/_stx_ecdf.py +4 -2
- scitex/plt/gallery/_generate.py +421 -14
- scitex/plt/io/__init__.py +53 -0
- scitex/plt/io/_bundle.py +490 -0
- scitex/plt/io/_layered_bundle.py +1343 -0
- scitex/plt/styles/SCITEX_STYLE.yaml +26 -0
- scitex/plt/styles/__init__.py +14 -0
- scitex/plt/styles/presets.py +78 -0
- scitex/plt/utils/__init__.py +13 -1
- scitex/plt/utils/_collect_figure_metadata.py +10 -14
- scitex/plt/utils/_configure_mpl.py +6 -18
- scitex/plt/utils/_crop.py +32 -14
- scitex/plt/utils/_csv_column_naming.py +54 -0
- scitex/plt/utils/_figure_mm.py +116 -1
- scitex/plt/utils/_hitmap.py +1643 -0
- scitex/plt/utils/metadata/__init__.py +25 -0
- scitex/plt/utils/metadata/_core.py +9 -10
- scitex/plt/utils/metadata/_dimensions.py +6 -3
- scitex/plt/utils/metadata/_editable_export.py +405 -0
- scitex/plt/utils/metadata/_geometry_extraction.py +570 -0
- scitex/schema/__init__.py +109 -16
- scitex/schema/_canvas.py +1 -1
- scitex/schema/_plot.py +1015 -0
- scitex/schema/_stats.py +2 -2
- scitex/stats/__init__.py +117 -0
- scitex/stats/io/__init__.py +29 -0
- scitex/stats/io/_bundle.py +156 -0
- scitex/tex/__init__.py +4 -0
- scitex/tex/_export.py +890 -0
- {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/METADATA +11 -1
- {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/RECORD +294 -170
- scitex/io/memo.md +0 -2827
- scitex/plt/REQUESTS.md +0 -191
- scitex/plt/_subplots/TODO.md +0 -53
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +0 -559
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +0 -1609
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +0 -447
- scitex/plt/templates/research-master/scitex/vis/gallery/area/fill_between.json +0 -110
- scitex/plt/templates/research-master/scitex/vis/gallery/area/fill_betweenx.json +0 -88
- scitex/plt/templates/research-master/scitex/vis/gallery/area/stx_fill_between.json +0 -103
- scitex/plt/templates/research-master/scitex/vis/gallery/area/stx_fillv.json +0 -106
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/bar.json +0 -92
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/barh.json +0 -92
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/boxplot.json +0 -92
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_bar.json +0 -84
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_barh.json +0 -84
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_box.json +0 -83
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_boxplot.json +0 -93
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_violin.json +0 -91
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/stx_violinplot.json +0 -91
- scitex/plt/templates/research-master/scitex/vis/gallery/categorical/violinplot.json +0 -91
- scitex/plt/templates/research-master/scitex/vis/gallery/contour/contour.json +0 -97
- scitex/plt/templates/research-master/scitex/vis/gallery/contour/contourf.json +0 -98
- scitex/plt/templates/research-master/scitex/vis/gallery/contour/stx_contour.json +0 -84
- scitex/plt/templates/research-master/scitex/vis/gallery/distribution/hist.json +0 -101
- scitex/plt/templates/research-master/scitex/vis/gallery/distribution/hist2d.json +0 -96
- scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_ecdf.json +0 -95
- scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_joyplot.json +0 -95
- scitex/plt/templates/research-master/scitex/vis/gallery/distribution/stx_kde.json +0 -93
- scitex/plt/templates/research-master/scitex/vis/gallery/grid/imshow.json +0 -95
- scitex/plt/templates/research-master/scitex/vis/gallery/grid/matshow.json +0 -95
- scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_conf_mat.json +0 -83
- scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_heatmap.json +0 -92
- scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_image.json +0 -121
- scitex/plt/templates/research-master/scitex/vis/gallery/grid/stx_imshow.json +0 -84
- scitex/plt/templates/research-master/scitex/vis/gallery/line/plot.json +0 -110
- scitex/plt/templates/research-master/scitex/vis/gallery/line/step.json +0 -92
- scitex/plt/templates/research-master/scitex/vis/gallery/line/stx_line.json +0 -95
- scitex/plt/templates/research-master/scitex/vis/gallery/line/stx_shaded_line.json +0 -96
- scitex/plt/templates/research-master/scitex/vis/gallery/scatter/hexbin.json +0 -95
- scitex/plt/templates/research-master/scitex/vis/gallery/scatter/scatter.json +0 -95
- scitex/plt/templates/research-master/scitex/vis/gallery/scatter/stem.json +0 -92
- scitex/plt/templates/research-master/scitex/vis/gallery/scatter/stx_scatter.json +0 -84
- scitex/plt/templates/research-master/scitex/vis/gallery/special/pie.json +0 -94
- scitex/plt/templates/research-master/scitex/vis/gallery/special/stx_raster.json +0 -109
- scitex/plt/templates/research-master/scitex/vis/gallery/special/stx_rectangle.json +0 -108
- scitex/plt/templates/research-master/scitex/vis/gallery/statistical/errorbar.json +0 -93
- scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_errorbar.json +0 -84
- scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_mean_ci.json +0 -96
- scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_mean_std.json +0 -96
- scitex/plt/templates/research-master/scitex/vis/gallery/statistical/stx_median_iqr.json +0 -96
- scitex/plt/templates/research-master/scitex/vis/gallery/vector/quiver.json +0 -99
- scitex/plt/templates/research-master/scitex/vis/gallery/vector/streamplot.json +0 -100
- scitex/vis/__init__.py +0 -177
- scitex/vis/editor/_edit.py +0 -390
- scitex/vis/editor/flask_editor/_bbox.py +0 -529
- scitex/vis/editor/flask_editor/_core.py +0 -168
- scitex/vis/editor/flask_editor/_renderer.py +0 -393
- scitex/vis/editor/flask_editor/templates/__init__.py +0 -33
- scitex/vis/editor/flask_editor/templates/_html.py +0 -513
- scitex/vis/editor/flask_editor/templates/_scripts.py +0 -1261
- scitex/vis/editor/flask_editor/templates/_styles.py +0 -739
- /scitex/{vis → fig}/README.md +0 -0
- /scitex/{vis → fig}/backend/__init__.py +0 -0
- /scitex/{vis → fig}/backend/_export.py +0 -0
- /scitex/{vis → fig}/backend/_render.py +0 -0
- /scitex/{vis → fig}/docs/CANVAS_ARCHITECTURE.md +0 -0
- /scitex/{vis → fig}/editor/_flask_editor.py +0 -0
- /scitex/{vis → fig}/editor/flask_editor/__init__.py +0 -0
- /scitex/{vis → fig}/editor/flask_editor/_utils.py +0 -0
- /scitex/{vis → fig}/io/_directory.py +0 -0
- /scitex/{vis → fig}/model/_plot_types.py +0 -0
- /scitex/{vis → fig}/utils/_defaults.py +0 -0
- /scitex/{vis → fig}/utils/_validate.py +0 -0
- {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/WHEEL +0 -0
- {scitex-2.7.0.dist-info → scitex-2.8.1.dist-info}/entry_points.txt +0 -0
- {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)
|