This commit is contained in:
Günther Wagner 2025-05-08 18:00:47 +02:00
commit 13cab8d1e1
22 changed files with 4240 additions and 0 deletions

3
.obsidian/app.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"promptDelete": false
}

3
.obsidian/appearance.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"cssTheme": "Minimal"
}

4
.obsidian/community-plugins.json vendored Normal file
View File

@ -0,0 +1,4 @@
[
"obsidian-git",
"canvas2document"
]

31
.obsidian/core-plugins.json vendored Normal file
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": 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
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": true
}

View 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 ![](" + element[2] + ")\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 */

View 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
}

View 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

File diff suppressed because one or more lines are too long

View 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"
}

View 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"

View 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;
}

View 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

File diff suppressed because one or more lines are too long

213
.obsidian/workspace.json vendored Normal file
View 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
View File

View File

@ -0,0 +1,2 @@
2,26 Brüstungshöhe

5
Privat/PIN Ausweis.md Normal file
View File

@ -0,0 +1,5 @@
6stellige Pin vom E
201084

4
Privat/Sonja.md Normal file
View 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
View File

@ -0,0 +1,5 @@
killinger max
kieninger
schuster schöllnach
Schuster Spangler 015114935398

View 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
View 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