refactor: attempt to color only modified line
This commit is contained in:
		
							parent
							
								
									37de87fd3a
								
							
						
					
					
						commit
						790a139fa1
					
				| 
						 | 
					@ -43,7 +43,7 @@
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			<div id="notecontent">
 | 
								<div id="notecontent">
 | 
				
			||||||
			    <textarea id="md" spellcheck="false" oninput="datachanged()" onkeydown="editorkeydown()" onclick="clickeditor()"></textarea>
 | 
								    <textarea id="md" spellcheck="false" oninput="editorinput()" onkeydown="editorkeydown()" onclick="clickeditor()"></textarea>
 | 
				
			||||||
			    <div hidden id="colored"></div>
 | 
								    <div hidden id="colored"></div>
 | 
				
			||||||
			    <div hidden id="preview"></div>
 | 
								    <div hidden id="preview"></div>
 | 
				
			||||||
			</div>
 | 
								</div>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										128
									
								
								main.js
								
								
								
								
							
							
						
						
									
										128
									
								
								main.js
								
								
								
								
							| 
						 | 
					@ -315,6 +315,7 @@ var snippets = [
 | 
				
			||||||
function seteditorcontent(content, silent)
 | 
					function seteditorcontent(content, silent)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	md.value = content;
 | 
						md.value = content;
 | 
				
			||||||
 | 
						applycolors();
 | 
				
			||||||
	if (!silent)
 | 
						if (!silent)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		datachanged();
 | 
							datachanged();
 | 
				
			||||||
| 
						 | 
					@ -1234,7 +1235,6 @@ function applystyle()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		title.style.color = settings.accentcolor;
 | 
							title.style.color = settings.accentcolor;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	applycolors();
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function loadsettings()
 | 
					function loadsettings()
 | 
				
			||||||
| 
						 | 
					@ -1974,23 +1974,8 @@ function rawline(index)
 | 
				
			||||||
	return md.value.split("\n")[index];
 | 
						return md.value.split("\n")[index];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function applycolors()
 | 
					function applycolorsonline(line, index, options)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (!settings.colors)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var boldstyle = "font-weight: bold;";
 | 
					 | 
				
			||||||
	var lines = md.value.split("\n");
 | 
					 | 
				
			||||||
	var header = false;
 | 
					 | 
				
			||||||
	var code = false;
 | 
					 | 
				
			||||||
	var comment = false;
 | 
					 | 
				
			||||||
	var language = "";
 | 
					 | 
				
			||||||
	var resulthtml = "";
 | 
					 | 
				
			||||||
	lines.every( (line, i) =>
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		resulthtml += "<div id='line" + i + "'>";
 | 
					 | 
				
			||||||
	line = escapeHtml(line);
 | 
						line = escapeHtml(line);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// headings
 | 
						// headings
 | 
				
			||||||
| 
						 | 
					@ -2028,39 +2013,39 @@ function applycolors()
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// md header
 | 
						// md header
 | 
				
			||||||
		if (i == 0 && line == "---")
 | 
						if (index == 0 && line == "---")
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
			header = true;
 | 
							options.header = true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
		if (header)
 | 
						if (options.header)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
			if (i > 0 && line == "---")
 | 
							if (index > 0 && line == "---")
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
				header = false;
 | 
								options.header = false;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		line = line || " ";
 | 
							line = line || " ";
 | 
				
			||||||
		line = "<span style='color:lightgrey'>" + line + "</span>";
 | 
							line = "<span style='color:lightgrey'>" + line + "</span>";
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// code blocks
 | 
						// code blocks
 | 
				
			||||||
		if (line.startsWith("```") && !code)
 | 
						if (line.startsWith("```") && !options.code)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
			code = true;
 | 
							options.code = true;
 | 
				
			||||||
			language = line.substring(3);
 | 
							options.language = line.substring(3);
 | 
				
			||||||
		line = "<span style='font-family:monospace;color:rgb(70,70,70);'>" + line;
 | 
							line = "<span style='font-family:monospace;color:rgb(70,70,70);'>" + line;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
		else if (line == "```" && code)
 | 
						else if (line == "```" && options.code)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
			code = false;
 | 
							options.code = false;
 | 
				
			||||||
			language = "";
 | 
							options.language = "";
 | 
				
			||||||
		line = line + "</span>";
 | 
							line = line + "</span>";
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
		else if (code)
 | 
						else if (options.code)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		line = line.replace(/\b(\d+)\b/g, "<span style='color:" + settings.accentcolor + "'>$1</span>");
 | 
							line = line.replace(/\b(\d+)\b/g, "<span style='color:" + settings.accentcolor + "'>$1</span>");
 | 
				
			||||||
			if (languagekeywords[language])
 | 
							if (languagekeywords[options.language])
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
				var keywords = languagekeywords[language];
 | 
								var keywords = languagekeywords[options.language];
 | 
				
			||||||
			keywords.forEach(keyword =>
 | 
								keywords.forEach(keyword =>
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				var r = new RegExp("(" + keyword + ")", "ig");
 | 
									var r = new RegExp("(" + keyword + ")", "ig");
 | 
				
			||||||
| 
						 | 
					@ -2077,15 +2062,15 @@ function applycolors()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (line.includes("<!--") && !line.includes("-->"))
 | 
						if (line.includes("<!--") && !line.includes("-->"))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
			comment = true;
 | 
							options.comment = true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
		else if (comment)
 | 
						else if (options.comment)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		line = line || " ";
 | 
							line = line || " ";
 | 
				
			||||||
		line = "<span style='color:lightgrey'>" + line
 | 
							line = "<span style='color:lightgrey'>" + line
 | 
				
			||||||
		if (line.includes("-->"))
 | 
							if (line.includes("-->"))
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
				comment = false;
 | 
								options.comment = false;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
| 
						 | 
					@ -2101,9 +2086,9 @@ function applycolors()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// autocomplete snippets
 | 
						// autocomplete snippets
 | 
				
			||||||
		if (i == currentline())
 | 
						if (index == currentline())
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
			var raw = rawline(i);
 | 
							var raw = rawline(index);
 | 
				
			||||||
		var pos = currentcol();
 | 
							var pos = currentcol();
 | 
				
			||||||
		var slashpos = raw.substring(0, pos).lastIndexOf("/");
 | 
							var slashpos = raw.substring(0, pos).lastIndexOf("/");
 | 
				
			||||||
		if (slashpos > -1)
 | 
							if (slashpos > -1)
 | 
				
			||||||
| 
						 | 
					@ -2120,17 +2105,76 @@ function applycolors()
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						return line;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		resulthtml += (line || " ") + "</div>";
 | 
					var boldstyle = "font-weight: bold;";
 | 
				
			||||||
 | 
					function applycolors(currentonly)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (!settings.colors)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return true;
 | 
						var options =
 | 
				
			||||||
	});
 | 
						{
 | 
				
			||||||
	colored.innerHTML = resulthtml;
 | 
							header: false,
 | 
				
			||||||
 | 
							code: false,
 | 
				
			||||||
 | 
							comment: false,
 | 
				
			||||||
 | 
							language: ""
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (currentonly)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							var index = currentline();
 | 
				
			||||||
 | 
							var linediv = document.getElementById("line" + index);
 | 
				
			||||||
 | 
							options = JSON.parse(linediv.getAttribute("tag"));
 | 
				
			||||||
 | 
							var line = rawline(index);
 | 
				
			||||||
 | 
							line = applycolorsonline(line, index, options);
 | 
				
			||||||
 | 
							linediv.innerHTML = line || " ";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							console.log("redrawing all colored div");
 | 
				
			||||||
 | 
							var lines = md.value.split("\n");
 | 
				
			||||||
 | 
							var i = 0;
 | 
				
			||||||
 | 
							var line = null;
 | 
				
			||||||
 | 
							for (; i < lines.length; i++)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								line = applycolorsonline(lines[i], i, options);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								var linediv = document.getElementById("line" + i);
 | 
				
			||||||
 | 
								if (!linediv)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									linediv = document.createElement("div");
 | 
				
			||||||
 | 
									colored.appendChild(linediv);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								linediv.setAttribute("id", "line" + i);
 | 
				
			||||||
 | 
								linediv.setAttribute("tag", JSON.stringify(options));
 | 
				
			||||||
 | 
								linediv.innerHTML = line || " ";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// remove remanining
 | 
				
			||||||
 | 
							linediv = document.getElementById("line" + (i++));
 | 
				
			||||||
 | 
							while (linediv)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								colored.removeChild(linediv);
 | 
				
			||||||
 | 
								linediv = document.getElementById("line" + (i++));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function editorinput()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// criteria to improve
 | 
				
			||||||
 | 
						// or redraw only after?
 | 
				
			||||||
 | 
						var multiline = md.value.substring(md.selectionStart, md.selectionEnd).includes("\n");
 | 
				
			||||||
 | 
						applycolors(!multiline && event.data && (event.inputType == "insertText" || event.inputType == "deleteContentBackward" || event.inputType == "deleteContentForward"));
 | 
				
			||||||
 | 
						datachanged();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function datachanged()
 | 
					function datachanged()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	applycolors();
 | 
					 | 
				
			||||||
	resize();
 | 
						resize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	saved = false;
 | 
						saved = false;
 | 
				
			||||||
| 
						 | 
					@ -2742,8 +2786,6 @@ function bindfile(note)
 | 
				
			||||||
	setwindowtitle();
 | 
						setwindowtitle();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	seteditorcontent(note.content || "", true);
 | 
						seteditorcontent(note.content || "", true);
 | 
				
			||||||
	applycolors();
 | 
					 | 
				
			||||||
	preview.innerHTML = md2html(md.value);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (changed)
 | 
						if (changed)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue