diff --git a/Notion Customization/Customization Patcher.py b/Notion Customization/Customization Patcher.py new file mode 100644 index 0000000..558bd35 --- /dev/null +++ b/Notion Customization/Customization Patcher.py @@ -0,0 +1,370 @@ +""" +# Step 1 +1.Locating notion app at ./%Username%/AppData/Local/Programs/Notion +2.Unpacking app.asar in new folder at./Notion/resources/app +3.Renaming file app.asar to app.asar.bak (because instead app won't use folder "app" to get all resources from it) +4.If app.asar already unpacked - it will try to locate folder "app" and skip to next step + +# Step 2 +1. Editing userscript file to replace "full_path_to_custom_style" with full path to ./custom_style.css +2. Adding userscript from main.user.js(should be in same folder with this .py file) to the ./app/renderer/preload.js +3. If there is already userscript - it will overwrite it. + +# Step 3 +1. Adding property "frame: false" to the place where application window is creating + +# Step 4 +1. Changes "window drag" area, to make window draggable + 1.1. You can change it by yourself, if you experiencing problems with dragging window or with clicking buttons on app topbar + Because this "draggable area" is creating on top of the other stuff, so if it will have button behind it - it won't be clickable. + You should change top,left,right properties. Now it's 2px on top, 390px on left and 420px on right; +""" +import os +from time import sleep +from shutil import copyfile +import re + +try: + sleepTime = 0.5 + sleep(sleepTime) + print("========= START OF LOG =========") + sleep(sleepTime) + LOCALAPPDATA = os.getenv('LOCALAPPDATA') + notionResourcesPath = LOCALAPPDATA + '/Programs/Notion/resources' + windowToggleHotkey = "'ctrl+shift+a'" + + # Step 1 + print("Step 1") + sleep(sleepTime) + if os.path.isfile(notionResourcesPath + '/app.asar'): + sleep(sleepTime) + print(" Unpacking app.asar") + os.system("asar extract %LOCALAPPDATA%/Programs/Notion/resources/app.asar %LOCALAPPDATA%/Programs/Notion/resources/app") + sleep(sleepTime) + renameSource = notionResourcesPath + '/app.asar' + renameDestination = renameSource + '.bak' + os.rename(renameSource, renameDestination) + print(" Renaming asar.app to asar.app.bak") + sleep(sleepTime) + else: + sleep(sleepTime) + print(" There is no file at Notion/resources/app.asar") + sleep(sleepTime) + print(" Trying to locate unpacked app.asar") + sleep(sleepTime) + if os.path.exists(notionResourcesPath + '/app'): + print(" app.asar already unpacked - Moving to the next step") + sleep(sleepTime) + else: + print(" Nothing found at Notion/resources/app. Exiting. ") + input("Press Enter to exit...") + exit() + print("-Done-\n") + sleep(sleepTime) + + print("Step 2") + sleep(sleepTime) + # Step 2 + if os.path.isfile(notionResourcesPath + '/app/renderer/preload.js'): + print(" Adding userscript to Notion/resources/app/renderer/preload.js") + sleep(sleepTime) + + preload = open(notionResourcesPath + '/app/renderer/preload.js', 'rt') + preloadStr = preload.read() + preload.close() + if 'function userscript()' in preloadStr: + print(" Userscript already added. Replacing it") + sleep(sleepTime) + userscript_line = 0 + with open(notionResourcesPath + '/app/renderer/preload.js') as myFile: + for num, line in enumerate(myFile, 1): + if "function userscript()" in line: + userscript_line = num-1 + + preload = open(notionResourcesPath + '/app/renderer/preload.js', 'rt') + preloadLines = preload.readlines() + preload.close() + + with open(notionResourcesPath + '/app/renderer/preload.js', 'w') as fin: + for lineno, line in enumerate(preloadLines, 1): + if lineno < userscript_line: + fin.write(line) + + print(" Creating link to ./resources/custom_style.css") + sleep(sleepTime) + preload = open(notionResourcesPath + '/app/renderer/preload.js', 'a') + userscript = open('./resources/main.user.js') + scriptPath = os.getcwd() + scriptPath = scriptPath.replace('\\', '/') + userscriptStr = userscript.read() + userscriptStr = userscriptStr.replace('full_path_to_custom_style',scriptPath + '/resources/custom_style.css') + preload.write('\n' + userscriptStr) + preload.close() + else: + print(" There is no files at Notion/resources/app/renderer/preload.js or/and ./resources/main.user.js - Nothing was done") + sleep(sleepTime) + print("-Done-\n") + sleep(sleepTime) + + print("Step 3") + sleep(sleepTime) + # Step 3 + if os.path.isfile(notionResourcesPath + '/app/main/createWindow.js'): + print(" Making window frameless at Notion/resources/app/main/createWindow.js") + sleep(sleepTime) + + createWindow = open(notionResourcesPath + '/app/main/createWindow.js', 'rt') + createWindowText = createWindow.read() + createWindowText = createWindowText.replace('{ show: false', '{ frame: false, show: false') + + print(" Adding ""Run Hidden"" functionality at Notion/resources/app/main/createWindow.js") + sleep(sleepTime) + createWindowText = createWindowText.replace('window.show();', """ + const path = require("path"); + const Store = require(path.join(__dirname,'../','store.js')); + const store = new Store({ + configName: "user-preferences", + defaults: { + runHidden: false, + alwaysMaximized: false + }}); + + var RunHiddenCheckboxState = store.get("runHidden"); + var AlwaysMaximizedCheckboxState = store.get("alwaysMaximized"); + + if(RunHiddenCheckboxState) { + //Do nothing + } else { + if(AlwaysMaximizedCheckboxState) { + window.maximize(); + } else { + window.show() + } + }""") + createWindow.close() + + createWindow = open(notionResourcesPath + '/app/main/createWindow.js', 'wt') + createWindow.write(createWindowText) + createWindow.close() + else: + print(" There is no files at Notion/resources/app/main/createWindow.js - Nothing was done") + sleep(sleepTime) + print("-Done-\n") + sleep(sleepTime) + + print("Step 4") + sleep(sleepTime) + # Step 4 + if os.path.isfile(notionResourcesPath + '/app/renderer/index.js'): + print(" Adjusting drag area for frameless window in Notion/resources/app/renderer/index.js") + sleep(sleepTime) + createWindow = open(notionResourcesPath + '/app/renderer/index.js', 'rt') + createWindowText = createWindow.read() + topIndex = createWindowText.rfind("top") + createWindowTextSplit = createWindowText[topIndex:] + createWindowTextSplit = createWindowTextSplit.replace("right: 0", "right: 420 ") + createWindowTextSplit = createWindowTextSplit.replace("top: 0", "top: 1 ") + createWindowTextSplit = createWindowTextSplit.replace("height: 34", "height: 16") + createWindowText = createWindowText[:topIndex] + createWindowTextSplit + createWindow.close() + + createWindow = open(notionResourcesPath + '/app/renderer/index.js', 'wt') + createWindow.write(createWindowText) + createWindow.close() + else: + print(" There is no files at Notion/resources/app/renderer/index.js - Nothing was done") + sleep(sleepTime) + print("-Done-\n") + sleep(sleepTime) + + print("Step 5") + sleep(sleepTime) + # Step 5 + if os.path.isfile(notionResourcesPath + '/app/main/main.js'): + print(" Adding tray support at Notion/resources/app/main/main.js") + sleep(sleepTime) + print(" Adding context menu with settings to tray") + sleep(sleepTime) + + hotkeysCodeText = """ + const {Tray, Menu} = require("electron"); + let tray = null; + electron_1.app.on("ready", function() { + handleReady(); + + const path = require("path"); + const Store = require(path.join(__dirname,'../','store.js')); + + const store = new Store({ + configName: "user-preferences", + defaults: { + alwaysMaximized: false, + CloseToTrayCheckbox: false, + runHidden: false + } + }); + + var RunAtStartupCheckboxState = electron_1.app.getLoginItemSettings().openAtLogin; + var RunHiddenCheckboxState = store.get("runHidden"); + var AlwaysMaximizedCheckboxState = store.get("alwaysMaximized"); + var CloseToTrayCheckboxState = store.get("CloseToTrayCheckbox"); + + tray = new Tray(path.join(__dirname,"./icon.ico")); + const contextMenu = Menu.buildFromTemplate([ + { + id: "RunAtStartupCheckbox", + label: "Run at Startup", + type:"checkbox", + checked: RunAtStartupCheckboxState, + click() { + var isChecked = contextMenu.getMenuItemById("RunAtStartupCheckbox").checked; + if(isChecked) { + electron_1.app.setLoginItemSettings({ openAtLogin: true}); + } else { + electron_1.app.setLoginItemSettings({ openAtLogin: false}); + } + } + }, + { + id: "runHidden", + label: "Run Hidden", + type:"checkbox", + checked: RunHiddenCheckboxState, + click() { + var isChecked = contextMenu.getMenuItemById("runHidden").checked; + if(isChecked) { + store.set("runHidden", true); + } else { + store.set("runHidden", false); + } + } + }, + { + id: "AlwaysMaximizedCheckbox", + label: "Open Maximized", + type: "checkbox", + checked: AlwaysMaximizedCheckboxState, + click() { + var isChecked = contextMenu.getMenuItemById("AlwaysMaximizedCheckbox").checked; + if(isChecked) { + store.set("alwaysMaximized", true); + } else { + store.set("alwaysMaximized", false); + } + } + }, + { + id: "CloseToTrayCheckbox", + label: "Close To Tray", + type: "checkbox", + checked: CloseToTrayCheckboxState, + click() { + var isChecked = contextMenu.getMenuItemById("CloseToTrayCheckbox").checked; + if(isChecked) { + store.set("CloseToTrayCheckbox", true); + } else { + store.set("CloseToTrayCheckbox", false); + } + } + }, + { + type: "separator" + }, + { + label: "Quit", + role: "quit" + } + ]); + tray.setContextMenu(contextMenu); + + tray.on("click", function() { + var win = electron_1.BrowserWindow.getAllWindows()[0]; + var alwaysMax = contextMenu.getMenuItemById("AlwaysMaximizedCheckbox").checked; + if (win.isVisible()) { + if(win.isMinimized()) { + win.show() + } else { + win.hide(); + } + } else { + if(alwaysMax){ + win.maximize(); + } else { + win.show(); + } + } + }); + + var notionToggleHotkey = 'ctrl+shift+a'; + const globalShortcut = electron_1.globalShortcut; + globalShortcut.register(notionToggleHotkey, function() { + var win = electron_1.BrowserWindow.getAllWindows()[0]; + var alwaysMax = contextMenu.getMenuItemById("AlwaysMaximizedCheckbox").checked; + if (win.isVisible()) { + win.hide(); + } else { + if(alwaysMax){ + win.maximize(); + } else { + win.show(); + } + } + }); + }); + """ + mainJs = open(notionResourcesPath + '/app/main/main.js', 'rt') + mainJsText = mainJs.read() + mainJs.close() + + print(" Adding hotkey to show/hide Notion window") + sleep(sleepTime) + if "var notionToggleHotkey" in mainJsText: + mainJsText = re.sub(r"var notionToggleHotkey = '([A-Za-z0-9+_\./\\-]*)'", "var notionToggleHotkey = " + windowToggleHotkey, mainJsText) + else : + mainJsText = mainJsText.replace('electron_1.app.on("ready", handleReady);' , hotkeysCodeText) + mainJsText = mainJsText.replace('win.focus()','win.show()',1) + + print(" Copying tray icon ""icon.ico"" to /app/main/ ") + sleep(sleepTime) + copyfile('./resources/icon.ico', notionResourcesPath + '/app/main/icon.ico' ) + + print(" Copying settings saver class ""store.js"" to /app/ ") + sleep(sleepTime) + copyfile('./resources/store.js', notionResourcesPath + '/app/store.js' ) + + mainJs = open(notionResourcesPath + '/app/main/main.js', 'wt') + mainJs.write(mainJsText) + mainJs.close() + sleep(sleepTime) + else: + print(" There is no files at Notion/resources/app/main/main.js - Nothing was done") + sleep(sleepTime) + print("-Done-") + sleep(sleepTime) + + sleep(0.5) + print("========= END OF LOG =========") + sleep(0.5) + print(""" + + ____ _ _____ ____ _ _ _____ ____ + | _ \ / \|_ _/ ___| | | | ____| _ \ + | |_) / _ \ | || | | |_| | _| | | | | + | __/ ___ \| || |___| _ | |___| |_| | + |_| /_/ \_|_| \____|_| |_|_____|____/ + + """) + sleep(4) +except Exception as e: + sleep(0.5) + print("========= END OF LOG =========") + sleep(0.5) + print(""" + __________ ____ ____ ____ + / ____/ __ \/ __ \/ __ \/ __ \\ + / __/ / /_/ / /_/ / / / / /_/ / + / /___/ _, _/ _, _/ /_/ / _, _/ + /_____/_/ |_/_/ |_|\____/_/ |_| + + \n\n""" + str(e)) + os.system('pause') diff --git a/Notion Customization/Customization Remover.py b/Notion Customization/Customization Remover.py new file mode 100644 index 0000000..75427ad --- /dev/null +++ b/Notion Customization/Customization Remover.py @@ -0,0 +1,80 @@ +""" +# Step 1 +1.Locating notion app at ./%Username%/AppData/Local/Programs/Notion +2.Unpacking app.asar in new folder at./Notion/resources/app +3.Renaming file app.asar to app.asar.bak (because instead app won't use folder "app" to get all resources from it) +4.If app.asar already unpacked - it will try to locate folder "app" and skip to next step + +# Step 2 +1. Editing userscript file to replace "full_path_to_custom_style" with full path to ./custom_style.css +2. Adding userscript from main.user.js(should be in same folder with this .py file) to the ./app/renderer/preload.js +3. If there is already userscript - it will overwrite it. + +# Step 3 +1. Adding property "frame: false" to the place where application window is creating + +# Step 4 +1. Changes "window drag" area, to make window draggable + 1.1. You can change it by yourself, if you experiencing problems with dragging window or with clicking buttons on app topbar + Because this "draggable area" is creating on top of the other stuff, so if it will have button behind it - it won't be clickable. + You should change top,left,right properties. Now it's 2px on top, 390px on left and 420px on right; +""" +import os +from time import sleep +from shutil import copyfile +from shutil import rmtree +import re + +try: + sleepTime = 0.5 + sleep(sleepTime) + print("========= START OF LOG =========") + sleep(sleepTime) + LOCALAPPDATA = os.getenv('LOCALAPPDATA') + LOCALAPPDATA = LOCALAPPDATA.replace('\\', '/') + notionResourcesPath = LOCALAPPDATA + '/Programs/Notion/resources' + + if os.path.exists(notionResourcesPath + '/app'): + rmtree(notionResourcesPath + '/app') + print("Removing ""app"" folder") + sleep(sleepTime) + else: + print("There is no ""app"" folder at ./Notion/resources/app - Skipping this step") + sleep(sleepTime) + + if os.path.isfile(notionResourcesPath + '/app.asar.bak'): + renameSource = notionResourcesPath + '/app.asar.bak' + renameDestination = notionResourcesPath + '/app.asar' + os.rename(renameSource, renameDestination) + print("Renaming app.asar.bak to app.asar") + sleep(sleepTime) + else: + print("There is no ""app.asar.bak"" at ./Notion/resources/app.asar.bak - Skipping this step") + sleep(sleepTime) + + sleep(0.5) + print("========= LOG =========") + sleep(0.5) + print(""" + + ____ _____ __ __ _____ _______ ____ + | _ \| ____| \/ |/ _ \ \ / | ____| _ \ + | |_) | _| | |\/| | | | \ \ / /| _| | | | | + | _ <| |___| | | | |_| |\ V / | |___| |_| | + |_| \_|_____|_| |_|\___/ \_/ |_____|____/ + + """) + sleep(2) +except Exception as e: + sleep(0.5) + print("========= END OF LOG =========") + sleep(0.5) + print(""" + __________ ____ ____ ____ + / ____/ __ \/ __ \/ __ \/ __ \\ + / __/ / /_/ / /_/ / / / / /_/ / + / /___/ _, _/ _, _/ /_/ / _, _/ + /_____/_/ |_/_/ |_|\____/_/ |_| + + \n\n""" + str(e)) + os.system('pause') diff --git a/Notion Customization/resources/custom_style.css b/Notion Customization/resources/custom_style.css new file mode 100644 index 0000000..c65a7de --- /dev/null +++ b/Notion Customization/resources/custom_style.css @@ -0,0 +1,135 @@ +/* Window control buttons block */ +#window-buttons-area { + padding-left: 14px; +} +/* Light Theme style for window contoll buttons */ +.notion-light-theme .window-buttons { + background: rgb(255, 255, 255); + color: black; + border: 0; + margin: 0px 0px 0px 9px; + width: 32px; + line-height: 26px; + border-radius: 4px; + font-size: 16px; + transition-duration: 0.2s; + font-weight: bold; +} +.notion-light-theme .window-buttons:hover { + background: rgb(239, 239, 239); +} +/* Light Theme style for window contoll buttons */ + + +/* Dark Theme style for window contoll buttons */ +.notion-dark-theme .window-buttons { + background: rgb(47, 52, 55); + border: 0; + margin: 0px 0px 0px 9px; + width: 32px; + line-height: 26px; + border-radius: 4px; + font-size: 16px; + transition-duration: 0.2s; +} +.notion-dark-theme .window-buttons:hover { + background: rgb(71, 76, 80); +} +/* Dark Theme style for window contoll buttons */ + + + +/* To make cursor style as pointer when hover on scrollbar */ +.notion-scroller { + cursor: auto; +} +/* Scrollbar size */ +::-webkit-scrollbar { + width: 5px; /* To change vertical scrollbar width */ + height: 12px; /* To change horizontal scrollbar height */ +} +/* Element where vertical and horizontal scrollbars converge */ +::-webkit-scrollbar-corner{ + background-color: transparent; +} + +/* Light Theme style for Scrollbars */ +.notion-light-theme ::-webkit-scrollbar-thumb { + border-radius: 5px; + background-color: #afafaf; +} +.notion-light-theme ::-webkit-scrollbar-track { + border-radius: 5px; + background-color: #e4e4e4; +} +.notion-light-theme ::-webkit-scrollbar-thumb:hover{ + background: #969696; +} +/* Light Theme style for Scrollbars */ + + +/* Dark Theme style for Scrollbars */ +.notion-dark-theme ::-webkit-scrollbar-track { + border-radius: 5px; + background-color: #3d3d42; +} +.notion-dark-theme ::-webkit-scrollbar-thumb { + border-radius: 5px; + background-color: #5d5d5d; +} +.notion-dark-theme ::-webkit-scrollbar-thumb:hover{ + background: #868686; +} +/* Dark Theme style for Scrollbars */ + + + +/* Changing table padding to make it more wider */ +[style^="flex-shrink: 0; flex-grow: 1; width: 100%; max-width: 100%; display: flex; align-items: center; flex-direction: column; font-size: 16px; color: rgba(255, 255, 255, 0.9); padding: 0px 96px 30vh;"] .notion-table-view, +[class="notion-scroller"]>.notion-table-view { + padding-left: 35px !important; + padding-right: 15px !important; + min-width: 0% !important; +} +/* Changing the width of horizontal scroller, because of wider table */ +[style^="flex-shrink: 0; flex-grow: 1; width: 100%; max-width: 100%; display: flex; align-items: center; flex-direction: column; font-size: 16px; color: rgba(255, 255, 255, 0.9); padding: 0px 96px 30vh;"] .notion-selectable .notion-scroller.horizontal::-webkit-scrollbar-track { + margin-left: 10px; + margin-right: 10px; +} +/* Hide "+" button when you hover on table row, because of it's useless for me, and this buttons takes like 15px from the left side of table */ +[style^="flex-shrink: 0; flex-grow: 1; width: 100%; max-width: 100%; display: flex; align-items: center; flex-direction: column; font-size: 16px; color: rgba(255, 255, 255, 0.9); padding: 0px 96px 30vh;"] .notion-table-view [style^="opacity:"]>[role="button"], +[class="notion-scroller"]>.notion-table-view [style^="opacity:"]>[role="button"] { + display:none !important; +} + +/* Same as with table. Makes board view more wider */ +.notion-board-view { + padding-left: 10px !important; + padding-right: 10px !important; +} +/* Changing content block position, less height - higher content block */ +[style^="position: relative; width: 100%; display: flex; flex-direction: column; align-items: center; height: 30vh;"] { + height: 12vh !important; +} +/* Changing cover image height to match higher content block */ +[style^="position: relative; width: 100%; display: flex; flex-direction: column; align-items: center; height: 30vh;"] img { + height: 20vh !important; +} +/* Changing table columns width */ +[data-block-id^="PutYourIDHere"]>[style^="display: flex; position: absolute; background: rgb(47, 52, 55); z-index: 82; height: 33px; color: rgba(255, 255, 255, 0.6);"]>div:nth-child(1)>div:nth-child(10)>div:nth-child(1), +[data-block-id^="PutYourIDHere"]>[style^="position: relative; min-width: calc(100% - 192px);"]>[data-block-id]>div:nth-child(10), +[data-block-id^="PutYourIDHere"]>div:nth-child(5)>div:nth-child(10){ + width: 45px !important; +} +/* Hiding selection, because of changing columns width bugs selection inside table */ +[data-block-id^="PutYourIDHere"] [style^="position: absolute; top: 0px; left: 0px; pointer-events: none;"]:not(.notion-presence-container) { + display: none; +} + +/* Changing table header icons to make it smaller */ +[style^="display: flex; position: absolute; background: rgb(47, 52, 55); z-index: 82; height: 33px; color: rgba(255, 255, 255, 0.6);"] div:nth-child(1) svg { + height: 10px !important; + width: 10px !important; + margin-right: -4px; +} + diff --git a/Notion Customization/resources/icon.ico b/Notion Customization/resources/icon.ico new file mode 100644 index 0000000..b46f68c Binary files /dev/null and b/Notion Customization/resources/icon.ico differ diff --git a/Notion Customization/resources/main.user.js b/Notion Customization/resources/main.user.js new file mode 100644 index 0000000..62e1267 --- /dev/null +++ b/Notion Customization/resources/main.user.js @@ -0,0 +1,93 @@ +function userscript() { + /* Style Injecting */ + var fs = require("fs"); + let css = fs.readFileSync("full_path_to_custom_style"); //will be replaced in python patcher + let head, style; + head = document.getElementsByTagName('head')[0]; + if (!head) { return; } + style = document.createElement('style'); + style.type = 'text/css'; + style.innerHTML = css; + head.appendChild(style); + /* Style Injecting */ + + /* Window Control Buttons */ + var buttonsIntervalId = window.setInterval(addButtonsOnLoad,100); + function addButtonsOnLoad() { + if(document.querySelector('div.notion-topbar > div') == undefined) { + return; + } + var browserWindow = require('electron').remote.getCurrentWindow(); + var element = document.createElement("div"); + element.id = "window-buttons-area"; + var node = document.querySelector('div.notion-topbar > div'); + node.appendChild(element); + + node = document.querySelector("#window-buttons-area"); + + /* AlwaysOnTop Button */ + element = document.createElement("button"); + element.classList.add("window-buttons"); + element.innerHTML = "🠛"; + element.onclick = function () { + if(!browserWindow.isAlwaysOnTop()) { + browserWindow.setAlwaysOnTop(true); + this.innerHTML = "🠙"; + } else { + browserWindow.setAlwaysOnTop(false); + this.innerHTML = "🠛"; + } + }; + node.appendChild(element); + /* AlwaysOnTop Button */ + + /* Minimize Button */ + element = document.createElement("button"); + element.classList.add("window-buttons"); + element.innerHTML = "⚊"; + element.onclick = function () { browserWindow.minimize(); }; + node.appendChild(element); + /* Minimize Button */ + + /* Maximize Button */ + element = document.createElement("button"); + element.classList.add("window-buttons"); + element.innerHTML = "▢"; + element.onclick = function () { + if (!browserWindow.isMaximized()) { + browserWindow.maximize(); + } else { + browserWindow.unmaximize(); + } + }; + node.appendChild(element); + /* Maximize Button */ + + /* Close Button */ + const path = require("path") + element = document.createElement("button"); + element.classList.add("window-buttons"); + element.innerHTML = "⨉"; + element.onclick = function () { + const Store = require(path.join(__dirname,'../','store.js')); + const store = new Store({ + configName: "user-preferences", + defaults: { + CloseToTrayCheckbox: false + } + }); + var CloseToTrayCheckboxState = store.get("CloseToTrayCheckbox"); + if(CloseToTrayCheckboxState) { + browserWindow.hide(); + } else { + browserWindow.close(); + } + }; + node.appendChild(element); + /* Close Button */ + + window.clearInterval(buttonsIntervalId); + } + /* Window Control Buttons */ +} +require('electron').remote.getGlobal('setTimeout')(() => { userscript();}, 100); \ No newline at end of file diff --git a/Notion Customization/resources/store.js b/Notion Customization/resources/store.js new file mode 100644 index 0000000..3c5737e --- /dev/null +++ b/Notion Customization/resources/store.js @@ -0,0 +1,30 @@ +const electron = require('electron'); +const path = require('path'); +const fs = require('fs'); + +class Store { + constructor(opts) { + const userDataPath = __dirname + this.path = path.join(userDataPath, opts.configName + '.json'); + + this.data = parseDataFile(this.path, opts.defaults); + } + + get(key) { + return this.data[key]; + } + + set(key, val) { + this.data[key] = val; + fs.writeFileSync(this.path, JSON.stringify(this.data)); + } +} + +function parseDataFile(filePath, defaults) { + try { + return JSON.parse(fs.readFileSync(filePath)); + } catch(error) { + return defaults; + } +} +module.exports = Store; \ No newline at end of file