2025-04-07 13:07:53: ...

This commit is contained in:
zhangkun9038@dingtalk.com 2025-04-07 13:08:02 +08:00
parent 7bf77f5282
commit 4380e95e00
193 changed files with 125921 additions and 832 deletions

BIN
.obsidian/.DS_Store vendored Normal file

Binary file not shown.

19
.obsidian/app.json vendored
View File

@ -1,14 +1,11 @@
{
"promptDelete": false,
"pdfExportSettings": {
"pageSize": "Letter",
"landscape": false,
"margin": "0",
"downscalePercent": 100
},
"newFileLocation": "folder",
"newFileFolderPath": "new notes",
"showUnsupportedFiles": true,
"attachmentFolderPath": "./attachments",
"vimMode": true,
"attachmentFolderPath": "attachments",
"useMarkdownLinks": true,
"newLinkFormat": "relative",
"alwaysUpdateLinks": true
"showLineNumber": true,
"alwaysUpdateLinks": true,
"promptDelete": false,
"livePreview": false
}

View File

@ -1,4 +1,7 @@
{
"showRibbon": true,
"translucency": true
"cssTheme": "Wasp",
"enabledCssSnippets": [
"allnotelist"
],
"showRibbon": true
}

9
.obsidian/bookmarks.json vendored Normal file
View File

@ -0,0 +1,9 @@
{
"items": [
{
"type": "file",
"ctime": 1743939086946,
"path": "kanban/mainboard.md"
}
]
}

6
.obsidian/canvas.json vendored Normal file
View File

@ -0,0 +1,6 @@
{
"snapToObjects": true,
"snapToGrid": true,
"newFileLocation": "folder",
"newFileFolderPath": "canvas"
}

View File

@ -1,7 +1,17 @@
[
"obsidian-git",
"obsidian-linter",
"terminal",
"table-editor-obsidian",
"dataview",
"obsidian-day-planner",
"obsidian-importer",
"weather-fetcher",
"geocoding-properties",
"metaedit",
"kanban-status-updater",
"obsidian-kanban",
"obsidian-git"
"templater-obsidian",
"homepage",
"pane-relief",
"recent-files-obsidian",
"copilot"
]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -16,7 +16,7 @@
"slash-command": false,
"editor-status": true,
"bookmarks": true,
"markdown-importer": true,
"markdown-importer": false,
"zk-prefixer": false,
"random-note": false,
"outline": true,

4
.obsidian/daily-notes.json vendored Normal file
View File

@ -0,0 +1,4 @@
{
"template": "templates/daily_template",
"autorun": false
}

View File

@ -17,6 +17,6 @@
"repelStrength": 10,
"linkStrength": 1,
"linkDistance": 250,
"scale": 1.3486109551319057,
"close": false
"scale": 1.2959324124840048,
"close": true
}

98
.obsidian/hotkeys.json vendored Normal file
View File

@ -0,0 +1,98 @@
{
"workspace:split-vertical": [
{
"modifiers": [
"Alt",
"Mod"
],
"key": "V"
}
],
"window:zoom-in": [
{
"modifiers": [
"Alt"
],
"key": "="
}
],
"window:zoom-out": [
{
"modifiers": [
"Alt"
],
"key": "-"
}
],
"terminal:open-terminal.integrated.current": [
{
"modifiers": [
"Alt"
],
"key": "T"
}
],
"obsidian-git:commit-push-specified-message": [
{
"modifiers": [
"Alt",
"Mod"
],
"key": "M"
}
],
"obsidian-git:push": [
{
"modifiers": [
"Alt",
"Mod"
],
"key": "G"
}
],
"table-editor-obsidian:format-all-tables": [
{
"modifiers": [
"Alt",
"Mod"
],
"key": "L"
}
],
"copilot:chat-toggle-window": [
{
"modifiers": [
"Alt",
"Mod"
],
"key": "J"
}
],
"workspace:split-horizontal": [
{
"modifiers": [
"Alt",
"Mod"
],
"key": "H"
}
],
"editor:toggle-source": [
{
"modifiers": [
"Alt",
"Mod"
],
"key": "W"
}
],
"markdown:toggle-preview": [
{
"modifiers": [
"Alt",
"Mod"
],
"key": "E"
}
]
}

BIN
.obsidian/plugins/.DS_Store vendored Normal file

Binary file not shown.

346
.obsidian/plugins/copilot/data.json vendored Normal file
View File

@ -0,0 +1,346 @@
{
"isPlusUser": false,
"plusLicenseKey": "",
"openAIApiKey": "",
"openAIOrgId": "",
"huggingfaceApiKey": "",
"cohereApiKey": "",
"anthropicApiKey": "",
"azureOpenAIApiKey": "",
"azureOpenAIApiInstanceName": "",
"azureOpenAIApiDeploymentName": "",
"azureOpenAIApiVersion": "",
"azureOpenAIApiEmbeddingDeploymentName": "",
"googleApiKey": "",
"openRouterAiApiKey": "",
"mistralApiKey": "",
"deepseekApiKey": "",
"defaultChainType": "vault_qa",
"defaultModelKey": "qwen-max-latest|openai",
"embeddingModelKey": "chsword/DeepSeek-V3:latest|ollama",
"temperature": 0.1,
"maxTokens": 1000,
"contextTurns": 15,
"userSystemPrompt": "",
"openAIProxyBaseUrl": "",
"openAIEmbeddingProxyBaseUrl": "",
"stream": true,
"defaultSaveFolder": "copilot-conversations",
"defaultConversationTag": "copilot-conversation",
"autosaveChat": false,
"defaultOpenArea": "view",
"customPromptsFolder": "copilot-custom-prompts",
"indexVaultToVectorStore": "ON MODE SWITCH",
"qaExclusions": "",
"qaInclusions": "",
"chatNoteContextPath": "",
"chatNoteContextTags": [],
"enableIndexSync": true,
"debug": false,
"enableEncryption": false,
"maxSourceChunks": 3,
"groqApiKey": "",
"activeModels": [
{
"name": "copilot-plus-flash",
"provider": "copilot-plus",
"enabled": false,
"isBuiltIn": true,
"core": true,
"plusExclusive": true,
"capabilities": [
"vision"
]
},
{
"name": "gpt-4o",
"provider": "openai",
"enabled": false,
"isBuiltIn": true,
"core": true,
"capabilities": [
"vision"
]
},
{
"name": "gpt-4o-mini",
"provider": "openai",
"enabled": false,
"isBuiltIn": true,
"core": true,
"capabilities": [
"vision"
]
},
{
"name": "claude-3-5-sonnet-latest",
"provider": "anthropic",
"enabled": false,
"isBuiltIn": true,
"core": true,
"capabilities": [
"vision"
]
},
{
"name": "o1-mini",
"provider": "openai",
"enabled": false,
"isBuiltIn": true,
"capabilities": [
"reasoning"
]
},
{
"name": "o3-mini",
"provider": "openai",
"enabled": false,
"isBuiltIn": true,
"capabilities": [
"reasoning"
]
},
{
"name": "claude-3-5-haiku-latest",
"provider": "anthropic",
"enabled": false,
"isBuiltIn": true
},
{
"name": "command-r",
"provider": "cohereai",
"enabled": false,
"isBuiltIn": true
},
{
"name": "command-r-plus",
"provider": "cohereai",
"enabled": false,
"isBuiltIn": true
},
{
"name": "gemini-2.0-pro-exp",
"provider": "google",
"enabled": false,
"isBuiltIn": true,
"capabilities": [
"vision"
]
},
{
"name": "gemini-2.0-flash",
"provider": "google",
"enabled": false,
"isBuiltIn": true,
"capabilities": [
"vision"
]
},
{
"name": "azure-openai",
"provider": "azure openai",
"enabled": false,
"isBuiltIn": true
},
{
"name": "deepseek-chat",
"provider": "deepseek",
"enabled": false,
"isBuiltIn": true
},
{
"name": "deepseek-reasoner",
"provider": "deepseek",
"enabled": false,
"isBuiltIn": true,
"capabilities": [
"reasoning"
]
},
{
"name": "qwen-max-latest",
"provider": "openai",
"enabled": true,
"isBuiltIn": false,
"baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1",
"apiKey": "sk-24a6af9eea55494b8f465a01cb92d461",
"isEmbeddingModel": false,
"capabilities": [],
"stream": true,
"displayName": "qwen-max-latest",
"enableCors": true
},
{
"name": "chsword/DeepSeek-V3:latest",
"provider": "3rd party (openai-format)",
"enabled": true,
"isBuiltIn": false,
"baseUrl": "http://localhost:11434/v1/",
"apiKey": "",
"isEmbeddingModel": false,
"capabilities": [],
"stream": true,
"displayName": "chsword/DeepSeek-V3:latest",
"enableCors": true
}
],
"activeEmbeddingModels": [
{
"name": "copilot-plus-small",
"provider": "copilot-plus",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"core": true,
"plusExclusive": true
},
{
"name": "copilot-plus-large",
"provider": "copilot-plus-jina",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"core": true,
"plusExclusive": true,
"believerExclusive": true,
"dimensions": 1024
},
{
"name": "copilot-plus-multilingual",
"provider": "copilot-plus-jina",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"core": true,
"plusExclusive": true,
"dimensions": 512
},
{
"name": "text-embedding-3-small",
"provider": "openai",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true,
"core": true
},
{
"name": "text-embedding-3-large",
"provider": "openai",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true
},
{
"name": "embed-multilingual-light-v3.0",
"provider": "cohereai",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true
},
{
"name": "text-embedding-004",
"provider": "google",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true
},
{
"name": "azure-openai",
"provider": "azure openai",
"enabled": true,
"isBuiltIn": true,
"isEmbeddingModel": true
},
{
"name": "chsword/DeepSeek-V3:latest",
"provider": "ollama",
"enabled": true,
"isBuiltIn": false,
"baseUrl": "",
"apiKey": "",
"isEmbeddingModel": true,
"capabilities": [],
"displayName": "chsword/DeepSeek-V3:latest"
}
],
"embeddingRequestsPerMin": 90,
"embeddingBatchSize": 16,
"disableIndexOnMobile": true,
"showSuggestedPrompts": true,
"showRelevantNotes": true,
"numPartitions": 1,
"promptUsageTimestamps": {},
"defaultConversationNoteName": "{$topic}@{$date}_{$time}",
"inlineEditCommands": [
{
"name": "Fix grammar and spelling",
"prompt": "<instruction>Fix the grammar and spelling of the text below. Preserve all formatting, line breaks, and special characters. Do not add or remove any content. Return only the corrected text.</instruction>\n\n<text>{copilot-selection}</text>",
"showInContextMenu": true
},
{
"name": "Translate to Chinese",
"prompt": "<instruction>Translate the text below into Chinese:\n 1. Preserve the meaning and tone\n 2. Maintain appropriate cultural context\n 3. Keep formatting and structure\n Return only the translated text.</instruction>\n\n<text>{copilot-selection}</text>",
"showInContextMenu": true
},
{
"name": "Summarize",
"prompt": "<instruction>Create a bullet-point summary of the text below. Each bullet point should capture a key point. Return only the bullet-point summary.</instruction>\n\n<text>{copilot-selection}</text>",
"showInContextMenu": true
},
{
"name": "Simplify",
"prompt": "<instruction>Simplify the text below to a 6th-grade reading level (ages 11-12). Use simple sentences, common words, and clear explanations. Maintain the original key concepts. Return only the simplified text.</instruction>\n\n<text>{copilot-selection}</text>",
"showInContextMenu": true
},
{
"name": "Emojify",
"prompt": "<instruction>Add relevant emojis to enhance the text below. Follow these rules:\n 1. Insert emojis at natural breaks in the text\n 2. Never place two emojis next to each other\n 3. Keep all original text unchanged\n 4. Choose emojis that match the context and tone\n Return only the emojified text.</instruction>\n\n<text>{copilot-selection}</text>",
"showInContextMenu": true
},
{
"name": "Make shorter",
"prompt": "<instruction>Reduce the text below to half its length while preserving these elements:\n 1. Main ideas and key points\n 2. Essential details\n 3. Original tone and style\n Return only the shortened text.</instruction>\n\n<text>{copilot-selection}</text>",
"showInContextMenu": true
},
{
"name": "Make longer",
"prompt": "<instruction>Expand the text below to twice its length by:\n 1. Adding relevant details and examples\n 2. Elaborating on key points\n 3. Maintaining the original tone and style\n Return only the expanded text.</instruction>\n\n<text>{copilot-selection}</text>",
"showInContextMenu": true
},
{
"name": "Generate table of contents",
"prompt": "<instruction>Generate a hierarchical table of contents for the text below. Use appropriate heading levels (H1, H2, H3, etc.). Include page numbers if present. Return only the table of contents.</instruction>\n\n<text>{copilot-selection}</text>",
"showInContextMenu": false
},
{
"name": "Generate glossary",
"prompt": "<instruction>Create a glossary of important terms, concepts, and phrases from the text below. Format each entry as \"Term: Definition\". Sort entries alphabetically. Return only the glossary.</instruction>\n\n<text>{copilot-selection}</text>",
"showInContextMenu": false
},
{
"name": "Remove URLs",
"prompt": "<instruction>Remove all URLs from the text below. Preserve all other content and formatting. URLs may be in various formats (http, https, www). Return only the text with URLs removed.</instruction>\n\n<text>{copilot-selection}</text>",
"showInContextMenu": false
},
{
"name": "Rewrite as tweet",
"prompt": "<instruction>Rewrite the text below as a single tweet with these requirements:\n 1. Maximum 280 characters\n 2. Use concise, impactful language\n 3. Maintain the core message\n Return only the tweet text.</instruction>\n\n<text>{copilot-selection}</text>",
"showInContextMenu": false
},
{
"name": "Rewrite as tweet thread",
"prompt": "<instruction>Convert the text below into a Twitter thread following these rules:\n 1. Each tweet must be under 240 characters\n 2. Start with \"THREAD START\" on its own line\n 3. Separate tweets with \"\n\n---\n\n\"\n 4. End with \"THREAD END\" on its own line\n 5. Make content engaging and clear\n Return only the formatted thread.</instruction>\n\n<text>{copilot-selection}</text>",
"showInContextMenu": false
},
{
"name": "Explain like I am 5",
"prompt": "<instruction>Explain the text below in simple terms that a 5-year-old would understand:\n 1. Use basic vocabulary\n 2. Include simple analogies\n 3. Break down complex concepts\n Return only the simplified explanation.</instruction>\n\n<text>{copilot-selection}</text>",
"showInContextMenu": false
},
{
"name": "Rewrite as press release",
"prompt": "<instruction>Transform the text below into a professional press release:\n 1. Use formal, journalistic style\n 2. Include headline and dateline\n 3. Follow inverted pyramid structure\n Return only the press release format.</instruction>\n\n<text>{copilot-selection}</text>",
"showInContextMenu": false
}
]
}

1447
.obsidian/plugins/copilot/main.js vendored Normal file

File diff suppressed because one or more lines are too long

13
.obsidian/plugins/copilot/manifest.json vendored Normal file
View File

@ -0,0 +1,13 @@
{
"id": "copilot",
"name": "Copilot",
"version": "2.8.8",
"minAppVersion": "0.15.0",
"description": "An AI Copilot in Obsidian.",
"author": "Logan Yang",
"authorUrl": "https://twitter.com/logancyang",
"fundingUrl": {
"Buy Me a Coffee": "https://www.buymeacoffee.com/logancyang",
"GitHub Sponsor": "https://github.com/sponsors/logancyang"
}
}

1
.obsidian/plugins/copilot/styles.css vendored Normal file

File diff suppressed because one or more lines are too long

27
.obsidian/plugins/dataview/data.json vendored Normal file
View File

@ -0,0 +1,27 @@
{
"renderNullAs": "\\-",
"taskCompletionTracking": false,
"taskCompletionUseEmojiShorthand": false,
"taskCompletionText": "completion",
"taskCompletionDateFormat": "yyyy-MM-dd",
"recursiveSubTaskCompletion": false,
"warnOnEmptyResult": true,
"refreshEnabled": true,
"refreshInterval": 2500,
"defaultDateFormat": "MMMM dd, yyyy",
"defaultDateTimeFormat": "h:mm a - MMMM dd, yyyy",
"maxRecursiveRenderDepth": 4,
"tableIdColumnName": "File",
"tableGroupColumnName": "Group",
"showResultCount": true,
"allowHtml": true,
"inlineQueryPrefix": "=",
"inlineJsQueryPrefix": "$=",
"inlineQueriesInCodeblocks": true,
"enableInlineDataview": true,
"enableDataviewJs": true,
"enableInlineDataviewJs": true,
"prettyRenderInlineFields": true,
"prettyRenderInlineFieldsInLivePreview": true,
"dataviewJsKeyword": "dataviewjs"
}

View File

@ -0,0 +1,32 @@
{
"properties": {
"address": {
"frontmatterKey": "address",
"enabled": true
},
"lat": {
"frontmatterKey": "lat",
"enabled": true
},
"lng": {
"frontmatterKey": "lng",
"enabled": true
},
"location": {
"frontmatterKey": "location",
"enabled": true
},
"map_link": {
"frontmatterKey": "map_link",
"enabled": false
},
"map_view_link": {
"frontmatterKey": "map_view_link",
"enabled": false
}
},
"overrideExistingProperties": false,
"mapLinkProvider": "osm",
"apiProvider": "free-geocoding-api",
"apiKey": ""
}

View File

@ -0,0 +1,602 @@
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
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 __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// node_modules/deepmerge/dist/cjs.js
var require_cjs = __commonJS({
"node_modules/deepmerge/dist/cjs.js"(exports, module2) {
"use strict";
var isMergeableObject = function isMergeableObject2(value) {
return isNonNullObject(value) && !isSpecial(value);
};
function isNonNullObject(value) {
return !!value && typeof value === "object";
}
function isSpecial(value) {
var stringValue = Object.prototype.toString.call(value);
return stringValue === "[object RegExp]" || stringValue === "[object Date]" || isReactElement(value);
}
var canUseSymbol = typeof Symbol === "function" && Symbol.for;
var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for("react.element") : 60103;
function isReactElement(value) {
return value.$$typeof === REACT_ELEMENT_TYPE;
}
function emptyTarget(val) {
return Array.isArray(val) ? [] : {};
}
function cloneUnlessOtherwiseSpecified(value, options) {
return options.clone !== false && options.isMergeableObject(value) ? deepmerge(emptyTarget(value), value, options) : value;
}
function defaultArrayMerge(target, source, options) {
return target.concat(source).map(function(element) {
return cloneUnlessOtherwiseSpecified(element, options);
});
}
function getMergeFunction(key, options) {
if (!options.customMerge) {
return deepmerge;
}
var customMerge = options.customMerge(key);
return typeof customMerge === "function" ? customMerge : deepmerge;
}
function getEnumerableOwnPropertySymbols(target) {
return Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(target).filter(function(symbol) {
return Object.propertyIsEnumerable.call(target, symbol);
}) : [];
}
function getKeys(target) {
return Object.keys(target).concat(getEnumerableOwnPropertySymbols(target));
}
function propertyIsOnObject(object, property) {
try {
return property in object;
} catch (_) {
return false;
}
}
function propertyIsUnsafe(target, key) {
return propertyIsOnObject(target, key) && !(Object.hasOwnProperty.call(target, key) && Object.propertyIsEnumerable.call(target, key));
}
function mergeObject(target, source, options) {
var destination = {};
if (options.isMergeableObject(target)) {
getKeys(target).forEach(function(key) {
destination[key] = cloneUnlessOtherwiseSpecified(target[key], options);
});
}
getKeys(source).forEach(function(key) {
if (propertyIsUnsafe(target, key)) {
return;
}
if (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) {
destination[key] = getMergeFunction(key, options)(target[key], source[key], options);
} else {
destination[key] = cloneUnlessOtherwiseSpecified(source[key], options);
}
});
return destination;
}
function deepmerge(target, source, options) {
options = options || {};
options.arrayMerge = options.arrayMerge || defaultArrayMerge;
options.isMergeableObject = options.isMergeableObject || isMergeableObject;
options.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified;
var sourceIsArray = Array.isArray(source);
var targetIsArray = Array.isArray(target);
var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;
if (!sourceAndTargetTypesMatch) {
return cloneUnlessOtherwiseSpecified(source, options);
} else if (sourceIsArray) {
return options.arrayMerge(target, source, options);
} else {
return mergeObject(target, source, options);
}
}
deepmerge.all = function deepmergeAll(array, options) {
if (!Array.isArray(array)) {
throw new Error("first argument should be an array");
}
return array.reduce(function(prev, next) {
return deepmerge(prev, next, options);
}, {});
};
var deepmerge_1 = deepmerge;
module2.exports = deepmerge_1;
}
});
// src/main.ts
var main_exports = {};
__export(main_exports, {
default: () => GeocodingPlugin
});
module.exports = __toCommonJS(main_exports);
var import_deepmerge = __toESM(require_cjs());
var import_obsidian6 = require("obsidian");
// src/search-modal.ts
var import_obsidian2 = require("obsidian");
// src/results-modal.ts
var import_obsidian = require("obsidian");
var GeocodingResultsModal = class extends import_obsidian.SuggestModal {
constructor(plugin, results) {
super(plugin.app);
this.plugin = plugin;
this.results = results;
this.setPlaceholder("Select result");
}
getSuggestions(query) {
return this.results.filter(
(result) => result.address.toLowerCase().includes(query.toLowerCase())
);
}
onChooseSuggestion(result) {
this.plugin.insertProperties(result);
}
renderSuggestion({ address, lat, lng, info }, el) {
el.createEl("div", {
text: `${address} (${lat}, ${lng})`
});
if (info) {
el.createEl("small", {
text: info
});
}
}
};
// src/search-modal.ts
var GeocodingSearchModal = class extends import_obsidian2.Modal {
constructor(plugin, searchTerm) {
super(plugin.app);
this.plugin = plugin;
this.searchTerm = searchTerm;
}
async onSubmit() {
this.close();
const results = await this.plugin.getResults(this.searchTerm);
new GeocodingResultsModal(this.plugin, results).open();
}
onOpen() {
const { contentEl } = this;
contentEl.createEl("h1", {
text: "Confirm search term"
});
new import_obsidian2.Setting(contentEl).setName("Name").addText((text) => {
const component = text.setValue(this.searchTerm).onChange((value) => {
this.searchTerm = value;
});
component.inputEl.style.width = "100%";
});
new import_obsidian2.Setting(contentEl).addButton(
(btn) => btn.setButtonText("Submit").setCta().onClick(async () => {
await this.onSubmit();
})
);
contentEl.addEventListener("keypress", async (e) => {
if (e.key === "Enter") {
e.preventDefault();
await this.onSubmit();
}
});
}
onClose() {
const { contentEl } = this;
contentEl.empty();
}
};
// src/settings.ts
var propertyDescriptions = {
address: {
name: "Address",
detail: "Format varies by provider"
},
lat: {
name: "Latitude"
},
lng: {
name: "Longitude"
},
location: {
name: "Location",
detail: "Coordinates in [lat, lng] format"
},
map_link: {
name: "Map link"
},
map_view_link: {
name: "Map view link",
detail: "A link in [](geo:lat,lng) format"
}
};
var defaultSettings = {
properties: {
address: {
frontmatterKey: "address",
enabled: true
},
lat: {
frontmatterKey: "lat",
enabled: false
},
lng: {
frontmatterKey: "lng",
enabled: false
},
location: {
frontmatterKey: "location",
enabled: false
},
map_link: {
frontmatterKey: "map_link",
enabled: false
},
map_view_link: {
frontmatterKey: "map_view_link",
enabled: false
}
},
overrideExistingProperties: false,
mapLinkProvider: "google",
apiProvider: "free-geocoding-api",
apiKey: ""
};
// src/settings-tab.ts
var import_obsidian3 = require("obsidian");
var GeocodingPluginSettingTab = class extends import_obsidian3.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
const { containerEl } = this;
containerEl.empty();
containerEl.createEl("h2", { text: "Properties" });
for (const [key, description] of Object.entries(
propertyDescriptions
)) {
const property = this.plugin.settings.properties[key];
new import_obsidian3.Setting(containerEl).setName(description.name || key).setDesc(description.detail || "").addText(
(text) => text.setValue(property.frontmatterKey).onChange(async (value) => {
if (!value) {
return;
}
property.frontmatterKey = value;
await this.plugin.saveSettings();
})
).addToggle(
(toggle) => toggle.setValue(property.enabled).onChange(async (value) => {
property.enabled = value;
await this.plugin.saveSettings();
})
);
}
containerEl.createEl("h2", { text: "Behavior" });
new import_obsidian3.Setting(containerEl).setName("Override existing properties").setDesc(
"Whether to override existing properties with the same name"
).addToggle(
(toggle) => toggle.setValue(this.plugin.settings.overrideExistingProperties).onChange(async (value) => {
this.plugin.settings.overrideExistingProperties = value;
await this.plugin.saveSettings();
})
);
new import_obsidian3.Setting(containerEl).setName("Map link provider").setDesc("Provider for the map_link property, if enabled").addDropdown(
(dropdown) => dropdown.addOptions({
google: "Google Maps",
apple: "Apple Maps",
osm: "OpenStreetMap"
}).setValue(this.plugin.settings.mapLinkProvider).onChange(async (value) => {
switch (value) {
case "google":
case "apple":
case "osm":
this.plugin.settings.mapLinkProvider = value;
break;
}
await this.plugin.saveSettings();
})
);
containerEl.createEl("h2", { text: "API" });
new import_obsidian3.Setting(containerEl).setName("API provider").addDropdown(
(dropdown) => dropdown.addOptions({
["free-geocoding-api"]: "Free Geocoding API",
["google-geocoding"]: "Google Geocoding"
}).setValue(this.plugin.settings.apiProvider).onChange(async (value) => {
switch (value) {
case "free-geocoding-api":
case "google-geocoding":
this.plugin.settings.apiProvider = value;
break;
}
await this.plugin.saveSettings();
})
);
new import_obsidian3.Setting(containerEl).setName("API key").setDisabled(
this.plugin.settings.apiProvider !== "google-geocoding"
).addText(
(text) => text.setValue(this.plugin.settings.apiKey).onChange(async (value) => {
this.plugin.settings.apiKey = value;
await this.plugin.saveSettings();
})
);
}
};
// src/utils/fetch-free-geocoding-api-results.ts
var import_obsidian4 = require("obsidian");
var fetchFreeGeocodingAPIResults = async (searchTerm, apiKey) => {
const params = new URLSearchParams({
q: searchTerm,
api_key: apiKey
});
const url = `https://geocode.maps.co/search?${params.toString()}`;
const response = await (0, import_obsidian4.requestUrl)({
url,
throw: false
});
const retryAfter = response.headers["Retry-After"];
switch (response.status) {
case 200:
break;
case 401:
throw new Error("Unauthorized. Please check your API key.");
case 409:
case 503:
if (retryAfter) {
throw new Error(
`Too many requests. Please try again in ${retryAfter} seconds.`
);
}
throw new Error("Too many requests. Please try again later.");
default:
throw new Error(`Server responded with ${response.status}`);
}
const results = response.json;
return results.map((result) => ({
address: result.display_name,
lat: Number(result.lat),
lng: Number(result.lon),
info: `${result.class} ${result.type}`,
id: result.osm_id.toString(),
provider: "free-geocoding-api"
}));
};
// src/utils/fetch-google-geocoding-results.ts
var import_obsidian5 = require("obsidian");
var fetchGoogleGeocodingResults = async (searchTerm, apiKey) => {
const params = new URLSearchParams({
address: searchTerm,
key: apiKey
});
const url = `https://maps.googleapis.com/maps/api/geocode/json?${params.toString()}`;
const response = await (0, import_obsidian5.requestUrl)({
url,
throw: false
});
if (response.status !== 200) {
throw new Error(`Server responded with ${response.status}`);
}
const { status, results } = response.json;
switch (status) {
case "OK":
break;
case "ZERO_RESULTS":
throw new Error("No results found");
case "OVER_DAILY_LIMIT":
throw new Error("Over daily limit");
case "OVER_QUERY_LIMIT":
throw new Error("Over query limit");
case "REQUEST_DENIED":
throw new Error("Request denied (invalid API key?)");
default:
throw new Error("Unknown API response");
}
return results.map((result) => ({
address: result.formatted_address,
lat: result.geometry.location.lat,
lng: result.geometry.location.lng,
info: result.types.join(", "),
id: result.place_id,
provider: "google-geocoding"
}));
};
// src/utils/make-apple-maps-link.ts
var makeAppleMapsLink = ({ address, lat, lng }) => {
const params = new URLSearchParams({
ll: `${lat},${lng}`,
address
// used only for display
});
return `https://maps.apple.com/?${params.toString()}`;
};
// src/utils/make-google-maps-link.ts
var makeGoogleMapsLink = ({
id,
provider,
lat,
lng
}) => {
if (provider === "google-geocoding") {
return `https://www.google.com/maps/search/?api=1&query=Google&query_place_id=${id}`;
}
const params = new URLSearchParams({
api: "1",
// we can only query by lat,lng or address, so we choose the more precise option
query: `${lat},${lng}`
});
return `https://www.google.com/maps/search/?${params.toString()}`;
};
// src/utils/make-osm-link.ts
var makeOsmLink = ({ id, provider, lat, lng }) => {
if (provider === "free-geocoding-api") {
}
const params = new URLSearchParams({
mlat: lat.toString(),
mlon: lng.toString()
});
return `https://openstreetmap.org/?${params.toString()}`;
};
// src/main.ts
var GeocodingPlugin = class extends import_obsidian6.Plugin {
async onload() {
await this.loadSettings();
this.addSettingTab(new GeocodingPluginSettingTab(this.app, this));
this.addCommand({
id: "insert-into-current-note",
name: "Insert properties into current note",
editorCallback: async (_, ctx) => {
const currentFile = ctx.file;
if (!currentFile) {
return;
}
const searchTerm = this.getSearchTerm(currentFile);
new GeocodingSearchModal(this, searchTerm).open();
}
});
this.addCommand({
id: "insert-into-current-note-no-confirmation",
name: "Insert properties into current note (no confirmation)",
editorCallback: async (_, ctx) => {
const currentFile = ctx.file;
if (!currentFile) {
return;
}
const searchTerm = this.getSearchTerm(currentFile);
const results = await this.getResults(searchTerm);
await this.insertProperties(results[0]);
}
});
}
getSearchTerm(file) {
let searchTerm = file.basename;
const metadataCache = this.app.metadataCache.getFileCache(file);
if (metadataCache == null ? void 0 : metadataCache.frontmatter) {
searchTerm = metadataCache.frontmatter.address || metadataCache.frontmatter.title || searchTerm;
}
return searchTerm;
}
async getResults(searchTerm) {
const results = [];
try {
const { apiProvider, apiKey } = this.settings;
switch (apiProvider) {
case "free-geocoding-api":
results.push(
...await fetchFreeGeocodingAPIResults(
searchTerm,
apiKey
)
);
break;
case "google-geocoding":
results.push(
...await fetchGoogleGeocodingResults(
searchTerm,
apiKey
)
);
break;
default:
throw new Error(`Invalid API provider: ${apiProvider}`);
}
} catch (error) {
new import_obsidian6.Notice(String(error));
throw error;
}
if (!(results == null ? void 0 : results.length)) {
new import_obsidian6.Notice(`No results found for "${searchTerm}"`);
}
return results;
}
async insertProperties(result) {
const currentFile = this.app.workspace.getActiveFile();
if (!currentFile) {
return;
}
const { overrideExistingProperties, mapLinkProvider, properties } = this.settings;
this.app.fileManager.processFrontMatter(currentFile, (frontmatter) => {
for (const [key, property] of Object.entries(properties)) {
const shouldInsert = property.enabled && (overrideExistingProperties || frontmatter[property.frontmatterKey] === void 0);
if (!shouldInsert) {
continue;
}
switch (key) {
case "location":
frontmatter[property.frontmatterKey] = [
result.lat.toString(),
result.lng.toString()
];
break;
case "map_link":
switch (mapLinkProvider) {
case "google":
frontmatter[property.frontmatterKey] = makeGoogleMapsLink(result);
break;
case "apple":
frontmatter[property.frontmatterKey] = makeAppleMapsLink(result);
break;
case "osm":
frontmatter[property.frontmatterKey] = makeOsmLink(result);
break;
}
break;
case "map_view_link": {
frontmatter[property.frontmatterKey] = `[](geo:${result.lat},${result.lng})`;
break;
}
default:
frontmatter[property.frontmatterKey] = result[key];
break;
}
}
});
}
async loadSettings() {
this.settings = (0, import_deepmerge.default)(defaultSettings, await this.loadData() || {});
}
async saveSettings() {
await this.saveData(this.settings);
}
};
/* nosourcemap */

View File

@ -0,0 +1,10 @@
{
"id": "geocoding-properties",
"name": "Geocoding Properties",
"version": "2.0.2",
"minAppVersion": "0.15.0",
"description": "Insert address / location data from geocoding APIs as Obsidian properties.",
"author": "Jose Elias Alvarez",
"authorUrl": "https://github.com/jose-elias-alvarez",
"isDesktopOnly": false
}

185
.obsidian/plugins/global-proxy/main.js vendored Normal file
View File

@ -0,0 +1,185 @@
var import_obsidian = require("obsidian");
const DEFAULT_SETTINGS = {
enableProxy: false,
httpProxy: "",
httpsProxy: "",
socksProxy: "",
bypassRules: "<local>,127.*,10.*,172.16.*,172.17.*,172.18.*,172.19.*,172.20.*,172.21.*,172.22.*,172.23.*,172.24.*,172.25.*,172.26.*,172.27.*,172.28.*,172.29.*,172.30.*,172.31.*,192.168.*",
pluginTokens: "persist:surfing-vault-${appId}"
};
var GlobalProxyPlugin = class extends import_obsidian.Plugin {
async onload() {
await this.loadSettings();
this.addSettingTab(new GlobalProxySettingTab(this.app, this));
}
async onunload() {
this.disableProxy()
}
async loadSettings() {
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
this.sessionMap = {}
this.enableProxy();
}
async saveSettings() {
await this.saveData(this.settings);
}
async enableProxy() {
if (!this.settings.enableProxy) {
return;
}
let sessions = []
this.sessionMap.default = electron.remote.session.defaultSession
sessions.push(this.sessionMap.default)
if (!!this.settings.pluginTokens) {
let pluginTokens = this.settings.pluginTokens.split("\n");
for (var i = 0; i < pluginTokens.length; i++) {
if (!pluginTokens[i]) {
continue;
}
let token = pluginTokens[i].replace("${appId}", this.app.appId)
let session = await electron.remote.session.fromPartition(token)
sessions.push(session)
this.sessionMap[token] = session
}
}
let proxyRules = this.composeProxyRules(),
proxyBypassRules = proxyRules ? this.settings.bypassRules : undefined;
for (var i = 0; i < sessions.length; i++) {
await sessions[i].setProxy({ proxyRules, proxyBypassRules });
}
if (proxyRules) {
new import_obsidian.Notice('Enable proxy!');
}
}
async disableProxy() {
let sessions = []
for (const key in this.sessionMap) {
sessions.push(this.sessionMap[key])
}
for (var i = 0; i < sessions.length; i++) {
await sessions[i].setProxy({});
await sessions[i].closeAllConnections();
}
new import_obsidian.Notice('Disable proxy!');
}
composeProxyRules() {
if (!["socksProxy", "httpProxy", "httpsProxy"].
map((p) => !this.settings[p] || isValidFormat(this.settings[p])).reduce((res, check)=>{return res && check}, true)) {
return undefined;
}
const httpProxy= isValidFormat(this.settings.httpProxy) ? ";http=" + this.settings.httpProxy : "";
const httpsProxy= isValidFormat(this.settings.httpsProxy) ? ";https=" + this.settings.httpsProxy : "";
if (isValidFormat(this.settings.socksProxy)) {
return this.settings.socksProxy + httpProxy + httpsProxy + ",direct://"
} else if (!!httpProxy) {
return !!httpsProxy ? "http=" + this.settings.httpProxy + httpsProxy + ",direct://"
: this.settings.httpProxy + ",direct://"
} else if (!!httpsProxy) {
return this.settings.httpsProxy + ",direct://"
}
return undefined;
}
};
var GlobalProxySettingTab = class extends import_obsidian.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
const { containerEl } = this;
containerEl.empty();
new import_obsidian.Setting(containerEl)
.setName("Enable proxy")
.setDesc("Change your proxy status")
.addToggle((val) => val
.setValue(this.plugin.settings.enableProxy)
.onChange(async (value) => {
this.plugin.settings.enableProxy = value;
await this.plugin.saveSettings();
value ? this.plugin.enableProxy() : this.plugin.disableProxy();
}));
new import_obsidian.Setting(containerEl)
.setName("Socks Proxy")
.setDesc("Set up your socks proxy")
.addText((text) => text
.setPlaceholder("<scheme>://<host>:<port>")
.setValue(this.plugin.settings.socksProxy)
.onChange((value) => {
this.refreshProxy("socksProxy", value);
}));
new import_obsidian.Setting(containerEl)
.setName("Http Proxy")
.setDesc("Set up your http proxy")
.addText((text) => text
.setPlaceholder("<scheme>://<host>:<port>")
.setValue(this.plugin.settings.httpProxy)
.onChange((value) => {
this.refreshProxy("httpProxy", value);
}));
new import_obsidian.Setting(containerEl)
.setName("Https Proxy")
.setDesc("Set up your https proxy")
.addText((text) => text
.setPlaceholder("<scheme>://<host>:<port>")
.setValue(this.plugin.settings.httpsProxy)
.onChange((value) => {
this.refreshProxy("httpsProxy", value);
}));
new import_obsidian.Setting(containerEl)
.setName("Plugin Tokens")
.setDesc("For proxy specified plugins")
.addTextArea((text) => text
.setValue(this.plugin.settings.pluginTokens)
.onChange((value) => {
this.refreshProxy("pluginTokens", value);
}));
new import_obsidian.Setting(containerEl)
.setName("Blacklist")
.setDesc("Proxy blacklist")
.addTextArea((text) => text
.setPlaceholder("[URL_SCHEME://] HOSTNAME_PATTERN [:<port>]\n. HOSTNAME_SUFFIX_PATTERN [:PORT]\n[SCHEME://] IP_LITERAL [:PORT]\nIP_LITERAL / PREFIX_LENGTH_IN_BITS\n<local>")
.setValue(this.plugin.settings.bypassRules)
.onChange((value) => {
this.refreshProxy("bypassRules", value);
}));
}
async refreshProxy(key, value) {
this.plugin.settings[key] = value;
this.plugin.saveSettings();
this.plugin.enableProxy();
}
};
function isValidFormat(proxyUrl) {
if (!!proxyUrl) {
const regex = /^(\w+):\/\/([^:/]+):(\d+)$/;
const matches = proxyUrl.match(regex);
return !!matches;
}
return false;
}
module.exports = GlobalProxyPlugin;
/* nosourcemap */

View File

@ -0,0 +1,11 @@
{
"id": "global-proxy",
"name": "Global Proxy",
"version": "1.0.4",
"minAppVersion": "0.15.0",
"description": "Use network proxy throughout Obsidian according to the rules configured in this plugin.",
"author": "windingblack",
"fundingUrl": "https://www.buymeacoffee.com/windingblack",
"authorUrl": "https://github.com/windingblack",
"isDesktopOnly": true
}

4
.obsidian/plugins/homepage/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,13 @@
{
"id": "homepage",
"name": "Homepage",
"version": "4.2",
"minAppVersion": "1.4.10",
"description": "Open a specified note, canvas, or workspace on startup, or set it for quick access later.",
"author": "novov",
"authorUrl": "https://novov.me",
"isDesktopOnly": false,
"fundingUrl": {
"Ko-fi": "https://ko-fi.com/novov"
}
}

238
.obsidian/plugins/homepage/styles.css vendored Normal file
View File

@ -0,0 +1,238 @@
.nv-homepage-interstitial {
position: absolute;
left: 0;
top: 0;
width: 100vw;
height: 100vh;
background: var(--background-primary);
z-index: 9999;
animation: 0.02s ease-in 0.5s forwards nv-interstitial-destroy;
pointer-events: none;
}
@keyframes nv-interstitial-destroy {
from { opacity: 1; }
to { opacity: 0; }
}
.setting-item[nv-greyed] {
opacity: .5;
pointer-events: none !important;
}
#nv-main-setting {
flex-wrap: wrap;
margin-bottom: 30px;
}
#nv-main-setting .setting-item-control {
padding-top: var(--size-4-2);
flex-basis: 100%;
align-items: stretch;
}
#nv-main-setting .setting-item-control input, #nv-main-setting .setting-item-control select {
font-size: var(--font-ui-medium);
font-weight: 600;
}
#nv-main-setting .setting-item-control select {
padding: var(--size-4-3) var(--size-4-4);
padding-right: var(--size-4-8);
height: auto;
}
#nv-main-setting .setting-item-control input {
flex-grow: 1;
padding: var(--size-4-5) var(--size-4-4);
}
#nv-main-setting .setting-item-control input[disabled] {
opacity: 0.3;
}
#nv-main-setting #nv-desc, #nv-main-setting #nv-info {
flex-basis: 100%;
}
#nv-main-setting #nv-desc {
font-weight: 500;
color: var(--text-normal);
font-size: var(--font-ui-small);
padding: 10px 0 0;
}
#nv-main-setting #nv-desc.mod-warning {
color: var(--text-error);
}
#nv-main-setting #nv-desc code {
font-family: var(--font-monospace);
font-size: var(--font-smaller);
border-radius: var(--radius-s);
}
#nv-main-setting #nv-desc small {
display: block;
font-weight: 400;
color: var(--text-muted);
font-size: calc(var(--font-ui-smaller) * 0.9);
padding: 5px 0 0;
}
.nv-mobile-setting {
flex-wrap: wrap;
row-gap: var(--size-2-2);
}
.nv-mobile-setting .nv-mobile-info {
font-size: var(--font-ui-smaller);
width: 100%;
margin-right: var(--size-4-18);
}
.nv-command-desc {
padding: 1.2em 0 0;
border-top: 1px solid var(--background-modifier-border);
}
.nv-command-box {
margin: 1em 0 1.75em;
display: flex;
flex-wrap: wrap;
gap: 12px;
align-items: center;
}
.nv-command-pill {
background-color: var(--background-secondary);
border: 1px solid var(--background-modifier-border-hover);
border-radius: var(--radius-s);
font-size: var(--font-ui-small);
padding: var(--size-2-1) var(--size-2-2) var(--size-2-1) var(--size-2-3) ;
}
.nv-command-pill.nv-command-invalid {
color: var(--text-faint);
}
.nv-command-pill button {
display: inline-block;
padding: 0;
margin: 0 0 0 3px;
vertical-align: bottom;
}
.nv-command-pill button:first-of-type {
margin-left: var(--size-4-2);
}
.nv-command-pill button.nv-command-selected {
margin-left: var(--size-2-2);
padding: 0 var(--size-2-1);
}
.nv-command-pill button.nv-command-selected span {
color: var(--text-accent);
display: inline-block;
font-size: 0.9em;
vertical-align: top;
position: relative;
top: -1px;
}
.nv-command-pill > .svg-icon, .nv-command-pill button .svg-icon {
height: 1em;
width: 1em;
}
.nv-command-pill > .svg-icon {
vertical-align: text-bottom;
position: relative;
margin: 0 var(--size-2-1) 0 0;
}
.nv-command-pill.nv-dragging {
background-color: transparent;
}
.nv-command-add-button {
font-size: var(--font-ui-small);
padding: var(--size-2-2) var(--size-4-2);
height: auto;
}
#nv-main-setting + .setting-item, .nv-command-desc + .setting-item {
padding-top: 20px;
border-top: none !important;
}
.nv-debug-button {
margin: 3em 0 -0.2em;
font-size: var(--font-ui-smaller);
padding: 0;
height: auto;
float: right;
box-shadow: none !important;
background: none !important;
color: var(--text-accent);
font-weight: 600;
cursor: pointer;
}
.nv-debug-button:hover, .nv-debug-button:active {
text-decoration: underline;
}
.is-phone #nv-main-setting .setting-item-control {
flex-wrap: wrap;
justify-content: flex-start;
}
.is-phone #nv-main-setting .setting-item-control select {
width: auto;
max-width: auto;
}
.is-phone .nv-mobile-setting {
row-gap: var(--size-4-2);
}
.is-phone .nv-mobile-setting .setting-item-info {
max-width: calc(100% - 100px);
}
.is-phone .nv-mobile-setting {
row-gap: var(--size-4-2);
}
.is-phone .nv-mobile-setting .setting-item-info {
max-width: calc(100% - 100px);
}
.is-phone .nv-command-pill {
width: 100%;
border: none;
background: none;
padding: 0 0 var(--size-4-2);
display: flex;
gap: var(--size-4-4);
align-items: baseline;
}
.is-phone .nv-command-pill .nv-command-text {
flex-grow: 1;
overflow: hidden;
text-overflow: ellipsis;
}
.is-phone .nv-command-pill, .is-phone .nv-command-add-button {
font-size: var(--font-ui-medium);
justify-content: space-between;
}
.is-phone .nv-command-pill button {
line-height: var(--font-ui-medium);
height: 100%;
margin: 0 !important;
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,9 @@
{
"id": "infranodus-graph-view",
"name": "InfraNodus AI Graph View",
"version": "0.9.0",
"minAppVersion": "0.15.0",
"description": "Interactive 3D graph view: text analysis, topic modeling, gap detection, and AI.",
"author": "Nodus Labs",
"isDesktopOnly": false
}

View File

@ -0,0 +1 @@
.infranodus-plugin-yellow-highlight { background-color: yellow !important; }

View File

@ -0,0 +1,5 @@
{
"statusPropertyName": "status",
"showNotifications": true,
"debugMode": true
}

View File

@ -0,0 +1,480 @@
'use strict';
var obsidian = require('obsidian');
/******************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
var e = new Error(message);
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
};
const DEFAULT_SETTINGS = {
statusPropertyName: 'status',
showNotifications: false,
debugMode: false // Default to false for better performance
};
class KanbanStatusUpdaterPlugin extends obsidian.Plugin {
constructor() {
super(...arguments);
// Track active observers to disconnect them when not needed
this.currentObserver = null;
this.isProcessing = false;
this.activeKanbanBoard = null;
}
onload() {
return __awaiter(this, void 0, void 0, function* () {
console.log('Loading Kanban Status Updater plugin');
// Load settings
yield this.loadSettings();
// Display startup notification
if (this.settings.showNotifications) {
new obsidian.Notice('Kanban Status Updater activated');
}
this.log('Plugin loaded');
// Register DOM event listener for drag events - but only process if active leaf is Kanban
this.registerDomEvent(document, 'dragend', this.onDragEnd.bind(this));
this.log('Registered drag event listener');
// Watch for active leaf changes to only observe the current Kanban board
this.registerEvent(this.app.workspace.on('active-leaf-change', this.onActiveLeafChange.bind(this)));
// Initial check for active Kanban board
this.app.workspace.onLayoutReady(() => {
this.checkForActiveKanbanBoard();
});
// Add settings tab
this.addSettingTab(new KanbanStatusUpdaterSettingTab(this.app, this));
});
}
onunload() {
// Disconnect any active observers to prevent memory leaks
this.disconnectObservers();
this.log('Plugin unloaded');
}
loadSettings() {
return __awaiter(this, void 0, void 0, function* () {
this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
});
}
saveSettings() {
return __awaiter(this, void 0, void 0, function* () {
yield this.saveData(this.settings);
});
}
// Log helper with debug mode check
log(message) {
if (this.settings.debugMode) {
console.log(`[KSU] ${message}`);
}
}
// Clean up observers when switching away from a Kanban board
disconnectObservers() {
if (this.currentObserver) {
this.log('Disconnecting observer for performance');
this.currentObserver.disconnect();
this.currentObserver = null;
}
this.activeKanbanBoard = null;
}
// Check if the active leaf is a Kanban board
onActiveLeafChange(leaf) {
this.checkForActiveKanbanBoard();
}
checkForActiveKanbanBoard() {
var _a;
// First disconnect any existing observers
this.disconnectObservers();
// Get the active leaf using the non-deprecated API
const activeLeaf = this.app.workspace.getLeaf(false);
if (!activeLeaf)
return;
try {
// Find the content element safely
let contentEl = null;
// Use type assertions to avoid TypeScript errors
if (activeLeaf.view) {
// Try to access the contentEl property using type assertion
contentEl = activeLeaf.view.contentEl || null;
}
// If that didn't work, try another approach
if (!contentEl) {
// Try to get the Kanban board directly from the DOM
// Leaf containers have 'view-content' elements that contain the actual view
const viewContent = (_a = activeLeaf.containerEl) === null || _a === void 0 ? void 0 : _a.querySelector('.view-content');
if (viewContent) {
contentEl = viewContent;
}
else {
// Last resort - look for Kanban boards anywhere in the workspace
contentEl = document.querySelector('.workspace-leaf.mod-active .view-content');
}
}
if (!contentEl) {
this.log('Could not access content element for active leaf');
return;
}
// Check if this is a Kanban board
const kanbanBoard = contentEl.querySelector('.kanban-plugin__board');
if (kanbanBoard) {
this.log('Found active Kanban board, setting up observer');
// Store reference to active board
this.activeKanbanBoard = kanbanBoard;
// Set up observer only for this board
this.setupObserverForBoard(kanbanBoard);
}
else {
this.log('Active leaf is not a Kanban board');
}
}
catch (error) {
this.log(`Error detecting Kanban board: ${error.message}`);
}
}
setupObserverForBoard(boardElement) {
// Create a new observer for this specific board
this.currentObserver = new MutationObserver((mutations) => {
if (this.isProcessing)
return;
// Simple debounce to prevent rapid-fire processing
this.isProcessing = true;
setTimeout(() => {
this.handleMutations(mutations);
this.isProcessing = false;
}, 300);
});
// Observe only this board with minimal options needed
this.currentObserver.observe(boardElement, {
childList: true,
subtree: true,
attributes: false // Don't need attribute changes for performance
});
this.log('Observer set up for active Kanban board');
}
handleMutations(mutations) {
if (!this.activeKanbanBoard)
return;
try {
const max_mutations = 10;
// Only process a sample of mutations for performance
const mutationsToProcess = mutations.length > max_mutations ?
mutations.slice(0, max_mutations) : mutations;
this.log(`Got ${mutationsToProcess.length} mutations of ${mutations.length}`);
// Look for Kanban items in mutation
let i = 0;
for (const mutation of mutationsToProcess) {
this.log(`Mutation #${++i} - Type: ${mutation.type}`);
if (mutation.type === 'childList') {
// Check added nodes for Kanban items
for (const node of Array.from(mutation.addedNodes)) {
try {
// Check if node is any kind of Element (HTML or SVG)
if (node instanceof Element) {
this.log(`Processing Element of type: ${node.tagName}`);
// Handle the node according to its type
if (node instanceof HTMLElement || node instanceof HTMLDivElement) {
// Direct processing for HTML elements
this.log(`Found HTML element of type ${node.className}`);
this.processElement(node);
}
else if (node instanceof SVGElement) {
// For SVG elements, look for parent HTML element
const parentElement = node.closest('.kanban-plugin__item');
if (parentElement) {
this.log('Found Kanban item parent of SVG element');
this.processElement(parentElement);
}
else {
// Look for any kanban items in the document that might have changed
// This is for cases where the SVG update is related to a card movement
const items = this.activeKanbanBoard.querySelectorAll('.kanban-plugin__item');
if (items.length > 0) {
// Process only the most recently modified item
const recentItems = Array.from(items).slice(-1);
for (const item of recentItems) {
this.log('Processing recent item after SVG change');
this.processElement(item);
}
}
}
}
}
else if (node.nodeType === Node.TEXT_NODE) {
// For text nodes, check the parent element
const parentElement = node.parentElement;
if (parentElement && (parentElement.classList.contains('kanban-plugin__item-title') ||
parentElement.closest('.kanban-plugin__item'))) {
this.log('Found text change in Kanban item');
const itemElement = parentElement.closest('.kanban-plugin__item');
if (itemElement) {
this.processElement(itemElement);
}
}
}
else {
this.log(`Skipping node type: ${node.nodeType}`);
}
}
catch (nodeError) {
this.log(`Error processing node: ${nodeError.message}`);
// Continue with next node even if this one fails
}
}
}
else {
this.log('Ignoring mutation type: ' + mutation.type);
}
}
}
catch (error) {
this.log(`Error in handleMutations: ${error.message}`);
}
}
onDragEnd(event) {
// Only process if we have an active Kanban board
if (!this.activeKanbanBoard || this.isProcessing) {
this.log('Drag end detected but no active Kanban board or already processing');
this.log('activeKanbanBoard: ' + (this.activeKanbanBoard ? 'Yes' : 'No'));
this.log('isProcessing: ' + (this.isProcessing ? 'Yes' : 'No'));
return;
}
try {
this.log('Drag end detected');
// Set processing flag to prevent multiple processing
this.isProcessing = true;
const target = event.target;
if (!target)
return;
this.processElement(target);
}
catch (error) {
this.log(`Error in onDragEnd: ${error.message}`);
}
finally {
// Reset processing flag after a delay to debounce
setTimeout(() => {
this.isProcessing = false;
}, 300);
}
}
processElement(element) {
try {
// Only process if inside our active Kanban board
if (!this.activeKanbanBoard || !element.closest('.kanban-plugin__board')) {
this.log('Element NOT in active Kanban board. Skipping.');
return;
}
// Use different strategies to find the Kanban item
this.log("👀 Looking for Kanban item element");
// Check if element is a Kanban item or contains one
const kanbanItem = element.classList.contains('kanban-plugin__item')
? element
: element.querySelector('.kanban-plugin__item');
if (kanbanItem) {
this.log(`✅ Found Kanban item: ${kanbanItem}`);
this.log('classList of kanbanItem: ' + kanbanItem.classList);
this.processKanbanItem(kanbanItem);
return;
}
this.log('Not a Kanban item, checking for parent');
// If element is inside a Kanban item, find the parent
const parentItem = element.closest('.kanban-plugin__item');
this.log(`Parent item: ${parentItem ? parentItem : 'Not found'}`);
if (parentItem) {
this.processKanbanItem(parentItem);
return;
}
}
catch (error) {
this.log(`Error in processElement: ${error.message}`);
}
}
processKanbanItem(itemElement) {
try {
// TODO: Select the title
const internalLink = itemElement.querySelector('.kanban-plugin__item-title .kanban-plugin__item-markdown a.internal-link');
if (!internalLink) {
this.log('🚫 No internal link found in item');
return;
}
this.log(`Found internal link: ${internalLink.textContent}`);
// Get the link path from data-href or href attribute
const linkPath = internalLink.getAttribute('data-href') ||
internalLink.getAttribute('href');
if (!linkPath)
return;
this.log(`🔗 Link path: ${linkPath}`);
// Find the lane (column) this item is in
const lane = itemElement.closest('.kanban-plugin__lane');
if (!lane) {
this.log('🚫 No lane found for item');
return;
}
// Get column name from the lane header
const laneHeader = lane.querySelector('.kanban-plugin__lane-header-wrapper .kanban-plugin__lane-title');
if (!laneHeader) {
this.log('🚫 No laneHeader found for item');
return;
}
const columnName = laneHeader.textContent.trim();
this.log(`✅ Got lane name: ${columnName}`);
this.log(`Processing card with link to "${linkPath}" in column "${columnName}"`);
// Update the linked note's status
this.updateNoteStatus(linkPath, columnName);
}
catch (error) {
this.log(`Error in processKanbanItem: ${error.message}`);
}
}
updateNoteStatus(notePath, status) {
return __awaiter(this, void 0, void 0, function* () {
try {
// Find the linked file
const file = this.app.metadataCache.getFirstLinkpathDest(notePath, '');
if (!file) {
if (this.settings.showNotifications) {
new obsidian.Notice(`⚠️ Note "${notePath}" not found`, 3000);
}
return;
}
// Get current status if it exists
const metadata = this.app.metadataCache.getFileCache(file);
let oldStatus = null;
if ((metadata === null || metadata === void 0 ? void 0 : metadata.frontmatter) && metadata.frontmatter[this.settings.statusPropertyName]) {
oldStatus = metadata.frontmatter[this.settings.statusPropertyName];
}
// Only update if status has changed
if (oldStatus !== status) {
// Use the processFrontMatter API to update the frontmatter
yield this.app.fileManager.processFrontMatter(file, (frontmatter) => {
// Set the status property
frontmatter[this.settings.statusPropertyName] = status;
});
// Show notification if enabled
if (this.settings.showNotifications) {
if (oldStatus) {
new obsidian.Notice(`Updated ${this.settings.statusPropertyName}: "${oldStatus}" → "${status}" for ${file.basename}`, 3000);
}
else {
new obsidian.Notice(`Set ${this.settings.statusPropertyName}: "${status}" for ${file.basename}`, 3000);
}
}
this.log(`Updated status for ${file.basename} to "${status}"`);
}
else {
this.log(`Status already set to "${status}" for ${file.basename}, skipping update`);
}
}
catch (error) {
this.log(`Error updating note status: ${error.message}`);
if (this.settings.showNotifications) {
new obsidian.Notice(`⚠️ Error updating status: ${error.message}`, 3000);
}
}
});
}
// Method for the test button to use
runTest() {
this.log('Running test...');
// Make sure we're using the current active board
this.checkForActiveKanbanBoard();
if (!this.activeKanbanBoard) {
new obsidian.Notice('⚠️ No active Kanban board found - open a Kanban board first', 5000);
return;
}
// Find items in the active board
const items = this.activeKanbanBoard.querySelectorAll('.kanban-plugin__item');
const count = items.length;
new obsidian.Notice(`Found ${count} cards in active Kanban board`, 3000);
if (count > 0) {
// Process the first item with a link
for (let i = 0; i < count; i++) {
const item = items[i];
if (item.querySelector('a.internal-link')) {
new obsidian.Notice(`Testing with card: "${item.textContent.substring(0, 20)}..."`, 3000);
this.processKanbanItem(item);
break;
}
}
}
}
}
class KanbanStatusUpdaterSettingTab extends obsidian.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
const { containerEl } = this;
containerEl.empty();
new obsidian.Setting(containerEl)
.setName('Status property name')
.setDesc('The name of the property to update when a card is moved')
.addText(text => text
.setPlaceholder('status')
.setValue(this.plugin.settings.statusPropertyName)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.statusPropertyName = value;
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName('Show notifications')
.setDesc('Show a notification when a status is updated')
.addToggle(toggle => toggle
.setValue(this.plugin.settings.showNotifications)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.showNotifications = value;
yield this.plugin.saveSettings();
})));
new obsidian.Setting(containerEl)
.setName('Debug mode')
.setDesc('Enable detailed logging (reduces performance)')
.addToggle(toggle => toggle
.setValue(this.plugin.settings.debugMode)
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
this.plugin.settings.debugMode = value;
yield this.plugin.saveSettings();
if (value) {
new obsidian.Notice('Debug mode enabled - check console for logs', 3000);
}
else {
new obsidian.Notice('Debug mode disabled', 3000);
}
})));
// Add a test button
new obsidian.Setting(containerEl)
.setName('Test plugin')
.setDesc('Test with current Kanban board')
.addButton(button => button
.setButtonText('Run Test')
.onClick(() => {
this.plugin.runTest();
}));
}
}
module.exports = KanbanStatusUpdaterPlugin;
/* nosourcemap */

View File

@ -0,0 +1,10 @@
{
"id": "kanban-status-updater",
"name": "Kanban Status Updater",
"version": "1.0.0",
"minAppVersion": "1.1.0",
"description": "Automatically updates a 'status' property in a note when its card is moved on a Kanban board",
"author": "Ankit Kapur",
"authorUrl": "https://github.com/ankit-kapur",
"isDesktopOnly": false
}

View File

@ -0,0 +1,13 @@
/* styles.css for Kanban Status Updater */
/* Status bar styling - minimal to ensure good performance */
.kanban-status-updater-statusbar {
color: var(--text-accent);
font-size: 0.8em;
padding: 0 8px;
opacity: 0.8;
}
.kanban-status-updater-statusbar:hover {
opacity: 1;
}

25
.obsidian/plugins/metaedit/data.json vendored Normal file
View File

@ -0,0 +1,25 @@
{
"ProgressProperties": {
"enabled": true,
"properties": []
},
"IgnoredProperties": {
"enabled": false,
"properties": []
},
"AutoProperties": {
"enabled": true,
"properties": []
},
"EditMode": {
"mode": "All Single",
"properties": []
},
"KanbanHelper": {
"enabled": true,
"boards": []
},
"UIElements": {
"enabled": true
}
}

5540
.obsidian/plugins/metaedit/main.js vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,10 @@
{
"id": "metaedit",
"name": "MetaEdit",
"version": "1.8.2",
"minAppVersion": "1.4.1",
"description": "MetaEdit helps you manage your metadata.",
"author": "Christian B. B. Houmann",
"authorUrl": "https://bagerbach.com",
"isDesktopOnly": false
}

15
.obsidian/plugins/metaedit/styles.css vendored Normal file
View File

@ -0,0 +1,15 @@
.centerSettingContent {
display: grid;
align-items: center;
justify-content: center;
}
.not-a-button {
background: none;
color: inherit;
border: none;
padding: 0;
font: inherit;
cursor: pointer;
outline: inherit;
}

View File

@ -28,7 +28,7 @@
"gitDir": "",
"showFileMenu": true,
"authorInHistoryView": "hide",
"dateInHistoryView": false,
"dateInHistoryView": true,
"diffStyle": "split",
"lineAuthor": {
"show": false,
@ -51,7 +51,9 @@
},
"textColorCss": "var(--text-muted)",
"ignoreWhitespace": false,
"gutterSpacingFallbackLength": 5
"gutterSpacingFallbackLength": 5,
"lastShownAuthorDisplay": "initials",
"lastShownDateTimeFormatOptions": "date"
},
"autoCommitMessage": "vault backup: {{date}}"
}

View File

@ -0,0 +1,15 @@
{
"new-note-template": "templates/kanban_template.md",
"show-checkboxes": false,
"hide-card-count": true,
"link-date-to-daily-note": true,
"metadata-keys": [
{
"metadataKey": "status",
"label": "status",
"shouldHideLabel": false,
"containsMarkdown": false
}
],
"new-note-folder": "kanban/notes"
}

View File

@ -0,0 +1,292 @@
{
"ruleConfigs": {
"add-blank-line-after-yaml": {
"enabled": false
},
"dedupe-yaml-array-values": {
"enabled": false,
"dedupe-alias-key": true,
"dedupe-tag-key": true,
"dedupe-array-keys": true,
"ignore-keys": ""
},
"escape-yaml-special-characters": {
"enabled": false,
"try-to-escape-single-line-arrays": false
},
"force-yaml-escape": {
"enabled": false,
"force-yaml-escape-keys": ""
},
"format-tags-in-yaml": {
"enabled": false
},
"format-yaml-array": {
"enabled": false,
"alias-key": true,
"tag-key": true,
"default-array-style": "single-line",
"default-array-keys": true,
"force-single-line-array-style": "",
"force-multi-line-array-style": ""
},
"insert-yaml-attributes": {
"enabled": false,
"text-to-insert": "aliases: \ntags: "
},
"move-tags-to-yaml": {
"enabled": false,
"how-to-handle-existing-tags": "Nothing",
"tags-to-ignore": ""
},
"remove-yaml-keys": {
"enabled": false,
"yaml-keys-to-remove": ""
},
"sort-yaml-array-values": {
"enabled": false,
"sort-alias-key": true,
"sort-tag-key": true,
"sort-array-keys": true,
"ignore-keys": "",
"sort-order": "Ascending Alphabetical"
},
"yaml-key-sort": {
"enabled": false,
"yaml-key-priority-sort-order": "",
"priority-keys-at-start-of-yaml": true,
"yaml-sort-order-for-other-keys": "None"
},
"yaml-timestamp": {
"enabled": false,
"date-created": true,
"date-created-key": "date created",
"date-created-source-of-truth": "file system",
"date-modified": true,
"date-modified-key": "date modified",
"date-modified-source-of-truth": "file system",
"format": "dddd, MMMM Do YYYY, h:mm:ss a",
"convert-to-utc": false,
"update-on-file-contents-updated": "never"
},
"yaml-title": {
"enabled": false,
"title-key": "title",
"mode": "first-h1-or-filename-if-h1-missing"
},
"yaml-title-alias": {
"enabled": false,
"preserve-existing-alias-section-style": true,
"keep-alias-that-matches-the-filename": false,
"use-yaml-key-to-keep-track-of-old-filename-or-heading": true,
"alias-helper-key": "linter-yaml-title-alias"
},
"capitalize-headings": {
"enabled": false,
"style": "Title Case",
"ignore-case-words": true,
"ignore-words": "macOS, iOS, iPhone, iPad, JavaScript, TypeScript, AppleScript, I",
"lowercase-words": "a, an, the, aboard, about, abt., above, abreast, absent, across, after, against, along, aloft, alongside, amid, amidst, mid, midst, among, amongst, anti, apropos, around, round, as, aslant, astride, at, atop, ontop, bar, barring, before, B4, behind, below, beneath, neath, beside, besides, between, 'tween, beyond, but, by, chez, circa, c., ca., come, concerning, contra, counting, cum, despite, spite, down, during, effective, ere, except, excepting, excluding, failing, following, for, from, in, including, inside, into, less, like, minus, modulo, mod, near, nearer, nearest, next, notwithstanding, of, o', off, offshore, on, onto, opposite, out, outside, over, o'er, pace, past, pending, per, plus, post, pre, pro, qua, re, regarding, respecting, sans, save, saving, short, since, sub, than, through, thru, throughout, thruout, till, times, to, t', touching, toward, towards, under, underneath, unlike, until, unto, up, upon, versus, vs., v., via, vice, vis-à-vis, wanting, with, w/, w., c̄, within, w/i, without, 'thout, w/o, abroad, adrift, aft, afterward, afterwards, ahead, apart, ashore, aside, away, back, backward, backwards, beforehand, downhill, downstage, downstairs, downstream, downward, downwards, downwind, east, eastward, eastwards, forth, forward, forwards, heavenward, heavenwards, hence, henceforth, here, hereby, herein, hereof, hereto, herewith, home, homeward, homewards, indoors, inward, inwards, leftward, leftwards, north, northeast, northward, northwards, northwest, now, onward, onwards, outdoors, outward, outwards, overboard, overhead, overland, overseas, rightward, rightwards, seaward, seawards, skywards, skyward, south, southeast, southwards, southward, southwest, then, thence, thenceforth, there, thereby, therein, thereof, thereto, therewith, together, underfoot, underground, uphill, upstage, upstairs, upstream, upward, upwards, upwind, west, westward, westwards, when, whence, where, whereby, wherein, whereto, wherewith, although, because, considering, given, granted, if, lest, once, provided, providing, seeing, so, supposing, though, unless, whenever, whereas, wherever, while, whilst, ago, according to, as regards, counter to, instead of, owing to, pertaining to, at the behest of, at the expense of, at the hands of, at risk of, at the risk of, at variance with, by dint of, by means of, by virtue of, by way of, for the sake of, for sake of, for lack of, for want of, from want of, in accordance with, in addition to, in case of, in charge of, in compliance with, in conformity with, in contact with, in exchange for, in favor of, in front of, in lieu of, in light of, in the light of, in line with, in place of, in point of, in quest of, in relation to, in regard to, with regard to, in respect to, with respect to, in return for, in search of, in step with, in touch with, in terms of, in the name of, in view of, on account of, on behalf of, on grounds of, on the grounds of, on the part of, on top of, with a view to, with the exception of, à la, a la, as soon as, as well as, close to, due to, far from, in case, other than, prior to, pursuant to, regardless of, subsequent to, as long as, as much as, as far as, by the time, in as much as, inasmuch, in order to, in order that, even, provide that, if only, whether, whose, whoever, why, how, or not, whatever, what, both, and, or, not only, but also, either, neither, nor, just, rather, no sooner, such, that, yet, is, it"
},
"file-name-heading": {
"enabled": false
},
"header-increment": {
"enabled": false,
"start-at-h2": false
},
"headings-start-line": {
"enabled": false
},
"remove-trailing-punctuation-in-heading": {
"enabled": false,
"punctuation-to-remove": ".,;:!。,;:!"
},
"footnote-after-punctuation": {
"enabled": false
},
"move-footnotes-to-the-bottom": {
"enabled": false
},
"re-index-footnotes": {
"enabled": false
},
"auto-correct-common-misspellings": {
"enabled": false,
"ignore-words": "",
"skip-words-with-multiple-capitals": false,
"extra-auto-correct-files": []
},
"blockquote-style": {
"enabled": false,
"style": "space"
},
"convert-bullet-list-markers": {
"enabled": false
},
"default-language-for-code-fences": {
"enabled": false,
"default-language": ""
},
"emphasis-style": {
"enabled": false,
"style": "consistent"
},
"no-bare-urls": {
"enabled": false,
"no-bare-uris": false
},
"ordered-list-style": {
"enabled": false,
"number-style": "ascending",
"list-end-style": "."
},
"proper-ellipsis": {
"enabled": false
},
"quote-style": {
"enabled": false,
"single-quote-enabled": true,
"single-quote-style": "''",
"double-quote-enabled": true,
"double-quote-style": "\"\""
},
"remove-consecutive-list-markers": {
"enabled": false
},
"remove-empty-list-markers": {
"enabled": false
},
"remove-hyphenated-line-breaks": {
"enabled": false
},
"remove-multiple-spaces": {
"enabled": false
},
"strong-style": {
"enabled": false,
"style": "consistent"
},
"two-spaces-between-lines-with-content": {
"enabled": false,
"line-break-indicator": " "
},
"unordered-list-style": {
"enabled": false,
"list-style": "consistent"
},
"compact-yaml": {
"enabled": false,
"inner-new-lines": false
},
"consecutive-blank-lines": {
"enabled": false
},
"convert-spaces-to-tabs": {
"enabled": false,
"tabsize": 4
},
"empty-line-around-blockquotes": {
"enabled": false
},
"empty-line-around-code-fences": {
"enabled": false
},
"empty-line-around-horizontal-rules": {
"enabled": false
},
"empty-line-around-math-blocks": {
"enabled": false
},
"empty-line-around-tables": {
"enabled": false
},
"heading-blank-lines": {
"enabled": false,
"bottom": true,
"empty-line-after-yaml": true
},
"line-break-at-document-end": {
"enabled": false
},
"move-math-block-indicators-to-their-own-line": {
"enabled": false
},
"paragraph-blank-lines": {
"enabled": false
},
"remove-empty-lines-between-list-markers-and-checklists": {
"enabled": false
},
"remove-link-spacing": {
"enabled": false
},
"remove-space-around-characters": {
"enabled": false,
"include-fullwidth-forms": true,
"include-cjk-symbols-and-punctuation": true,
"include-dashes": true,
"other-symbols": ""
},
"remove-space-before-or-after-characters": {
"enabled": false,
"characters-to-remove-space-before": ",!?;:).’”]",
"characters-to-remove-space-after": "¿¡‘“(["
},
"space-after-list-markers": {
"enabled": false
},
"space-between-chinese-japanese-or-korean-and-english-or-numbers": {
"enabled": false,
"english-symbols-punctuation-before": "-+;:'\"°%$)]",
"english-symbols-punctuation-after": "-+'\"([¥$"
},
"trailing-spaces": {
"enabled": false,
"twp-space-line-break": false
},
"add-blockquote-indentation-on-paste": {
"enabled": false
},
"prevent-double-checklist-indicator-on-paste": {
"enabled": false
},
"prevent-double-list-item-indicator-on-paste": {
"enabled": false
},
"proper-ellipsis-on-paste": {
"enabled": false
},
"remove-hyphens-on-paste": {
"enabled": false
},
"remove-leading-or-trailing-whitespace-on-paste": {
"enabled": false
},
"remove-leftover-footnotes-from-quote-on-paste": {
"enabled": false
},
"remove-multiple-blank-lines-on-paste": {
"enabled": false
}
},
"lintOnSave": true,
"recordLintOnSaveLogs": false,
"displayChanged": true,
"lintOnFileChange": true,
"displayLintOnFileChangeNotice": true,
"settingsConvertedToConfigKeyValues": true,
"foldersToIgnore": [],
"filesToIgnore": [],
"linterLocale": "system-default",
"logLevel": "ERROR",
"lintCommands": [],
"customRegexes": [],
"commonStyles": {
"aliasArrayStyle": "single-line",
"tagArrayStyle": "single-line",
"minimumNumberOfDollarSignsToBeAMathBlock": 2,
"escapeCharacter": "\"",
"removeUnnecessaryEscapeCharsForMultiLineArrays": false
}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,11 @@
{
"id": "obsidian-linter",
"name": "Linter",
"version": "1.28.0",
"minAppVersion": "1.5.7",
"description": "Formats and styles your notes. It can be used to format YAML tags, aliases, arrays, and metadata; footnotes; headings; spacing; math blocks; regular markdown contents like list, italics, and bold styles; and more with the use of custom rule options as well.",
"author": "Victor Tao",
"authorUrl": "https://github.com/platers",
"helpUrl": "https://platers.github.io/obsidian-linter/",
"isDesktopOnly": false
}

View File

@ -0,0 +1 @@
.linter-navigation-item{align-items:center;background-color:var(--background-primary-secondary-alt);border:1px solid var(--background-modifier-border);border-radius:100px;border-radius:8px 8px 2px 2px;cursor:pointer;display:flex;flex-direction:row;font-size:16px;font-weight:700;gap:4px;height:32px;overflow:hidden;padding:4px 6px;transition:color .25s ease-in-out,padding .25s ease-in-out,background-color .35s cubic-bezier(.45,.25,.83,.67),max-width .35s cubic-bezier(.57,.04,.58,1);white-space:nowrap}@media screen and (max-width:1325px){.linter-navigation-item.linter-desktop{max-width:32px}}@media screen and (max-width:800px){.linter-navigation-item.linter-mobile{max-width:32px}}.linter-navigation-item-icon,.linter-warning{padding-top:5px}.linter-navigation-item:hover{border-color:var(--interactive-accent-hover);border-bottom:0}.linter-navigation-item-selected{background-color:var(--interactive-accent)!important;border:1px solid var(--background-modifier-border);border-bottom:0;border-radius:8px 8px 2px 2px;color:var(--text-on-accent);max-width:100%!important;padding:4px 9px!important;transition:color .25s ease-in-out,padding .25s ease-in-out,background-color .35s cubic-bezier(.45,.25,.83,.67),max-width .45s cubic-bezier(.57,.04,.58,1) .2s}.linter{transition:transform .4s 0s}.linter-setting-title{align-items:baseline;display:flex;gap:30px;justify-content:space-between}.linter-setting-title.linter-mobile{justify-content:space-around}.linter-setting-title h1{font-weight:900;margin-bottom:12px;margin-top:6px}.linter-setting-header{margin-bottom:24px;overflow-x:auto;overflow-y:hidden}.linter-setting-header .linter-setting-tab-group{align-items:flex-end;display:flex;flex-wrap:wrap;width:100%}.linter-setting-tab-group{border-bottom:2px solid var(--background-modifier-border);margin-top:6px;padding-left:2px;padding-right:2px}.linter-setting-header .linter-tab-settings{border-left:2px solid transparent;border-right:2px solid transparent;cursor:pointer;font-weight:600;padding:6px 12px;white-space:nowrap}.linter-setting-header .linter-tab-settings:first-child{margin-left:6px}.linter-setting-header .linter-tab-settings.linter-tab-settings-active{border:2px solid var(--background-modifier-border);border-bottom-color:var(--background-primary);border-radius:2px;transform:translateY(2px)}.linter-navigation-item:not(.linter-navigation-item-selected)>span:nth-child(2),.linter-visually-hidden{border:0;clip:rect(0 0 0 0);clip-path:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}textarea.full-width{margin-bottom:.8em;margin-top:.8em;min-height:10em;width:100%}.full-width-textbox-input-wrapper{position:relative}.settings-copy-button{margin:0 0 0 auto;padding:4px;position:absolute;right:.8em;top:.8em}.settings-copy-button svg.linter-clipboard path{fill:var(--text-faint)}.settings-copy-button svg.linter-success path{fill:var(--interactive-success)}.settings-copy-button:active,.settings-copy-button:hover{cursor:pointer}.settings-copy-button:active svg path,.settings-copy-button:hover svg path{fill:var(--text-accent-hover);transition:all .3s ease}.settings-copy-button:focus{outline:0}.linter-custom-regex-replacement-container div:last-child{border:none}.linter-custom-regex-replacement{border:none;border-bottom:var(--hr-thickness) solid;border-color:var(--hr-color);margin-bottom:15px}.linter-custom-regex-replacement-row2{flex-wrap:wrap}.linter-custom-regex-replacement-normal-input{width:40%}.linter-custom-regex-replacement-flags{width:15%}.linter-custom-regex-replacement-label{flex-direction:row-reverse}.linter-custom-regex-replacement-label-input{width:50%}.linter-files-to-ignore-container div:last-child{border:none}.linter-files-to-ignore{border:none;border-bottom:var(--hr-thickness) solid;border-color:var(--hr-color);margin-bottom:15px}.linter-files-to-ignore-normal-input{width:40%}.linter-files-to-ignore-flags{width:15%}.linter-no-border{border:none}.linter-border-bottom{border-bottom:1px solid var(--background-modifier-border);border-top:0;margin-bottom:.75em}.linter-no-padding-top{padding-top:0}.custom-row-description{margin-top:0}.modal-warn,.search-zero-state{font-weight:700}.modal-heading,.search-zero-state{text-align:center}

42
.obsidian/plugins/omnisearch/data.json vendored Normal file
View File

@ -0,0 +1,42 @@
{
"useCache": true,
"hideExcluded": false,
"recencyBoost": "0",
"downrankedFoldersFilters": [],
"ignoreDiacritics": true,
"ignoreArabicDiacritics": false,
"indexedFileTypes": [],
"displayTitle": "",
"PDFIndexing": false,
"officeIndexing": false,
"imagesIndexing": false,
"aiImageIndexing": false,
"unsupportedFilesIndexing": "default",
"splitCamelCase": false,
"openInNewPane": false,
"vimLikeNavigationShortcut": true,
"ribbonIcon": true,
"showExcerpt": true,
"maxEmbeds": 5,
"renderLineReturnInExcerpts": true,
"showCreateButton": false,
"highlight": true,
"showPreviousQueryResults": true,
"simpleSearch": true,
"tokenizeUrls": false,
"fuzziness": "1",
"weightBasename": 10,
"weightDirectory": 7,
"weightH1": 6,
"weightH2": 5,
"weightH3": 4,
"weightUnmarkedTags": 2,
"weightCustomProperties": [],
"httpApiEnabled": false,
"httpApiPort": "51361",
"httpApiNotice": true,
"welcomeMessage": "1.21.0",
"verboseLogging": false,
"DANGER_httpHost": null,
"DANGER_forceSaveCache": false
}

109
.obsidian/plugins/omnisearch/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,14 @@
{
"id": "omnisearch",
"name": "Omnisearch",
"version": "1.26.1",
"minAppVersion": "1.7.2",
"description": "A search engine that just works",
"author": "Simon Cambier",
"authorUrl": "https://github.com/scambier/obsidian-omnisearch",
"fundingUrl": {
"Github": "https://github.com/sponsors/scambier",
"Ko-fi": "https://ko-fi.com/scambier"
},
"isDesktopOnly": false
}

135
.obsidian/plugins/omnisearch/styles.css vendored Normal file
View File

@ -0,0 +1,135 @@
.omnisearch-modal {
}
.omnisearch-result {
white-space: normal;
display: flex;
flex-direction: row;
/* justify-content: space-between; */
flex-wrap: nowrap;
}
.omnisearch-result__title-container {
display: flex;
align-items: center;
justify-content: space-between;
column-gap: 5px;
flex-wrap: wrap;
}
.omnisearch-result__title {
white-space: pre-wrap;
align-items: center;
display: flex;
gap: 5px;
}
.omnisearch-result__title > span {
}
.omnisearch-result__folder-path {
font-size: 0.75rem;
align-items: center;
display: flex;
gap: 5px;
color: var(--text-muted);
}
.omnisearch-result__extension {
font-size: 0.7rem;
color: var(--text-muted);
}
.omnisearch-result__counter {
font-size: 0.7rem;
color: var(--text-muted);
}
.omnisearch-result__body {
white-space: normal;
font-size: small;
word-wrap: normal;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
color: var(--text-muted);
margin-inline-start: 0.5em;
}
.omnisearch-result__embed {
margin-left: 1em;
}
.omnisearch-result__image-container {
flex-basis: 20%;
text-align: end;
}
.omnisearch-highlight {
}
.omnisearch-default-highlight {
text-decoration: underline;
text-decoration-color: var(--text-highlight-bg);
text-decoration-thickness: 3px;
text-underline-offset: -1px;
text-decoration-skip-ink: none;
}
.omnisearch-input-container {
display: flex;
align-items: center;
flex-direction: row;
gap: 5px;
}
.omnisearch-result__icon {
display: inline-block;
vertical-align: middle;
width: 16px;
height: 16px;
margin-right: 4px;
}
.omnisearch-result__icon svg {
width: 100%;
height: 100%;
}
.omnisearch-result__icon--emoji {
font-size: 16px;
vertical-align: middle;
margin-right: 4px;
}
@media only screen and (max-width: 600px) {
.omnisearch-input-container {
flex-direction: column;
}
.omnisearch-input-container__buttons {
display: flex;
flex-direction: row;
width: 100%;
padding: 0 1em 0 1em;
gap: 1em;
}
.omnisearch-input-container__buttons > button {
flex-grow: 1;
}
}
@media only screen and (min-width: 600px) {
.omnisearch-input-container__buttons {
margin-inline-end: 1em;
}
}
.omnisearch-input-field {
position: relative;
flex-grow: 1;
}

6
.obsidian/plugins/pane-relief/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,10 @@
{
"id": "pane-relief",
"name": "Pane Relief",
"version": "0.5.9",
"minAppVersion": "1.5.8",
"description": "Per-tab history, hotkeys for pane/tab movement, navigation, sliding workspace, and more",
"author": "PJ Eby",
"authorUrl": "https://github.com/pjeby",
"isDesktopOnly": true
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,180 @@
{
"recentFiles": [
{
"basename": "freqtrade_基础",
"path": "new notes/freqtrade_基础.md"
},
{
"basename": "freqtrade_理解消化",
"path": "new notes/freqtrade_理解消化.md"
},
{
"basename": "freqtrade",
"path": "new notes/freqtrade.md"
},
{
"basename": "节点角色更新",
"path": "new notes/节点角色更新.md"
},
{
"basename": "如何触发",
"path": "new notes/如何触发.md"
},
{
"basename": "04_Go语言相关工具",
"path": "量化交易系统建议/04_Go语言相关工具.md"
},
{
"basename": "09_解耦设计实现灵活架构",
"path": "量化交易系统建议/09_解耦设计实现灵活架构.md"
},
{
"basename": "01_量化交易辅助决策开源项目",
"path": "量化交易系统建议/01_量化交易辅助决策开源项目.md"
},
{
"basename": "06_传统量化交易路线图",
"path": "量化交易系统建议/06_传统量化交易路线图.md"
},
{
"basename": "07_基于机器学习的量化交易路线图",
"path": "量化交易系统建议/07_基于机器学习的量化交易路线图.md"
},
{
"basename": "02_CCXT详细介绍",
"path": "量化交易系统建议/02_CCXT详细介绍.md"
},
{
"basename": "05_机器学习相关工具",
"path": "量化交易系统建议/05_机器学习相关工具.md"
},
{
"basename": "08_Redis与Elasticsearch的应用",
"path": "量化交易系统建议/08_Redis与Elasticsearch的应用.md"
},
{
"basename": "03_辅助决策工具",
"path": "量化交易系统建议/03_辅助决策工具.md"
},
{
"basename": "kanban_template",
"path": "templates/kanban_template.md"
},
{
"basename": "allNotes.md",
"path": "templates/allNotes.md.md"
},
{
"basename": "daily_template",
"path": "templates/daily_template.md"
},
{
"basename": "base_template",
"path": "templates/base_template.md"
},
{
"basename": "阅读笔记",
"path": "templates/阅读笔记.md"
},
{
"basename": "Untitled 1",
"path": "new notes/Untitled 1.md"
},
{
"basename": "Untitled",
"path": "new notes/Untitled.md"
},
{
"basename": "populate_indicators函数",
"path": "new notes/populate_indicators函数.md"
},
{
"basename": "neo-vim_ai 编程辅助插件-avante_扩展使用指南",
"path": "new notes/neo-vim_ai 编程辅助插件-avante_扩展使用指南.md"
},
{
"basename": "Getting_started",
"path": "new notes/Getting_started.md"
},
{
"basename": "ccxt-go中文文档, 豆包生成",
"path": "new notes/ccxt-go中文文档, 豆包生成.md"
},
{
"basename": "ccxt",
"path": "new notes/ccxt.md"
},
{
"basename": "AnythinyLLM key",
"path": "new notes/AnythinyLLM key.md"
},
{
"basename": "最大回撤",
"path": "new notes/最大回撤.md"
},
{
"basename": "英文文章可读性量化",
"path": "new notes/英文文章可读性量化.md"
},
{
"basename": "未命名",
"path": "new notes/未命名.canvas"
},
{
"basename": "量化交易系统建议",
"path": "new notes/量化交易系统建议.md"
},
{
"basename": "2025-03-26",
"path": "kanban/2025-03-26.md"
},
{
"basename": "2025-02-02 要做的事情",
"path": "kanban/2025-02-02 要做的事情.md"
},
{
"basename": "三个运动定律",
"path": "demo/三个运动定律.md"
},
{
"basename": "New Chat",
"path": "Chats/New Chat.md"
},
{
"basename": "restruct",
"path": "archived/restruct.md"
},
{
"basename": "go_wire 循环依赖",
"path": "archived/go_wire 循环依赖.md"
},
{
"basename": "重构",
"path": "archived/重构.md"
},
{
"basename": "循环依赖相关对话",
"path": "archived/循环依赖相关对话.md"
},
{
"basename": "循环依赖问题",
"path": "archived/循环依赖问题.md"
},
{
"basename": "开车时听的音乐",
"path": "随便/开车时听的音乐.md"
},
{
"basename": "甘特图流程图各种图",
"path": "随便/甘特图流程图各种图.md"
}
],
"omittedPaths": [
""
],
"omittedTags": [
""
],
"updateOn": "file-edit",
"omitBookmarks": true
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,16 @@
{
"id": "recent-files-obsidian",
"name": "Recent Files",
"version": "1.7.4",
"minAppVersion": "0.16.3",
"description": "List files by most recently opened",
"author": "Tony Grosinger",
"authorUrl": "https://grosinger.net",
"isDesktopOnly": false,
"fundingUrl": {
"Github Sponsor": "https://github.com/sponsors/tgrosinger",
"Buy me a Coffee": "https://buymeacoffee.com/tgrosinger",
"Paypal": "https://paypal.me/tgrosinger"
},
"donation": "https://buymeacoffee.com/tgrosinger"
}

View File

@ -0,0 +1,34 @@
.recent-files-file {
.tree-item-spacer {
flex-grow: 1;
}
}
.recent-files-title {
justify-content: flex-start;
align-items: unset;
}
.recent-files-file-delete {
justify-content: right;
display: none;
}
.recent-files-title:hover .recent-files-file-delete {
display: flex;
cursor: var(--cursor);
}
.recent-files-file-delete:hover {
color: var(--nav-item-color-hover);
}
.recent-files-donation {
width: 70%;
margin: 0 auto;
text-align: center;
}
.recent-files-donate-button {
margin: 10px;
}

View File

@ -0,0 +1,3 @@
{
"version": "2.5.8"
}

29012
.obsidian/plugins/smart-connections/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,10 @@
{
"id": "smart-connections",
"name": "Smart Connections",
"author": "Brian Petro",
"description": "Find links to similar notes using artificial intelligence from OpenAI.",
"minAppVersion": "1.1.0",
"authorUrl": "https://wfhbrian.com",
"isDesktopOnly": false,
"version": "2.5.8"
}

View File

@ -0,0 +1,993 @@
/* deprecated positioning, use bottom bar instead */
.view-content > .sc-brand {
position: fixed;
bottom: 0;
right: 0;
background-color: var(--titlebar-background);
}
.sc-brand {
> svg,
> p {
display: inline;
margin: 0 0.1rem 0 0.3rem;
color: var(--text-muted);
font-size: var(--font-smallest);
line-height: 1;
height: 0.88rem;
width: auto;
}
> p > a {
color: var(--text-muted);
}
}
.sc-list {
.tree-item-self {
cursor: pointer;
small {
color: var(--color-gray-40);
}
}
> .sc-collapsed ul {
display: none;
}
> .sc-collapsed span svg {
transform: rotate(-90deg);
}
> :not(.sc-collapsed) span svg {
transform: rotate(0deg);
}
> div {
span svg {
height: auto;
margin: auto 0.5em auto 0;
flex: none;
}
> span {
display: inline-flex;
width: 100%;
padding-left: 0;
}
ul {
margin: 0;
padding-left: 1.3rem;
}
> a {
display: block;
}
> ul > li {
display: block;
}
}
.sc-result {
> ul {
list-style: none;
padding-left: 0;
}
}
.sc-result.sc-result-plaintext {
font-size: var(--font-ui-smaller);
line-height: var(--line-height-tight);
background-color: var(--search-result-background);
border-radius: var(--radius-s);
overflow: hidden;
margin: var(--size-4-1) 0 var(--size-4-2);
color: var(--text-muted);
box-shadow: 0 0 0 1px var(--background-modifier-border);
& > * li {
cursor: var(--cursor);
position: relative;
padding: var(--size-4-2) var(--size-4-5) var(--size-4-2) var(--size-4-3);
white-space: pre-wrap;
width: 100%;
border-bottom: 1px solid var(--background-modifier-border);
}
}
.sc-result:not(.sc-result-plaintext) {
cursor: pointer;
padding: var(--nav-item-padding);
padding-left: 10px;
margin-bottom: 1px;
align-items: baseline;
border-radius: var(--radius-s);
font-weight: var(--nav-item-weight);
&:hover {
color: var(--nav-item-color-active);
background-color: var(--nav-item-background-active);
font-weight: var(--nav-item-weight-active);
}
span {
color: var(--h5-color);
}
small {
color: var(--h5-color);
font-size: 0.8rem;
font-weight: 500;
}
p {
margin-top: 0.3rem;
margin-bottom: 0.3rem;
}
ul > li {
h1 {
font-size: 1.3rem;
}
h2 {
font-size: 1.25rem;
}
h3 {
font-size: 1.2rem;
}
h4 {
font-size: 1.15rem;
}
h5 {
font-size: 1.1rem;
}
h6 {
font-size: 1.05rem;
}
h1,
h2,
h3,
h4,
h5,
h6 {
margin-block-start: calc(var(--p-spacing)/2);
margin-block-end: calc(var(--p-spacing)/2);
}
}
}
} /* end .sc-list */
/* Only on right sidebar */
.mod-right-split .sc-list .sc-result {
font-size: var(--font-text-size);
font-size: 0.88rem;
}
.sc-top-bar {
display: flex;
width: 100%;
justify-content: end;
.search-input-container {
width: calc(100% - var(--size-4-8));
margin: 4px auto;
}
.sc-context {
color: var(--nav-item-color);
font-size: var(--nav-item-size);
margin: 0.5em 0.5em 1em;
width: 100%;
}
}
/* Chat */
.sc-chat-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-end;
height: 100%;
.sc-top-bar-container {
align-self: flex-end;
display: flex;
width: 100%;
.sc-chat-name-input {
flex-grow: 1;
min-width: 20px;
}
}
.sc-thread {
display: flex;
flex-direction: column;
align-items: flex-start;
height: 100%;
width: 100%;
overflow: hidden;
user-select: text;
overflow-y: auto;
.sc-message-container {
border: 1px solid var(--divider-color);
border-radius: 10px;
margin: 0.5rem 0;
display: flex;
flex-direction: column;
align-items: flex-start;
width: 100%;
height: 100%;
overflow-y: auto;
background-color: var(--background-primary-alt);
.sc-message {
max-width: 90ch;
width: 90%;
margin: 10px;
padding: 10px;
border-radius: 1.5rem;
word-break: break-word;
&.user {
align-self: flex-end;
color: var(--text-normal);
background-color: var(--background-primary);
}
&.assistant,
&.system {
background-color: var(--background-primary-alt);
color: var(--text-normal);
}
.sc-message-content {
margin: 0;
padding: 1rem;
> * p {
margin: 0;
}
}
}
}
.sc-chat-form {
display: flex;
padding: 0 10px 1rem 0;
width: 100%;
max-height: 50%;
.sc-chat-input {
flex-grow: 1;
padding: 0.88rem;
border: none;
border-radius: 1.5rem;
resize: none;
height: auto;
min-height: 4.2lh;
max-height: 100%;
background-color: var(--background-primary);
color: var(--text-normal);
margin-right: -2.7rem;
padding-right: 3rem;
}
.sc-btn-container {
width: 2rem;
height: 2rem;
margin: auto;
> button.send-button {
border-radius: 99999px;
cursor: pointer;
outline: 2px solid transparent;
padding: 0;
outline-offset: 2px;
background: none !important;
&:focus-visible {
outline-color: var(--text-faint);
box-shadow: none;
}
> svg {
> circle {
fill: var(--text-faint);
}
> path {
fill: var(--background-primary);
}
}
}
}
}
}
#settings {
display: flex;
flex-direction: column;
max-width: 100%;
width: 100%;
}
}
.sc-system {
align-self: center;
font-style: italic;
color: var(--text-faint);
}
.sc-msg-button {
cursor: pointer;
float: right;
margin-left: 5px;
opacity: 0.8;
&.cycle-branch {
float: left;
display: flex;
}
&:hover {
opacity: 1;
}
}
#sc-abort-button {
cursor: pointer;
padding: 10px;
border-radius: 5px;
&:hover {
background-color: var(--background-primary);
}
}
.sc-change {
.sc-change-footer {
display: flex;
justify-content: space-between;
align-items: center;
& > * {
display: inline-block;
color: var(--text-muted);
font-size: var(--font-smallest);
}
.sc-brand {
position: unset;
background-color: var(--background-primary);
}
}
.sc-variation {
--new-content-color: hsl(124, 75%, 55%, 0.13);
--old-content-color: hsl(3, 43%, 47%, 0.13);
display: flex;
align-items: flex-end;
justify-content: space-between;
margin: 0 -300px;
padding: 0 300px;
&:has(.new-content) {
background-color: var(--new-content-color);
> button {
background-color: var(--new-content-color) !important;
}
}
&:has(.old-content) {
background-color: var(--old-content-color);
> button {
background-color: var(--old-content-color) !important;
}
}
> div {
> *:last-child {
margin-bottom: 0;
}
}
.old-content {
color: var(--text-muted);
text-decoration: line-through;
> *:first-child {
margin-top: 0;
}
}
}
}
.markdown-source-view.mod-cm6 .cm-embed-block:not(.cm-table-widget):hover:has(.sc-change) {
overflow: unset;
box-shadow: unset;
cursor: unset;
}
.notice .sc-notice-actions {
display: flex;
justify-content: space-between;
flex-direction: row-reverse;
}
.sc-chat-container {
#settings {
display: flex;
flex-direction: column;
max-width: 100%;
width: 100%;
}
.sc-config-error-notice {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px;
background-color: #ffcccc;
border: 1px solid #ff0000;
border-radius: 5px;
margin: 10px 0;
font-size: 14px;
font-weight: bold;
color: #ff0000;
width: 100%;
span {
flex-grow: 1;
}
button {
margin-left: 10px;
}
}
}
.sc-supporters {
max-height: 37ch;
border: 1px solid var(--h1-color);
border-radius: 10px;
padding: 10px;
margin-left: -10px;
box-shadow: 0 1px 0 1px var(--shadow-300);
overflow: auto;
text-wrap: balance;
> p {
margin-top: 0;
margin-bottom: 5px;
}
> ul {
margin-top: 5px;
}
> * li {
margin-top: 0.37em;
}
}
/* settings */
.vertical-tab-content:has(> .sc-supporters) {
.setting-item-control {
> select {
max-width: 500px;
}
}
}
.sc-bottom-bar {
position: fixed;
bottom: 0;
right: 0;
left: 0;
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
background-color: var(--titlebar-background);
padding: 0 0.5rem;
.sc-brand {
flex-shrink: 0;
}
.sc-context {
flex-grow: 1;
font-size: var(--font-smallest);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.setting-component[data-setting*="/"][data-setting*="api_key"] {
display: none;
}
.setting-component[data-setting*="gpu"]:not([data-setting*="/"]) {
display: none;
}
/* SINCE COMPONENT PATTERN SETTINGS */
.setting-component[data-setting="is_obsidian_vault"] {
display: none;
}
.setting-component[data-setting="smart_change.active"] {
display: none;
}
.group-header {
display: flex;
text-wrap: nowrap;
flex-wrap: wrap;
align-items: baseline;
> h2 {
width: 100%;
margin-bottom: 0;
}
> * {
flex-grow: 1;
margin-bottom: 10px;
}
}
/* SMART CHAT v2 */
.sc-context-list {
list-style: none;
margin: 0;
padding: 0 1rem 1rem;
display: none;
flex-direction: column;
gap: 0.5rem;
}
.sc-context-header[aria-expanded="true"] + .sc-context-list {
display: flex;
}
.sc-context-header[aria-expanded="false"] + .sc-context-list {
display: none;
}
.sc-context-toggle-icon {
margin-left: 0.5rem;
transition: transform 0.3s ease;
}
.sc-context-header[aria-expanded="true"] .sc-context-toggle-icon {
transform: rotate(180deg);
}
.sc-context-container {
border: 1px solid var(--divider-color);
border-radius: 10px;
margin: 0.5rem 0;
background-color: var(--background-primary-alt);
overflow: auto;
max-width: 95%;
margin: 10px;
flex-shrink: 0;
}
.sc-context-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.88rem 1rem;
background-color: var(--background-primary);
color: var(--text-muted);
font-weight: var(--font-medium);
cursor: pointer;
user-select: none;
&:hover {
background-color: var(--background-primary-hover);
}
&:focus {
outline: 2px solid var(--text-muted);
outline-offset: 2px;
}
}
.sc-context-item {
padding: 0.5rem;
border-radius: var(--radius-s);
background-color: var(--background-secondary);
color: var(--text-normal);
display: flex;
justify-content: space-between;
align-items: baseline;
font-size: var(--font-smallest);
flex-wrap: wrap;
&:hover {
background-color: var(--background-secondary-hover);
}
}
.sc-context-item-path {
font-weight: var(--font-medium);
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
max-width: 70%;
}
.sc-context-item-score {
font-size: var(--font-small);
color: var(--color-gray-40);
}
/* Tool Calls Component Styles */
.sc-tool-calls-container {
border: 1px solid var(--divider-color);
border-radius: 10px;
margin: 0.5rem 0;
background-color: var(--background-primary-alt);
overflow: auto;
max-width: 95%;
margin: 10px;
flex-shrink: 0;
}
.sc-tool-call {
margin-bottom: 0.5rem;
&:last-child {
margin-bottom: 0;
}
}
.sc-tool-call-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.88rem 1rem;
background-color: var(--background-primary);
color: var(--text-muted);
font-weight: var(--font-medium);
cursor: pointer;
user-select: none;
&:hover {
background-color: var(--background-primary-hover);
}
&:focus {
outline: 2px solid var(--text-muted);
outline-offset: 2px;
}
&[aria-expanded="true"] .sc-tool-call-toggle-icon {
transform: rotate(180deg);
}
}
.sc-tool-call-content {
padding: 0.5rem 1rem;
background-color: var(--background-secondary);
font-size: var(--font-smallest);
pre {
margin: 0;
white-space: pre-wrap;
word-break: break-word;
}
code {
font-family: var(--font-monospace);
}
}
/* Hide content when collapsed */
.sc-tool-call-header[aria-expanded="false"] + .sc-tool-call-content {
display: none;
}
/* Show content when expanded */
.sc-tool-call-header[aria-expanded="true"] + .sc-tool-call-content {
display: block;
}
/* System Message Styles */
.sc-system-message-container {
margin: 1rem 0;
border: 1px solid var(--background-modifier-border);
border-radius: 6px;
background: var(--background-secondary);
flex-shrink: 0;
}
.sc-system-message-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.75rem 1rem;
cursor: pointer;
font-weight: 500;
border-bottom: 1px solid transparent;
transition: background-color 0.2s ease;
&:hover {
background: var(--background-modifier-hover);
}
span {
display: flex;
align-items: center;
gap: 0.5rem;
}
.sc-system-message-toggle-icon {
transition: transform 0.2s ease;
}
&[aria-expanded="true"] {
border-bottom-color: var(--background-modifier-border);
}
}
.sc-system-message-content {
padding: 1rem;
position: relative;
background: var(--background-primary);
border-bottom-left-radius: 6px;
border-bottom-right-radius: 6px;
.sc-system-message-text {
font-family: var(--font-monospace);
white-space: pre-wrap;
word-break: break-word;
margin-right: 2rem;
}
.sc-system-message-copy {
position: absolute;
top: 1rem;
right: 1rem;
padding: 0.4rem;
background: transparent;
border: none;
cursor: pointer;
opacity: 0.6;
transition: opacity 0.2s ease;
&:hover {
opacity: 1;
}
&.sc-copied {
color: var(--text-accent);
}
}
}
.sc-chat-container {
.smart-chat-overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: var(--background-primary-alt);
z-index: 100;
overflow: auto;
.smart-chat-overlay-header {
display: flex;
justify-content: flex-end;
}
.setting-item {
flex-direction: column;
align-items: flex-start;
}
}
}
.sc-typing-indicator {
display: flex;
align-items: center;
padding: 12px 16px;
display: none;
&.visible {
display: flex;
}
.sc-typing-dots {
display: flex;
gap: 4px;
.sc-typing-dot {
width: 8px;
height: 8px;
background: var(--text-muted);
border-radius: 50%;
animation: typing-bounce 1.4s infinite ease-in-out;
&:nth-child(1) {
animation-delay: 0s;
}
&:nth-child(2) {
animation-delay: 0.2s;
}
&:nth-child(3) {
animation-delay: 0.4s;
}
}
}
}
/* keyframes must be at root level */
@keyframes typing-bounce {
0%,
80%,
100% {
transform: scale(0.6);
}
40% {
transform: scale(1);
}
}
/* Smart Directories */
.sg-top-bar {
display: flex;
justify-content: flex-end;
}
.sg-list {
> .sg-collapsed .sg-directory-header svg {
transform: rotate(-90deg);
transition: transform 0.15s ease;
}
> :not(.sg-collapsed) .sg-directory-header svg {
transform: rotate(0deg);
transition: transform 0.15s ease;
}
.sg-directory-header {
cursor: pointer;
user-select: none;
&:hover {
background-color: var(--nav-item-background-hover);
}
}
}
/* Add this to handle content visibility */
.sg-directory-item.sg-collapsed .sg-directory-content {
display: none;
}
/* Lookup */
#sc-lookup-view {
.sc-container {
.sc-textarea-container {
display: flex;
padding: 0 10px 1rem 0;
width: 100%;
max-height: 50%;
> textarea {
flex-grow: 1;
padding: 0.88rem;
border: none;
border-radius: 1.5rem;
resize: none;
height: auto;
min-height: 4.2lh;
max-height: 100%;
background-color: var(--background-primary);
color: var(--text-normal);
margin-right: -2.7rem;
padding-right: 3rem;
}
.sc-textarea-btn-container {
width: 2rem;
height: 2rem;
margin: auto;
> button.send-button {
border-radius: 99999px;
cursor: pointer;
outline: 2px solid transparent;
padding: 0;
outline-offset: 2px;
background: none !important;
&:focus-visible {
outline-color: var(--text-faint);
box-shadow: none;
}
> svg {
> circle {
fill: var(--text-faint);
}
> path {
fill: var(--background-primary);
}
}
}
}
}
}
}
/* Side Panes */
div.workspace-leaf-content[data-type^="smart-"] {
> .view-content {
display: flex;
flex-direction: column;
.sc-overlay {
background-color: var(--background-primary-alt);
max-width: 100%;
max-height: 42%;
&:has(.setting-component) {
overflow-y: auto;
padding: var(--size-4-4);
flex: none;
.setting-item {
flex-direction: column;
align-items: flex-start;
}
}
}
}
}
.sc-pro {
.sc-settings {
padding: var(--size-4-4);
textarea {
min-height: 4rem;
flex-grow: 1;
}
}
}
.sc-inline-confirm-row {
margin-top: 10px;
padding: 6px;
border: 1px solid var(--interactive-normal);
}
.sc-inline-confirm-row-buttons {
display: flex;
justify-content: flex-end;
gap: 10px;
margin-top: 10px;
& .sc-inline-confirm-yes {
font-weight: bold;
}
& .sc-inline-confirm-cancel {
font-weight: normal;
}
}

View File

@ -0,0 +1,129 @@
{
"isChatComfy": true,
"isUsingRag": false,
"assistantLanguage": "en",
"initialAssistantMessageContent": "Hello, I am your assistant. How can I help you?",
"isIncognitoMode": true,
"ollamaGenModel": {
"model": "deepseek-r1:8b",
"baseUrl": "http://localhost:11434",
"temperature": 0.5,
"contextWindow": 1848,
"lcModel": {
"lc": 1,
"type": "constructor",
"id": [
"langchain",
"chat_models",
"ollama",
"ChatOllama"
],
"kwargs": {
"model": "deepseek-r1:8b",
"base_url": "http://localhost:11434",
"temperature": 0.5,
"context_window": 1848,
"lc_model": {
"lc": 1,
"type": "constructor",
"id": [
"langchain",
"chat_models",
"ollama",
"ChatOllama"
],
"kwargs": {
"model": "deepseek-r1:8b",
"base_url": "http://localhost:11434",
"temperature": 0.5,
"context_window": 1948,
"lc_model": {
"lc": 1,
"type": "constructor",
"id": [
"langchain",
"chat_models",
"ollama",
"ChatOllama"
],
"kwargs": {
"model": "deepseek-r1:14b",
"base_url": "http://localhost:11434",
"temperature": 0.5,
"context_window": 1948,
"lc_model": {
"lc": 1,
"type": "constructor",
"id": [
"langchain",
"chat_models",
"ollama",
"ChatOllama"
],
"kwargs": {
"model": "gemma3:12b",
"base_url": "http://localhost:11434",
"temperature": 0.5,
"context_window": 1948
}
}
}
}
}
}
}
}
},
"ollamaEmbedModel": {
"model": "nomic-embed-text",
"baseUrl": "http://localhost:11434",
"similarityThreshold": 0.75,
"k": 100
},
"openAIGenModel": {
"model": "gpt-3.5-turbo",
"openAIApiKey": "sk-24a6af9eea55494b8f465a01cb92d461",
"temperature": 0.5,
"contextWindow": 1948,
"lcModel": {
"lc": 1,
"type": "constructor",
"id": [
"langchain",
"chat_models",
"openai",
"ChatOpenAI"
],
"kwargs": {
"model": "gpt-3.5-turbo",
"openai_api_key": {
"lc": 1,
"type": "secret",
"id": [
"OPENAI_API_KEY"
]
},
"temperature": 0.5,
"context_window": 1948,
"streaming": true
}
}
},
"openAIEmbedModel": {
"model": "text-embedding-ada-002",
"openAIApiKey": "sk-24a6af9eea55494b8f465a01cb92d461",
"similarityThreshold": 0.75,
"k": 100
},
"targetFolder": "Chats",
"defaultChatName": "New Chat",
"excludeFF": [
"Chats",
"*.excalidraw.md"
],
"isQuickSettingsOpen": true,
"isVerbose": false,
"isOnboarded": true,
"hideIncognitoWarning": false,
"isAutostart": false
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,10 @@
{
"id": "smart-second-brain",
"name": "Smart Second Brain",
"description": "Interact with your privacy focused assistant, leveraging Ollama or OpenAI, making your second brain even smarter.",
"author": "Leo310, nicobrauchtgit",
"authorUrl": "https://github.com/nicobrauchtgit",
"version": "1.3.0",
"minAppVersion": "1.5.0",
"isDesktopOnly": true
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,6 @@
{
"formatType": "normal",
"showRibbonIcon": true,
"bindEnter": true,
"bindTab": true
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,17 @@
{
"id": "table-editor-obsidian",
"name": "Advanced Tables",
"author": "Tony Grosinger",
"authorUrl": "https://grosinger.net",
"description": "Improved table navigation, formatting, manipulation, and formulas",
"isDesktopOnly": false,
"minAppVersion": "1.0.0",
"version": "0.22.1",
"js": "main.js",
"fundingUrl": {
"Github Sponsor": "https://github.com/sponsors/tgrosinger",
"Buy me a Coffee": "https://buymeacoffee.com/tgrosinger",
"Paypal": "https://paypal.me/tgrosinger"
},
"donation": "https://buymeacoffee.com/tgrosinger"
}

View File

@ -0,0 +1,78 @@
:root {
--advanced-tables-helper-size: 28px;
}
.HyperMD-table-row span.cm-inline-code {
font-size: 100%;
padding: 0px;
}
.advanced-tables-buttons>div>.title {
font-weight: var(--font-medium);
font-size: var(--nav-item-size);
color: var(--nav-item-color);
text-decoration: underline;
}
[data-type="advanced-tables-toolbar"] .nav-buttons-container {
column-gap: 0.2rem;
margin: 0.2rem 0 0.2rem 0;
justify-content: start;
}
[data-type="advanced-tables-toolbar"] .nav-buttons-container::before {
min-width: 2.6rem;
line-height: var(--advanced-tables-helper-size);
font-size: var(--nav-item-size);
font-weight: var(--nav-item-weight);
color: var(--nav-item-color);
}
[data-type="advanced-tables-toolbar"] .nav-buttons-container>* {
height: var(--advanced-tables-helper-size);
line-height: var(--advanced-tables-helper-size);
}
[data-type="advanced-tables-toolbar"] .nav-buttons-container .nav-action-button {
width: var(--advanced-tables-helper-size);
height: var(--advanced-tables-helper-size);
display: flex;
justify-content: center;
align-items: center;
border-radius: var(--radius-s);
}
[data-type="advanced-tables-toolbar"] .nav-buttons-container .nav-action-button:hover {
background-color: var(--nav-item-background-hover);
color: var(--nav-item-color-hover);
font-weight: var(--nav-item-weight-hover);
}
.advanced-tables-row-label {
width: 50px;
}
.widget-icon {
width: 20px;
height: 20px;
fill: var(--text-muted);
}
.widget-icon:hover {
fill: var(--text-normal);
}
.advanced-tables-csv-export textarea {
height: 200px;
width: 100%;
}
.advanced-tables-donation {
width: 70%;
margin: 0 auto;
text-align: center;
}
.advanced-tables-donate-button {
margin: 10px;
}

View File

@ -0,0 +1,36 @@
{
"command_timeout": 5,
"templates_folder": "templates",
"templates_pairs": [
[
"",
""
]
],
"trigger_on_file_creation": true,
"auto_jump_to_cursor": false,
"enable_system_commands": false,
"shell_path": "",
"user_scripts_folder": "",
"enable_folder_templates": true,
"folder_templates": [
{
"folder": "new notes",
"template": "templates/base_template.md"
}
],
"enable_file_templates": false,
"file_templates": [
{
"regex": ".*",
"template": ""
}
],
"syntax_highlighting": true,
"syntax_highlighting_mobile": false,
"enabled_templates_hotkeys": [
""
],
"startup_templates": [],
"intellisense_render": 1
}

File diff suppressed because one or more lines are too long

View File

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

View File

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

147
.obsidian/plugins/terminal/data.json vendored Normal file
View File

@ -0,0 +1,147 @@
{
"addToCommand": true,
"addToContextMenu": true,
"createInstanceNearExistingOnes": true,
"errorNoticeTimeout": 0,
"exposeInternalModules": true,
"focusOnNewInstance": true,
"hideStatusBar": "focused",
"interceptLogging": true,
"language": "zh-Hans",
"newInstanceBehavior": "newHorizontalSplit",
"noticeTimeout": 5,
"openChangelogOnUpdate": true,
"pinNewInstance": true,
"preferredRenderer": "webgl",
"profiles": {
"darwinExternalDefault": {
"args": [
"\"$PWD\""
],
"executable": "/System/Applications/Utilities/Terminal.app/Contents/macOS/Terminal",
"name": "",
"platforms": {
"darwin": true
},
"restoreHistory": true,
"successExitCodes": [
"0",
"SIGINT",
"SIGTERM"
],
"terminalOptions": {
"documentOverride": null
},
"type": "external"
},
"darwinIntegratedDefault": {
"args": [],
"executable": "/bin/zsh",
"name": "",
"platforms": {
"darwin": true
},
"pythonExecutable": "python3",
"restoreHistory": true,
"successExitCodes": [
"0",
"SIGINT",
"SIGTERM"
],
"terminalOptions": {
"documentOverride": null
},
"type": "integrated",
"useWin32Conhost": true
},
"developerConsole": {
"name": "",
"restoreHistory": true,
"successExitCodes": [
"0",
"SIGINT",
"SIGTERM"
],
"terminalOptions": {
"documentOverride": null
},
"type": "developerConsole"
},
"linuxExternalDefault": {
"args": [],
"executable": "xterm",
"name": "",
"platforms": {
"linux": true
},
"restoreHistory": true,
"successExitCodes": [
"0",
"SIGINT",
"SIGTERM"
],
"terminalOptions": {
"documentOverride": null
},
"type": "external"
},
"linuxIntegratedDefault": {
"args": [],
"executable": "/bin/sh",
"name": "",
"platforms": {
"linux": true
},
"pythonExecutable": "python3",
"restoreHistory": true,
"successExitCodes": [
"0",
"SIGINT",
"SIGTERM"
],
"terminalOptions": {
"documentOverride": null
},
"type": "integrated",
"useWin32Conhost": true
},
"win32ExternalDefault": {
"args": [],
"executable": "C:\\Windows\\System32\\cmd.exe",
"name": "",
"platforms": {
"win32": true
},
"restoreHistory": true,
"successExitCodes": [
"0",
"SIGINT",
"SIGTERM"
],
"terminalOptions": {
"documentOverride": null
},
"type": "external"
},
"win32IntegratedDefault": {
"args": [],
"executable": "C:\\Windows\\System32\\cmd.exe",
"name": "",
"platforms": {
"win32": true
},
"pythonExecutable": "python3",
"restoreHistory": true,
"successExitCodes": [
"0",
"SIGINT",
"SIGTERM"
],
"terminalOptions": {
"documentOverride": null
},
"type": "integrated",
"useWin32Conhost": true
}
}
}

194
.obsidian/plugins/terminal/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,14 @@
{
"author": "polyipseity",
"description": "Integrate consoles, shells, and terminals inside Obsidian.",
"fundingUrl": {
"Buy Me a Coffee": "https://buymeacoffee.com/polyipseity",
"GitHub Sponsors": "https://github.com/sponsors/polyipseity"
},
"version": "3.16.0",
"authorUrl": "https://github.com/polyipseity",
"id": "terminal",
"isDesktopOnly": false,
"minAppVersion": "1.4.11",
"name": "Terminal"
}

32
.obsidian/plugins/terminal/styles.css vendored Normal file
View File

@ -0,0 +1,32 @@
/**
* Copyright (c) 2014 The xterm.js authors. All rights reserved.
* Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
* https://github.com/chjj/term.js
* @license MIT
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* Originally forked from (with the author's permission):
* Fabrice Bellard's javascript vt100 for jslinux:
* http://bellard.org/jslinux/
* Copyright (c) 2011 Fabrice Bellard
* The original design remains. The terminal itself
* has been extended to include xterm CSI codes, among
* other features.
*/.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;inset:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;inset:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{user-select:text;white-space:pre}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}.workspace-leaf-content[data-type="terminal:terminal"] .view-content{overflow:clip;display:flex;flex-direction:column}.terminal\:terminal{flex:1;min-width:0;min-height:0}.is-phone .workspace-leaf-content[data-type="terminal:terminal"] .view-content{padding-bottom:max(var(--size-4-4),calc(var(--icon-l) + var(--size-4-2) + max(var(--size-4-2),var(--safe-area-inset-bottom))))}.obsidian-plugin-library\:icon{fill:none;stroke:currentColor}.obsidian-plugin-library\:await-css{display:unset!important}.obsidian-plugin-library\:hide-status-bar{display:none}

View File

@ -0,0 +1,5 @@
{
"source": "wttr",
"cacheSeconds": 300,
"addRibbon": true
}

1698
.obsidian/plugins/weather-fetcher/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,10 @@
{
"id": "weather-fetcher",
"name": "Weather Fetcher",
"version": "0.0.3",
"minAppVersion": "0.12.0",
"description": "Fetch and insert current weather into the editor of Obsidian.",
"author": "fyears",
"authorUrl": "https://github.com/fyears/obsidian-weather",
"isDesktopOnly": false
}

View File

@ -0,0 +1,3 @@
/*
body {
} */

63
.obsidian/snippets/allnotelist.css vendored Normal file
View File

@ -0,0 +1,63 @@
.dataview.list-view-ul {
padding: 0;
}
/* 每个列表项的样式 */
.dataview.list-view-ul li {
padding: 8px;
border-bottom: 1px solid #444;
line-height: 1.4;
}
/* 标题样式 */
.note-title a {
text-decoration: none !important; /* 移除下划线 */
color: var(--text-normal); /* 使用主题默认文字颜色 */
}
/* 日期样式 */
.note-date {
opacity: 0.5; /* 半透明 */
margin-left: 10px;
font-size: 0.9em;
}
/* 文件夹样式 */
.note-folder {
font-size: 0.8em; /* 字体更小 */
opacity: 0.5; /* 半透明 */
color: var(--text-muted);
}
/* Tags 样式 */
.note-tags {
display: flex;
flex-wrap: wrap;
gap: 5px;
}
/* 每个 Tag 的样式 */
.note-tags span::before {
content: "#";
color: var(--text-accent); /* Tag 的 # 颜色 */
}
.note-tags span {
background-color: var(--background-secondary); /* 背景色 */
border-radius: 10px; /* 圆角 */
padding: 2px 6px;
font-size: 0.8em;
color: var(--text-accent); /* Tag 文字颜色 */
}
.note-date {
opacity: 0.5;
margin-left: 10px;
font-size: 0.8em; /* 更小 */
}
.note-tags span {
background-color: #555; /* 自定义背景色 */
border-radius: 10px;
padding: 2px 6px;
font-size: 0.8em;
color: var(--text-accent);
}

View File

@ -0,0 +1,7 @@
{
"name": "Obsidianite",
"version": "2.0.2",
"minAppVersion": "1.1.0",
"author": "@bennyxguo",
"authorUrl": "https://github.com/bennyxguo"
}

1481
.obsidian/themes/Obsidianite/theme.css vendored Normal file

File diff suppressed because it is too large Load Diff

6
.obsidian/themes/Wasp/manifest.json vendored Normal file
View File

@ -0,0 +1,6 @@
{
"name": "Wasp",
"version": "0.0.0",
"minAppVersion": "0.16.0",
"author": "Santi Younger"
}

322
.obsidian/themes/Wasp/theme.css vendored Normal file
View File

@ -0,0 +1,322 @@
/* This Theme is called "Wasp" and Obsidian Theme created by Santi Younger */
:root
{
--font-monospace: "Source Code Pro", monospace;
}
.theme-dark
{
--button-hover-bg-color: #DAA520; /* Darker Yellow Background for Hover */
--button-hover-text-color: #ffffff; /* White Text for Hover */
--button-bg-color: #D49335; /* Gray-Black Background */
--button-text-color: #242424; /* Light Gray Text */
--background-primary: #242424;
--background-primary-alt: #242424;
--background-secondary: #191919;
--background-secondary-alt: #3D3D3D;
--text-normal: #faf2d6;
--text-faint: #bdae93;
--text-title-h1: #E0E0E0;
--text-title-h2: #E0E0E0;
--text-title-h3: #E0E0E0;
--text-title-h4: #E0E0E0;
--text-title-h5: #E0E0E0;
--text-title-h6: #E0E0E0;
--text-highlight-bg: #640211;
--text-link: #83a598;
--text-a-hover: #83a598;
--text-accent-hover: #D49335;
/* ^^^ added for hover over bracket internal links */
--inline-code: #83a598;
--code-block: #83a598;
--text-a: #f8c537;
--interactive-accent: #f8c537;
--text-accent: #f8c537;
--text-on-accent: #fff;
--interactive-accent-rgb: #f8c537;
--vim-cursor: #f8c537;
/* --text-mark: add text-mark if needed, this should work together with 'mark' */
--pre-code: #;
--interactive-before: #7c6f64;
--background-modifier-border: #f8c537;
--text-selection: #f8c537;
}
.theme-dark .cm-s-obsidian span.obsidian-search-match-highlight {
color: var(--text-normal);
background-color: #483699;
}
.theme-light
{
--background-primary: #EDEDED;
--background-secondary: #C4C4C4;
/* thick menu border */
--background-primary-alt: #;
--background-secondary-alt: #707070; /* ← ↓ corner */
--text-normal: #1A2023;
--text-faint: #DEDEDE;
--text-title-h1: #D49335;
--text-title-h2: #D49335;
--text-title-h3: #D49335;
--text-title-h4: #D49335;
--text-title-h5: #D49335;
--text-link: #D49335;
--text-a-hover: #D49335;
--text-accent-hover: #D49335;
/* ^^^ added for hover over bracket internal links */
--inline-code: #458588;
/* --text-mark: add if needed */
--pre-code: #bebebe;
/* --text-highlight-bg: add if needed */
--interactive-before: #a89984;
--background-modifier-border: #D49335;
--text-a: #961327;
--interactive-accent: #f8c537;
--text-accent: #961327;
--interactive-accent-rgb: #961327;
--vim-cursor: #961327;
--text-selection: #EDC180;
--text-white: #ffffff;
}
.nav-file-title, .nav-folder-title {
color: var(--text-normal);
}
.nav-file-title.is-active, .nav-folder-title.is-active, body:not(.is-grabbing) .nav-file-title:hover, body:not(.is-grabbing) .nav-folder-title:hover {
background-color: var(--background-modifier-border);
color: white;
}
.cm-s-obsidian span.cm-formatting-link {
color: var(--text-normal);
}
.CodeMirror-guttermarker-subtle {
color: var(--text-normal) !important;
}
button.mod-cta {
background-color: var(--interactive-accent);
color: var(--text-normal);
}
.vertical-tab-header-group-title {
color: var(--text-white);
}
.cm-header-1 {
font-size: 18px;
color: var(--text-title-h1) !important;
}
.cm-header-2 {
font-size: 18px;
color: var(--text-title-h2) !important;
}
.cm-header-3 {
font-size: 18px;
color: var(--text-title-h3) !important;
}
.cm-header-4 {
font-size: 18px;
color: var(--text-title-h4) !important;
}
.cm-header-5 {
font-size: 18px;
color: var(--text-title-h5) !important;
}
.cm-header-6 {
font-size: 18px;
color: --text-normal;
color: var(--text-title-h6) !important;
}
.markdown-preview-view h1 {
font-size: 20px;
line-height: 24px;
color: var(--text-title-h1) !important;
}
.markdown-preview-view h2 {
font-size: 20px;
line-height: 24px;
color: var(--text-title-h2) !important;
}
.markdown-preview-view h3 {
font-size: 20px;
line-height: 24px;
color: var(--text-title-h3) !important;
}
.markdown-preview-view h4 {
font-size: 20px;
line-height: 24px;
color: var(--text-title-h4) !important;
}
.markdown-preview-view h5 {
font-size: 20px;
line-height: 24px;
color: var(--text-title-h5) !important;
}
.markdown-preview-view h6 {
font-size: 20px;
line-height: 24px;
color: --text-normal;
color: var(--text-title-h6) !important;
}
/*-----------------------------------------*/
/* End of main theme, extra functionality can be added below */
.markdown-source-view { font-family: var(--font-monospace)
}
.cm-fat-cursor .CodeMirror-cursor {
background-color: #f8c537 !important;
opacity: 80% !important;
width: 9px !important;
visibility: visible !important
}
.plugin-tabs .stayopen .view-header {
border-bottom: 2px solid var(--interactive-accent)!important;
}
.plugin-tabs .mod-root.workspace-split.mod-vertical div.workspace-leaf:not(.stayopen) > .workspace-leaf-content > .view-header .view-header-title::before{
background-color:transparent!important
}
.plugin-tabs .mod-root.workspace-split.mod-vertical .workspace-split.mod-vertical > div.workspace-leaf:not(.stayopen),
.plugin-tabs .mod-root.workspace-split.mod-vertical > div.workspace-leaf:not(.stayopen){
border-radius: 5px 5px 0px 0px!important;
}
.plugin-tabs .mod-root.workspace-split.mod-vertical div.workspace-leaf{
border-color: var(--background-secondary-alt)!important;
border-bottom-width: 0px!important;
border-right-width: 0px!important
}
.theme-light.plugin-tabs .mod-root.workspace-split.mod-vertical div.workspace-leaf{
border-color: var(--background-secondary-alt)!important;
border-left-width:3px!important;
border-bottom-width: 0px!important;
border-right-width: 0px!important
}
.plugin-tabs .mod-root.workspace-split.mod-vertical > div.workspace-leaf hr.workspace-leaf-resize-handle,
.plugin-tabs .mod-root.workspace-split.mod-vertical > .mod-vertical hr.workspace-leaf-resize-handle{
display: none;
}
.plugin-tabs .mod-root.workspace-split.mod-vertical div.workspace-leaf .view-header{
border-left-color: transparent!important
}
.plugin-tabs .workspace-split.mod-root > .workspace-leaf:last-of-type .workspace-leaf-content,
.plugin-tabs .workspace-split.mod-root > .workspace-leaf:first-of-type .workspace-leaf-content {
border-radius: 0px!important;
}
.plugin-tabs .theme-dark .mod-root.workspace-split.mod-vertical .workspace-split.mod-vertical > div.workspace-leaf.mod-active,
.plugin-tabs .theme-dark .mod-root.workspace-split.mod-vertical > div.workspace-leaf.mod-active {
border: 0!important;
border-radius: 0px 0px 0px 0px!important;
}
button.mod-cta {
background-color: var(--button-bg-color); /* Uses variable for background color */
color: var(--button-text-color); /* Uses variable for text color */
font-weight: 600; /* Makes text bold but less than standard bold */
}
button.mod-cta:hover, button.mod-cta:focus {
background-color: var(--button-hover-bg-color); /* Darker Yellow Background for Hover */
color: var(--button-text-color); /* Keeps the default light gray text color on hover */
font-weight: 600; /* Makes text bold but less than standard bold */
}
.vertical-tab-nav-item.is-active {
background-color: var(--button-bg-color); /* Gray-Black Background */
color: var(--button-text-color); /* Light Gray Text */
font-weight: bold; /* Makes text bold */
font-weight: 600; /* Makes text bold but less than standard bold */
}
.vertical-tab-nav-item.is-active:hover, .vertical-tab-nav-item.is-active:focus {
background-color: var(--button-hover-bg-color); /* Darker Yellow Background for Hover */
color: var(--button-text-color); /* Keeps the default light gray text color on hover */
font-weight: 600; /* Makes text bold but less than standard bold */
}
body:not(.is-phone) .vertical-tab-nav-item.is-active {
--background-modifier-hover: var(--button-hover-bg-color); /* More specific variable for hover */
--icon-color: var(--button-text-color);
background-color: var(--button-bg-color);
color: var(--button-text-color);
font-weight: 600; /* Makes text bold but less than standard bold */
}
body:not(.is-phone) .vertical-tab-nav-item.is-active:hover,
body:not(.is-phone) .vertical-tab-nav-item.is-active:focus {
background-color: var(--button-hover-bg-color);
color: var(--button-text-color);
font-weight: 600; /* Makes text bold but less than standard bold */
}
.checkbox-container.is-enabled {
background-color: var(--button-bg-color); /* Gray-Black Background */
color: var(--button-text-color); /* Light Gray Text */
}
.checkbox-container.is-enabled:hover, .checkbox-container.is-enabled:focus {
background-color: var(--button-hover-bg-color); /* Darker Yellow Background for Hover */
color: var(--button-text-color); /* Keeps the default light gray text color on hover */
}
.flair.mod-pop {
background-color: var(--button-bg-color); /* Gray-Black Background */
color: var(--button-text-color); /* Light Gray Text */
}
.flair.mod-pop:hover, .flair.mod-pop:focus {
background-color: var(--button-hover-bg-color); /* Darker Yellow Background for Hover */
color: var(--button-text-color); /* Keeps the default light gray text color on hover */
}
/** hr styles -- PREVIEW MODE */
.cm-line hr,
.markdown-preview-view hr {
margin-block-start: 4em;
margin-block-end: 4em;
border: none;
height: 0;
border-bottom: 1px solid;
border-image-slice: 1;
border-width: 1px;
border-image-source: linear-gradient(to right, transparent, var(--text-accent), transparent);
}
.cm-line hr::after,
.markdown-preview-view hr::after {
/* content: '\1f41d'; */
display: inline-block;
position: absolute;
left: 50%;
transform: translate(-50%, -50%);
transform-origin: 50% 50%;
padding: 0.5rem;
color: var(--text-sub-accent);
background-color: var(--background-primary);
}

View File

@ -1,21 +1,186 @@
{
"main": {
"id": "089e59043add2840",
"id": "5324373015726ba8",
"type": "split",
"children": [
{
"id": "779ce2da10685674",
"id": "4509724f8bf84da7",
"type": "tabs",
"children": [
{
"id": "232557ff1641c4e1",
"id": "e7a7b303c61786dc",
"type": "leaf",
"pane-relief:history-v1": {
"pos": 0,
"stack": [
{
"state": "{}",
"eState": "{}"
}
]
},
"state": {
"type": "empty",
"state": {},
"icon": "lucide-file",
"title": "New tab"
}
}
]
}
],
"direction": "vertical"
},
"left": {
"id": "4a16ceff2f188a44",
"type": "split",
"children": [
{
"id": "c45d5472a01fa0c3",
"type": "tabs",
"children": [
{
"id": "09d53b405976b21c",
"type": "leaf",
"pane-relief:history-v1": {
"pos": 0,
"stack": [
{
"state": "{}",
"eState": "{}"
}
]
},
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "byModifiedTime",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "ad3f6423219ed8e7",
"type": "leaf",
"pane-relief:history-v1": {
"pos": 0,
"stack": [
{
"state": "{}",
"eState": "{}"
}
]
},
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": true,
"collapseAll": true,
"extraContext": true,
"sortOrder": "byModifiedTime"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "f1803f8a17f23709",
"type": "leaf",
"pane-relief:history-v1": {
"pos": 0,
"stack": [
{
"state": "{}",
"eState": "{}"
}
]
},
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
},
{
"id": "cc4acd597507c478",
"type": "leaf",
"pane-relief:history-v1": {
"pos": 0,
"stack": [
{
"state": "{}",
"eState": "{}"
}
]
},
"state": {
"type": "recent-files",
"state": {},
"icon": "clock",
"title": "Recent Files"
}
}
]
}
],
"direction": "horizontal",
"width": 303.5024719238281
},
"right": {
"id": "97b6734b8c030920",
"type": "split",
"children": [
{
"id": "32b176fd8dff1165",
"type": "tabs",
"children": [
{
"id": "ef29c0acdfab7689",
"type": "leaf",
"pane-relief:history-v1": {
"pos": 0,
"stack": [
{
"state": "{}",
"eState": "{}"
}
]
},
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "f230e766ab61c912",
"type": "leaf",
"pane-relief:history-v1": {
"pos": 0,
"stack": [
{
"state": "{}",
"eState": "{}"
}
]
},
"state": {
"type": "markdown",
"state": {
"file": "demo/三个运动定律.md",
"mode": "source",
"source": false,
"file": "templates/allNotes.md.md",
"mode": "preview",
"source": true,
"backlinks": true,
"backlinkOpts": {
"collapseAll": false,
@ -28,83 +193,24 @@
}
},
"icon": "lucide-file",
"title": "三个运动定律"
"title": "allNotes.md"
}
},
{
"id": "445ac2f458bd24b6",
"type": "leaf",
"pane-relief:history-v1": {
"pos": 0,
"stack": [
{
"state": "{}",
"eState": "{}"
}
]
}
],
"direction": "vertical"
},
"left": {
"id": "f02b8f0203ad6798",
"type": "split",
"children": [
{
"id": "9aba6106d1ffe45f",
"type": "tabs",
"children": [
{
"id": "76751a9e5608cd89",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "文件列表"
}
},
{
"id": "f7237a916e3ce339",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "搜索"
}
},
{
"id": "0333b2220dd4771e",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "书签"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"right": {
"id": "ed0ff6ed65987e7a",
"type": "split",
"children": [
{
"id": "07d6c74723a4610e",
"type": "tabs",
"children": [
{
"id": "0abf9d6487bcfaea",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "freqtrade 理解消化.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
@ -114,168 +220,118 @@
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "freqtrade 理解消化 的反向链接列表"
"title": "Backlinks"
}
},
{
"id": "5ebaa2ee70419203",
"id": "8c579b681aaaa178",
"type": "leaf",
"pane-relief:history-v1": {
"pos": 0,
"stack": [
{
"state": "{}",
"eState": "{}"
}
]
},
"state": {
"type": "outgoing-link",
"state": {
"file": "随便/甘特图 流程图 各种图.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "甘特图 流程图 各种图 的出链列表"
"title": "Outgoing links"
}
},
{
"id": "d070d7c7c7fd043e",
"id": "cf7a4dcbb71782cb",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "标签"
}
},
"pane-relief:history-v1": {
"pos": 0,
"stack": [
{
"id": "61b570e21fca7b37",
"type": "leaf",
"state": "{}",
"eState": "{}"
}
]
},
"state": {
"type": "outline",
"state": {
"file": "AI相关/未命名.canvas",
"followCursor": true,
"showSearch": true,
"file": "量化交易相关/收益预估直方图.md",
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "未命名 的大纲"
}
},
{
"id": "24165256c8d78be3",
"type": "leaf",
"state": {
"type": "planner-timeline",
"state": {},
"icon": "lucide-file",
"title": "插件不再活动"
}
},
{
"id": "5369911ec89f6d64",
"type": "leaf",
"state": {
"type": "planner-timeline",
"state": {},
"icon": "lucide-file",
"title": "插件不再活动"
}
},
{
"id": "cbd56a01a6cbccd6",
"type": "leaf",
"state": {
"type": "git-view",
"state": {},
"icon": "git-pull-request",
"title": "Source Control"
}
},
{
"id": "0974c29258d370bd",
"type": "leaf",
"state": {
"type": "planner-timeline",
"state": {},
"icon": "calendar-with-checkmark",
"title": "Timeline"
"title": "Outline of 收益预估直方图"
}
}
],
"currentTab": 6
"currentTab": 4
}
],
"direction": "horizontal",
"width": 200
"width": 493.5
},
"left-ribbon": {
"hiddenItems": {
"switcher:打开快速切换": false,
"graph:查看关系图谱": false,
"canvas:新建白板": false,
"daily-notes:打开/创建今天的日记": false,
"templates:插入模板": false,
"command-palette:打开命令面板": false,
"markdown-importer:打开 Markdown 格式转换器": false,
"obsidian-day-planner:Open Timeline": false,
"obsidian-day-planner:Open Multi-Day View": false,
"obsidian-importer:Open Importer": false,
"obsidian-kanban:创建新看板": false,
"obsidian-git:Open Git source control": false
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"obsidian-kanban:Create new board": false,
"copilot:Open Copilot Chat": false,
"obsidian-git:Open Git source control": false,
"terminal:Open terminal": false,
"table-editor-obsidian:Advanced Tables Toolbar": false,
"weather-fetcher:Insert Weather": false,
"templater-obsidian:Templater": false,
"homepage:Open homepage": false
}
},
"active": "232557ff1641c4e1",
"active": "e7a7b303c61786dc",
"lastOpenFiles": [
"`freqtrade.md",
"demo/三个运动定律.md",
"Pasted image 20250204021453.png",
"freqtrade_理解消化.md",
"freqtrade_基础.md",
"Pasted image 20250222113205.png",
"backtrader.md",
"backtrader 事件回调函数.md",
"backtrader_&_okx.md",
"未命名.canvas",
"core/go_wire 循环依赖.md",
"生成像素风格图片 (4).png",
"templates/阅读笔记.md",
"n8n/Getting_started.md",
"core/循环依赖相关对话.md",
"avante/neo-vim_ai 编程辅助插件-avante_扩展使用指南.md",
"量化交易相关/收益预估直方图.md",
"new notes/英文文章可读性量化.md",
"templates/allNotes.md.md",
"new notes/未命名.canvas",
"new notes/最大回撤.md",
"new notes/freqtrade_基础.md",
"量化交易系统建议/02_CCXT详细介绍.md",
"随便/开车时听的音乐.md",
"随便/甘特图流程图各种图.md",
"populate_indicators函数.md",
"freqtrade.md",
"populate_indicators.md",
"populate_indicator.md",
"AI相关/英文文章可读性量化.md",
"core/restruct.md",
"车位诉讼策略.md",
"策略.md",
"2025-03-21.md",
"2025-02-02 要做的事情.md",
"n8n/如何触发.md",
"core/循环依赖问题.md",
"AI相关/未命名.canvas",
"未命名 4.canvas",
"templates",
"未命名 3.canvas",
"未命名 2.canvas",
"法律",
"未命名 1.canvas",
"blingo",
"Pasted image 20250222115616.png",
"Pasted image 20250204022601.png",
"core",
"avante",
"demo",
"学英语",
"n8n",
"随便",
"要做的事情",
"AA5B1439-F6D4-4633-8F3B-A30A2538D674_1_105_c.jpeg",
"AA5B1439-F6D4-4633-8F3B-A30A2538D674_1_105_c 2.jpeg",
"AA5B1439-F6D4-4633-8F3B-A30A2538D674_1_105_c 1.jpeg",
"代订附加产品(服务包)发票_订单31324101513471184053056 3_副本.png",
"【飞猪】订单7224154890106-机票款凭证 报销凭证 3_副本.png"
"量化交易系统建议/05_机器学习相关工具.md",
"new notes/freqtrade.md",
"new notes/freqtrade_理解消化.md",
"new notes/如何触发.md",
"new notes/节点角色更新.md",
"new notes/ccxt.md",
"new notes/量化交易系统建议.md",
"new notes/Untitled.md",
"new notes/Untitled 1.md",
"archived/重构.md",
"量化交易系统建议/03_辅助决策工具.md",
"量化交易系统建议/08_Redis与Elasticsearch的应用.md",
"量化交易系统建议/07_基于机器学习的量化交易路线图.md",
"量化交易系统建议/06_传统量化交易路线图.md",
"量化交易系统建议/01_量化交易辅助决策开源项目.md",
"kanban/mainboard.md",
"量化交易系统建议/09_解耦设计实现灵活架构.md",
"量化交易系统建议/04_Go语言相关工具.md",
"量化交易系统建议",
"Untitled",
"Chats",
"canvas/Untitled.canvas",
"kanban/notes",
"canvas/Untitled 1.canvas",
"canvas",
"Untitled.canvas",
"kanban",
"templates"
]
}

BIN
.obsidian_back/.DS_Store vendored Normal file

Binary file not shown.

16
.obsidian_back/app.json Normal file
View File

@ -0,0 +1,16 @@
{
"promptDelete": false,
"pdfExportSettings": {
"pageSize": "Letter",
"landscape": false,
"margin": "0",
"downscalePercent": 100
},
"vimMode": true,
"attachmentFolderPath": "attachments",
"useMarkdownLinks": true,
"newLinkFormat": "relative",
"alwaysUpdateLinks": true,
"newFileLocation": "folder",
"newFileFolderPath": "materials"
}

View File

@ -0,0 +1,4 @@
{
"showRibbon": true,
"translucency": true
}

View File

@ -0,0 +1,3 @@
{
"backlinkInDocument": true
}

View File

@ -0,0 +1,6 @@
{
"snapToObjects": true,
"snapToGrid": true,
"newFileLocation": "folder",
"newFileFolderPath": "canvas"
}

View File

@ -0,0 +1,8 @@
[
"dataview",
"obsidian-day-planner",
"obsidian-importer",
"obsidian-kanban",
"obsidian-git",
"global-proxy"
]

View File

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

View File

@ -0,0 +1,3 @@
{
"folder": "daily"
}

22
.obsidian_back/graph.json Normal file
View 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": 1,
"close": false
}

View File

@ -0,0 +1,26 @@
{
"app:delete-file": [
{
"modifiers": [
"Alt"
],
"key": "D"
}
],
"workspace:split-horizontal": [
{
"modifiers": [
"Alt"
],
"key": "H"
}
],
"workspace:split-vertical": [
{
"modifiers": [
"Alt"
],
"key": "V"
}
]
}

File diff suppressed because one or more lines are too long

View File

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

View File

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

View File

@ -0,0 +1,8 @@
{
"enableProxy": true,
"httpProxy": "socks5://192.168.65.5:1080",
"httpsProxy": "socks5://192.168.65.5:1080",
"socksProxy": "socks5://192.168.65.5:1080",
"bypassRules": "<local>,127.*,10.*,172.16.*,172.17.*,172.18.*,172.19.*,172.20.*,172.21.*,172.22.*,172.23.*,172.24.*,172.25.*,172.26.*,172.27.*,172.28.*,172.29.*,172.30.*,172.31.*,192.168.*",
"pluginTokens": "persist:surfing-vault-${appId}"
}

Some files were not shown because too many files have changed in this diff Show More