You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
3.2 KiB
111 lines
3.2 KiB
"use strict";
|
|
const {app, protocol, dialog, ipcMain, Menu} = require("electron");
|
|
const path = require("path");
|
|
const fs = require("fs/promises");
|
|
const fsn = require("fs");
|
|
|
|
const AppInfo = require("../package.json");
|
|
const WindowManager = require("./WindowManager");
|
|
const FontManager = require("./FontManager");
|
|
const SettingsManager = require("./SettingsManager");
|
|
const MainMenu = require("./MainMenu");
|
|
const {parser} = require("./Parser");
|
|
|
|
app.commandLine.appendSwitch("disable-http-cache");
|
|
|
|
class Ation {
|
|
windowManager;
|
|
fontManager;
|
|
settingsManager;
|
|
mainMenu;
|
|
watcher;
|
|
currentFile;
|
|
|
|
constructor() {
|
|
if (Ation.Instances > 0)
|
|
throw new Error("Only one Instance of Ation possible");
|
|
this.currentFile = "";
|
|
this.watcher = null;
|
|
this.windowManager = new WindowManager(this);
|
|
this.fontManager = new FontManager();
|
|
this.settingsManager = new SettingsManager(this);
|
|
this.mainMenu = new MainMenu(this);
|
|
|
|
app.on("open-file", (_, path) => {
|
|
this.fileToOpen = path;
|
|
});
|
|
|
|
ipcMain.handle("Ation::appVersion", () => AppInfo.version);
|
|
ipcMain.on("Ation::closeFile", () => this.closeFile());
|
|
|
|
app.whenReady().then(async () => {
|
|
this.settingsManager.change();
|
|
|
|
if (this.fileToOpen)
|
|
this.openFile(this.fileToOpen);
|
|
protocol.registerFileProtocol("slideimg", (request, callback) => {
|
|
const uri = request.url.replace(/^slideimg:\/\//, "");
|
|
const extension = path.extname(uri).replace(/^\./, "");
|
|
|
|
if (["png", "jpg", "jpeg", "svg", "bmp", "gif", "tiff"].includes(extension.toLowerCase()))
|
|
callback(uri);
|
|
});
|
|
|
|
});
|
|
}
|
|
|
|
async openFile(filePath = null, change = false) {
|
|
if (!this.windowManager.mainWindow)
|
|
return null;
|
|
|
|
if (!filePath) {
|
|
const result = await dialog.showOpenDialog(this.windowManager.mainWindow, {
|
|
title : "open file",
|
|
filters : [
|
|
{
|
|
name : "Markdown files",
|
|
extensions : [".md"]
|
|
}
|
|
]
|
|
});
|
|
|
|
if (result.canceled || result.filePaths.length < 1)
|
|
return;
|
|
filePath = result.filePaths[0];
|
|
}
|
|
|
|
try {
|
|
const fileContents = await fs.readFile(filePath, {encoding : "utf-8"});
|
|
const basePath = path.dirname(filePath);
|
|
const data = parser(fileContents);
|
|
|
|
if (!change)
|
|
this.currentFile = filePath;
|
|
if (this.watcher)
|
|
this.watcher.close();
|
|
this.watcher = fsn.watch(filePath, (eventType, path) => {
|
|
if (path.match(/~$/)) // handling unix swap files here
|
|
setTimeout(() => this.openFile(this.currentFile, true), 1000);
|
|
else
|
|
this.openFile(this.currentFile, true);
|
|
});
|
|
Menu.getApplicationMenu().getMenuItemById("close-file").enabled = this.currentFile !== "";
|
|
this.windowManager.mainWindow.send("Ation::openFile", [basePath, data]);
|
|
} catch (error) {
|
|
console.log(error);
|
|
return;
|
|
}
|
|
}
|
|
|
|
closeFile() {
|
|
this.currentFile = "";
|
|
if (this.watcher)
|
|
this.watcher.close();
|
|
this.watcher = null;
|
|
this.windowManager.mainWindow.send("Ation::closeFile");
|
|
Menu.getApplicationMenu().getMenuItemById("close-file").enabled = this.currentFile !== "";
|
|
}
|
|
}
|
|
Ation.Instances = 0;
|
|
|
|
module.exports = Ation; |