Add files via upload

This commit is contained in:
TarasokUA 2020-02-23 16:50:58 +02:00 committed by GitHub
parent 39fefb01a4
commit 7836e7c95d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 708 additions and 0 deletions

View File

@ -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')

View File

@ -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')

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

View File

@ -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 = "&#129051;";
element.onclick = function () {
if(!browserWindow.isAlwaysOnTop()) {
browserWindow.setAlwaysOnTop(true);
this.innerHTML = "&#129049;";
} else {
browserWindow.setAlwaysOnTop(false);
this.innerHTML = "&#129051;";
}
};
node.appendChild(element);
/* AlwaysOnTop Button */
/* Minimize Button */
element = document.createElement("button");
element.classList.add("window-buttons");
element.innerHTML = "&#9866;";
element.onclick = function () { browserWindow.minimize(); };
node.appendChild(element);
/* Minimize Button */
/* Maximize Button */
element = document.createElement("button");
element.classList.add("window-buttons");
element.innerHTML = "&#9634;";
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 = "&#10761;";
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);

View File

@ -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;