You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

734 lines
68 KiB

/*
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());
});
}
const DEFAULT_SETTINGS = {
expansionMode: 'expanded',
ignoreNulls: false,
nullValue: '',
skipKey: 'metatable',
ignoredKeys: [],
filterKeys: ['metatable', 'frontmatter'],
filterMode: 'ignore',
autolinks: false,
naked: false,
vault: null,
};
class MetatableSettingTab extends obsidian.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
return __awaiter(this, void 0, void 0, function* () {
const { containerEl, plugin } = this;
containerEl.empty();
containerEl.createEl('h2', { text: 'Metatable Settings' });
new obsidian.Setting(containerEl)
.setName('Expansion level')
.setDesc('Level of expansion of the metatable tree')
.addDropdown(drop => drop
.addOption('expanded', 'Fully expanded')
.addOption('leaf-collapsed', 'Collapse leafs')
.addOption('all-collapsed', 'Collapse all')
.addOption('root-collapsed', 'Collapse root')
.setValue(plugin.settings.expansionMode)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
plugin.settings.expansionMode = value;
yield plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName('Skip key')
.setDesc('When this key is found and `true`, the metatable will not be displayed')
.addText(text => text
.setValue(plugin.settings.skipKey)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
plugin.settings.skipKey = value;
yield plugin.saveSettings();
})));
containerEl.createEl('h3', { text: 'Nulls' });
new obsidian.Setting(containerEl)
.setName('Ignore null values')
.setDesc('Ignore any member with a null value.')
.addToggle(setting => setting
.setValue(plugin.settings.ignoreNulls)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
plugin.settings.ignoreNulls = value;
yield plugin.saveSettings();
this.display();
})));
if (!plugin.settings.ignoreNulls) {
new obsidian.Setting(containerEl)
.setName('Null value')
.setDesc('Text to show when a key has no value. Defaults to nothing')
.addText(text => text
.setValue(plugin.settings.nullValue)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
plugin.settings.nullValue = value;
yield plugin.saveSettings();
})));
}
containerEl.createEl('h3', { text: 'Filter' });
new obsidian.Setting(containerEl)
.setName('Filter mode')
.setDesc('Either ignore or keep the filter keys')
.addDropdown(drop => drop
.addOption('ignore', 'Ignore')
.addOption('keep', 'Keep')
.setValue(plugin.settings.filterMode)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
plugin.settings.filterMode = value;
yield plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName('Filter keys')
.setDesc('Any empty field will be ignored.');
let keyset = plugin.settings.filterKeys;
let filterKeys = containerEl.createEl('ol');
for (const [idx, originalValue] of [...keyset].entries()) {
if (originalValue === '') {
continue;
}
addFilterInput(originalValue, filterKeys, keyset, plugin, idx);
}
new obsidian.Setting(containerEl)
.addButton(x => x
.setButtonText("Add key")
.onClick(() => __awaiter(this, void 0, void 0, function* () {
addFilterInput('', filterKeys, keyset, plugin, keyset.length);
})));
containerEl.createEl('h3', { text: 'Experimental' });
new obsidian.Setting(containerEl)
.setName('Autolink')
.setDesc('Enables autolinks for wikilinks `[[target]]`, frontmatter links `%target%` and local links `./deep/target`')
.addToggle(setting => setting
.setValue(plugin.settings.autolinks)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
plugin.settings.autolinks = value;
yield plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName('Naked')
.setDesc('Removes the Shadow DOM and the default CSS so you can bring your own via CSS snippets.')
.addToggle(setting => setting
.setValue(plugin.settings.naked)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
plugin.settings.naked = value;
yield plugin.saveSettings();
})));
});
}
}
function addFilterInput(originalValue, el, keyset, plugin, idx) {
const item = el.createEl('li');
const input = item.createEl('input');
item.setAttribute('id', `filter-${idx}`);
input.setAttribute('type', 'text');
input.setAttribute('value', originalValue);
input.setAttribute('data-prev', originalValue);
input.addEventListener('input', (e) => __awaiter(this, void 0, void 0, function* () {
let target = e.target;
keyset[idx] = target.value;
input.setAttribute('data-prev', target.value);
plugin.settings.filterKeys = keyset;
yield plugin.saveSettings();
}));
}
/**
* A store of rules to apply to set members.
*
* Only one rule can be assigned to a member. If you add two rules against the
* same member key it will only keep the last one.
*
* ## Example
*
* ```
* const rules = new RuleStore()
* const tagsRule = { toHtml: tagslist, foldable: false }
* rules.set('tags', tagsRule)
* ```
*/
class RuleStore extends Map {
}
function isEmptyArray(value) {
if (typeof value === 'string') {
return value === '[]';
}
if (Array.isArray(value) && value.length === 0) {
return true;
}
return false;
}
function toggle(trigger) {
const isExpanded = trigger.getAttribute('aria-expanded') == 'true';
trigger.setAttribute('aria-expanded', String(!isExpanded));
}
function clickHandler(event, searchFn, openLinkFn) {
const trigger = event.target;
if (trigger === null || trigger === void 0 ? void 0 : trigger.hasAttribute('aria-expanded')) {
event.stopPropagation();
event.preventDefault();
toggle(trigger);
return;
}
if (trigger === null || trigger === void 0 ? void 0 : trigger.hasAttribute('href')) {
event.stopPropagation();
const href = trigger.getAttribute('href');
if (trigger.hasClass('internal-link')) {
event.preventDefault();
openLinkFn(trigger.dataset.href, '');
}
if (trigger.hasClass('tag')) {
event.preventDefault();
searchFn(`tag:${href}`);
}
}
}
function keyHandler(event) {
const trigger = event.target;
if ((event.code == 'Space' || event.code == 'Enter') && (trigger === null || trigger === void 0 ? void 0 : trigger.hasAttribute('aria-expanded'))) {
event.stopPropagation();
event.preventDefault();
toggle(trigger);
}
}
function externalLink(value) {
var _a, _b;
const a = document.createElement('a');
// @ts-ignore
(_a = a.part) === null || _a === void 0 ? void 0 : _a.add('link');
// @ts-ignore
(_b = a.part) === null || _b === void 0 ? void 0 : _b.add('external-link');
a.classList.add('external-link');
a.setAttribute('target', '_blank');
a.setAttribute('rel', 'noopener');
a.setAttribute('href', value);
a.append(value);
return a;
}
function obsidianUrl(vaultName, fileName) {
return `obsidian://open?vault=${vaultName}&file=${encodeURI(obsidian.getLinkpath(fileName))}`;
}
function internalLink(url, label) {
var _a, _b;
const a = document.createElement('a');
const localUrl = url.searchParams.get('file');
// const label = url.searchParams.get('file')
a.dataset.href = localUrl;
a.setAttribute('href', localUrl);
// @ts-ignore
(_a = a.part) === null || _a === void 0 ? void 0 : _a.add('link');
// @ts-ignore
(_b = a.part) === null || _b === void 0 ? void 0 : _b.add('internal-link');
a.classList.add('internal-link');
a.setAttribute('target', '_blank');
a.setAttribute('rel', 'noopener');
a.append(label ? label : localUrl);
return a;
}
/**
/* Creates a link for internal links from a string of the form `[[text]]`.
*/
function wikiLink(value, vaultName) {
const cleanValue = value.slice(2, -2);
let url;
let label;
if (cleanValue.includes('|')) {
const [urlValue, labelValue] = cleanValue.split('|');
url = new URL(obsidianUrl(vaultName, urlValue.trim()));
label = labelValue.trim();
}
else {
url = new URL(obsidianUrl(vaultName, cleanValue));
}
return internalLink(url, label);
}
/**
/* Creates a link for internal links from a string of the form `%text%`.
*/
function frontmatterLink(value, vaultName) {
const cleanValue = value.slice(1, -1);
let url;
if (cleanValue.includes('|')) {
const [urlValue, labelValue] = cleanValue.split('|');
url = new URL(obsidianUrl(vaultName, urlValue.trim()));
labelValue.trim();
}
else {
url = new URL(obsidianUrl(vaultName, cleanValue));
}
return internalLink(url);
}
/**
* Creates a link for local paths.
*/
function localLink(value, vaultName) {
const url = new URL(obsidianUrl(vaultName, value));
return internalLink(url);
}
function isOpen(mode, depth) {
if (mode == 'expanded') {
return true;
}
// Keep the root open when leafs are collapsed
if (mode == 'leaf-collapsed' && depth == 0) {
return true;
}
// Keep the root close when leafs are opened
if (mode == 'root-collapsed' && depth != 0) {
return true;
}
// all-collapsed
return false;
}
function isObsidianUrl(url) {
return (url instanceof URL && url.protocol == 'obsidian:');
}
function isUrl(url) {
const allowedProtocols = ['http:', 'https:', 'evernote:', 'zotero:'];
return (url instanceof URL && allowedProtocols.some(protocol => url.protocol == protocol));
}
function isLocalLink(value) {
return value.startsWith('./');
}
function tryUrl(value) {
try {
return new URL(value);
}
catch (_) {
}
}
function isWikiLink(value) {
return (value.startsWith('[[') && value.endsWith(']]'));
}
function isFrontmatterLink(value) {
return (value.startsWith('%') && value.endsWith('%'));
}
function enrichValue(value, context) {
const { settings, vaultName } = context;
const { autolinks } = settings;
const cleanValue = value.toString().trim();
if (autolinks) {
if (isWikiLink(cleanValue)) {
return wikiLink(cleanValue, vaultName);
}
if (isFrontmatterLink(cleanValue)) {
return frontmatterLink(cleanValue, vaultName);
}
if (isLocalLink(cleanValue)) {
return localLink(cleanValue, vaultName);
}
}
const url = tryUrl(cleanValue);
if (isObsidianUrl(url)) {
return internalLink(url);
}
if (isUrl(url)) {
return externalLink(cleanValue);
}
return value.toString();
}
function isNully(value) {
if (typeof value == 'string') {
return value.length == 0;
}
return value == null;
}
/**
* A set member with a scalar value.
*/
function leafMember(label, data, context) {
var _a, _b, _c;
const { rules } = context;
const root = document.createElement('tr');
const key = document.createElement('th');
const value = document.createElement('td');
const rule = rules.get(label.toLocaleLowerCase());
const datum = (rules.has(label.toLocaleLowerCase()) && !isNully(data))
? rule.toHtml(data, rule)
: enrichValue(data, context);
// XXX: Note that `part` is an `Element` extension in draft. Checking for
// undefined lets us get away with plain jest dom testing.
// @ts-ignore
(_a = key.part) === null || _a === void 0 ? void 0 : _a.add('key');
key.classList.add('key');
key.append(label);
// @ts-ignore
(_b = value.part) === null || _b === void 0 ? void 0 : _b.add('value');
value.classList.add('value');
value.append(datum);
// @ts-ignore
(_c = root.part) === null || _c === void 0 ? void 0 : _c.add('member');
root.classList.add('member');
root.append(key);
root.append(value);
return root;
}
/**
* A set member with a complex value.
*/
function nodeMember(label, value, context) {
var _a;
const root = details(label, value, Object.assign(Object.assign({}, context), { depth: context.depth + 1 }));
// @ts-ignore
(_a = root.part) === null || _a === void 0 ? void 0 : _a.add('member');
root.classList.add('member');
return root;
}
/**
* A set member.
*/
function member(label, value, context) {
const { settings } = context;
const patchedValue = value == null ? settings.nullValue : value;
if (typeof patchedValue == 'object') {
return nodeMember(label, value, context);
}
return leafMember(label, patchedValue, context);
}
/**
* A set of members.
*/
function set(data, context) {
var _a;
const { settings, depth } = context;
const { filterMode, filterKeys, ignoreNulls } = settings;
const valueContext = Object.assign(Object.assign({}, context), { depth: depth + 1 });
const root = document.createElement('table');
// @ts-ignore
(_a = root.part) === null || _a === void 0 ? void 0 : _a.add('set');
root.classList.add('set');
Object.entries(data).forEach(([label, value]) => {
if (ignoreNulls && (value == null || isEmptyArray(value)))
return;
if (filterMode == 'ignore') {
if (filterKeys.some(key => key == label))
return;
}
if (filterMode == 'keep') {
if (!filterKeys.some(key => key == label))
return;
}
root.append(member(label, value, valueContext));
});
return root;
}
/**
* A list of members.
*/
function list(data, context) {
const { settings, depth } = context;
const valueContext = Object.assign(Object.assign({}, context), { depth: depth + 1 });
const root = document.createElement('ul');
data.forEach((item) => {
let value;
const li = document.createElement('li');
if (Array.isArray(item)) {
value = list(item, valueContext);
}
else if (typeof item == 'object') {
value = set(item, valueContext);
}
else {
value = enrichValue(item, valueContext);
}
li.append(value);
root.append(li);
});
return root;
}
function ordinaryValue(data, context) {
return Array.isArray(data)
? list(data, context)
: set(data, context);
}
/**
* A collapsible group.
*/
function details(label, data, context) {
var _a, _b, _c;
const { settings, rules, depth } = context;
const { mode } = settings;
const root = document.createElement('tr');
const key = document.createElement('th');
const value = document.createElement('td');
const rule = rules.get(label.toLocaleLowerCase());
const valueId = `${label}-${depth}`;
const datum = (rules.has(label.toLocaleLowerCase()) && !isNully(data))
? rule.toHtml(data, rule)
: ordinaryValue(data, Object.assign(Object.assign({}, context), { depth: depth + 1 }));
// @ts-ignore
(_a = key.part) === null || _a === void 0 ? void 0 : _a.add('key');
key.classList.add('key');
key.append(label);
root.append(key);
// @ts-ignore
(_b = value.part) === null || _b === void 0 ? void 0 : _b.add('value');
value.classList.add('value');
value.setAttribute('id', valueId);
value.append(datum);
root.append(value);
if (rule == undefined || rule.foldable) {
const marker = document.createElement('div');
key.classList.add('toggle');
key.setAttribute('role', 'button');
key.setAttribute('aria-expanded', String(isOpen(mode, depth)));
key.setAttribute('aria-controls', valueId);
key.setAttribute('tabindex', '0');
(_c = marker.part) === null || _c === void 0 ? void 0 : _c.add('marker');
marker.classList.add('marker');
value.append(marker);
}
return root;
}
function sheath(data, context) {
var _a;
const { settings } = context;
const root = document.createElement('details');
const summary = document.createElement('summary');
const value = set(data, context);
if (isOpen(settings.mode, 0)) {
root.setAttribute('open', '');
}
summary.append('Metadata');
// @ts-ignore
(_a = summary.part) === null || _a === void 0 ? void 0 : _a.add('summary');
root.classList.add('metatable');
root.append(summary);
root.append(value);
return root;
}
function metatable(data, context) {
const { searchFn, openLinkFn } = context;
const fragment = new DocumentFragment();
const root = sheath(data, context);
root.addEventListener('click', (e) => clickHandler(e, searchFn, openLinkFn));
root.addEventListener('keydown', keyHandler);
fragment.append(root);
return fragment;
}
/**
* Transforms a list of dirty tags into HTML.
*/
function taglist(data, rule) {
const list = normaliseTags(data);
// No valid tags found.
if (list.length == 0)
return null;
const root = document.createElement('ul');
root.classList.add('tag-list');
list.forEach((item) => {
const li = document.createElement('li');
const value = tag(item);
li.append(value);
root.append(li);
});
return root;
}
/**
* Normalises a list of tags as an array of strings.
*/
function normaliseTags(data) {
if (data == null) {
return [];
}
if (typeof data == 'string') {
return data.split(',').map(x => x.trim()).filter(x => x && x.length != 0);
}
return data.filter(x => x && x.length != 0);
}
function tag(value) {
var _a, _b;
const a = document.createElement('a');
a.classList.add('tag');
// XXX: Note that `part` is an `Element` extension in draft. Checking for
// undefined lets us get away with plain jest dom testing.
// @ts-ignore
(_a = a.part) === null || _a === void 0 ? void 0 : _a.add('tag');
// @ts-ignore
(_b = a.part) === null || _b === void 0 ? void 0 : _b.add(encodeURI(value));
a.setAttribute('target', '_blank');
a.setAttribute('rel', 'noopener');
a.setAttribute('href', `#${value}`);
a.append(`${value}`);
return a;
}
var styles = ":host-context(.theme-light) {\n --metatable-foreground: var(--text-muted, darkslategrey);\n --metatable-key-background: var(--background-primary-alt, #f3f3f3);\n --metatable-key-border-color: var(--background-modifier-border, lightgrey);\n --metatable-key-border-color-focus: orange;\n --metatable-key-focus: var(--background-match-highlight, lightyellow);\n --metatable-tag-background: var(--background-primary-alt, #f3f3f3);\n --metatable-link-color: var(--text-accent, #705dcf);\n --metatable-link-color-hover: var(--text-accent-hover, #8875ff);\n --metatable-warning-background: lightgoldenrodyellow;\n --metatable-warning-foreground: brown;\n --metatable-warning-border: 2px solid palegoldenrod;\n}\n\n:host-context(.theme-dark) {\n --metatable-foreground: var(--text-muted, #999);\n --metatable-key-background: var(--background-primary-alt, #111);\n --metatable-key-border-color: var(--background-modifier-border, #333);\n --metatable-key-border-color-focus: orange;\n --metatable-key-focus: black;\n --metatable-tag-background: var(--background-primary-alt, #111);\n --metatable-link-color: var(--text-accent, #705dcf);\n --metatable-link-color-hover: var(--text-accent-hover, #8875ff);\n --metatable-warning-background: inherit;\n --metatable-warning-foreground: gold;\n --metatable-warning-border: 2px solid palegoldenrod;\n}\n\n:host {\n --metatable-background: transparent;\n --metatable-collapsed-symbol: \"▶︎\";\n --metatable-expanded-symbol: \"▼\";\n --metatable-external-link-color-hover: var(--metatable-link-color-hover);\n --metatable-external-link-color: var(--metatable-link-color);\n --metatable-external-link-icon: url(app://obsidian.md/public/images/874d8b8e340f75575caa.svg);\n --metatable-font-family: var(--text, sans-serif);\n --metatable-font-size: var(--font-small, 13px);\n --metatable-internal-link-color-hover: var(--metatable-link-color-hover);\n --metatable-internal-link-color: var(--metatable-link-color);\n --metatable-internal-link-icon: none;\n --metatable-key-border-width: 2px;\n --metatable-mark-symbol: \"…\";\n --metatable-member-gap: 2px;\n --metatable-tag-symbol: \"\";\n --metatable-value-background: transparent;\n}\n\n\n* {\n box-sizing: border-box;\n}\n\ndetails {\n background-color: var(--metatable-background);\n color: var(--metatable-foreground);\n font-family: var(--metatable-font-family);\n font-size: var(--metatable-font-size);\n}\n\nsummary {\n cursor: pointer;\n}\n\nsummary:focus {\n outline: none;\n}\n\nsummary:focus-visible {\n outline: none;\n background-color: var(--metatable-key-focus)\n}\n\n.set {\n background-color: var(--metatable-background);\n display: grid;\n grid-gap: 2px;\n margin-top: 0.4rem;\n}\n\n.member {\n display: grid;\n grid-gap: var(--metatable-member-gap);\n grid-template-columns: minmax(0, 1fr) minmax(0, 4fr);\n grid-template-areas: \"key value\";\n}\n\n.key[role=button] {\n cursor: pointer;\n}\n\n.member .key {\n background-color: var(--metatable-key-background);\n border-right: var(--metatable-key-border-width) solid var(--metatable-key-border-color);\n display: grid;\n grid-template-columns: 10px auto;\n grid-gap: 0.4rem;\n font-weight: bold;\n grid-area: key;\n overflow: hidden;\n padding: 0.4rem;\n text-align: left;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.member .value {\n background-color: var(--metatable-value-background);\n grid-area: value;\n margin: 0;\n overflow: auto;\n padding: 0.4rem;\n}\n\n.member .key:focus {\n outline: none;\n}\n\n.member .key:focus-visible {\n outline: none;\n border-right-color: var(--metatable-key-border-color-focus);\n background-color: var(--metatable-key-focus);\n}\n\n.value ul {\n margin: 0;\n padding: 0;\n}\n\n.value li {\n margin-left: 1rem;\n}\n\n.key[aria-expanded]::before {\n font-size: 0.6rem;\n padding-top: 0.3rem;\n}\n\n.key[aria-expanded=true]::before {\n content: var(--metatable-expanded-symbol);\n}\n\n.key[aria-expanded=false]::before {\n content: var(--metatable-collapsed-symbol);\n}\n\n.key[aria-expanded=false] + .value > :first-child {\n display: none;\n}\n\n.key[aria-expanded=false] + .value > .marker::after {\n content: var(--metatable-mark-symbol);\n display: block;\n}\n\n@media screen and (min-width: 400px) and (max-width: 550px) {\n .member {\n grid-template-columns: minmax(0, 1.5fr) minmax(0, 3fr);\n }\n .member .member {\n grid-template-areas: \"key key\" \"value value\";\n }\n\n .member .member .key {\n border-right: none;\n border-bottom: var(--metatable-key-border-width) solid var(--metatable-key-border-color);\n }\n\n}\n\n@media screen and (max-width: 400px) {\n .member {\n grid-template-areas: \"key key\" \"value value\";\n }\n\n .member .key {\n border-right: none;\n border-bottom: var(--metatable-key-border-width) solid var(--metatable-key-border-color);\n }\n}\n\n/* Mappers */\n\n.tag-list li {\n display: inline-block;\n margin: 0 0.4rem 0 2px;\n}\n\n.tag {\n background-color: var(--metatable-tag-background);\n border-radius: 1rem;\n color: var(--metatable-foreground);\n display: inline-block;\n padding: 0.1rem 0.6rem;\n text-decoration: none;\n}\n\n.tag::before {\n content: var(--metatable-tag-symbol);\n}\n\n.tag:hover {\n filter: brightness(0.8);\n}\n\n.tag:focus, .external-link:focus, .internal-link:focus {\n outline: none;\n}\n\n.tag:focus-visible, .external-link:focus-visible, .internal-link:focus-visible {\n outline: none;\n background-color: var(--metatable-key-focus)\n}\n\n.external-link {\n color: var(--metatable-external-link-color);\n display: inline-block;\n white-space: nowrap;\n}\n\n.external-link::after {\n content: var(--metatable-external-link-icon);\n display: inline-block;\n margin-left: 0.3rem;\n vertical-align: sub;\n}\n\n.external-link:hover {\n color: var(--metatable-external-link-color-hover);\n}\n\n.internal-link {\n color: var(--metatable-internal-link-color);\n display: inline-block;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 450px;\n white-space: nowrap;\n}\n\n.internal-link::after {\n content: var(--metatable-internal-link-icon);\n display: inline-block;\n margin-left: 0.3rem;\n vertical-align: sub;\n}\n\n.internal-link:hover {\n color: var(--metatable-internal-link-color-hover);\n}\n\n.warning {\n background-color: var(--metatable-warning-background);\n padding: 1rem;\n margin: 0;\n border: var(--metatable-warning-border);\n color: var(--metatable-warning-foreground);\n}\n";
function log(msg) {
console.log(`metatable: ${msg}`);
}
function createMetatable(el, data, context) {
const wrapper = el.createEl('div');
const fragment = new DocumentFragment();
wrapper.classList.add('obsidian-metatable');
if (!context.settings.naked) {
wrapper.attachShadow({ mode: 'open' });
fragment.createEl('style', { text: styles });
}
fragment.append(metatable(data, context));
if (context.settings.naked) {
wrapper.append(fragment);
}
else {
wrapper.shadowRoot.append(fragment);
}
}
function createWarning(el, message, context) {
const wrapper = el.createEl('div');
const fragment = new DocumentFragment();
wrapper.classList.add('obsidian-metatable');
if (!context.settings.naked) {
wrapper.attachShadow({ mode: 'open' });
fragment.createEl('style', { text: styles });
}
const warning = el.createEl('p');
warning.classList.add('warning');
warning.append(message);
fragment.append(warning);
if (context.settings.naked) {
wrapper.append(fragment);
}
else {
wrapper.shadowRoot.append(fragment);
}
}
function isEmpty(data) {
return Object.entries(data)
.every(([_, value]) => value == null || isEmptyArray(value));
}
function filterSet(data, filterKeys, filterMode) {
const filterFn = filterMode == 'ignore'
? (x => !x)
: (x => x);
const newData = Object.entries(data)
.filter(([key, _value]) => filterFn(filterKeys.some(x => x == key)));
return Object.fromEntries(newData);
}
function frontmatterProcessor(el, ctx) {
return __awaiter(this, void 0, void 0, function* () {
const plugin = this;
const frontmatter = el.querySelector('.frontmatter');
if (frontmatter !== null) {
const embed = el.querySelector('.internal-embed');
// If an embed has already been loaded, writing after the embed expression
// triggers a re-render for the embedded markdown wrongly injecting the
// parent metatable for every keystroke.
//
// See https://github.com/arnau/obsidian-metatable/issues/12
if (embed !== null) {
return;
}
const target = el.querySelector('.frontmatter-container');
target.style.display = 'none';
// @ts-ignore
const searchFn = plugin.app.internalPlugins.getPluginById('global-search').instance.openGlobalSearch.bind(plugin);
const openLinkFn = plugin.app.workspace.openLinkText.bind(plugin.app.workspace);
const { ignoreNulls, filterMode, filterKeys, skipKey } = plugin.settings;
const rules = new RuleStore();
rules.set('tags', {
toHtml: taglist,
foldable: false,
});
const context = {
vaultName: plugin.app.vault.getName(),
rules,
searchFn,
openLinkFn,
settings: {
mode: plugin.settings.expansionMode,
ignoreNulls,
nullValue: plugin.settings.nullValue,
filterKeys,
filterMode,
autolinks: plugin.settings.autolinks,
naked: plugin.settings.naked,
},
depth: 0,
};
if (ctx.frontmatter) {
const data = filterSet(ctx.frontmatter, filterKeys, filterMode);
if (ctx.frontmatter[skipKey]) {
return;
}
// Nothing to render if all top-level are null and nulls should be
// ignored.
if (ignoreNulls && isEmpty(data)) {
return;
}
if (Object.isEmpty(data)) {
return;
}
createMetatable(target.parentNode, data, context);
}
else {
// When null, the frontmatter YAML is invalid. There is no insight to tap
// on to give a meaningful error message though.
const label = frontmatter.querySelector('.mod-error');
createWarning(target.parentNode, label.textContent, context);
}
}
});
}
class MetatablePlugin extends obsidian.Plugin {
onload() {
return __awaiter(this, void 0, void 0, function* () {
yield this.loadSettings();
this.registerMarkdownPostProcessor(frontmatterProcessor.bind(this));
this.addSettingTab(new MetatableSettingTab(this.app, this));
log('loaded');
});
}
onunload() {
log('unloaded');
}
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);
});
}
}
module.exports = MetatablePlugin;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9zZXR0aW5ncy50cyIsInNyYy9ydWxlLnRzIiwic3JjL3V0aWxzLnRzIiwic3JjL3RhYmxlLnRzIiwic3JjL21hcHBlcnMudHMiLCJzcmMvcGx1Z2luLnRzIl0sInNvdXJjZXNDb250ZW50IjpudWxsLCJuYW1lcyI6WyJQbHVnaW5TZXR0aW5nVGFiIiwiU2V0dGluZyIsImdldExpbmtwYXRoIiwiUGx1Z2luIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdURBO0FBQ08sU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO0FBQzdELElBQUksU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hILElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQy9ELFFBQVEsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUNuRyxRQUFRLFNBQVMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFD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