parent
23fc7c84f6
commit
6be2e20aed
@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"defaultRefreshInterval": "60",
|
|
||||||
"storiesFolder": "00.03 News",
|
|
||||||
"storyTemplate": "---\ndate: {{date}}\nsource: {{url}}\n\n---\n\n# {{title}}\n\n> notes from [{{title}}]({{url}})\n"
|
|
||||||
}
|
|
@ -1,781 +0,0 @@
|
|||||||
/*
|
|
||||||
THIS IS A GENERATED/BUNDLED FILE BY ROLLUP
|
|
||||||
if you want to view the source visit the plugins github repository (https://github.com/arpitbbhayani/obsidian-hackernews)
|
|
||||||
*/
|
|
||||||
|
|
||||||
'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());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// English
|
|
||||||
var en = {
|
|
||||||
'Open HackerNews': 'Open HackerNews',
|
|
||||||
'HackerNews': 'HackerNews',
|
|
||||||
//settingsTab.ts
|
|
||||||
'HackerNews Settings': 'HackerNews Settings',
|
|
||||||
'Refresh Interval': 'Refresh Interval',
|
|
||||||
'The time interval in seconds after which the next top story will be fetched. Default and invalid values will be reverted to 60 seconds.': 'The time interval in seconds after which the next top story will be fetched. Default and invalid values will be reverted to 60 seconds.',
|
|
||||||
'Stories Folder': 'Stories Folder',
|
|
||||||
'The folder that holds the saved HackerNews stories. The folder will be created if it does not exist.': 'The folder that holds the saved HackerNews stories. The folder will be created if it does not exist.',
|
|
||||||
'Story Template': 'Story Template',
|
|
||||||
'Specify how the HackerNews story is saved; available attributes: title, url, date.': 'Specify how the HackerNews story is saved; available attributes: title, url, date.',
|
|
||||||
'Donate': 'Donate',
|
|
||||||
'If you found this plugin helpful, consider donating to support continued development.': 'If you found this plugin helpful, consider donating to support continued development.',
|
|
||||||
};
|
|
||||||
|
|
||||||
const localeMap = {
|
|
||||||
en,
|
|
||||||
};
|
|
||||||
const locale = localeMap[obsidian.moment.locale()];
|
|
||||||
function t(str) {
|
|
||||||
if (!locale) {
|
|
||||||
return en[str];
|
|
||||||
}
|
|
||||||
return (locale && locale[str]) || en[str];
|
|
||||||
}
|
|
||||||
|
|
||||||
class SettingsTab extends obsidian.PluginSettingTab {
|
|
||||||
constructor(app, plugin) {
|
|
||||||
super(app, plugin);
|
|
||||||
this.plugin = plugin;
|
|
||||||
}
|
|
||||||
display() {
|
|
||||||
const { containerEl, plugin } = this;
|
|
||||||
containerEl.empty();
|
|
||||||
containerEl.createEl('h2', { text: t('HackerNews Settings') });
|
|
||||||
new obsidian.Setting(containerEl)
|
|
||||||
.setName(t('Refresh Interval'))
|
|
||||||
.setDesc(t('The time interval in seconds after which the next top story will be fetched. Default and invalid values will be reverted to 60 seconds.'))
|
|
||||||
.addText(text => text
|
|
||||||
.setPlaceholder('60')
|
|
||||||
.setValue(plugin.settings.defaultRefreshInterval)
|
|
||||||
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
||||||
let refreshInterval = parseInt(value);
|
|
||||||
if (Number.isNaN(refreshInterval) || refreshInterval <= 0) {
|
|
||||||
refreshInterval = 60;
|
|
||||||
}
|
|
||||||
plugin.settings.defaultRefreshInterval = `${refreshInterval}`;
|
|
||||||
yield this.save();
|
|
||||||
})));
|
|
||||||
new obsidian.Setting(containerEl)
|
|
||||||
.setName(t('Stories Folder'))
|
|
||||||
.setDesc(t('The folder that holds the saved HackerNews stories. The folder will be created if it does not exist.'))
|
|
||||||
.addText(text => text
|
|
||||||
.setPlaceholder('stories folder')
|
|
||||||
.setValue(plugin.settings.storiesFolder)
|
|
||||||
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
||||||
plugin.settings.storiesFolder = value;
|
|
||||||
yield this.save();
|
|
||||||
})));
|
|
||||||
new obsidian.Setting(containerEl)
|
|
||||||
.setName(t('Story Template'))
|
|
||||||
.setDesc(t('Specify how the HackerNews story is saved; available attributes: title, url, date.'))
|
|
||||||
.addTextArea(text => text
|
|
||||||
.setPlaceholder('stories folder')
|
|
||||||
.setValue(plugin.settings.storyTemplate)
|
|
||||||
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
||||||
plugin.settings.storyTemplate = value;
|
|
||||||
yield this.save();
|
|
||||||
})));
|
|
||||||
new obsidian.Setting(containerEl)
|
|
||||||
.setName(t('Donate'))
|
|
||||||
.setDesc(t('If you found this plugin helpful, consider donating to support continued development.'))
|
|
||||||
.setClass("extra")
|
|
||||||
.addButton((bt) => {
|
|
||||||
bt.buttonEl.outerHTML = `<a href="https://www.buymeacoffee.com/arpitbhayani"><img src="https://img.buymeacoffee.com/button-api/?text=Buy me a coffee&emoji=&slug=arpitbhayani&button_colour=5F7FFF&font_colour=ffffff&font_family=Inter&outline_colour=000000&coffee_colour=FFDD00"></a>`;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
save() {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
yield this.plugin.saveSettings();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const VIEW_TYPE = 'hackernews-view';
|
|
||||||
const VIEW_DISPLAY_TEXT = t('HackerNews');
|
|
||||||
const VIEW_ICON = 'hackernews';
|
|
||||||
const DEFAULT_SETTINGS = {
|
|
||||||
defaultRefreshInterval: "60",
|
|
||||||
storiesFolder: "HackerNews",
|
|
||||||
storyTemplate: `---
|
|
||||||
date: {{date}}
|
|
||||||
source: {{url}}
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
# {{title}}
|
|
||||||
|
|
||||||
> notes from [{{title}}]({{url}})
|
|
||||||
`
|
|
||||||
};
|
|
||||||
|
|
||||||
function noop() { }
|
|
||||||
function run(fn) {
|
|
||||||
return fn();
|
|
||||||
}
|
|
||||||
function blank_object() {
|
|
||||||
return Object.create(null);
|
|
||||||
}
|
|
||||||
function run_all(fns) {
|
|
||||||
fns.forEach(run);
|
|
||||||
}
|
|
||||||
function is_function(thing) {
|
|
||||||
return typeof thing === 'function';
|
|
||||||
}
|
|
||||||
function safe_not_equal(a, b) {
|
|
||||||
return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');
|
|
||||||
}
|
|
||||||
function is_empty(obj) {
|
|
||||||
return Object.keys(obj).length === 0;
|
|
||||||
}
|
|
||||||
function append(target, node) {
|
|
||||||
target.appendChild(node);
|
|
||||||
}
|
|
||||||
function append_styles(target, style_sheet_id, styles) {
|
|
||||||
const append_styles_to = get_root_for_style(target);
|
|
||||||
if (!append_styles_to.getElementById(style_sheet_id)) {
|
|
||||||
const style = element('style');
|
|
||||||
style.id = style_sheet_id;
|
|
||||||
style.textContent = styles;
|
|
||||||
append_stylesheet(append_styles_to, style);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function get_root_for_style(node) {
|
|
||||||
if (!node)
|
|
||||||
return document;
|
|
||||||
const root = node.getRootNode ? node.getRootNode() : node.ownerDocument;
|
|
||||||
if (root && root.host) {
|
|
||||||
return root;
|
|
||||||
}
|
|
||||||
return node.ownerDocument;
|
|
||||||
}
|
|
||||||
function append_stylesheet(node, style) {
|
|
||||||
append(node.head || node, style);
|
|
||||||
}
|
|
||||||
function insert(target, node, anchor) {
|
|
||||||
target.insertBefore(node, anchor || null);
|
|
||||||
}
|
|
||||||
function detach(node) {
|
|
||||||
node.parentNode.removeChild(node);
|
|
||||||
}
|
|
||||||
function element(name) {
|
|
||||||
return document.createElement(name);
|
|
||||||
}
|
|
||||||
function text(data) {
|
|
||||||
return document.createTextNode(data);
|
|
||||||
}
|
|
||||||
function space() {
|
|
||||||
return text(' ');
|
|
||||||
}
|
|
||||||
function listen(node, event, handler, options) {
|
|
||||||
node.addEventListener(event, handler, options);
|
|
||||||
return () => node.removeEventListener(event, handler, options);
|
|
||||||
}
|
|
||||||
function attr(node, attribute, value) {
|
|
||||||
if (value == null)
|
|
||||||
node.removeAttribute(attribute);
|
|
||||||
else if (node.getAttribute(attribute) !== value)
|
|
||||||
node.setAttribute(attribute, value);
|
|
||||||
}
|
|
||||||
function children(element) {
|
|
||||||
return Array.from(element.childNodes);
|
|
||||||
}
|
|
||||||
function set_data(text, data) {
|
|
||||||
data = '' + data;
|
|
||||||
if (text.wholeText !== data)
|
|
||||||
text.data = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
let current_component;
|
|
||||||
function set_current_component(component) {
|
|
||||||
current_component = component;
|
|
||||||
}
|
|
||||||
function get_current_component() {
|
|
||||||
if (!current_component)
|
|
||||||
throw new Error('Function called outside component initialization');
|
|
||||||
return current_component;
|
|
||||||
}
|
|
||||||
function onDestroy(fn) {
|
|
||||||
get_current_component().$$.on_destroy.push(fn);
|
|
||||||
}
|
|
||||||
|
|
||||||
const dirty_components = [];
|
|
||||||
const binding_callbacks = [];
|
|
||||||
const render_callbacks = [];
|
|
||||||
const flush_callbacks = [];
|
|
||||||
const resolved_promise = Promise.resolve();
|
|
||||||
let update_scheduled = false;
|
|
||||||
function schedule_update() {
|
|
||||||
if (!update_scheduled) {
|
|
||||||
update_scheduled = true;
|
|
||||||
resolved_promise.then(flush);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function add_render_callback(fn) {
|
|
||||||
render_callbacks.push(fn);
|
|
||||||
}
|
|
||||||
let flushing = false;
|
|
||||||
const seen_callbacks = new Set();
|
|
||||||
function flush() {
|
|
||||||
if (flushing)
|
|
||||||
return;
|
|
||||||
flushing = true;
|
|
||||||
do {
|
|
||||||
// first, call beforeUpdate functions
|
|
||||||
// and update components
|
|
||||||
for (let i = 0; i < dirty_components.length; i += 1) {
|
|
||||||
const component = dirty_components[i];
|
|
||||||
set_current_component(component);
|
|
||||||
update(component.$$);
|
|
||||||
}
|
|
||||||
set_current_component(null);
|
|
||||||
dirty_components.length = 0;
|
|
||||||
while (binding_callbacks.length)
|
|
||||||
binding_callbacks.pop()();
|
|
||||||
// then, once components are updated, call
|
|
||||||
// afterUpdate functions. This may cause
|
|
||||||
// subsequent updates...
|
|
||||||
for (let i = 0; i < render_callbacks.length; i += 1) {
|
|
||||||
const callback = render_callbacks[i];
|
|
||||||
if (!seen_callbacks.has(callback)) {
|
|
||||||
// ...so guard against infinite loops
|
|
||||||
seen_callbacks.add(callback);
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
render_callbacks.length = 0;
|
|
||||||
} while (dirty_components.length);
|
|
||||||
while (flush_callbacks.length) {
|
|
||||||
flush_callbacks.pop()();
|
|
||||||
}
|
|
||||||
update_scheduled = false;
|
|
||||||
flushing = false;
|
|
||||||
seen_callbacks.clear();
|
|
||||||
}
|
|
||||||
function update($$) {
|
|
||||||
if ($$.fragment !== null) {
|
|
||||||
$$.update();
|
|
||||||
run_all($$.before_update);
|
|
||||||
const dirty = $$.dirty;
|
|
||||||
$$.dirty = [-1];
|
|
||||||
$$.fragment && $$.fragment.p($$.ctx, dirty);
|
|
||||||
$$.after_update.forEach(add_render_callback);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const outroing = new Set();
|
|
||||||
function transition_in(block, local) {
|
|
||||||
if (block && block.i) {
|
|
||||||
outroing.delete(block);
|
|
||||||
block.i(local);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function mount_component(component, target, anchor, customElement) {
|
|
||||||
const { fragment, on_mount, on_destroy, after_update } = component.$$;
|
|
||||||
fragment && fragment.m(target, anchor);
|
|
||||||
if (!customElement) {
|
|
||||||
// onMount happens before the initial afterUpdate
|
|
||||||
add_render_callback(() => {
|
|
||||||
const new_on_destroy = on_mount.map(run).filter(is_function);
|
|
||||||
if (on_destroy) {
|
|
||||||
on_destroy.push(...new_on_destroy);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Edge case - component was destroyed immediately,
|
|
||||||
// most likely as a result of a binding initialising
|
|
||||||
run_all(new_on_destroy);
|
|
||||||
}
|
|
||||||
component.$$.on_mount = [];
|
|
||||||
});
|
|
||||||
}
|
|
||||||
after_update.forEach(add_render_callback);
|
|
||||||
}
|
|
||||||
function destroy_component(component, detaching) {
|
|
||||||
const $$ = component.$$;
|
|
||||||
if ($$.fragment !== null) {
|
|
||||||
run_all($$.on_destroy);
|
|
||||||
$$.fragment && $$.fragment.d(detaching);
|
|
||||||
// TODO null out other refs, including component.$$ (but need to
|
|
||||||
// preserve final state?)
|
|
||||||
$$.on_destroy = $$.fragment = null;
|
|
||||||
$$.ctx = [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function make_dirty(component, i) {
|
|
||||||
if (component.$$.dirty[0] === -1) {
|
|
||||||
dirty_components.push(component);
|
|
||||||
schedule_update();
|
|
||||||
component.$$.dirty.fill(0);
|
|
||||||
}
|
|
||||||
component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));
|
|
||||||
}
|
|
||||||
function init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) {
|
|
||||||
const parent_component = current_component;
|
|
||||||
set_current_component(component);
|
|
||||||
const $$ = component.$$ = {
|
|
||||||
fragment: null,
|
|
||||||
ctx: null,
|
|
||||||
// state
|
|
||||||
props,
|
|
||||||
update: noop,
|
|
||||||
not_equal,
|
|
||||||
bound: blank_object(),
|
|
||||||
// lifecycle
|
|
||||||
on_mount: [],
|
|
||||||
on_destroy: [],
|
|
||||||
on_disconnect: [],
|
|
||||||
before_update: [],
|
|
||||||
after_update: [],
|
|
||||||
context: new Map(parent_component ? parent_component.$$.context : options.context || []),
|
|
||||||
// everything else
|
|
||||||
callbacks: blank_object(),
|
|
||||||
dirty,
|
|
||||||
skip_bound: false,
|
|
||||||
root: options.target || parent_component.$$.root
|
|
||||||
};
|
|
||||||
append_styles && append_styles($$.root);
|
|
||||||
let ready = false;
|
|
||||||
$$.ctx = instance
|
|
||||||
? instance(component, options.props || {}, (i, ret, ...rest) => {
|
|
||||||
const value = rest.length ? rest[0] : ret;
|
|
||||||
if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {
|
|
||||||
if (!$$.skip_bound && $$.bound[i])
|
|
||||||
$$.bound[i](value);
|
|
||||||
if (ready)
|
|
||||||
make_dirty(component, i);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
})
|
|
||||||
: [];
|
|
||||||
$$.update();
|
|
||||||
ready = true;
|
|
||||||
run_all($$.before_update);
|
|
||||||
// `false` as a special case of no DOM component
|
|
||||||
$$.fragment = create_fragment ? create_fragment($$.ctx) : false;
|
|
||||||
if (options.target) {
|
|
||||||
if (options.hydrate) {
|
|
||||||
const nodes = children(options.target);
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
||||||
$$.fragment && $$.fragment.l(nodes);
|
|
||||||
nodes.forEach(detach);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
||||||
$$.fragment && $$.fragment.c();
|
|
||||||
}
|
|
||||||
if (options.intro)
|
|
||||||
transition_in(component.$$.fragment);
|
|
||||||
mount_component(component, options.target, options.anchor, options.customElement);
|
|
||||||
flush();
|
|
||||||
}
|
|
||||||
set_current_component(parent_component);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Base class for Svelte components. Used when dev=false.
|
|
||||||
*/
|
|
||||||
class SvelteComponent {
|
|
||||||
$destroy() {
|
|
||||||
destroy_component(this, 1);
|
|
||||||
this.$destroy = noop;
|
|
||||||
}
|
|
||||||
$on(type, callback) {
|
|
||||||
const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));
|
|
||||||
callbacks.push(callback);
|
|
||||||
return () => {
|
|
||||||
const index = callbacks.indexOf(callback);
|
|
||||||
if (index !== -1)
|
|
||||||
callbacks.splice(index, 1);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
$set($$props) {
|
|
||||||
if (this.$$set && !is_empty($$props)) {
|
|
||||||
this.$$.skip_bound = true;
|
|
||||||
this.$$set($$props);
|
|
||||||
this.$$.skip_bound = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* src/ui/hackernews/hackernewsView.svelte generated by Svelte v3.42.4 */
|
|
||||||
|
|
||||||
function add_css(target) {
|
|
||||||
append_styles(target, "svelte-yiq1rr", ".hn-link.svelte-yiq1rr{font-size:1em;text-decoration:none}.hn-read.svelte-yiq1rr{font-size:0.75em;text-align:right;margin-top:0.5em}.hn-meta.svelte-yiq1rr{font-size:0.7em;color:#aaa}.results.svelte-yiq1rr{display:flex;flex-wrap:wrap}.container.svelte-yiq1rr{max-width:30vw;width:100%;margin:auto;background-color:var(--background-primary-alt);padding:1rem 1rem;margin-top:0.2rem;border-radius:0.3rem}");
|
|
||||||
}
|
|
||||||
|
|
||||||
// (27:2) {#if dataHN}
|
|
||||||
function create_if_block(ctx) {
|
|
||||||
let div1;
|
|
||||||
let div0;
|
|
||||||
let a0;
|
|
||||||
let t0_value = /*dataHN*/ ctx[2].title + "";
|
|
||||||
let t0;
|
|
||||||
let a0_href_value;
|
|
||||||
let t1;
|
|
||||||
let br;
|
|
||||||
let t2;
|
|
||||||
let p0;
|
|
||||||
let a1;
|
|
||||||
let t4;
|
|
||||||
let a2;
|
|
||||||
let t5;
|
|
||||||
let a2_href_value;
|
|
||||||
let t6;
|
|
||||||
let p1;
|
|
||||||
let t7;
|
|
||||||
let t8;
|
|
||||||
let t9;
|
|
||||||
let mounted;
|
|
||||||
let dispose;
|
|
||||||
|
|
||||||
return {
|
|
||||||
c() {
|
|
||||||
div1 = element("div");
|
|
||||||
div0 = element("div");
|
|
||||||
a0 = element("a");
|
|
||||||
t0 = text(t0_value);
|
|
||||||
t1 = space();
|
|
||||||
br = element("br");
|
|
||||||
t2 = space();
|
|
||||||
p0 = element("p");
|
|
||||||
a1 = element("a");
|
|
||||||
a1.textContent = "Save";
|
|
||||||
t4 = text("\n •\n ");
|
|
||||||
a2 = element("a");
|
|
||||||
t5 = text("Read now");
|
|
||||||
t6 = space();
|
|
||||||
p1 = element("p");
|
|
||||||
t7 = text("Refreshes every ");
|
|
||||||
t8 = text(/*refreshInterval*/ ctx[0]);
|
|
||||||
t9 = text(" seconds.");
|
|
||||||
attr(a0, "href", a0_href_value = /*dataHN*/ ctx[2].url);
|
|
||||||
attr(a0, "target", "_blank");
|
|
||||||
attr(a0, "class", "hn-link svelte-yiq1rr");
|
|
||||||
attr(a1, "href", "/");
|
|
||||||
attr(a2, "href", a2_href_value = /*dataHN*/ ctx[2].url);
|
|
||||||
attr(a2, "target", "_blank");
|
|
||||||
attr(p0, "class", "hn-read svelte-yiq1rr");
|
|
||||||
attr(p1, "class", "hn-meta svelte-yiq1rr");
|
|
||||||
attr(div0, "class", "container svelte-yiq1rr");
|
|
||||||
attr(div1, "class", "results svelte-yiq1rr");
|
|
||||||
},
|
|
||||||
m(target, anchor) {
|
|
||||||
insert(target, div1, anchor);
|
|
||||||
append(div1, div0);
|
|
||||||
append(div0, a0);
|
|
||||||
append(a0, t0);
|
|
||||||
append(div0, t1);
|
|
||||||
append(div0, br);
|
|
||||||
append(div0, t2);
|
|
||||||
append(div0, p0);
|
|
||||||
append(p0, a1);
|
|
||||||
append(p0, t4);
|
|
||||||
append(p0, a2);
|
|
||||||
append(a2, t5);
|
|
||||||
append(div0, t6);
|
|
||||||
append(div0, p1);
|
|
||||||
append(p1, t7);
|
|
||||||
append(p1, t8);
|
|
||||||
append(p1, t9);
|
|
||||||
|
|
||||||
if (!mounted) {
|
|
||||||
dispose = listen(a1, "click", /*saveHNItem*/ ctx[1]);
|
|
||||||
mounted = true;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
p(ctx, dirty) {
|
|
||||||
if (dirty & /*dataHN*/ 4 && t0_value !== (t0_value = /*dataHN*/ ctx[2].title + "")) set_data(t0, t0_value);
|
|
||||||
|
|
||||||
if (dirty & /*dataHN*/ 4 && a0_href_value !== (a0_href_value = /*dataHN*/ ctx[2].url)) {
|
|
||||||
attr(a0, "href", a0_href_value);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dirty & /*dataHN*/ 4 && a2_href_value !== (a2_href_value = /*dataHN*/ ctx[2].url)) {
|
|
||||||
attr(a2, "href", a2_href_value);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dirty & /*refreshInterval*/ 1) set_data(t8, /*refreshInterval*/ ctx[0]);
|
|
||||||
},
|
|
||||||
d(detaching) {
|
|
||||||
if (detaching) detach(div1);
|
|
||||||
mounted = false;
|
|
||||||
dispose();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function create_fragment(ctx) {
|
|
||||||
let div;
|
|
||||||
let if_block = /*dataHN*/ ctx[2] && create_if_block(ctx);
|
|
||||||
|
|
||||||
return {
|
|
||||||
c() {
|
|
||||||
div = element("div");
|
|
||||||
if (if_block) if_block.c();
|
|
||||||
attr(div, "class", "main");
|
|
||||||
},
|
|
||||||
m(target, anchor) {
|
|
||||||
insert(target, div, anchor);
|
|
||||||
if (if_block) if_block.m(div, null);
|
|
||||||
},
|
|
||||||
p(ctx, [dirty]) {
|
|
||||||
if (/*dataHN*/ ctx[2]) {
|
|
||||||
if (if_block) {
|
|
||||||
if_block.p(ctx, dirty);
|
|
||||||
} else {
|
|
||||||
if_block = create_if_block(ctx);
|
|
||||||
if_block.c();
|
|
||||||
if_block.m(div, null);
|
|
||||||
}
|
|
||||||
} else if (if_block) {
|
|
||||||
if_block.d(1);
|
|
||||||
if_block = null;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
i: noop,
|
|
||||||
o: noop,
|
|
||||||
d(detaching) {
|
|
||||||
if (detaching) detach(div);
|
|
||||||
if (if_block) if_block.d();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function instance($$self, $$props, $$invalidate) {
|
|
||||||
|
|
||||||
|
|
||||||
let { manager } = $$props;
|
|
||||||
let { refreshInterval } = $$props;
|
|
||||||
let dataHN;
|
|
||||||
|
|
||||||
function fetchTopHN() {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
console.log('fetching top story from HackerNews');
|
|
||||||
$$invalidate(2, dataHN = yield manager.requestTopHN());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function saveHNItem() {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
console.log(`saving story ${dataHN.title}`);
|
|
||||||
yield manager.saveHNItem(dataHN);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
addEventListener("obsidian-hackernews-fetchTopHN", fetchTopHN);
|
|
||||||
|
|
||||||
onDestroy(() => {
|
|
||||||
removeEventListener('obsidian-hackernews-fetchTopHN', fetchTopHN);
|
|
||||||
});
|
|
||||||
|
|
||||||
$$self.$$set = $$props => {
|
|
||||||
if ('manager' in $$props) $$invalidate(3, manager = $$props.manager);
|
|
||||||
if ('refreshInterval' in $$props) $$invalidate(0, refreshInterval = $$props.refreshInterval);
|
|
||||||
};
|
|
||||||
|
|
||||||
return [refreshInterval, saveHNItem, dataHN, manager, fetchTopHN];
|
|
||||||
}
|
|
||||||
|
|
||||||
class HackernewsView extends SvelteComponent {
|
|
||||||
constructor(options) {
|
|
||||||
super();
|
|
||||||
|
|
||||||
init(
|
|
||||||
this,
|
|
||||||
options,
|
|
||||||
instance,
|
|
||||||
create_fragment,
|
|
||||||
safe_not_equal,
|
|
||||||
{
|
|
||||||
manager: 3,
|
|
||||||
refreshInterval: 0,
|
|
||||||
fetchTopHN: 4,
|
|
||||||
saveHNItem: 1
|
|
||||||
},
|
|
||||||
add_css
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
get fetchTopHN() {
|
|
||||||
return this.$$.ctx[4];
|
|
||||||
}
|
|
||||||
|
|
||||||
get saveHNItem() {
|
|
||||||
return this.$$.ctx[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class HackerNewsView extends obsidian.ItemView {
|
|
||||||
constructor(leaf, plugin) {
|
|
||||||
super(leaf);
|
|
||||||
this.plugin = plugin;
|
|
||||||
}
|
|
||||||
getViewType() {
|
|
||||||
return VIEW_TYPE;
|
|
||||||
}
|
|
||||||
getDisplayText() {
|
|
||||||
return VIEW_DISPLAY_TEXT;
|
|
||||||
}
|
|
||||||
getIcon() {
|
|
||||||
return VIEW_ICON;
|
|
||||||
}
|
|
||||||
onClose() {
|
|
||||||
this._view.$destroy();
|
|
||||||
return super.onClose();
|
|
||||||
}
|
|
||||||
onOpen() {
|
|
||||||
this._view = new HackernewsView({
|
|
||||||
target: this.contentEl,
|
|
||||||
props: {
|
|
||||||
manager: this.plugin.manager,
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this._view.$set({
|
|
||||||
refreshInterval: this.plugin.settings.defaultRefreshInterval,
|
|
||||||
});
|
|
||||||
return super.onOpen();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const { moment } = require('obsidian');
|
|
||||||
class APIManager {
|
|
||||||
constructor(plugin) {
|
|
||||||
this.plugin = plugin;
|
|
||||||
}
|
|
||||||
requestTopHN() {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
let itemIds;
|
|
||||||
try {
|
|
||||||
const url = "https://hacker-news.firebaseio.com/v0/topstories.json";
|
|
||||||
const response = yield fetch(url);
|
|
||||||
itemIds = (yield response.json());
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
return Promise.reject(error);
|
|
||||||
}
|
|
||||||
const itemId = itemIds[Math.floor(Math.random() * itemIds.slice(0, 25).length)];
|
|
||||||
const itemResponse = yield fetch(`https://hacker-news.firebaseio.com/v0/item/${itemId}.json?print=pretty`);
|
|
||||||
const hnItem = (yield itemResponse.json());
|
|
||||||
return hnItem;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
saveHNItem(hnItem) {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
const dir = this.plugin.settings.storiesFolder;
|
|
||||||
const title = hnItem.title.replace(/[\/\\\:]/g, ' ');
|
|
||||||
const filePath = obsidian.normalizePath([dir, `${title}.md`].join('/'));
|
|
||||||
const vault = this.plugin.app.vault;
|
|
||||||
let stat = yield vault.adapter.stat(dir);
|
|
||||||
if (!stat) {
|
|
||||||
yield vault.createFolder(dir);
|
|
||||||
}
|
|
||||||
stat = yield vault.adapter.stat(filePath);
|
|
||||||
if (!stat) {
|
|
||||||
yield vault.create(filePath, this.getStoryFileContent(hnItem));
|
|
||||||
new obsidian.Notice(`Story saved: ${hnItem.title}`);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
new obsidian.Notice("Story already saved");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
getStoryFileContent(hnItem) {
|
|
||||||
let data = this.plugin.settings.storyTemplate;
|
|
||||||
return data.replace(/{{title}}/g, hnItem.title)
|
|
||||||
.replace(/{{url}}/g, hnItem.url)
|
|
||||||
.replace(/{{date}}/g, moment().format('LLLL'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const icons = {
|
|
||||||
hackernews: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 24" fill="none" fill-opacity="0.0" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-book-open"><path d="M21.27,0c-1.174,2.021-5.5,9.464-5.532,9.499h-0.11C15.595,9.464,11.424,2.073,10.253,0H3.148l9.253,15.034v15.927h6.157 V15.034L27.812,0H21.27z"/></svg>`,
|
|
||||||
};
|
|
||||||
const addIcons = () => {
|
|
||||||
Object.keys(icons).forEach((key) => {
|
|
||||||
obsidian.addIcon(key, icons[key]);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
class HackerNewsPlugin extends obsidian.Plugin {
|
|
||||||
onload() {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
console.log('loading hackernews');
|
|
||||||
yield this.loadSettings();
|
|
||||||
addIcons();
|
|
||||||
this.addSettingTab(new SettingsTab(this.app, this));
|
|
||||||
this.manager = new APIManager(this);
|
|
||||||
this.registerView(VIEW_TYPE, (leaf) => {
|
|
||||||
return new HackerNewsView(leaf, this);
|
|
||||||
});
|
|
||||||
this.addCommand({
|
|
||||||
id: 'hackernews-open-view',
|
|
||||||
name: t('Open HackerNews'),
|
|
||||||
callback: this.openWindowLeaf.bind(this),
|
|
||||||
});
|
|
||||||
this.app.workspace.onLayoutReady(this.openWindowLeaf.bind(this));
|
|
||||||
let refreshInterval = parseInt(this.settings.defaultRefreshInterval);
|
|
||||||
if (Number.isNaN(refreshInterval) || refreshInterval <= 0) {
|
|
||||||
refreshInterval = 60;
|
|
||||||
}
|
|
||||||
dispatchEvent(new Event('obsidian-hackernews-fetchTopHN'));
|
|
||||||
this.registerInterval(window.setInterval(() => {
|
|
||||||
dispatchEvent(new Event('obsidian-hackernews-fetchTopHN'));
|
|
||||||
}, refreshInterval * 1000));
|
|
||||||
console.log('refreshInterval', refreshInterval, 'seconds');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
onunload() {
|
|
||||||
console.log('unloading hackernews');
|
|
||||||
for (let leaf of this.app.workspace.getLeavesOfType(VIEW_TYPE)) {
|
|
||||||
leaf.detach();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
openWindowLeaf() {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
if (this.app.workspace.getLeavesOfType(VIEW_TYPE).length == 0) {
|
|
||||||
yield this.app.workspace.getRightLeaf(false).setViewState({
|
|
||||||
type: VIEW_TYPE,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
this.app.workspace.revealLeaf(this.app.workspace.getLeavesOfType(VIEW_TYPE).first());
|
|
||||||
dispatchEvent(new Event('obsidian-hackernews-fetchTopHN'));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = HackerNewsPlugin;
|
|
||||||
//# sourceMappingURL=main.js.map
|
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "obsidian-hackernews",
|
|
||||||
"name": "HackerNews",
|
|
||||||
"version": "1.0.5",
|
|
||||||
"minAppVersion": "0.9.12",
|
|
||||||
"description": "Periodically fetches and displays top stories from HackerNews.",
|
|
||||||
"author": "Arpit Bhayani",
|
|
||||||
"authorUrl": "https://arpitbhayani.me",
|
|
||||||
"isDesktopOnly": false
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
Not Found
|
|
@ -0,0 +1,115 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
title: "🗒 Daily Note"
|
||||||
|
allDay: true
|
||||||
|
date: 2022-10-03
|
||||||
|
Date: 2022-10-03
|
||||||
|
DocType: Note
|
||||||
|
Hierarchy:
|
||||||
|
TimeStamp:
|
||||||
|
location:
|
||||||
|
CollapseMetaTable: true
|
||||||
|
Sleep: 8
|
||||||
|
Happiness: 90
|
||||||
|
Gratefulness: 90
|
||||||
|
Stress: 25
|
||||||
|
FrontHeadBar: 5
|
||||||
|
EarHeadBar: 30
|
||||||
|
BackHeadBar: 20
|
||||||
|
Water: 3.15
|
||||||
|
Coffee: 3
|
||||||
|
Steps: 6128
|
||||||
|
Ski:
|
||||||
|
Riding:
|
||||||
|
Racket:
|
||||||
|
Football:
|
||||||
|
Swim:
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
%% Parent:: [[@Life Admin]] %%
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[[2022-10-02|<< 🗓 Previous ]]       [[@Main Dashboard|Back]]       [[2022-10-04|🗓 Next >>]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
```button
|
||||||
|
name Record today's health
|
||||||
|
type command
|
||||||
|
action MetaEdit: Run MetaEdit
|
||||||
|
id EditMetaData
|
||||||
|
```
|
||||||
|
^button-2022-10-03Edit
|
||||||
|
|
||||||
|
```button
|
||||||
|
name Save
|
||||||
|
type command
|
||||||
|
action Save current file
|
||||||
|
id Save
|
||||||
|
```
|
||||||
|
^button-2022-10-03NSave
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
# 2022-10-03
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
> [!summary]+
|
||||||
|
> Daily note for 2022-10-03
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
```toc
|
||||||
|
style: number
|
||||||
|
```
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
### 📝 Memos
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
This section does serve for quick memos.
|
||||||
|
|
||||||
|
 
|
||||||
|
- 21:18 [[Rocky (1976)|Rocky]] a la maison [[2022-10-03|aujd'hui]]
|
||||||
|
|
||||||
|
|
||||||
|
%% --- %%
|
||||||
|
 
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
### 🗒 Notes
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
Loret ipsum
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
### :link: Linked activity
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
```dataview
|
||||||
|
Table from [[2022-10-03]]
|
||||||
|
```
|
||||||
|
|
||||||
|
 
|
||||||
|
 
|
@ -0,0 +1,115 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
title: "🗒 Daily Note"
|
||||||
|
allDay: true
|
||||||
|
date: 2022-10-04
|
||||||
|
Date: 2022-10-04
|
||||||
|
DocType: Note
|
||||||
|
Hierarchy:
|
||||||
|
TimeStamp:
|
||||||
|
location:
|
||||||
|
CollapseMetaTable: true
|
||||||
|
Sleep: 7.5
|
||||||
|
Happiness: 90
|
||||||
|
Gratefulness: 90
|
||||||
|
Stress: 25
|
||||||
|
FrontHeadBar: 5
|
||||||
|
EarHeadBar: 30
|
||||||
|
BackHeadBar: 20
|
||||||
|
Water: 4.2
|
||||||
|
Coffee: 5
|
||||||
|
Steps: 11765
|
||||||
|
Ski:
|
||||||
|
Riding:
|
||||||
|
Racket:
|
||||||
|
Football:
|
||||||
|
Swim:
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
%% Parent:: [[@Life Admin]] %%
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[[2022-10-03|<< 🗓 Previous ]]       [[@Main Dashboard|Back]]       [[2022-10-05|🗓 Next >>]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
```button
|
||||||
|
name Record today's health
|
||||||
|
type command
|
||||||
|
action MetaEdit: Run MetaEdit
|
||||||
|
id EditMetaData
|
||||||
|
```
|
||||||
|
^button-2022-10-04Edit
|
||||||
|
|
||||||
|
```button
|
||||||
|
name Save
|
||||||
|
type command
|
||||||
|
action Save current file
|
||||||
|
id Save
|
||||||
|
```
|
||||||
|
^button-2022-10-04NSave
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
# 2022-10-04
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
> [!summary]+
|
||||||
|
> Daily note for 2022-10-04
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
```toc
|
||||||
|
style: number
|
||||||
|
```
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
### 📝 Memos
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
This section does serve for quick memos.
|
||||||
|
|
||||||
|
 
|
||||||
|
- [ ] 18:10 :plate_with_cutlery: [[@family]]: book resto a Paris pour le danche 23 Oct 📅 2022-10-08 ^err01k
|
||||||
|
|
||||||
|
|
||||||
|
%% --- %%
|
||||||
|
 
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
### 🗒 Notes
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
Loret ipsum
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
### :link: Linked activity
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
```dataview
|
||||||
|
Table from [[2022-10-04]]
|
||||||
|
```
|
||||||
|
|
||||||
|
 
|
||||||
|
 
|
@ -0,0 +1,114 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
title: "🗒 Daily Note"
|
||||||
|
allDay: true
|
||||||
|
date: 2022-10-05
|
||||||
|
Date: 2022-10-05
|
||||||
|
DocType: Note
|
||||||
|
Hierarchy:
|
||||||
|
TimeStamp:
|
||||||
|
location:
|
||||||
|
CollapseMetaTable: true
|
||||||
|
Sleep: 7.5
|
||||||
|
Happiness: 90
|
||||||
|
Gratefulness: 90
|
||||||
|
Stress: 25
|
||||||
|
FrontHeadBar: 5
|
||||||
|
EarHeadBar: 30
|
||||||
|
BackHeadBar: 20
|
||||||
|
Water: 3.06
|
||||||
|
Coffee: 4
|
||||||
|
Steps: 7717
|
||||||
|
Ski:
|
||||||
|
Riding:
|
||||||
|
Racket:
|
||||||
|
Football:
|
||||||
|
Swim:
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
%% Parent:: [[@Life Admin]] %%
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[[2022-10-04|<< 🗓 Previous ]]       [[@Main Dashboard|Back]]       [[2022-10-06|🗓 Next >>]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
```button
|
||||||
|
name Record today's health
|
||||||
|
type command
|
||||||
|
action MetaEdit: Run MetaEdit
|
||||||
|
id EditMetaData
|
||||||
|
```
|
||||||
|
^button-2022-10-05Edit
|
||||||
|
|
||||||
|
```button
|
||||||
|
name Save
|
||||||
|
type command
|
||||||
|
action Save current file
|
||||||
|
id Save
|
||||||
|
```
|
||||||
|
^button-2022-10-05NSave
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
# 2022-10-05
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
> [!summary]+
|
||||||
|
> Daily note for 2022-10-05
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
```toc
|
||||||
|
style: number
|
||||||
|
```
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
### 📝 Memos
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
This section does serve for quick memos.
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
|
||||||
|
%% --- %%
|
||||||
|
 
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
### 🗒 Notes
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
Loret ipsum
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
### :link: Linked activity
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
```dataview
|
||||||
|
Table from [[2022-10-05]]
|
||||||
|
```
|
||||||
|
|
||||||
|
 
|
||||||
|
 
|
@ -0,0 +1,114 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
title: "🗒 Daily Note"
|
||||||
|
allDay: true
|
||||||
|
date: 2022-10-06
|
||||||
|
Date: 2022-10-06
|
||||||
|
DocType: Note
|
||||||
|
Hierarchy:
|
||||||
|
TimeStamp:
|
||||||
|
location:
|
||||||
|
CollapseMetaTable: true
|
||||||
|
Sleep: 6.5
|
||||||
|
Happiness: 90
|
||||||
|
Gratefulness: 90
|
||||||
|
Stress: 25
|
||||||
|
FrontHeadBar: 5
|
||||||
|
EarHeadBar: 30
|
||||||
|
BackHeadBar: 20
|
||||||
|
Water: 0.2
|
||||||
|
Coffee: 2
|
||||||
|
Steps:
|
||||||
|
Ski:
|
||||||
|
Riding:
|
||||||
|
Racket:
|
||||||
|
Football:
|
||||||
|
Swim:
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
%% Parent:: [[@Life Admin]] %%
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[[2022-10-05|<< 🗓 Previous ]]       [[@Main Dashboard|Back]]       [[2022-10-07|🗓 Next >>]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
```button
|
||||||
|
name Record today's health
|
||||||
|
type command
|
||||||
|
action MetaEdit: Run MetaEdit
|
||||||
|
id EditMetaData
|
||||||
|
```
|
||||||
|
^button-2022-10-06Edit
|
||||||
|
|
||||||
|
```button
|
||||||
|
name Save
|
||||||
|
type command
|
||||||
|
action Save current file
|
||||||
|
id Save
|
||||||
|
```
|
||||||
|
^button-2022-10-06NSave
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
# 2022-10-06
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
> [!summary]+
|
||||||
|
> Daily note for 2022-10-06
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
```toc
|
||||||
|
style: number
|
||||||
|
```
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
### 📝 Memos
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
This section does serve for quick memos.
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
|
||||||
|
%% --- %%
|
||||||
|
 
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
### 🗒 Notes
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
Loret ipsum
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
### :link: Linked activity
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
```dataview
|
||||||
|
Table from [[2022-10-06]]
|
||||||
|
```
|
||||||
|
|
||||||
|
 
|
||||||
|
 
|
@ -0,0 +1,93 @@
|
|||||||
|
---
|
||||||
|
type: "movie"
|
||||||
|
title: "Lock, Stock and Two Smoking Barrels"
|
||||||
|
englishTitle: "Lock, Stock and Two Smoking Barrels"
|
||||||
|
year: "1998"
|
||||||
|
dataSource: "OMDbAPI"
|
||||||
|
url: "https://www.imdb.com/title/tt0120735/"
|
||||||
|
id: "tt0120735"
|
||||||
|
genres:
|
||||||
|
- "Action"
|
||||||
|
- "Comedy"
|
||||||
|
- "Crime"
|
||||||
|
producer: "Guy Ritchie"
|
||||||
|
duration: "107 min"
|
||||||
|
onlineRating: 8.2
|
||||||
|
image: "https://m.media-amazon.com/images/M/MV5BMTAyN2JmZmEtNjAyMy00NzYwLThmY2MtYWQ3OGNhNjExMmM4XkEyXkFqcGdeQXVyNDk3NzU2MTQ@._V1_SX300.jpg"
|
||||||
|
released: true
|
||||||
|
premiere: "28/08/1998"
|
||||||
|
watched: true
|
||||||
|
lastWatched: "2021/08/08"
|
||||||
|
personalRating: 8
|
||||||
|
tags: "#mediaDB/tv/movie"
|
||||||
|
CollapseMetaTable: true
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Parent:: [[@Cinematheque]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
dv.paragraph(`> [!${dv.current().watched ? 'SUCCESS' : 'WARNING'}] ${dv.current().watched ? 'last watched on ' + dv.current().lastWatched : 'not yet watched'}`)
|
||||||
|
```
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
# `$= dv.current().title`
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
`$= dv.current().watched ? '**Rating**: ' + dv.current().personalRating + ' out of 10' : ''`
|
||||||
|
|
||||||
|
```toc
|
||||||
|
```
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
### Details
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
**Genres**:
|
||||||
|
`$= dv.current().genres.length === 0 ? ' - none' : dv.list(dv.current().genres)`
|
||||||
|
|
||||||
|
`$= !dv.current().released ? '**Not released** The movie is not yet released.' : ''`
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
```dataview
|
||||||
|
list without id
|
||||||
|
"<table><tbody><tr><td><a class=heading>Type</a></td>"
|
||||||
|
+
|
||||||
|
"<td><span style='color: var(--footnote);'>" + this.type + "</span></td></tr>"
|
||||||
|
+
|
||||||
|
"<tr><td><a class=heading>Online Rating</a></td>"
|
||||||
|
+
|
||||||
|
"<td><span style='color: var(--footnote);'>" + this.onlineRating + "</span></td></tr>"
|
||||||
|
+
|
||||||
|
"<tr><td><a class=heading>Duration</a></td>"
|
||||||
|
+
|
||||||
|
"<td><span style='color: var(--footnote);'>" + this.duration + "</span></td></tr>"
|
||||||
|
+
|
||||||
|
"<tr><td><a class=heading>Premiered</a></td>"
|
||||||
|
+
|
||||||
|
"<td><span style='color: var(--footnote);'>" + this.premiere + "</span></td></tr>"
|
||||||
|
+
|
||||||
|
"<tr><td><a class=heading>Producer</a></td>"
|
||||||
|
+
|
||||||
|
"<td><span style='color: var(--footnote);'>" + this.producer + "</span></td></tr></tbody></table>"
|
||||||
|
FROM "03.04 Cinematheque/Lock Stock and Two Smoking Barrels (1998)"
|
||||||
|
```
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
### Poster
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
`$= '![Image|360](' + dv.current().image + ')'`
|
@ -0,0 +1,93 @@
|
|||||||
|
---
|
||||||
|
type: "movie"
|
||||||
|
title: "RocknRolla"
|
||||||
|
englishTitle: "RocknRolla"
|
||||||
|
year: "2008"
|
||||||
|
dataSource: "OMDbAPI"
|
||||||
|
url: "https://www.imdb.com/title/tt1032755/"
|
||||||
|
id: "tt1032755"
|
||||||
|
genres:
|
||||||
|
- "Action"
|
||||||
|
- "Crime"
|
||||||
|
- "Thriller"
|
||||||
|
producer: "Guy Ritchie"
|
||||||
|
duration: "114 min"
|
||||||
|
onlineRating: 7.2
|
||||||
|
image: "https://m.media-amazon.com/images/M/MV5BMTQ0NTk5Mzk2OV5BMl5BanBnXkFtZTcwMDE3NTE4MQ@@._V1_SX300.jpg"
|
||||||
|
released: true
|
||||||
|
premiere: "31/10/2008"
|
||||||
|
watched: true
|
||||||
|
lastWatched: "2021/10/10"
|
||||||
|
personalRating: 8
|
||||||
|
tags: "#mediaDB/tv/movie"
|
||||||
|
CollapseMetaTable: true
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Parent:: [[@Cinematheque]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
dv.paragraph(`> [!${dv.current().watched ? 'SUCCESS' : 'WARNING'}] ${dv.current().watched ? 'last watched on ' + dv.current().lastWatched : 'not yet watched'}`)
|
||||||
|
```
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
# `$= dv.current().title`
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
`$= dv.current().watched ? '**Rating**: ' + dv.current().personalRating + ' out of 10' : ''`
|
||||||
|
|
||||||
|
```toc
|
||||||
|
```
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
### Details
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
**Genres**:
|
||||||
|
`$= dv.current().genres.length === 0 ? ' - none' : dv.list(dv.current().genres)`
|
||||||
|
|
||||||
|
`$= !dv.current().released ? '**Not released** The movie is not yet released.' : ''`
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
```dataview
|
||||||
|
list without id
|
||||||
|
"<table><tbody><tr><td><a class=heading>Type</a></td>"
|
||||||
|
+
|
||||||
|
"<td><span style='color: var(--footnote);'>" + this.type + "</span></td></tr>"
|
||||||
|
+
|
||||||
|
"<tr><td><a class=heading>Online Rating</a></td>"
|
||||||
|
+
|
||||||
|
"<td><span style='color: var(--footnote);'>" + this.onlineRating + "</span></td></tr>"
|
||||||
|
+
|
||||||
|
"<tr><td><a class=heading>Duration</a></td>"
|
||||||
|
+
|
||||||
|
"<td><span style='color: var(--footnote);'>" + this.duration + "</span></td></tr>"
|
||||||
|
+
|
||||||
|
"<tr><td><a class=heading>Premiered</a></td>"
|
||||||
|
+
|
||||||
|
"<td><span style='color: var(--footnote);'>" + this.premiere + "</span></td></tr>"
|
||||||
|
+
|
||||||
|
"<tr><td><a class=heading>Producer</a></td>"
|
||||||
|
+
|
||||||
|
"<td><span style='color: var(--footnote);'>" + this.producer + "</span></td></tr></tbody></table>"
|
||||||
|
FROM "03.04 Cinematheque/RocknRolla (2008)"
|
||||||
|
```
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
### Poster
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
`$= '![Image|360](' + dv.current().image + ')'`
|
@ -0,0 +1,93 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
type: "movie"
|
||||||
|
title: "Rocky"
|
||||||
|
englishTitle: "Rocky"
|
||||||
|
year: "1976"
|
||||||
|
dataSource: "OMDbAPI"
|
||||||
|
url: "https://www.imdb.com/title/tt0075148/"
|
||||||
|
id: "tt0075148"
|
||||||
|
genres:
|
||||||
|
- "Drama"
|
||||||
|
- "Sport"
|
||||||
|
producer: "John G. Avildsen"
|
||||||
|
duration: "120 min"
|
||||||
|
onlineRating: 8.1
|
||||||
|
image: "https://m.media-amazon.com/images/M/MV5BNTBkMjg2MjYtYTZjOS00ODQ0LTg0MDEtM2FiNmJmOGU1NGEwXkEyXkFqcGdeQXVyMjUzOTY1NTc@._V1_SX300.jpg"
|
||||||
|
released: true
|
||||||
|
premiere: "03/12/1976"
|
||||||
|
watched: true
|
||||||
|
lastWatched: "2022/10/03"
|
||||||
|
personalRating: 0
|
||||||
|
tags: "#mediaDB/tv/movie"
|
||||||
|
CollapseMetaTable: true
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Parent:: [[@Cinematheque]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
dv.paragraph(`> [!${dv.current().watched ? 'SUCCESS' : 'WARNING'}] ${dv.current().watched ? 'last watched on ' + dv.current().lastWatched : 'not yet watched'}`)
|
||||||
|
```
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
# `$= dv.current().title`
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
`$= dv.current().watched ? '**Rating**: ' + dv.current().personalRating + ' out of 10' : ''`
|
||||||
|
|
||||||
|
```toc
|
||||||
|
```
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
### Details
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
**Genres**:
|
||||||
|
`$= dv.current().genres.length === 0 ? ' - none' : dv.list(dv.current().genres)`
|
||||||
|
|
||||||
|
`$= !dv.current().released ? '**Not released** The movie is not yet released.' : ''`
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
```dataview
|
||||||
|
list without id
|
||||||
|
"<table><tbody><tr><td><a class=heading>Type</a></td>"
|
||||||
|
+
|
||||||
|
"<td><span style='color: var(--footnote);'>" + this.type + "</span></td></tr>"
|
||||||
|
+
|
||||||
|
"<tr><td><a class=heading>Online Rating</a></td>"
|
||||||
|
+
|
||||||
|
"<td><span style='color: var(--footnote);'>" + this.onlineRating + "</span></td></tr>"
|
||||||
|
+
|
||||||
|
"<tr><td><a class=heading>Duration</a></td>"
|
||||||
|
+
|
||||||
|
"<td><span style='color: var(--footnote);'>" + this.duration + "</span></td></tr>"
|
||||||
|
+
|
||||||
|
"<tr><td><a class=heading>Premiered</a></td>"
|
||||||
|
+
|
||||||
|
"<td><span style='color: var(--footnote);'>" + this.premiere + "</span></td></tr>"
|
||||||
|
+
|
||||||
|
"<tr><td><a class=heading>Producer</a></td>"
|
||||||
|
+
|
||||||
|
"<td><span style='color: var(--footnote);'>" + this.producer + "</span></td></tr></tbody></table>"
|
||||||
|
FROM "03.04 Cinematheque/Rocky (1976)"
|
||||||
|
```
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
### Poster
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
`$= '![Image|360](' + dv.current().image + ')'`
|
@ -0,0 +1,92 @@
|
|||||||
|
---
|
||||||
|
type: "movie"
|
||||||
|
title: "Snatch"
|
||||||
|
englishTitle: "Snatch"
|
||||||
|
year: "2000"
|
||||||
|
dataSource: "OMDbAPI"
|
||||||
|
url: "https://www.imdb.com/title/tt0208092/"
|
||||||
|
id: "tt0208092"
|
||||||
|
genres:
|
||||||
|
- "Comedy"
|
||||||
|
- "Crime"
|
||||||
|
producer: "Guy Ritchie"
|
||||||
|
duration: "102 min"
|
||||||
|
onlineRating: 8.2
|
||||||
|
image: "https://m.media-amazon.com/images/M/MV5BMTA2NDYxOGYtYjU1Mi00Y2QzLTgxMTQtMWI1MGI0ZGQ5MmU4XkEyXkFqcGdeQXVyNDk3NzU2MTQ@._V1_SX300.jpg"
|
||||||
|
released: true
|
||||||
|
premiere: "19/01/2001"
|
||||||
|
watched: true
|
||||||
|
lastWatched: "2021/09/09"
|
||||||
|
personalRating: 8
|
||||||
|
tags: "#mediaDB/tv/movie"
|
||||||
|
CollapseMetaTable: true
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Parent:: [[@Cinematheque]]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
```dataviewjs
|
||||||
|
dv.paragraph(`> [!${dv.current().watched ? 'SUCCESS' : 'WARNING'}] ${dv.current().watched ? 'last watched on ' + dv.current().lastWatched : 'not yet watched'}`)
|
||||||
|
```
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
# `$= dv.current().title`
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
`$= dv.current().watched ? '**Rating**: ' + dv.current().personalRating + ' out of 10' : ''`
|
||||||
|
|
||||||
|
```toc
|
||||||
|
```
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
### Details
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
**Genres**:
|
||||||
|
`$= dv.current().genres.length === 0 ? ' - none' : dv.list(dv.current().genres)`
|
||||||
|
|
||||||
|
`$= !dv.current().released ? '**Not released** The movie is not yet released.' : ''`
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
```dataview
|
||||||
|
list without id
|
||||||
|
"<table><tbody><tr><td><a class=heading>Type</a></td>"
|
||||||
|
+
|
||||||
|
"<td><span style='color: var(--footnote);'>" + this.type + "</span></td></tr>"
|
||||||
|
+
|
||||||
|
"<tr><td><a class=heading>Online Rating</a></td>"
|
||||||
|
+
|
||||||
|
"<td><span style='color: var(--footnote);'>" + this.onlineRating + "</span></td></tr>"
|
||||||
|
+
|
||||||
|
"<tr><td><a class=heading>Duration</a></td>"
|
||||||
|
+
|
||||||
|
"<td><span style='color: var(--footnote);'>" + this.duration + "</span></td></tr>"
|
||||||
|
+
|
||||||
|
"<tr><td><a class=heading>Premiered</a></td>"
|
||||||
|
+
|
||||||
|
"<td><span style='color: var(--footnote);'>" + this.premiere + "</span></td></tr>"
|
||||||
|
+
|
||||||
|
"<tr><td><a class=heading>Producer</a></td>"
|
||||||
|
+
|
||||||
|
"<td><span style='color: var(--footnote);'>" + this.producer + "</span></td></tr></tbody></table>"
|
||||||
|
FROM "03.04 Cinematheque/Snatch (2000)"
|
||||||
|
```
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
### Poster
|
||||||
|
|
||||||
|
 
|
||||||
|
|
||||||
|
`$= '![Image|360](' + dv.current().image + ')'`
|
Loading…
Reference in new issue