Skip to content

Commit 2d36d7f

Browse files
committed
performance improvements
1 parent d818555 commit 2d36d7f

File tree

4 files changed

+64
-37
lines changed

4 files changed

+64
-37
lines changed

index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
</div>
4949
</div>
5050
<div class="editor-preview">
51-
<textarea id="editor" class="markdown-body"></textarea>
51+
<textarea autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" id="editor" class="markdown-body"></textarea>
5252
<div id="preview" class="preview markdown-body"></div>
5353
</div>
5454
<script src="dependencies/html2pdf.js"></script>

previewWorker.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ var converter = new showdown.Converter({
2323

2424
// Dynamically calculate debounce time based on document length
2525
function getDebounceTime(length) {
26-
if (length <= 10000) return 2; // Base case for documents up to 10,000 characters
26+
if (length <= 10000) return 0; // Base case for documents up to 10,000 characters
2727
if (length <= 20000) return 500; // Increase debounce time as document grows
2828
if (length <= 30000) return 700; // Further increase for longer documents
2929
if (length <= 40000) return 900;

script.js

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,20 +32,38 @@ function updatePreview() {
3232
debouncedAutosave = debounce(autosave, debounceTime);
3333

3434
previewWorker.postMessage(editor.value);
35-
const paddingHeight = 30;
36-
const currentScrollPos = editor.scrollTop;
37-
const maxScrollPos = editor.scrollHeight - editor.clientHeight - paddingHeight;
35+
const paddingHeight = 30;
36+
let clientHeight = editor.clientHeight; // Read once and store
37+
let scrollHeight = editor.scrollHeight; // Reduce accessing this property
38+
let currentScrollPos = editor.scrollTop; // Less frequent property accesses
39+
let maxScrollPos = scrollHeight - clientHeight - paddingHeight;
3840
if (currentScrollPos >= maxScrollPos) {
39-
editor.scrollTop = editor.scrollHeight - editor.clientHeight;
41+
editor.scrollTop = scrollHeight - clientHeight;
4042
}
4143
}
4244

4345
// Call the updated updatePreview function in the existing input event listener
46+
/*
4447
editor.addEventListener('input', function() {
4548
updatePreview();
4649
debouncedAutosave();
47-
syncScrollEditor();
4850
});
51+
*/
52+
53+
let queued = false;
54+
55+
editor.addEventListener('input', () => {
56+
if (!queued) {
57+
queued = true;
58+
requestIdleCallback(() => {
59+
updatePreview(); // Ensure this function is optimized for performance.
60+
debouncedAutosave(); // Debounce to reduce the frequency of execution.
61+
queued = false;
62+
}, {timeout: 500}); // The timeout option ensures it runs even under heavy load.
63+
}
64+
});
65+
66+
4967

5068

5169
// get the message from the worker
@@ -55,10 +73,12 @@ previewWorker.addEventListener('message', function(event) {
5573
// Ensure scrolling happens after rendering
5674
requestAnimationFrame(function() {
5775
preview.scrollTop = scrollTop;
76+
/*
5877
preview.querySelectorAll('pre code').forEach((block) => {
5978
hljs.highlightBlock(block);
6079
});
6180
// After the highlighting, sync the scroll again
81+
*/
6282
syncScrollEditor();
6383
});
6484
});

shortcuts.js

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -181,63 +181,70 @@ function newLine(){
181181

182182
// Main event listener for keyboard shortcuts
183183
document.addEventListener('keydown', function(event) {
184-
if ((event.ctrlKey || event.metaKey) && !event.altKey) {
184+
var editor = document.getElementById('editor');
185+
// Handling tab key for inserting tabs in the editor
186+
if (event.key === 'Tab') {
187+
event.preventDefault(); // Prevent the tab key's default behavior
188+
var start = editor.selectionStart;
189+
var end = editor.selectionEnd;
190+
editor.value = editor.value.substring(0, start) + '\t' + editor.value.substring(end);
191+
editor.selectionStart = editor.selectionEnd = start + 1; // Move cursor
192+
}
193+
// Handling shortcuts with Ctrl or Cmd key
194+
if (event.ctrlKey || event.metaKey) {
185195
switch (event.key.toLowerCase()) {
186196
case 'b':
187-
event.preventDefault();
188-
toggleBold();
197+
event.preventDefault(); // Prevent default event (usually open bookmarks in browser)
198+
toggleBold(); // Call function to toggle bold
189199
break;
190200
case 'i':
191-
event.preventDefault();
192-
toggleItalics();
201+
event.preventDefault(); // Prevent default event (usually open browser settings)
202+
toggleItalics(); // Call function to toggle italics
193203
break;
194204
case 's':
195-
event.preventDefault();
196-
toggleStrikethrough();
205+
event.preventDefault(); // Prevent default event (usually save the webpage)
206+
toggleStrikethrough(); // Call function to toggle strikethrough
197207
break;
198208
case 'e':
209+
event.preventDefault(); // Prevent default event
210+
toggleEmoji(); // Call function to toggle emoji
211+
break;
212+
case '=': // Handling Ctrl + '=' for increasing font size
199213
event.preventDefault();
200-
toggleEmoji();
214+
changeFontSize(2); // Increase font size
201215
break;
202-
case 'enter':
216+
case '-': // Handling Ctrl + '-' for decreasing font size
203217
event.preventDefault();
204-
toggleViewMode();
218+
changeFontSize(-2); // Decrease font size
205219
break;
206-
case 'l':
220+
case 'enter': // Ctrl+Enter for toggling view mode
207221
event.preventDefault();
208-
newLine();
209-
break;
210-
case '=': // Ctrl + '=' is the actual result when pressing Ctrl + '+'
211-
if (event.key === '=' || event.key === '+') {
212-
event.preventDefault();
213-
changeFontSize(2);
214-
}
222+
toggleViewMode();
215223
break;
216-
case '-':
224+
case 'l': // Ctrl+L for a new line (custom feature not typically found in editors)
217225
event.preventDefault();
218-
changeFontSize(-2);
226+
newLine();
219227
break;
220228
}
221-
} else if (!event.ctrlKey && !event.metaKey && !event.altKey) {
229+
} else {
230+
// Handling non-Ctrl shortcuts such as '[' or '(', for surrounding text or cursor with brackets or parentheses
222231
switch (event.key) {
223232
case '[':
224-
event.preventDefault();
225-
insertSquareBrackets();
233+
event.preventDefault(); // Prevent default event
234+
insertSquareBrackets(); // Call function to insert square brackets
226235
break;
227236
case '(':
228-
event.preventDefault();
229-
insertParentheses();
237+
event.preventDefault(); // Prevent default event
238+
insertParentheses(); // Call function to insert parentheses
230239
break;
231240
}
232241
}
233-
// Update preview and autosave after applying the formatting
242+
// Update preview and autosave after applying shortcut actions
234243
updatePreview();
235244
autosave();
236-
});
237-
238-
window.addEventListener('keydown', function(event) {
245+
// Handling of quick word count and reading time display with Ctrl+Shift+C
239246
if (event.ctrlKey && event.shiftKey && event.code === 'KeyC') {
240247
showWordCountAndReadingTime();
241-
event.preventDefault(); // Prevents any default action associated with the Control+Shift+C shortcut
248+
event.preventDefault(); // To prevent default action of Ctrl+Shift+C if any
242249
}
243250
});

0 commit comments

Comments
 (0)