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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