Skip to content

Instantly share code, notes, and snippets.

@arfeo
Created March 21, 2018 09:12
Show Gist options
  • Save arfeo/10b49aa472a04342a3223de747631e4f to your computer and use it in GitHub Desktop.
Save arfeo/10b49aa472a04342a3223de747631e4f to your computer and use it in GitHub Desktop.
[ES6] Text editor w/ text coloring
const codeEditor = document.getElementById('codeEditor');
/**
* Insert html at the caret position
*/
const insertHTML = html => {
const sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
const el = document.createElement("div");
const fragment = document.createDocumentFragment();
let node;
let lastNode;
let range = sel.getRangeAt(0);
range.deleteContents();
el.innerHTML = html;
while (node = el.firstChild) {
lastNode = fragment.appendChild(node);
}
range.insertNode(fragment);
if (lastNode) {
range = range.cloneRange();
range.setStartAfter(lastNode);
range.collapse(true);
sel.removeAllRanges();
sel.addRange(range);
}
}
}
/**
* Keydown event handler
*/
codeEditor.addEventListener('keydown', e => {
let color = '';
switch(e.keyCode) {
case 91: // meta (left)
case 93: // meta (right)
case 16: // shift
case 18: // alt
case 17: // control
case 27: // esc
case 37: // arrow left
case 38: // arrow up
case 39: // arrow right
case 40: // arrow down
case 13: // enter
case 9: // tab
case 8: // backspace
{
// default action
return;
}
case 81: //q
{
color = 'red';
break;
}
case 65: // a
{
color = 'green';
break;
}
case 90: // z
{
color = 'blue';
break;
}
default:
{
color = 'black';
break;
}
}
e.preventDefault();
insertHTML(`<span style="color:${color}">${e.key}</span>`);
});
codeEditor.focus();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment