import existing vault
10
.obsidian/app.json
vendored
Normal file
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"autoPairBrackets": false,
|
||||
"autoPairMarkdown": false,
|
||||
"alwaysUpdateLinks": true,
|
||||
"newLinkFormat": "absolute",
|
||||
"useMarkdownLinks": true,
|
||||
"showUnsupportedFiles": true,
|
||||
"defaultViewMode": "preview",
|
||||
"livePreview": false
|
||||
}
|
5
.obsidian/appearance.json
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"interfaceFontFamily": "Atkinson Hyperlegible",
|
||||
"textFontFamily": "Atkinson Hyperlegible",
|
||||
"monospaceFontFamily": "DejaVu Sans Mono"
|
||||
}
|
5
.obsidian/canvas.json
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"snapToObjects": true,
|
||||
"snapToGrid": true,
|
||||
"defaultWheelBehavior": "zoom"
|
||||
}
|
15
.obsidian/command-palette.json
vendored
Normal file
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"pinned": [
|
||||
"dashboard-navigator:navigator",
|
||||
"dashboard-navigator:dashboard",
|
||||
"smart-random-note:open-tagged-random-note",
|
||||
"obsidian-notes-from-template:coloring page",
|
||||
"obsidian-notes-from-template:dot to dot",
|
||||
"obsidian-notes-from-template:drawing",
|
||||
"obsidian-notes-from-template:zia",
|
||||
"obsidian-notes-from-template:zentangle practice",
|
||||
"obsidian-notes-from-template:note",
|
||||
"obsidian-notes-from-template:tangle",
|
||||
"obsidian-notes-from-template:idea - inspiration"
|
||||
]
|
||||
}
|
10
.obsidian/community-plugins.json
vendored
Normal file
|
@ -0,0 +1,10 @@
|
|||
[
|
||||
"colored-tags-wrangler",
|
||||
"obsidian-notes-from-template",
|
||||
"note-gallery",
|
||||
"smart-random-note",
|
||||
"tag-word-cloud",
|
||||
"obsidian-sort-and-permute-lines",
|
||||
"dashboard-navigator",
|
||||
"automatic-table-of-contents"
|
||||
]
|
30
.obsidian/core-plugins-migration.json
vendored
Normal file
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"file-explorer": true,
|
||||
"global-search": true,
|
||||
"switcher": false,
|
||||
"graph": true,
|
||||
"backlink": true,
|
||||
"canvas": true,
|
||||
"outgoing-link": true,
|
||||
"tag-pane": true,
|
||||
"properties": true,
|
||||
"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": true,
|
||||
"random-note": false,
|
||||
"outline": true,
|
||||
"word-count": false,
|
||||
"slides": false,
|
||||
"audio-recorder": false,
|
||||
"workspaces": false,
|
||||
"file-recovery": true,
|
||||
"publish": false,
|
||||
"sync": false
|
||||
}
|
17
.obsidian/core-plugins.json
vendored
Normal file
|
@ -0,0 +1,17 @@
|
|||
[
|
||||
"file-explorer",
|
||||
"global-search",
|
||||
"graph",
|
||||
"backlink",
|
||||
"canvas",
|
||||
"outgoing-link",
|
||||
"tag-pane",
|
||||
"properties",
|
||||
"page-preview",
|
||||
"command-palette",
|
||||
"editor-status",
|
||||
"bookmarks",
|
||||
"zk-prefixer",
|
||||
"outline",
|
||||
"file-recovery"
|
||||
]
|
22
.obsidian/graph.json
vendored
Normal file
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"collapse-filter": true,
|
||||
"search": "",
|
||||
"showTags": false,
|
||||
"showAttachments": false,
|
||||
"hideUnresolved": false,
|
||||
"showOrphans": true,
|
||||
"collapse-color-groups": true,
|
||||
"colorGroups": [],
|
||||
"collapse-display": true,
|
||||
"showArrow": false,
|
||||
"textFadeMultiplier": 0,
|
||||
"nodeSizeMultiplier": 1,
|
||||
"lineSizeMultiplier": 1,
|
||||
"collapse-forces": true,
|
||||
"centerStrength": 0.518713248970312,
|
||||
"repelStrength": 10,
|
||||
"linkStrength": 1,
|
||||
"linkDistance": 250,
|
||||
"scale": 0.13168724279835417,
|
||||
"close": false
|
||||
}
|
291
.obsidian/plugins/automatic-table-of-contents/main.js
vendored
Normal 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,
|
||||
}
|
||||
}
|
10
.obsidian/plugins/automatic-table-of-contents/manifest.json
vendored
Normal 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
|
||||
}
|
160
.obsidian/plugins/colored-tags-wrangler/data.json
vendored
Normal file
|
@ -0,0 +1,160 @@
|
|||
{
|
||||
"TagColors": {
|
||||
"ColorPicker": [
|
||||
{
|
||||
"tag_name": "challenge\nnature\nfoliage\nfauna\nweather\nman-made\ngeometric\nabstract\ncloth\nanatomy\nmusic\narchitecture",
|
||||
"color": {
|
||||
"r": 0,
|
||||
"g": 0,
|
||||
"b": 0
|
||||
},
|
||||
"background_color": {
|
||||
"r": 0,
|
||||
"g": 255,
|
||||
"b": 0
|
||||
},
|
||||
"luminance_offset": 0.15
|
||||
},
|
||||
{
|
||||
"tag_name": "swatch\npalette\ntangle\nnote\nquick-reference",
|
||||
"color": {
|
||||
"r": 0,
|
||||
"g": 0,
|
||||
"b": 0
|
||||
},
|
||||
"background_color": {
|
||||
"r": 0,
|
||||
"g": 255,
|
||||
"b": 255
|
||||
},
|
||||
"luminance_offset": 0.15
|
||||
},
|
||||
{
|
||||
"tag_name": "drawing\ncoloring-page\ndot-to-dot\nkemonine\npractice\nzia\nzentangle-inspired-art",
|
||||
"color": {
|
||||
"r": 255,
|
||||
"g": 255,
|
||||
"b": 255
|
||||
},
|
||||
"background_color": {
|
||||
"r": 161,
|
||||
"g": 87,
|
||||
"b": 234
|
||||
},
|
||||
"luminance_offset": 0.15
|
||||
},
|
||||
{
|
||||
"tag_name": "dislike\ndifficult",
|
||||
"color": {
|
||||
"r": 255,
|
||||
"g": 255,
|
||||
"b": 255
|
||||
},
|
||||
"background_color": {
|
||||
"r": 255,
|
||||
"g": 0,
|
||||
"b": 0
|
||||
},
|
||||
"luminance_offset": 0.15
|
||||
},
|
||||
{
|
||||
"tag_name": "variation\nhas-variation",
|
||||
"color": {
|
||||
"r": 0,
|
||||
"g": 0,
|
||||
"b": 0
|
||||
},
|
||||
"background_color": {
|
||||
"r": 249,
|
||||
"g": 249,
|
||||
"b": 47
|
||||
},
|
||||
"luminance_offset": 0.15
|
||||
},
|
||||
{
|
||||
"tag_name": "to-practice\nin-progress",
|
||||
"color": {
|
||||
"r": 255,
|
||||
"g": 255,
|
||||
"b": 255
|
||||
},
|
||||
"background_color": {
|
||||
"r": 255,
|
||||
"g": 102,
|
||||
"b": 222
|
||||
},
|
||||
"luminance_offset": 0.15
|
||||
},
|
||||
{
|
||||
"tag_name": "idea\ninspiration\nfavorite",
|
||||
"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
|
||||
}
|
||||
}
|
8414
.obsidian/plugins/colored-tags-wrangler/main.js
vendored
Normal file
11
.obsidian/plugins/colored-tags-wrangler/manifest.json
vendored
Normal 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
|
||||
}
|
14
.obsidian/plugins/colored-tags-wrangler/styles.css
vendored
Normal 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;
|
||||
}
|
18
.obsidian/plugins/dashboard-navigator/data.json
vendored
Normal file
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"default_view": 1,
|
||||
"font_size": 16,
|
||||
"selected_table_layout": "dn-tbl-default",
|
||||
"date_format": "YYYY-MM-DD HH:mm",
|
||||
"files_per_page": 20,
|
||||
"num_recent_files": 5,
|
||||
"excluded_ext": "pdf,kra,psd,png,jpg,jpeg,tif,tiff,gif",
|
||||
"excluded_path": "/Resources,/Attic,/Coloring/Source Materials",
|
||||
"color_notes": "#bf48ff",
|
||||
"color_images": "#007fff",
|
||||
"color_canvas": "#ff7f28",
|
||||
"color_videos": "#d34848",
|
||||
"color_audios": "#bfbf00",
|
||||
"color_pdf": "#00a300",
|
||||
"color_other": "#828282",
|
||||
"colored_files": false
|
||||
}
|
1514
.obsidian/plugins/dashboard-navigator/main.js
vendored
Normal file
10
.obsidian/plugins/dashboard-navigator/manifest.json
vendored
Normal 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
|
||||
}
|
679
.obsidian/plugins/dashboard-navigator/styles.css
vendored
Normal 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;
|
||||
}
|
||||
|
||||
}
|
141
.obsidian/plugins/line-arrange/main.js
vendored
Normal file
10
.obsidian/plugins/line-arrange/manifest.json
vendored
Normal 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
|
@ -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() {
|
||||
}
|
||||
};
|
10
.obsidian/plugins/litegallery/manifest.json
vendored
Normal 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
|
@ -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;
|
||||
|
||||
}
|
6555
.obsidian/plugins/multi-column-markdown/main.js
vendored
Normal file
11
.obsidian/plugins/multi-column-markdown/manifest.json
vendored
Normal 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
|
||||
}
|
249
.obsidian/plugins/multi-column-markdown/styles.css
vendored
Normal 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
14
.obsidian/plugins/note-gallery/manifest.json
vendored
Normal 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"
|
||||
}
|
||||
}
|
147
.obsidian/plugins/note-gallery/styles.css
vendored
Normal 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;
|
||||
}
|
14
.obsidian/plugins/obsidian-notes-from-template/data.json
vendored
Normal file
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
"outputDirectory": "",
|
||||
"templateFilename": "{{title}}",
|
||||
"inputFieldList": "",
|
||||
"textReplacementTemplates": [
|
||||
""
|
||||
],
|
||||
"templateDirectory": "_Templates",
|
||||
"replaceSelection": "always",
|
||||
"createOpen": "open-tab",
|
||||
"inputSplit": "",
|
||||
"inputSuggestions": true,
|
||||
"config": "[]"
|
||||
}
|
9023
.obsidian/plugins/obsidian-notes-from-template/main.js
vendored
Normal file
10
.obsidian/plugins/obsidian-notes-from-template/manifest.json
vendored
Normal 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
|
||||
}
|
159
.obsidian/plugins/obsidian-notes-from-template/styles.css
vendored
Normal 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;
|
||||
*/
|
||||
}
|
392
.obsidian/plugins/obsidian-sort-and-permute-lines/main.js
vendored
Normal file
10
.obsidian/plugins/obsidian-sort-and-permute-lines/manifest.json
vendored
Normal 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
|
||||
}
|
813
.obsidian/plugins/smart-random-note/main.js
vendored
Normal file
10
.obsidian/plugins/smart-random-note/manifest.json
vendored
Normal 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
|
||||
}
|
9
.obsidian/plugins/tag-page-md/data.json
vendored
Normal file
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"tagPageDir": "_Tags/",
|
||||
"frontmatterQueryProperty": "tag-page-query",
|
||||
"nestedSeparator": "_",
|
||||
"bulletedSubItems": true,
|
||||
"includeLines": true,
|
||||
"autoRefresh": true,
|
||||
"fullLinkName": false
|
||||
}
|
525
.obsidian/plugins/tag-page-md/main.js
vendored
Normal 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();
|
||||
})
|
||||
);
|
||||
}
|
||||
};
|
11
.obsidian/plugins/tag-page-md/manifest.json
vendored
Normal 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
|
||||
}
|
29
.obsidian/plugins/tag-page-md/styles.css
vendored
Normal 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
10
.obsidian/plugins/tag-word-cloud/manifest.json
vendored
Normal 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
|
||||
}
|
3
.obsidian/plugins/tag-word-cloud/styles.css
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
p.cloud-error {
|
||||
color: red;
|
||||
}
|
143
.obsidian/workspace-mobile.json
vendored
Normal file
|
@ -0,0 +1,143 @@
|
|||
{
|
||||
"main": {
|
||||
"id": "fa20fb3b2c324baf",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "fd156c526e59f4c0",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "9fab42d2d7ba44d4",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "empty",
|
||||
"state": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"direction": "vertical"
|
||||
},
|
||||
"left": {
|
||||
"id": "39491b49fa257cb4",
|
||||
"type": "mobile-drawer",
|
||||
"children": [
|
||||
{
|
||||
"id": "abe98509ca910665",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "file-explorer",
|
||||
"state": {
|
||||
"sortOrder": "alphabetical"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "4218fe4bd72e2a58",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "search",
|
||||
"state": {
|
||||
"query": "",
|
||||
"matchingCase": false,
|
||||
"explainSearch": false,
|
||||
"collapseAll": false,
|
||||
"extraContext": false,
|
||||
"sortOrder": "alphabetical"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "4c5521ec9015b531",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "tag",
|
||||
"state": {
|
||||
"sortOrder": "frequency",
|
||||
"useHierarchy": true
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "bdda4dc9abd42532",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "all-properties",
|
||||
"state": {
|
||||
"sortOrder": "frequency",
|
||||
"showSearch": false,
|
||||
"searchQuery": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "7e1918e4525c27c7",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "bookmarks",
|
||||
"state": {}
|
||||
}
|
||||
}
|
||||
],
|
||||
"currentTab": 0
|
||||
},
|
||||
"right": {
|
||||
"id": "8acc3bd09c0a741e",
|
||||
"type": "mobile-drawer",
|
||||
"children": [
|
||||
{
|
||||
"id": "8e93911999a00854",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "backlink",
|
||||
"state": {
|
||||
"collapseAll": false,
|
||||
"extraContext": false,
|
||||
"sortOrder": "alphabetical",
|
||||
"showSearch": false,
|
||||
"searchQuery": "",
|
||||
"backlinkCollapsed": false,
|
||||
"unlinkedCollapsed": true
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "a977893d6f0b2fe4",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "outgoing-link",
|
||||
"state": {
|
||||
"linksCollapsed": false,
|
||||
"unlinkedCollapsed": true
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "db51f021e9e4be86",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "outline",
|
||||
"state": {}
|
||||
}
|
||||
}
|
||||
],
|
||||
"currentTab": 0
|
||||
},
|
||||
"left-ribbon": {
|
||||
"hiddenItems": {
|
||||
"dashboard-navigator:Open dashboard navigator": false,
|
||||
"graph:Open graph view": true,
|
||||
"canvas:Create new canvas": true,
|
||||
"command-palette:Open command palette": false,
|
||||
"zk-prefixer:Create new unique note": true,
|
||||
"smart-random-note:Open Random Note from Search": true
|
||||
}
|
||||
},
|
||||
"active": "9fab42d2d7ba44d4",
|
||||
"lastOpenFiles": [
|
||||
"_Gallery - Favorites.md",
|
||||
"__Readme.md"
|
||||
]
|
||||
}
|
211
.obsidian/workspace.json
vendored
Normal file
|
@ -0,0 +1,211 @@
|
|||
{
|
||||
"main": {
|
||||
"id": "f620e4ce95bc793a",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "34e87212fb9124b5",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "25dd4cdad6a2b5a9",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "markdown",
|
||||
"state": {
|
||||
"file": "__Dashboard.md",
|
||||
"mode": "preview",
|
||||
"source": true
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"direction": "vertical"
|
||||
},
|
||||
"left": {
|
||||
"id": "57fbdec88cb6d760",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "f26e49a2aa5a6b78",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "7ee887658e4391b7",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "file-explorer",
|
||||
"state": {
|
||||
"sortOrder": "alphabetical"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "7195cc8670fad87d",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "search",
|
||||
"state": {
|
||||
"query": "",
|
||||
"matchingCase": false,
|
||||
"explainSearch": false,
|
||||
"collapseAll": false,
|
||||
"extraContext": false,
|
||||
"sortOrder": "alphabetical"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "760adce337333c8d",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "bookmarks",
|
||||
"state": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"direction": "horizontal",
|
||||
"width": 316.5
|
||||
},
|
||||
"right": {
|
||||
"id": "e829c32f694f4d41",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "0ec578d6140a2277",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "c67d2b70a019fa7a",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "backlink",
|
||||
"state": {
|
||||
"file": "__Dashboard.md",
|
||||
"collapseAll": true,
|
||||
"extraContext": false,
|
||||
"sortOrder": "alphabetical",
|
||||
"showSearch": false,
|
||||
"searchQuery": "",
|
||||
"backlinkCollapsed": false,
|
||||
"unlinkedCollapsed": true
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "b2e5f94897dd7d29",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "outgoing-link",
|
||||
"state": {
|
||||
"file": "__Dashboard.md",
|
||||
"linksCollapsed": false,
|
||||
"unlinkedCollapsed": true
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "c0efa286fff904b9",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "tag",
|
||||
"state": {
|
||||
"sortOrder": "frequency",
|
||||
"useHierarchy": true
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "5e1f1a4bddcefc42",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "outline",
|
||||
"state": {
|
||||
"file": "__Dashboard.md"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "e0176bac443fddc0",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "all-properties",
|
||||
"state": {
|
||||
"sortOrder": "frequency",
|
||||
"showSearch": false,
|
||||
"searchQuery": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"currentTab": 3
|
||||
}
|
||||
],
|
||||
"direction": "horizontal",
|
||||
"width": 300,
|
||||
"collapsed": true
|
||||
},
|
||||
"left-ribbon": {
|
||||
"hiddenItems": {
|
||||
"graph:Open graph view": true,
|
||||
"canvas:Create new canvas": true,
|
||||
"zk-prefixer:Create new unique note": true,
|
||||
"command-palette:Open command palette": false,
|
||||
"smart-random-note:Open Random Note from Search": false,
|
||||
"dashboard-navigator:Open dashboard navigator": false
|
||||
}
|
||||
},
|
||||
"active": "25dd4cdad6a2b5a9",
|
||||
"lastOpenFiles": [
|
||||
"Notes/Krita Quick Reference.md",
|
||||
"Notes/attachments/Imagepipe_360.jpg",
|
||||
"Notes/attachments/Imagepipe_359.jpg",
|
||||
"Notes/attachments/Imagepipe_361.jpg",
|
||||
"Notes/Dot to Dot Quick Reference.md",
|
||||
"Notes/Obtaining Source Material.md",
|
||||
"Notes/attachments/2024-09-13_17-00_1.png",
|
||||
"Notes/attachments/2024-09-13_17-00.png",
|
||||
"Notes/attachments/2024-09-13_16-58.png",
|
||||
"Notes/Digital coloring and drawing.md",
|
||||
"Notes/Convert photo to coloring page.md",
|
||||
"Notes/Convert PDF Coloring Pages.md",
|
||||
"Notes/Coloring Page Quick Reference.md",
|
||||
"Notes/attachments/2024-09-13_16-56.png",
|
||||
"Notes/attachments/2024-09-13_16-56_1.png",
|
||||
"Notes/Color Palette Generator.md",
|
||||
"Notes/Android Drawing Apps.md",
|
||||
"__Dashboard.md",
|
||||
"_Gallery - Favorites.md",
|
||||
"Notes/Obsidian ToC.md",
|
||||
"Notes/Extract Images From PDF.md",
|
||||
"kritarc",
|
||||
"Resources/sessions/Zentangle.0040.ksn",
|
||||
"Resources/sessions/Coloring.0058.ksn",
|
||||
"Resources/sessions/Coloring.0057.ksn",
|
||||
"Resources/sessions/Coloring.0056.ksn",
|
||||
"Resources/sessions/Coloring.0055.ksn",
|
||||
"Resources/input/photoshopcompatible.profile",
|
||||
"Resources/input/painttoolsaicompatible.profile",
|
||||
"Resources/input/kritadefault.profile",
|
||||
"Resources/input/clipstudiopaintcompatible.profile",
|
||||
"Dot to Dot/_Gallery - Dot to Dot.md",
|
||||
"Dot to Dot/In Progress/moon-base.md",
|
||||
"Dot to Dot/In Progress/squirrel.md",
|
||||
"Dot to Dot/In Progress/polar-bear.md",
|
||||
"Dot to Dot/In Progress/penguin.md",
|
||||
"Dot to Dot/In Progress/haunted-house.md",
|
||||
"Dot to Dot/In Progress/bulldozer.md",
|
||||
"Dot to Dot/In Progress/_template.md",
|
||||
"Dot to Dot/In Progress/_template - Copy (5).md",
|
||||
"Dot to Dot/In Progress/_template - Copy (4).md",
|
||||
"Dot to Dot/In Progress/_template - Copy (3).md",
|
||||
"Dot to Dot/In Progress/_template - Copy (2).md",
|
||||
"Dot to Dot/In Progress/_template - Copy.md",
|
||||
"Dot to Dot/Source Materials/TimsPrintables/bulldozer-dot-to-dot_2_thumb.png",
|
||||
"Dot to Dot/Source Materials/TimsPrintables/bulldozer-dot-to-dot_1_thumb.png"
|
||||
]
|
||||
}
|
3
.obsidian/zk-prefixer.json
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"format": "YYYY-MM-DD-HHmm"
|
||||
}
|
1
Coloring/.nomedia
Normal file
|
@ -0,0 +1 @@
|
|||
/storage/emulated/0/Krita
|
1
Coloring/Complete/.nomedia
Normal file
|
@ -0,0 +1 @@
|
|||
/storage/emulated/0/Krita
|
1
Coloring/Complete/attachments/.nomedia
Normal file
|
@ -0,0 +1 @@
|
|||
/storage/emulated/0/Krita
|
1
Coloring/In Progress/.nomedia
Normal file
|
@ -0,0 +1 @@
|
|||
/storage/emulated/0/Krita
|
1
Coloring/Prepped/.nomedia
Normal file
|
@ -0,0 +1 @@
|
|||
/storage/emulated/0/Krita
|
1
Coloring/Source Materials/.nomedia
Normal file
|
@ -0,0 +1 @@
|
|||
/storage/emulated/0/Krita
|
21
Coloring/_Gallery - Coloring.md
Normal file
|
@ -0,0 +1,21 @@
|
|||
|
||||
~~~~note-gallery
|
||||
query: 'path: Coloring/Complete/ -path: Coloring/Complete/attachments/ tag:#coloring-page'
|
||||
recursive: true
|
||||
sort: desc
|
||||
sortBy: name
|
||||
showTitle: true
|
||||
breakpoints:
|
||||
default: 2
|
||||
100000: 2
|
||||
3500: 2
|
||||
3100: 2
|
||||
2700: 2
|
||||
2300: 2
|
||||
1900: 2
|
||||
1500: 2
|
||||
1000: 2
|
||||
700: 2
|
||||
400: 2
|
||||
200: 2
|
||||
~~~~
|
1
Dot to Dot/.nomedia
Normal file
|
@ -0,0 +1 @@
|
|||
/storage/emulated/0/Krita
|
1
Dot to Dot/Complete/.nomedia
Normal file
|
@ -0,0 +1 @@
|
|||
/storage/emulated/0/Krita
|
1
Dot to Dot/Complete/attachments/.nomedia
Normal file
|
@ -0,0 +1 @@
|
|||
/storage/emulated/0/Krita
|
1
Dot to Dot/In Progress/.nomedia
Normal file
|
@ -0,0 +1 @@
|
|||
/storage/emulated/0/Krita
|
1
Dot to Dot/Prepped/.nomedia
Normal file
|
@ -0,0 +1 @@
|
|||
/storage/emulated/0/Krita
|
1
Dot to Dot/Source Materials/.nomedia
Normal file
|
@ -0,0 +1 @@
|
|||
/storage/emulated/0/Krita
|
21
Dot to Dot/_Gallery - Dot to Dot.md
Normal file
|
@ -0,0 +1,21 @@
|
|||
|
||||
~~~~note-gallery
|
||||
query: 'path: Dot to Dot/Complete/ -path: Dot to Dot/Complete/attachments/ tag:#dot-to-dot'
|
||||
recursive: true
|
||||
sort: desc
|
||||
sortBy: name
|
||||
showTitle: true
|
||||
breakpoints:
|
||||
default: 2
|
||||
100000: 2
|
||||
3500: 2
|
||||
3100: 2
|
||||
2700: 2
|
||||
2300: 2
|
||||
1900: 2
|
||||
1500: 2
|
||||
1000: 2
|
||||
700: 2
|
||||
400: 2
|
||||
200: 2
|
||||
~~~~
|
1
Drawing/.nomedia
Normal file
|
@ -0,0 +1 @@
|
|||
/storage/emulated/0/Krita
|
1
Drawing/Complete/.nomedia
Normal file
|
@ -0,0 +1 @@
|
|||
/storage/emulated/0/Krita
|
1
Drawing/Complete/attachments/.nomedia
Normal file
|
@ -0,0 +1 @@
|
|||
/storage/emulated/0/Krita
|
1
Drawing/In Progress/.nomedia
Normal file
|
@ -0,0 +1 @@
|
|||
/storage/emulated/0/Krita
|
21
Drawing/_Gallery - Drawing.md
Normal file
|
@ -0,0 +1,21 @@
|
|||
|
||||
~~~~note-gallery
|
||||
query: 'path: Drawing/Complete/ -path: Drawing/Complete/attachments/ tag:#drawing'
|
||||
recursive: true
|
||||
sort: desc
|
||||
sortBy: name
|
||||
showTitle: true
|
||||
breakpoints:
|
||||
default: 2
|
||||
100000: 2
|
||||
3500: 2
|
||||
3100: 2
|
||||
2700: 2
|
||||
2300: 2
|
||||
1900: 2
|
||||
1500: 2
|
||||
1000: 2
|
||||
700: 2
|
||||
400: 2
|
||||
200: 2
|
||||
~~~~
|
1
Ideas - Inspiration/.nomedia
Normal file
|
@ -0,0 +1 @@
|
|||
/storage/emulated/0/Krita
|
22
Ideas - Inspiration/_Gallery - Ideas Inspiration.md
Normal file
|
@ -0,0 +1,22 @@
|
|||
|
||||
~~~~note-gallery
|
||||
debugQuery: true
|
||||
query: 'path: Ideas - Inspiration/ -path: Ideas - Inspiration/attachments/'
|
||||
recursive: true
|
||||
sort: asc
|
||||
sortBy: name
|
||||
showTitle: true
|
||||
breakpoints:
|
||||
default: 2
|
||||
100000: 2
|
||||
3500: 2
|
||||
3100: 2
|
||||
2700: 2
|
||||
2300: 2
|
||||
1900: 2
|
||||
1500: 2
|
||||
1000: 2
|
||||
700: 2
|
||||
400: 2
|
||||
200: 2
|
||||
~~~~
|
22
Ideas - Inspiration/_Gallery - Ideas.md
Normal file
|
@ -0,0 +1,22 @@
|
|||
|
||||
~~~~note-gallery
|
||||
debugQuery: true
|
||||
query: 'path: Ideas - Inspiration/ -path: Ideas - Inspiration/attachments/ tag:#idea'
|
||||
recursive: true
|
||||
sort: asc
|
||||
sortBy: name
|
||||
showTitle: true
|
||||
breakpoints:
|
||||
default: 2
|
||||
100000: 2
|
||||
3500: 2
|
||||
3100: 2
|
||||
2700: 2
|
||||
2300: 2
|
||||
1900: 2
|
||||
1500: 2
|
||||
1000: 2
|
||||
700: 2
|
||||
400: 2
|
||||
200: 2
|
||||
~~~~
|
22
Ideas - Inspiration/_Gallery - Inspiration.md
Normal file
|
@ -0,0 +1,22 @@
|
|||
|
||||
~~~~note-gallery
|
||||
debugQuery: true
|
||||
query: 'path: Ideas - Inspiration/ -path: Ideas - Inspiration/attachments/ tag:#inspiration'
|
||||
recursive: true
|
||||
sort: asc
|
||||
sortBy: name
|
||||
showTitle: true
|
||||
breakpoints:
|
||||
default: 2
|
||||
100000: 2
|
||||
3500: 2
|
||||
3100: 2
|
||||
2700: 2
|
||||
2300: 2
|
||||
1900: 2
|
||||
1500: 2
|
||||
1000: 2
|
||||
700: 2
|
||||
400: 2
|
||||
200: 2
|
||||
~~~~
|
1
Ideas - Inspiration/attachments/.nomedia
Normal file
|
@ -0,0 +1 @@
|
|||
/storage/emulated/0/Krita
|
1
Notes/.nomedia
Normal file
|
@ -0,0 +1 @@
|
|||
/storage/emulated/0/Krita
|
17
Notes/Android Drawing Apps.md
Normal file
|
@ -0,0 +1,17 @@
|
|||
---
|
||||
tags:
|
||||
- note
|
||||
created_at: 2024-09-11 1749-0400
|
||||
source: "N/A"
|
||||
|
||||
---
|
||||
- [Krita](https://play.google.com/store/apps/details?id=org.krita)
|
||||
- [SketchPad](https://play.google.com/store/apps/details?id=com.kanishka_developer.SketchPad)
|
||||
- Great for quick sketches
|
||||
- Probably OK for doodling
|
||||
- Probably OK for 'quick and dirty' Zentangle
|
||||
- [Saber](https://saber.adil.hanney.org/)
|
||||
- Good for PDF
|
||||
- Has decent grids
|
||||
- Has whiteboard
|
||||
- More 'document markup' and 'handwritten notes' than art
|
12
Notes/Color Palette Generator.md
Normal file
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
tags:
|
||||
- note
|
||||
- palette
|
||||
created_at: 2024-09-11 1746-0400
|
||||
source: "N/A"
|
||||
---
|
||||
|
||||
To generate color palettes, the below can be helpful. Especially for coloring pages.
|
||||
|
||||
- https://coolors.co/
|
||||
- https://play.google.com/store/apps/details?id=co.coolors.android
|
9
Notes/Color Wheel.md
Normal file
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
tags:
|
||||
- note
|
||||
- quick-reference
|
||||
source: "Unknown"
|
||||
|
||||
---
|
||||
|
||||
![](Notes/attachments/_Color%20Wheel.jpg)
|
39
Notes/Coloring Page Quick Reference.md
Normal file
|
@ -0,0 +1,39 @@
|
|||
---
|
||||
tags:
|
||||
- note
|
||||
- quick-reference
|
||||
created_at: 2024-09-12 1012-0400
|
||||
source: N/A
|
||||
|
||||
---
|
||||
|
||||
## Create Digital Document
|
||||
|
||||
- Import image as a layer
|
||||
- Rename layer `Page`
|
||||
- Set layer `Blending mode` to `Darken`
|
||||
- Create `Fill Layer` with `White` as the background color
|
||||
- Rename layer `Background`
|
||||
- Create `Coloring` layer
|
||||
- Create `Palette` layer
|
||||
- Write name of palette to be used on layer (freehand, no typing)
|
||||
- Optionally import/paste a screen shot from `Coloors`
|
||||
- Optionally import/paste a copic sketch sample image
|
||||
- Rearrange layers
|
||||
- From top to bottom
|
||||
- `Page`
|
||||
- `Coloring`
|
||||
- `Palette`
|
||||
- `Background`
|
||||
- Lock `Page` layer
|
||||
- Lock `Background` layer
|
||||
- If palette was chosen, lock `Palette` layer
|
||||
- Select `Coloring` layer
|
||||
- Save
|
||||
- Begin coloring
|
||||
|
||||
## Screenshots
|
||||
|
||||
![](Notes/attachments/2024-09-13_16-56.png)
|
||||
|
||||
![](Notes/attachments/2024-09-13_16-56_1.png)
|
30
Notes/Convert PDF Coloring Pages.md
Normal file
|
@ -0,0 +1,30 @@
|
|||
---
|
||||
tags:
|
||||
- note
|
||||
created_at: "2023-02-17"
|
||||
source: "KemoNine Blog"
|
||||
---
|
||||
|
||||
If you have access to `imagemagick` you can quickly convert a PDF coloring page(s) to grayscale PNG using the below procedure and notes.
|
||||
|
||||
|
||||
## Notes {#notes}
|
||||
|
||||
- The `pdfimages` command below will get you a dpi listing for each page in the PDF that has an image, use that value instead of `300` in the below, **if** it is present.
|
||||
- The `-type Grayscale` parameter can be removed if you need color output.
|
||||
- If the below fails Adobe has an online converter at: https://www.adobe.com/acrobat/online/convert-pdf.html
|
||||
|
||||
|
||||
## Conversion {#conversion}
|
||||
|
||||
1. Install `imagemagick`
|
||||
2. `pdfimages -list shipspage1.pdf`
|
||||
3. ``for file in `ls *.pdf`; do convert -density 300 -type Grayscale ${file} ${file}.png; done``
|
||||
|
||||
|
||||
## Resources {#resources}
|
||||
|
||||
- <https://stackoverflow.com/questions/50006770/how-to-get-dpi-of-a-pdf-file>
|
||||
- <https://jdhao.github.io/2019/11/20/convert_pdf_to_image_imagemagick/>
|
||||
- <https://stackoverflow.com/questions/2869908/convert-pdf-to-png-using-imagemagick>
|
||||
- <https://legacy.imagemagick.org/discourse-server/viewtopic.php?t=11279>
|
75
Notes/Convert photo to coloring page.md
Normal file
|
@ -0,0 +1,75 @@
|
|||
---
|
||||
tags:
|
||||
- note
|
||||
created_at: "2023-02-27"
|
||||
source: "KemoNine Blog"
|
||||
---
|
||||
|
||||
## Sounds Cool, Is Tricky {#sounds-cool-is-tricky}
|
||||
|
||||
Before getting into how to convert a photo into a coloring page, I'd like to point out a fundamental concern: this is _not_ easy and a mild PITA. It also deserves some manual cleanup to get best results. I recommend doing this only if you have time to try the process and focus on some of the subtleties while also converting a ton of photos.
|
||||
|
||||
Like most forms of art, this one takes some practice to get desired results. I got disheartened early on but after running the process on tens of images I started getting a feel for what source images worked for conversion and as a more 'realistic' coloring page.
|
||||
|
||||
|
||||
## Example Gallery {#example-gallery}
|
||||
|
||||
If you'd like to see a number of my photographs run through conversion to coloring page, I've published a number of pages at <https://www.kemonine.photography/Coloring-Pages/n-cRk9Fj>
|
||||
|
||||
|
||||
## CRITICAL {#critical}
|
||||
|
||||
|
||||
### Please note {#please-note}
|
||||
|
||||
The following processes and procedures are a way to run the photo to coloring page conversion with [Krita](https://krita.org/). That said, the process should be generally the same in other image editing programs.
|
||||
|
||||
|
||||
## TLDR {#tldr}
|
||||
|
||||
This is the cheat sheet check list I use when converting pages. I recommend skipping this section for the full procedure in the following section(s) if you are new to this process.
|
||||
|
||||
1. Open image in Krita
|
||||
2. Duplicate layer (ctrl - J)
|
||||
3. Desaturate (average) (ctrl - shift - U)
|
||||
4. Duplicate (ctrl - J)
|
||||
5. Invert (ctrl - I)
|
||||
6. Color dodge for layers
|
||||
7. Gaussian blur
|
||||
8. Levels (ctrl - L)
|
||||
9. Merge layers (ctrl - E)
|
||||
|
||||
|
||||
## Conversion Process {#conversion-process}
|
||||
|
||||
When I went digging for information I found plenty of guides for image editors and drawing apps that were _not_ Krita. The guides I found were for very common photo editing programs and apps but not for Krita. Thankfully every guide had a pretty consistent 'process' for converting photos to coloring pages.
|
||||
|
||||
As I was working through the info I did manage to find one video on performing the conversion in Krita. The video is up on [YouTube here](https://www.youtube.com/watch?v=lgj0WPlwMGI) and breaks down the process. I watched it on mute so I cannot speak to the commentary but the video walk through shows what you need to do within Krita quite nicely.
|
||||
|
||||
Rather than force folk, or my future self, to watch an almost 8 minute video that could be taken down, I've replicated the process the artist used as an ordered list below. The example gallery linked above used this conversion process.
|
||||
|
||||
1. Open photo as new image
|
||||
2. Duplicate layer
|
||||
3. Select new layer
|
||||
4. Filter -> Adjust -> Desaturate
|
||||
- Destauration method: average
|
||||
5. Duplicate desaturated layer
|
||||
6. Select new layer
|
||||
7. Filter -> Adjust -> Invert
|
||||
8. Layers docker -> Change from 'Normal' to 'Color Dodge'
|
||||
9. Filter -> Blur -> Gaussian blur...
|
||||
- Increase both sliders until it looks reasonable as a coloring page
|
||||
10. Filter -> Adjust -> Levels
|
||||
- Adjust top slider middle arrow handle
|
||||
- Adjust bottom slider right arrow handle
|
||||
- Adjust remaining sliders, if desired, until it looks like a reasonable coloring page
|
||||
11. Group all but background layer in layers docker
|
||||
12. Duplicate group
|
||||
13. Name original group 'archives', lock, hide
|
||||
14. Merge the copied group layers together
|
||||
15. Rename the merged group to something meaningful
|
||||
16. Select group
|
||||
17. Filter -> Colors -> Color to alpha
|
||||
- Select white from color picker / sampler if not already selected
|
||||
18. Use pencil brush + eraser to cleanup image
|
||||
- Optional
|
71
Notes/Copic Palette Previews.md
Normal file
|
@ -0,0 +1,71 @@
|
|||
---
|
||||
tags:
|
||||
- note
|
||||
- quick-reference
|
||||
- palette
|
||||
- swatch
|
||||
created_at: "2024-09-11"
|
||||
source: "Unknown"
|
||||
---
|
||||
|
||||
![COPIC_Architecture12](Notes/attachments/Copic%20Palette%20Previews/COPIC_Architecture12.jpg)
|
||||
|
||||
![COPIC_Architecture24](Notes/attachments/Copic%20Palette%20Previews/COPIC_Architecture24.jpg)
|
||||
|
||||
![COPIC_Autumn12](Notes/attachments/Copic%20Palette%20Previews/COPIC_Autumn12.jpg)
|
||||
|
||||
![COPIC_Basic12](Notes/attachments/Copic%20Palette%20Previews/COPIC_Basic12.jpg)
|
||||
|
||||
![COPIC_BoldPrimaries6](Notes/attachments/Copic%20Palette%20Previews/COPIC_BoldPrimaries6.jpg)
|
||||
|
||||
![COPIC_BrightColours12](Notes/attachments/Copic%20Palette%20Previews/COPIC_BrightColours12.jpg)
|
||||
|
||||
![COPIC_Brights6](Notes/attachments/Copic%20Palette%20Previews/COPIC_Brights6.jpg)
|
||||
|
||||
![COPIC_ComicIllustration24](Notes/attachments/Copic%20Palette%20Previews/COPIC_ComicIllustration24.jpg)
|
||||
|
||||
![COPIC_CoolGray13](Notes/attachments/Copic%20Palette%20Previews/COPIC_CoolGray13.jpg)
|
||||
|
||||
![COPIC_EarthyElements12](Notes/attachments/Copic%20Palette%20Previews/COPIC_EarthyElements12.jpg)
|
||||
|
||||
![COPIC_Environment12](Notes/attachments/Copic%20Palette%20Previews/COPIC_Environment12.jpg)
|
||||
|
||||
![COPIC_FashionDesign24](Notes/attachments/Copic%20Palette%20Previews/COPIC_FashionDesign24.jpg)
|
||||
|
||||
![COPIC_FigureDrawing24](Notes/attachments/Copic%20Palette%20Previews/COPIC_FigureDrawing24.jpg)
|
||||
|
||||
![COPIC_JewelTones6](Notes/attachments/Copic%20Palette%20Previews/COPIC_JewelTones6.jpg)
|
||||
|
||||
![COPIC_LandscapeArchitecture24](Notes/attachments/Copic%20Palette%20Previews/COPIC_LandscapeArchitecture24.jpg)
|
||||
|
||||
![COPIC_Manga24A](Notes/attachments/Copic%20Palette%20Previews/COPIC_Manga24A.jpg)
|
||||
|
||||
![COPIC_Manga24B](Notes/attachments/Copic%20Palette%20Previews/COPIC_Manga24B.jpg)
|
||||
|
||||
![COPIC_Nature12](Notes/attachments/Copic%20Palette%20Previews/COPIC_Nature12.jpg)
|
||||
|
||||
![COPIC_NeutralGray12](Notes/attachments/Copic%20Palette%20Previews/COPIC_NeutralGray12.jpg)
|
||||
|
||||
![COPIC_PalePastels6](Notes/attachments/Copic%20Palette%20Previews/COPIC_PalePastels6.jpg)
|
||||
|
||||
![COPIC_Pastels6](Notes/attachments/Copic%20Palette%20Previews/COPIC_Pastels6.jpg)
|
||||
|
||||
![COPIC_Primary6](Notes/attachments/Copic%20Palette%20Previews/COPIC_Primary6.jpg)
|
||||
|
||||
![COPIC_ProductDesign24](Notes/attachments/Copic%20Palette%20Previews/COPIC_ProductDesign24.jpg)
|
||||
|
||||
![COPIC_Sea6](Notes/attachments/Copic%20Palette%20Previews/COPIC_Sea6.jpg)
|
||||
|
||||
![COPIC_Skin6](Notes/attachments/Copic%20Palette%20Previews/COPIC_Skin6.jpg)
|
||||
|
||||
![COPIC_SkinTones12](Notes/attachments/Copic%20Palette%20Previews/COPIC_SkinTones12.jpg)
|
||||
|
||||
![COPIC_Spring12](Notes/attachments/Copic%20Palette%20Previews/COPIC_Spring12.jpg)
|
||||
|
||||
![COPIC_Summer12](Notes/attachments/Copic%20Palette%20Previews/COPIC_Summer12.jpg)
|
||||
|
||||
![COPIC_TonerGray12](Notes/attachments/Copic%20Palette%20Previews/COPIC_TonerGray12.jpg)
|
||||
|
||||
![COPIC_WarmGray13](Notes/attachments/Copic%20Palette%20Previews/COPIC_WarmGray13.jpg)
|
||||
|
||||
![COPIC_Winter12](Notes/attachments/Copic%20Palette%20Previews/COPIC_Winter12.jpg)
|
8
Notes/Crayola Color Palette.md
Normal file
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
tags:
|
||||
- note
|
||||
- quick-reference
|
||||
source: "Unknown"
|
||||
---
|
||||
|
||||
![](Notes/attachments/_Crayola.jpg)
|
294
Notes/Digital coloring and drawing.md
Normal file
|
@ -0,0 +1,294 @@
|
|||
---
|
||||
tags:
|
||||
- note
|
||||
- palette
|
||||
- swatch
|
||||
created_at: "2023-02-28"
|
||||
source: "Unknown"
|
||||
---
|
||||
|
||||
![](Notes/attachments/DSC02900-3.jpg)
|
||||
|
||||
## Changelog {#changelog}
|
||||
|
||||
2023-04-05
|
||||
: Tune Krita S Pen config
|
||||
|
||||
2022-12-11
|
||||
: Added information on how I use Krita (Sketchbook is still VALID)
|
||||
|
||||
2022-11-13
|
||||
: Make tags more consistent with updated site tags
|
||||
|
||||
|
||||
## Analog? {#analog}
|
||||
|
||||
~~Yes, I tagged this post `Analog` despite the topic being digital.~~ [Edited 2022-11-13 to make tags more consistent with updated site tags] I've spent a long time staring at my sketchbook and wanting to draw and color but... my desk situation is such that I'd have to spend at least 5 minutes getting it cleared enough for drawing/coloring, then I'd have to put it back the way it was so I could type when I was done, I'd have to turn on the light at night (I like dark).
|
||||
|
||||
You see where this goes.
|
||||
|
||||
I've given up on Analog at this point for my coloring and drawing desires. My current living space isn't setup for it and the annoyance of re-configuration outweighs the desire most days.
|
||||
|
||||
|
||||
## Digital? {#digital}
|
||||
|
||||
Given I gave up on Analog coloring and drawing I figured it was time to really commit to figuring out the mobile landscape for coloring and drawing. Note I intentionally avoided making desktop or laptop computers a requirement for my setup. I want to have this whenever/wherever in it's simplest form.
|
||||
|
||||
After some research into digital coloring and drawing I nearly walked away completely. Digital is a messy land of choices. Much like Analog there are a ton of options and you can go wrong, you can go right and everywhere in between.
|
||||
|
||||
Unlike Analog, there is no 'the humble pencil and paper' to fall back upon if you get overwhelmed. Thankfully I'm a stubborn human at times and found a good blend of options that get close to pencil/paper for simplicity and utility.
|
||||
|
||||
|
||||
## What {#what}
|
||||
|
||||
The below will outline what I've managed to put togther for myself that works well, gets out of my way (read: simple) and works with my finger or a 'real stylus'. Basically the equivalent of pencil/paper that can get fancy if you desire. However, much like pencil/paper you don't need to dive deep to succeed.
|
||||
|
||||
The intent here isn't to become an artist using an iDevice living the Coffee Shop Life. It's to make coloring and drawing like Zentangle [(link)](https://zentangle.com) easy and more accessible. Ideally in a way that scales to match the moments desires.
|
||||
|
||||
See the `Complete Coloring Page` screen shot for a complete coloring page of mine.
|
||||
|
||||
|
||||
## Requirements {#requirements}
|
||||
|
||||
The only hard requirement for this setup is Sketchbook [(link)](https://www.sketchbook.com/) from your preferred app store. The app itself is a simple looking drawing app (see screenshots below) but it has a lot of standard tools like image import, multiple brushes, full color palatte, eye dropper, layers and more. The website has a good FAQ and breakdown of features. I'll leave the devs to showcase the apps features.
|
||||
|
||||
This app was the key to unlocking the setup. It's available on iOS and Android for both phones and tablets. The interface is clean and simple despite having all kinds of tools available. Don't let the feature list overwhelm you, they are wholly optional and will stay out of your way for the most part.
|
||||
|
||||
For more detail on how I use the app, see the `Approach` section below.
|
||||
|
||||
|
||||
## Nice To Have {#nice-to-have}
|
||||
|
||||
A stylus is a nice to have for this setup. I myself use a Surface Stylus with a Surface Duo primarily but also use an Adonit Dash with my phone when I don't have my Duo handy. Note this is not a requirement but can make/break the feel of the setup for some.
|
||||
|
||||
There are basically 3 options here:
|
||||
|
||||
|
||||
### Device stylus {#device-stylus}
|
||||
|
||||
- Common Options: Apple Pencil / Surface Pen / S-Pen
|
||||
- Pros
|
||||
- Best precision of the stylus options
|
||||
- Allows for finger/palm rejection to be setup
|
||||
- Cons
|
||||
- Requires device support
|
||||
- Usually battery powered and requires charging
|
||||
|
||||
|
||||
### Active stylus {#active-stylus}
|
||||
|
||||
- Common Option: Adonit Dash [(link)](https://www.adonit.net/dash4/)
|
||||
- Pros
|
||||
- More precise than standard stylus
|
||||
- Does not require device support
|
||||
- Cons
|
||||
- Battery powered and requires charging
|
||||
- Less precise than device stylus
|
||||
|
||||
|
||||
### Standard Stylus {#standard-stylus}
|
||||
|
||||
- Common Options: Adonit Jot / Adonit Mini [(link)](https://www.adonit.net/mini4/) / Rubber nub stylus
|
||||
- Pros
|
||||
- More precise than finger
|
||||
- Does not require device support
|
||||
- No battery
|
||||
- Cons
|
||||
- Less precise than active stylus
|
||||
- May be harder to see where you're coloring/drawing
|
||||
|
||||
|
||||
### In My Opinion... {#in-my-opinion-dot-dot-dot}
|
||||
|
||||
Each has its own pros and cons. I myself prefer the device stylus option over others but use an Adonit Dash if no device stylus is avilable.
|
||||
|
||||
Each option is valid and can make a big difference for how coloring and drawing using a digital device feels. I definitely couldn't use my finger as the primary way to color a picture. I need a bit more 'traditional' feel but others I know prefer their finger.
|
||||
|
||||
|
||||
## Approach {#approach}
|
||||
|
||||
My approach to both coloring and drawing with Sketchbook is simple but super powerful. The key to the setup is having 4 layers, including the background.
|
||||
|
||||
Note: you can import your coloring page and just start coloring, nothing wrong with that. The below unlocked a lot of utility for me and some others I know. The approach below can make a very large difference for how the digital coloring and drawing experience feels.
|
||||
|
||||
|
||||
### Pan/Zoom/Rotate {#pan-zoom-rotate}
|
||||
|
||||
In general I make heavy use of pan, zoom and rotate. They are the only two finger shortcuts in the app and if I hold a stylus comfortably I can still use two fingers for moving around my focus easily and fluidly. It took a little practice but made a big difference for me.
|
||||
|
||||
|
||||
### Color Palate {#color-palate}
|
||||
|
||||
For choosing a color palate I generally use Coolors [(link)](https://coolors.co/) to generate a random color palate. I highly recommend this site if you don't want to build your own set of colors.
|
||||
|
||||
One trick with the site that I found really interesting: there is a little lock on each color shown on the generator output page. If you select the lock it'll lock the color so you can generate another palatte with that color as included. You can do this multiple times. Can be helpful for quickly finding complimentary colors to one that stands about above others.
|
||||
|
||||
I normally stick to a maximum of 5 colors for my images but that's a personal preference. This is art: let the mood strike.
|
||||
|
||||
|
||||
### Brushes {#brushes}
|
||||
|
||||
I personally prefer charcoal and pencil brushes in Sketchbook. However, options like paint, pen, others are available if you use the layering approach I describe in the `Layers` section to retain the image detail.
|
||||
|
||||
If you're not sure go with a pencil/marker brush and see how it feels. This may take a little time to sort as you find your preferences.
|
||||
|
||||
|
||||
### Layers {#layers}
|
||||
|
||||
I chop up my drawings and coloring pages into multiple layers. This is due to me wanting to keep the detal work above the coloring and shading without having to go back to cleanup when done coloring/shading. I've also worked on multiple images at the same time and try to keep some additional info 'handy' in case I don't work on an image for a longer period of time.
|
||||
|
||||
This approach works really well for flexibility while not being too complex overall.
|
||||
|
||||
That said: this works for me and others I've talked to. Your mileage may vary.
|
||||
|
||||
|
||||
#### Layer 1 {#layer-1}
|
||||
|
||||
I setup the upper most layer as the coloring page / main drawing outline using the image import tool. I also set the blend mode to `Darken`. This lets me see the coloring page (or drawing) details above any colors or shading I add to the image.
|
||||
|
||||
This also lets me ignore the white background most coloring page PDF and image files have. By using Darken for blending, the white image background has no effect on the final image and essentially becomes transparent.
|
||||
|
||||
See `Blending - Darken` and `Blending - Normal` screenshots below for how this works and can be setup.
|
||||
|
||||
|
||||
#### Layer 2 {#layer-2}
|
||||
|
||||
I setup the 2nd highest layer to be coloring / shading. This is where I do all my coloring work in particular. By doing this on a layer separate from the main coloring page I can use opaque brushes (like paint ones) that would obscure a lot of the coloring page detail or my own drawings details.
|
||||
|
||||
Isolating my shading and color as a dedicated layer really helped me with some of the brush types like pens and paint brushes.
|
||||
|
||||
See the `In Progress Coloring Page` screenshot for an idea how this will look as you work.
|
||||
|
||||
|
||||
#### Layer 3 {#layer-3}
|
||||
|
||||
I setup the 3rd highest layer to be notes and other information I want handy but not part of the final image. This includes my color pallate, brush notes and more. I keep this in my image for when I'm working but set the layer to invisible when exporting.
|
||||
|
||||
This is really helpful as I can now bounce between images as the mood may strike and not lose all the information I need to pickup where I left off.
|
||||
|
||||
See the `Palate Layer` screenshot for how I have this setup in my images.
|
||||
|
||||
|
||||
#### Background {#background}
|
||||
|
||||
I usually leave the background layer set to `White`. Feel free to adjust as you desire.
|
||||
|
||||
|
||||
## Sourcing Coloring Pages {#sourcing-coloring-pages}
|
||||
|
||||
If you're looking for coloring pages both Patreon and Etsy have a lot of options available.
|
||||
|
||||
I've not had much of a problem finding pages via Patreon, Etsy and Google. I've even subscribed to a few patreon accounts to get regular updates from artists I like in the past.
|
||||
|
||||
|
||||
## Conclusion {#conclusion}
|
||||
|
||||
I feel like I need a conclusion here. The above is what I use for digital coloring and drawing as well as some general info I've collected over time.
|
||||
|
||||
A number of humans I know have run with this and had success.
|
||||
|
||||
Hopefully you can do the same.
|
||||
|
||||
|
||||
## Screenshots {#screenshots}
|
||||
|
||||
|
||||
### Complete Coloring Page {#complete-coloring-page}
|
||||
|
||||
![](Notes/attachments/Complete---Fox-1.png)
|
||||
|
||||
### In Progress Coloring Page {#in-progress-coloring-page}
|
||||
|
||||
![](Notes/attachments/Blending---On-Top---Fox.png)
|
||||
|
||||
### Palate Layer {#palate-layer}
|
||||
|
||||
![](Notes/attachments/Palate-Layer---Fox.png)
|
||||
|
||||
### Blending - Darken {#blending-darken}
|
||||
|
||||
![](Notes/attachments/Blending---Darken---Layer---Fox.png)
|
||||
|
||||
### Blending - Normal {#blending-normal}
|
||||
|
||||
![](Notes/attachments/Blending---Normal---Layer---Fox.png)
|
||||
|
||||
## Advanced Coloring With Krita {#advanced-coloring-with-krita}
|
||||
|
||||
For more advanced users and tablet users, Krita ([link](https://krita.org/)) is available. I personally prefer Krita as it has more advanced features around brushes and workflows compared to Sketchbook. I also find it easier to use for managing backups, images and some other items.
|
||||
|
||||
**HOWEVER**
|
||||
|
||||
Krita has a steep learning curve compared to Sketchbook and my approach to coloring with Krita matches Sketchbook for image setup and high level workflow. Sketchbook is 100% valid and I _still_ recommend it over Krita day to day.
|
||||
|
||||
The below sections layout how I setup Krita overall and I leave the practical implementation of the below as an exercise for the reader.
|
||||
|
||||
|
||||
### Resources I found that may be worth investigating {#resources-i-found-that-may-be-worth-investigating}
|
||||
|
||||
- [brush] Bic ballpoint: <https://krita-artists.org/t/cheap-ballpoint-pen-brush/17170>
|
||||
- [brush] Copic Markers: <https://krita-artists.org/t/realistic-copic-marker-like-brushes/41203>
|
||||
- [brush] Graphite: <https://krita-artists.org/t/graphite-brushes-for-the-new-pattern-blend-modes/28036>
|
||||
- [brush] Sketch Pencils: `RM_Sketch_V1.bundle` from <https://files.kde.org/krita/extras/>
|
||||
- [brush] Charcoal: `Charcoal_KA.bundle` from <https://files.kde.org/krita/extras/charcoal/>
|
||||
- [palate] copic marker colors: <https://raw.githubusercontent.com/maborotopia/Krita_resources/master/copic322_color.gpl>
|
||||
- [palate] copic colors (more robust): <https://www.deviantart.com/d-signer/art/All-358-COPIC-Digital-Marker-Colours-ASE-ACO-GPL-765188823>
|
||||
|
||||
|
||||
### Things to consider {#things-to-consider}
|
||||
|
||||
- bug fix input profile settings: <https://krita-artists.org/t/cannot-save-input-profile-does-not-persist-on-startup-on-android/55693/4>
|
||||
- s pen click button is mouse middle click on galaxy fold devices
|
||||
- pop up palatte _is_ quick settings (like sketchbook puck)
|
||||
- gestures in the config can likely do brush size up/dn and undo/redo
|
||||
- can tune brush settings shown via the pop up palatte ui
|
||||
- go through favorite brushes and set up to 10 ; these will show on the popup palatte
|
||||
- use portrait mode when editing brushes ; you need the height to see everything and you can use the top of the pop-up window to move it left/right for full access
|
||||
|
||||
|
||||
### External storage resources folder {#external-storage-resources-folder}
|
||||
|
||||
- export/prep everything you want to keep (reuse desktop default resources dir if desired)
|
||||
- settings -> resources
|
||||
- use the ICON that pops the android folder selector
|
||||
- select the folder you want to use and grant storage permissions to it
|
||||
- save settings & quit krita
|
||||
- force stop krita in app settings
|
||||
- (ONLY IF REIMPORTING EXPORTS) - relaunch krita and import data
|
||||
- copy the resources dir you want to use to the selected folder
|
||||
- launch krita. this _will_ take awhile and may look like its frozen
|
||||
- clear any warnings/errors
|
||||
- quit krita
|
||||
- force stop krita
|
||||
- relaunch and enjoy
|
||||
|
||||
|
||||
### Settings {#settings}
|
||||
|
||||
- general
|
||||
- window
|
||||
- disable HiDPI support
|
||||
- tools
|
||||
- tool options location: in toolbar
|
||||
- disable 'enable touch painting
|
||||
- misc (when krita starts)
|
||||
- show session manager
|
||||
- save session on exit
|
||||
- canvas input settings (use a non default profile / see above for saving fix)
|
||||
- look for any gestures/touch/pen stuff that needs removing
|
||||
- show pop up widget
|
||||
- set to 'two finger tap'
|
||||
- zoom canvas
|
||||
- set gesture to five finger tap
|
||||
- touch gestures
|
||||
- set undo to four finger drag
|
||||
- set redo to four finger tap
|
||||
- set toggle canvas mode to three finger tap
|
||||
- tablet settings
|
||||
- adjust pressure curve
|
||||
- pop-up palatte
|
||||
- disable show rotation ring
|
||||
- s pen actions
|
||||
- click: toggle pop up palette with s-pen
|
||||
- double click: show canvas only
|
||||
- gestures: set all to do nothing
|
47
Notes/Dot to Dot Quick Reference.md
Normal file
|
@ -0,0 +1,47 @@
|
|||
---
|
||||
tags:
|
||||
- note
|
||||
- quick-reference
|
||||
created_at: 2024-09-12 1738-0400
|
||||
source: N/A
|
||||
|
||||
---
|
||||
|
||||
- Import image as a layer
|
||||
- Rename layer `Dot to Dot`
|
||||
- Set `Blending mode` to `Darken`
|
||||
- Create `Tracing` layer
|
||||
- Set layer `Blending mode` to `Darken`
|
||||
- Create `Fill Layer` with `White` as the background color
|
||||
- Rename layer `Background`
|
||||
- Create `Coloring` layer
|
||||
- Create `Palette` layer
|
||||
- Write name of palette to be used on layer (freehand, no typing)
|
||||
- Optionally import/paste a screen shot from `Coloors`
|
||||
- Optionally import/paste a copic sketch sample image
|
||||
- Rearrange layers
|
||||
- From top to bottom
|
||||
- `Tracing`
|
||||
- `Dot to Dot`
|
||||
- `Coloring`
|
||||
- `Palette`
|
||||
- `Background`
|
||||
- Lock `Dot to Dot` layer
|
||||
- Lock `Background` layer
|
||||
- If palette was chosen, lock `Palette` layer
|
||||
- Select `Tracing` layer
|
||||
- Save
|
||||
- Begin dot to dot
|
||||
- To color image
|
||||
- Lock `Tracing` layer
|
||||
- Hide `Dot to Dot` layer
|
||||
- Select `Coloring` layer
|
||||
- Color image the same as a coloring page
|
||||
|
||||
## Screenshots
|
||||
|
||||
![](Notes/attachments/2024-09-13_16-58.png)
|
||||
|
||||
![](Notes/attachments/2024-09-13_17-00.png)
|
||||
|
||||
![](Notes/attachments/2024-09-13_17-00_1.png)
|
23
Notes/Drawing Tablet Quick Reference.md
Normal file
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
tags:
|
||||
- note
|
||||
- quick-reference
|
||||
source: "N/A"
|
||||
created_at: 2024-09-14
|
||||
---
|
||||
|
||||
## PC Drawing Tablet Config
|
||||
|
||||
- Settings per app
|
||||
- Saber
|
||||
- Mapping: far left 1/3 of main monitor only
|
||||
- Pen: Disable side buttons
|
||||
- Krita
|
||||
- Mapping: right 1/2 of main monitor only
|
||||
- Pen
|
||||
- Top side button: Pan/Scroll
|
||||
- Bottom side button: Right Click (Pop-up palette)
|
||||
- Mouse
|
||||
- Scroll wheel: zoom
|
||||
- Top left click: Shift
|
||||
- Turns Pan/Zoom into Rotate
|
11
Notes/Extract Images From PDF.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
tags:
|
||||
- note
|
||||
created_at: 2024-09-12 1707-0400
|
||||
source: N/A
|
||||
|
||||
---
|
||||
|
||||
- Use [pdfcpu](https://github.com/pdfcpu/pdfcpu)
|
||||
- See command line options
|
||||
- `extract -m image` is a good choice
|
51
Notes/Krita Quick Reference.md
Normal file
|
@ -0,0 +1,51 @@
|
|||
---
|
||||
tags:
|
||||
- note
|
||||
- quick-reference
|
||||
source: "N/A"
|
||||
created_at: 2024-09-13
|
||||
---
|
||||
|
||||
## A quick note
|
||||
|
||||
Also see [Digital coloring and drawing](Notes/Digital%20coloring%20and%20drawing.md) for a full Krita config. The Krita specific information is at the *bottom* of the linked page.
|
||||
|
||||
## General workflow
|
||||
|
||||
- Prep downloaded files
|
||||
- Extract `png`/`jpg`/`tiff` pages from `pdf` if needed
|
||||
- Convert image to `kra` format
|
||||
- Setup any necessary layers
|
||||
- See [Coloring Page Quick Reference](Notes/Coloring%20Page%20Quick%20Reference.md) for coloring pages
|
||||
- See [Dot to Dot Quick Reference](Notes/Dot%20to%20Dot%20Quick%20Reference.md) for dot to dot pages
|
||||
- Create page in vault with link to `kra` file
|
||||
- Sync vault to tablet as appropriate
|
||||
- Open file in Krita
|
||||
- Make art
|
||||
|
||||
## Small Tablet Tips / Tricks
|
||||
|
||||
An important note: the settings dialog may be too big horizontally for a small android tablet screen. You can drag the top of the window to move it left/right/up/down to access the full window. This is especially important on Samsung Z Fold devices.
|
||||
|
||||
On a small tablet it can be wise to use the full screen canvas view and pop-up palette. This allows you to use the whole screen with your stylus and easily access different brushes and recently used colors. Note: the pop-up palette will show your favorite brushes by default and which brushes it shows, as well as how many to show, can be configured within the main Krita settings.
|
||||
|
||||
Another helpful thing on tablets is tuning the mutli-touch gestures. The following work very well in practice:
|
||||
|
||||
- Two finger tap: activate pop-up palette
|
||||
- Three finger tap: toggle canvas only mode
|
||||
- Four finger drag: Undo
|
||||
- Four finger tap: redo
|
||||
|
||||
### Screenshots
|
||||
|
||||
#### Main Krita View With File Open
|
||||
|
||||
![](Notes/attachments/Imagepipe_359.jpg)
|
||||
|
||||
#### Canvas View
|
||||
|
||||
![](Notes/attachments/Imagepipe_360.jpg)
|
||||
|
||||
#### Pop-up Palette
|
||||
|
||||
![](Notes/attachments/Imagepipe_361.jpg)
|
21
Notes/Obsidian ToC.md
Normal file
|
@ -0,0 +1,21 @@
|
|||
---
|
||||
tags:
|
||||
- note
|
||||
source: "N/A"
|
||||
created_at: 2024-09-12
|
||||
---
|
||||
|
||||
To add an automatic table of contents with `obsidian-automatic-table-of-contents` plugin:
|
||||
|
||||
````
|
||||
```table-of-contents
|
||||
title: **Table of Contents**
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
````
|
||||
|
||||
To see a table of contents using built in methods:
|
||||
|
||||
![](Notes/attachments/Obsidian%20ToC.png)
|
17
Notes/Obtaining Source Material.md
Normal file
|
@ -0,0 +1,17 @@
|
|||
---
|
||||
tags:
|
||||
- note
|
||||
source: "N/A"
|
||||
created_at: 2024-09-13
|
||||
---
|
||||
|
||||
- https://ko-fi.com/welshpixie
|
||||
- https://www.etsy.com/shop/TimsPrintables
|
||||
- https://www.etsy.com/shop/Woodseestees
|
||||
- https://www.etsy.com/shop/TheColoringBookshelf
|
||||
- https://www.etsy.com/shop/SpecialArtBooks
|
||||
- https://www.etsy.com/shop/SiaPrettyPrintables
|
||||
- https://www.etsy.com/shop/Viragerds
|
||||
- https://www.etsy.com/shop/DrawingPangolin
|
||||
- https://www.etsy.com/shop/SpiceandRose
|
||||
- https://www.etsy.com/shop/CiaraCreatesCo
|
16
Notes/_Troubleshooting The Vault.md
Normal file
|
@ -0,0 +1,16 @@
|
|||
---
|
||||
tags:
|
||||
- note
|
||||
source: "N/A"
|
||||
created_at: 2024-09-12
|
||||
---
|
||||
|
||||
```table-of-contents
|
||||
title: **Table of Contents**
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Galleries Don't Update
|
||||
|
||||
If the gallery pages are not updating properly, it's likely the cache the plugin uses needs to be refreshed. From the command palette, run `Note Gallery: Drop all cache and re-initialize database` to force update all galleries.
|
1
Notes/attachments/.nomedia
Normal file
|
@ -0,0 +1 @@
|
|||
/storage/emulated/0/Krita
|
BIN
Notes/attachments/2024-09-13_16-56.png
Normal file
After Width: | Height: | Size: 6.9 KiB |
BIN
Notes/attachments/2024-09-13_16-56_1.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
Notes/attachments/2024-09-13_16-58.png
Normal file
After Width: | Height: | Size: 5.8 KiB |
BIN
Notes/attachments/2024-09-13_17-00.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
Notes/attachments/2024-09-13_17-00_1.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
Notes/attachments/Blending---Darken---Layer---Fox.png
Normal file
After Width: | Height: | Size: 573 KiB |
BIN
Notes/attachments/Blending---Normal---Layer---Fox.png
Normal file
After Width: | Height: | Size: 490 KiB |
BIN
Notes/attachments/Blending---On-Top---Fox.png
Normal file
After Width: | Height: | Size: 541 KiB |
BIN
Notes/attachments/Complete---Fox-1.png
Normal file
After Width: | Height: | Size: 894 KiB |
BIN
Notes/attachments/DSC02900-3.jpg
Normal file
After Width: | Height: | Size: 100 KiB |