/* THIS IS A GENERATED/BUNDLED FILE BY ROLLUP if you want to view the source visit the plugins 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()); }); } class ConsoleHelper { constructor(plugin, consoleStartsOn) { this.plugin = plugin; if (consoleStartsOn) { this.toggle(true); } } log(str) { console.log(str); } logEval(str) { console.log(eval(str)); } toggle(on = true) { const { consolePanel, document } = window; if (!on) { if (consolePanel) { consolePanel.hideBecauseDevToolsIsOpen(); } else { consolePanel.showBecauseDevToolsIsClosed(); } } else { if (consolePanel) { consolePanel.showBecauseDevToolsIsClosed(); consolePanel.showConsolePanel(); consolePanel.hideDevToolsIconContainer(); } else { this.loadConsoleInMemory(this.plugin); } } } loadConsoleInMemory(plugin) { (function ($) { if (window.consolePanel) { return; } /* eslint-disable */ // https://raw.githubusercontent.com/WebReflection/circular-json/v0.5.9/build/circular-json.js /*! (C) WebReflection Mit Style License */ var CircularJSON = function (JSON, RegExp) { var specialChar = "~", safeSpecialChar = "\\x" + ("0" + specialChar.charCodeAt(0).toString(16)).slice(-2), escapedSafeSpecialChar = "\\" + safeSpecialChar, specialCharRG = new RegExp(safeSpecialChar, "g"), safeSpecialCharRG = new RegExp(escapedSafeSpecialChar, "g"), safeStartWithSpecialCharRG = new RegExp("(?:^|([^\\\\]))" + escapedSafeSpecialChar), indexOf = [].indexOf || function (v) { for (var i = this.length; i-- && this[i] !== v;) ; return i; }, $String = String; function generateReplacer(value, replacer, resolve) { var doNotIgnore = false, inspect = !!replacer, path = [], all = [value], seen = [value], mapp = [resolve ? specialChar : "[Circular]"], last = value, lvl = 1, i, fn; if (inspect) { fn = typeof replacer === "object" ? function (key, value) { return key !== "" && replacer.indexOf(key) < 0 ? void 0 : value; } : replacer; } return function (key, value) { if (inspect) value = fn.call(this, key, value); if (doNotIgnore) { if (last !== this) { i = lvl - indexOf.call(all, this) - 1; lvl -= i; all.splice(lvl, all.length); path.splice(lvl - 1, path.length); last = this; } if (typeof value === "object" && value) { if (indexOf.call(all, value) < 0) { all.push(last = value); } lvl = all.length; i = indexOf.call(seen, value); if (i < 0) { i = seen.push(value) - 1; if (resolve) { path.push(("" + key).replace(specialCharRG, safeSpecialChar)); mapp[i] = specialChar + path.join(specialChar); } else { mapp[i] = mapp[0]; } } else { value = mapp[i]; } } else { if (typeof value === "string" && resolve) { value = value.replace(safeSpecialChar, escapedSafeSpecialChar).replace(specialChar, safeSpecialChar); } } } else { doNotIgnore = true; } return value; }; } function retrieveFromPath(current, keys) { for (var i = 0, length = keys.length; i < length; current = current[keys[i++].replace(safeSpecialCharRG, specialChar)]) ; return current; } function generateReviver(reviver) { return function (key, value) { var isString = typeof value === "string"; if (isString && value.charAt(0) === specialChar) { return new $String(value.slice(1)); } if (key === "") value = regenerate(value, value, {}); if (isString) value = value.replace(safeStartWithSpecialCharRG, "$1" + specialChar).replace(escapedSafeSpecialChar, safeSpecialChar); return reviver ? reviver.call(this, key, value) : value; }; } function regenerateArray(root, current, retrieve) { for (var i = 0, length = current.length; i < length; i++) { current[i] = regenerate(root, current[i], retrieve); } return current; } function regenerateObject(root, current, retrieve) { for (var key in current) { if (current.hasOwnProperty(key)) { current[key] = regenerate(root, current[key], retrieve); } } return current; } function regenerate(root, current, retrieve) { return current instanceof Array ? regenerateArray(root, current, retrieve) : current instanceof $String ? current.length ? retrieve.hasOwnProperty(current) ? retrieve[current] : retrieve[current] = retrieveFromPath(root, current.split(specialChar)) : root : current instanceof Object ? regenerateObject(root, current, retrieve) : current; } var CircularJSON = { stringify: function stringify(value, replacer, space, doNotResolve) { return CircularJSON.parser.stringify(value, generateReplacer(value, replacer, !doNotResolve), space); }, parse: function parse(text, reviver) { return CircularJSON.parser.parse(text, generateReviver(reviver)); }, parser: JSON }; return CircularJSON; }(JSON, RegExp); /* eslint-enable */ // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#Polyfill (function () { if (typeof window.CustomEvent === "function") return false; function CustomEvent(event, params) { params = params || { bubbles: false, cancelable: false, detail: undefined }; var evt = document.createEvent('CustomEvent'); evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); return evt; } CustomEvent.prototype = window.Event.prototype; window.CustomEvent = CustomEvent; })(); var alertNote = (function () { var w = window, d = document, dE = d.documentElement, div = d.createElement('div'), t; div.id = 'topCenterAlertNote'; // Hide functionality var h = function (div) { div.style.display = 'none'; }; var clearTimeout = function () { w.clearTimeout(t); }; var alertNote = function (msg, hideDelay, options) { options = options || {}; var verticalAlignment = options.verticalAlignment || 'top', horizontalAlignment = options.horizontalAlignment || 'center', textAlignment = options.textAlignment || horizontalAlignment, backgroundColor = options.backgroundColor || '#f9edbe', borderColor = options.borderColor || '#eb7', opacity = options.opacity || '1', unobtrusive = options.unobtrusive || false; // TODO: // - Apply !important for various inline styles (otherwise, it might get over-ridden by some previously present !important CSS styles) // - "OK" button functionality /* eslint-disable indent */ div.innerHTML = [ '
', '
', '
', '
', msg, '
', '
', '
', '
' ].join(''); /* eslint-enable indent */ if (unobtrusive) { try { var firstChild = div.firstChild.firstChild.firstChild; firstChild.addEventListener('mouseenter', function () { // Note: // If we wish to directly apply the opacity changes to the parent "div", // which is currently a direct child of tag, then, on some sites (eg: // gmail.com) somehow, as soon as we reduce its opacity to a value less than // 1 (eg: 0.99), it gets hidden immediately. The fact that it is appended to // tag and not to is somehow causing this behavior. Since we // are using that parent div's inner child, the opacity transition works fine. firstChild.style.transition = 'opacity 0.3s ease-out'; firstChild.style.opacity = '0'; firstChild.style.pointerEvents = 'none'; }, false); } catch (e) { // do nothing } } div.style.display = ''; // Required when the same div element is being reused dE.appendChild(div); clearTimeout(); t = w.setTimeout(function () { h(div); }, hideDelay || 5000); }; alertNote.hide = function () { h(div); clearTimeout(); }; return alertNote; }()); var constants = { DISABLE_FOR_THIS_INSTANCE: 'Disable for this instance' }; var moduleGlobal = {}; // Customized version of devtools-detect: // https://github.com/sindresorhus/devtools-detect/blob/gh-pages/index.js /*! devtools-detect Detect if DevTools is open https://github.com/sindresorhus/devtools-detect by Sindre Sorhus MIT License */ (function (scope) { scope = scope || {}; var devtools = { open: false, orientation: null }; var threshold = 160; var emitEvent = function (state, orientation) { // https://github.com/sindresorhus/devtools-detect/issues/9 // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#Polyfill window.dispatchEvent(new CustomEvent('console-panel-devtoolschange', { detail: { open: state, orientation: orientation } })); }; // TODO: // Currently, getDevToolsStatus() and updateDevToolsStatus() have duplicated functionality / code. // Refactor them to reuse properly. var getDevToolsStatus = function () { var devtoolsStatus = {}; var widthThreshold = window.outerWidth - window.innerWidth > threshold; var heightThreshold = window.outerHeight - window.innerHeight > threshold; var orientation = widthThreshold ? 'vertical' : 'horizontal'; if (!(heightThreshold && widthThreshold) && ((window.Firebug && window.Firebug.chrome && window.Firebug.chrome.isInitialized) || widthThreshold || heightThreshold)) { devtoolsStatus.open = true; devtoolsStatus.orientation = orientation; } else { devtoolsStatus.open = false; devtoolsStatus.orientation = null; } return devtoolsStatus; }; scope.getDevToolsStatus = getDevToolsStatus; var updateDevToolsStatus = function () { var widthThreshold = window.outerWidth - window.innerWidth > threshold; var heightThreshold = window.outerHeight - window.innerHeight > threshold; var orientation = widthThreshold ? 'vertical' : 'horizontal'; if (!(heightThreshold && widthThreshold) && ((window.Firebug && window.Firebug.chrome && window.Firebug.chrome.isInitialized) || widthThreshold || heightThreshold)) { if (!devtools.open || devtools.orientation !== orientation) { emitEvent(true, orientation); } devtools.open = true; devtools.orientation = orientation; } else { if (devtools.open) { emitEvent(false, null); } devtools.open = false; devtools.orientation = null; } return devtools; }; scope.updateDevToolsStatus = updateDevToolsStatus; window.addEventListener('resize', function (e) { if (e.target !== window) { return; } updateDevToolsStatus(); }); })(moduleGlobal); var ready = function (cb) { if (document.readyState !== 'loading') { cb(); } else { document.addEventListener('DOMContentLoaded', cb); } }; var getFullKey = function (key) { return 'userPreference-' + key; }; var defaultUserPreference = {}; defaultUserPreference[getFullKey('consolePanelHeight')] = '250'; var getLocalStorage = function (key) { try { return localStorage[key]; } catch (e) { return undefined; } }; var setLocalStorage = function (key, value) { try { localStorage[key] = value; return true; } catch (e) { return false; } }; var userPreference = function (preference, value) { var fullKey = getFullKey(preference); if (typeof value !== 'undefined') { return setLocalStorage(fullKey, value); } else { var retValue = getLocalStorage(fullKey); if (typeof retValue === 'undefined') { return defaultUserPreference[fullKey]; } return retValue; } }; var sanitizeHTML = function (html) { return ('' + html) .replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """) .replace(/'/g, "'") .replace(/\//g, "/"); }; var sanitizedInnerHTML = function (el, html) { el.innerHTML = sanitizeHTML(html); }; var ellipsis = function (str, length) { if (!length || length <= 3) { return str; } else { if (str.length > length) { return str.substr(0, length - 3) + '...'; } else { return str; } } }; var getResourceUrlFromPath = function (path) { path = path || ''; path = path.replace(/:[0-9]+$/, ''); // Sometimes, we may get line number and character number both path = path.replace(/:[0-9]+$/, ''); // Sometimes, we may get only line number return path; }; var getResourceLineCharacterFromPath = function (path) { path = path || ''; path = path.split('/').pop(); return path; }; var getCurrentExecutionDetails = function (options) { var skipLevels = options.skipLevels || 1; var executionDetails = { stack: null, resourceLineCharacter: null, resourceUrlLineCharacter: null, resourceUrl: null }; var errStr = ''; if (Object.keys(options).indexOf('stack') >= 0) { if (options.stack) { errStr = options.stack; } else { errStr = ''; } } else { try { // IMPORTANT: // If you have enabled "Pause on caught exceptions" feature in your browser's DevTools // and your debugging session is getting interrupted by this error, please check the // stack trace of current execution. You may find appropriate instructions to avoid // that problem. throw new Error(''); } catch (e) { errStr = e.stack || ''; } } var arrStack; var isGecko = (navigator.userAgent.toLowerCase().indexOf('gecko') !== -1 && navigator.userAgent.toLowerCase().indexOf('like gecko') === -1); if (isGecko) { arrStack = errStr.split(/\n[\s]*/).map(function (str) { var split = str.split('@'); return split[split.length - 1]; }); arrStack.splice(0, skipLevels - 1); } else { arrStack = errStr.split(/\n[\s]+at[\s]/); arrStack.splice(0, skipLevels); } var stackToReport = errStr.split(/\n/); if (stackToReport[0] === 'Error') { stackToReport.splice(1, skipLevels - 1); } else { stackToReport.splice(0, skipLevels - 1); } stackToReport = stackToReport.join('\n'); var relevantString = arrStack[0]; if (relevantString && relevantString.indexOf('(') >= 0) { relevantString = relevantString.substr(relevantString.indexOf('(') + 1); relevantString = relevantString.substr(0, relevantString.indexOf(')')); } executionDetails = { stack: stackToReport, resourceLineCharacter: getResourceLineCharacterFromPath(relevantString), resourceUrlLineCharacter: relevantString, resourceUrl: getResourceUrlFromPath(relevantString) }; return executionDetails; }; // https://bytes.babbel.com/en/articles/2014-09-09-javascript-function-call-interception.html // Note that the code from that blog post has been corrected below var after = function (object, method, fn, context) { context = context || object; var originalMethod = object[method]; object[method] = function () { // originalMethod may be null (eg: If we wish to intercept window.onerror, and window.onerror might be null) if (typeof originalMethod === 'function') { // IMPORTANT: // If you are seeing the following line for log entries in the native console and wish to get rid of it, // please use the following command to disable consolePanel: // consolePanel.disable() originalMethod.apply(context, arguments); } // IMPORTANT: // If you are encountering the following line in stack trace for "Pause on caught exceptions" feature in your // browser's DevTools and your debugging session is getting interrupted by it, please run the following command to // disable logging line numbers in consolePanel // consolePanel.disableReportLogLines() fn.apply(context, arguments); }; return originalMethod; }; var varConsole; // If "console" has a special implementation (applicable for Microsoft Edge (EdgeHTML) and Internet Explorer) if ((Object.getPrototypeOf(console)).log) { varConsole = (Object.getPrototypeOf(console)); } else { varConsole = console; } // Definition of ConsolePanel class var ConsolePanel = (function () { var ConsolePanel = function () { this.originals = {}; this.arrLogs = []; this.config = { reportLogLines: true }; this.domReady = false; this.enabled = false; }; ConsolePanel.prototype.setButtonPosition = function (position) { this.devToolsIconContainer.className = 'dev-tools-icon-container dev-tools-icon-container-' + position; }; ConsolePanel.prototype.showDevToolsIconContainer = function () { if (!this.isConsolePanelVisible()) { this.devToolsIconContainer.style.display = 'block'; } }; ConsolePanel.prototype.hideDevToolsIconContainer = function () { this.devToolsIconContainer.style.display = 'none'; }; ConsolePanel.prototype.isDevToolsIconContainerVisible = function () { return this.devToolsIconContainer.style.display === 'block'; }; ConsolePanel.prototype.isConsolePanelVisible = function () { return this.devTools.style.display === 'block'; }; ConsolePanel.prototype.hideConsolePanel = function () { this.devTools.style.display = 'none'; }; ConsolePanel.prototype.showConsolePanel = function () { this.devTools.style.display = 'block'; this.flushLogsToUIAsync(); }; ConsolePanel.prototype.hideBecauseDevToolsIsOpen = function () { var that = this; //alertNote('Disabled console-panel', null, { verticalAlignment: 'bottom', horizontalAlignment: 'right' }); that.disable(); that.hideDevToolsIconContainer(); that.hideConsolePanel(); }; ConsolePanel.prototype.showBecauseDevToolsIsClosed = function () { var that = this; that.enable(that.config); if (that.isDevToolsIconContainerVisible()) { alertNote.hide(); } }; ConsolePanel.prototype.hasStrongNotification = function () { var strongNotificationFor = this.config.strongNotificationFor; var skipStrongNotificationIfNoStackTrace = this.config.skipStrongNotificationIfNoStackTrace; var showStrongNotification = false; var arrLogs = this.arrLogs; for (var i = 0; i < arrLogs.length; i++) { var log = arrLogs[i], logMode = log.logMode; if (Date.now() <= (arrLogs[i].time.getTime() + 1500)) { if (skipStrongNotificationIfNoStackTrace && !log.initiator.stack) ; else if ((logMode === 'window.onerror' && strongNotificationFor.indexOf('window.onerror') >= 0) || (logMode === 'error' && strongNotificationFor.indexOf('console.error') >= 0) || (logMode === 'warn' && strongNotificationFor.indexOf('console.warn') >= 0) || (logMode === 'info' && strongNotificationFor.indexOf('console.info') >= 0) || (logMode === 'log' && strongNotificationFor.indexOf('console.log') >= 0)) { showStrongNotification = true; break; } } } return showStrongNotification; }; ConsolePanel.prototype.getRecommendedClassNameForDevToolsIcon = function () { var recommendedClassName = 'found-something'; var foundError = false, foundWarn = false, foundInfo = false, foundLog = false; var arrLogs = this.arrLogs; for (var i = 0; i < arrLogs.length; i++) { var logMode = arrLogs[i].logMode; if (logMode === 'error' || logMode === 'window.onerror') { foundError = true; } else if (logMode === 'warn') { foundWarn = true; } else if (logMode === 'info') { foundInfo = true; } else if (logMode === 'log') { foundLog = true; } } if (foundError) { recommendedClassName = 'found-error'; } else if (foundWarn) { recommendedClassName = 'found-warn'; } else if (foundInfo) { recommendedClassName = 'found-info'; } else if (foundLog) { recommendedClassName = 'found-log'; } return recommendedClassName; }; ConsolePanel.prototype.areThereUnreadRelevantMessages = function (relevantMessages) { var arrLogs = this.arrLogs; if (arrLogs.length) { if (relevantMessages === 'all') { return true; } else if (Array.isArray(relevantMessages)) { for (var i = 0; i < arrLogs.length; i++) { var normalizedLogMode = arrLogs[i].logMode; if (normalizedLogMode !== 'window.onerror') { normalizedLogMode = 'console.' + normalizedLogMode; } if (relevantMessages.indexOf(normalizedLogMode) >= 0) { return true; } } } } return false; }; ConsolePanel.prototype.flushCountToIcon = function () { var devToolsIconStrongNotification = this.devToolsIconStrongNotification, devToolsIcon = this.devToolsIcon; if (this.config.showOnlyForTheseRelevantMessages) { var relevantMessages = this.config.showOnlyForTheseRelevantMessages; if (this.areThereUnreadRelevantMessages(relevantMessages)) { this.showDevToolsIconContainer(); } } var arrLogs = this.arrLogs; if (arrLogs.length) { devToolsIcon.innerHTML = arrLogs.length; devToolsIcon.title = arrLogs.length + ' unread message' + (arrLogs.length === 1 ? '' : 's'); var recommendedClassName = this.getRecommendedClassNameForDevToolsIcon(); var showStrongNotification = this.hasStrongNotification(); devToolsIcon.className = 'dev-tools-icon ' + recommendedClassName; devToolsIconStrongNotification.className = (function () { if (showStrongNotification) { return 'strong-notification'; } else { return ''; } }()); if (showStrongNotification) { var dataLastStrongNotification = Date.now(); devToolsIconStrongNotification.setAttribute('data-last-strong-notification', dataLastStrongNotification); var animationDuration = 1500; setTimeout(function () { if (dataLastStrongNotification === parseInt(devToolsIconStrongNotification.getAttribute('data-last-strong-notification'), 10)) { devToolsIconStrongNotification.removeAttribute('data-last-strong-notification'); devToolsIconStrongNotification.classList.remove('strong-notification'); } }, animationDuration); } } else { devToolsIcon.innerHTML = ''; devToolsIcon.removeAttribute('title'); devToolsIcon.className = 'dev-tools-icon no-unread-messages'; devToolsIconStrongNotification.classList.remove('strong-notification'); } }; ConsolePanel.prototype.flushLogsToUIAsync = function () { var that = this; // Using 2 requestAnimationFrame() to avoid performance issues requestAnimationFrame(function () { requestAnimationFrame(function () { that.flushLogsToUI(); }); }); }; ConsolePanel.prototype.flushLogsToUI = function () { this.flushCountToIcon(); if (!this.isConsolePanelVisible()) { return; } var shouldScrollToBottom = false; var logger = this.logger; if (logger.scrollHeight === logger.scrollTop + logger.offsetHeight) { shouldScrollToBottom = true; } var arrLogs = this.arrLogs; while (arrLogs.length) { var item = arrLogs.shift(); var logMode = item.logMode, logEntry = item.logEntry, initiator = item.initiator, time = item.time; var consoleMessageWrapper = document.createElement('div'); this.loggerBody.appendChild(consoleMessageWrapper); consoleMessageWrapper.title = 'Logged at ' + time.toTimeString().substring(0, 8); consoleMessageWrapper.className = 'dev-tools-console-message-wrapper ' + (function () { if (logMode === 'log') { return 'log-mode-log'; } // Note: This CSS class is not being used yet else if (logMode === 'info') { return 'log-mode-info'; } else if (logMode === 'warn') { return 'log-mode-warn'; } else if (logMode === 'error') { return 'log-mode-error'; } else if (logMode === 'window.onerror') { return 'log-mode-window-onerror'; } else if (logMode === 'clear') { return 'log-mode-clear'; } // Note: This CSS class is not being used yet else if (logMode === 'unhandled') { return 'log-mode-unhandled'; } else { return 'log-mode-unknown'; } }()); var divLogExecution = document.createElement('div'); consoleMessageWrapper.appendChild(divLogExecution); divLogExecution.className = 'dev-tools-console-message-code-line'; divLogExecution.innerHTML = (function (initiator) { if (initiator.resourceLineCharacter) { var str = '' + sanitizeHTML(initiator.resourceLineCharacter) + ''; return str; } else { return ''; } }(initiator)); var consoleMessage = document.createElement('div'); consoleMessageWrapper.appendChild(consoleMessage); consoleMessage.className = 'dev-tools-console-message'; var span; if (logEntry.length === 0) { span = document.createElement('span'); consoleMessage.appendChild(span); span.innerHTML = ' '; } else { for (var i = 0; i < logEntry.length; i++) { if (i > 0) { var spacer = document.createElement('span'); consoleMessage.appendChild(spacer); spacer.innerHTML = ' '; } span = document.createElement('span'); consoleMessage.appendChild(span); var updateDom = function (options) { var className = options.className || 'log-value-unknown'; var valueToLog = options.valueToLog; var container = span; container.className = className; if (className === 'log-value-unknown' || className === 'log-value-object' || className === 'log-value-array') { if (typeof JSONEditor === 'undefined') { container.classList.add('jsoneditor-not-available'); if (Array.isArray(valueToLog)) { sanitizedInnerHTML(container, String('[' + valueToLog.length + ']')); } else if (typeof valueToLog === 'object') { sanitizedInnerHTML(container, String('{' + Object.keys(valueToLog).length + '}')); } else { sanitizedInnerHTML(container, String(typeof valueToLog) + ' (' + String(valueToLog) + ')'); } } else { var jsonEditorOptions = { mode: 'view', navigationBar: false, search: false, sortObjectKeys: true }; var editor = new JSONEditor(container, jsonEditorOptions); editor.set(valueToLog); editor.collapseAll(); } } else if (className === 'log-value-dom') { var firstLineOfValueToLog = valueToLog.split('\n')[0]; var hasMultilineHTML = false; if (firstLineOfValueToLog !== valueToLog) { hasMultilineHTML = true; } var renderFullCode = function () { var spanFullCode = document.createElement('span'); container.appendChild(spanFullCode); spanFullCode.className = 'all-lines-of-code'; spanFullCode.innerHTML = '
' +
                                                sanitizeHTML(valueToLog) +
                                                '
'; if (typeof Prism !== 'undefined') { Prism.highlightAllUnder(spanFullCode); } return spanFullCode; }; if (hasMultilineHTML) { var spanExpandCollapse = document.createElement('span'); container.appendChild(spanExpandCollapse); spanExpandCollapse.className = 'console-panel-expand-collapse console-panel-collapsed'; var spanFullCode; var spanFirstLine = document.createElement('span'); container.appendChild(spanFirstLine); spanFirstLine.className = 'only-first-line-of-code'; spanFirstLine.innerHTML = '
' +
                                                sanitizeHTML(firstLineOfValueToLog) +
                                                '
'; if (typeof Prism !== 'undefined') { Prism.highlightAllUnder(spanFirstLine); } spanExpandCollapse.addEventListener('click', function (evt) { var currentlyInCollapsedState = spanExpandCollapse.classList.contains('console-panel-collapsed'); if (currentlyInCollapsedState) { spanFirstLine.style.display = 'none'; if (spanFullCode) { spanFullCode.style.display = ''; } else { spanFullCode = renderFullCode(); } } else { spanFirstLine.style.display = ''; spanFullCode.style.display = 'none'; } spanExpandCollapse.classList.toggle('console-panel-collapsed'); spanExpandCollapse.classList.toggle('console-panel-expanded'); }); } else { renderFullCode(); } } else { container.innerHTML = String(valueToLog); // To ensure that we are setting a string as innerHTML } }; updateDom(logEntry[i]); } } // Show call stack along with console.warn and console.error messages if (['error', 'warn'].indexOf(logMode) >= 0) { if (initiator.stack) { var div = document.createElement('div'); consoleMessage.appendChild(div); div.className = 'log-call-stack'; var initiatorStack = initiator.stack.split('\n'); initiatorStack.shift(); initiatorStack = initiatorStack.join('\n'); div.innerHTML = sanitizeHTML(initiatorStack); } } } if (shouldScrollToBottom && consoleMessageWrapper) { consoleMessageWrapper.scrollIntoView(false); } this.flushCountToIcon(); }; ConsolePanel.prototype.logArrayEntry = function (options) { var type = options.type || 'unknown', initiator = options.initiator || {}, value = options.value; var className = 'log-value-unknown', valueToLog = 'not-handled'; if (type === 'boolean') { className = 'log-value-boolean'; valueToLog = value; } else if (type === 'number') { className = 'log-value-number'; valueToLog = value; } else if (type === 'string') { className = 'log-value-string'; valueToLog = sanitizeHTML(ellipsis(value.toString(), 5003)); } else if (type === 'document.all') { className = 'log-value-document-all'; // TODO: Not handled in CSS yet valueToLog = value; } else if (type === 'undefined') { className = 'log-value-undefined'; valueToLog = value; } else if (type === 'null') { className = 'log-value-null'; valueToLog = value; } else if (type === 'function') { className = 'log-value-function'; valueToLog = value; } else if (type === 'console.clear') { className = 'log-value-console-clear'; valueToLog = value; } else if (type === 'dom') { className = 'log-value-dom'; valueToLog = value.outerHTML; } else if (type === 'dom-text') { className = 'log-value-dom-text'; valueToLog = value.textContent; } else if (type === 'window.onerror') { className = 'log-value-window-onerror'; var errorMessageToLog = (function () { // https://blog.sentry.io/2016/01/04/client-javascript-reporting-window-onerror var strError = 'An error occurred'; var error = value.error; try { strError = error[4].stack; } catch (e) { try { strError = value.error[0] + '\n' + value.error[1] + ':' + value.error[2] + (typeof value.error[3] === 'undefined' ? '' : ':' + value.error[3]); } catch (e) { // do nothing } } return strError; }()); valueToLog = sanitizeHTML(errorMessageToLog); } else if (type === 'array') { className = 'log-value-array'; valueToLog = JSON.parse(CircularJSON.stringify(value, null, '', "[Circular]")); } else if (type === 'object') { className = 'log-value-object'; valueToLog = JSON.parse(CircularJSON.stringify(value, null, '', "[Circular]")); } else { className = 'log-value-unknown'; // TODO: Not handled in CSS yet. valueToLog = JSON.parse(CircularJSON.stringify(value, null, '', "[Circular]")); } return { className: className, initiator: initiator, valueToLog: valueToLog }; }; ConsolePanel.prototype.markLogEntry = function (logMode, args) { var entryToPush = []; for (var i = 0; i < args.length; i++) { var msg = args[i]; // TODO: // Handle various native objects // References: // http://xahlee.info/js/js_Object.prototype.toString.html // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString // https://gist.github.com/pbakondy/f442e91995e9d206c056 // Use: // var objectType = Object.prototype.toString.call(msg); var logEntryType = 'unknown'; // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof#Description if (typeof msg === 'boolean') { logEntryType = 'boolean'; } else if (typeof msg === 'function') { logEntryType = 'function'; } else if (typeof msg === 'number') { logEntryType = 'number'; } else if (typeof msg === 'string') { logEntryType = 'string'; } else if (typeof msg === 'symbol') { logEntryType = 'unknown'; } // TODO: Currently using logEntryType as 'unknown' for 'symbol' else if (typeof msg === 'object') { if (msg === null) { logEntryType = 'null'; } else if (msg instanceof HTMLElement) { logEntryType = 'dom'; } // Note: This may not work well for nodes across iframes. See: https://stackoverflow.com/questions/13894644/having-trouble-with-dom-nodes-and-instanceof/13895357#13895357 else if (msg instanceof Text) { logEntryType = 'dom-text'; } // Note: This may not work well for nodes across iframes. See: https://stackoverflow.com/questions/13894644/having-trouble-with-dom-nodes-and-instanceof/13895357#13895357 else { if (logMode === 'window.onerror') { logEntryType = 'window.onerror'; } else if (Array.isArray(msg)) { logEntryType = 'array'; } else { logEntryType = 'object'; } } // TODO: // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects // Handle various objects, like: // * "Array" object // * "Date" object // * Error objects // * Error, EvalError, InternalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError // * "Function" object // * "Arguments" object // * various nodeTypes (for example: "Comment" node) // https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType#Node_type_constants // * "RegExp" object // * "global" object // * "Math" object // * "JSON" object // * Indexed_collections // * Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array // * Keyed_collections // * Map, Set, WeakMap, WeakSet // * Structured_data // * ArrayBuffer, SharedArrayBuffer, Atomics, DataView // * Control_abstraction_objects // * Promise, Generator, GeneratorFunction, AsyncFunction // * Reflection // * Reflect, Proxy // * Internationalization // * Intl, Intl.Collator, Intl.DateTimeFormat, Intl.NumberFormat // * WebAssembly // * WebAssembly, WebAssembly.Module, WebAssembly.Instance, WebAssembly.Memory, WebAssembly.Table, WebAssembly.CompileError, WebAssembly.LinkError, WebAssembly.RuntimeError } else if (typeof msg === 'undefined') { if (msg === document.all) { logEntryType = 'document.all'; } // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof#Exceptions else { logEntryType = 'undefined'; } } else { logEntryType = 'unknown'; } // Handle any unknown "typeof" entryToPush.push(this.logArrayEntry({ type: logEntryType, value: msg })); } var report = { logMode: logMode, time: new Date(), logEntry: entryToPush }; if (this.config.reportLogLines) { if (logMode === 'window.onerror') { report.initiator = getCurrentExecutionDetails({ skipLevels: 0, stack: (args[0].error[4] || {}).stack }); } else { report.initiator = getCurrentExecutionDetails({ skipLevels: 5 }); } } else { report.initiator = {}; } var that = this; that.arrLogs.push(report); ready(function () { that.flushLogsToUIAsync(); }); }; ConsolePanel.prototype.clear = function () { var that = this; var reportLogLines = that.config.reportLogLines; // Since console is being cleared, "arrLogs" can be emptied that.arrLogs = []; that.arrLogs.push({ logMode: 'clear', time: new Date(), logEntry: [ that.logArrayEntry({ type: 'console.clear', value: 'Console was cleared' }) ], initiator: reportLogLines ? getCurrentExecutionDetails({ skipLevels: 4 }) : {} }); that.loggerBody.innerHTML = ''; that.flushLogsToUIAsync(); }; ConsolePanel.prototype.setupIntercept = function () { var that = this; var originals = that.originals; var functionsToIntercept = that.config.functionsToIntercept; var interceptIfRequired = function (type, original, cb) { if (functionsToIntercept === 'all' || functionsToIntercept.indexOf(type) >= 0) { return cb(); } else { return original; } }; originals['window.onerror'] = interceptIfRequired('window.onerror', originals['window.onerror'], function () { return after(window, 'onerror', function () { that.markLogEntry('window.onerror', [{ error: arguments }]); }); }); // Note: console.clear() would be intercepted in all cases, therefore, not using interceptIfRequired() originals['console.clear'] = after(varConsole, 'clear', function () { that.clear(); }, console); originals['console.log'] = interceptIfRequired('console.log', originals['console.log'], function () { return after(varConsole, 'log', function () { that.markLogEntry('log', arguments); }, console); }); originals['console.info'] = interceptIfRequired('console.info', originals['console.info'], function () { return after(varConsole, 'info', function () { that.markLogEntry('info', arguments); }, console); }); originals['console.warn'] = interceptIfRequired('console.warn', originals['console.warn'], function () { return after(varConsole, 'warn', function () { that.markLogEntry('warn', arguments); }, console); }); originals['console.error'] = interceptIfRequired('console.error', originals['console.error'], function () { return after(varConsole, 'error', function () { that.markLogEntry('error', arguments); }, console); }); Object.keys(varConsole).forEach(function (key) { if (['log', 'info', 'warn', 'error', 'clear'].indexOf(key) === -1) { if (typeof varConsole[key] === 'function') { originals['console.' + key] = interceptIfRequired(key, originals['console.' + key], function () { return after(varConsole, key, function () { that.markLogEntry('unhandled', arguments); }, console); }); } } }); }; ConsolePanel.prototype.render = function () { var that = this; var consolePanelContainer = document.createElement('div'); consolePanelContainer.id = 'console-panel'; document.body.appendChild(consolePanelContainer); var devToolsIconContainer = document.createElement('div'); this.devToolsIconContainer = devToolsIconContainer; consolePanelContainer.appendChild(devToolsIconContainer); var devToolsIconStrongNotification = document.createElement('div'); this.devToolsIconStrongNotification = devToolsIconStrongNotification; devToolsIconContainer.appendChild(devToolsIconStrongNotification); var devToolsIcon = document.createElement('div'); this.devToolsIcon = devToolsIcon; devToolsIcon.className = 'dev-tools-icon no-unread-messages'; devToolsIcon.addEventListener('click', function (evt) { that.showConsolePanel(); that.hideDevToolsIconContainer(); }); this.hideDevToolsIconContainer(); devToolsIconStrongNotification.appendChild(devToolsIcon); var devTools = document.createElement('div'); this.devTools = devTools; consolePanelContainer.appendChild(devTools); devTools.className = 'dev-tools'; this.hideConsolePanel(); devTools.style.height = (function () { parseInt(userPreference('consolePanelHeight'), 10); return plugin.settings.consoleHeight + 'px'; }()); // Just a block { var devToolsHeader = document.createElement('div'); devTools.appendChild(devToolsHeader); devToolsHeader.className = 'dev-tools-header'; // Just a block { var consoleDragHandle = document.createElement('div'); devToolsHeader.appendChild(consoleDragHandle); consoleDragHandle.className = 'dev-tools-resize-handle'; consoleDragHandle.innerHTML = ' '; var crossIcon = document.createElement('div'); devToolsHeader.appendChild(crossIcon); crossIcon.title = 'Close'; crossIcon.className = 'dev-tools-header-cross-icon'; crossIcon.addEventListener('click', function (evt) { that.hideConsolePanel(); that.showDevToolsIconContainer(); }); var disableIcon = document.createElement('div'); that.disableIcon = disableIcon; disableIcon.title = constants.DISABLE_FOR_THIS_INSTANCE; disableIcon.className = 'dev-tools-header-disable-icon'; disableIcon.addEventListener('click', function (evt) { if (that.config && typeof that.config.beforeDisableButtonClick === 'function') { var doContinue = that.config.beforeDisableButtonClick(); if (doContinue === false) { return; } } that.hideConsolePanel(); that.disable(); }); devToolsHeader.appendChild(disableIcon); var clearConsoleIcon = document.createElement('div'); devToolsHeader.appendChild(clearConsoleIcon); clearConsoleIcon.title = 'Clear'; clearConsoleIcon.className = 'dev-tools-clear-console-icon'; clearConsoleIcon.addEventListener('click', function (evt) { // For most of the situations/browsers, the call to that.clear() is redundant here because immediately // after it, we are calling console.clear() which internally calls that.clear() // But, in some cases, if console.clear() call is not intercepted (eg: In some situations // in IE / Edge or for any future changes where console.clear() may be skipped from // interception), then we shall call it manually. that.clear(); console.clear(); }); var consoleTitle = document.createElement('div'); devToolsHeader.appendChild(consoleTitle); consoleTitle.innerHTML = 'Console'; consoleTitle.style.cssFloat = 'left'; } if ($ && $.fn && $.fn.resizable) { // Just a preventive try...catch block try { var $devTools = $('.dev-tools'); if ($.ui) { // http://api.jqueryui.com/resizable/#option-handles consoleDragHandle.classList.add('ui-resizable-handle'); consoleDragHandle.classList.add('ui-resizable-n'); $devTools.resizable({ handles: { n: $devTools.find('.dev-tools-resize-handle') }, stop: function (evt, ui) { userPreference('consolePanelHeight', ui.size.height); } }); } else { $devTools.resizable({ handleSelector: '.dev-tools-resize-handle', resizeWidth: false, resizeHeightFrom: 'top', onDragEnd: function (e, $el, opt) { userPreference('consolePanelHeight', $el.outerHeight()); } }); } // Use this styling only when the resizing has been setup consoleDragHandle.style.cursor = 'n-resize'; } catch (e) { alertNote('Error in setting up "resize" for console-panel' + ' (' + 'Learn more' + ')', 10000); } } var logger = document.createElement('div'); this.logger = logger; devTools.appendChild(logger); logger.className = 'dev-tools-console'; // Just a block { var loggerHeader = document.createElement('div'); logger.appendChild(loggerHeader); loggerHeader.className = 'dev-tools-console-header'; var loggerBody = document.createElement('div'); this.loggerBody = loggerBody; logger.appendChild(loggerBody); loggerBody.className = 'dev-tools-console-body'; } } window.addEventListener('console-panel-devtoolschange', function (e) { if (that.config.doNotUseWhenDevToolsMightBeOpenInTab) { if (e.detail.open) { that.hideBecauseDevToolsIsOpen(); } else { that.showBecauseDevToolsIsClosed(); } } }); moduleGlobal.updateDevToolsStatus(); // Ensure that the 'console-panel-devtoolschange' event gets fired once (if required) }; /* config {} position Summary: Position of console-panel's icon Type: string Supported positions: "top-left", "top-right", "bottom-left", "bottom-right" Default value: "bottom-right", Example value: "top-right" functionsToIntercept Summary: List of console functions which should be intercepted Type: OR "all" OR array (of strings) Supported function names: "window.onerror", "console.error", "console.warn", "console.info", "console.log" Default value: "all", Example value: ["window.onerror", "console.error"] Notes: console.clear() would always get intercepted when console-panel is enabled showOnlyForTheseRelevantMessages Summary: List of console function calls for which console-panel icon should be shown Type: OR "all" OR array (of strings) Supported function names: "window.onerror", "console.error", "console.warn", "console.info", "console.log" Default value: null Example value: ["window.onerror", "console.error", "console.warn"] Notes: If it is a , then console-panel notification icon would be shown all the time strongNotificationFor Summary: List of console function calls for which console-panel notification should be shown strongly Type: OR array (of strings) Supported function names: "window.onerror", "console.error", "console.warn", "console.info", "console.log" Default value: ["window.onerror", "console.error"] Example value: ["window.onerror", "console.error", "console.warn"] skipStrongNotificationIfNoStackTrace Summary: When it is set as true, "strong-notification" effect is not shown for errors for which stack trace is not available. This can be used to avoid highlighting errors which are occurring due to a cross-origin / third-party script. Type: boolean Allowed values: OR Default value: false Example value: false reportLogLines Summary: When it is set as true, the corresponding code line is mentioned along with each console entry. When it is set as true, it may interrupt your debugging session if you are using the "Pause on caught exceptions" feature in browser DevTools Type: boolean Allowed values: OR Default value: true Example value: true doNotUseWhenDevToolsMightBeOpenInTab Summary: Disable console-panel if browser DevTools might be open within the tab Type: boolean Allowed values: OR Default value: false Example value: false Reference: https://github.com/sindresorhus/devtools-detect#support disableButtonTitle Summary: Customize the title for the "disable" button in console-panel Type: string Allowed values: Any non-empty string Default value: "Disable for this instance" Example value: "Disable\n(and keep disabled)" beforeDisableButtonClick Summary: Function to be called before performing the default action for "disable" button Type: function Example value: function () { localStorage['console-panel-status'] = 'disabled'; } Notes: If this function returns boolean "false", then the default action would not be performed */ ConsolePanel.prototype.enable = function (config) { config = config || {}; var that = this; // If consolePanel is already enabled if (that.enabled) { // Disable consolePanel that.disable(); } var functionsToIntercept = (function () { if (Array.isArray(config.functionsToIntercept)) { return config.functionsToIntercept; } else { return 'all'; } }()), showOnlyForTheseRelevantMessages = config.showOnlyForTheseRelevantMessages || null, strongNotificationFor = config.strongNotificationFor || ['window.onerror', 'console.error'], skipStrongNotificationIfNoStackTrace = config.skipStrongNotificationIfNoStackTrace || false, reportLogLines = typeof config.reportLogLines === 'undefined' ? true : !!config.reportLogLines, doNotUseWhenDevToolsMightBeOpenInTab = typeof config.doNotUseWhenDevToolsMightBeOpenInTab === 'undefined' ? false : config.doNotUseWhenDevToolsMightBeOpenInTab, disableButtonTitle = (typeof config.disableButtonTitle === 'string' && config.disableButtonTitle !== '') ? config.disableButtonTitle : constants.DISABLE_FOR_THIS_INSTANCE, beforeDisableButtonClick = config.beforeDisableButtonClick, position = (function () { switch (config.position) { case 'top-left': case 'top-right': case 'bottom-left': case 'bottom-right': case 'left-top': case 'left-bottom': case 'right-top': case 'right-bottom': return config.position; default: return 'bottom-right'; } }()); (function (config) { config.functionsToIntercept = functionsToIntercept; config.showOnlyForTheseRelevantMessages = showOnlyForTheseRelevantMessages; config.strongNotificationFor = strongNotificationFor; config.skipStrongNotificationIfNoStackTrace = skipStrongNotificationIfNoStackTrace; config.doNotUseWhenDevToolsMightBeOpenInTab = doNotUseWhenDevToolsMightBeOpenInTab; config.disableButtonTitle = disableButtonTitle; config.beforeDisableButtonClick = beforeDisableButtonClick; config.position = position; }(that.config)); that.setupIntercept(); if (reportLogLines) { that.enableReportLogLines(); } else { that.disableReportLogLines(); } if (!that.domReady) { ready(function () { that.render(); that.domReady = true; }); } ready(function () { that.setButtonPosition(position); that.disableIcon.title = disableButtonTitle; if (showOnlyForTheseRelevantMessages || (that.config.doNotUseWhenDevToolsMightBeOpenInTab && (function () { var devtoolsStatus = moduleGlobal.getDevToolsStatus(); return devtoolsStatus && devtoolsStatus.open; }()))) ; else { that.showDevToolsIconContainer(); } that.flushLogsToUIAsync(); }); that.enabled = true; }; ConsolePanel.prototype.disable = function () { var that = this; // Restore window.onerror window.onerror = that.originals['window.onerror']; // Restore console functions Object.keys(varConsole).forEach(function (key) { if (that.originals['console.' + key]) { // Ensure that we have over-ridden that console member (function) varConsole[key] = that.originals['console.' + key]; } }); that.enabled = false; }; ConsolePanel.prototype.enableReportLogLines = function () { this.config.reportLogLines = true; }; ConsolePanel.prototype.disableReportLogLines = function () { this.config.reportLogLines = false; }; return ConsolePanel; }()); window.consolePanel = new ConsolePanel(); window.consolePanel.enable(); window.consolePanel.showConsolePanel(); window.consolePanel.hideDevToolsIconContainer(); }()); window.consolePanel.enable(); } } class CommandsHelper { constructor(plugin) { this.plugin = plugin; } //,cb:()=>void; addCommand({ id, name, cb }) { this.plugin.addCommand({ id: id, name: name, checkCallback: (checking) => { let leaf = this.plugin.app.workspace.activeLeaf; if (leaf) { if (!checking) { cb(); } return true; } return false; } }); } } class Commands { constructor(plugin) { this.plugin = plugin; this.commandsHelper = new CommandsHelper(plugin); this.load_toggleConsole(); this.load_logHighlightedText(); this.load_evalHighlightedText(); } load_toggleConsole() { const { plugin, commandsHelper } = this; commandsHelper.addCommand({ id: 'Obsidian Dev Tools Plugin: Toggle Console', name: 'Toggle Console', cb: () => { plugin.consoleHelper.toggle(!this.plugin.settings.consoleOn); plugin.settings.consoleOn = !this.plugin.settings.consoleOn; plugin.saveSettings(); } }); } load_logHighlightedText() { const { plugin, commandsHelper } = this; commandsHelper.addCommand({ id: 'Obsidian Dev Tools Plugin: console.log() Highlighted Text', name: 'console.log() Highlighted Text', cb: () => { plugin.optionalLog(false); } }); } load_evalHighlightedText() { const { plugin, commandsHelper } = this; commandsHelper.addCommand({ id: 'Obsidian Dev Tools Plugin: console.log(eval) Highlighted Text', name: 'console.log(eval) Highlighted Text', cb: () => { plugin.optionalLog(true); } }); } } class ObsidianDevShortcuts { constructor(plugin) { this.plugin = plugin; } addTextInputSetting({ containerEl = undefined, name = ``, description = ``, placeholder = ``, key = ``, autoSetValue = true, onChange = () => { }, }) { const setting = new obsidian.Setting(containerEl); if (name.length > 0) { setting.setName(name); } if (description.length > 0) { setting.setDesc(description); } setting.addText((textElement) => { if (placeholder.length > 0) { textElement.setPlaceholder(placeholder); } const startingString = `${this.plugin.settings[key]}`; textElement.setValue(startingString); textElement.onChange((val) => __awaiter(this, void 0, void 0, function* () { if (autoSetValue) { this.plugin.settings[key] = val; yield this.plugin.saveSettings(); } if (onChange) { onChange(val, textElement, setting); } })); }); } addToggleInputSetting({ containerEl = undefined, name = ``, description = ``, key = ``, onChange = () => { }, }) { const setting = new obsidian.Setting(containerEl); if (name.length > 0) { setting.setName(name); } if (description.length > 0) { setting.setDesc(description); } setting.addToggle(toggle => { toggle.setValue(this.plugin.settings[key]); toggle.onChange((val) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings[key] = val; yield this.plugin.saveSettings(); if (onChange) { onChange(val, toggle, setting); } })); }); } isNumberGetNumber(value) { const isNumber = ((value != null) && (value !== '') && !isNaN(Number(value.toString()))); return isNumber ? Number(value) : null; } } const icons = [ "add-note-glyph", "any-key", "audio-file", "blocks", "bold-glyph", "box-glyph", "bracket-glyph", "broken-link", "bullet-list-glyph", "bullet-list", "calendar-glyph", "calendar-with-checkmark", "check-in-circle", "check-small", "checkbox-glyph", "checkmark", "clock-glyph", "clock", "cloud", "code-glyph", "command-glyph", "compress-glyph", "create-new", "cross-in-box", "cross", "crossed-star", "dice-glyph", "dice", "document", "documents", "dot-network", "double-down-arrow-glyph", "double-up-arrow-glyph", "down-arrow-with-tail", "down-chevron-glyph", "down-curly-arrow-glyph", "duplicate-glyph", "enlarge-glyph", "enter", "exit-fullscreen", "expand-vertically", "file-explorer-glyph", "filled-pin", "folder", "forward-arrow", "fullscreen", "gear", "go-to-file", "graph-glyph", "hashtag", "heading-glyph", "help", "highlight-glyph", "horizontal-split", "image-file", "image-glyph", "import-glyph", "indent-glyph", "info", "install", "italic-glyph", "keyboard-glyph", "languages", "left-arrow-with-tail", "left-arrow", "left-chevron-glyph", "lines-of-text", "link-glyph", "link", "links-coming-in", "links-going-out", "logo-crystal", "magnifying-glass", "merge-files-glyph", "merge-files", "microphone-filled", "microphone", "minus-with-circle", "navigate-glyph", "note-glyph", "number-list-glyph", "open-elsewhere-glyph", "open-vault", "pane-layout", "paper-plane-glyph", "paper-plane", "paste-text", "paste", "paused", "pdf-file", "pencil", "percent-sign-glyph", "pin", "play-audio-glyph", "plus-minus-glyph", "plus-with-circle", "popup-open", "presentation-glyph", "presentation", "price-tag-glyph", "question-mark-glyph", "quote-glyph", "redo-glyph", "reset", "restore-file-glyph", "right-arrow-with-tail", "right-arrow", "right-chevron-glyph", "right-triangle", "run-command", "scissors-glyph", "scissors", "search-glyph", "search", "select-all-text", "sheets-in-box", "split", "stacked-levels", "star-glyph", "star-list", "star", "stop-audio-glyph", "strikethrough-glyph", "switch", "sync-small", "sync", "tag-glyph", "three-horizontal-bars", "tomorrow-glyph", "trash", "two-blank-pages", "undo-glyph", "unindent-glyph", "up-and-down-arrows", "up-arrow-with-tail", "up-chevron-glyph", "up-curly-arrow-glyph", "uppercase-lowercase-a", "vault", "vertical-split", "vertical-three-dots", "workspace-glyph", "wrench-screwdriver-glyph", "yesterday-glyph" ]; class SettingsTab extends obsidian.PluginSettingTab { constructor(plugin) { super(plugin.app, plugin); this.plugin = plugin; this.shortcuts = new ObsidianDevShortcuts(plugin); } display() { const { containerEl } = this; containerEl.empty(); const { settings } = this.plugin; containerEl.createEl('h1', { text: 'Dev Tools Settings' }); containerEl.createEl('h2', { text: "Console" }); this.shortcuts.addTextInputSetting({ containerEl: containerEl, name: `Startup console height (need to restart Obsidian to take see changes):`, description: `${settings.consoleHeight}px`, placeholder: `${this.plugin.defaultSettings.consoleHeight} (default)`, key: 'consoleHeight', autoSetValue: false, onChange: ((text, textElement, settingElement) => __awaiter(this, void 0, void 0, function* () { const textToNumber = this.shortcuts.isNumberGetNumber(text.trim()); if (textToNumber != null) { settings.consoleHeight = textToNumber; yield this.plugin.saveSettings(); setTimeout(() => { settingElement.setDesc(`${settings.consoleHeight}px`); }, 1); } else { setTimeout(() => { if (text == '') { settingElement.setDesc(`Invalid height. Height set to ${this.plugin.defaultSettings.consoleHeight}px`); } else { settingElement.setDesc(`${settings.consoleHeight}px`); } }, 1); } })) }); containerEl.createEl('h2', { text: "Native Icons to View" }); for (let i = 0; i < icons.length; i++) { new obsidian.Setting(containerEl).setDesc(icons[i]).addButton(btn => { btn.setIcon(icons[i]); btn.onClick(e => { navigator.clipboard.writeText(icons[i]); new obsidian.Notice(`${icons[i]} copied to clipboard`); }); }); } /* shortcuts.addToggleInputSetting({ containerEl:containerEl, name:"Today's Daily Note Decal", description:todayDecalOn ? 'Decal Added to Navigator' : 'Decal Disabled on Navigator', key:'todayDecalOn', onChange:(val, toggle, setting)=>{ setting.setDesc(todayDecalOn ? 'Decal Added to Navigator' : 'Decal Disabled on Navigator') } }) shortcuts.addTextInputSetting({ containerEl:containerEl, name:'Decal Text', description:'Set text or html element for your decal', placeholder:'Default: *', key:'decalText', }) containerEl.createEl('h2', {text: "Creating Events"}) shortcuts.addTextInputSetting({ containerEl:containerEl, name:`JSON Directory (Obsidian doesn't see .json files)`, description:'Where do you want your event files saved? Note: If you change this, you will need to manually move files before you run a new command which accesses this directory. By default, this is in your config directory, which is in a hidden folder.', placeholder:'.obsidian/.daily-manager', key:'jsonDirectory', }) */ } } const DEFAULT_SETTINGS = { consoleOn: false, consoleHeight: 250, }; class ObsidianDevToolsPlugin extends obsidian.Plugin { loadSettings() { return __awaiter(this, void 0, void 0, function* () { this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData()); }); } saveSettings() { return __awaiter(this, void 0, void 0, function* () { yield this.saveData(this.settings); }); } optionalLog(evaluate = false) { let text = ''; if (window.getSelection) { text = window.getSelection().toString(); } if (text.length > 0) { this.consoleHelper[evaluate ? 'logEval' : 'log'](text); } } onload() { return __awaiter(this, void 0, void 0, function* () { yield this.loadSettings(); this.defaultSettings = DEFAULT_SETTINGS; this.addSettingTab(new SettingsTab(this)); this.consoleHelper = new ConsoleHelper(this, this.settings.consoleOn); new Commands(this); }); } } module.exports = ObsidianDevToolsPlugin; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9DbGFzc2VzL0NvbnNvbGVIZWxwZXIudHMiLCJzcmMvQ2xhc3Nlcy9Db21tYW5kcy50cyIsInNyYy9DbGFzc2VzL09ic2lkaWFuRGV2U2hvcnRjdXRzLnRzIiwic3JjL2RhdGEvaWNvbnMudHMiLCJzcmMvQ2xhc3Nlcy9TZXR0aW5nVGFiLnRzIiwic3JjL21haW4udHMiXSwic291cmNlc0NvbnRlbnQiOm51bGwsIm5hbWVzIjpbIlNldHRpbmciLCJQbHVnaW5TZXR0aW5nVGFiIiwiTm90aWNlIiwiUGx1Z2luIiwiU2V0dGluZ1RhYiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXVEQTtBQUNPLFNBQVMsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRTtBQUM3RCxJQUFJLFNBQVMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sS0FBSyxZQUFZLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsVUFBVSxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUNoSCxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLFVBQVUsT0FBTyxFQUFFLE1BQU0sRUFBRTtBQUMvRCxRQUFRLFNBQVMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDbkcsUUFBUSxTQUFT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