a simple keynote software for Markdown files – written in electron
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

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