You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
746 lines
58 KiB
746 lines
58 KiB
/*
|
|
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 = `<span class='ingredient'>`;
|
|
if (this.amount !== null) {
|
|
s += `<span class='amount'>${this.amount} </span>`;
|
|
}
|
|
if (this.unit !== null) {
|
|
s += `<span class='unit'>${this.unit} </span>`;
|
|
}
|
|
s += `${this.name}</span>`;
|
|
return s;
|
|
};
|
|
this.listOutput = () => {
|
|
let s = ``;
|
|
if (this.amount !== null) {
|
|
s += `<span class='amount'>${this.amount}</span> `;
|
|
}
|
|
if (this.unit !== null) {
|
|
s += `<span class='unit'>${this.unit}</span> `;
|
|
}
|
|
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 `<span class='cookware'>${this.name}</span>`;
|
|
};
|
|
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 `<span class='time'><span class='time-amount'>${this.amount}</span> <span class='time-unit'>${this.unit}</span></span>`;
|
|
};
|
|
this.listOutput = () => {
|
|
return `<span class='time-amount'>${this.amount}</span> <span class='time-unit'>${this.unit}</span>`;
|
|
};
|
|
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 `<span class='metadata metadata-key'>${this.key}</span> <span class='metadata metadata-value'>${this.value}</span>`;
|
|
};
|
|
this.listOutput = () => {
|
|
return `<span class='metadata-key'>${this.key}</span> <span class='metadata-value'>${this.value}</span>`;
|
|
};
|
|
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}`, `
|
|
<svg viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M30 48C39.9411 48 48 39.9411 48 30H12C12 39.9411 20.0589 48 30 48Z" fill="currentColor"/>
|
|
<circle cx="18" cy="18" r="4" fill="currentColor"/>
|
|
<circle cx="42" cy="18" r="4" fill="currentColor"/>
|
|
<circle cx="30" cy="16" r="4" fill="currentColor"/>
|
|
</svg>
|
|
`);
|
|
};
|
|
}
|
|
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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
|