/* THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/main.ts var main_exports = {}; __export(main_exports, { default: () => MathematicaPlot }); module.exports = __toCommonJS(main_exports); // src/modal/menus/graph/helpers.ts var import_obsidian = require("obsidian"); var renderOptions = (optionsFields) => (el, settings, options) => { el.createEl("h5", { text: `Plot Options ${settings.raster.dim}` }); Object.entries(optionsFields).forEach( (entry, index) => new import_obsidian.Setting(index === 0 ? el : el.createDiv()).setName(entry[1].name).setDesc(entry[1].desc).addText( (component) => component.setValue(options[entry[0]] || "").onChange((value) => { options[entry[0]] = value; }) ) ); new import_obsidian.Setting(el.createDiv()).setName("Others").setDesc( "Add any other option for the plot following the mathematica syntax. For example: ClippingStyle -> Red, ScalingFunctions -> Reverse" ).addTextArea( (component) => component.setValue(options.others || "").onChange((value) => { options.others = value; }) ); }; var renderIntervalForm = (el, variable, interval, desc = { min: "", max: "" }) => { new import_obsidian.Setting(el.createDiv()).setName(`${variable} min`).setDesc(desc.min).addText( (component) => component.setValue(interval.min).onChange((value) => { interval.min = value; }) ); new import_obsidian.Setting(el.createDiv()).setName(`${variable} max`).setDesc(desc.max).addText( (component) => component.setValue(interval.max).onChange((value) => { interval.max = value; }) ); }; var defaultGraphType = () => ({ plot: { expression: "", plotRange: { x: { min: "", max: "" }, y: { min: "", max: "" } } }, parametricPlot: { components: [], type: "curve", domain: { u: { min: "", max: "" }, v: { min: "", max: "" } } }, regionPlot: { expression: "", domain: { x: { min: "", max: "" }, y: { min: "", max: "" }, z: { min: "", max: "" } } }, contourPlot: { expression: "", domain: { x: { min: "", max: "" }, y: { min: "", max: "" }, z: { min: "", max: "" } } }, vectorPlot: { components: [], domain: { x: { min: "", max: "" }, y: { min: "", max: "" }, z: { min: "", max: "" } } } }); var defaultGraph = (id, type) => ({ id, type, options: {}, ...defaultGraphType() }); var graphTypesOptions = { plot: "Plot", parametricPlot: "Parametric Plot", regionPlot: "Region Plot", contourPlot: "Contour Plot", vectorPlot: "Vector Plot" }; var graphTypeDescription = { plot: "Scalar functions", parametricPlot: "Curves or Surfaces given in parametric form", regionPlot: "Regions defined by inequalities", contourPlot: "Contour plot for level sets", vectorPlot: "Plot vectors from a vector field function" }; // src/main.ts var import_obsidian11 = require("obsidian"); // src/modal/menus/general.ts var import_obsidian2 = require("obsidian"); var generalSettings = { axes: { desc: "Whether to draw axes", name: "Axes" }, axesLabel: { desc: "", name: "Axes Label" }, plotLabel: { name: "Label", desc: "Overall label for the plot" }, frame: { desc: "Whether to put a frame around the plot", name: "Frame" }, frameLabel: { name: "Frame Label" }, boxed: { desc: "Whether to draw the bounding box for 3d graphics", name: "Boxed" } }; var renderGeneralSettings = (el, modal) => { const settings = modal.settings; el.createEl("h5", { text: "General settings" }); Object.entries(generalSettings).forEach( (setting, index) => { const fieldName = setting[0]; const value = setting[1]; const elToDisplay = index == 0 ? el : el.createDiv(); new import_obsidian2.Setting(elToDisplay).addText( (text) => text.setValue(settings.general[fieldName] || "").onChange( (value2) => settings.general[fieldName] = value2 ) ).setName(value.name).setDesc(value.desc || ""); } ); }; // src/utils/plot.ts var import_util = require("util"); var import_child_process = require("child_process"); // src/utils/parsers.ts var mathematicaOptionsParser = { plotLabels: (value) => `PlotLabels -> ${value}`, plotStyle: (value) => `PlotStyle -> ${value}`, filling: (value) => `Filling -> ${value}`, fillingStyle: (value) => `FillingStyle -> ${value}`, boxed: (value) => `Boxed -> ${value}`, boundaryStyle: (value) => `BoundaryStyle -> ${value}`, axes: (value) => `Axes -> ${value}`, axesLabel: (value) => `AxesLabel -> ${value}`, frame: (value) => `Frame -> ${value}`, frameLabel: (value) => `FrameLabel -> ${value}`, plotLegends: (value) => `PlotLegends -> ${value}`, plotLabel: (value) => `PlotLabel -> ${value}`, others: (value) => value }; var parseOptions = (options) => { const opts = Object.entries(options).filter((opt) => opt[1]).map( (opt) => mathematicaOptionsParser[opt[0]](opt[1]) ).join(); if (!opts) return ""; else return `,${opts}`; }; var mathematicaPlotParser2D = { parametricPlot: (parametricPlot, opts) => { const { components, domain: { u } } = parametricPlot; const options = parseOptions(opts); return `ParametricPlot[{${[ components[0], components[1] ].join()}}, {u, ${u.min}, ${u.max}} ${options}]`; }, plot: (plot, opts) => { const { expression, plotRange } = plot; const options = parseOptions(opts); return `Plot[${expression}, {x, ${plotRange.x.min}, ${plotRange.x.max}} ${options}]`; }, regionPlot: (regionPlot, opts) => { const { expression, domain: { x, y } } = regionPlot; const options = parseOptions(opts); return `RegionPlot[${expression}, {x, ${x.min}, ${x.max}}, {y, ${y.min}, ${y.max}} ${options}]`; }, contourPlot: (contourPlot, opts) => { const { expression, domain: { x, y } } = contourPlot; const options = parseOptions(opts); return `ContourPlot[${expression}, {x, ${x.min}, ${x.max}}, {y, ${y.min}, ${y.max}} ${options}]`; }, vectorPlot: (vectorPlot, opts) => { const { components, domain } = vectorPlot; const { x, y } = domain; const options = parseOptions(opts); return `VectorPlot[{${[components[0], components[1]].join()}}, {x, ${x.min}, ${x.max}}, {y, ${y.min}, ${y.max}} ${options}]`; } }; var mathematicaPlotParser3D = { parametricPlot: (parametricPlot, opts) => { const { components, domain: { u, v }, type } = parametricPlot; const options = parseOptions(opts); const base = (v2) => `ParametricPlot3D[{${components.join()}}, {u, ${u.min}, ${u.max}} ${v2} ${options}]`; if (type === "surface") return base(`, {v, ${v.min}, ${v.max}}`); return base(""); }, plot: (plot, opts) => { const { expression, plotRange } = plot; const options = parseOptions(opts); return `Plot3D[${expression}, {x, ${plotRange.x.min}, ${plotRange.x.max}}, {y, ${plotRange.y.min}, ${plotRange.y.max}} ${options}]`; }, regionPlot: (regionPlot, opts) => { const { expression, domain: { x, y, z } } = regionPlot; const options = parseOptions(opts); return `RegionPlot3D[${expression}, {x, ${x.min}, ${x.max}}, {y, ${y.min}, ${y.max}}, {z, ${z.min}, ${z.max}} ${options}]`; }, contourPlot: (contourPlot, opts) => { const { expression, domain: { x, y, z } } = contourPlot; const options = parseOptions(opts); return `ContourPlot3D[${expression}, {x, ${x.min}, ${x.max}}, {y, ${y.min}, ${y.max}}, {z, ${z.min}, ${z.max}} ${options}]`; }, vectorPlot: (vectorPlot, opts) => { const { components, domain } = vectorPlot; const { x, y, z } = domain; const options = parseOptions(opts); return `VectorPlot3D[{${components.join()}}, {x, ${x.min}, ${x.max}}, {y, ${y.min}, ${y.max}}, {z, ${z.min}, ${z.max}}${options}]`; } }; var rasterizeParser = (code, settings) => { var _a, _b, _c, _d; const generalOptions = parseOptions(settings.general); return `Rasterize[Show[${code} ${generalOptions}], ImageSize -> {${((_b = (_a = settings.raster) == null ? void 0 : _a.size) == null ? void 0 : _b.width) || 250}, ${((_d = (_c = settings.raster) == null ? void 0 : _c.size) == null ? void 0 : _d.height) || "Automatic"}}, Background -> ${settings.raster.background}, AspectRatio -> Automatic]`; }; var mathematicaParser2D = (settings) => { const parsedGraphs = settings.graphs.map( (graph) => mathematicaPlotParser2D[graph.type](graph[graph.type], graph.options) ); return rasterizeParser(parsedGraphs.join(), settings); }; var mathematicaParser3D = (settings) => { const parsedGraphs = settings.graphs.map( (graph) => mathematicaPlotParser3D[graph.type](graph[graph.type], graph.options) ); return rasterizeParser(parsedGraphs.join(), settings); }; // src/utils/plot.ts var import_obsidian3 = require("obsidian"); var isValidBase64 = (str) => { try { window.atob(str); return true; } catch (e) { return false; } }; var getBase64Plot = async (plot, { useCloud, wolframScriptPath }) => { try { const { stdout, stderr } = await (0, import_util.promisify)(import_child_process.exec)( `${wolframScriptPath ? '"' + wolframScriptPath + '"' : "wolframscript"} ${useCloud ? "--cloud" : ""} --code "ExportString[${plot}, {\\"Base64\\", \\"PNG\\"}]"` ); if (stderr) return { error: stderr, base64: "" }; if (!isValidBase64(stdout)) return { error: stdout, base64: "" }; return { error: "", base64: stdout }; } catch (err) { return { error: err, base64: "" }; } }; var parseCodeBlock = (code) => { try { const settings = (0, import_obsidian3.parseYaml)(code); let parsedCode = ""; if (settings.raster.dim == "2D") parsedCode = mathematicaParser2D(settings); if (settings.raster.dim == "3D") parsedCode = mathematicaParser3D(settings); return { code: parsedCode.replace(/\s/g, ""), error: "" }; } catch (err) { console.log(err); return { error: err.message, code: "" }; } }; var buildBase64URL = (base64, format) => `data:image/${format};base64,${base64}`; // src/graphRender.ts var renderGraph = async (el, source, { useCloud, wolframScriptPath }) => { el.empty(); el.textContent = "Loading..."; const { code, error: error1 } = parseCodeBlock(source); if (error1) return el.textContent = error1; const { base64, error: error2 } = await getBase64Plot(code, { useCloud, wolframScriptPath }); if (error2) return el.textContent = error2; el.empty(); const src = buildBase64URL(base64, "png"); const img = document.createElement("img"); img.src = src; el.appendChild(img); }; // src/modal/menus/graphPreview.ts var renderGraphPreview = async (el, { settings, plugin }) => { const content = el.createDiv(); const graphEl = el.createDiv(); content.createEl("h5", { text: "Graph preview" }); content.createEl("p", { text: "A preview of what your graph looks like" }); el.createEl("button", { text: "Render preview", attr: { style: "width: 100%;" } }).onClickEvent((e) => { e.preventDefault(); renderGraph(graphEl, JSON.stringify(settings), { ...plugin.settings }); }); }; // src/modal/menus/graph/settings2d.ts var import_obsidian4 = require("obsidian"); var renderPlotSettings = (el, graph) => { new import_obsidian4.Setting(el.createDiv()).setName("f(x) = ").setDesc("You can also provide a list of functions {f1, f2, ...}").addTextArea( (component) => component.setValue(graph.expression).onChange((value) => { graph.expression = value; }) ); renderIntervalForm(el, "x", graph.plotRange.x); }; var renderParametricPlotSettings = (el, graph) => { new import_obsidian4.Setting(el.createDiv()).setName("g1(u) = ").addTextArea( (component) => component.setValue(graph.components[0]).onChange((value) => { graph.components[0] = value; }) ); new import_obsidian4.Setting(el.createDiv()).setName("g2(u) = ").addTextArea( (component) => component.setValue(graph.components[1]).onChange((value) => { graph.components[1] = value; }) ); renderIntervalForm(el, "u", graph.domain.u); }; var renderRegionPlotSettings = (el, graph) => { new import_obsidian4.Setting(el.createDiv()).setName("expression (x,y)").setDesc("You can also provide a list of expressions {e1, e2, ...}").addTextArea( (component) => component.setValue(graph.expression).onChange((value) => { graph.expression = value; }) ); renderIntervalForm(el, "x", graph.domain.x); renderIntervalForm(el, "y", graph.domain.y); }; var renderContourPlotSettings = (el, graph) => { new import_obsidian4.Setting(el.createDiv()).setName("expression (x,y)").setDesc("You can also provide a list of expressions {e1, e2, ...}").addTextArea( (component) => component.setValue(graph.expression).onChange((value) => { graph.expression = value; }) ); renderIntervalForm(el, "x", graph.domain.x); renderIntervalForm(el, "y", graph.domain.y); }; var renderVectorPlotSettings = (el, graph) => { new import_obsidian4.Setting(el.createDiv()).setName("Vx(x,y) = ").addTextArea( (component) => component.setValue(graph.components[0]).onChange((value) => { graph.components[0] = value; }) ); new import_obsidian4.Setting(el.createDiv()).setName("Vy(x,y) = ").addTextArea( (component) => component.setValue(graph.components[1]).onChange((value) => { graph.components[1] = value; }) ); renderIntervalForm(el, "x", graph.domain.x); renderIntervalForm(el, "y", graph.domain.y); }; var optsFields2D = { plotLabels: { name: "Plot Labels", desc: "Labels to use for fields" }, plotLegends: { name: "Plot Legends", desc: "Legends for fields" }, plotStyle: { name: "Plot Style", desc: "Graphics directives to specify the style for each field" }, filling: { name: "Filling", desc: "Filling to insert under each field" }, fillingStyle: { name: "Filling Style", desc: "Style to use for filling " } }; var renders2D = { renderSettings: { plot: renderPlotSettings, parametricPlot: renderParametricPlotSettings, regionPlot: renderRegionPlotSettings, contourPlot: renderContourPlotSettings, vectorPlot: renderVectorPlotSettings }, renderOptions: renderOptions(optsFields2D) }; // src/modal/menus/graph/settings3d.ts var import_obsidian5 = require("obsidian"); var renderPlotSettings2 = (el, graph) => { new import_obsidian5.Setting(el.createDiv()).setName("f(x, y) = ").setDesc("You can also provide a list of functions {f1, f2, ...}").addTextArea( (component) => component.setValue(graph.expression).onChange((value) => { graph.expression = value; }) ); renderIntervalForm(el, "x", graph.plotRange.x); renderIntervalForm(el, "y", graph.plotRange.y); }; var renderParametricPlotSettings2 = (el, graph) => { const renderParametricCurveSettings = (el2) => { new import_obsidian5.Setting(el2.createDiv()).setName("g1(u) =").addTextArea( (component) => component.setValue(graph.components[0]).onChange((value) => { graph.components[0] = value; }) ); new import_obsidian5.Setting(el2.createDiv()).setName("g2(u) =").addTextArea( (component) => component.setValue(graph.components[1]).onChange((value) => { graph.components[1] = value; }) ); new import_obsidian5.Setting(el2.createDiv()).setName("g3(u) =").addTextArea( (component) => component.setValue(graph.components[2]).onChange((value) => { graph.components[2] = value; }) ); renderIntervalForm(el2, "u", graph.domain.u); }; const renderParametricSurfaceSettings = (el2) => { new import_obsidian5.Setting(el2.createDiv()).setName("g1(u, v) =").addTextArea( (component) => component.setValue(graph.components[0]).onChange((value) => { graph.components[0] = value; }) ); new import_obsidian5.Setting(el2.createDiv()).setName("g2(u, v) =").addTextArea( (component) => component.setValue(graph.components[1]).onChange((value) => { graph.components[1] = value; }) ); new import_obsidian5.Setting(el2.createDiv()).setName("g3(u, v) =").addTextArea( (component) => component.setValue(graph.components[2]).onChange((value) => { graph.components[2] = value; }) ); renderIntervalForm(el2, "u", graph.domain.u); renderIntervalForm(el2, "v", graph.domain.v); }; new import_obsidian5.Setting(el.createDiv()).setName("Space").addDropdown( (component) => component.addOptions({ curve: "Curve", surface: "Surface" }).setValue(graph.type).onChange((value) => { graph.type = value; renderSettings2(); }) ); const settingsEl = el.createDiv(); const renderSettings2 = () => { settingsEl.empty(); if (graph.type === "curve") renderParametricCurveSettings(settingsEl); else renderParametricSurfaceSettings(settingsEl); }; renderSettings2(); }; var renderRegionPlotSettings2 = (el, graph) => { new import_obsidian5.Setting(el.createDiv()).setName("expression (x,y,z)").setDesc("You can also provide a list of expressions {e1, e2, ...}").addTextArea( (component) => component.setValue(graph.expression).onChange((value) => { graph.expression = value; }) ); renderIntervalForm(el, "x", graph.domain.x); renderIntervalForm(el, "y", graph.domain.y); renderIntervalForm(el, "z", graph.domain.z); }; var renderContourPlotSettings2 = (el, graph) => { new import_obsidian5.Setting(el.createDiv()).setName("expression (x,y,z)").setDesc("You can also provide a list of expressions {e1, e2, ...}").addTextArea( (component) => component.setValue(graph.expression).onChange((value) => { graph.expression = value; }) ); renderIntervalForm(el, "x", graph.domain.x); renderIntervalForm(el, "y", graph.domain.y); renderIntervalForm(el, "z", graph.domain.z); }; var renderVectorPlotSettings2 = (el, graph) => { new import_obsidian5.Setting(el.createDiv()).setName("Vx(x,y) = ").addTextArea( (component) => component.setValue(graph.components[0]).onChange((value) => { graph.components[0] = value; }) ); new import_obsidian5.Setting(el.createDiv()).setName("Vy(x,y) = ").addTextArea( (component) => component.setValue(graph.components[1]).onChange((value) => { graph.components[1] = value; }) ); new import_obsidian5.Setting(el.createDiv()).setName("Vz(x,y) = ").addTextArea( (component) => component.setValue(graph.components[2]).onChange((value) => { graph.components[2] = value; }) ); renderIntervalForm(el, "x", graph.domain.x); renderIntervalForm(el, "y", graph.domain.y); renderIntervalForm(el, "z", graph.domain.z); }; var optsFields = { ...optsFields2D, boundaryStyle: { name: "Boundary Style", desc: "How to draw boundary lines for surfaces" } }; var renders3D = { renderSettings: { plot: renderPlotSettings2, parametricPlot: renderParametricPlotSettings2, regionPlot: renderRegionPlotSettings2, contourPlot: renderContourPlotSettings2, vectorPlot: renderVectorPlotSettings2 }, renderOptions: renderOptions(optsFields) }; // src/modal/menus/graph/index.ts var import_obsidian6 = require("obsidian"); var renderByDim = { "2D": renders2D, "3D": renders3D }; var render = (el, modal, dim) => { const { renderSettings: renderSettings2, renderOptions: renderOptions3 } = renderByDim[dim]; const graphs = modal.settings.graphs; if (!graphs.length) graphs[0] = defaultGraph("graph_0", "plot"); let count = 0; let dropdown; new import_obsidian6.Setting(el).setName("Graphs").addDropdown((component) => { dropdown = component; component.addOptions({ [graphs[0].id]: graphs[0].id, add: "+ add" }).onChange((value) => { if (value === "add") { const name = `graph_${++count}`; graphs.push(defaultGraph(name, "plot")); component.addOption(name, name); component.selectEl.remove( component.selectEl.selectedIndex ); component.addOption("add", "+ add"); component.setValue(name); } renderSelectedGraphSettings(); }); }).addButton( (component) => component.setButtonText("Delete").setWarning().onClick((e) => { e.preventDefault(); if (dropdown.selectEl.options.length === 2) return; const idxToRmv = graphs.findIndex( (graph) => graph.id === dropdown.selectEl.options[dropdown.selectEl.selectedIndex].value ); graphs.splice(idxToRmv, 1); dropdown.selectEl.remove(dropdown.selectEl.selectedIndex); renderSelectedGraphSettings(); }) ); const selectedGraphEl = el.createDiv(); const renderSelectedGraphSettings = () => { selectedGraphEl.empty(); const graph = graphs.find( (graph2) => graph2.id === dropdown.selectEl.options[dropdown.selectEl.selectedIndex].value ); if (!graph) return; new import_obsidian6.Setting(selectedGraphEl.createDiv()).setName("Type").addDropdown((component) => { component.addOptions(graphTypesOptions); component.setValue(graph.type); component.onChange((value) => { graph.type = value; renderSelectedGraphSettings(); }); }).setDesc(graphTypeDescription[graph.type]); renderSettings2[graph.type](selectedGraphEl, graph[graph.type]); renderOptions3(selectedGraphEl, modal.settings, graph.options); }; renderSelectedGraphSettings(); }; var renderGraphSettings = (el, modal) => { el.empty(); el.createEl("h5", { text: `Plot ${modal.settings.raster.dim}` }); render(el, modal, modal.settings.raster.dim); }; // src/modal/menus/raster.ts var import_obsidian7 = require("obsidian"); var renderRasterSettings = (el, graphSettingsEl, modal) => { const settings = modal.settings; el.createEl("h5", { text: "Raster settings" }); new import_obsidian7.Setting(el).setName("Dimensions").addDropdown((component) => { component.addOptions({ "2D": "2D", "3D": "3D" }); component.onChange((value) => { settings.raster.dim = value; renderGraphSettings(graphSettingsEl, modal); }); component.setValue(settings.raster.dim); }); new import_obsidian7.Setting(el.createDiv()).addText( (text) => text.setValue(settings.raster.background).onChange((value) => settings.raster.background = value) ).setName("Background"); new import_obsidian7.Setting(el.createDiv()).addText( (text) => text.setValue(settings.raster.size.height).onChange((value) => settings.raster.size.height = value) ).setName("Height"); new import_obsidian7.Setting(el.createDiv()).addText( (text) => text.setValue(settings.raster.size.width).onChange((value) => settings.raster.size.width = value) ).setName("Width"); }; // src/_constants.ts var PLUGIN = { CODEBLOCK_NAME: "mathematica-plot" }; // src/modal/menus/graph/submit.ts var import_obsidian8 = require("obsidian"); var cleanSettingStructure = (settings) => { const cleanGraphs = settings.graphs.map((graph) => ({ id: graph.id, options: graph.options, type: graph.type, [graph.type]: graph[graph.type] })); return { ...settings, graphs: cleanGraphs }; }; var renderSubmitBtn = (el, modal) => { new import_obsidian8.Setting(el).addButton( (btn) => btn.setButtonText("Submit").setCta().onClick(async () => { const line = modal.editor.getCursor().line; if (modal.options.isEditing) { modal.editor.replaceSelection( (0, import_obsidian8.stringifyYaml)(cleanSettingStructure(modal.settings)) ); } else modal.editor.setLine( line, `\`\`\`${PLUGIN.CODEBLOCK_NAME} ${(0, import_obsidian8.stringifyYaml)( cleanSettingStructure(modal.settings) )} \`\`\`` ); modal.options.afterSubmit(el); modal.close(); }) ); }; // src/modal/menus/settings.ts var renderSettings = (el, modal) => { const rasterEl = el.createDiv(); const generalEl = el.createDiv(); const menuEl = el.createDiv(); renderRasterSettings(rasterEl, menuEl, modal); renderGeneralSettings(generalEl, modal); renderGraphSettings(menuEl, modal); renderSubmitBtn(el, modal); }; // src/modal/plotModal.ts var import_obsidian9 = require("obsidian"); var defaultSettings = { isEditing: false, afterSubmit: () => null, onClose: () => null }; var defaultPlotSettings = () => ({ raster: { dim: "2D", background: "None", size: { height: "Automatic", width: "250" } }, general: { axes: "True", axesLabel: "{x, y}", frame: "False", boxed: "True" }, graphs: [] }); var PlotModal = class extends import_obsidian9.Modal { constructor(plugin, editor, settings, options) { super(plugin.app); this.settings = defaultPlotSettings(); this.plugin = plugin; this.editor = editor; if (settings) this.settings = settings; this.options = { ...defaultSettings, ...options }; } onOpen() { const { contentEl } = this; this.modalEl.addClass("mathematica-plot-modal"); contentEl.createEl("h4", { text: "Plot" }); const flex = contentEl.createEl("div", { cls: "mathematica-plot-modal-content-container" }); const settings = flex.createDiv(); const preview = flex.createDiv(); settings.addClass("mathematica-plot-modal-settings"); preview.addClass("mathematica-plot-modal-preview"); renderSettings(settings, this); renderGraphPreview(preview, this); } onClose() { this.options.onClose(); } }; // src/settingsTab.ts var import_obsidian10 = require("obsidian"); var MathematicaPlotSettingsTab = class extends import_obsidian10.PluginSettingTab { constructor(app, plugin) { super(app, plugin); this.plugin = plugin; } display() { const { containerEl } = this; containerEl.empty(); containerEl.createEl("h3").setText("Settings"); new import_obsidian10.Setting(containerEl).setName("Use cloud").setDesc( "Whether to pass --cloud option. If you don't have the wolfram engine installed set it to true." ).addToggle( (component) => component.setValue(this.plugin.settings.useCloud).onChange(async (value) => { this.plugin.settings.useCloud = value; await this.plugin.saveSettings(); }) ); new import_obsidian10.Setting(containerEl).setName("WolframScript path").setDesc( "The installation path of WolframScript. If you WolframScript is globally available on your system you can leave it blank." ).addText( (component) => component.setValue(this.plugin.settings.wolframScriptPath).onChange(async (value) => { this.plugin.settings.wolframScriptPath = value; await this.plugin.saveSettings(); }) ); } }; // src/utils/editor.ts var isReadingView = (markdownView) => markdownView.getMode() === "preview"; // src/main.ts var import_os = require("os"); var DEFAULT_SETTINGS = { useCloud: true, wolframScriptPath: "" }; var MathematicaPlot = class extends import_obsidian11.Plugin { async onload() { if (import_obsidian11.Platform.isMobile) return; await this.loadSettings(); this.addCommand({ id: "plot-graph", name: "Plot Graph", editorCallback: (editor) => { new PlotModal(this, editor, null, {}).open(); } }); this.registerMarkdownCodeBlockProcessor( PLUGIN.CODEBLOCK_NAME, async (source, el) => { const plotEl = el.createDiv({ cls: "mathematica-plot" }); await renderGraph(plotEl, source, { ...this.settings }); const view = this.app.workspace.getActiveViewOfType(import_obsidian11.MarkdownView); if (!view || isReadingView(view)) return; const cursorPos = view.editor.getCursor(); const button = new import_obsidian11.ExtraButtonComponent(plotEl).setIcon("settings-2").setTooltip("Edit plot settings").onClick(() => { var _a, _b; (_b = (_a = el.parentElement) == null ? void 0 : _a.querySelector(".edit-block-button")) == null ? void 0 : _b.click(); const settings = (0, import_obsidian11.parseYaml)(source); settings.graphs = settings.graphs.map((graph) => ({ ...defaultGraphType(), ...graph })); new PlotModal(this, view.editor, settings, { isEditing: true, onClose: () => view.editor.setCursor(cursorPos) }).open(); }); button.extraSettingsEl.addClass("mathematica-plot-edit-btn"); } ); this.addSettingTab(new MathematicaPlotSettingsTab(this.app, this)); } onunload() { } async loadSettings() { if ((0, import_os.platform)() === "win32") DEFAULT_SETTINGS.wolframScriptPath = "C:\\Program Files\\Wolfram Research\\WolframScript\\wolframscript.exe"; this.settings = Object.assign( {}, DEFAULT_SETTINGS, await this.loadData() ); } async saveSettings() { await this.saveData(this.settings); } }; /* nosourcemap */