initial
This commit is contained in:
commit
13cab8d1e1
3
.obsidian/app.json
vendored
Normal file
3
.obsidian/app.json
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"promptDelete": false
|
||||||
|
}
|
||||||
3
.obsidian/appearance.json
vendored
Normal file
3
.obsidian/appearance.json
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"cssTheme": "Minimal"
|
||||||
|
}
|
||||||
4
.obsidian/community-plugins.json
vendored
Normal file
4
.obsidian/community-plugins.json
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
[
|
||||||
|
"obsidian-git",
|
||||||
|
"canvas2document"
|
||||||
|
]
|
||||||
31
.obsidian/core-plugins.json
vendored
Normal file
31
.obsidian/core-plugins.json
vendored
Normal 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": false,
|
||||||
|
"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
|
||||||
|
}
|
||||||
22
.obsidian/graph.json
vendored
Normal file
22
.obsidian/graph.json
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"collapse-filter": true,
|
||||||
|
"search": "",
|
||||||
|
"showTags": false,
|
||||||
|
"showAttachments": false,
|
||||||
|
"hideUnresolved": false,
|
||||||
|
"showOrphans": true,
|
||||||
|
"collapse-color-groups": true,
|
||||||
|
"colorGroups": [],
|
||||||
|
"collapse-display": true,
|
||||||
|
"showArrow": false,
|
||||||
|
"textFadeMultiplier": 0,
|
||||||
|
"nodeSizeMultiplier": 1,
|
||||||
|
"lineSizeMultiplier": 1,
|
||||||
|
"collapse-forces": true,
|
||||||
|
"centerStrength": 0.518713248970312,
|
||||||
|
"repelStrength": 10,
|
||||||
|
"linkStrength": 1,
|
||||||
|
"linkDistance": 250,
|
||||||
|
"scale": 1,
|
||||||
|
"close": true
|
||||||
|
}
|
||||||
576
.obsidian/plugins/canvas2document/main.js
vendored
Normal file
576
.obsidian/plugins/canvas2document/main.js
vendored
Normal file
@ -0,0 +1,576 @@
|
|||||||
|
/*
|
||||||
|
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 __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);
|
||||||
|
|
||||||
|
// main.ts
|
||||||
|
var main_exports = {};
|
||||||
|
__export(main_exports, {
|
||||||
|
C2DSettingTab: () => C2DSettingTab,
|
||||||
|
default: () => Canvas2DocumentPlugin
|
||||||
|
});
|
||||||
|
module.exports = __toCommonJS(main_exports);
|
||||||
|
var import_obsidian = require("obsidian");
|
||||||
|
var path = __toESM(require("path"));
|
||||||
|
var DEFAULT_SETTINGS = {
|
||||||
|
usefrontmatter: true,
|
||||||
|
useedgelabels: true
|
||||||
|
};
|
||||||
|
var C2DSettingTab = class extends import_obsidian.PluginSettingTab {
|
||||||
|
constructor(app, plugin) {
|
||||||
|
super(app, plugin);
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
display() {
|
||||||
|
let { containerEl } = this;
|
||||||
|
containerEl.empty();
|
||||||
|
new import_obsidian.Setting(containerEl).setName("Include YAML frontmatter from embedded documents").setDesc("Makes metadata from embedded documents usable in target document").addToggle(
|
||||||
|
(toggle) => toggle.setValue(this.plugin.settings.usefrontmatter).onChange(async (value) => {
|
||||||
|
this.plugin.settings.usefrontmatter = value;
|
||||||
|
await this.plugin.saveSettings();
|
||||||
|
})
|
||||||
|
);
|
||||||
|
new import_obsidian.Setting(containerEl).setName("Include labels of canvas elements").setDesc("Makes connections descriptions usable in target document").addToggle(
|
||||||
|
(toggle) => toggle.setValue(this.plugin.settings.useedgelabels).onChange(async (value) => {
|
||||||
|
this.plugin.settings.useedgelabels = value;
|
||||||
|
await this.plugin.saveSettings();
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var Canvas2DocumentPlugin = class extends import_obsidian.Plugin {
|
||||||
|
async onload() {
|
||||||
|
await this.loadSettings();
|
||||||
|
this.addSettingTab(new C2DSettingTab(this.app, this));
|
||||||
|
if (this.app.vault.adapter instanceof import_obsidian.FileSystemAdapter) {
|
||||||
|
this.fsadapter = this.app.vault.adapter;
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.addCommand({
|
||||||
|
id: "run-conversion",
|
||||||
|
name: "Step 1 - Convert canvas to a longform document",
|
||||||
|
callback: async () => {
|
||||||
|
const canvStruct = await this.readCanvasStruct();
|
||||||
|
if (canvStruct == false) {
|
||||||
|
new import_obsidian.Notice(`this is not a canvas file`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let [contents, myparsed_data] = await this.readCanvasData(canvStruct);
|
||||||
|
const result = await this.writeCanvDocFile(contents, canvStruct, myparsed_data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.addCommand({
|
||||||
|
id: "run-redoc",
|
||||||
|
name: "Step 2 - Clear canvas2document target document",
|
||||||
|
callback: async () => {
|
||||||
|
const canvStruct = await this.readC2Dtarget();
|
||||||
|
if (canvStruct == false) {
|
||||||
|
new import_obsidian.Notice(`this is not a canvas2document target file`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.writeC2Doc(canvStruct);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.addRibbonIcon("image-down", "C2D Step 1 - Convert Canvas to draft doc", () => {
|
||||||
|
this.app.commands.executeCommandById("canvas2document:run-conversion");
|
||||||
|
});
|
||||||
|
this.addRibbonIcon("file-input", "C2D Step 2 - Make cleared document", () => {
|
||||||
|
this.app.commands.executeCommandById("canvas2document:run-redoc");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
async loadSettings() {
|
||||||
|
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
|
||||||
|
}
|
||||||
|
async saveSettings() {
|
||||||
|
await this.saveData(this.settings);
|
||||||
|
}
|
||||||
|
onunload() {
|
||||||
|
}
|
||||||
|
async readC2Dtarget() {
|
||||||
|
let activeFile = this.app.workspace.getActiveFile();
|
||||||
|
if (!activeFile || !activeFile.name.includes("_fromCanvas.md")) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
let mdFolderPath = path.dirname(activeFile.path);
|
||||||
|
}
|
||||||
|
let content = this.app.vault.cachedRead(activeFile);
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
async writeC2Doc(canvStruct) {
|
||||||
|
let activeFile = this.app.workspace.getActiveFile();
|
||||||
|
let mdFolderPath = path.dirname(activeFile.path);
|
||||||
|
const regex = /\!\[\[([^[\]]+)\]\]|<iframe\s+[^>]*src="(.*?)"/g;
|
||||||
|
const matches = [];
|
||||||
|
let match;
|
||||||
|
while ((match = regex.exec(canvStruct)) !== null) {
|
||||||
|
if (match[1]) {
|
||||||
|
matches.push(match[1]);
|
||||||
|
} else if (match[2]) {
|
||||||
|
matches.push(match[2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const edgelabelpattern = /<edgelabel\s+(?:data="(.*?)")?>(.*?)<\/edgelabel>/g;
|
||||||
|
const matchesedgelabel = [];
|
||||||
|
let matchel;
|
||||||
|
while ((matchel = edgelabelpattern.exec(canvStruct)) !== null) {
|
||||||
|
matchesedgelabel.push({
|
||||||
|
data: matchel[1],
|
||||||
|
// Captured `data` attribute (optional)
|
||||||
|
content: matchel[2]
|
||||||
|
// Captured inner content
|
||||||
|
});
|
||||||
|
}
|
||||||
|
let doccontentstring = "> [!success] This is your converted and cleared document from Canvas2Document\n> (you can delete this infobox)\n\n";
|
||||||
|
if (!matches) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let textfilenames = [];
|
||||||
|
let filenames = [];
|
||||||
|
matches.forEach((match2) => {
|
||||||
|
let embeddedfilename = match2.replace(/\!\[\[(.*)\]\]/, "$1");
|
||||||
|
if (embeddedfilename.endsWith(".md")) {
|
||||||
|
if (embeddedfilename.startsWith("./")) {
|
||||||
|
embeddedfilename = embeddedfilename.replace("./", "");
|
||||||
|
}
|
||||||
|
textfilenames.push(embeddedfilename);
|
||||||
|
}
|
||||||
|
filenames.push(embeddedfilename);
|
||||||
|
});
|
||||||
|
const fileContents = await Promise.all(
|
||||||
|
textfilenames.map(
|
||||||
|
async (file) => [file, await this.app.vault.cachedRead(this.app.vault.getAbstractFileByPath(file))]
|
||||||
|
)
|
||||||
|
);
|
||||||
|
for (const xfile of filenames) {
|
||||||
|
if (this.settings.useedgelabels) {
|
||||||
|
matchesedgelabel.forEach((label) => {
|
||||||
|
if (xfile === label.data) {
|
||||||
|
doccontentstring += '> [!info] (edge label in canvas for the following entry:) "' + label.content + '"\n\n';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (xfile.endsWith(".md")) {
|
||||||
|
const found = fileContents.find((element) => element[0] == xfile);
|
||||||
|
const { dir, name, ext } = path.parse(xfile);
|
||||||
|
if (!dir.endsWith("_canvas2doc-data")) {
|
||||||
|
doccontentstring += "# " + name + "\n\n";
|
||||||
|
}
|
||||||
|
const frontMatterInfo = (0, import_obsidian.getFrontMatterInfo)(found[1]);
|
||||||
|
let textfilestring = "";
|
||||||
|
if (this.settings.usefrontmatter && frontMatterInfo.exists) {
|
||||||
|
textfilestring = found[1].substring(frontMatterInfo.contentStart);
|
||||||
|
} else {
|
||||||
|
textfilestring = found[1];
|
||||||
|
}
|
||||||
|
doccontentstring += textfilestring + "\n\n";
|
||||||
|
} else if (xfile.startsWith("http")) {
|
||||||
|
doccontentstring += '<iframe width=500 height=300 src="' + xfile + '"></iframe>\n\n';
|
||||||
|
} else {
|
||||||
|
doccontentstring += "![[" + xfile + "]]\n\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let docFilename;
|
||||||
|
if (mdFolderPath == ".") {
|
||||||
|
docFilename = activeFile.basename + "_fromC2D.md";
|
||||||
|
} else {
|
||||||
|
docFilename = mdFolderPath + "/" + activeFile.basename + "_fromC2D.md";
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const exists = await this.fsadapter.exists(docFilename);
|
||||||
|
if (exists) {
|
||||||
|
const confirmed = await new Promise((resolve) => {
|
||||||
|
const notice = new import_obsidian.Notice("File " + docFilename + " already exists. Overwrite?", 0);
|
||||||
|
notice.noticeEl.createEl("button", { text: "Yes" }).onclick = () => {
|
||||||
|
notice.hide();
|
||||||
|
resolve(true);
|
||||||
|
};
|
||||||
|
notice.noticeEl.createEl("button", { text: "No" }).onclick = () => {
|
||||||
|
notice.hide();
|
||||||
|
resolve(false);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
if (!confirmed) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await this.fsadapter.write(docFilename, doccontentstring);
|
||||||
|
} catch (e) {
|
||||||
|
console.log("error writing the new cleared doc file " + e);
|
||||||
|
}
|
||||||
|
const docftab = await this.app.vault.getAbstractFileByPath(docFilename);
|
||||||
|
try {
|
||||||
|
await this.app.workspace.getLeaf("split").openFile(docftab);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
async readCanvasStruct() {
|
||||||
|
let activeFile = this.app.workspace.getActiveFile();
|
||||||
|
if (!activeFile || activeFile.extension != "canvas") {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
let mdFolderPath = path.dirname(activeFile.path);
|
||||||
|
}
|
||||||
|
let content = this.app.vault.cachedRead(activeFile);
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
async findAllXChildren(startGeneration, myparsed_data, fileContents, handledNodes, limitrecurseNodes, runcounterfunc, runcounterforeach) {
|
||||||
|
runcounterfunc++;
|
||||||
|
if (runcounterfunc > 30) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (const child of startGeneration) {
|
||||||
|
runcounterforeach++;
|
||||||
|
if (runcounterforeach > myparsed_data.edges2.length) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const nodeentry = myparsed_data.nodes.find((entry) => entry.id === child);
|
||||||
|
if (!handledNodes.has(child)) {
|
||||||
|
const result = await this.formatNode(nodeentry, 6);
|
||||||
|
fileContents.push(result);
|
||||||
|
handledNodes.add(child);
|
||||||
|
} else {
|
||||||
|
limitrecurseNodes++;
|
||||||
|
if (limitrecurseNodes > 30) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let children = myparsed_data.edges2.filter((edge) => edge.fromNode === child).map((edge) => edge.toNode);
|
||||||
|
if (children.length > 0) {
|
||||||
|
const continueRecursion = await this.findAllXChildren(children, myparsed_data, fileContents, handledNodes, limitrecurseNodes, runcounterfunc, runcounterforeach);
|
||||||
|
if (!continueRecursion)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
;
|
||||||
|
limitrecurseNodes++;
|
||||||
|
return limitrecurseNodes <= 30;
|
||||||
|
}
|
||||||
|
async traverseNodes(initialNodes, myparsed_data, fileContents, handledNodes) {
|
||||||
|
for (const node of initialNodes) {
|
||||||
|
const nodeentry = myparsed_data.nodes.find((entry) => entry.id === node);
|
||||||
|
if (!handledNodes.has(node)) {
|
||||||
|
const result = await this.formatNode(nodeentry, 1);
|
||||||
|
fileContents.push(result);
|
||||||
|
}
|
||||||
|
handledNodes.add(node);
|
||||||
|
const children1 = myparsed_data.edges2.filter((edge) => edge.fromNode === node).map((edge) => edge.toNode);
|
||||||
|
for (const child1 of children1) {
|
||||||
|
const nodeentry2 = myparsed_data.nodes.find((entry) => entry.id === child1);
|
||||||
|
if (!handledNodes.has(child1)) {
|
||||||
|
const result = await this.formatNode(nodeentry2, 2);
|
||||||
|
fileContents.push(result);
|
||||||
|
}
|
||||||
|
handledNodes.add(child1);
|
||||||
|
const children2 = myparsed_data.edges2.filter((edge) => edge.fromNode === child1).map((edge) => edge.toNode);
|
||||||
|
for (const child2 of children2) {
|
||||||
|
const nodeentry3 = myparsed_data.nodes.find((entry) => entry.id === child2);
|
||||||
|
if (!handledNodes.has(child2)) {
|
||||||
|
const result = await this.formatNode(nodeentry3, 3);
|
||||||
|
fileContents.push(result);
|
||||||
|
}
|
||||||
|
handledNodes.add(child2);
|
||||||
|
const children3 = myparsed_data.edges2.filter((edge) => edge.fromNode === child2).map((edge) => edge.toNode);
|
||||||
|
for (const child3 of children3) {
|
||||||
|
const nodeentry4 = myparsed_data.nodes.find((entry) => entry.id === child3);
|
||||||
|
if (!handledNodes.has(child3)) {
|
||||||
|
const result = await this.formatNode(nodeentry4, 4);
|
||||||
|
fileContents.push(result);
|
||||||
|
}
|
||||||
|
handledNodes.add(child3);
|
||||||
|
const children4 = myparsed_data.edges2.filter((edge) => edge.fromNode === child3).map((edge) => edge.toNode);
|
||||||
|
for (const child4 of children4) {
|
||||||
|
const nodeentry5 = myparsed_data.nodes.find((entry) => entry.id === child4);
|
||||||
|
if (!handledNodes.has(child4)) {
|
||||||
|
const result = await this.formatNode(nodeentry5, 5);
|
||||||
|
fileContents.push(result);
|
||||||
|
}
|
||||||
|
handledNodes.add(child4);
|
||||||
|
const children5 = myparsed_data.edges2.filter((edge) => edge.fromNode === child4).map((edge) => edge.toNode);
|
||||||
|
for (const child5 of children5) {
|
||||||
|
const nodeentry6 = myparsed_data.nodes.find((entry) => entry.id === child5);
|
||||||
|
if (!handledNodes.has(child5)) {
|
||||||
|
const result2 = await this.formatNode(nodeentry6, 6);
|
||||||
|
fileContents.push(result2);
|
||||||
|
}
|
||||||
|
handledNodes.add(child5);
|
||||||
|
const children6 = myparsed_data.edges2.filter((edge) => edge.fromNode === child5).map((edge) => edge.toNode);
|
||||||
|
let runcounterfunc = 0;
|
||||||
|
let runcounterforeach = 0;
|
||||||
|
let limitrecurseNodes = 0;
|
||||||
|
const result = await this.findAllXChildren(children6, myparsed_data, fileContents, handledNodes, limitrecurseNodes, runcounterfunc, runcounterforeach);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
async readCanvasData(struct) {
|
||||||
|
const fileContents = [];
|
||||||
|
let myparsed_data = JSON.parse(struct);
|
||||||
|
const singleNodeIDs = /* @__PURE__ */ new Set();
|
||||||
|
const groupNodes = /* @__PURE__ */ new Set();
|
||||||
|
myparsed_data.nodes.forEach((node) => {
|
||||||
|
if (node.type === "group") {
|
||||||
|
groupNodes.add(node.id);
|
||||||
|
} else {
|
||||||
|
singleNodeIDs.add(node.id);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const fromNodes = /* @__PURE__ */ new Set();
|
||||||
|
const toNodes = /* @__PURE__ */ new Set();
|
||||||
|
let groupClearedEdges = [];
|
||||||
|
let resa = await myparsed_data.edges.forEach((edge) => {
|
||||||
|
if (groupNodes.has(edge.fromNode) || groupNodes.has(edge.toNode)) {
|
||||||
|
} else {
|
||||||
|
fromNodes.add(edge.fromNode);
|
||||||
|
toNodes.add(edge.toNode);
|
||||||
|
groupClearedEdges.push(edge);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
myparsed_data.edges2 = groupClearedEdges;
|
||||||
|
let handledNodes = /* @__PURE__ */ new Set();
|
||||||
|
const skiphandledNodes = true;
|
||||||
|
let nodesWithoutParents = [...singleNodeIDs].filter((node) => !toNodes.has(node));
|
||||||
|
if (nodesWithoutParents.length === 0) {
|
||||||
|
nodesWithoutParents = [...singleNodeIDs];
|
||||||
|
}
|
||||||
|
const traverseresult = await this.traverseNodes(nodesWithoutParents, myparsed_data, fileContents, handledNodes);
|
||||||
|
const diff = new Set([...singleNodeIDs].filter((x) => !handledNodes.has(x)));
|
||||||
|
if (diff.size > 0) {
|
||||||
|
const traverseresult2 = await this.traverseNodes(diff, myparsed_data, fileContents, handledNodes);
|
||||||
|
}
|
||||||
|
return [fileContents, myparsed_data];
|
||||||
|
}
|
||||||
|
async formatNode(node, level) {
|
||||||
|
const id = node.id;
|
||||||
|
const type = node.type;
|
||||||
|
let nodefile = "";
|
||||||
|
if (type === "file") {
|
||||||
|
nodefile = node.file;
|
||||||
|
const { name, ext } = path.parse(nodefile);
|
||||||
|
if (ext === ".md") {
|
||||||
|
return [id, type, nodefile, level, "textfile", name];
|
||||||
|
} else if (ext === ".canvas") {
|
||||||
|
return [id, type, nodefile, level, "embeddedcanvas", name];
|
||||||
|
} else if (ext === ".jpg" || ext == ".jpeg" || ext === ".png" || ext === ".gif") {
|
||||||
|
return [id, type, nodefile, level, "contentimage", name + "." + ext];
|
||||||
|
} else if (ext === ".mp3" || ext === ".wav" || ext === ".ogg") {
|
||||||
|
return [id, type, nodefile, level, "contentaudio", name + "." + ext];
|
||||||
|
} else if (ext === ".mp4" || ext === ".webm") {
|
||||||
|
return [id, type, nodefile, level, "contentvideo", name + "." + ext];
|
||||||
|
} else if (ext === ".pdf") {
|
||||||
|
return [id, type, nodefile, level, "contentpdf", name + "." + ext];
|
||||||
|
} else {
|
||||||
|
return [id, type, nodefile, level, "xfile", name + "." + ext];
|
||||||
|
}
|
||||||
|
} else if (type === "link") {
|
||||||
|
if (node.url.includes("youtube")) {
|
||||||
|
const url = node.url;
|
||||||
|
return [id, type, url, level, "contentyoutube", node.url];
|
||||||
|
} else {
|
||||||
|
return [id, type, node.url, level, "contentlink", node.url];
|
||||||
|
}
|
||||||
|
} else if (type === "text") {
|
||||||
|
const text = node.text;
|
||||||
|
const textPreview = text.substring(0, 100);
|
||||||
|
return [id, type, "node", level, text, textPreview];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
async writeCanvDocFile(content, convStruct, myparsed_data) {
|
||||||
|
let activeFile = this.app.workspace.getActiveFile();
|
||||||
|
let mdFolderPath = path.dirname(activeFile.path);
|
||||||
|
let writeworkdir = mdFolderPath + "/" + activeFile.basename + "_canvas2doc-data";
|
||||||
|
this.fsadapter.mkdir(writeworkdir);
|
||||||
|
let canvasFile;
|
||||||
|
let canvasFilename;
|
||||||
|
if (mdFolderPath == ".") {
|
||||||
|
canvasFilename = activeFile.basename + "_fromCanvas.md";
|
||||||
|
} else {
|
||||||
|
canvasFilename = mdFolderPath + "/" + activeFile.basename + "_fromCanvas.md";
|
||||||
|
}
|
||||||
|
let contentString = "> [!info] This is an automatically generated document from Plugin [Canvas2Document](https://github.com/slnsys/obsidian-canvas2document)\n> arrange the document as you need with the outline, then call *Clear canvas2document target document*\n\n";
|
||||||
|
for (const element of content) {
|
||||||
|
let cnfname = "";
|
||||||
|
let heading = "";
|
||||||
|
for (let i = 0; i < element[3]; i++) {
|
||||||
|
heading += "#";
|
||||||
|
}
|
||||||
|
if (element[1] == "text") {
|
||||||
|
cnfname = writeworkdir + "/newdoc-node_" + element[0] + "_fromCanvas.md";
|
||||||
|
contentString += "\n\n" + heading + " _card " + element[5] + "\n";
|
||||||
|
contentString += element[2] + " ^" + element[0] + "\n\n";
|
||||||
|
contentString += "> [!tip] link navigation from the canvas\n";
|
||||||
|
for (const edge of myparsed_data.edges2) {
|
||||||
|
if (edge.fromNode == element[0]) {
|
||||||
|
const found = content.find((element2) => element2[0] == edge.toNode);
|
||||||
|
const firstline = found[5].split("\n")[0];
|
||||||
|
const found5 = firstline.replace(/#/g, "");
|
||||||
|
contentString += "> linking to: [[#^" + edge.toNode + "|" + found5 + "]]\n";
|
||||||
|
}
|
||||||
|
if (edge.toNode == element[0]) {
|
||||||
|
const found = content.find((element2) => element2[0] == edge.fromNode);
|
||||||
|
const firstline = found[5].split("\n")[0];
|
||||||
|
const found5 = firstline.replace(/#/g, "");
|
||||||
|
if (edge.label != void 0) {
|
||||||
|
contentString += "> linked from: [[#^" + edge.fromNode + "|" + found5 + ']] ("<edgelabel data="' + cnfname + '">' + edge.label + '</edgelabel>")\n';
|
||||||
|
} else {
|
||||||
|
contentString += "> linked from: [[#^" + edge.fromNode + "|" + found5 + "]]\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
contentString += "\n ![[" + cnfname + "]]\n\n";
|
||||||
|
let canvasnodeFile;
|
||||||
|
try {
|
||||||
|
let cnfabst2 = this.app.vault.getAbstractFileByPath(cnfname);
|
||||||
|
await this.fsadapter.write(cnfname, element[4]);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (element[1] == "link") {
|
||||||
|
contentString += "\n\n" + heading + " _link " + element[5] + "\n";
|
||||||
|
contentString += element[2] + " ^" + element[0] + "\n\n";
|
||||||
|
contentString += "> [!tip] link navigation from the canvas\n";
|
||||||
|
for (const edge of myparsed_data.edges2) {
|
||||||
|
if (edge.fromNode == element[0]) {
|
||||||
|
const found = content.find((element2) => element2[0] == edge.toNode);
|
||||||
|
const firstline = found[5].split("\n")[0];
|
||||||
|
const found5 = firstline.replace(/#/g, "");
|
||||||
|
contentString += "> linking to: [[#^" + edge.toNode + "|" + found5 + "]]\n";
|
||||||
|
}
|
||||||
|
if (edge.toNode == element[0]) {
|
||||||
|
const found = content.find((element2) => element2[0] == edge.fromNode);
|
||||||
|
const firstline = found[5].split("\n")[0];
|
||||||
|
const found5 = firstline.replace(/#/g, "");
|
||||||
|
if (edge.label != void 0) {
|
||||||
|
contentString += "> linked from: [[#^" + edge.fromNode + "|" + found5 + ']] ("<edgelabel data="' + element[2] + '">' + edge.label + '</edgelabel>")\n';
|
||||||
|
} else {
|
||||||
|
contentString += "> linked from: [[#^" + edge.fromNode + "|" + found5 + "]]\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (element[4] == "contentyoutube") {
|
||||||
|
contentString += "\n \n\n";
|
||||||
|
} else if (element[4] == "contentlink") {
|
||||||
|
contentString += '\n <iframe width=500 height=300 src="' + element[2] + '"></iframe>\n\n';
|
||||||
|
}
|
||||||
|
} else if (element[1] == "file") {
|
||||||
|
if (element[4] == "contentimage" || element[4] == "contentpdf") {
|
||||||
|
contentString += "\n\n" + heading + " _Media " + element[5] + "\n";
|
||||||
|
contentString += element[2] + " ^" + element[0] + "\n\n";
|
||||||
|
contentString += "> [!tip] link navigation from the canvas\n";
|
||||||
|
for (const edge of myparsed_data.edges2) {
|
||||||
|
if (edge.fromNode == element[0]) {
|
||||||
|
const found = content.find((element2) => element2[0] == edge.toNode);
|
||||||
|
const firstline = found[5].split("\n")[0];
|
||||||
|
const found5 = firstline.replace(/#/g, "");
|
||||||
|
contentString += "> linking to: [[#^" + edge.toNode + "|" + found5 + "]]\n";
|
||||||
|
}
|
||||||
|
if (edge.toNode == element[0]) {
|
||||||
|
const found = content.find((element2) => element2[0] == edge.fromNode);
|
||||||
|
const firstline = found[5].split("\n")[0];
|
||||||
|
const found5 = firstline.replace(/#/g, "");
|
||||||
|
if (edge.label != void 0) {
|
||||||
|
contentString += "> linked from: [[#^" + edge.fromNode + "|" + found5 + ']] ("<edgelabel data="' + element[2] + '">' + edge.label + '</edgelabel>")\n';
|
||||||
|
} else {
|
||||||
|
contentString += "> linked from: [[#^" + edge.fromNode + "|" + found5 + "]]\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (element[4] == "contentpdf") {
|
||||||
|
contentString += "\n ![[" + element[2] + "]]\n\n";
|
||||||
|
} else if (element[4] == "contentimage") {
|
||||||
|
contentString += "\n ![[" + element[2] + "]]\n\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
contentString += "\n\n" + heading + " _noteFile " + element[5] + "\n";
|
||||||
|
contentString += element[2] + " ^" + element[0] + "\n\n";
|
||||||
|
contentString += "> [!tip] link navigation from the canvas\n";
|
||||||
|
for (const edge of myparsed_data.edges2) {
|
||||||
|
if (edge.fromNode == element[0]) {
|
||||||
|
const found = content.find((element2) => element2[0] == edge.toNode);
|
||||||
|
const firstline = found[5].split("\n")[0];
|
||||||
|
const found5 = firstline.replace(/#/g, "");
|
||||||
|
contentString += "> linking to: [[#^" + edge.toNode + "|" + found5 + "]]\n";
|
||||||
|
}
|
||||||
|
if (edge.toNode == element[0]) {
|
||||||
|
const found = content.find((element2) => element2[0] == edge.fromNode);
|
||||||
|
const firstline = found[5].split("\n")[0];
|
||||||
|
const found5 = firstline.replace(/#/g, "");
|
||||||
|
if (edge.label != void 0) {
|
||||||
|
contentString += "> linked from: [[#^" + edge.fromNode + "|" + found5 + ']] ("<edgelabel data="' + element[2] + '">' + edge.label + '</edgelabel>")\n';
|
||||||
|
} else {
|
||||||
|
contentString += "> linked from: [[#^" + edge.fromNode + "|" + found5 + "]]\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
contentString += "\n ![[" + element[2] + "]]\n\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const exists = await this.fsadapter.exists(canvasFilename);
|
||||||
|
if (exists) {
|
||||||
|
const confirmed = await new Promise((resolve) => {
|
||||||
|
const notice = new import_obsidian.Notice("File " + canvasFilename + " already exists. Overwrite?", 0);
|
||||||
|
notice.noticeEl.createEl("button", { text: "Yes" }).onclick = () => {
|
||||||
|
notice.hide();
|
||||||
|
resolve(true);
|
||||||
|
};
|
||||||
|
notice.noticeEl.createEl("button", { text: "No" }).onclick = () => {
|
||||||
|
notice.hide();
|
||||||
|
resolve(false);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
if (!confirmed) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await this.fsadapter.write(canvasFilename, contentString);
|
||||||
|
} catch (e) {
|
||||||
|
console.log("error writing the new doc file " + e);
|
||||||
|
}
|
||||||
|
const cnfabst = await this.app.vault.getAbstractFileByPath(canvasFilename);
|
||||||
|
try {
|
||||||
|
await this.app.workspace.getLeaf("split").openFile(cnfabst);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* nosourcemap */
|
||||||
10
.obsidian/plugins/canvas2document/manifest.json
vendored
Normal file
10
.obsidian/plugins/canvas2document/manifest.json
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"id": "canvas2document",
|
||||||
|
"name": "Canvas2Document",
|
||||||
|
"version": "1.3.0",
|
||||||
|
"minAppVersion": "1.5.12",
|
||||||
|
"description": "Convert a complete Canvas to a long form document, integrating all cards, notes, images and other media content into a single markdown file.",
|
||||||
|
"author": "slnsys",
|
||||||
|
"authorUrl": "https://github.com/slnsys",
|
||||||
|
"isDesktopOnly": true
|
||||||
|
}
|
||||||
59
.obsidian/plugins/obsidian-git/data.json
vendored
Normal file
59
.obsidian/plugins/obsidian-git/data.json
vendored
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
{
|
||||||
|
"commitMessage": "vault backup: {{date}}",
|
||||||
|
"commitDateFormat": "YYYY-MM-DD HH:mm:ss",
|
||||||
|
"autoSaveInterval": 0,
|
||||||
|
"autoPushInterval": 0,
|
||||||
|
"autoPullInterval": 0,
|
||||||
|
"autoPullOnBoot": false,
|
||||||
|
"disablePush": false,
|
||||||
|
"pullBeforePush": true,
|
||||||
|
"disablePopups": false,
|
||||||
|
"disablePopupsForNoChanges": false,
|
||||||
|
"listChangedFilesInMessageBody": false,
|
||||||
|
"showStatusBar": true,
|
||||||
|
"updateSubmodules": false,
|
||||||
|
"syncMethod": "merge",
|
||||||
|
"customMessageOnAutoBackup": false,
|
||||||
|
"autoBackupAfterFileChange": false,
|
||||||
|
"treeStructure": false,
|
||||||
|
"refreshSourceControl": true,
|
||||||
|
"basePath": "",
|
||||||
|
"differentIntervalCommitAndPush": false,
|
||||||
|
"changedFilesInStatusBar": false,
|
||||||
|
"showedMobileNotice": true,
|
||||||
|
"refreshSourceControlTimer": 7000,
|
||||||
|
"showBranchStatusBar": true,
|
||||||
|
"setLastSaveToLastCommit": false,
|
||||||
|
"submoduleRecurseCheckout": false,
|
||||||
|
"gitDir": "",
|
||||||
|
"showFileMenu": true,
|
||||||
|
"authorInHistoryView": "hide",
|
||||||
|
"dateInHistoryView": false,
|
||||||
|
"diffStyle": "split",
|
||||||
|
"lineAuthor": {
|
||||||
|
"show": false,
|
||||||
|
"followMovement": "inactive",
|
||||||
|
"authorDisplay": "initials",
|
||||||
|
"showCommitHash": false,
|
||||||
|
"dateTimeFormatOptions": "date",
|
||||||
|
"dateTimeFormatCustomString": "YYYY-MM-DD HH:mm",
|
||||||
|
"dateTimeTimezone": "viewer-local",
|
||||||
|
"coloringMaxAge": "1y",
|
||||||
|
"colorNew": {
|
||||||
|
"r": 255,
|
||||||
|
"g": 150,
|
||||||
|
"b": 150
|
||||||
|
},
|
||||||
|
"colorOld": {
|
||||||
|
"r": 120,
|
||||||
|
"g": 160,
|
||||||
|
"b": 255
|
||||||
|
},
|
||||||
|
"textColorCss": "var(--text-muted)",
|
||||||
|
"ignoreWhitespace": false,
|
||||||
|
"gutterSpacingFallbackLength": 5,
|
||||||
|
"lastShownAuthorDisplay": "initials",
|
||||||
|
"lastShownDateTimeFormatOptions": "date"
|
||||||
|
},
|
||||||
|
"autoCommitMessage": "vault backup: {{date}}"
|
||||||
|
}
|
||||||
416
.obsidian/plugins/obsidian-git/main.js
vendored
Normal file
416
.obsidian/plugins/obsidian-git/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
10
.obsidian/plugins/obsidian-git/manifest.json
vendored
Normal file
10
.obsidian/plugins/obsidian-git/manifest.json
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"author": "Vinzent",
|
||||||
|
"authorUrl": "https://github.com/Vinzent03",
|
||||||
|
"id": "obsidian-git",
|
||||||
|
"name": "Git",
|
||||||
|
"description": "Integrate Git version control with automatic backup and other advanced features.",
|
||||||
|
"isDesktopOnly": false,
|
||||||
|
"fundingUrl": "https://ko-fi.com/vinzent",
|
||||||
|
"version": "2.32.1"
|
||||||
|
}
|
||||||
23
.obsidian/plugins/obsidian-git/obsidian_askpass.sh
vendored
Normal file
23
.obsidian/plugins/obsidian-git/obsidian_askpass.sh
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
PROMPT="$1"
|
||||||
|
TEMP_FILE="$OBSIDIAN_GIT_CREDENTIALS_INPUT"
|
||||||
|
|
||||||
|
cleanup() {
|
||||||
|
rm -f "$TEMP_FILE" "$TEMP_FILE.response"
|
||||||
|
}
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
echo "$PROMPT" > "$TEMP_FILE"
|
||||||
|
|
||||||
|
while [ ! -e "$TEMP_FILE.response" ]; do
|
||||||
|
if [ ! -e "$TEMP_FILE" ]; then
|
||||||
|
echo "Trigger file got removed: Abort" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
sleep 0.1
|
||||||
|
done
|
||||||
|
|
||||||
|
RESPONSE=$(cat "$TEMP_FILE.response")
|
||||||
|
|
||||||
|
echo "$RESPONSE"
|
||||||
576
.obsidian/plugins/obsidian-git/styles.css
vendored
Normal file
576
.obsidian/plugins/obsidian-git/styles.css
vendored
Normal file
@ -0,0 +1,576 @@
|
|||||||
|
@keyframes loading {
|
||||||
|
0% {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="git-view"] .button-border {
|
||||||
|
border: 2px solid var(--interactive-accent);
|
||||||
|
border-radius: var(--radius-s);
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="git-view"] .view-content {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="git-history-view"] .view-content {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loading > svg {
|
||||||
|
animation: 2s linear infinite loading;
|
||||||
|
transform-origin: 50% 50%;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.obsidian-git-center {
|
||||||
|
margin: auto;
|
||||||
|
text-align: center;
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.obsidian-git-textarea {
|
||||||
|
display: block;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.obsidian-git-disabled {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.obsidian-git-center-button {
|
||||||
|
display: block;
|
||||||
|
margin: 20px auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tooltip.mod-left {
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tooltip.mod-right {
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
}
|
||||||
|
.git-tools {
|
||||||
|
display: flex;
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
.git-tools .type {
|
||||||
|
padding-left: var(--size-2-1);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-tools .type[data-type="M"] {
|
||||||
|
color: orange;
|
||||||
|
}
|
||||||
|
.git-tools .type[data-type="D"] {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
.git-tools .buttons {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
.git-tools .buttons > * {
|
||||||
|
padding: 0 0;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.is-active .git-tools .buttons > * {
|
||||||
|
color: var(--nav-item-color-active);
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-author {
|
||||||
|
color: var(--text-accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-date {
|
||||||
|
color: var(--text-accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-ref {
|
||||||
|
color: var(--text-accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-d-none {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-wrapper {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-file-header {
|
||||||
|
background-color: var(--background-primary);
|
||||||
|
border-bottom: 1px solid var(--interactive-accent);
|
||||||
|
font-family: var(--font-monospace);
|
||||||
|
height: 35px;
|
||||||
|
padding: 5px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-file-header,
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-file-stats {
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-file-stats {
|
||||||
|
font-size: 14px;
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-lines-added {
|
||||||
|
border: 1px solid #b4e2b4;
|
||||||
|
border-radius: 5px 0 0 5px;
|
||||||
|
color: #399839;
|
||||||
|
padding: 2px;
|
||||||
|
text-align: right;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-lines-deleted {
|
||||||
|
border: 1px solid #e9aeae;
|
||||||
|
border-radius: 0 5px 5px 0;
|
||||||
|
color: #c33;
|
||||||
|
margin-left: 1px;
|
||||||
|
padding: 2px;
|
||||||
|
text-align: left;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-file-name-wrapper {
|
||||||
|
-webkit-box-align: center;
|
||||||
|
-ms-flex-align: center;
|
||||||
|
align-items: center;
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
font-size: 15px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-file-name {
|
||||||
|
overflow-x: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-file-wrapper {
|
||||||
|
border: 1px solid var(--background-modifier-border);
|
||||||
|
border-radius: 3px;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-file-collapse {
|
||||||
|
-webkit-box-pack: end;
|
||||||
|
-ms-flex-pack: end;
|
||||||
|
-webkit-box-align: center;
|
||||||
|
-ms-flex-align: center;
|
||||||
|
align-items: center;
|
||||||
|
border: 1px solid var(--background-modifier-border);
|
||||||
|
border-radius: 3px;
|
||||||
|
cursor: pointer;
|
||||||
|
display: none;
|
||||||
|
font-size: 12px;
|
||||||
|
justify-content: flex-end;
|
||||||
|
padding: 4px 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-file-collapse.d2h-selected {
|
||||||
|
background-color: #c8e1ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-file-collapse-input {
|
||||||
|
margin: 0 4px 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-diff-table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
font-family: Menlo, Consolas, monospace;
|
||||||
|
font-size: 13px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-files-diff {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-file-diff {
|
||||||
|
overflow-y: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-file-side-diff {
|
||||||
|
display: inline-block;
|
||||||
|
margin-bottom: -8px;
|
||||||
|
margin-right: -4px;
|
||||||
|
overflow-x: scroll;
|
||||||
|
overflow-y: hidden;
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-code-line {
|
||||||
|
padding: 0 8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-code-line,
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-line {
|
||||||
|
display: inline-block;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
white-space: nowrap;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-line {
|
||||||
|
padding: 0 4.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-code-line-ctn {
|
||||||
|
word-wrap: normal;
|
||||||
|
background: none;
|
||||||
|
display: inline-block;
|
||||||
|
padding: 0;
|
||||||
|
-webkit-user-select: text;
|
||||||
|
-moz-user-select: text;
|
||||||
|
-ms-user-select: text;
|
||||||
|
user-select: text;
|
||||||
|
vertical-align: middle;
|
||||||
|
white-space: pre;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-light .workspace-leaf-content[data-type="diff-view"] .d2h-code-line del,
|
||||||
|
.theme-light
|
||||||
|
.workspace-leaf-content[data-type="diff-view"]
|
||||||
|
.d2h-code-side-line
|
||||||
|
del {
|
||||||
|
background-color: #ffb6ba;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark .workspace-leaf-content[data-type="diff-view"] .d2h-code-line del,
|
||||||
|
.theme-dark
|
||||||
|
.workspace-leaf-content[data-type="diff-view"]
|
||||||
|
.d2h-code-side-line
|
||||||
|
del {
|
||||||
|
background-color: #8d232881;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-code-line del,
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-code-line ins,
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-line del,
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-line ins {
|
||||||
|
border-radius: 0.2em;
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: -1px;
|
||||||
|
text-decoration: none;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-light .workspace-leaf-content[data-type="diff-view"] .d2h-code-line ins,
|
||||||
|
.theme-light
|
||||||
|
.workspace-leaf-content[data-type="diff-view"]
|
||||||
|
.d2h-code-side-line
|
||||||
|
ins {
|
||||||
|
background-color: #97f295;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark .workspace-leaf-content[data-type="diff-view"] .d2h-code-line ins,
|
||||||
|
.theme-dark
|
||||||
|
.workspace-leaf-content[data-type="diff-view"]
|
||||||
|
.d2h-code-side-line
|
||||||
|
ins {
|
||||||
|
background-color: #1d921996;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-code-line-prefix {
|
||||||
|
word-wrap: normal;
|
||||||
|
background: none;
|
||||||
|
display: inline;
|
||||||
|
padding: 0;
|
||||||
|
white-space: pre;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .line-num1 {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .line-num1,
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .line-num2 {
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 0 0.5em;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
width: 3.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .line-num2 {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-code-linenumber {
|
||||||
|
background-color: var(--background-primary);
|
||||||
|
border: solid var(--background-modifier-border);
|
||||||
|
border-width: 0 1px;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
color: var(--text-muted);
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
text-align: right;
|
||||||
|
width: 7.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-code-linenumber:after {
|
||||||
|
content: "\200b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-linenumber {
|
||||||
|
background-color: var(--background-primary);
|
||||||
|
border: solid var(--background-modifier-border);
|
||||||
|
border-width: 0 1px;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
color: var(--text-muted);
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-block;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 0 0.5em;
|
||||||
|
position: absolute;
|
||||||
|
text-align: right;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
width: 4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-diff-tbody tr {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-linenumber:after {
|
||||||
|
content: "\200b";
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-emptyplaceholder,
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-emptyplaceholder {
|
||||||
|
background-color: var(--background-primary);
|
||||||
|
border-color: var(--background-modifier-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-code-line-prefix,
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-code-linenumber,
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-linenumber,
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-emptyplaceholder {
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-code-linenumber,
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-code-side-linenumber {
|
||||||
|
direction: rtl;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-light .workspace-leaf-content[data-type="diff-view"] .d2h-del {
|
||||||
|
background-color: #fee8e9;
|
||||||
|
border-color: #e9aeae;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-light .workspace-leaf-content[data-type="diff-view"] .d2h-ins {
|
||||||
|
background-color: #dfd;
|
||||||
|
border-color: #b4e2b4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark .workspace-leaf-content[data-type="diff-view"] .d2h-del {
|
||||||
|
background-color: #521b1d83;
|
||||||
|
border-color: #691d1d73;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark .workspace-leaf-content[data-type="diff-view"] .d2h-ins {
|
||||||
|
background-color: rgba(30, 71, 30, 0.5);
|
||||||
|
border-color: #13501381;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-info {
|
||||||
|
background-color: var(--background-primary);
|
||||||
|
border-color: var(--background-modifier-border);
|
||||||
|
color: var(--text-normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-light
|
||||||
|
.workspace-leaf-content[data-type="diff-view"]
|
||||||
|
.d2h-file-diff
|
||||||
|
.d2h-del.d2h-change {
|
||||||
|
background-color: #fdf2d0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark
|
||||||
|
.workspace-leaf-content[data-type="diff-view"]
|
||||||
|
.d2h-file-diff
|
||||||
|
.d2h-del.d2h-change {
|
||||||
|
background-color: #55492480;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-light
|
||||||
|
.workspace-leaf-content[data-type="diff-view"]
|
||||||
|
.d2h-file-diff
|
||||||
|
.d2h-ins.d2h-change {
|
||||||
|
background-color: #ded;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-dark
|
||||||
|
.workspace-leaf-content[data-type="diff-view"]
|
||||||
|
.d2h-file-diff
|
||||||
|
.d2h-ins.d2h-change {
|
||||||
|
background-color: rgba(37, 78, 37, 0.418);
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-file-list-wrapper {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-file-list-wrapper a {
|
||||||
|
color: #3572b0;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"]
|
||||||
|
.d2h-file-list-wrapper
|
||||||
|
a:visited {
|
||||||
|
color: #3572b0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-file-list-header {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-file-list-title {
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-file-list-line {
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-file-list {
|
||||||
|
display: block;
|
||||||
|
list-style: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-file-list > li {
|
||||||
|
border-bottom: 1px solid var(--background-modifier-border);
|
||||||
|
margin: 0;
|
||||||
|
padding: 5px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-file-list > li:last-child {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-file-switch {
|
||||||
|
cursor: pointer;
|
||||||
|
display: none;
|
||||||
|
font-size: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-icon {
|
||||||
|
fill: currentColor;
|
||||||
|
margin-right: 10px;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-deleted {
|
||||||
|
color: #c33;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-added {
|
||||||
|
color: #399839;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-changed {
|
||||||
|
color: #d0b44c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-moved {
|
||||||
|
color: #3572b0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-tag {
|
||||||
|
background-color: var(--background-primary);
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
font-size: 10px;
|
||||||
|
margin-left: 5px;
|
||||||
|
padding: 0 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-deleted-tag {
|
||||||
|
border: 2px solid #c33;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-added-tag {
|
||||||
|
border: 1px solid #399839;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-changed-tag {
|
||||||
|
border: 1px solid #d0b44c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-leaf-content[data-type="diff-view"] .d2h-moved-tag {
|
||||||
|
border: 1px solid #3572b0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ====================== Line Authoring Information ====================== */
|
||||||
|
|
||||||
|
.cm-gutterElement.obs-git-blame-gutter {
|
||||||
|
/* Add background color to spacing inbetween and around the gutter for better aesthetics */
|
||||||
|
border-width: 0px 2px 0.2px 2px;
|
||||||
|
border-style: solid;
|
||||||
|
border-color: var(--background-secondary);
|
||||||
|
background-color: var(--background-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cm-gutterElement.obs-git-blame-gutter > div,
|
||||||
|
.line-author-settings-preview {
|
||||||
|
/* delegate text color to settings */
|
||||||
|
color: var(--obs-git-gutter-text);
|
||||||
|
font-family: monospace;
|
||||||
|
height: 100%; /* ensure, that age-based background color occupies entire parent */
|
||||||
|
text-align: right;
|
||||||
|
padding: 0px 6px 0px 6px;
|
||||||
|
white-space: pre; /* Keep spaces and do not collapse them. */
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 800px) {
|
||||||
|
/* hide git blame gutter not to superpose text */
|
||||||
|
.cm-gutterElement.obs-git-blame-gutter {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-unified-diff-view,
|
||||||
|
.git-split-diff-view .cm-deletedLine .cm-changedText {
|
||||||
|
background-color: #ee443330;
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-unified-diff-view,
|
||||||
|
.git-split-diff-view .cm-insertedLine .cm-changedText {
|
||||||
|
background-color: #22bb2230;
|
||||||
|
}
|
||||||
8
.obsidian/themes/Minimal/manifest.json
vendored
Normal file
8
.obsidian/themes/Minimal/manifest.json
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"name": "Minimal",
|
||||||
|
"version": "7.7.19",
|
||||||
|
"minAppVersion": "1.6.1",
|
||||||
|
"author": "@kepano",
|
||||||
|
"authorUrl": "https://twitter.com/kepano",
|
||||||
|
"fundingUrl": "https://www.buymeacoffee.com/kepano"
|
||||||
|
}
|
||||||
2223
.obsidian/themes/Minimal/theme.css
vendored
Normal file
2223
.obsidian/themes/Minimal/theme.css
vendored
Normal file
File diff suppressed because one or more lines are too long
213
.obsidian/workspace.json
vendored
Normal file
213
.obsidian/workspace.json
vendored
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
{
|
||||||
|
"main": {
|
||||||
|
"id": "ab3fcc2edae699c6",
|
||||||
|
"type": "split",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "fa3628cfab445996",
|
||||||
|
"type": "tabs",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "c355cf5b4fbfdebf",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "empty",
|
||||||
|
"state": {},
|
||||||
|
"icon": "lucide-file",
|
||||||
|
"title": "Neuer Tab"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"direction": "vertical"
|
||||||
|
},
|
||||||
|
"left": {
|
||||||
|
"id": "aab788ad8db2298f",
|
||||||
|
"type": "split",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "f67ca535fff072ea",
|
||||||
|
"type": "tabs",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "2d9c1423ecc4f4fd",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "file-explorer",
|
||||||
|
"state": {
|
||||||
|
"sortOrder": "alphabetical",
|
||||||
|
"autoReveal": true
|
||||||
|
},
|
||||||
|
"icon": "lucide-folder-closed",
|
||||||
|
"title": "Dateiexplorer"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "90afaa7a332e0a71",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "search",
|
||||||
|
"state": {
|
||||||
|
"query": "23",
|
||||||
|
"matchingCase": false,
|
||||||
|
"explainSearch": false,
|
||||||
|
"collapseAll": false,
|
||||||
|
"extraContext": false,
|
||||||
|
"sortOrder": "alphabetical"
|
||||||
|
},
|
||||||
|
"icon": "lucide-search",
|
||||||
|
"title": "Suchen"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "973cf816524133d5",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "bookmarks",
|
||||||
|
"state": {},
|
||||||
|
"icon": "lucide-bookmark",
|
||||||
|
"title": "Lesezeichen"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"direction": "horizontal",
|
||||||
|
"width": 300
|
||||||
|
},
|
||||||
|
"right": {
|
||||||
|
"id": "f2ab438071dee368",
|
||||||
|
"type": "split",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "f83c79b44dc36adc",
|
||||||
|
"type": "tabs",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"id": "86bf809d38ca25de",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "backlink",
|
||||||
|
"state": {
|
||||||
|
"file": "Willkommen.md",
|
||||||
|
"collapseAll": false,
|
||||||
|
"extraContext": false,
|
||||||
|
"sortOrder": "alphabetical",
|
||||||
|
"showSearch": false,
|
||||||
|
"searchQuery": "",
|
||||||
|
"backlinkCollapsed": false,
|
||||||
|
"unlinkedCollapsed": true
|
||||||
|
},
|
||||||
|
"icon": "links-coming-in",
|
||||||
|
"title": "Rückverweise für Willkommen"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "841efb2b05ffe592",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "outgoing-link",
|
||||||
|
"state": {
|
||||||
|
"file": "Willkommen.md",
|
||||||
|
"linksCollapsed": false,
|
||||||
|
"unlinkedCollapsed": true
|
||||||
|
},
|
||||||
|
"icon": "links-going-out",
|
||||||
|
"title": "Ausgehende Links von Willkommen öffnen"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "3563ef80b743646e",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "tag",
|
||||||
|
"state": {
|
||||||
|
"sortOrder": "frequency",
|
||||||
|
"useHierarchy": true,
|
||||||
|
"showSearch": false,
|
||||||
|
"searchQuery": ""
|
||||||
|
},
|
||||||
|
"icon": "lucide-tags",
|
||||||
|
"title": "Tags"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "d8a752578c742ae0",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "outline",
|
||||||
|
"state": {
|
||||||
|
"file": "Privat/Küchenplanner Tina.md",
|
||||||
|
"followCursor": false,
|
||||||
|
"showSearch": false,
|
||||||
|
"searchQuery": ""
|
||||||
|
},
|
||||||
|
"icon": "lucide-list",
|
||||||
|
"title": "Gliederung von Küchenplanner Tina"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "b904b27b8c161f99",
|
||||||
|
"type": "leaf",
|
||||||
|
"state": {
|
||||||
|
"type": "git-view",
|
||||||
|
"state": {},
|
||||||
|
"icon": "git-pull-request",
|
||||||
|
"title": "Source Control"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"currentTab": 4
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"direction": "horizontal",
|
||||||
|
"width": 300
|
||||||
|
},
|
||||||
|
"left-ribbon": {
|
||||||
|
"hiddenItems": {
|
||||||
|
"switcher:Schnellauswahl öffnen": false,
|
||||||
|
"graph:Graphen-Ansicht öffnen": true,
|
||||||
|
"canvas:Neuen Canvas erstellen": false,
|
||||||
|
"daily-notes:Heutige Notiz öffnen": false,
|
||||||
|
"templates:Vorlage einfügen": true,
|
||||||
|
"command-palette:Befehlspalette öffnen": true,
|
||||||
|
"obsidian-git:Open Git source control": false,
|
||||||
|
"canvas2document:C2D Step 1 - Convert Canvas to draft doc": false,
|
||||||
|
"canvas2document:C2D Step 2 - Make cleared document": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"active": "c355cf5b4fbfdebf",
|
||||||
|
"lastOpenFiles": [
|
||||||
|
"2025-05-08.md",
|
||||||
|
"Work",
|
||||||
|
"Privat/Küchenplanner Tina.md",
|
||||||
|
"Privat/Wichtige Nummern.md",
|
||||||
|
"Privat/Spangler.md",
|
||||||
|
"Privat/Sonja.md",
|
||||||
|
"Privat/PIN Ausweis.md",
|
||||||
|
"Privat/Yvi Sprüche.md",
|
||||||
|
"Privat",
|
||||||
|
"Willkommen.md",
|
||||||
|
"Google Keep/Junggeselle.md",
|
||||||
|
"Google Keep/Hochzeit.md",
|
||||||
|
"Google Keep/Yvi Geburtstag_.md",
|
||||||
|
"Google Keep/Welcome to Google Keep.md",
|
||||||
|
"Google Keep/wandern.md",
|
||||||
|
"Google Keep/Tanzkurs.md",
|
||||||
|
"Google Keep/Software Ideen_.md",
|
||||||
|
"Google Keep/Roma_.md",
|
||||||
|
"Google Keep/News (RSS Reader).md",
|
||||||
|
"Google Keep/Namen.md",
|
||||||
|
"Google Keep/Make a list.md",
|
||||||
|
"Google Keep/Holzbau Dengler_.md",
|
||||||
|
"Google Keep/Haus.md",
|
||||||
|
"Google Keep/Geburtstagideen Yvonne.md",
|
||||||
|
"Google Keep/Filme.md",
|
||||||
|
"Google Keep/Everything in one place.md",
|
||||||
|
"Google Keep/2025-03-27T20_13_43.506+01_00.md",
|
||||||
|
"Google Keep",
|
||||||
|
"Unbenannt.canvas",
|
||||||
|
"Unbenannt_canvas2doc-data"
|
||||||
|
]
|
||||||
|
}
|
||||||
0
2025-05-08.md
Normal file
0
2025-05-08.md
Normal file
2
Privat/Küchenplanner Tina.md
Normal file
2
Privat/Küchenplanner Tina.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
|
||||||
|
2,26 Brüstungshöhe
|
||||||
5
Privat/PIN Ausweis.md
Normal file
5
Privat/PIN Ausweis.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
|
||||||
|
6stellige Pin vom E
|
||||||
|
|
||||||
|
201084
|
||||||
|
|
||||||
4
Privat/Sonja.md
Normal file
4
Privat/Sonja.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
Exebionist
|
||||||
|
Yvonne du musst deine Eier einfrieren lassen!
|
||||||
|
Vivaldi hat mir schon immer gefallen
|
||||||
5
Privat/Spangler.md
Normal file
5
Privat/Spangler.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
|
||||||
|
killinger max
|
||||||
|
kieninger
|
||||||
|
schuster schöllnach
|
||||||
|
Schuster Spangler 015114935398
|
||||||
22
Privat/Wichtige Nummern.md
Normal file
22
Privat/Wichtige Nummern.md
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
tags: []
|
||||||
|
---
|
||||||
|
|
||||||
|
Sozialversicherung: 15201084W006
|
||||||
|
Steuerid: 53 826 107 790
|
||||||
|
Steuernummer: 244/774/03081
|
||||||
|
neue Steuernummer: 244/745/00574
|
||||||
|
Steuernummer (Altötting): 106/745/01620
|
||||||
|
IBAN: DE73750500000026837617
|
||||||
|
BYLADEM1RBG
|
||||||
|
|
||||||
|
Yvonne Wagner:
|
||||||
|
Steuerid 56 013 747 829
|
||||||
|
Steuernummer: 24 474 603 683
|
||||||
|
DE77 6001 0070 0876 6507 05
|
||||||
|
PBNKDEFF
|
||||||
|
|
||||||
|
wlan 8100759662824312
|
||||||
|
|
||||||
|
DKB:
|
||||||
|
IBAN: DE78 1203 0000 1059 3662 84/
|
||||||
25
Privat/Yvi Sprüche.md
Normal file
25
Privat/Yvi Sprüche.md
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
Jetzt ernstlich
|
||||||
|
Alle müssen sterben
|
||||||
|
Happyeier ham ma a
|
||||||
|
I hob doch koan Araber gheirat
|
||||||
|
Du host Hoar wie bei am Viech
|
||||||
|
I bin koa Energie-Rauber
|
||||||
|
Des is wia a nass Hundefell
|
||||||
|
I laber doch nur Scheiße
|
||||||
|
Dann hat me gfruist
|
||||||
|
Schmuck ärgern
|
||||||
|
Kratz me Mal bitte am Hirn. Naaa am Hirn! (Sie meinte Stirn)
|
||||||
|
In der Nacht wandert Sie vor die Tür weil Sie schlafwandelt.
|
||||||
|
Yvi ist total heiß seit Tagen. Ich: lass raus dei Hitz. Sie: wort no. I Reit de ind Bewusstlosigkeit.
|
||||||
|
Yvi haut ihr Knie voll in meine Weichteile. Vor Schmerz sage ich: wenn nix mehr geht musst me trotzdem heiraten.
|
||||||
|
I hab des Gefühl du starrst auf meine Zähn.
|
||||||
|
Sie kriegt an Schlag von einem elektrischen Zaun. Sie: konnst froh sei, dass i ned Tod umgfallen bin.
|
||||||
|
El Bandido der Wrestler
|
||||||
|
Etz hör mal auf mit deinem Skeptizismus.
|
||||||
|
Etz wird i 30ge (sie wird 32 und lammentiert über ihr Gewicht)
|
||||||
|
Greenling anstatt Greenhorn
|
||||||
|
Bizarre Wettervorkommen statt Wetterphänomene
|
||||||
|
Fisimadenten gmacht
|
||||||
|
Deutschland, was des schreibt ma doch ned mit 't'
|
||||||
|
Du musstit den "alte Oma töter" vorlieb nehmen
|
||||||
Loading…
x
Reference in New Issue
Block a user