/* THIS IS A GENERATED/BUNDLED FILE BY ROLLUP if you want to view the source visit the plugin's github repository */ 'use strict'; var obsidian = require('obsidian'); /*! ***************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } var codemirror = CodeMirror; function createCommonjsModule(fn) { var module = { exports: {} }; return fn(module, module.exports), module.exports; } createCommonjsModule(function (module, exports) { // CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: https://codemirror.net/LICENSE (function(mod) { mod(codemirror); })(function(CodeMirror) { CodeMirror.defineMode("cook", function() { return { token: function(stream, state) { var sol = stream.sol() || state.afterSection; var eol = stream.eol(); state.afterSection = false; if (sol) { if (state.nextMultiline) { state.inMultiline = true; state.nextMultiline = false; } else { state.position = null; } } if (eol && ! state.nextMultiline) { state.inMultiline = false; state.position = null; } if (sol) { while(stream.eatSpace()) {} } var ch = stream.next(); if (sol && ch === ">") { if (stream.eat(">")) { state.position = "metadata-key"; return "metadata" } } if(state.position === "metadata"); else if(state.position === "metadata-key") { if(ch === ':') state.position = "metadata"; } else { if (ch === "-") { if (stream.eat("-")) { stream.skipToEnd(); return "comment"; } } if (stream.match(/\[-.+?-\]/)) return "comment"; if(stream.match(/^@([^@#~]+?(?={))/)) return "ingredient"; else if(stream.match(/^@(.+?\b)/)) return "ingredient"; if(stream.match(/^#([^@#~]+?(?={))/)) return "cookware"; else if(stream.match(/^#(.+?\b)/)) return "cookware"; if(ch === '~'){ state.position = "timer"; return "formatting"; } if(ch === '{'){ if(state.position != "timer") state.position = "measurement"; return "formatting"; } if(ch === '}'){ state.position = null; return "formatting"; } if(ch === '%' && (state.position === "measurement" || state.position === "timer")){ state.position = "unit"; return "formatting"; } } return state.position; }, startState: function() { return { formatting : false, nextMultiline : false, // Is the next line multiline value inMultiline : false, // Is the current line a multiline value afterSection : false // Did we just open a section }; } }; }); CodeMirror.defineMIME("text/x-cook", "cook"); CodeMirror.defineMIME("text/x-cooklang", "cook"); }); }); // utility class for parsing cooklang files class CookLang { static parse(source) { const recipe = new Recipe(); source.split('\n').forEach(line => { let match; // clear comments line = line.replace(/(--.*)|(\[-.+?-\])/, ''); // skip blank lines if (line.trim().length === 0) return; // metadata lines else if (match = Metadata.regex.exec(line)) { recipe.metadata.push(new Metadata(match[0])); } // method lines else { // ingredients on a line while (match = Ingredient.regex.exec(line)) { const ingredient = new Ingredient(match[0]); recipe.ingredients.push(ingredient); line = line.replace(match[0], ingredient.methodOutput()); } // cookware on a line while (match = Cookware.regex.exec(line)) { const c = new Cookware(match[0]); recipe.cookware.push(c); line = line.replace(match[0], c.methodOutput()); } // timers on a line while (match = Timer.regex.exec(line)) { const t = new Timer(match[0]); recipe.timers.push(t); line = line.replace(match[0], t.methodOutput()); } // add in the method line recipe.method.push(line.trim()); } }); return recipe; } } // a class representing a recipe class Recipe { constructor() { this.metadata = []; this.ingredients = []; this.cookware = []; this.timers = []; this.method = []; this.methodImages = new Map(); } calculateTotalTime() { let time = 0; this.timers.forEach(timer => { let amount = 0; if (parseFloat(timer.amount) + '' == timer.amount) amount = parseFloat(timer.amount); else if (timer.amount.contains('/')) { const split = timer.amount.split('/'); if (split.length == 2) { const num = parseFloat(split[0]); const den = parseFloat(split[1]); if (num && den) { amount = num / den; } } } if (amount > 0) { if (timer.unit.toLowerCase().startsWith('s')) { time += amount; } else if (timer.unit.toLowerCase().startsWith('m')) { time += amount * 60; } else if (timer.unit.toLowerCase().startsWith('h')) { time += amount * 60 * 60; } } }); return time; } } // a class representing an ingredient class Ingredient { constructor(s) { var _a; this.originalString = null; this.name = null; this.amount = null; this.unit = null; this.methodOutput = () => { let s = ``; if (this.amount !== null) { s += `${this.amount} `; } if (this.unit !== null) { s += `${this.unit} `; } s += `${this.name}`; return s; }; this.listOutput = () => { let s = ``; if (this.amount !== null) { s += `${this.amount} `; } if (this.unit !== null) { s += `${this.unit} `; } s += this.name; return s; }; this.originalString = s; const match = Ingredient.regex.exec(s); this.name = match[1] || match[3]; const attrs = (_a = match[2]) === null || _a === void 0 ? void 0 : _a.split('%'); this.amount = attrs && attrs.length > 0 ? attrs[0] : null; this.unit = attrs && attrs.length > 1 ? attrs[1] : null; } } // starts with an @, ends at a word boundary or {} // (also capture what's inside the {}) Ingredient.regex = /@(?:([^@#~]+?)(?:{(.*?)}|{}))|@(.+?\b)/; // a class representing an item of cookware class Cookware { constructor(s) { this.originalString = null; this.name = null; this.methodOutput = () => { return `${this.name}`; }; this.listOutput = () => { return this.name; }; this.originalString = s; const match = Cookware.regex.exec(s); this.name = match[1] || match[2]; } } // starts with a #, ends at a word boundary or {} Cookware.regex = /#(?:([^@#~]+?)(?:{}))|#(.+?\b)/; // a class representing a timer class Timer { constructor(s) { this.originalString = null; this.amount = null; this.unit = null; this.methodOutput = () => { return `${this.amount} ${this.unit}`; }; this.listOutput = () => { return `${this.amount} ${this.unit}`; }; const match = Timer.regex.exec(s); this.amount = match[1]; this.unit = match[2]; } } // contained within ~{} Timer.regex = /~{([0-9]+)%(.+?)}/; // a class representing metadata item class Metadata { constructor(s) { this.originalString = null; this.key = null; this.value = null; this.methodOutput = () => { return `${this.key} ${this.value}`; }; this.listOutput = () => { return `${this.key} ${this.value}`; }; const match = Metadata.regex.exec(s); this.key = match[1].trim(); this.value = match[2].trim(); } } // starts with >> Metadata.regex = />>\s*(.*?):\s*(.*)/; // This is the custom view class CookView extends obsidian.TextFileView { constructor(leaf, settings) { super(leaf); this.settings = settings; // Add Preview Mode Container this.previewEl = this.contentEl.createDiv({ cls: 'cook-preview-view', attr: { 'style': 'display: none' } }); // Add Source Mode Container this.sourceEl = this.contentEl.createDiv({ cls: 'cook-source-view', attr: { 'style': 'display: block' } }); // Add container for CodeMirror editor this.editorEl = this.sourceEl.createEl('textarea', { cls: 'cook-cm-editor' }); // Create CodeMirror Editor with specific config this.editor = CodeMirror.fromTextArea(this.editorEl, { lineNumbers: false, lineWrapping: true, scrollbarStyle: null, keyMap: "default", theme: "obsidian" }); } onload() { // Save file on change this.editor.on('change', () => { this.requestSave(); }); // add the action to switch between source and preview mode this.changeModeButton = this.addAction('lines-of-text', 'Preview (Ctrl+Click to open in new pane)', (evt) => this.switchMode(evt), 17); // undocumented: Get the current default view mode to switch to let defaultViewMode = this.app.vault.getConfig('defaultViewMode'); this.setState(Object.assign(Object.assign({}, this.getState()), { mode: defaultViewMode }), {}); } getState() { return super.getState(); } setState(state, result) { return super.setState(state, result).then(() => { if (state.mode) this.switchMode(state.mode); }); } // function to switch between source and preview mode switchMode(arg) { let mode = arg; // if force mode not provided, switch to opposite of current mode if (!mode || mode instanceof MouseEvent) mode = this.currentView === 'source' ? 'preview' : 'source'; if (arg instanceof MouseEvent) { if (obsidian.Keymap.isModEvent(arg)) { this.app.workspace.duplicateLeaf(this.leaf).then(() => { var _a; const cookLeaf = (_a = this.app.workspace.activeLeaf) === null || _a === void 0 ? void 0 : _a.view; if (cookLeaf) { cookLeaf.setState(Object.assign(Object.assign({}, cookLeaf.getState()), { mode: mode }), {}); } }); } else { this.setState(Object.assign(Object.assign({}, this.getState()), { mode: mode }), {}); } } else { // switch to preview mode if (mode === 'preview') { this.currentView = 'preview'; obsidian.setIcon(this.changeModeButton, 'pencil'); this.changeModeButton.setAttribute('aria-label', 'Edit (Ctrl+Click to edit in new pane)'); this.renderPreview(this.recipe); this.previewEl.style.setProperty('display', 'block'); this.sourceEl.style.setProperty('display', 'none'); } // switch to source mode else { this.currentView = 'source'; obsidian.setIcon(this.changeModeButton, 'lines-of-text'); this.changeModeButton.setAttribute('aria-label', 'Preview (Ctrl+Click to open in new pane)'); this.previewEl.style.setProperty('display', 'none'); this.sourceEl.style.setProperty('display', 'block'); this.editor.refresh(); } } } // get the data for save getViewData() { this.data = this.editor.getValue(); // may as well parse the recipe while we're here. this.recipe = CookLang.parse(this.data); return this.data; } // load the data into the view setViewData(data, clear) { return __awaiter(this, void 0, void 0, function* () { this.data = data; if (clear) { this.editor.swapDoc(CodeMirror.Doc(data, "text/x-cook")); this.editor.clearHistory(); } this.editor.setValue(data); this.recipe = CookLang.parse(data); // if we're in preview view, also render that if (this.currentView === 'preview') this.renderPreview(this.recipe); }); } // clear the editor, etc clear() { this.previewEl.empty(); this.editor.setValue(''); this.editor.clearHistory(); this.recipe = new Recipe(); this.data = null; } getDisplayText() { if (this.file) return this.file.basename; else return "Cooklang (no file)"; } canAcceptExtension(extension) { return extension == 'cook'; } getViewType() { return "cook"; } // when the view is resized, refresh CodeMirror (thanks Licat!) onResize() { this.editor.refresh(); } // icon for the view getIcon() { return "document-cook"; } // render the preview view renderPreview(recipe) { // clear the preview before adding the rest this.previewEl.empty(); // we can't render what we don't have... if (!recipe) return; if (this.settings.showImages) { // add any files following the cooklang conventions to the recipe object // https://cooklang.org/docs/spec/#adding-pictures const otherFiles = this.file.parent.children.filter(f => (f instanceof obsidian.TFile) && (f.basename == this.file.basename || f.basename.startsWith(this.file.basename + '.')) && f.name != this.file.name); otherFiles.forEach(f => { // convention specifies JPEGs and PNGs. Added GIFs as well. Why not? if (f.extension == "jpg" || f.extension == "jpeg" || f.extension == "png" || f.extension == "gif") { // main recipe image if (f.basename == this.file.basename) recipe.image = f; else { const split = f.basename.split('.'); // individual step images if (split.length == 2 && parseInt(split[1])) { recipe.methodImages.set(parseInt(split[1]), f); } } } }); // if there is a main image, put it as a banner image at the top if (recipe.image) { const img = this.previewEl.createEl('img', { cls: 'main-image' }); img.src = this.app.vault.getResourcePath(recipe.image); } } if (this.settings.showIngredientList) { // Add the Ingredients header this.previewEl.createEl('h2', { cls: 'ingredients-header', text: 'Ingredients' }); // Add the ingredients list const ul = this.previewEl.createEl('ul', { cls: 'ingredients' }); recipe.ingredients.forEach(ingredient => { const li = ul.createEl('li'); if (ingredient.amount !== null) { li.createEl('span', { cls: 'amount', text: ingredient.amount }); li.appendText(' '); } if (ingredient.unit !== null) { li.createEl('span', { cls: 'unit', text: ingredient.unit }); li.appendText(' '); } li.appendText(ingredient.name); }); } if (this.settings.showCookwareList) { // Add the Cookware header this.previewEl.createEl('h2', { cls: 'cookware-header', text: 'Cookware' }); // Add the Cookware list const ul = this.previewEl.createEl('ul', { cls: 'cookware' }); recipe.cookware.forEach(item => { ul.createEl('li', { text: item.name }); }); } if (this.settings.showTotalTime) { let time = recipe.calculateTotalTime(); if (time > 0) { // Add the Timers header this.previewEl.createEl('h2', { cls: 'time-header', text: 'Total Time' }); this.previewEl.createEl('p', { cls: 'time', text: this.formatTime(time) }); } } // add the method header this.previewEl.createEl('h2', { cls: 'method-header', text: 'Method' }); // add the method list const mol = this.previewEl.createEl('ol', { cls: 'method' }); let i = 1; recipe.method.forEach(line => { var _a, _b; const mli = mol.createEl('li'); mli.innerHTML = line; if (!this.settings.showQuantitiesInline) { (_a = mli.querySelectorAll('.amount')) === null || _a === void 0 ? void 0 : _a.forEach(el => el.remove()); (_b = mli.querySelectorAll('.unit')) === null || _b === void 0 ? void 0 : _b.forEach(el => el.remove()); } if (this.settings.showImages && recipe.methodImages.has(i)) { const img = mli.createEl('img', { cls: 'method-image' }); img.src = this.app.vault.getResourcePath(recipe.methodImages.get(i)); } i++; }); } formatTime(time) { let minutes = Math.floor(time / 60); let hours = Math.floor(minutes / 60); minutes = minutes % 60; let result = ""; if (hours > 0) result += hours + " hours "; if (minutes > 0) result += minutes + " minutes "; return result; } } class CookLangSettings { constructor() { this.showImages = true; this.showIngredientList = true; this.showCookwareList = true; this.showTotalTime = true; this.showQuantitiesInline = false; } } class CookSettingsTab extends obsidian.PluginSettingTab { constructor(app, plugin) { super(app, plugin); this.plugin = plugin; } display() { let { containerEl } = this; containerEl.empty(); new obsidian.Setting(containerEl) .setName('Preview Options') .setHeading(); new obsidian.Setting(containerEl) .setName('Show images') .setDesc('Show images in the recipe (see https://cooklang.org/docs/spec/#adding-pictures)') .addToggle(toggle => toggle .setValue(this.plugin.settings.showImages) .onChange((value) => { this.plugin.settings.showImages = value; this.plugin.saveData(this.plugin.settings); this.plugin.reloadCookViews(); })); new obsidian.Setting(containerEl) .setName('Show ingredient list') .setDesc('Show the list of ingredients at the top of the recipe') .addToggle(toggle => toggle .setValue(this.plugin.settings.showIngredientList) .onChange((value) => { this.plugin.settings.showIngredientList = value; this.plugin.saveData(this.plugin.settings); this.plugin.reloadCookViews(); })); new obsidian.Setting(containerEl) .setName('Show cookware list') .setDesc('Show the list of cookware at the top of the recipe') .addToggle(toggle => toggle .setValue(this.plugin.settings.showCookwareList) .onChange((value) => { this.plugin.settings.showCookwareList = value; this.plugin.saveData(this.plugin.settings); this.plugin.reloadCookViews(); })); new obsidian.Setting(containerEl) .setName('Show total time') .setDesc('Show the total of all timers at the top of the recipe') .addToggle(toggle => toggle .setValue(this.plugin.settings.showTotalTime) .onChange((value) => { this.plugin.settings.showTotalTime = value; this.plugin.saveData(this.plugin.settings); this.plugin.reloadCookViews(); })); new obsidian.Setting(containerEl) .setName('Show quantities inline') .setDesc('Show the ingredient quantities inline in the recipe method') .addToggle(toggle => toggle .setValue(this.plugin.settings.showQuantitiesInline) .onChange((value) => { this.plugin.settings.showQuantitiesInline = value; this.plugin.saveData(this.plugin.settings); this.plugin.reloadCookViews(); })); } } class CookPlugin extends obsidian.Plugin { constructor() { super(...arguments); this.cookFileCreator = () => __awaiter(this, void 0, void 0, function* () { var _a, _b; let newFileFolderPath = null; const newFileLocation = this.app.vault.getConfig('newFileLocation'); if (!newFileLocation || newFileLocation === "root") { newFileFolderPath = '/'; } else if (newFileLocation === "current") { newFileFolderPath = (_b = (_a = this.app.workspace.getActiveFile()) === null || _a === void 0 ? void 0 : _a.parent) === null || _b === void 0 ? void 0 : _b.path; } else { newFileFolderPath = this.app.vault.getConfig('newFileFolderPath'); } if (!newFileFolderPath) newFileFolderPath = '/'; else if (!newFileFolderPath.endsWith('/')) newFileFolderPath += '/'; const originalPath = newFileFolderPath; newFileFolderPath = newFileFolderPath + 'Untitled.cook'; let i = 0; while (this.app.vault.getAbstractFileByPath(newFileFolderPath)) { newFileFolderPath = `${originalPath}Untitled ${++i}.cook`; } const newFile = yield this.app.vault.create(newFileFolderPath, ''); return newFile; }); // function to create the view this.cookViewCreator = (leaf) => { return new CookView(leaf, this.settings); }; // this function provides the icon for the document // I added a modification of the CookLang icon with no colours or shadows this.addDocumentIcon = (extension) => { obsidian.addIcon(`document-${extension}`, ` `); }; } onload() { const _super = Object.create(null, { onload: { get: () => super.onload } }); return __awaiter(this, void 0, void 0, function* () { _super.onload.call(this); this.settings = Object.assign(new CookLangSettings(), yield this.loadData()); // register a custom icon this.addDocumentIcon("cook"); // register the view and extensions this.registerView("cook", this.cookViewCreator); this.registerExtensions(["cook"], "cook"); this.addSettingTab(new CookSettingsTab(this.app, this)); // commands: // - Create new recipe // - Create recipe in new pane // - Convert markdown file to `.cook` this.addCommand({ id: "create-cook", name: "Create new recipe", callback: () => __awaiter(this, void 0, void 0, function* () { const newFile = yield this.cookFileCreator(); this.app.workspace.getLeaf().openFile(newFile); }) }); this.addCommand({ id: "create-cook-new-pane", name: "Create recipe in new pane", callback: () => __awaiter(this, void 0, void 0, function* () { const newFile = yield this.cookFileCreator(); yield this.app.workspace.getLeaf(true).openFile(newFile); }) }); // register the convert to cook command this.addCommand({ id: "convert-to-cook", name: "Convert markdown file to `.cook`", checkCallback: (checking) => { const file = this.app.workspace.getActiveFile(); const isMd = file.extension === "md"; if (checking) { return isMd; } else if (isMd) { // replace last instance of .md with .cook this.app.vault.rename(file, file.path.replace(/\.md$/, ".cook")).then(() => { this.app.workspace.activeLeaf.openFile(file); }); } } }); }); } reloadCookViews() { this.app.workspace.getLeavesOfType('cook').forEach(leaf => { if (leaf.view instanceof CookView) { leaf.view.settings = this.settings; if (leaf.view.recipe) leaf.view.renderPreview(leaf.view.recipe); } }); } } module.exports = CookPlugin; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9saWIvY29kZW1pcnJvci5qcyIsInNyYy9tb2RlL2Nvb2svY29vay5qcyIsInNyYy9jb29rbGFuZy50cyIsInNyYy9jb29rVmlldy50cyIsInNyYy9zZXR0aW5ncy50cyIsInNyYy9tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpudWxsLCJuYW1lcyI6WyJyZXF1aXJlJCQwIiwiVGV4dEZpbGVWaWV3IiwiS2V5bWFwIiwic2V0SWNvbiIsIlRGaWxlIiwiUGx1Z2luU2V0dGluZ1RhYiIsIlNldHRpbmciLCJQbHVnaW4iLCJhZGRJY29uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdURBO0FBQ08sU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO0FBQzdELElBQUksU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hILElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQy9ELFFBQVEsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUNuRyxRQUFRLFNB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