1
0

vault backup: 2025-12-14 08:28:15
All checks were successful
Deploy Quartz site to GitHub Pages / build (push) Successful in 1m25s

This commit is contained in:
2025-12-14 08:28:15 +01:00
parent 2e65d5492a
commit e643f35164
7 changed files with 322 additions and 16 deletions

View File

@@ -1,14 +1,9 @@
[
"obsidian-git",
"omnisearch",
"text-extractor",
"spoiler-block-obsidian",
"pretty-properties",
"dataview",
"emoji-shortcodes",
"obsidian42-brat",
"agent-client",
"manual-sorting",
"obsidian-icon-folder",
"image-converter"
"obsidian-table-to-csv-exporter"
]

View File

@@ -0,0 +1,224 @@
/*
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 __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
__markAsModule(target);
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
for (let key of __getOwnPropNames(module2))
if (!__hasOwnProp.call(target, key) && key !== "default")
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
}
return target;
};
var __toModule = (module2) => {
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// main.ts
__export(exports, {
default: () => Table2CSVPlugin
});
var import_obsidian = __toModule(require("obsidian"));
var DEFAULT_SETTINGS = {
exportPath: "./",
baseFilename: "table-export",
fileNumber: "001",
sepChar: "sepChar-semicolon",
quoteDataChar: "quoteChar-noQuote",
saveToClipboardToo: false,
removeCRLF: "removeCRLF-space"
};
var Table2CSVPlugin = class extends import_obsidian.Plugin {
onload() {
return __async(this, null, function* () {
yield this.loadSettings();
this.addCommand({
id: "obsidian-table-to-csv-exporter",
name: "Export table to CSV file",
checkCallback: (checking) => {
const view = this.app.workspace.getActiveViewOfType(import_obsidian.MarkdownView);
if (view) {
if (!checking) {
const viewMode = view.getMode();
if (viewMode == "preview") {
const csvString = htmlToCSV(view.previewMode.containerEl, this.settings.sepChar, this.settings.quoteDataChar, this.settings.removeCRLF);
if (csvString.length > 0) {
const filename = `${this.settings.baseFilename}-${this.settings.fileNumber}.csv`;
this.app.vault.create(filename, csvString).then(() => {
let fn = +this.settings.fileNumber;
fn++;
if (fn == 1e3)
fn = 1;
let newFileNumberString = fn + "";
while (newFileNumberString.length < 3)
newFileNumberString = "0" + newFileNumberString;
this.settings.fileNumber = newFileNumberString;
if (this.settings.saveToClipboardToo) {
navigator.clipboard.writeText(csvString).then(() => {
new import_obsidian.Notice(`The file ${filename} was successfully created in your vault. The contents was also copied to the clipboard.`);
}).catch((err) => {
new import_obsidian.Notice("There was an error with copying the contents to the clipboard.");
});
} else {
new import_obsidian.Notice(`The file ${filename} was successfully created in your vault.`);
}
}).catch((error) => {
const errorMessage = `Error: ${error.message}`;
new import_obsidian.Notice(errorMessage);
});
} else {
new import_obsidian.Notice(`No table was found. No CSV file was written.`);
}
} else {
new import_obsidian.Notice("This command only works on panes in reading mode! \u2013 No CSV files were written.");
}
}
return true;
}
return false;
}
});
this.addSettingTab(new Table2CSVSettingTab(this.app, this));
console.log(`Table to CSV plugin: Version ${this.manifest.version} loaded.`);
});
}
onunload() {
}
loadSettings() {
return __async(this, null, function* () {
this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
});
}
saveSettings() {
return __async(this, null, function* () {
yield this.saveData(this.settings);
});
}
};
function htmlToCSV(html, sepMode, quoteChar, removeCRLF) {
var data = [];
var table = html.querySelector("table");
if (table) {
var rows = table.rows;
for (var i = 0; i < rows.length; i++) {
var row = [], cols = rows[i].querySelectorAll("td, th");
for (var j = 0; j < cols.length; j++) {
var cellContent = cols[j].innerText;
if (removeCRLF == "removeCRLF-clear") {
cellContent = cellContent.replace(/(\r\n|\n|\r)/gm, "");
} else if (removeCRLF == "removeCRLF-space") {
cellContent = cellContent.replace(/(\r\n|\n|\r)/gm, " ");
} else if (removeCRLF == "removeCRLF-string1") {
cellContent = cellContent.replace(/(\r\n|\n|\r)/gm, "[CR]");
}
if (quoteChar == "quoteChar-doubleQuotes") {
cellContent = '"' + cellContent + '"';
} else if (quoteChar == "quoteChar-singleQuotes") {
cellContent = "'" + cellContent + "'";
}
row.push(cellContent);
}
var sepChar = ";";
switch (sepMode) {
case "sepChar-semicolon":
sepChar = ";";
break;
case "sepChar-comma":
sepChar = ",";
break;
case "sepChar-tab":
sepChar = " ";
break;
case "sepChar-pipe":
sepChar = "|";
break;
case "sepChar-tilde":
sepChar = "~";
break;
case "sepChar-caret":
sepChar = "^";
break;
case "sepChar-colon":
sepChar = ":";
break;
}
data.push(row.join(sepChar));
}
}
if (data.length > 0)
return data.join("\n");
else
return "";
}
var Table2CSVSettingTab = class extends import_obsidian.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
const { containerEl } = this;
containerEl.empty();
containerEl.createEl("h2", { text: "Settings for the Table to CSV Plugin." });
containerEl.createEl("p", { text: "NOTE: Currently, the exported CSV files are saved inside your vault main folder." });
new import_obsidian.Setting(containerEl).setName("CSV file base filename").setDesc('Enter the base filename. The "File Number addendum" gets added after that and finally .csv').addText((text) => text.setPlaceholder("<enter a base filename").setValue(this.plugin.settings.baseFilename).onChange((value) => __async(this, null, function* () {
this.plugin.settings.baseFilename = value;
yield this.plugin.saveSettings();
})));
new import_obsidian.Setting(containerEl).setName("File Number addendum").setDesc("This number gets added to the base filename and incremented after each export. Normally, you shouldn't need to edit this.").addText((text) => text.setPlaceholder("").setValue(this.plugin.settings.fileNumber).onChange((value) => __async(this, null, function* () {
this.plugin.settings.fileNumber = value;
yield this.plugin.saveSettings();
})));
new import_obsidian.Setting(containerEl).setName("Data fields separation character/string").setDesc("This character will be put between each cell's data. Defaults to a semicolon.").addDropdown((dropdown) => dropdown.addOption("sepChar-semicolon", "; (semicolon)").addOption("sepChar-comma", ", (comma)").addOption("sepChar-tab", "\\t (tab)").addOption("sepChar-pipe", "| (pipe)").addOption("sepChar-tilde", "~ (tilde)").addOption("sepChar-caret", "^ (caret)").addOption("sepChar-colon", ": (colon)").setValue(this.plugin.settings.sepChar).onChange((value) => __async(this, null, function* () {
this.plugin.settings.sepChar = value;
yield this.plugin.saveSettings();
})));
new import_obsidian.Setting(containerEl).setName("Quote data").setDesc("Do you want quotation marks around each cell's data?").addDropdown((dropdown) => dropdown.addOption("quoteChar-noQuote", "Don't quote data").addOption("quoteChar-doubleQuotes", 'Quote data with double quote character (")').addOption("quoteChar-singleQuotes", "Quote data with single quote character (')").setValue(this.plugin.settings.quoteDataChar).onChange((value) => __async(this, null, function* () {
this.plugin.settings.quoteDataChar = value;
yield this.plugin.saveSettings();
})));
new import_obsidian.Setting(containerEl).setName("Handling of CR/LF in data").setDesc("Choose how to handle the occurance of return and linefeed characters in data cells.").addDropdown((dropdown) => dropdown.addOption("removeCRLF-clear", "Remove all CR & LF characters").addOption("removeCRLF-space", "Replace all CR & LF characters with one space").addOption("removeCRLF-string1", "Replace all CR & LF characters with string [CR]").setValue(this.plugin.settings.removeCRLF).onChange((value) => __async(this, null, function* () {
this.plugin.settings.removeCRLF = value;
yield this.plugin.saveSettings();
})));
new import_obsidian.Setting(containerEl).setName("Copy to clipboard, too").setDesc("Do you want to copy the contents of the CSV file to the system clipboard, too?").addToggle((toggle) => toggle.setValue(this.plugin.settings.saveToClipboardToo).onChange((value) => __async(this, null, function* () {
this.plugin.settings.saveToClipboardToo = value;
yield this.plugin.saveSettings();
})));
}
};
/* nosourcemap */

View File

@@ -0,0 +1,10 @@
{
"id": "obsidian-table-to-csv-exporter",
"name": "Table to CSV Exporter",
"version": "0.1.4",
"minAppVersion": "0.14.6",
"description": "This plugin allows for exporting tables from a pane in reading mode into CSV files.",
"author": "Stefan Wolfrum",
"authorUrl": "https://twitter.com/metawops",
"isDesktopOnly": false
}

View File

@@ -55,12 +55,12 @@
"state": {
"type": "markdown",
"state": {
"file": "Biokemi/Behöver göra.md",
"mode": "source",
"file": "Biokemi/Regleringar.md",
"mode": "preview",
"source": false
},
"icon": "lucide-file",
"title": "Behöver göra"
"title": "Regleringar"
}
}
],
@@ -121,7 +121,8 @@
}
],
"direction": "horizontal",
"width": 300
"width": 300,
"collapsed": true
},
"right": {
"id": "2d28508435d0e696",
@@ -223,7 +224,8 @@
}
],
"direction": "horizontal",
"width": 394.5
"width": 200,
"collapsed": true
},
"left-ribbon": {
"hiddenItems": {
@@ -240,6 +242,11 @@
},
"active": "0ee86d2943a05d44",
"lastOpenFiles": [
"table-export-001.xlsx",
"lu32604h9hpy3.tmp",
"table-export-001.csv",
"Biokemi/Behöver göra.md",
"Biokemi/Regleringar.md",
"Biokemi/Metabolism/Biokemi ur ett evolutionsperspektiv/Slides.pdf.pdf",
"has.txt",
"all.txt",
@@ -249,10 +256,7 @@
"TaskNotes/Views/mini-calendar-default.base",
"TaskNotes/Views/kanban-default.base",
"TaskNotes/Views/calendar-default.base",
"TaskNotes/Views/agenda-default.base",
"TaskNotes/Tasks/ETK-kortlek imorgon kl 09.md",
"TaskNotes/Views",
"TaskNotes/Tasks",
"TYK/Presentation.md",
"Biokemi/Plasmidlabb/Provfrågor.md",
"Biokemi/Metabolismseminarie/Direktiv.md",
@@ -275,8 +279,6 @@
"Biokemi/Metabolism/Elektrontransportkedjan/📚 Instuderingsuppgifter.md",
"Biokemi/Metabolism/Elektrontransportkedjan/🎯 Lärandemål.md",
"Biokemi/Metabolism/Elektrontransportkedjan/👨🏻‍🏫 Slides.md",
"Biokemi/Metabolism/Elektrontransportkedjan/❓ Provfrågor.md",
"Biokemi/Metabolism/Diagram/Vägar.md",
"Biokemi/Metabolism/Diagram/TCA_cycle.svg",
"Biokemi/Metabolism/Diagram/Glycolysis_overview.svg",
"Biokemi/Plasmidlabb/Bilder/IMG_1976.jpg",