initial import

This commit is contained in:
KemoNine 2024-10-02 14:57:21 -04:00
commit c570fa3a65
77 changed files with 78237 additions and 0 deletions

1
.nomedia Normal file
View file

@ -0,0 +1 @@
/storage/emulated/0/Krita

1
.obsidian/.nomedia vendored Normal file
View file

@ -0,0 +1 @@
/storage/emulated/0/Krita

10
.obsidian/app.json vendored Normal file
View file

@ -0,0 +1,10 @@
{
"defaultViewMode": "preview",
"livePreview": false,
"autoPairBrackets": false,
"autoPairMarkdown": false,
"alwaysUpdateLinks": true,
"newLinkFormat": "absolute",
"useMarkdownLinks": true,
"showUnsupportedFiles": true
}

6
.obsidian/appearance.json vendored Normal file
View file

@ -0,0 +1,6 @@
{
"theme": "moonstone",
"interfaceFontFamily": "Atkinson Hyperlegible",
"textFontFamily": "Atkinson Hyperlegible",
"monospaceFontFamily": "DejaVu Sans Mono"
}

5
.obsidian/canvas.json vendored Normal file
View file

@ -0,0 +1,5 @@
{
"snapToObjects": true,
"snapToGrid": true,
"defaultWheelBehavior": "zoom"
}

8
.obsidian/command-palette.json vendored Normal file
View file

@ -0,0 +1,8 @@
{
"pinned": [
"dashboard-navigator:navigator",
"dashboard-navigator:dashboard",
"switcher:open",
"templater-obsidian:create-new-note-from-template"
]
}

16
.obsidian/community-plugins.json vendored Normal file
View file

@ -0,0 +1,16 @@
[
"automatic-table-of-contents",
"colored-tags-wrangler",
"dashboard-navigator",
"note-gallery",
"obsidian-sort-and-permute-lines",
"tag-word-cloud",
"templater-obsidian",
"obsidian-notes-from-template",
"orgmode-cm6",
"definition-list",
"dataview",
"qatt",
"customjs",
"obsidian42-brat"
]

30
.obsidian/core-plugins-migration.json vendored Normal file
View file

@ -0,0 +1,30 @@
{
"file-explorer": true,
"global-search": true,
"switcher": true,
"graph": true,
"backlink": true,
"canvas": true,
"outgoing-link": true,
"tag-pane": true,
"properties": false,
"page-preview": true,
"daily-notes": false,
"templates": false,
"note-composer": false,
"command-palette": true,
"slash-command": false,
"editor-status": true,
"bookmarks": true,
"markdown-importer": false,
"zk-prefixer": false,
"random-note": false,
"outline": true,
"word-count": false,
"slides": false,
"audio-recorder": false,
"workspaces": false,
"file-recovery": true,
"publish": false,
"sync": false
}

16
.obsidian/core-plugins.json vendored Normal file
View file

@ -0,0 +1,16 @@
[
"file-explorer",
"global-search",
"switcher",
"graph",
"backlink",
"canvas",
"outgoing-link",
"tag-pane",
"page-preview",
"command-palette",
"editor-status",
"bookmarks",
"outline",
"file-recovery"
]

View file

@ -0,0 +1,291 @@
let Plugin = class {}
let MarkdownRenderer = {}
let MarkdownRenderChild = class {}
let htmlToMarkdown = (html) => html
if (isObsidian()) {
const obsidian = require('obsidian')
Plugin = obsidian.Plugin
MarkdownRenderer = obsidian.MarkdownRenderer
MarkdownRenderChild = obsidian.MarkdownRenderChild
htmlToMarkdown = obsidian.htmlToMarkdown
}
const codeblockId = 'table-of-contents'
const codeblockIdShort = 'toc'
const availableOptions = {
title: {
type: 'string',
default: '',
comment: '',
},
style: {
type: 'value',
default: 'nestedList',
values: ['nestedList', 'nestedOrderedList', 'inlineFirstLevel'],
comment: 'TOC style (nestedList|nestedOrderedList|inlineFirstLevel)',
},
minLevel: {
type: 'number',
default: 0,
comment: 'Include headings from the specified level',
},
maxLevel: {
type: 'number',
default: 0,
comment: 'Include headings up to the specified level',
},
includeLinks: {
type: 'boolean',
default: true,
comment: 'Make headings clickable',
},
debugInConsole: {
type: 'boolean',
default: false,
comment: 'Print debug info in Obsidian console',
},
}
class ObsidianAutomaticTableOfContents extends Plugin {
async onload() {
const handler = (sourceText, element, context) => {
context.addChild(new Renderer(this.app, element, context.sourcePath, sourceText))
}
this.registerMarkdownCodeBlockProcessor(codeblockId, handler)
this.registerMarkdownCodeBlockProcessor(codeblockIdShort, handler)
this.addCommand({
id: 'insert-automatic-table-of-contents',
name: 'Insert table of contents',
editorCallback: onInsertToc,
})
this.addCommand({
id: 'insert-automatic-table-of-contents-docs',
name: 'Insert table of contents (documented)',
editorCallback: onInsertTocWithDocs,
})
}
}
function onInsertToc(editor) {
const markdown = '```' + codeblockId + '\n```'
editor.replaceRange(markdown, editor.getCursor())
}
function onInsertTocWithDocs(editor) {
let markdown = ['```' + codeblockId]
Object.keys(availableOptions).forEach((optionName) => {
const option = availableOptions[optionName]
const comment = option.comment.length > 0 ? ` # ${option.comment}` : ''
markdown.push(`${optionName}: ${option.default}${comment}`)
})
markdown.push('```')
editor.replaceRange(markdown.join('\n'), editor.getCursor())
}
class Renderer extends MarkdownRenderChild {
constructor(app, element, sourcePath, sourceText) {
super(element)
this.app = app
this.element = element
this.sourcePath = sourcePath
this.sourceText = sourceText
}
// Render on load
onload() {
this.render()
this.registerEvent(this.app.metadataCache.on('changed', this.onMetadataChange.bind(this)))
}
// Render on file change
onMetadataChange() {
this.render()
}
render() {
try {
const options = parseOptionsFromSourceText(this.sourceText)
if (options.debugInConsole) debug('Options', options)
const metadata = this.app.metadataCache.getCache(this.sourcePath)
const headings = metadata && metadata.headings ? metadata.headings : []
if (options.debugInConsole) debug('Headings', headings)
const markdown = getMarkdownFromHeadings(headings, options)
if (options.debugInConsole) debug('Markdown', markdown)
this.element.empty()
MarkdownRenderer.renderMarkdown(markdown, this.element, this.sourcePath, this)
} catch(error) {
const readableError = `_💥 Could not render table of contents (${error.message})_`
MarkdownRenderer.renderMarkdown(readableError, this.element, this.sourcePath, this)
}
}
}
function getMarkdownFromHeadings(headings, options) {
const markdownHandlersByStyle = {
nestedList: getMarkdownNestedListFromHeadings,
nestedOrderedList: getMarkdownNestedOrderedListFromHeadings,
inlineFirstLevel: getMarkdownInlineFirstLevelFromHeadings,
}
let markdown = ''
if (options.title && options.title.length > 0) {
markdown += options.title + '\n'
}
const noHeadingMessage = '_Table of contents: no headings found_'
markdown += markdownHandlersByStyle[options.style](headings, options) || noHeadingMessage
return markdown
}
function getMarkdownNestedListFromHeadings(headings, options) {
return getMarkdownListFromHeadings(headings, false, options)
}
function getMarkdownNestedOrderedListFromHeadings(headings, options) {
return getMarkdownListFromHeadings(headings, true, options)
}
function getMarkdownListFromHeadings(headings, isOrdered, options) {
const prefix = isOrdered ? '1.' : '-'
const lines = []
const minLevel = options.minLevel > 0
? options.minLevel
: Math.min(...headings.map((heading) => heading.level))
headings.forEach((heading) => {
if (heading.level < minLevel) return
if (options.maxLevel > 0 && heading.level > options.maxLevel) return
lines.push(`${'\t'.repeat(heading.level - minLevel)}${prefix} ${getMarkdownHeading(heading, options)}`)
})
return lines.length > 0 ? lines.join('\n') : null
}
function getMarkdownInlineFirstLevelFromHeadings(headings, options) {
const minLevel = options.minLevel > 0
? options.minLevel
: Math.min(...headings.map((heading) => heading.level))
const items = headings
.filter((heading) => heading.level === minLevel)
.map((heading) => {
return getMarkdownHeading(heading, options)
})
return items.length > 0 ? items.join(' | ') : null
}
function getMarkdownHeading(heading, options) {
const stripMarkdown = (text) => {
text = text.replaceAll('*', '').replaceAll('_', '').replaceAll('`', '')
text = text.replaceAll('==', '').replaceAll('~~', '')
text = text.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1') // Strip markdown links
return text
}
const stripHtml = (text) => stripMarkdown(htmlToMarkdown(text))
const stripWikilinks = (text, isForLink) => {
// Strip [[link|text]] format
// For the text part of the final link we only keep "text"
// For the link part we need the text + link
// Example: "# Some [[file.md|heading]]" must be translated to "[[#Some file.md heading|Some heading]]"
text = text.replace(/\[\[([^\]]+)\|([^\]]+)\]\]/g, isForLink ? '$1 $2' : '$2')
text = text.replace(/\[\[([^\]]+)\]\]/g, '$1') // Strip [[link]] format
// Replace malformed links & reserved wikilinks chars
text = text.replaceAll('[[', '').replaceAll('| ', isForLink ? '' : '- ').replaceAll('|', isForLink ? ' ' : '-')
return text
}
const stripTags = (text) => text.replaceAll('#', '')
if (options.includeLinks) {
// Remove markdown, HTML & wikilinks from text for readability, as they are not rendered in a wikilink
let text = heading.heading
text = stripMarkdown(text)
text = stripHtml(text)
text = stripWikilinks(text, false)
// Remove wikilinks & tags from link or it won't be clickable (on the other hand HTML & markdown must stay)
let link = heading.heading
link = stripWikilinks(link, true)
link = stripTags(link)
// Return wiklink style link
return `[[#${link}|${text}]]`
// Why not markdown links? Because even if it looks like the text part would have a better compatibility
// with complex headings (as it would support HTML, markdown, etc) the link part is messy,
// because it requires some encoding that looks buggy and undocumented; official docs state the link must be URL encoded
// (https://help.obsidian.md/Linking+notes+and+files/Internal+links#Supported+formats+for+internal+links)
// but it doesn't work properly, example: "## Some <em>heading</em> with simple HTML" must be encoded as:
// [Some <em>heading</em> with simple HTML](#Some%20<em>heading</em>%20with%20simpler%20HTML)
// and not
// [Some <em>heading</em> with simple HTML](#Some%20%3Cem%3Eheading%3C%2Fem%3E%20with%20simpler%20HTML)
// Also it won't be clickable at all if the heading contains #tags or more complex HTML
// (example: ## Some <em style="background: red">heading</em> #with-a-tag)
// (unless there is a way to encode these use cases that I didn't find)
}
return heading.heading
}
function parseOptionsFromSourceText(sourceText = '') {
const options = {}
Object.keys(availableOptions).forEach((option) => {
options[option] = availableOptions[option].default
})
sourceText.split('\n').forEach((line) => {
const option = parseOptionFromSourceLine(line)
if (option !== null) {
options[option.name] = option.value
}
})
return options
}
function parseOptionFromSourceLine(line) {
const matches = line.match(/([a-zA-Z0-9._ ]+):(.*)/)
if (line.startsWith('#') || !matches) return null
const possibleName = matches[1].trim()
const optionParams = availableOptions[possibleName]
let possibleValue = matches[2].trim()
if (!optionParams || optionParams.type !== 'string') {
// Strip comments from values except for strings (as a string may contain markdown)
possibleValue = possibleValue.replace(/#[^#]*$/, '').trim()
}
const valueError = new Error(`Invalid value for \`${possibleName}\``)
if (optionParams && optionParams.type === 'number') {
const value = parseInt(possibleValue)
if (value < 0) throw valueError
return { name: possibleName, value }
}
if (optionParams && optionParams.type === 'boolean') {
if (!['true', 'false'].includes(possibleValue)) throw valueError
return { name: possibleName, value: possibleValue === 'true' }
}
if (optionParams && optionParams.type === 'value') {
if (!optionParams.values.includes(possibleValue)) throw valueError
return { name: possibleName, value: possibleValue }
}
if (optionParams && optionParams.type === 'string') {
return { name: possibleName, value: possibleValue }
}
return null
}
function debug(type, data) {
console.log(...[
`%cAutomatic Table Of Contents %c${type}:\n`,
'color: orange; font-weight: bold',
'font-weight: bold',
data,
])
}
function isObsidian() {
if (typeof process !== 'object') {
return true // Obsidian mobile doesn't have a global process object
}
return !process.env || !process.env.JEST_WORKER_ID // Jest runtime is not Obsidian
}
if (isObsidian()) {
module.exports = ObsidianAutomaticTableOfContents
} else {
module.exports = {
parseOptionsFromSourceText,
getMarkdownFromHeadings,
}
}

View file

@ -0,0 +1,10 @@
{
"id": "automatic-table-of-contents",
"name": "Automatic Table Of Contents",
"version": "1.4.0",
"minAppVersion": "1.3.0",
"description": "Create a table of contents in a note, that updates itself when the note changes",
"author": "Johan Satgé",
"authorUrl": "https://github.com/johansatge",
"isDesktopOnly": false
}

View file

@ -0,0 +1,160 @@
{
"TagColors": {
"ColorPicker": [
{
"tag_name": "medical_professional_name\nmedical_practice",
"color": {
"r": 0,
"g": 0,
"b": 0
},
"background_color": {
"r": 0,
"g": 255,
"b": 0
},
"luminance_offset": 0.15
},
{
"tag_name": "test-result\nappointment\nhomework\nlog",
"color": {
"r": 0,
"g": 0,
"b": 0
},
"background_color": {
"r": 0,
"g": 255,
"b": 255
},
"luminance_offset": 0.15
},
{
"tag_name": "encounter\ndata\nmisc\nnote\nresearch-paper",
"color": {
"r": 255,
"g": 255,
"b": 255
},
"background_color": {
"r": 161,
"g": 87,
"b": 234
},
"luminance_offset": 0.15
},
{
"tag_name": "to-discuss\nto-research",
"color": {
"r": 255,
"g": 255,
"b": 255
},
"background_color": {
"r": 255,
"g": 0,
"b": 0
},
"luminance_offset": 0.15
},
{
"tag_name": "complete\nwith-others\nother_human",
"color": {
"r": 0,
"g": 0,
"b": 0
},
"background_color": {
"r": 249,
"g": 249,
"b": 47
},
"luminance_offset": 0.15
},
{
"tag_name": "symptom_name\ntest_name",
"color": {
"r": 255,
"g": 255,
"b": 255
},
"background_color": {
"r": 255,
"g": 102,
"b": 222
},
"luminance_offset": 0.15
},
{
"tag_name": "medical_discipline\ner\nmh\nph",
"color": {
"r": 0,
"g": 0,
"b": 0
},
"background_color": {
"r": 0,
"g": 204,
"b": 153
},
"luminance_offset": 0.15
}
],
"EnableMultipleTags": true,
"EnableSeparateBackground": true,
"EnableBackgroundOpacity": false,
"Values": {
"BackgroundOpacity": 0.45,
"LuminanceOffset": 0.15
}
},
"CSS": {
"NoteTags": true,
"NoteProperties": true,
"NoteBackgrounds": false,
"TagsNoWrap": true,
"TagsNoWrapText": "pre"
},
"FolderNote": {
"Enable": false,
"FolderTagLinks": [],
"EnableAutoDetect": true,
"EnableBackgroundOpacity": false,
"Values": {
"BackgroundOpacity": 0.45,
"ForceImportant": true,
"BorderRadius": "12px",
"Padding": "5px"
}
},
"Kanban": {
"Enable": false,
"EnableCards": false,
"EnableLists": false,
"HideHashtags": false,
"EnableBackgroundOpacity": false,
"Values": {
"BackgroundOpacity": 0.45,
"CardBackgroundOpacity": 0.2,
"CardBorderOpacity": 0.3,
"ListBackgroundOpacity": 0.2,
"ListBorderOpacity": 0.3
}
},
"Canvas": {
"Enable": false,
"EnableBackgroundOpacity": false,
"Values": {
"BackgroundOpacity": 0.45,
"CardBorderOpacity": 0.3,
"CardBackgroundLuminanceOffset": 0.15
}
},
"Debug": {
"Enable": false,
"EnableExperimentalCommands": false
},
"Info": {
"SettingsVersion": 14
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,11 @@
{
"id": "colored-tags-wrangler",
"name": "Colored Tags Wrangler",
"version": "0.19.3",
"minAppVersion": "0.15.0",
"description": "Assign colors to tags. Has integrations with other plugins, like Kanban.",
"author": "AndreasSasDev",
"authorUrl": "https://github.com/AndreasSas",
"fundingUrl": "https://ko-fi.com/andreassasdev",
"isDesktopOnly": false
}

View file

@ -0,0 +1,14 @@
/* Text area for Multi Tags */
.cwt-settings-tab .setting-item:has(textarea)>.setting-item-info {
display: none;
}
.cwt-settings-tab textarea {
width: 100%;
}
.cwt-setting-tags .setting-item-control:nth-child(-n+4) {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: space-between;
}

6582
.obsidian/plugins/customjs/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,10 @@
{
"id": "customjs",
"name": "CustomJS",
"version": "1.0.21",
"minAppVersion": "0.9.12",
"description": "This plugin lets you use custom javascript files inside your vault.",
"author": "Sam Lewis",
"authorUrl": "https://github.com/samlewis0602",
"isDesktopOnly": false
}

4
.obsidian/plugins/customjs/styles.css vendored Normal file
View file

@ -0,0 +1,4 @@
/* Sets all the text color to red! */
/* body {
color: red;
} */

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,10 @@
{
"id": "dashboard-navigator",
"name": "Dashboard navigator",
"version": "2.0.0",
"minAppVersion": "1.1.0",
"description": "Vault dashboard and navigator. Show recent files by type, files per day, week, month, search files by name, date, tags and more.",
"author": "Bernardo Pires",
"authorUrl": "https://github.com/drbap",
"isDesktopOnly": false
}

View file

@ -0,0 +1,679 @@
/* Dashboard navigator plugin for Obsidian
MIT License (c) Bernardo Pires (@drbap)
*/
body {
--dn-background-color: var(--background-secondary);
--dn-foreground-color: var(--text-normal);
--dn-border-color: var(--background-modifier-border);
--dn-file-property-color: #828282;
--dn-font-size: 16px;
--dn-notes-color: #bf48ff;
--dn-images-color: #007fff;
--dn-canvas-color: #ff7f28;
--dn-videos-color: #d34848;
--dn-audios-color: #bfbf00;
--dn-pdfs-color: #00a300;
--dn-other-color: #828282;
}
.theme-dark {
--dn-search-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='none' stroke='%23f1f1f1' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E");
--dn-search-background-color: var(--background-primary);
/* File icons */
--dn-notes-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23cfcfcf' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z'/%3E%3Cpath d='M14 2v4a2 2 0 0 0 2 2h4'/%3E%3C/svg%3E");
--dn-images-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23cfcfcf' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect width='18' height='18' x='3' y='3' rx='2' ry='2'/%3E%3Ccircle cx='9' cy='9' r='2'/%3E%3Cpath d='m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21'/%3E%3C/svg%3E");
--dn-canvas-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23cfcfcf' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect width='7' height='9' x='3' y='3' rx='1'/%3E%3Crect width='7' height='5' x='14' y='3' rx='1'/%3E%3Crect width='7' height='9' x='14' y='12' rx='1'/%3E%3Crect width='7' height='5' x='3' y='16' rx='1'/%3E%3C/svg%3E");
--dn-audios-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23cfcfcf' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 18V5l12-2v13'/%3E%3Ccircle cx='6' cy='18' r='3'/%3E%3Ccircle cx='18' cy='16' r='3'/%3E%3C/svg%3E");
--dn-videos-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23cfcfcf' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect width='18' height='18' x='3' y='3' rx='2'/%3E%3Cpath d='M7 3v18'/%3E%3Cpath d='M3 7.5h4'/%3E%3Cpath d='M3 12h18'/%3E%3Cpath d='M3 16.5h4'/%3E%3Cpath d='M17 3v18'/%3E%3Cpath d='M17 7.5h4'/%3E%3Cpath d='M17 16.5h4'/%3E%3C/svg%3E");
--dn-pdfs-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23cfcfcf' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z'/%3E%3Cpath d='M14 2v4a2 2 0 0 0 2 2h4'/%3E%3Cpath d='M10 9H8'/%3E%3Cpath d='M16 13H8'/%3E%3Cpath d='M16 17H8'/%3E%3C/svg%3E");
--dn-other-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23cfcfcf' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 17h.01'/%3E%3Cpath d='M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z'/%3E%3Cpath d='M9.1 9a3 3 0 0 1 5.82 1c0 2-3 3-3 3'/%3E%3C/svg%3E");
--dn-even-background-color: #00000048;
}
.theme-light {
--dn-search-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='none' stroke='%23000000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E");
--dn-search-background-color: #fff;
/* File icons */
--dn-notes-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23282828' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z'/%3E%3Cpath d='M14 2v4a2 2 0 0 0 2 2h4'/%3E%3C/svg%3E");
--dn-images-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23282828' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect width='18' height='18' x='3' y='3' rx='2' ry='2'/%3E%3Ccircle cx='9' cy='9' r='2'/%3E%3Cpath d='m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21'/%3E%3C/svg%3E");
--dn-canvas-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23282828' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect width='7' height='9' x='3' y='3' rx='1'/%3E%3Crect width='7' height='5' x='14' y='3' rx='1'/%3E%3Crect width='7' height='9' x='14' y='12' rx='1'/%3E%3Crect width='7' height='5' x='3' y='16' rx='1'/%3E%3C/svg%3E");
--dn-audios-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23282828' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 18V5l12-2v13'/%3E%3Ccircle cx='6' cy='18' r='3'/%3E%3Ccircle cx='18' cy='16' r='3'/%3E%3C/svg%3E");
--dn-videos-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23282828' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect width='18' height='18' x='3' y='3' rx='2'/%3E%3Cpath d='M7 3v18'/%3E%3Cpath d='M3 7.5h4'/%3E%3Cpath d='M3 12h18'/%3E%3Cpath d='M3 16.5h4'/%3E%3Cpath d='M17 3v18'/%3E%3Cpath d='M17 7.5h4'/%3E%3Cpath d='M17 16.5h4'/%3E%3C/svg%3E");
--dn-pdfs-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23282828' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z'/%3E%3Cpath d='M14 2v4a2 2 0 0 0 2 2h4'/%3E%3Cpath d='M10 9H8'/%3E%3Cpath d='M16 13H8'/%3E%3Cpath d='M16 17H8'/%3E%3C/svg%3E");
--dn-other-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23282828' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 17h.01'/%3E%3Cpath d='M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z'/%3E%3Cpath d='M9.1 9a3 3 0 0 1 5.82 1c0 2-3 3-3 3'/%3E%3C/svg%3E");
--dn-even-background-color: #cfcfcf48;
}
.modal-container.mod-dim .modal:has(.dn-container) {
width: 90%;
max-width: 1920px;
height: 90%;
max-height: 1080px;
background-color: var(--dn-background-color);
color: var(--dn-foreground-color);
}
.dn-container {
width: 100%;
max-width: 100%;
height: 100%;
min-height: 100%;
padding: 1em;
}
.dn-top-nav {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
margin-left: 0;
margin-right: 0;
margin-top: var(--size-4-1);
margin-bottom: var(--size-4-2);
flex-wrap: wrap;
align-content: center;
}
.dn-top-nav button {
margin: var(--size-4-2) 0;
margin-right: var(--size-4-2);
cursor: pointer;
}
.dn-flex {
display: flex;
justify-content: space-between;
align-items: flex-start;
flex-direction: row;
flex-wrap: wrap;
gap: 1.8em;
}
.dn-flex>div {
width: 30%;
border-radius: 0;
}
.dn-flex>div:not(#dn-vault-stats) {
line-height: 1.8em;
word-wrap: break-word;
}
.dn-subtitles {
width: 100%;
margin-top: var(--size-4-1);
font-size: 1em;
font-weight: var(--font-semibold);
color: var(--text-normal);
border-bottom: 1px solid var(--dn-border-color);
}
#dashboard-canvas {
padding: var(--size-4-2);
}
.dn-stats-files-folders {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 50%;
margin-left: 30%;
}
.dn-stats-folders,
.dn-stats-files {
text-align: left;
width: 100%;
color: var(--text-normal);
margin-bottom: var(--size-4-2);
font-size: 1em;
color: var(--text-normal);
}
.dn-stats-files::before {
content: "■";
color: var(--text-muted);
margin-right: var(--size-4-1);
}
.dn-stats-folders::before {
content: "■";
color: var(--text-faint);
margin-right: var(--size-4-1);
}
.dn-container a {
text-decoration: none;
color: var(--link-color);
font-size: var(--dn-font-size);
}
.dn-container a:hover {
text-decoration: none;
color: var(--link-color-hover);
}
#dn-vault-stats {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: space-between;
gap: var(--size-4-2);
}
.dn-btn-stats {
position: relative;
margin-bottom: 8px;
background-color: var(--background-primary);
width: 48%;
height: 64px;
text-align: center;
border: 1px solid var(--dn-border-color);
border-radius: var(--radius-s);
font-size: 1em;
font-weight: var(--font-semibold);
color: var(--text-muted);
}
.dn-btn-stats:hover {
border: 1px solid var(--text-accent);
cursor: pointer;
}
.dn-btn-stats .dn-btn-stats-label {
position: absolute;
top: 4px;
right: 6px;
display: block;
font-size: .7em;
font-weight: normal;
color: var(--text-normal);
}
.dn-btn-stats-icon {
position: absolute;
top: calc(50% - 14px);
left: 8px;
font-weight: var(--font-semibold);
color: var(--text-normal);
width: 24px;
height: 24px;
opacity: .5;
}
.dn-btn-stats .dn-btn-stats-number {
position: absolute;
top: calc(50% - .6em);
left: 4px;
font-size: 1.2em;
font-weight: var(--font-semibold);
color: var(--text-accent);
display: block;
width: 100%;
text-align: right;
padding-right: 12px;
}
/* Btns Icons */
#dn-btn-notes .dn-btn-stats-icon {
content: var(--dn-notes-icon);
}
#dn-btn-canvas .dn-btn-stats-icon {
content: var(--dn-canvas-icon);
}
#dn-btn-images .dn-btn-stats-icon {
content: var(--dn-images-icon);
}
#dn-btn-audios .dn-btn-stats-icon {
content: var(--dn-audios-icon);
}
#dn-btn-videos .dn-btn-stats-icon {
content: var(--dn-videos-icon);
}
#dn-btn-pdf .dn-btn-stats-icon {
content: var(--dn-pdfs-icon);
}
#dn-btn-other .dn-btn-stats-icon {
content: var(--dn-other-icon);
}
.dn-display-none {
display: none;
}
a.dn-folder-path {
color: var(--text-muted);
}
a.dn-folder-path:hover {
background-color: var(--tag-background);
color: var(--link-color);
}
div.dn-div-table {
width: 100%;
}
table#dn-table {
table-layout: fixed;
width: 100%;
border-collapse: collapse;
background-color: var(--background-primary);
border: 1px solid var(--dn-border-color);
font-size: 1em;
}
table#dn-table th,
table#dn-table td {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
padding: var(--size-4-1) var(--size-4-2);
min-width: 50px;
width: clamp(50px, auto, unset);
font-size: var(--dn-font-size);
}
table#dn-table th {
text-align: left;
font-weight: var(--font-semibold);
color: var(--text-normal);
border-bottom: 1px solid var(--dn-border-color);
cursor: pointer;
}
table#dn-table th:not(.sort-active, th:nth-child(5)):hover {
background-color: var(--tag-background);
}
table#dn-table th.sort-active {
color: var(--text-normal);
background-color: var(--tag-background);
}
table#dn-table th.sort-active.sort-asc::before {
content: " ↑";
color: var(--text-accent);
font-weight: var(--font-bold);
}
table#dn-table th.sort-active.sort-desc::before {
content: " ↓";
color: var(--text-accent);
font-weight: var(--font-bold);
}
table#dn-table th:nth-child(1),
table#dn-table th:nth-child(2),
table#dn-table th:nth-child(3),
table#dn-table th:nth-child(4) {
resize: horizontal;
}
table#dn-table td:nth-child(3) {
text-align: right;
padding-right: 1em;
}
table#dn-table th:nth-child(5) {
cursor: default;
}
table#dn-table tr:hover td {
background-color: var(--nav-item-background-hover);
}
.dn-search-input-container {
position: sticky;
top: 0;
left: 0;
z-index: 9900;
width: 50%;
height: var(--input-height);
}
.dn-search-input-container .search-input-clear-button {
top: calc(var(--input-height) / 4);
z-index: 9901;
}
#dn-input-filter {
background-image: var(--dn-search-icon);
background-color: var(--dn-search-background-color);
background-position: 8px 6px;
background-repeat: no-repeat;
width: 100%;
height: var(--input-height);
font-size: var(--font-size);
padding: 8px 18px 6px 32px;
border: 1px solid var(--dn-border-color);
margin-top: var(--size-4-1);
border-radius: var(--input-radius);
}
#dn-vault-graph {
filter: saturate(0.7);
text-align: center;
}
.dn-pagination {
margin-bottom: var(--size-4-1);
text-align: right;
font-size: .9em;
}
.dn-pagination span {
margin-right: 1em;
}
.dn-pagination span {
margin-right: 1em;
}
.dn-pagination-total-results {
float: left;
}
.dn-pagination-total-results::after {
clear: left;
}
.dn-btn-prev:disabled,
.dn-btn-next:disabled {
opacity: .3;
}
.dn-btn-prev,
.dn-btn-next {
cursor: pointer;
}
/* File icons */
a.dn-f-note::before,
a.dn-f-canvas::before,
a.dn-f-image::before,
a.dn-f-audio::before,
a.dn-f-video::before,
a.dn-f-pdf::before,
a.dn-f-other::before {
width: 1em;
height: 1em;
vertical-align: top;
display: inline-block;
margin-top: 2px;
margin-right: 4px;
}
a.dn-f-note::before {
content: var(--dn-notes-icon);
}
a.dn-f-canvas::before {
content: var(--dn-canvas-icon);
}
a.dn-f-image::before {
content: var(--dn-images-icon);
}
a.dn-f-audio::before {
content: var(--dn-audios-icon);
}
a.dn-f-video::before {
content: var(--dn-videos-icon);
}
a.dn-f-pdf::before {
content: var(--dn-pdfs-icon);
}
a.dn-f-other::before {
content: var(--dn-other-icon);
}
/* Colored Files */
/* Dashboard buttons */
.dn-colored-files #dn-btn-notes .dn-btn-stats-number {
color: var(--dn-notes-color);
}
.dn-colored-files #dn-btn-canvas .dn-btn-stats-number {
color: var(--dn-canvas-color);
}
.dn-colored-files #dn-btn-images .dn-btn-stats-number {
color: var(--dn-images-color);
}
.dn-colored-files #dn-btn-audios .dn-btn-stats-number {
color: var(--dn-audios-color);
}
.dn-colored-files #dn-btn-videos .dn-btn-stats-number {
color: var(--dn-videos-color);
}
.dn-colored-files #dn-btn-pdf .dn-btn-stats-number {
color: var(--dn-pdfs-color);
}
.dn-colored-files #dn-btn-other .dn-btn-stats-number {
color: var(--dn-other-color);
}
/* Files */
.dn-colored-files a.dn-f-note {
color: var(--dn-notes-color);
}
.dn-colored-files a.dn-f-canvas {
color: var(--dn-canvas-color);
}
.dn-colored-files a.dn-f-image {
color: var(--dn-images-color);
}
.dn-colored-files a.dn-f-audio {
color: var(--dn-audios-color);
}
.dn-colored-files a.dn-f-video {
color: var(--dn-videos-color);
}
.dn-colored-files a.dn-f-pdf {
color: var(--dn-pdfs-color);
}
.dn-colored-files a.dn-f-other {
color: var(--dn-other-color);
}
.dn-colored-files a.dn-f-note:hover,
.dn-colored-files a.dn-f-canvas:hover,
.dn-colored-files a.dn-f-image:hover,
.dn-colored-files a.dn-f-audio:hover,
.dn-colored-files a.dn-f-video:hover,
.dn-colored-files a.dn-f-pdf:hover,
.dn-colored-files a.dn-f-other:hover {
color: var(--link-color-hover);
}
.dn-no-results-found {
color: var(--text-faint);
font-style: italic;
}
a.dn-tag {
display: inline-block;
border-radius: var(--tag-radius);
margin-right: var(--size-4-1);
padding-inline-end: var(--tag-padding-x);
font-size: var(--tag-size);
background-color: var(--tag-background);
color: var(--tag-color);
text-decoration: none;
}
#dn-other,
#dn-videos,
#dn-audios,
#dn-pdfs,
#dn-images,
#dn-canvas,
#dn-recent-notes,
#dn-recent-files {
padding: var(--size-4-2);
background-color: var(--background-primary);
border: 1px solid var(--background-modifier-border);
border-radius: var(--radius-s);
}
.dn-input-datesearch {
font-weight: var(--font-semibold) !important;
color: var(--text-accent) !important;
}
/* Table layout */
table#dn-table.dn-tbl-row tbody tr:nth-child(even) {
background-color: var(--dn-even-background-color);
}
table#dn-table.dn-tbl-column th:nth-child(even),
table#dn-table.dn-tbl-column td:nth-child(even) {
background-color: var(--dn-even-background-color);
}
table#dn-table.dn-tbl-bordered th,
table#dn-table.dn-tbl-bordered td {
border: 1px solid #82828248;
}
table#dn-table.dn-tbl-default th,
table#dn-table.dn-tbl-default td {
margin: 0;
}
.dropdown.tbl-select {
margin-right: var(--size-4-2);
}
.dn-tbl-label {
margin-left: var(--size-4-3);
margin-right: var(--size-4-2);
color: var(--text-faint);
font-size: .8em;
}
.tbl-selected {
background-color: var(--tag-background) !important;
}
/* File properties */
.dn-properties {
color: var(--dn-file-property-color);
overflow-y: auto;
word-wrap: break-word;
}
.dn-div-bottom-properties {
text-align: center;
}
.dn-btn-close-properties {
width: 30%;
}
@media screen and (max-width: 1024px) {
.dn-flex {
display: flex;
align-items: flex-start;
flex-direction: row;
flex-wrap: wrap;
}
.dn-flex>div {
width: 100%;
}
.dn-search-input-container {
width: 100%;
}
.dn-btn-stats {
min-width: 30%;
width: 30%;
}
table#dn-table th:nth-child(3),
table#dn-table td:nth-child(3),
table#dn-table th:nth-child(5),
table#dn-table td:nth-child(5) {
display: none;
}
}
@media screen and (max-width: 600px) {
.dn-flex {
display: flex;
justify-content: center;
align-items: flex-start;
flex-direction: row;
flex-wrap: wrap;
}
.dn-flex>div {
width: 100%;
}
.dn-search-input-container {
width: 100%;
}
.dn-btn-stats {
min-width: 100%;
}
.is-mobile .modal-container.mod-dim .modal:has(.dn-container) {
width: 100%;
max-width: 100%;
height: 100%;
max-height: 100%;
background-color: var(--dn-background-color);
color: var(--dn-foreground-color);
}
table#dn-table th:nth-child(2),
table#dn-table td:nth-child(2),
table#dn-table th:nth-child(3),
table#dn-table td:nth-child(3),
table#dn-table th:nth-child(4),
table#dn-table td:nth-child(4),
table#dn-table th:nth-child(5),
table#dn-table td:nth-child(5) {
display: none;
}
#dn-label-layout,
.dropdown.tbl-select {
display: none;
}
}

20723
.obsidian/plugins/dataview/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,11 @@
{
"id": "dataview",
"name": "Dataview",
"version": "0.5.67",
"minAppVersion": "0.13.11",
"description": "Complex data views for the data-obsessed.",
"author": "Michael Brenan <blacksmithgu@gmail.com>",
"authorUrl": "https://github.com/blacksmithgu",
"helpUrl": "https://blacksmithgu.github.io/obsidian-dataview/",
"isDesktopOnly": false
}

146
.obsidian/plugins/dataview/styles.css vendored Normal file
View file

@ -0,0 +1,146 @@
/** Live Preview padding fixes, specifically for DataviewJS custom HTML elements. */
.is-live-preview .block-language-dataviewjs > p, .is-live-preview .block-language-dataviewjs > span {
line-height: 1.0;
}
.block-language-dataview {
overflow-y: auto;
}
/*****************/
/** Table Views **/
/*****************/
/* List View Default Styling; rendered internally as a table. */
.table-view-table {
width: 100%;
}
.table-view-table > thead > tr, .table-view-table > tbody > tr {
margin-top: 1em;
margin-bottom: 1em;
text-align: left;
}
.table-view-table > tbody > tr:hover {
background-color: var(--table-row-background-hover);
}
.table-view-table > thead > tr > th {
font-weight: 700;
font-size: larger;
border-top: none;
border-left: none;
border-right: none;
border-bottom: solid;
max-width: 100%;
}
.table-view-table > tbody > tr > td {
text-align: left;
border: none;
font-weight: 400;
max-width: 100%;
}
.table-view-table ul, .table-view-table ol {
margin-block-start: 0.2em !important;
margin-block-end: 0.2em !important;
}
/** Rendered value styling for any view. */
.dataview-result-list-root-ul {
padding: 0em !important;
margin: 0em !important;
}
.dataview-result-list-ul {
margin-block-start: 0.2em !important;
margin-block-end: 0.2em !important;
}
/** Generic grouping styling. */
.dataview.result-group {
padding-left: 8px;
}
/*******************/
/** Inline Fields **/
/*******************/
.dataview.inline-field-key {
padding-left: 8px;
padding-right: 8px;
font-family: var(--font-monospace);
background-color: var(--background-primary-alt);
color: var(--text-nav-selected);
}
.dataview.inline-field-value {
padding-left: 8px;
padding-right: 8px;
font-family: var(--font-monospace);
background-color: var(--background-secondary-alt);
color: var(--text-nav-selected);
}
.dataview.inline-field-standalone-value {
padding-left: 8px;
padding-right: 8px;
font-family: var(--font-monospace);
background-color: var(--background-secondary-alt);
color: var(--text-nav-selected);
}
/***************/
/** Task View **/
/***************/
.dataview.task-list-item, .dataview.task-list-basic-item {
margin-top: 3px;
margin-bottom: 3px;
transition: 0.4s;
}
.dataview.task-list-item:hover, .dataview.task-list-basic-item:hover {
background-color: var(--text-selection);
box-shadow: -40px 0 0 var(--text-selection);
cursor: pointer;
}
/*****************/
/** Error Views **/
/*****************/
div.dataview-error-box {
width: 100%;
min-height: 150px;
display: flex;
align-items: center;
justify-content: center;
border: 4px dashed var(--background-secondary);
}
.dataview-error-message {
color: var(--text-muted);
text-align: center;
}
/*************************/
/** Additional Metadata **/
/*************************/
.dataview.small-text {
font-size: smaller;
color: var(--text-muted);
margin-left: 3px;
}
.dataview.small-text::before {
content: "(";
}
.dataview.small-text::after {
content: ")";
}

View file

@ -0,0 +1,215 @@
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// main.ts
var main_exports = {};
__export(main_exports, {
default: () => DefinitionListPlugin
});
module.exports = __toCommonJS(main_exports);
var import_obsidian = require("obsidian");
var import_view = require("@codemirror/view");
var import_state = require("@codemirror/state");
var CODE_BLOCK_DELIMITER = "```";
var DEFINITION_REGEX = /^(\s*)([:~])\s/;
var HEADING_REGEX = /^#+\s/;
var LIST_ITEM_REGEX = /^\s*(\*|\+|-|\d+\.)\s/;
var HORIZONTAL_RULE_REGEX = /^(-{3,}|\*{3,}|_{3,})/;
function isLivePreview(view) {
var _a;
const editorEl = view.dom.closest(".markdown-source-view");
return (_a = editorEl == null ? void 0 : editorEl.classList.contains("is-live-preview")) != null ? _a : false;
}
var definitionListPlugin = import_view.ViewPlugin.fromClass(class {
constructor(view) {
this.decorations = this.buildDecorations(view);
}
update(update) {
if (update.docChanged || update.viewportChanged || update.selectionSet) {
this.decorations = this.buildDecorations(update.view);
}
}
buildDecorations(view) {
if (!isLivePreview(view)) {
return import_view.Decoration.none;
}
const builder = new import_state.RangeSetBuilder();
const doc = view.state.doc;
const selection = view.state.selection;
let inCodeBlock = false;
let lastLineWasTerm = false;
let lastLineWasDefinition = false;
function isNotTerm(content) {
return HEADING_REGEX.test(content) || LIST_ITEM_REGEX.test(content) || content.startsWith("![") || HORIZONTAL_RULE_REGEX.test(content) || content.startsWith("[^") || content.startsWith("|") || content.startsWith("$$") || content.startsWith("^");
}
for (let i = 1; i <= doc.lines; i++) {
const line = doc.line(i);
const lineText = line.text;
const trimmedLineText = lineText.trim();
if (trimmedLineText === CODE_BLOCK_DELIMITER) {
inCodeBlock = !inCodeBlock;
lastLineWasTerm = false;
lastLineWasDefinition = false;
continue;
}
if (inCodeBlock) {
lastLineWasTerm = false;
lastLineWasDefinition = false;
continue;
}
const definitionMatch = DEFINITION_REGEX.exec(lineText);
const nextLine = i < doc.lines ? doc.line(i + 1).text : "";
const isNextLineDefinition = DEFINITION_REGEX.test(nextLine.trim());
if (trimmedLineText === "") {
lastLineWasTerm = false;
lastLineWasDefinition = false;
} else if (definitionMatch && (lastLineWasTerm || lastLineWasDefinition)) {
const [, indent, marker] = definitionMatch;
const isIndented = indent.length > 0;
builder.add(
line.from,
line.from,
import_view.Decoration.line({
attributes: { class: isIndented ? "dl-dd-indent" : "dl-dd-reg" }
})
);
const indentStartPos = line.from;
const markerEndPos = indentStartPos + indent.length + marker.length + 1;
const isCursorTouchingIndentOrMarker = selection.ranges.some(
(range) => range.from <= markerEndPos && range.to >= indentStartPos
);
builder.add(
indentStartPos,
markerEndPos,
import_view.Decoration.mark({
attributes: { class: isCursorTouchingIndentOrMarker ? "dl-marker" : "dl-hidden-marker" }
})
);
lastLineWasDefinition = true;
lastLineWasTerm = false;
} else if (isNextLineDefinition && !isNotTerm(trimmedLineText)) {
builder.add(
line.from,
line.from,
import_view.Decoration.line({
attributes: { class: "dl-dt" }
})
);
lastLineWasTerm = true;
lastLineWasDefinition = false;
} else {
lastLineWasTerm = false;
lastLineWasDefinition = false;
}
}
return builder.finish();
}
}, {
decorations: (v) => v.decorations
});
var DefinitionListPlugin = class extends import_obsidian.Plugin {
constructor() {
super(...arguments);
// Post-processor for handling definition lists in reading mode
this.definitionListPostProcessor = (element) => {
function isNotTerm(content) {
return content.match(/^#+\s/) !== null || // Heading
content.match(/^\s*(-|\d+\.)\s/) !== null || // List item
content.startsWith(">") || // Blockquote
content.startsWith("<img") || // Image
content.match(/^(-{3,}|\*{3,}|_{3,})/) !== null || // Horizontal rule
content.startsWith("[^") || // Footnote
content.includes('class="footnote-backref footnote-link"') || // Footnote backref
content.startsWith("|") || // Table
content.startsWith("$$") || // Math block
content.startsWith("^");
}
const paragraphs = element.querySelectorAll("p");
paragraphs.forEach((paragraph) => {
const lines = paragraph.innerHTML.split("<br>");
let dl = null;
let currentTerm = null;
let newContent = [];
let invalidateCurrentPair = false;
for (let i = 0; i < lines.length; i++) {
const line = lines[i].trim();
const nextLine = i < lines.length - 1 ? lines[i + 1].trim() : "";
const definitionMatch = line.match(/^(\s*)([:~])\s(.+)/);
const isNextLineDefinition = nextLine.match(/^(\s*)([:~])\s(.+)/);
if (definitionMatch && !invalidateCurrentPair) {
if (definitionMatch[3].includes('class="footnote-backref footnote-link"')) {
invalidateCurrentPair = true;
}
if (currentTerm && !invalidateCurrentPair) {
if (!dl) {
dl = document.createElement("dl");
newContent.push(dl);
const dt = document.createElement("dt");
dt.innerHTML = currentTerm;
dl.appendChild(dt);
}
const dd = document.createElement("dd");
dd.innerHTML = definitionMatch[3];
dl.appendChild(dd);
} else {
if (currentTerm) {
newContent.push(currentTerm + "<br>");
}
newContent.push(line + "<br>");
currentTerm = null;
invalidateCurrentPair = false;
}
} else if (isNextLineDefinition && !isNotTerm(line) && !invalidateCurrentPair) {
if (currentTerm) {
newContent.push(currentTerm + "<br>");
}
currentTerm = line;
dl = null;
} else {
if (currentTerm) {
newContent.push(currentTerm + "<br>");
currentTerm = null;
}
newContent.push(line + "<br>");
dl = null;
invalidateCurrentPair = false;
}
}
paragraph.innerHTML = "";
newContent.forEach((content) => {
if (typeof content === "string") {
paragraph.innerHTML += content;
} else {
paragraph.appendChild(content);
}
});
});
};
}
async onload() {
this.registerMarkdownPostProcessor(this.definitionListPostProcessor);
this.registerEditorExtension(definitionListPlugin);
}
onunload() {
}
};

View file

@ -0,0 +1,11 @@
{
"id": "definition-list",
"name": "Definition List",
"version": "0.2.0",
"minAppVersion": "1.6.0",
"description": "Adds definition lists to the markdown parser.",
"author": "shammond42",
"authorUrl": "https://northlandcreativewonders.com",
"fundingUrl": "https://buymeacoffee.com/ncwonders",
"isDesktopOnly": false
}

View file

@ -0,0 +1,33 @@
/* reading mode */
dl dt {
font-weight: bold;
}
/* live preview */
.dl-dt {
font-weight: bold;
}
.dl-dd-reg {
display: inline-block;
width: calc(100% - 40px);
padding-left: 40px !important;
/* to add space between definitions, must use padding */
/* padding-bottom: 0.75em !important; */
}
.dl-dd-indent {
display: inline-block;
width: calc(100% - 40px);
padding-left: 40px !important;
text-indent: 0px !important;
/* to add space between definitions, must use padding */
/* padding-bottom: 0.75em !important; */
}
.dl-hidden-marker {
display: inline-block;
overflow: hidden;
height: 0;
width: 0;
}

141
.obsidian/plugins/line-arrange/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,10 @@
{
"id": "line-arrange",
"name": "Line Arrange",
"version": "1.2.1",
"minAppVersion": "0.15.0",
"description": "Shuffle, reverse, or sort lines, using either visual width or lexical order.",
"author": "Chitwan Singh",
"authorUrl": "https://github.com/chitwan27",
"isDesktopOnly": false
}

214
.obsidian/plugins/litegallery/main.js vendored Normal file
View file

@ -0,0 +1,214 @@
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// main.ts
var main_exports = {};
__export(main_exports, {
default: () => LiteGallery
});
module.exports = __toCommonJS(main_exports);
var import_obsidian2 = require("obsidian");
// settingtab.ts
var import_obsidian = require("obsidian");
var LiteGallerySettingTab = class extends import_obsidian.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
let { containerEl } = this;
containerEl.empty();
new import_obsidian.Setting(containerEl).setName("Image folders").setDesc("Comma separated list of folders to search for images (in order of priority).").addText(
(text) => text.setPlaceholder("/").setValue(this.plugin.settings.image_folders.join(",")).onChange(async (value) => {
this.plugin.settings.image_folders = value.split(",");
await this.plugin.save_settings();
})
);
}
};
// main.ts
var DEFAULT_SETTINGS = {
image_folders: []
};
var LiteGallery = class extends import_obsidian2.Plugin {
async load_settings() {
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
}
async save_settings() {
await this.saveData(this.settings);
}
async onload() {
await this.load_settings();
this.addSettingTab(new LiteGallerySettingTab(this.app, this));
this.registerMarkdownCodeBlockProcessor("litegal", async (source, el, ctx) => {
let active_slide = 0;
let preview_scroll_speed = 0;
const image_list = source.split("\n").map((line) => line.replace(/!?\[\[/, "").replace("]]", "").trim()).filter((line) => line).map(
(image) => {
let image_exists = false;
let image_path = void 0;
let path_options = this.settings.image_folders.map((folder) => {
return `${folder.slice(-1) == "/" ? folder == "/" ? "" : folder : (
// If folder doesn't need a trailing slash, don't add it (if it's root dir should just be empty string)
`${folder}/`
)}${image}`;
});
for (const test_path of path_options) {
const file = this.app.vault.getAbstractFileByPath(test_path);
if (file instanceof import_obsidian2.TFile) {
image_exists = true;
image_path = this.app.vault.adapter.getResourcePath(test_path);
break;
}
}
if (image_path == void 0) {
new import_obsidian2.Notice(`LiteGallery: Image not found: ${image}`);
}
return image_path;
}
).filter((image_path) => image_path !== void 0);
const lightbox_container = document.body.createEl("div", {
cls: "litegal-lightbox-container hidden"
});
lightbox_container.onclick = () => {
lightbox_container.addClass("hidden");
};
const lightbox = lightbox_container.createEl("div");
lightbox.classList.add("litegal-lightbox");
lightbox.onclick = (event) => {
event.stopPropagation();
};
const gallery = el.createEl("div", { cls: "litegal" });
gallery.classList.add("litegal");
if (image_list.length > 0) {
const active_image_container = gallery.createEl("div", {
cls: "litegal-active"
});
const active_image_container_inner = active_image_container.createEl("div", {
cls: "litegal-active-inner"
});
const active_image = active_image_container_inner.createEl("img");
active_image.src = image_list[active_slide];
active_image.onclick = () => {
lightbox_container.removeClass("hidden");
lightbox_image.src = image_list[active_slide];
};
const larrow = active_image_container.createEl("div", {
text: "<",
cls: "litegal-arrow litegal-arrow-left"
});
larrow.onclick = () => {
active_slide = (active_slide - 1 + image_list.length) % image_list.length;
active_image.src = image_list[active_slide];
};
const rarrow = active_image_container.createEl("div", {
text: ">",
cls: "litegal-arrow litegal-arrow-right"
});
rarrow.onclick = () => {
active_slide = (active_slide + 1) % image_list.length;
active_image.src = image_list[active_slide];
};
const preview_outer_container = gallery.createEl("div", { cls: "litegal-preview-outer" });
const preview_larrow = preview_outer_container.createEl("div", {
text: "<",
cls: "litegal-arrow litegal-arrow-left"
});
preview_larrow.onmouseenter = () => {
preview_scroll_speed = -5;
};
preview_larrow.onmouseleave = () => {
preview_scroll_speed = 0;
};
const preview_rarrow = preview_outer_container.createEl("div", {
text: ">",
cls: "litegal-arrow litegal-arrow-right"
});
preview_rarrow.onmouseenter = () => {
preview_scroll_speed = 5;
};
preview_rarrow.onmouseleave = () => {
preview_scroll_speed = 0;
};
const preview_container = preview_outer_container.createEl("div", {
cls: "litegal-preview"
});
setInterval(() => {
preview_container.scrollLeft += preview_scroll_speed;
}, 10);
image_list.forEach(async (image_path, i) => {
const preview_elem = preview_container.createEl("img", {
cls: "litegal-preview-img"
});
preview_elem.src = image_path;
preview_elem.onclick = () => {
active_slide = i;
active_image.src = `${image_list[active_slide]}`;
};
});
const lightbox_larrow = lightbox.createEl("div", {
text: "<",
cls: "litegal-arrow litegal-arrow-left"
});
lightbox_larrow.onclick = () => {
active_slide = (active_slide - 1 + image_list.length) % image_list.length;
lightbox_image.src = image_list[active_slide];
active_image.src = image_list[active_slide];
};
const lightbox_rarrow = lightbox.createEl("div", {
text: ">",
cls: "litegal-arrow litegal-arrow-right"
});
lightbox_rarrow.onclick = () => {
active_slide = (active_slide + 1) % image_list.length;
lightbox_image.src = image_list[active_slide];
active_image.src = image_list[active_slide];
};
const lightbox_image = lightbox.createEl("img", {
cls: "litegal-lightbox-image"
});
const lightbox_exit = lightbox.createEl("div", {
text: "X",
cls: "litegal-lightbox-exit"
});
lightbox_exit.onclick = () => {
lightbox_container.addClass("hidden");
};
document.addEventListener("keydown", (event) => {
if (event.key === "Escape") {
lightbox_container.addClass("hidden");
}
});
} else {
gallery.createEl("p", {
text: 'No images found, please check your image list. If your images are not found, please check your "image folders" in settings.',
cls: "litegal-no-images"
});
}
});
}
onunload() {
}
};

View file

@ -0,0 +1,10 @@
{
"id": "litegallery",
"name": "Lite Gallery",
"version": "1.0.5",
"minAppVersion": "0.15.0",
"description": "Easily create carousel galleries to better organize/view images in your notes.",
"author": "Jordan Poles",
"authorUrl": "https://github.com/jpoles1/",
"isDesktopOnly": false
}

111
.obsidian/plugins/litegallery/styles.css vendored Normal file
View file

@ -0,0 +1,111 @@
.litegal {
width: 100%;
cursor: default;
}
.litegal-preview-outer {
position: relative;
}
.litegal-preview {
display: flex;
align-items: space-around;
flex-wrap: nowrap;
margin: 0 30px 0 40px;
overflow: scroll;
}
.litegal-preview-img {
width: 100px;
height: 100px;
margin: 10px;
border: 1px solid #ccc;
border-radius: 5px;
overflow: hidden;
cursor: pointer;
flex-shrink: 0;
}
.litegal-active {
position: relative;
}
.litegal-active-inner {
display: flex;
justify-content: center;
}
.litegal-arrow {
cursor: pointer;
font-size: 30px;
margin: 0 10px;
color: #999;
background-color: rgba(0, 0, 0, 0.2);
border-radius: 5px;
padding: 5px;
position: absolute;
top: 50%;
transform: translate(0, -50%);
user-select: none;
}
.litegal-arrow:hover {
color: white;
background-color: rgba(0, 0, 0, 0.6);
}
.litegal-preview-outer .litegal-arrow {
font-size: 20px;
}
.litegal-arrow-right {
right: 0;
}
.litegal-lightbox-container {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.8);
z-index: 1000;
cursor: pointer;
}
.litegal-lightbox {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
max-width: 90%;
max-height: 90%;
overflow: hidden;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
}
.litegal-lightbox-image {
max-width: 100%;
max-height: 100%;
}
.litegal-lightbox-exit {
position: absolute;
top: 0;
right: 0;
font-size: 30px;
color: white;
background-color: rgba(0, 0, 0, 0.6);
border-bottom-left-radius: 5px;
border-top-right-radius: 5px;
padding: 5px;
cursor: pointer;
user-select: none;
}
.hidden {
display: none;
}
.litegal-no-images {
text-align: center;
margin: 20px;
color: #999;
font-style: italic;
}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,11 @@
{
"id": "multi-column-markdown",
"name": "Multi-Column Markdown",
"version": "0.9.1",
"minAppVersion": "1.5.3",
"description": "This plugin adds functionality to create markdown documents with multiple columns of content viewable within Obsidian's preview mode",
"author": "Cameron Robinson",
"fundingUrl": "https://www.buymeacoffee.com/ckrobinson",
"authorUrl": "https://portfolio.ckrobinson.net",
"isDesktopOnly": false
}

View file

@ -0,0 +1,249 @@
.mcm-single-column-layout-left {
left: 10px;
}
.mcm-single-column-layout-right {
right: 10px;
}
.mcm-single-column-small {
width: 25%;
}
.mcm-single-column-medium {
width: 50%;
}
.mcm-single-column-large {
width: 75%;
}
.mcm-single-column-full {
width: 100%;
}
/* ----------------------------------- */
.mcm-singlecol-layout-right {
justify-content: right;
}
.mcm-singlecol-layout-left {
justify-content: left;
}
.mcm-singlecol-layout-center {
justify-content: center;
}
/* ----------------------------------- */
.mcm-column-spacer {
margin-inline: 0.25%;
}
/* ----------------------------------- */
.mcm-two-equal-columns {
width: 49.75%;
}
.mcm-two-column-large {
width: 66.75%;
}
.mcm-two-column-small {
width: 32.75%;
}
/* ----------------------------------- */
.mcm-three-equal-columns {
width: 32.75%;
}
/* ----------------------------------- */
.mcm-three-column-large {
width: 49.75%;
}
.mcm-three-column-small {
width: 24.5%;
}
/* ----------------------------------- */
.mcm-column-div {
padding-inline: 10px;
}
.mcm-column-border {
border: grey;
border-style: solid;
border-width: 0.5px;
}
.mcm-column-shadow {
box-shadow: 0 0.2rem 0.5rem var(--background-modifier-box-shadow);
}
.mcm-column-root-container {
margin: 1.5625em 0;
}
.mcm-column-parent-container {
padding: 0;
color: var(--text-normal);
page-break-inside: avoid;
border-radius: 0.1rem;
display:flex;
flex-direction:row;
}
.mcm-doc-reflow-container {
margin-top: 1.5625em;
}
.mcm-region-shadow {
box-shadow: 0 0.2rem 0.5rem var(--background-modifier-box-shadow);
}
.mcm-column-end-tag-wrapper,
.mcm-column-break-tag-wrapper,
.mcm-column-settings-wrapper,
.mcm-column-content-wrapper {
opacity: 0;
}
.mcm-column-div .mcm-column-content-wrapper {
opacity: 100;
}
.markdown-preview-section > .mcm-column-content-wrapper,
.mcm-column-break-tag-wrapper,
.mcm-column-end-tag-wrapper,
.mcm-column-settings-wrapper {
height: 0px !important;
overflow: hidden;
}
.mcm-original-column-element + .mcm-cloned-column-element {
display: none;
}
.mcm-cm-preview {
line-height: var(--lh);
white-space: normal;
word-break: keep-all;
word-wrap: normal;
}
.mcm-no-flex-shrink {
flex-shrink: 0;
}
.mcm-col-settings-preview {
color: var(--text-normal);
}
.cm-preview-code-block.preivew-mcm-start-block {
height: 0pt !important;
padding: 0pt !important;
}
.mcm-content-overflow-hidden-x {
overflow-x: hidden;
}
.mcm-content-overflow-auto-scroll-x {
overflow-x: auto;
}
.mcm-content-overflow-auto-scroll-y {
overflow-x: auto;
}
.mcm-content-overflow-hidden-y {
overflow-y: hidden;
}
.mcm-content-alignment-left {
text-align: left;
}
.mcm-table-alignment.mcm-content-alignment-left table {
margin-right: auto;
margin-left: 0px;
}
.mcm-content-alignment-center {
text-align: center;
}
.mcm-table-alignment.mcm-content-alignment-center table {
margin-right: auto;
margin-left: auto;
}
.mcm-content-alignment-right {
text-align: right;
}
.mcm-table-alignment.mcm-content-alignment-right table {
margin-right: 0px;
margin-left: auto;
}
.mcm-span-content-alignment-center {
display: block;
text-align: center;
}
.mcm-small-font-message {
font-size: small
}
/* ----------------------------------- */
.mcm-message-region {
max-height: 0;
overflow: hidden;
font-size: small;
transition: max-height 0.2s ease-out;
}
.mcm-column-error-message {
color: var(--text-error);
}
.mcm-column-error-padding {
padding: 0 10px;
}
.mcm-error-heading {
background-color: var(--background-secondary);
user-select: none;
}
.mcm-error-heading:after {
content: '\002B';
color: white;
font-weight: bold;
float: right;
margin-left: 5px;
}
.mcm-error-heading:hover {
background-color: var(--interactive-hover);
}
.mcm-error-heading-open:after {
content: "\2212";
}
.mcm-error-message-color {
color: var(--text-error);
}
.mcm-error-icon {
font-size: large;
margin-inline-end: 5px;
color: var(--text-error);
}
.mcm-warning-icon {
font-size: large;
margin-inline-end: 5px;
color: var(--color-yellow)
}

18
.obsidian/plugins/note-gallery/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,14 @@
{
"id": "note-gallery",
"name": "Note Gallery",
"version": "0.0.59",
"minAppVersion": "1.2.0",
"description": "A masonry gallery view for your notes. Allows to have a birds eye view over the notes in your vault.",
"author": "Pash Shocky",
"authorUrl": "https://github.com/pashashocky",
"isDesktopOnly": false,
"fundingUrl": {
"Buy Me a Coffee": "https://www.buymeacoffee.com/pashashocky",
"GitHub Sponsor": "https://github.com/sponsors/pashashocky"
}
}

View file

@ -0,0 +1,147 @@
/* ========================================================================= */
/* customized styles react-masonry-css */
/* ========================================================================= */
:root {
--gutter-size: 12px;
/* --note-card-font-size: 4pt; configured in react/index.tsx */
}
.masonry-grid {
display: -webkit-box; /* Not needed if autoprefixing */
display: -ms-flexbox; /* Not needed if autoprefixing */
display: flex;
margin-left: calc(var(--gutter-size) * -1); /* gutter size offset */
width: auto;
}
.masonry-grid_column {
padding-left: var(--gutter-size); /* gutter size */
background-clip: padding-box;
}
/* Style your items */
.masonry-grid_column > div {
margin-bottom: var(--gutter-size);
}
.masonry-grid_column > div > img {
border-radius: 0;
object-fit: cover;
width: 100%;
height: 100%;
}
.note-card {
line-height: normal;
max-height: 330px;
padding: 10px;
border-radius: 5px;
background-color: var(--background-primary);
border: 1px solid var(--background-modifier-border);
overflow: hidden;
cursor: pointer;
}
.note-card:hover {
border: 1px solid var(--interactive-accent);
}
.note-card hr {
border-top: 1px solid var(--background-secondary);
margin-top: 0.4rem !important;
margin-bottom: 0.4rem !important;
}
.note-card .inline-title {
display: block !important;
font-size: 12pt;
font-weight: 600;
color: var(--h3-color);
}
.note-card .card-content {
position: relative;
min-height: 20px;
font-size: var(--note-card-font-size);
}
.note-card .card-content img {
max-width: 100%;
}
.note-card .card-content-wall {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
z-index: 10;
}
.note-card > img {
border-radius: 5px !important;
}
/* Styling of external elements */
.view-content:has(div):has(.block-language-note-gallery) {
background-color: var(--background-secondary) !important;
}
.cm-embed-block:has(> div.block-language-note-gallery):hover {
box-shadow: unset !important;
}
.note-card li input[type="checkbox"] {
height: 8px;
width: 8px;
margin-inline-end: 3px;
margin-inline-start: -12px !important;
}
.note-card li input[type="checkbox"]:checked:after {
height: 8px;
width: 8px;
}
.note-card .markdown-preview-view {
font-size: var(--note-card-font-size);
}
.note-card .callout {
min-height: unset;
padding: 0;
}
.note-card .callout-title {
min-height: unset !important;
}
.note-card .callout-title-inner {
padding: var(--size-2-1) 0;
}
.note-card .callout-content {
padding-left: 2px !important;
padding-right: 2px !important;
}
.note-card svg.svg-icon {
height: 8px;
width: 8px;
}
.note-card li img {
max-width: 100% !important;
}
.note-card .video-wrapper {
min-width: unset;
min-height: unset;
}
.note-card .embed-container {
min-width: unset;
min-height: unset;
}

View file

@ -0,0 +1,14 @@
{
"outputDirectory": "",
"templateFilename": "{{title}}",
"inputFieldList": "",
"textReplacementTemplates": [
""
],
"templateDirectory": "_templates",
"replaceSelection": "always",
"createOpen": "open-tab",
"inputSplit": "",
"inputSuggestions": true,
"config": "[]"
}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,10 @@
{
"id": "obsidian-notes-from-template",
"name": "From Template",
"version": "0.1.13",
"minAppVersion": "1.4.4",
"description": "Create new notes from Templates - for each Template, provides a Command to trigger it, and a form to fill in any variables in the template",
"author": "Dave Murray-Rust",
"authorUrl": "https://dave.murray-rust.org",
"isDesktopOnly": false
}

View file

@ -0,0 +1,159 @@
/* Submit button */
.from-template-submit {
font-size:x-large;
width: 100%;
}
/* Title Element */
.from-template-title {
margin-bottom: 0px;
}
/* one of the rows in the template UI */
.from-template-control-row {
padding: 6pt 0pt;
vertical-align: top;
width: 400pt;
}
.from-template-control-row-minimal-space {
padding: 0pt 0pt;
}
/* Container div for doing a row that is not divided, e.g. a Setting */
.from-template-control-row-undivided {
padding: 2pt 0pt;
vertical-align: top;
width: 375pt;
}
/* Container for the label/description of each row */
.from-template-description-column {
width: 80pt;
vertical-align: top;
padding-right:3pt;
display: inline-block;
text-align: right;
}
/* Container for main control of each row*/
.from-template-control-column {
width: fit-content;
vertical-align: top;
width: 295pt;
padding: 0;
display: inline-block;
}
/* Container for little additional column on the end for showing shortkeys */
.from-template-key-column {
width: 20pt;
vertical-align: top;
display: inline-block;
}
/* Default styling for control label main text */
.from-template-label-text {
}
/* Default styling for control label description text */
.from-template-label-description {
font-size:small;
color: var(--text-muted);
}
/* Default styling for the main control in a row*/
.from-template-control {
font-size:large;
width: 100%;
}
/* Ruler that separates sections of the template UI */
.from-template-section-sep {
margin-top:2pt;
margin-bottom:0;
}
/* Default label for the smaller control sections */
.from-template-sublabel {
font-size:small;
/*color: var(--text-muted);*/
}
/* Styling of the minor control fields */
.from-template-subcontrol {
font-size:small;
color: var(--text-muted);
width:100%;
}
/* General style for putting things into muted monospace */
.from-template-code-span {
font-family:monospace;
font-size: medium;
color: var(--text-muted);
}
/* These are part of the error display / handling styles */
.from-template-error-text {
color: #f00
}
.from-template-ok-text {
color: #afa
}
.from-template-Error {
border: 2px solid red;
}
/* Showing the key commands */
.from-template-shortkey {
font-family: monospace;
color: var(--text-normal);
font-size: small;
padding: 1pt 4pt;
margin-left: 4px;
margin-right: 4px;
border: 1px solid var(--interactive-accent);
border-radius: 3pt;
height:auto;
width:100%;
text-align: center;
}
/* Showing available fields for replacement text */
.from-template-inline-code-button {
font-family: monospace;
color: var(--text-normal);
font-size: small;
padding: 1pt 4pt;
margin-left: 4px;
margin-right: 4px;
border: 1px solid var(--interactive-accent);
height:auto;
}
.from-template-inline-code-button:hover {
color: var(--interactive-accent);
}
.from-template-command-list {
max-width: 80%;
}
.from-template-folder-container {
border: 2px solid grey;
padding: 5pt;
}
.from-template-folder-OK {
border: 2px solid green;
border-radius: 5px;
padding:0pt 5pt 0pt 5pt;
margin: 2pt;
}
.from-template-folder-bad {
/*
border: 2px solid red;
padding:0pt 5pt 0pt 5pt;
margin: 2pt;
*/
}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,10 @@
{
"id": "obsidian-sort-and-permute-lines",
"name": "Sort & Permute lines",
"version": "0.7.0",
"description": "",
"author": "Vinzent",
"authorUrl": "https://github.com/Vinzent03",
"fundingUrl": "https://ko-fi.com/vinzent",
"isDesktopOnly": false
}

2420
.obsidian/plugins/obsidian42-brat/main.js vendored Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,15 @@
{
"id": "obsidian42-brat",
"name": "BRAT",
"version": "1.0.3",
"minAppVersion": "1.4.16",
"description": "Easily install a beta version of a plugin for testing.",
"author": "TfTHacker",
"authorUrl": "https://github.com/TfTHacker/obsidian42-brat",
"helpUrl": "https://tfthacker.com/BRAT",
"isDesktopOnly": false,
"fundingUrl": {
"Buy Me a Coffee": "https://bit.ly/o42-kofi",
"Visit my site": "https://tfthacker.com"
}
}

View file

@ -0,0 +1,3 @@
.brat-modal .modal-button-container {
margin-top: 5px !important;
}

12
.obsidian/plugins/orgmode-cm6/data.json vendored Normal file
View file

@ -0,0 +1,12 @@
{
"todoKeywords": [
"TODO",
"READY",
"WIP"
],
"doneKeywords": [
"DONE",
"CANCELLED"
],
"hideStars": false
}

14716
.obsidian/plugins/orgmode-cm6/main.js vendored Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,10 @@
{
"id": "orgmode-cm6",
"name": "Orgmode (cm6)",
"version": "2.5.5",
"minAppVersion": "1.4.0",
"description": "Edit Orgmode files in Obsidian.",
"author": "Benoit Bazard",
"authorUrl": "https://github.com/bbazard",
"isDesktopOnly": false
}

195
.obsidian/plugins/orgmode-cm6/styles.css vendored Normal file
View file

@ -0,0 +1,195 @@
.orgmode-view {
font-size: var(--font-text-size);
}
.orgmode-view div.cm-line {
font-family: var(--font-text);
}
.cm-line:has(.org-heading) {
font-size: 1.05em;
}
.cm-line:has(.org-planning),
.cm-line:has(.org-propertydrawer) {
font-size: 0.95em;
}
.theme-dark .org-heading,
.theme-dark .cm-line:has(.org-heading) > .org-section {
color: #2fbd23;
}
.theme-dark .org-planning {
color: #bb8210;
}
.theme-dark .org-propertydrawer {
color: #aa944f;
}
.theme-dark .org-section {
color: #b9cddb;
}
.theme-dark .org-comment {
color: #a68fa7;
}
.theme-dark .org-keyword {
color: #bb0f0f;
}
.theme-dark .org-priority {
color: #058fc7;
}
.theme-dark .org-tags {
color: #02ffc7;
}
.theme-dark .org-text-bold {
font-weight: 600;
}
.theme-dark .org-text-italic {
font-style: italic;
}
.theme-dark .org-text-underline {
text-decoration: underline;
}
.theme-dark .org-text-verbatim {
background-color: black;
}
.theme-dark .org-text-code {
background-color: black;
}
.theme-dark .org-text-strikethrough {
text-decoration: line-through;
}
.theme-light .org-heading,
.theme-light .cm-line:has(.org-heading) > .org-section {
color: #2f8925;
}
.theme-light .org-planning {
color: #895f0a;
}
.theme-light .org-propertydrawer {
color: #705f2c;
}
.theme-light .org-section {
color: rgb(58, 69, 74);
}
.theme-light .org-comment {
color: #a68fa7;
}
.theme-light .org-keyword {
color: #931212;
}
.theme-light .org-priority {
color: #197aa0;
}
.theme-light .org-tags {
color: #1d9077;
}
.theme-light .org-text-bold {
font-weight: 600;
}
.theme-light .org-text-italic {
font-style: italic;
}
.theme-light .org-text-underline {
text-decoration: underline;
}
.theme-light .org-text-verbatim {
background-color: white;
}
.theme-light .org-text-code {
background-color: white;
}
.theme-light .org-text-strikethrough {
text-decoration: line-through;
}
.orgmode-view .cm-vimMode .cm-line ::selection {
background-color: var(--text-selection) !important;
}
.orgmode-view .cm-line.cm-line {
caret-color: var(--caret-color) !important;
}
.theme-dark .orgmode-view .cm-fat-cursor {
background-color: var(--text-accent) !important;
}
.theme-dark .orgmode-view:not(.cm-focused) .cm-fat-cursor {
background-color: unset !important;
outline-color: var(--text-accent) !important;
}
.theme-dark .orgmode-view .cm-selectionBackground {
background-color: var(--text-selection) !important;
}
.theme-dark .cm-editor .cm-cursor {
border-left-color: white; /* caret-color */
}
.theme-light .orgmode-view .cm-fat-cursor {
background-color: var(--text-accent) !important;
}
.theme-light .orgmode-view:not(.cm-focused) .cm-fat-cursor {
background-color: unset !important;
outline-color: var(--text-accent) !important;
}
.theme-light .orgmode-view .cm-selectionBackground {
background-color: var(--text-selection) !important;
}
.theme-light .cm-editor .cm-cursor {
border-left-color: black; /* caret-color */
}
.orgmode-view.cm-focused {
outline: unset;
}
.orgmode-view .cm-foldPlaceholder {
color: var(--text-faint);
background-color: transparent;
border: none;
margin-left: 8px;
user-select: none;
}
.orgmode-view .org-link,
.orgmode-view .org-link .org-section {
color: var(--link-color);
}
.theme-dark .orgmode-view .org-block {
background-color: #1a1a20;
font-family: var(--font-monospace);
}
.theme-light .orgmode-view .org-block {
background-color: #d2d2ed;
font-family: var(--font-monospace);
}
.orgmode-view .org-block-header {
font-size: var(--font-ui-smaller);
color: var(--text-muted);
padding: var(--size-4-1) var(--size-4-2);
position: relative;
top: -0.2em;
}

31
.obsidian/plugins/qatt/data.json vendored Normal file
View file

@ -0,0 +1,31 @@
{
"sqlFiles": "",
"sqlLoaderSettingsOpen": false,
"postRenderFormat": "markdown",
"enableExperimentalRender": false,
"renderingSettingsOpen": true,
"internalQueryRenderChildVersion": 2,
"enableCodeBlockEditor": true,
"queryFileRoot": "",
"templateFileRoot": "",
"debounceWindow": 5000,
"enableDataViewInlineFieldParsingForTasks": false,
"notesCacheSettingsOpen": true,
"enableAlaSqlTablePopulation": true,
"disableContinualIndexNotifications": false,
"jsonFiles": "",
"jsonLoaderSettingsOpen": true,
"markdownTableFiles": "",
"markdownLoaderSettingsOpen": true,
"csvFiles": "",
"csvLoaderSettingsOpen": true,
"onStartSqlQueries": "CREATE TABLE my_lookup(name,birthday);\nINSERT INTO my_lookup VALUES (\"fred\", 2000-02-03);",
"announceUpdates": false,
"version": "1.1.1",
"mainHeadingOpen": true,
"generalHeadingOpen": true,
"internalLoggingConsoleLogLimit": 10,
"disableDataviewMissingNotification": false,
"disableCustomJsMissingNotification": false,
"enableEditorRightClickMenu": true
}

373
.obsidian/plugins/qatt/main.js vendored Normal file

File diff suppressed because one or more lines are too long

31
.obsidian/plugins/qatt/manifest.json vendored Normal file
View file

@ -0,0 +1,31 @@
{
"id": "qatt",
"name": "Query all the things",
"version": "1.1.1",
"minAppVersion": "1.2.8",
"description": "Execute SQL base queries against your data in Obsidian and render it how you want using templates.",
"author": "Sytone",
"authorUrl": "https://github.com/sytone",
"helpUrl": "https://sytone.github.io/obsidian-queryallthethings/",
"isDesktopOnly": false,
"releases": [
{
"0.8.7": "In this release the documentation has been updated and now has examples you can use locally by downloading and expanding the obsidian-queryallthethings.vault.zip file attached to each release or by cloning the repo and opening the docs folder in Obsidian as a vault. This will hopefully make understanding the plugin simpler by using live examples. \r\n\r\nA suggester prompt based off [Templater](https://github.com/SilentVoid13/Templater) has been added as an internal function and a new SQL function has been added allowing you to generate HTML that will prompt you for a value and update the page related to the row with the specified property name and selected value. This makes it easy to change the state of a page if you are rendering a table with values. It is more of a convenience for user aka me 😄. See [Using updatePropertyFromList](https://sytone.github.io/obsidian-queryallthethings/Examples/using-updatepropertyfromlist/) for details on using it. Please look at [Templater](https://github.com/SilentVoid13/Templater) and use if you do not already as it is an amazing plugin for the platform and props to @silentvoid13 for creating it. \r\n\r\n### Features\r\n\r\n* add suggester and setting display state ([150063b](https://github.com/sytone/obsidian-queryallthethings/commits/150063bbd367a30c355d50d5a66945504690c479))\r\n* add updatePropertyFromList sql function ([e20b590](https://github.com/sytone/obsidian-queryallthethings/commits/e20b5902b1b69915e4ed6ed93cc0360cdfe6547d))\r\n\r\n\r\n### Documentation\r\n\r\n* add sql union documentation and example ([3a973b2](https://github.com/sytone/obsidian-queryallthethings/commits/3a973b2c8327c368e61209cde0ccd9eade131c1b))\r\n\r\n\r\n### Internal\r\n\r\n* add warning for CustomJS plugin if missing ([c7864a8](https://github.com/sytone/obsidian-queryallthethings/commits/c7864a852c54891aaea1021b9538c7efe2c6f920))\r\n\r\n**Full Changelog**: https://github.com/sytone/obsidian-queryallthethings/compare/0.8.6...0.8.7"
},
{
"0.8.8": "## Features\r\n- enable frontmatter data to be queried for page.\r\n- **render:** add 100+ handlebars helpers to rendering templates\r\n- return all query results as collection to be rendered and not just last query\r\n## Bug Fixes and Changes\r\n- add exclude to properties of example pages\r\n- remove log entry from get tasks function\r\n## Documentation\r\n- added help Url so HelpMate support is available.\r\n- update examples and simple queries\r\n\r\nThis example has two queries that are executed and the results from each query can be accessed via an index off result. It is in the form `result.[x]` where `x` is the query number starting from 0. In addition the first queries shows a page property being used, this can be use in the `WHERE` clause as well allowing queries to change based on frontmatter. Works great with MetaBind.\r\n\r\n```qatt\r\nquery: |\r\n SELECT pageProperty('created') Created;\r\n SELECT TOP 1 * FROM obsidian_markdown_notes\r\ntemplate: |\r\n {{#each result.[0]}}\r\n This page was created on {{Created}}\r\n {{/each}}\r\n {{#each result.[1]}}\r\n - {{name}}\r\n {{/each}}\r\n```\r\n\r\nAll the handlebars helpers shown at [handlebars-helpers/README.md at master · Budibase/handlebars-helpers (github.com)](https://github.com/Budibase/handlebars-helpers/blob/master/README.md) are also now available to be used in the templates section.\r\n\r\n"
},
{
"0.8.9": "This is a hotfix that disables the new handlebars helpers as some are causing conflicts."
},
{
"0.8.10": "Fixes issue with CustomJS detection, the window object would not always be in place when the plugin loaded. Added check to see installed and activated plugins has CustomJS as that is reliable during plugin load."
},
{
"0.9.0": "## Features\n- Update markdown table import handling to work with pages with markdown and multiple tables. It will import the first table found on the note.\n- Added do date to task parsing as a column ('💨', 'do::')\n- Added new functions to append to the the task when called from the `taskCheckboxWithAppend` handlebars helper. Allows done date to be added. \n- Added `flexibleTaskCheckbox` handlebars helper to allow next status to be specified on click.\n- Added more options to the query export feature. Target pages can be updated once, once a day or once a week. \n## Bug Fixes and Changes\n- Changes the DOM changes when the code block is parsed to be more consistent.\n- Updated post rending model to be clearer and allow extensions to it.\n- Separated out all handlebars handlers to be separate files, also fixed casing issues.\n## Documentation\n- Added a TTRPG based example\n- Reordered documentation to be more clear.\n- Created documentation stubs for all handlebars helpers.\n- Added new examples with live versions that work when you open docs as an obsidian vault."
},
{
"0.10.0": "## Features\n\n* Add obsidian handlebars helper and JoinArray SQL function\n* Add settings to disable missing DataView and CustomJS plugins notification\n* Add EXTRACTLINE and LINEINDEX SQL functions\n* Enable processing of DataView Inline fields for us in tasks (`obsidian_markdown_tasks table`), closes [#11](https://github.com/sytone/obsidian-queryallthethings/issues/11)\n\n## Documentation\n\n* Multiple updates to the structure and generated documentation to make it more consistent and to enable live examples if the documentation is opened as an Obsidian vault."
}
]
}

110
.obsidian/plugins/qatt/styles.css vendored Normal file
View file

@ -0,0 +1,110 @@
:root {
--queryatt-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='currentColor' class='bi bi-patch-question' viewBox='0 0 16 16'%3E%3Cpath d='M8.05 9.6c.336 0 .504-.24.554-.627.04-.534.198-.815.847-1.26.673-.475 1.049-1.09 1.049-1.986 0-1.325-.92-2.227-2.262-2.227-1.02 0-1.792.492-2.1 1.29A1.71 1.71 0 0 0 6 5.48c0 .393.203.64.545.64.272 0 .455-.147.564-.51.158-.592.525-.915 1.074-.915.61 0 1.03.446 1.03 1.084 0 .563-.208.885-.822 1.325-.619.433-.926.914-.926 1.64v.111c0 .428.208.745.585.745z'/%3E%3Cpath d='m10.273 2.513-.921-.944.715-.698.622.637.89-.011a2.89 2.89 0 0 1 2.924 2.924l-.01.89.636.622a2.89 2.89 0 0 1 0 4.134l-.637.622.011.89a2.89 2.89 0 0 1-2.924 2.924l-.89-.01-.622.636a2.89 2.89 0 0 1-4.134 0l-.622-.637-.89.011a2.89 2.89 0 0 1-2.924-2.924l.01-.89-.636-.622a2.89 2.89 0 0 1 0-4.134l.637-.622-.011-.89a2.89 2.89 0 0 1 2.924-2.924l.89.01.622-.636a2.89 2.89 0 0 1 4.134 0l-.715.698a1.89 1.89 0 0 0-2.704 0l-.92.944-1.32-.016a1.89 1.89 0 0 0-1.911 1.912l.016 1.318-.944.921a1.89 1.89 0 0 0 0 2.704l.944.92-.016 1.32a1.89 1.89 0 0 0 1.912 1.911l1.318-.016.921.944a1.89 1.89 0 0 0 2.704 0l.92-.944 1.32.016a1.89 1.89 0 0 0 1.911-1.912l-.016-1.318.944-.921a1.89 1.89 0 0 0 0-2.704l-.944-.92.016-1.32a1.89 1.89 0 0 0-1.912-1.911l-1.318.016z'/%3E%3Cpath d='M7.001 11a1 1 0 1 1 2 0 1 1 0 0 1-2 0z'/%3E%3C/svg%3E");
--settings-collapser-icon: url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M8.59 16.58L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z'/></svg>");
}
/*
From: https://github.com/vineethtrv/css-loader
*/
.qatt-loader {
width: 16px;
height: 16px;
border-radius: 50%;
display: block;
margin: 15px auto;
position: relative;
background: #FFF;
box-shadow: -24px 0 #FFF, 24px 0 #FFF;
box-sizing: border-box;
animation: shadowPulse 2s linear infinite;
}
@keyframes shadowPulse {
33% {
background: #FFF;
box-shadow: -24px 0 #FF3D00, 24px 0 #FFF;
}
66% {
background: #FF3D00;
box-shadow: -24px 0 #FFF, 24px 0 #FFF;
}
100% {
background: #FFF;
box-shadow: -24px 0 #FFF, 24px 0 #FF3D00;
}
}
/**------------------------------------------------------------------------
** SETTINGS
*------------------------------------------------------------------------**/
.qatt-settings .additional {
margin: 6px 12px;
}
.qatt-settings .additional>.setting-item {
border-top: 0;
padding-top: 9px;
}
.qatt-settings details>summary {
outline: none;
display: block !important;
list-style: none !important;
list-style-type: none !important;
min-height: 1rem;
border-top-left-radius: 0.1rem;
border-top-right-radius: 0.1rem;
cursor: pointer;
position: relative;
}
.qatt-settings details>summary::-webkit-details-marker,
.qatt-settings details>summary::marker {
display: none !important;
}
.qatt-settings details>summary>.collapser {
position: absolute;
top: 50%;
right: 8px;
transform: translateY(-50%);
content: "";
}
.qatt-settings details>summary>.collapser>.handle {
transform: rotate(0deg);
transition: transform 0.25s;
background-color: currentColor;
-webkit-mask-repeat: no-repeat;
mask-repeat: no-repeat;
-webkit-mask-size: contain;
mask-size: contain;
-webkit-mask-image: var(--settings-collapser-icon);
mask-image: var(--settings-collapser-icon);
width: 20px;
height: 20px;
}
.qatt-settings details[open]>summary>.collapser>.handle {
transform: rotate(90deg);
}
.qatt-nested-settings .setting-item {
border: 0px;
padding-bottom: 0;
}
.qatt-nested-settings {
padding-bottom: 18px;
}
.qatt-nested-settings[open] .setting-item-heading,
.qatt-nested-settings:not(details) .setting-item-heading {
border-top: 0px;
border-bottom: 1px solid var(--background-modifier-border);
}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,10 @@
{
"id": "smart-random-note",
"name": "Smart Random Note",
"version": "0.2.1",
"minAppVersion": "0.9.18",
"description": "A smart random note plugin",
"author": "Eric Hall",
"authorUrl": "https://erichall.io",
"isDesktopOnly": false
}

525
.obsidian/plugins/tag-page-md/main.js vendored Normal file
View file

@ -0,0 +1,525 @@
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// main.ts
var main_exports = {};
__export(main_exports, {
default: () => TagPagePlugin
});
module.exports = __toCommonJS(main_exports);
var import_obsidian2 = require("obsidian");
// src/utils/obsidianApi.ts
var import_obsidian = require("obsidian");
var isTagPage = (app, tagPageFrontmatterKey, providedFile, tagOfInterest) => {
var _a, _b, _c;
const file = providedFile || ((_a = app.workspace.getActiveViewOfType(import_obsidian.MarkdownView)) == null ? void 0 : _a.file) || null;
if (!file)
return false;
const frontmatterValue = (_c = (_b = app.metadataCache.getFileCache(file)) == null ? void 0 : _b.frontmatter) == null ? void 0 : _c[tagPageFrontmatterKey];
if (tagOfInterest !== void 0) {
return frontmatterValue === tagOfInterest;
}
return !!frontmatterValue;
};
// src/utils/tagSearch.ts
var getIsWildCard = (tag) => {
const isWildCard = tag.endsWith("/*");
const cleanedTag = isWildCard ? tag.slice(0, -2) : tag;
return { isWildCard, cleanedTag };
};
var containsTag = (stringToSearch, tag) => {
const { isWildCard, cleanedTag } = getIsWildCard(tag);
const lowerStringToSearch = stringToSearch.toLowerCase();
const lowerCleanedTag = cleanedTag.toLowerCase();
if (isWildCard) {
return lowerStringToSearch.includes(lowerCleanedTag);
} else {
const regex = new RegExp(`${lowerCleanedTag}\\s`, "gi");
return regex.test(lowerStringToSearch);
}
};
var findSmallestUnitsContainingTag = (content, tag, excludeBullets = false) => {
const { isWildCard, cleanedTag } = getIsWildCard(tag);
const escapedSubstring = cleanedTag.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
const wildcardPattern = isWildCard ? "(?:\\/[^\\s]*)?" : "";
const contentLines = content.split("\n").filter((line) => !(excludeBullets && line.trim().startsWith("-")));
const matchesMap = /* @__PURE__ */ new Map();
contentLines.forEach((line) => {
const regex = new RegExp(`${escapedSubstring}${wildcardPattern}`, "gi");
const matches = [...line.matchAll(regex)];
matches.forEach((match) => {
let key = match[0].toLowerCase();
if (isWildCard && key.endsWith("/*")) {
key = key.slice(0, -2);
}
if (!matchesMap.has(key)) {
matchesMap.set(key, [line.trim()]);
} else {
const existingLines = matchesMap.get(key);
if (!existingLines.includes(line.trim())) {
existingLines.push(line.trim());
}
}
});
});
return matchesMap;
};
var findBulletListsContainingTag = (content, tag) => {
const capturedBulletLists = /* @__PURE__ */ new Map();
const fileLines = content.split("\n").filter((line) => line.trim() !== "");
let currentBulletIndentation = 0;
const lastTagsAtCurrentIndentation = /* @__PURE__ */ new Set();
let capturingSubBullet = false;
fileLines.forEach((line) => {
const lineTrim = line.trim();
const startsWithBullet = lineTrim.startsWith("- ");
const lineIndentation = line.search(/\S/);
if (startsWithBullet) {
const { isWildCard, cleanedTag } = getIsWildCard(tag);
const tagRegex = isWildCard ? `${cleanedTag}(/[^\\s]+)?` : `${cleanedTag}(?![^\\s])`;
const regex = new RegExp(tagRegex, "gi");
const matches = line.match(regex);
if (startsWithBullet && (matches || lineIndentation <= currentBulletIndentation)) {
capturingSubBullet = false;
currentBulletIndentation = lineIndentation;
lastTagsAtCurrentIndentation.clear();
}
if (matches) {
capturingSubBullet = false;
matches.forEach((match) => {
var _a;
const trimmedMatch = isWildCard && match.endsWith("/") ? match.slice(0, -1) : match;
const trimmedMatchLowerCase = trimmedMatch.toLowerCase();
if (!capturedBulletLists.has(trimmedMatchLowerCase)) {
capturedBulletLists.set(trimmedMatchLowerCase, []);
}
(_a = capturedBulletLists.get(trimmedMatchLowerCase)) == null ? void 0 : _a.push(
lineIndentation > currentBulletIndentation && capturingSubBullet ? line : lineTrim
);
lastTagsAtCurrentIndentation.add(trimmedMatchLowerCase);
});
} else if (lineIndentation > currentBulletIndentation && lastTagsAtCurrentIndentation.size > 0) {
capturingSubBullet = true;
lastTagsAtCurrentIndentation.forEach((tag2) => {
var _a;
(_a = capturedBulletLists.get(tag2)) == null ? void 0 : _a.push(line);
});
}
}
});
return capturedBulletLists;
};
function consolidateTagInfo(fileLink, unitsContainingTag, bulletListsContainingTag) {
const consolidatedInfo = /* @__PURE__ */ new Map();
const addMatchesToConsolidatedInfo = (tag, matches) => {
const existingMatches = consolidatedInfo.get(tag) || [];
const newMatches = matches.map((matchString) => ({
stringContainingTag: matchString,
fileLink
}));
consolidatedInfo.set(tag, existingMatches.concat(newMatches));
};
unitsContainingTag == null ? void 0 : unitsContainingTag.forEach((matches, tag) => {
addMatchesToConsolidatedInfo(tag, matches);
});
bulletListsContainingTag == null ? void 0 : bulletListsContainingTag.forEach((matches, tag) => {
addMatchesToConsolidatedInfo(tag, matches);
});
return consolidatedInfo;
}
var processFile = async (vault, settings, file, tagOfInterest) => {
const fileContents = await vault.cachedRead(file);
if (!containsTag(fileContents, tagOfInterest))
return /* @__PURE__ */ new Map();
const fileLink = settings.fullLinkName ? `[[${file.basename}]]` : `[[${file.basename}|*]]`;
switch (true) {
case (settings.bulletedSubItems && settings.includeLines):
return consolidateTagInfo(
fileLink,
findSmallestUnitsContainingTag(
fileContents,
tagOfInterest,
true
),
findBulletListsContainingTag(fileContents, tagOfInterest)
);
case (settings.bulletedSubItems && !settings.includeLines):
return consolidateTagInfo(
fileLink,
void 0,
findBulletListsContainingTag(fileContents, tagOfInterest)
);
case (!settings.bulletedSubItems && settings.includeLines):
default:
return consolidateTagInfo(
fileLink,
findSmallestUnitsContainingTag(
fileContents,
tagOfInterest,
false
),
void 0
);
}
};
var fetchTagData = async (app, settings, tagOfInterest) => {
const vault = app.vault;
const allFiles = vault.getMarkdownFiles();
return await Promise.all(
allFiles.filter(
(file) => !isTagPage(app, settings.frontmatterQueryProperty, file)
).map((file) => processFile(vault, settings, file, tagOfInterest))
).then((tagInfos) => {
const consolidatedTagInfo = /* @__PURE__ */ new Map();
tagInfos.forEach((tagInfo) => {
tagInfo.forEach((details, tag) => {
const existingDetails = consolidatedTagInfo.get(tag) || [];
consolidatedTagInfo.set(tag, existingDetails.concat(details));
});
});
return consolidatedTagInfo;
});
};
// src/utils/pageContent.ts
var generateTagPageContent = async (app, settings, tagsInfo, tagOfInterest) => {
const tagPageContent = [];
tagPageContent.push(
`---
${settings.frontmatterQueryProperty}: "${tagOfInterest}"
---`
);
tagPageContent.push(`## Tag Content for ${tagOfInterest.replace("*", "")}`);
if (tagsInfo.size > 1) {
const sortedTagsInfo = Array.from(tagsInfo).sort((a, b) => {
return a[0].length - b[0].length;
});
sortedTagsInfo.forEach(([baseTag, details]) => {
tagPageContent.push(`### ${baseTag}`);
details.forEach(({ stringContainingTag, fileLink }) => {
processTagMatch(stringContainingTag, fileLink, tagPageContent);
});
});
} else {
tagsInfo.forEach((details) => {
details.forEach(({ stringContainingTag, fileLink }) => {
processTagMatch(stringContainingTag, fileLink, tagPageContent);
});
});
}
const filesWithFrontmatterTag = app.vault.getMarkdownFiles().filter((file) => {
var _a;
const metaMatter = (_a = app.metadataCache.getFileCache(file)) == null ? void 0 : _a.frontmatter;
return (metaMatter == null ? void 0 : metaMatter.tags) ? matchesTagOfInterest(metaMatter.tags, tagOfInterest) : false;
}).map((file) => `- [[${file.basename}]]`);
if (filesWithFrontmatterTag.length > 0) {
const { cleanedTag } = getIsWildCard(tagOfInterest);
tagPageContent.push(`## Files with ${cleanedTag} in frontmatter`);
tagPageContent.push(...filesWithFrontmatterTag);
}
return tagPageContent.join("\n");
};
var extractFrontMatterTagValue = (app, view, frontMatterTag) => {
var _a;
if (view.file) {
try {
const metaMatter = (_a = app.metadataCache.getFileCache(view.file)) == null ? void 0 : _a.frontmatter;
return metaMatter == null ? void 0 : metaMatter[frontMatterTag];
} catch (err) {
console.log(err);
return;
}
}
};
function processTagMatch(fullTag, fileLink, tagPageContent) {
if (fullTag.trim().startsWith("-")) {
const [firstBullet, ...bullets] = fullTag.split("\n");
const firstBulletWithLink = `${firstBullet} ${fileLink}`;
tagPageContent.push([firstBulletWithLink, ...bullets].join("\n"));
} else {
tagPageContent.push(`- ${fullTag} ${fileLink}`);
}
}
function matchesTagOfInterest(tags, tagOfInterest) {
const normalizedTags = Array.isArray(tags) ? tags : [tags];
const { isWildCard, cleanedTag: tagBase } = getIsWildCard(tagOfInterest);
if (isWildCard) {
return normalizedTags.some((tag) => {
const fullTag = `#${tag}`;
return fullTag === tagBase || fullTag.startsWith(`${tagBase}/`);
});
} else {
return normalizedTags.some((tag) => `#${tag}` === tagBase);
}
}
var swapPageContent = (activeLeaf, newPageContent) => {
var _a;
(_a = activeLeaf == null ? void 0 : activeLeaf.currentMode) == null ? void 0 : _a.set(newPageContent, true);
};
var generateFilename = (cleanedTag, isWildCard, nestedSeparator) => {
return `${cleanedTag.replace("#", "").replaceAll("/", nestedSeparator)}${isWildCard ? nestedSeparator + "nested" : ""}${nestedSeparator}Tags.md`;
};
// main.ts
var DEFAULT_SETTINGS = {
tagPageDir: "Tags/",
frontmatterQueryProperty: "tag-page-query",
nestedSeparator: "_",
bulletedSubItems: true,
includeLines: true,
autoRefresh: true,
fullLinkName: false
};
var TagPagePlugin = class extends import_obsidian2.Plugin {
async onload() {
await this.loadSettings();
this.addSettingTab(new TagPageSettingTab(this.app, this));
this.ribbonIcon = this.addRibbonIcon(
"tag-glyph",
"Refresh tag page",
() => {
this.refreshTagPageContent();
}
);
this.ribbonIcon.style.display = "none";
this.addCommand({
id: "create-tag-page",
name: "Create tag page",
callback: () => {
new CreateTagPageModal(this.app, this).open();
}
});
this.registerEvent(
this.app.workspace.on("layout-change", () => {
this.updateRibbonIconVisibility();
this.autoRefreshTagPage();
})
);
this.registerEvent(
this.app.workspace.on("file-open", () => {
this.updateRibbonIconVisibility();
this.autoRefreshTagPage();
})
);
this.updateRibbonIconVisibility();
await this.autoRefreshTagPage();
}
updateRibbonIconVisibility() {
this.ribbonIcon.style.display = isTagPage(
this.app,
this.settings.frontmatterQueryProperty
) ? "block" : "none";
}
async autoRefreshTagPage() {
if (this.settings.autoRefresh && isTagPage(this.app, this.settings.frontmatterQueryProperty)) {
await this.refreshTagPageContent();
}
}
onunload() {
}
async loadSettings() {
this.settings = Object.assign(
{},
DEFAULT_SETTINGS,
await this.loadData()
);
}
async saveSettings() {
await this.saveData(this.settings);
}
/**
* Refreshes the content of the active tag page based on the current settings.
*
* @returns {Promise<void>} - A promise that resolves when the operation is complete.
*/
async refreshTagPageContent() {
const activeLeaf = this.app.workspace.getActiveViewOfType(import_obsidian2.MarkdownView);
if (!activeLeaf)
return;
const tagOfInterest = extractFrontMatterTagValue(
this.app,
activeLeaf,
this.settings.frontmatterQueryProperty
);
if (!tagOfInterest)
return;
const tagsInfo = await fetchTagData(
this.app,
this.settings,
tagOfInterest
);
const tagPageContentString = await generateTagPageContent(
this.app,
this.settings,
tagsInfo,
tagOfInterest
);
swapPageContent(activeLeaf, tagPageContentString);
}
/**
* Creates a new tag page or navigates to an existing one.
*
* @param {string} tag - The tag for which to create or navigate to a page.
* @returns {Promise<void>} - A promise that resolves when the operation is complete.
*/
async createTagPage(tag) {
const tagOfInterest = tag.startsWith("#") ? tag : `#${tag}`;
const { isWildCard, cleanedTag } = getIsWildCard(tagOfInterest);
const filename = generateFilename(
cleanedTag,
isWildCard,
this.settings.nestedSeparator
);
const tagPage = this.app.vault.getAbstractFileByPath(
`${this.settings.tagPageDir}${filename}`
);
if (!tagPage) {
const tagsInfo = await fetchTagData(
this.app,
this.settings,
tagOfInterest
);
const tagPageContentString = await generateTagPageContent(
this.app,
this.settings,
tagsInfo,
tagOfInterest
);
const exists = await this.app.vault.adapter.exists(
(0, import_obsidian2.normalizePath)(this.settings.tagPageDir)
);
if (!exists) {
await this.app.vault.createFolder(this.settings.tagPageDir);
}
const createdPage = await this.app.vault.create(
`${this.settings.tagPageDir}${filename}`,
tagPageContentString
);
await this.app.workspace.getLeaf().openFile(createdPage);
} else {
await this.app.workspace.getLeaf().openFile(tagPage);
}
}
};
var CreateTagPageModal = class extends import_obsidian2.Modal {
constructor(app, plugin) {
super(app);
this.plugin = plugin;
}
onOpen() {
const { contentEl } = this;
contentEl.setText("Tag to create page for:");
const tagForm = contentEl.createEl("form");
contentEl.addClass("create-page-modal");
const input = tagForm.createEl("input", { type: "text" });
input.placeholder = "#tag";
input.value = "#";
input.addEventListener("keydown", (e) => {
const cursorPosition = input.selectionStart;
if (cursorPosition === 1 && (e.key === "Backspace" || e.key === "Delete")) {
e.preventDefault();
}
});
const submitButton = tagForm.createEl("button", { type: "submit" });
submitButton.innerText = "Create Tag Page";
tagForm.addEventListener("submit", async (e) => {
e.preventDefault();
const tag = input.value;
this.contentEl.empty();
this.contentEl.setText(`Creating tag page for ${tag}...`);
await this.plugin.createTagPage(tag);
this.close();
});
}
onClose() {
const { contentEl } = this;
contentEl.empty();
}
};
var TagPageSettingTab = class extends import_obsidian2.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
const { containerEl } = this;
containerEl.empty();
new import_obsidian2.Setting(containerEl).setName("Tag page directory").setDesc("The directory in which to create tag pages.").addText(
(text) => text.setValue(this.plugin.settings.tagPageDir).onChange(async (value) => {
if (!value.endsWith("/")) {
value = `${value}/`;
}
this.plugin.settings.tagPageDir = value;
await this.plugin.saveSettings();
})
);
new import_obsidian2.Setting(containerEl).setName("Frontmatter query property").setDesc(
"The frontmatter property to use storing the query tag within the tag page. Required for page refresh."
).addText(
(text) => text.setValue(this.plugin.settings.frontmatterQueryProperty).onChange(async (value) => {
this.plugin.settings.frontmatterQueryProperty = value;
await this.plugin.saveSettings();
})
);
new import_obsidian2.Setting(containerEl).setName("Nested page separator").setDesc(
`Text used to separate levels for nested tags. Avoid \\/<>:"|?* and other characters that aren't file-safe, or you won't be able to make pages for nested tags.`
).addText(
(text) => text.setValue(this.plugin.settings.nestedSeparator).onChange(async (value) => {
this.plugin.settings.nestedSeparator = value;
await this.plugin.saveSettings();
})
);
new import_obsidian2.Setting(containerEl).setName("Include lines").setDesc("Include lines containing the tag in the tag page.").addToggle(
(toggle) => toggle.setValue(this.plugin.settings.includeLines).onChange(async (value) => {
this.plugin.settings.includeLines = value;
await this.plugin.saveSettings();
})
);
new import_obsidian2.Setting(containerEl).setName("Bulleted sub-items").setDesc(
"Include bulleted sub-items containing the tag in the tag page."
).addToggle(
(toggle) => toggle.setValue(this.plugin.settings.bulletedSubItems).onChange(async (value) => {
this.plugin.settings.bulletedSubItems = value;
await this.plugin.saveSettings();
})
);
new import_obsidian2.Setting(containerEl).setName("Auto refresh").setDesc(
"Automatically refresh tag pages when they are opened or become active."
).addToggle(
(toggle) => toggle.setValue(this.plugin.settings.autoRefresh).onChange(async (value) => {
this.plugin.settings.autoRefresh = value;
await this.plugin.saveSettings();
})
);
new import_obsidian2.Setting(containerEl).setName("Display full link name as reference").setDesc(
"Each bit of pulled content will display the full link title as a reference as an end of line. Displays * when false."
).addToggle(
(toggle) => toggle.setValue(this.plugin.settings.fullLinkName).onChange(async (value) => {
this.plugin.settings.fullLinkName = value;
await this.plugin.saveSettings();
})
);
}
};

View file

@ -0,0 +1,11 @@
{
"id": "tag-page-md",
"name": "Tag Page",
"version": "1.1.0",
"minAppVersion": "0.15.0",
"description": "Dynamically generate and update tag-specific pages, offering a consolidated view of each tag's references across your vault.",
"author": "Matthew Sumpter",
"authorUrl": "https://matthewsumpter.org",
"fundingUrl": "https://www.buymeacoffee.com/buymeacofftu",
"isDesktopOnly": false
}

View file

@ -0,0 +1,29 @@
/*
This CSS file will be included with your plugin, and
available in the app when your plugin is enabled.
If your plugin does not need CSS, delete this file.
*/
.create-page-modal {
/* add margin to all children */
& > * {
margin: 10px;
}
display: flex;
flex-direction: column;
text-align: center;
& form {
display: flex;
flex-direction: column;
& > input {
text-align: center;
}
}
}

2257
.obsidian/plugins/tag-word-cloud/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,10 @@
{
"id": "tag-word-cloud",
"name": "Tag & Word Cloud",
"version": "1.4.1",
"minAppVersion": "1.0.0",
"description": "Show a cloud of your tags/words in a note",
"author": "Johannes Theiner",
"authorUrl": "https://github.com/joethei",
"isDesktopOnly": false
}

View file

@ -0,0 +1,3 @@
p.cloud-error {
color: red;
}

View file

@ -0,0 +1,30 @@
{
"command_timeout": 5,
"templates_folder": "_templates",
"templates_pairs": [
[
"",
""
]
],
"trigger_on_file_creation": false,
"auto_jump_to_cursor": false,
"enable_system_commands": false,
"shell_path": "",
"user_scripts_folder": "",
"enable_folder_templates": true,
"folder_templates": [
{
"folder": "",
"template": ""
}
],
"syntax_highlighting": true,
"syntax_highlighting_mobile": false,
"enabled_templates_hotkeys": [
""
],
"startup_templates": [
""
]
}

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,11 @@
{
"id": "templater-obsidian",
"name": "Templater",
"version": "2.7.2",
"description": "Create and use templates",
"minAppVersion": "1.5.0",
"author": "SilentVoid",
"authorUrl": "https://github.com/SilentVoid13",
"helpUrl": "https://silentvoid13.github.io/Templater/",
"isDesktopOnly": false
}

View file

@ -0,0 +1,220 @@
.templater_search {
width: calc(100% - 20px);
}
.templater_div {
border-top: 1px solid var(--background-modifier-border);
}
.templater_div > .setting-item {
border-top: none !important;
align-self: center;
}
.templater_div > .setting-item > .setting-item-control {
justify-content: space-around;
padding: 0;
width: 100%;
}
.templater_div
> .setting-item
> .setting-item-control
> .setting-editor-extra-setting-button {
align-self: center;
}
.templater_donating {
margin: 10px;
}
.templater_title {
margin: 0;
padding: 0;
margin-top: 5px;
text-align: center;
}
.templater_template {
align-self: center;
margin-left: 5px;
margin-right: 5px;
width: 70%;
}
.templater_cmd {
margin-left: 5px;
margin-right: 5px;
font-size: 14px;
width: 100%;
}
.templater_div2 > .setting-item {
align-content: center;
justify-content: center;
}
.templater-prompt-div {
display: flex;
}
.templater-prompt-form {
display: flex;
flex-grow: 1;
}
.templater-prompt-input {
flex-grow: 1;
}
.templater-button-div {
display: flex;
flex-direction: column;
align-items: center;
margin-top: 1rem;
}
textarea.templater-prompt-input {
height: 10rem;
}
textarea.templater-prompt-input:focus {
border-color: var(--interactive-accent);
}
.cm-s-obsidian .templater-command-bg {
left: 0px;
right: 0px;
background-color: var(--background-primary-alt);
}
.cm-s-obsidian .cm-templater-command {
font-size: 0.85em;
font-family: var(--font-monospace);
line-height: 1.3;
}
.cm-s-obsidian .templater-inline .cm-templater-command {
background-color: var(--background-primary-alt);
}
.cm-s-obsidian .cm-templater-command.cm-templater-opening-tag {
font-weight: bold;
}
.cm-s-obsidian .cm-templater-command.cm-templater-closing-tag {
font-weight: bold;
}
.cm-s-obsidian .cm-templater-command.cm-templater-interpolation-tag {
color: var(--code-property, #008bff);
}
.cm-s-obsidian .cm-templater-command.cm-templater-execution-tag {
color: var(--code-function, #c0d700);
}
.cm-s-obsidian .cm-templater-command.cm-keyword {
color: var(--code-keyword, #00a7aa);
font-weight: normal;
}
.cm-s-obsidian .cm-templater-command.cm-atom {
color: var(--code-normal, #f39b35);
}
.cm-s-obsidian .cm-templater-command.cm-value,
.cm-s-obsidian .cm-templater-command.cm-number,
.cm-s-obsidian .cm-templater-command.cm-type {
color: var(--code-value, #a06fca);
}
.cm-s-obsidian .cm-templater-command.cm-def,
.cm-s-obsidian .cm-templater-command.cm-type.cm-def {
color: var(--code-normal, var(--text-normal));
}
.cm-s-obsidian .cm-templater-command.cm-property,
.cm-s-obsidian .cm-templater-command.cm-property.cm-def,
.cm-s-obsidian .cm-templater-command.cm-attribute {
color: var(--code-function, #98e342);
}
.cm-s-obsidian .cm-templater-command.cm-variable,
.cm-s-obsidian .cm-templater-command.cm-variable-2,
.cm-s-obsidian .cm-templater-command.cm-variable-3,
.cm-s-obsidian .cm-templater-command.cm-meta {
color: var(--code-property, #d4d4d4);
}
.cm-s-obsidian .cm-templater-command.cm-callee,
.cm-s-obsidian .cm-templater-command.cm-operator,
.cm-s-obsidian .cm-templater-command.cm-qualifier,
.cm-s-obsidian .cm-templater-command.cm-builtin {
color: var(--code-operator, #fc4384);
}
.cm-s-obsidian .cm-templater-command.cm-tag {
color: var(--code-tag, #fc4384);
}
.cm-s-obsidian .cm-templater-command.cm-comment,
.cm-s-obsidian .cm-templater-command.cm-comment.cm-tag,
.cm-s-obsidian .cm-templater-command.cm-comment.cm-attribute {
color: var(--code-comment, #696d70);
}
.cm-s-obsidian .cm-templater-command.cm-string,
.cm-s-obsidian .cm-templater-command.cm-string-2 {
color: var(--code-string, #e6db74);
}
.cm-s-obsidian .cm-templater-command.cm-header,
.cm-s-obsidian .cm-templater-command.cm-hr {
color: var(--code-keyword, #da7dae);
}
.cm-s-obsidian .cm-templater-command.cm-link {
color: var(--code-normal, #696d70);
}
.cm-s-obsidian .cm-templater-command.cm-error {
border-bottom: 1px solid #c42412;
}
.CodeMirror-hints {
position: absolute;
z-index: 10;
overflow: hidden;
list-style: none;
margin: 0;
padding: 2px;
-webkit-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
border-radius: 3px;
border: 1px solid silver;
background: white;
font-size: 90%;
font-family: monospace;
max-height: 20em;
overflow-y: auto;
}
.CodeMirror-hint {
margin: 0;
padding: 0 4px;
border-radius: 2px;
white-space: pre;
color: black;
cursor: pointer;
}
li.CodeMirror-hint-active {
background: #08f;
color: white;
}

5
.obsidian/switcher.json vendored Normal file
View file

@ -0,0 +1,5 @@
{
"showExistingOnly": false,
"showAttachments": true,
"showAllFileTypes": true
}

176
.obsidian/workspace.json vendored Normal file
View file

@ -0,0 +1,176 @@
{
"main": {
"id": "5b372e93d410ee3a",
"type": "split",
"children": [
{
"id": "db752cb3aa4acb35",
"type": "tabs",
"children": [
{
"id": "d39143cc55ceac73",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Readme.md",
"mode": "preview",
"source": true
}
}
}
]
}
],
"direction": "vertical"
},
"left": {
"id": "ee98c845c6bccaf5",
"type": "split",
"children": [
{
"id": "941e7fff857ace7c",
"type": "tabs",
"children": [
{
"id": "26de835c41a7b9e7",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical"
}
}
},
{
"id": "67f5f9e56f217bbc",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
}
}
},
{
"id": "5717986d61272d13",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {}
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"right": {
"id": "a4faa311cef524ef",
"type": "split",
"children": [
{
"id": "601d4a954f67eb4d",
"type": "tabs",
"children": [
{
"id": "437d316276d76631",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "Readme.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
}
}
},
{
"id": "9a612f9d0df32e5a",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "Readme.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
}
}
},
{
"id": "155d8c9f01d21091",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true
}
}
},
{
"id": "ef81523b69933e90",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "Readme.md"
}
}
}
]
}
],
"direction": "horizontal",
"width": 300,
"collapsed": true
},
"left-ribbon": {
"hiddenItems": {
"obsidian42-brat:BRAT": true,
"graph:Open graph view": true,
"canvas:Create new canvas": true,
"command-palette:Open command palette": false,
"dashboard-navigator:Open dashboard navigator": false,
"switcher:Open quick switcher": false,
"templater-obsidian:Templater": true,
"qatt:Refresh QATT Tables": true,
"qatt:Refresh Views": true,
"qatt:Log Metrics": true
}
},
"active": "d39143cc55ceac73",
"lastOpenFiles": [
"Vaults/Medical/__Using The Vault.md",
"Vaults/Medical/_Troubleshooting The Vault.md",
"Readme.md",
"__Dashboard.md",
"Vaults/Medical",
"Vaults",
"_templates/Basic Note.md",
"2024-09-29-1427.md",
"Test.md",
".md",
"testing.md",
"test.md",
"Untitled 1",
"Enter File Name.md",
"Untitled 1.md",
"Testing.md",
"__attic",
"2024-09-29 0932.md",
"_templates",
"_attachments"
]
}

3
.obsidian/zk-prefixer.json vendored Normal file
View file

@ -0,0 +1,3 @@
{
"format": "YYYY-MM-DD HHmm"
}

12
Readme.md Normal file
View file

@ -0,0 +1,12 @@
```table-of-contents
title: **Table of Contents**
```
---
## Initial Setup
- [ ] Pin any extra commands to palette
- [ ] Move content of `Vaults/[name]` to main vault folder to convert to a specific vault type
- [ ] Delete `Vaults` folder
- [ ] Delete this file

View file

@ -0,0 +1,135 @@
```table-of-contents
title: **Table of Contents**
```
---
## Overall Layout
- Dashboard as a starting piont
- `Homework` for anything that needs to be accomplished related to healthcare
- `[Upcoming ]Appointments` for tracking info to bring / discuss to appointments
- Move to `Log` post-appointment
- `Log` for tracking notes over time
- Misc health tracking
- Appointment notes, post appointment
- Use date[+time] file name prefixes
- `Test Results` for tracking test data over time
- Use date[+time] file name prefixes
- `Notes` for misc information
- Emergency contacts
- Current med layout
- rx data (glasses, prescription info packets from pharmacy, etc)
- 'one shot' test results
- genetic test results
- mental health assessments that are done 'once'
- `_attachments` for binary files that are linked on notes
- `_attic` for data that is no longer applicable
- treat this as an archive / cold storage
## Workflows
- Notes
- General information capture
- Add to dashboard if you need a 'quick link'
- [Upcoming ]Appointments
- Notes for next appointment
- Appointment / encounter notes
- Move to `Log` once 'complete'
- Homework
- Things 'to do' related to medical / health care
- Move to `Log` once fully complete
- Log
- Tracking by `year/month/YYYY-MM-dd.md` files
- Think "Daily Notes"
- Test Results
- All test results and any data that you may want to search
- See below for layout and further detail
## Definitions
- encounter date
- for tests
- when you visit dr for blood draw
- when you show up for ct/mri scan
- for dr visits: the date of the dr visit
- "when you showed up for [thing] being done/performed"
- order date
- when dr creates order
- result date
- completion / result date from *lab*
## Key Components of Approach
- eobs optional -- more financial than 'health stuff'
- result file names use encounter date
- this is the human form of the varied dates
- human readable note properties (front matter)
- result normal/abnormal tag
- tags for test name/type/etc
- encounter date (the *human* date -- based on dr visit for human search)
## Tags
| Tag | Color |
| --- | ----- |
| #encounter | purple |
| #data | purple|
| #misc | purple|
| #note | purple |
| #research-paper | purple |
| #to-discuss | red |
| #to-research | red |
| #test-result | cyan |
| #appointment | cyan |
| #homework | cyan |
| #log | cyan |
| #complete | yellow |
| #with-others | yellow |
| #other_human | yellow |
| #symptom_name | magenta |
| #test_name | magenta |
| #medical_discipline | green |
| #er | green |
| #mh | green |
| #ph | green |
| #medical_professional_name | green |
| #medical_practice | green |
## Quering Data
- if human search 'fails' -> query csvs accordingly
- queries
- data aggregation
- data viz
- finding stuff thats 'not in' human searches
- include human searches as summary/detail jumps
- self assessments tracking
- via test results
- also added to data csv(s) if ranking how good/bad/etc
- can take csv data from fitness trackers as 'test results'
### Data Layout & Folder Structure
```
test results/
_raw data/
test1.csv
encounter date
order date
result date
result value(s)
normal range / upper & lower bounds (dedicated columns)
any 'flags' noted (semi-colon separated or dedicated columns)
comments (raw text field)
test2.csv
_queries/
data_dive1.md -> queries csv
data_dive2.md -> queries csv
test1/
result1.md -> human readable, linked to pdf stored in attachments
result2.md -> human readable, linked to pdf stored in attachments
test2/
result1.md -> human readable, linked to pdf stored in attachments
result2.md -> human readable, linked to pdf stored in attachments
```

1
__attic/.nomedia Normal file
View file

@ -0,0 +1 @@
/storage/emulated/0/Krita

1
_attachments/.nomedia Normal file
View file

@ -0,0 +1 @@
/storage/emulated/0/Krita

1
_templates/.nomedia Normal file
View file

@ -0,0 +1 @@
/storage/emulated/0/Krita

30
_templates/Basic Note.md Normal file
View file

@ -0,0 +1,30 @@
<%*
let filename = tp.file.title
if ( filename.startsWith("Untitled") ) {
filename = await tp.system.prompt("File name:", tp.date.now("YYYY-MM-DD-HHmm"))
await tp.file.rename(filename)
}
%>---
created_ts: <% tp.date.now("YYYY-MM-DD HH:mm") %>
source: <% await tp.system.prompt("Source") %>
tags:
<%*
let isAddingTags = true;
while (isAddingTags) {
const userTag = await tp.system.prompt("Enter a tag. Leave blank to complete.");
if (userTag) {
-%>
- <% userTag %>
<%*
} else {
isAddingTags = false;
}
}
-%>
---
```table-of-contents
title: **Table of Contents**
```
---