/*
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 = [
'
'
].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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