first refactor: load and save
This commit is contained in:
		
							parent
							
								
									3e15377b57
								
							
						
					
					
						commit
						090c04eedd
					
				
							
								
								
									
										158
									
								
								main.js
								
								
								
								
							
							
						
						
									
										158
									
								
								main.js
								
								
								
								
							| 
						 | 
					@ -24,11 +24,11 @@ var codelanguages = ["xml", "js", "sql"];
 | 
				
			||||||
var tagmark = "+";
 | 
					var tagmark = "+";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// globals
 | 
					// globals
 | 
				
			||||||
var currentnote = null;
 | 
					var currentguid = null;
 | 
				
			||||||
 | 
					var notesindex = null;
 | 
				
			||||||
var fileindex = 0;
 | 
					var fileindex = 0;
 | 
				
			||||||
var workerid = null;
 | 
					var workerid = null;
 | 
				
			||||||
var backup = "";
 | 
					var backup = "";
 | 
				
			||||||
var localdata = null;
 | 
					 | 
				
			||||||
var saved = true;
 | 
					var saved = true;
 | 
				
			||||||
var lastsaved = "";
 | 
					var lastsaved = "";
 | 
				
			||||||
var pending = false;
 | 
					var pending = false;
 | 
				
			||||||
| 
						 | 
					@ -380,11 +380,6 @@ function decryptstring(str)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function getnote(title)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	return localdata.find(note => note.title == title);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function getrangecontent(range)
 | 
					function getrangecontent(range)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return md.value.substring(range.start, range.end);
 | 
						return md.value.substring(range.start, range.end);
 | 
				
			||||||
| 
						 | 
					@ -878,7 +873,7 @@ function restoresettings()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function editsettings()
 | 
					function editsettings()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	bindfile(
 | 
						bind(
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		title: "settings.json",
 | 
							title: "settings.json",
 | 
				
			||||||
		content: JSON.stringify(settings, null, "    ")
 | 
							content: JSON.stringify(settings, null, "    ")
 | 
				
			||||||
| 
						 | 
					@ -933,7 +928,7 @@ function decryptnote()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function editpgpkeys()
 | 
					function editpgpkeys()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	bindfile(
 | 
						bind(
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		title: "pgpkeys",
 | 
							title: "pgpkeys",
 | 
				
			||||||
		content: localStorage.getItem("pgpkeys") || ""
 | 
							content: localStorage.getItem("pgpkeys") || ""
 | 
				
			||||||
| 
						 | 
					@ -992,13 +987,13 @@ function searchtags()
 | 
				
			||||||
	.then(loadnote);
 | 
						.then(loadnote);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function gettags(note)
 | 
					function gettags(content)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	var i = note.content.indexOf("tags: ");
 | 
						var i = content.indexOf("tags: ");
 | 
				
			||||||
	if (i > -1)
 | 
						if (i > -1)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		var j = note.content.indexOf("\n", i);
 | 
							var j = content.indexOf("\n", i);
 | 
				
			||||||
		return note.content.substring(i + 6, j)
 | 
							return content.substring(i + 6, j)
 | 
				
			||||||
			.split(",")
 | 
								.split(",")
 | 
				
			||||||
			.map(t => t.toLowerCase().trim())
 | 
								.map(t => t.toLowerCase().trim())
 | 
				
			||||||
			.filter(t => t.length);
 | 
								.filter(t => t.length);
 | 
				
			||||||
| 
						 | 
					@ -1180,8 +1175,21 @@ function gotoline(line)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function loadstorage()
 | 
					function loadstorage()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	var item = window.localStorage.getItem("data");
 | 
						notesindex = JSON.parse(localStorage.getItem("index"));
 | 
				
			||||||
	localdata = item ? JSON.parse(item) : [];
 | 
						if (!notesindex)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							notesindex = {};
 | 
				
			||||||
 | 
							// todo: refactor in "add new note"
 | 
				
			||||||
 | 
							var guid = crypto.randomUUID();
 | 
				
			||||||
 | 
							var content = defaultheaders();
 | 
				
			||||||
 | 
							var item = {
 | 
				
			||||||
 | 
								title: timestamp(),
 | 
				
			||||||
 | 
								pos: content.length
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							notesindex[guid] = item;
 | 
				
			||||||
 | 
							localStorage.setItem("index", JSON.stringify(notesindex));
 | 
				
			||||||
 | 
							localStorage.setItem(guid, content);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var params = new URLSearchParams(window.location.search);
 | 
						var params = new URLSearchParams(window.location.search);
 | 
				
			||||||
	var title = params.get("n") || params.get("name");
 | 
						var title = params.get("n") || params.get("name");
 | 
				
			||||||
| 
						 | 
					@ -1201,7 +1209,8 @@ function loadstorage()
 | 
				
			||||||
		inserttodo("@clip " + clip).then(window.close);
 | 
							inserttodo("@clip " + clip).then(window.close);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (currentnote)
 | 
						// when multiple tabs or split?
 | 
				
			||||||
 | 
						/*if (currentnote)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		currentnote = getnote(currentnote.title);
 | 
							currentnote = getnote(currentnote.title);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -1214,11 +1223,11 @@ function loadstorage()
 | 
				
			||||||
			currentnote = {title: title, content: newcontent, pos: newcontent.length};
 | 
								currentnote = {title: title, content: newcontent, pos: newcontent.length};
 | 
				
			||||||
			localdata.unshift(currentnote);
 | 
								localdata.unshift(currentnote);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (currentnote)
 | 
						if (currentguid)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		bindfile(currentnote);
 | 
							bind(currentguid);
 | 
				
			||||||
		if (line)
 | 
							if (line)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			gotoline(line);
 | 
								gotoline(line);
 | 
				
			||||||
| 
						 | 
					@ -1288,8 +1297,29 @@ function initsnippets()
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function migratelegacystorage()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						var legacy = localStorage.getItem("data");
 | 
				
			||||||
 | 
						if (legacy)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							var legacy = JSON.parse(legacy);
 | 
				
			||||||
 | 
							var index = {};
 | 
				
			||||||
 | 
							legacy.forEach(note =>
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								var guid = crypto.randomUUID();
 | 
				
			||||||
 | 
								localStorage.setItem(guid, note.content);
 | 
				
			||||||
 | 
								note.tags = gettags(note.content);
 | 
				
			||||||
 | 
								delete note.content;
 | 
				
			||||||
 | 
								index[guid] = note;
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
							localStorage.setItem("index", JSON.stringify(index));
 | 
				
			||||||
 | 
							localStorage.removeItem("data");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function init()
 | 
					function init()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						migratelegacystorage();
 | 
				
			||||||
	loadsettings();
 | 
						loadsettings();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	window.onbeforeunload = checksaved;
 | 
						window.onbeforeunload = checksaved;
 | 
				
			||||||
| 
						 | 
					@ -1349,14 +1379,14 @@ function init()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function getorcreate(title, content)
 | 
					function getorcreate(guid, content)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	var note = getnote(title);
 | 
						var note = getnote(guid);
 | 
				
			||||||
	if (!note)
 | 
						/*if (!note)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		note = {title: title, content: content, pos: content.length};
 | 
							note = {title: title, content: content, pos: content.length};
 | 
				
			||||||
		localdata.push(note)
 | 
							localdata.push(note)
 | 
				
			||||||
	}
 | 
						}*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return note;
 | 
						return note;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1514,7 +1544,7 @@ function md2html(content)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function loadlast()
 | 
					function loadlast()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	loadnote(localdata.length ? localdata[0].title : timestamp());
 | 
						loadnote(Object.keys(notesindex)[0]);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function loadprevious()
 | 
					function loadprevious()
 | 
				
			||||||
| 
						 | 
					@ -1578,7 +1608,7 @@ function showgrepresult(needle, grepresult)
 | 
				
			||||||
		grepcontent.push("No result.");
 | 
							grepcontent.push("No result.");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bindfile(
 | 
						bind(
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		title: "Search result",
 | 
							title: "Search result",
 | 
				
			||||||
		content: grepcontent.join("\n")
 | 
							content: grepcontent.join("\n")
 | 
				
			||||||
| 
						 | 
					@ -1796,11 +1826,8 @@ function resize()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function putontop()
 | 
					function putontop()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (localdata.find(n => n == currentnote))
 | 
						console.warn("todo: put on top");
 | 
				
			||||||
	{
 | 
						return;
 | 
				
			||||||
		localdata.splice(localdata.indexOf(currentnote), 1);
 | 
					 | 
				
			||||||
		localdata.unshift(currentnote);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function postpone()
 | 
					function postpone()
 | 
				
			||||||
| 
						 | 
					@ -1819,13 +1846,27 @@ function setsaved()
 | 
				
			||||||
	lastsaved = timestamp();
 | 
						lastsaved = timestamp();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function serialize()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// serialize all gui stuff to local storage
 | 
				
			||||||
 | 
						var item = notesindex[currentguid];
 | 
				
			||||||
 | 
						item.title = title.value;
 | 
				
			||||||
 | 
						item.pos = md.selectionStart;
 | 
				
			||||||
 | 
						item.tags = gettags(md.value);
 | 
				
			||||||
 | 
						putontop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						localStorage.setItem("index", JSON.stringify(notesindex));
 | 
				
			||||||
 | 
						localStorage.setItem(currentguid, md.value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function save()
 | 
					function save()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return new Promise(function(resolve, reject)
 | 
						return new Promise(function(resolve, reject)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		clearTimeout(workerid);
 | 
							clearTimeout(workerid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (currentnote.title == "settings.json")
 | 
							if (title.value == "settings.json")
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			settings = JSON.parse(md.value);
 | 
								settings = JSON.parse(md.value);
 | 
				
			||||||
			savesettings();
 | 
								savesettings();
 | 
				
			||||||
| 
						 | 
					@ -1833,17 +1874,12 @@ function save()
 | 
				
			||||||
			setsaved();
 | 
								setsaved();
 | 
				
			||||||
			resolve();
 | 
								resolve();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else if (currentnote.title == "pgpkeys")
 | 
							else if (title.value == "pgpkeys")
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			localStorage.setItem("pgpkeys", md.value);
 | 
								localStorage.setItem("pgpkeys", md.value);
 | 
				
			||||||
			setsaved();
 | 
								setsaved();
 | 
				
			||||||
			resolve();
 | 
								resolve();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else if (!localdata)
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			showtemporaryinfo("cannot push empty data");
 | 
					 | 
				
			||||||
			reject();
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		else if (pending)
 | 
							else if (pending)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			console.log("pending query: save cancelled");
 | 
								console.log("pending query: save cancelled");
 | 
				
			||||||
| 
						 | 
					@ -1859,16 +1895,12 @@ function save()
 | 
				
			||||||
			var content = md.value;
 | 
								var content = md.value;
 | 
				
			||||||
			if ((content == "" && backup != "") || content == "null" || content == "undefined")
 | 
								if ((content == "" && backup != "") || content == "null" || content == "undefined")
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				showtemporaryinfo("Invalid content '" + content + "', file '" + currentnote.title + "' not saved");
 | 
									showtemporaryinfo("Invalid content '" + content + "', file '" + title.value + "' not saved");
 | 
				
			||||||
				reject();
 | 
									reject();
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				currentnote.pos = md.selectionStart;
 | 
									serialize();
 | 
				
			||||||
				currentnote.content = content;
 | 
					 | 
				
			||||||
				putontop();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				window.localStorage.setItem("data", JSON.stringify(localdata));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (settings.sync)
 | 
									if (settings.sync)
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
| 
						 | 
					@ -2246,7 +2278,7 @@ function showhelp()
 | 
				
			||||||
	help.push("##Sources");
 | 
						help.push("##Sources");
 | 
				
			||||||
	help.push("https://github.com/quenousimporte/notes");
 | 
						help.push("https://github.com/quenousimporte/notes");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bindfile(
 | 
						bind(
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		title: "Help",
 | 
							title: "Help",
 | 
				
			||||||
		content: help.join("\n")
 | 
							content: help.join("\n")
 | 
				
			||||||
| 
						 | 
					@ -2307,7 +2339,8 @@ function istodo(note)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function currentistodo()
 | 
					function currentistodo()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return istodo(currentnote);
 | 
						//return istodo(currentnote);
 | 
				
			||||||
 | 
						return title.value.includes("todo") || gettags(md.value).includes("todo");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function sorttodotxt(note)
 | 
					function sorttodotxt(note)
 | 
				
			||||||
| 
						 | 
					@ -2648,7 +2681,7 @@ function mainkeydownhandler()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function setwindowtitle()
 | 
					function setwindowtitle()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	document.title = currentnote.title;
 | 
						document.title = title.value;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function ontitlechange()
 | 
					function ontitlechange()
 | 
				
			||||||
| 
						 | 
					@ -2862,16 +2895,15 @@ function togglepreviewwithsubs()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function bindfile(note)
 | 
					function bind(title, content, pos)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	var changed = currentnote != note;
 | 
						var changed = title.value != title;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	backup = note.content;
 | 
						backup = content;
 | 
				
			||||||
	currentnote = note;
 | 
						title.value = title;
 | 
				
			||||||
	title.value = note.title;
 | 
					 | 
				
			||||||
	setwindowtitle();
 | 
						setwindowtitle();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	seteditorcontent(note.content || "", true);
 | 
						seteditorcontent(content || "", true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (changed)
 | 
						if (changed)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -2879,7 +2911,7 @@ function bindfile(note)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	resize();
 | 
						resize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	setpos(note.pos || 0);
 | 
						setpos(pos || 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!issplit() && searchdialog.hidden)
 | 
						if (!issplit() && searchdialog.hidden)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -2899,14 +2931,16 @@ function defaultheaders(tags = "")
 | 
				
			||||||
		"",""].join("\n");
 | 
							"",""].join("\n");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function loadnote(name)
 | 
					function loadnote(guid)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	var note = getorcreate(name, defaultheaders());
 | 
						currentguid = guid;
 | 
				
			||||||
 | 
						var content = localStorage.getItem(guid);
 | 
				
			||||||
 | 
						var item = notesindex[guid];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (gettags(note).includes("journal"))
 | 
						/*if (gettags(content).includes("journal"))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		// remove empty entries
 | 
							// remove empty entries
 | 
				
			||||||
		note.content = note.content.replace(/\d{4}-\d{2}-\d{2}\n*(\d{4}-\d{2}-\d{2})/g, "$1");
 | 
							content = content.replace(/\d{4}-\d{2}-\d{2}\n*(\d{4}-\d{2}-\d{2})/g, "$1");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// create new entry for today
 | 
							// create new entry for today
 | 
				
			||||||
		var hat = headerandtext(note);
 | 
							var hat = headerandtext(note);
 | 
				
			||||||
| 
						 | 
					@ -2916,20 +2950,20 @@ function loadnote(name)
 | 
				
			||||||
			note.content = hat.header + "\n" + today + "\n\n" + hat.text;
 | 
								note.content = hat.header + "\n" + today + "\n\n" + hat.text;
 | 
				
			||||||
			note.pos = hat.header.length + 12;
 | 
								note.pos = hat.header.length + 12;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (settings.autosorttodo && istodo(note))
 | 
						/*if (settings.autosorttodo && istodo(note))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		sorttodotxt(note);
 | 
							sorttodotxt(note);
 | 
				
			||||||
	}
 | 
						}*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bindfile(note);
 | 
						bind(item.title, content, item.pos);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	stat.cur.q = 0;
 | 
						stat.cur.q = 0;
 | 
				
			||||||
	stat.cur.d = 0;
 | 
						stat.cur.d = 0;
 | 
				
			||||||
	stat.cur.t = timestamp();
 | 
						stat.cur.t = timestamp();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!preview.hidden || (preview.hidden && (gettags(note).indexOf("preview") !== -1)))
 | 
						if (!preview.hidden || (preview.hidden && (gettags(md.value).indexOf("preview") !== -1)))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		togglepreview();
 | 
							togglepreview();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue