main.js
1 /* 2 THIS IS A GENERATED/BUNDLED FILE BY ROLLUP 3 if you want to view the source visit the plugins github repository 4 */ 5 6 'use strict'; 7 8 var obsidian = require('obsidian'); 9 10 /*! ***************************************************************************** 11 Copyright (c) Microsoft Corporation. 12 13 Permission to use, copy, modify, and/or distribute this software for any 14 purpose with or without fee is hereby granted. 15 16 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 17 REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 18 AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 19 INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 20 LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 21 OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 22 PERFORMANCE OF THIS SOFTWARE. 23 ***************************************************************************** */ 24 25 function __awaiter(thisArg, _arguments, P, generator) { 26 function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 27 return new (P || (P = Promise))(function (resolve, reject) { 28 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 29 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 30 function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 31 step((generator = generator.apply(thisArg, _arguments || [])).next()); 32 }); 33 } 34 35 const DEFAULT_SETTINGS = { 36 template: `{{text}}\n> [Wikipedia]({{url}})`, 37 shouldUseParagraphTemplate: true, 38 shouldBoldSearchTerm: true, 39 paragraphTemplate: `> {{paragraphText}}\n>\n`, 40 language: "en", 41 }; 42 const extractApiUrl = "wikipedia.org/w/api.php?format=json&action=query&prop=extracts&explaintext=1&redirects&origin=*&titles="; 43 const disambiguationIdentifier = "may refer to:"; 44 class WikipediaPlugin extends obsidian.Plugin { 45 getLanguage() { 46 return this.settings.language ? this.settings.language : "en"; 47 } 48 getUrl(title) { 49 return `https://${this.getLanguage()}.wikipedia.org/wiki/${encodeURI(title)}`; 50 } 51 getApiUrl() { 52 return `https://${this.getLanguage()}.` + extractApiUrl; 53 } 54 formatExtractText(extract, searchTerm) { 55 const text = extract.text; 56 let formattedText = ""; 57 if (this.settings.shouldUseParagraphTemplate) { 58 const split = text.split("==")[0].trim().split("\n"); 59 formattedText = split 60 .map((paragraph) => this.settings.paragraphTemplate.replace("{{paragraphText}}", paragraph)) 61 .join("") 62 .trim(); 63 } 64 else { 65 formattedText = text.split("==")[0].trim(); 66 } 67 if (this.settings.shouldBoldSearchTerm) { 68 const pattern = new RegExp(searchTerm, "i"); 69 formattedText = formattedText.replace(pattern, `**${searchTerm}**`); 70 } 71 return formattedText; 72 } 73 handleNotFound(searchTerm) { 74 new obsidian.Notice(`${searchTerm} not found on Wikipedia.`); 75 } 76 handleCouldntResolveDisambiguation() { 77 new obsidian.Notice(`Could not automatically resolve disambiguation.`); 78 } 79 hasDisambiguation(extract) { 80 if (extract.text.includes(disambiguationIdentifier)) { 81 return true; 82 } 83 return false; 84 } 85 parseResponse(json) { 86 const pages = json.query.pages; 87 const pageKeys = Object.keys(pages); 88 if (pageKeys.includes("-1")) { 89 return undefined; 90 } 91 const extracts = pageKeys.map((key) => { 92 const page = pages[key]; 93 const extract = { 94 title: page.title, 95 text: page.extract, 96 url: this.getUrl(page.title), 97 }; 98 return extract; 99 }); 100 return extracts[0]; 101 } 102 formatExtractInsert(extract, searchTerm) { 103 const formattedText = this.formatExtractText(extract, searchTerm); 104 const template = this.settings.template; 105 const formattedTemplate = template 106 .replace("{{text}}", formattedText) 107 .replace("{{searchTerm}}", searchTerm) 108 .replace("{{url}}", extract.url); 109 return formattedTemplate; 110 } 111 getWikipediaText(title) { 112 return __awaiter(this, void 0, void 0, function* () { 113 const url = this.getApiUrl() + encodeURIComponent(title); 114 const requestParam = { 115 url: url, 116 }; 117 const resp = yield obsidian.request(requestParam) 118 .then((r) => JSON.parse(r)) 119 .catch(() => new obsidian.Notice("Failed to get Wikipedia. Check your internet connection or language prefix.")); 120 const extract = this.parseResponse(resp); 121 return extract; 122 }); 123 } 124 pasteIntoEditor(editor, searchTerm) { 125 return __awaiter(this, void 0, void 0, function* () { 126 let extract = yield this.getWikipediaText(searchTerm); 127 if (!extract) { 128 this.handleNotFound(searchTerm); 129 return; 130 } 131 if (this.hasDisambiguation(extract)) { 132 new obsidian.Notice(`Disambiguation found for ${searchTerm}. Choosing first result.`); 133 const newSearchTerm = extract.text 134 .split(disambiguationIdentifier)[1] 135 .trim() 136 .split(",")[0] 137 .split("==") 138 .pop() 139 .trim(); 140 extract = yield this.getWikipediaText(newSearchTerm); 141 if (!extract) { 142 this.handleCouldntResolveDisambiguation(); 143 return; 144 } 145 } 146 editor.replaceSelection(this.formatExtractInsert(extract, searchTerm)); 147 }); 148 } 149 getWikipediaTextForActiveFile(editor) { 150 return __awaiter(this, void 0, void 0, function* () { 151 const activeFile = yield this.app.workspace.getActiveFile(); 152 if (activeFile) { 153 const searchTerm = activeFile.basename; 154 if (searchTerm) { 155 yield this.pasteIntoEditor(editor, searchTerm); 156 } 157 } 158 }); 159 } 160 getWikipediaTextForSearchTerm(editor) { 161 return __awaiter(this, void 0, void 0, function* () { 162 new WikipediaSearchModal(this.app, this, editor).open(); 163 }); 164 } 165 onload() { 166 return __awaiter(this, void 0, void 0, function* () { 167 yield this.loadSettings(); 168 this.addCommand({ 169 id: "wikipedia-get-active-note-title", 170 name: "Get Wikipedia for Active Note Title", 171 editorCallback: (editor) => this.getWikipediaTextForActiveFile(editor), 172 }); 173 this.addCommand({ 174 id: "wikipedia-get-search-term", 175 name: "Get Wikipedia for Search Term", 176 editorCallback: (editor) => this.getWikipediaTextForSearchTerm(editor), 177 }); 178 this.addSettingTab(new WikipediaSettingTab(this.app, this)); 179 }); 180 } 181 loadSettings() { 182 return __awaiter(this, void 0, void 0, function* () { 183 this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData()); 184 }); 185 } 186 saveSettings() { 187 return __awaiter(this, void 0, void 0, function* () { 188 yield this.saveData(this.settings); 189 }); 190 } 191 } 192 class WikipediaSearchModal extends obsidian.Modal { 193 constructor(app, plugin, editor) { 194 super(app); 195 this.plugin = plugin; 196 this.editor = editor; 197 } 198 onOpen() { 199 let { contentEl } = this; 200 contentEl.createEl("h2", { text: "Enter Search Term:" }); 201 const inputs = contentEl.createDiv("inputs"); 202 const searchInput = new obsidian.TextComponent(inputs).onChange((searchTerm) => { 203 this.searchTerm = searchTerm; 204 }); 205 searchInput.inputEl.focus(); 206 searchInput.inputEl.addEventListener("keydown", (event) => { 207 if (event.key === "Enter") { 208 this.close(); 209 } 210 }); 211 const controls = contentEl.createDiv("controls"); 212 const searchButton = controls.createEl("button", { 213 text: "Search", 214 cls: "mod-cta", 215 attr: { 216 autofocus: true, 217 }, 218 }); 219 searchButton.addEventListener("click", this.close.bind(this)); 220 const cancelButton = controls.createEl("button", { text: "Cancel" }); 221 cancelButton.addEventListener("click", this.close.bind(this)); 222 } 223 onClose() { 224 return __awaiter(this, void 0, void 0, function* () { 225 let { contentEl } = this; 226 contentEl.empty(); 227 if (this.searchTerm) { 228 yield this.plugin.pasteIntoEditor(this.editor, this.searchTerm); 229 } 230 }); 231 } 232 } 233 class WikipediaSettingTab extends obsidian.PluginSettingTab { 234 constructor(app, plugin) { 235 super(app, plugin); 236 this.plugin = plugin; 237 } 238 display() { 239 let { containerEl } = this; 240 containerEl.empty(); 241 containerEl.createEl("h2", { text: "Obsidian Wikipedia" }); 242 new obsidian.Setting(containerEl) 243 .setName("Wikipedia Language Prefix") 244 .setDesc(`Choose Wikipedia language prefix to use (ex. en for English)`) 245 .addText((textField) => { 246 textField 247 .setValue(this.plugin.settings.language) 248 .onChange((value) => __awaiter(this, void 0, void 0, function* () { 249 this.plugin.settings.language = value; 250 yield this.plugin.saveSettings(); 251 })); 252 }); 253 new obsidian.Setting(containerEl) 254 .setName("Wikipedia Extract Template") 255 .setDesc(`Set markdown template for extract to be inserted.\n 256 Available template variables are {{text}}, {{searchTerm}} and {{url}}. 257 `) 258 .addTextArea((textarea) => textarea 259 .setValue(this.plugin.settings.template) 260 .onChange((value) => __awaiter(this, void 0, void 0, function* () { 261 this.plugin.settings.template = value; 262 yield this.plugin.saveSettings(); 263 }))); 264 new obsidian.Setting(containerEl) 265 .setName("Bold Search Term?") 266 .setDesc("If set to true, the first instance of the search term will be **bolded**") 267 .addToggle((toggle) => toggle 268 .setValue(this.plugin.settings.shouldBoldSearchTerm) 269 .onChange((value) => __awaiter(this, void 0, void 0, function* () { 270 this.plugin.settings.shouldBoldSearchTerm = value; 271 yield this.plugin.saveSettings(); 272 }))); 273 new obsidian.Setting(containerEl) 274 .setName("Use paragraph template?") 275 .setDesc("If set to true, the paragraph template will be inserted for each paragraph of text for {{text}} in main template.") 276 .addToggle((toggle) => toggle 277 .setValue(this.plugin.settings.shouldUseParagraphTemplate) 278 .onChange((value) => __awaiter(this, void 0, void 0, function* () { 279 this.plugin.settings.shouldUseParagraphTemplate = value; 280 yield this.plugin.saveSettings(); 281 }))); 282 new obsidian.Setting(containerEl) 283 .setName("Paragraph Template") 284 .setDesc(`Set markdown template for extract paragraphs to be inserted.\n 285 Available template variables are: {{paragraphText}} 286 `) 287 .addTextArea((textarea) => textarea 288 .setValue(this.plugin.settings.paragraphTemplate) 289 .onChange((value) => __awaiter(this, void 0, void 0, function* () { 290 this.plugin.settings.paragraphTemplate = value; 291 yield this.plugin.saveSettings(); 292 }))); 293 } 294 } 295 296 module.exports = WikipediaPlugin; 297 //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOm51bGwsIm5hbWVzIjpbIlBsdWdpbiIsIk5vdGljZSIsInJlcXVlc3QiLCJNb2RhbCIsIlRleHRDb21wb25lbnQiLCJQbHVnaW5TZXR0aW5nVGFiIiwiU2V0dGluZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXVEQTtBQUNPLFNBQVMsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRTtBQUM3RCxJQUFJLFNBQVMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sS0FBSyxZQUFZLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsVUFBVSxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUNoSCxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLFVBQVUsT0FBTyxFQUFFLE1BQU0sRUFBRTtBQUMvRCxRQUFRLFNBQVMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDbkcsUUFBUSxTQUFTLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0s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