From 49cd956b30b80be833e086559bc5a22ad1f2c2a5 Mon Sep 17 00:00:00 2001 From: Akos Balasko Date: Tue, 26 Dec 2023 22:03:46 +0100 Subject: [PATCH] feat: config store and management (#548) * config store and management * creating root output dir --- package-lock.json | 58 +++++++++++-------------------- src/ui/assets/css/demo.css | 6 ++++ src/ui/assets/js/dialog.js | 6 ++-- src/ui/index.html | 30 ++++++++++------ src/ui/main.js | 22 +++++++++++- src/ui/preload.js | 4 +++ src/ui/renderer.js | 70 ++++++++++++++++++++++++++++++-------- src/ui/store.js | 1 + src/utils/folder-utils.ts | 6 ++++ src/yarle.ts | 7 ++++ 10 files changed, 142 insertions(+), 68 deletions(-) diff --git a/package-lock.json b/package-lock.json index 13a296db..62bfbc77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1820,7 +1820,6 @@ "version": "2.10.0", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", - "dev": true, "optional": true, "dependencies": { "@types/node": "*" @@ -2682,7 +2681,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "dev": true, "optional": true }, "node_modules/bottleneck": { @@ -4465,7 +4463,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, + "devOptional": true, "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -4554,7 +4552,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, "optional": true }, "node_modules/diff": { @@ -5412,7 +5409,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true + "devOptional": true }, "node_modules/escalade": { "version": "3.1.1", @@ -6612,7 +6609,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, + "devOptional": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -6725,7 +6722,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "dev": true, "optional": true, "dependencies": { "boolean": "^3.0.1", @@ -6794,7 +6790,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, + "devOptional": true, "dependencies": { "define-properties": "^1.1.3" }, @@ -6981,7 +6977,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, + "devOptional": true, "dependencies": { "get-intrinsic": "^1.1.1" }, @@ -7005,7 +7001,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, + "devOptional": true, "engines": { "node": ">= 0.4" }, @@ -8154,7 +8150,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true + "devOptional": true }, "node_modules/json5": { "version": "2.2.3", @@ -8684,7 +8680,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, "optional": true, "dependencies": { "escape-string-regexp": "^4.0.0" @@ -8697,7 +8692,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "optional": true, "engines": { "node": ">=10" @@ -13022,7 +13016,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, + "devOptional": true, "engines": { "node": ">= 0.4" } @@ -14284,7 +14278,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, "optional": true, "dependencies": { "boolean": "^3.0.1", @@ -14622,7 +14615,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true, "optional": true }, "node_modules/semver-diff": { @@ -14662,7 +14654,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, "optional": true, "dependencies": { "type-fest": "^0.13.1" @@ -14678,7 +14669,6 @@ "version": "0.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, "optional": true, "engines": { "node": ">=10" @@ -14947,6 +14937,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -15041,7 +15032,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true, "optional": true }, "node_modules/ssri": { @@ -18268,7 +18258,6 @@ "version": "2.10.0", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", - "dev": true, "optional": true, "requires": { "@types/node": "*" @@ -18893,7 +18882,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "dev": true, "optional": true }, "bottleneck": { @@ -20233,7 +20221,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, + "devOptional": true, "requires": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -20297,7 +20285,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, "optional": true }, "diff": { @@ -20984,7 +20971,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true + "devOptional": true }, "escalade": { "version": "3.1.1", @@ -21901,7 +21888,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, + "devOptional": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -21986,7 +21973,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "dev": true, "optional": true, "requires": { "boolean": "^3.0.1", @@ -22035,7 +22021,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, + "devOptional": true, "requires": { "define-properties": "^1.1.3" } @@ -22171,7 +22157,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, + "devOptional": true, "requires": { "get-intrinsic": "^1.1.1" } @@ -22186,7 +22172,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true + "devOptional": true }, "has-tostringtag": { "version": "1.0.0", @@ -23019,7 +23005,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true + "devOptional": true }, "json5": { "version": "2.2.3", @@ -23450,7 +23436,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, "optional": true, "requires": { "escape-string-regexp": "^4.0.0" @@ -23460,7 +23445,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "optional": true } } @@ -26590,7 +26574,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "devOptional": true }, "object.assign": { "version": "4.1.4", @@ -27539,7 +27523,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, "optional": true, "requires": { "boolean": "^3.0.1", @@ -27786,7 +27769,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true, "optional": true }, "semver-diff": { @@ -27816,7 +27798,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, "optional": true, "requires": { "type-fest": "^0.13.1" @@ -27826,7 +27807,6 @@ "version": "0.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, "optional": true } } @@ -28034,7 +28014,8 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true }, "source-map-support": { "version": "0.5.21", @@ -28120,7 +28101,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true, "optional": true }, "ssri": { diff --git a/src/ui/assets/css/demo.css b/src/ui/assets/css/demo.css index 97a8e134..d4a3d960 100644 --- a/src/ui/assets/css/demo.css +++ b/src/ui/assets/css/demo.css @@ -253,3 +253,9 @@ .fixed-plugin ul > li:last-child a{ margin-bottom: 15px; } + +.flex-center { + flex-direction: column; + display: flex; + align-items: center; +} \ No newline at end of file diff --git a/src/ui/assets/js/dialog.js b/src/ui/assets/js/dialog.js index a33591df..cfa28247 100644 --- a/src/ui/assets/js/dialog.js +++ b/src/ui/assets/js/dialog.js @@ -78,6 +78,7 @@ ipcRenderer.on('defaultTemplateLoaded', (event, store) => { ipcRenderer.on('logSeqModeSelected', (event, config, template) => { const flatConfig = flatten(JSON.parse(config)); + flatConfig.replacementCharacterMap = config.replacementCharacterMap flatConfig.currentTemplate = template; updateDomByFlatConfig(flatConfig, true); document.getElementById('currentTemplate').disabled = false; @@ -89,6 +90,8 @@ ipcRenderer.on('logSeqModeSelected', (event, config, template) => { ipcRenderer.on('logSeqModeDeselected', (event, config, template) => { const flatConfig = flatten(JSON.parse(config)); + flatConfig.replacementCharacterMap = config.replacementCharacterMap + updateDomByFlatConfig(flatConfig, false); document.getElementById('currentTemplate').value = template; @@ -99,7 +102,6 @@ ipcRenderer.on('logSeqModeDeselected', (event, config, template) => { updateConfigStore('currentTemplate', template); }); - window.dialog = window.dialog || {}, function(n) { @@ -141,7 +143,7 @@ function(n) { $('#selectOutputFolder').click( function () { ipcRenderer.send('selectOutputFolder'); }); - + $('#showErrorBox').click( function () { dialog.handler.showErrorBox(); }) diff --git a/src/ui/index.html b/src/ui/index.html index fe76571d..df4b790b 100644 --- a/src/ui/index.html +++ b/src/ui/index.html @@ -161,19 +161,27 @@
Selected enex files:
-
Target Dialect
-
-
- -
+ +
+ +
(After a conversion you can find the actual settings in file 'yarle.config' within the specified output directory.)
+ +
+
+
+
Target Dialect
+
+
+
+
General
diff --git a/src/ui/main.js b/src/ui/main.js index 3719658a..be0eae55 100644 --- a/src/ui/main.js +++ b/src/ui/main.js @@ -71,6 +71,7 @@ const createWindow = () => { ipcMain.on('startConversion', async (event, data) => { const settings = mapSettingsToYarleOptions(); + const outputNotebookFolders = await yarle.dropTheRope(settings); // apply internal links applyLinks(settings, outputNotebookFolders); @@ -110,7 +111,6 @@ const createWindow = () => { mainWindow.show(); mainWindow.webContents.send('logSeqModeDeSelected'); - }); // Emitted when the window is closed. @@ -169,6 +169,26 @@ app.whenReady().then(() => { } }); + ipcMain.handle('dialog:selectConfigFile', async () => { + const { canceled, filePaths } = await dialog.showOpenDialog( + { + properties: ['openFile'], + filters: [ + + { name: 'Yarle config file', extensions: ['config']}, + ], + }); + if (canceled) { + return + } else if (filePaths) { + const configFilePath = filePaths[0]; + const fileContent = fs.readFileSync(configFilePath, {encoding: 'base64'}); + let plainConfig = Buffer.from(fileContent, 'base64').toString('utf8') + plainConfig = Buffer.from(plainConfig, 'base64').toString('utf8') + mainWindow.webContents.send('configLoaded', configFilePath, JSON.parse(plainConfig)); + } + + }); diff --git a/src/ui/preload.js b/src/ui/preload.js index 569ee951..19f01fae 100644 --- a/src/ui/preload.js +++ b/src/ui/preload.js @@ -22,6 +22,9 @@ contextBridge.exposeInMainWorld('electronAPI', { selectOutputFolder: async () => { return ipcRenderer.invoke('dialog:selectOutputFolder') }, + loadConfigFile: async () => { + return ipcRenderer.invoke('dialog:selectConfigFile') + }, readFileSync: fs.readFileSync, getConfigByType: (type) => { let configFile; @@ -99,6 +102,7 @@ contextBridge.exposeInMainWorld('electronAPI', { ipcRenderer.on('logSeqModeSelected', callback) }, onLogSeqModeDeSelected: (callback) => ipcRenderer.on('logSeqModeDeSelected', callback), + onConfigLoaded: (callback) => ipcRenderer.on('configLoaded', callback), onTanaModeSelected: (callback) => { console.log('onTanaModeSelected triggered') ipcRenderer.on('tanaModeSelected', callback) diff --git a/src/ui/renderer.js b/src/ui/renderer.js index ad6265ab..0f9f00e7 100644 --- a/src/ui/renderer.js +++ b/src/ui/renderer.js @@ -15,6 +15,16 @@ selectOutputFolderDialogBtn.addEventListener('click', async () => { outputFolderElement.innerText = outputFolder }) + +const selectConfigFileDialogBtn = document.getElementById('selectConfigFileDialogBtn') +const configFileElement = document.getElementById('configFilePath') + +selectConfigFileDialogBtn.addEventListener('click', async (event) => { + const configFile = await window.electronAPI.loadConfigFile() + configFileElement.innerText = configFile + +}) + const outputFormatSelect = document.getElementById('outputFormat') outputFormatSelect.addEventListener('change', async (event) => { @@ -26,6 +36,21 @@ window.electronAPI.onLogSeqModeDeSelected((event, value) => { handleOutputFormatChange(event, window.electronAPI.outputFormat.ObsidianMD) }) +window.electronAPI.onConfigLoaded(async (event, configFilePath, configObj) => { + console.log('onConfigLoaded triggered') + console.log(JSON.stringify(configObj)) + updateOutputFormat(configObj.outputFormat) + const flatConfigObj = flatten(configObj) + flatConfigObj.replacementCharacterMap = configObj.replacementCharacterMap + updateDomByFlatConfig(flatConfigObj, false); + + window.electronAPI.store.set('configFilePath', configFilePath); + // tslint:disable-next-line:no-console + console.log(`configFilePath: ${configFilePath}`); + return configFilePath; +}) + + const configItems = document.getElementsByClassName('configurationItem') for(const configItem of configItems){ configItem.addEventListener('change', async (event) => { @@ -100,7 +125,6 @@ const handleOutputFormatChange = ((event, initValue) => { //const logSeqTemplate = window.electronAPI.readFileSync(`${window.electronAPI.currentDir}/../../sampleTemplate_logseq.tmpl`, 'utf-8'); const flatConfig = flatten(JSON.parse(defaultConfig)); flatConfig.currentTemplate = defaultTemplate; - updateDomByFlatConfig(flatConfig, false); document.getElementById('currentTemplate').removeAttribute('disabled'); @@ -134,26 +158,42 @@ function isBooleanString(value) { function isCharacterMap(value) { return typeof value === 'CharacterMap' } - +const updateOutputFormat = (outputFormat) => { + updateDomAndConfig({name: 'outputFormat', value: outputFormat}) +} const updateDomByFlatConfig = (flatConfig, disable) => { for (const configItem in flatConfig){ if (configItem !== 'outputFormat' && !configItem.startsWith('enexSources') && configItem!== 'outputDir'){ - const domItem = document.getElementById(configItem); - if (domItem){ - if (domItem.getAttribute('type') === 'checkbox'){ - document.getElementById(configItem).checked = flatConfig[configItem]; - } else { - document.getElementById(configItem).value = flatConfig[configItem]; - } - if (!disable) - document.getElementById(configItem).removeAttribute('disabled') - else document.getElementById(configItem).disabled = true; - + updateDomAndConfig({name: configItem, value: flatConfig[configItem]}) + } + } +} +const updateDomAndConfig = (configItem, disable) => { + const domItem = document.getElementById(configItem.name); + let itemValueToStore = configItem.value + if (domItem){ + if (domItem.getAttribute('type') === 'checkbox'){ + document.getElementById(configItem.name).checked = configItem.value; + } else { + if (isObject(itemValueToStore)){ + itemValueToStore = JSON.stringify(configItem.value) + document.getElementById(configItem.name).value = JSON.stringify(configItem.value, undefined, 2);; } - window.electronAPI.store.set(configItem, flatConfig[configItem]) - + else { + + document.getElementById(configItem.name).value = configItem.value; } } + if (!disable) + document.getElementById(configItem.name).removeAttribute('disabled') + else document.getElementById(configItem.name).disabled = true; + + } + window.electronAPI.store.set(configItem.name, itemValueToStore) + +} +const isObject = (value) => { + return Object.prototype.toString.call(value) === '[object Object]' } const flatten = (data) => { diff --git a/src/ui/store.js b/src/ui/store.js index 3deeaa5d..10dbd566 100644 --- a/src/ui/store.js +++ b/src/ui/store.js @@ -29,6 +29,7 @@ const schema = { keepMDCharactersOfENNotes: { type: 'boolean', default: false }, monospaceIsCodeBlock: { type: 'boolean', default: false }, resourcesDir: {type: 'string', default: '_resources'}, + configFilePath: {type: 'string'} }; let store = new Store({schema, watch: true}); diff --git a/src/utils/folder-utils.ts b/src/utils/folder-utils.ts index 38baec72..58b0f124 100644 --- a/src/utils/folder-utils.ts +++ b/src/utils/folder-utils.ts @@ -84,6 +84,12 @@ export const getRelativeResourceDir = (note: any): string => { : `.${enexFolder}${path.sep}${getResourceDir(paths.mdPath, note)}.resources`; }; +export const createRootOutputDir = (): void => { + const outputDir = path.isAbsolute(yarleOptions.outputDir) + ? yarleOptions.outputDir + : `${process.cwd()}${path.sep}${yarleOptions.outputDir}`; + fsExtra.mkdirsSync(outputDir) +} export const getAbsoluteResourceDir = (note: any): string => { if (yarleOptions.haveGlobalResources) { return path.resolve(paths.resourcePath, '..', '..', yarleOptions.resourcesDir); diff --git a/src/yarle.ts b/src/yarle.ts index b78b5bf5..bcbf4842 100644 --- a/src/yarle.ts +++ b/src/yarle.ts @@ -202,9 +202,16 @@ export const parseStream = async (options: YarleOptions, enexSource: string): Pr }); }; +const saveOptionsAsConfig = (options: YarleOptions): void => { + const yarleConfigName = 'yarle.config' + const encoded = Buffer.from(JSON.stringify(options), 'utf8').toString('base64') + fs.writeFileSync(path.join(options.outputDir, yarleConfigName), encoded); +} export const dropTheRope = async (options: YarleOptions): Promise> => { clearLogFile(); setOptions(options); + utils.createRootOutputDir(); + saveOptionsAsConfig(options) const outputNotebookFolders = []; for (const enex of options.enexSources) { utils.setPaths(enex);