Remove src/lib/tln.ts file
This commit is contained in:
@@ -1,99 +0,0 @@
|
|||||||
type EventEntry = { evt: string; hdlr: EventListenerOrEventListenerObject };
|
|
||||||
|
|
||||||
const eventMap = new WeakMap<HTMLTextAreaElement, EventEntry[]>();
|
|
||||||
|
|
||||||
const updateLineNumbers = (ta: HTMLTextAreaElement, wrapper: HTMLElement) => {
|
|
||||||
const lineCount = ta.value.split("\n").length;
|
|
||||||
const childCount = wrapper.children.length;
|
|
||||||
let difference = lineCount - childCount;
|
|
||||||
|
|
||||||
if (difference > 0) {
|
|
||||||
const fragment = document.createDocumentFragment();
|
|
||||||
while (difference > 0) {
|
|
||||||
const line = document.createElement("span");
|
|
||||||
line.className = "tln-line";
|
|
||||||
fragment.appendChild(line);
|
|
||||||
difference -= 1;
|
|
||||||
}
|
|
||||||
wrapper.appendChild(fragment);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (difference < 0) {
|
|
||||||
if (!wrapper.lastChild) break;
|
|
||||||
wrapper.removeChild(wrapper.lastChild);
|
|
||||||
difference += 1;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const appendLineNumbers = (ta: HTMLTextAreaElement) => {
|
|
||||||
if (!ta || ta.classList.contains("tln-active")) return;
|
|
||||||
const parent = ta.parentNode;
|
|
||||||
if (!parent) return;
|
|
||||||
|
|
||||||
ta.classList.add("tln-active");
|
|
||||||
|
|
||||||
const wrapper = document.createElement("div");
|
|
||||||
wrapper.className = "tln-wrapper";
|
|
||||||
parent.insertBefore(wrapper, ta);
|
|
||||||
updateLineNumbers(ta, wrapper);
|
|
||||||
|
|
||||||
const listeners: EventEntry[] = [];
|
|
||||||
eventMap.set(ta, listeners);
|
|
||||||
|
|
||||||
const changeEvents = ["propertychange", "input", "keydown", "keyup"];
|
|
||||||
const changeHandler = (event: Event) => {
|
|
||||||
const keyEvent = event as KeyboardEvent;
|
|
||||||
if (
|
|
||||||
(+ta.scrollLeft === 10 &&
|
|
||||||
(keyEvent.key === "ArrowLeft" || keyEvent.code === "ArrowLeft")) ||
|
|
||||||
keyEvent.key === "Home" ||
|
|
||||||
keyEvent.code === "Home" ||
|
|
||||||
keyEvent.key === "Enter" ||
|
|
||||||
keyEvent.code === "Enter" ||
|
|
||||||
keyEvent.code === "NumpadEnter"
|
|
||||||
) {
|
|
||||||
ta.scrollLeft = 0;
|
|
||||||
}
|
|
||||||
updateLineNumbers(ta, wrapper);
|
|
||||||
};
|
|
||||||
|
|
||||||
for (const evt of changeEvents) {
|
|
||||||
ta.addEventListener(evt, changeHandler);
|
|
||||||
listeners.push({ evt, hdlr: changeHandler });
|
|
||||||
}
|
|
||||||
|
|
||||||
const scrollEvents = ["change", "mousewheel", "scroll"];
|
|
||||||
const scrollHandler = () => {
|
|
||||||
wrapper.scrollTop = ta.scrollTop;
|
|
||||||
};
|
|
||||||
|
|
||||||
for (const evt of scrollEvents) {
|
|
||||||
ta.addEventListener(evt, scrollHandler);
|
|
||||||
listeners.push({ evt, hdlr: scrollHandler });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const refreshLineNumbers = (ta: HTMLTextAreaElement) => {
|
|
||||||
if (!ta || !ta.classList.contains("tln-active")) return;
|
|
||||||
const wrapper = ta.previousSibling;
|
|
||||||
if (!wrapper || !(wrapper as HTMLElement).classList?.contains("tln-wrapper")) return;
|
|
||||||
updateLineNumbers(ta, wrapper as HTMLElement);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const removeLineNumbers = (ta: HTMLTextAreaElement) => {
|
|
||||||
if (!ta || !ta.classList.contains("tln-active")) return;
|
|
||||||
ta.classList.remove("tln-active");
|
|
||||||
|
|
||||||
const wrapper = ta.previousSibling;
|
|
||||||
if (wrapper && (wrapper as HTMLElement).classList?.contains("tln-wrapper")) {
|
|
||||||
(wrapper as HTMLElement).remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
const listeners = eventMap.get(ta);
|
|
||||||
if (listeners) {
|
|
||||||
for (const { evt, hdlr } of listeners) {
|
|
||||||
ta.removeEventListener(evt, hdlr);
|
|
||||||
}
|
|
||||||
eventMap.delete(ta);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Reference in New Issue
Block a user