From 6b9fef06847e55aee2f93ece513a0d62ee7e359c Mon Sep 17 00:00:00 2001 From: Joris Date: Mon, 3 Feb 2020 09:30:25 +0100 Subject: Add helper to create dom nodes --- main.ts | 87 ++++++++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 64 insertions(+), 23 deletions(-) (limited to 'main.ts') diff --git a/main.ts b/main.ts index c8cff19..6b64881 100644 --- a/main.ts +++ b/main.ts @@ -56,21 +56,21 @@ interface InputResult { node: HTMLInputElement } -function setInputs(xs: Array): Array { - const res: Array = [] +function setInputs(xs: InputEntry[]): InputResult[] { + const res: InputResult[] = [] xs.forEach(x => { const parsed = parseNumber(x.node.innerText) if (parsed !== undefined) { - const numberNode = parsedNumberNode(x.tag, parsed) + const numberElement = createNumberElement(x.tag, parsed) const parentNode = x.node.parentNode if (parentNode) { - parentNode.replaceChild(numberNode.all, x.node) + parentNode.replaceChild(numberElement.node, x.node) res.push({ number: parsed.number, - node: numberNode.number + node: numberElement.number }) } } @@ -79,21 +79,23 @@ function setInputs(xs: Array): Array { return res } -function parsedNumberNode(tag: string, parsedNumber: ParsedNumber) { - const node = document.createElement(tag) - - node.appendChild(document.createTextNode(parsedNumber.before)) - - const numberNode = document.createElement('input') - numberNode.className = 'g-Number' - numberNode.value = prettyPrintNumber(parsedNumber.number) - node.appendChild(numberNode) +interface NumberElement { + node: Element; + number: HTMLInputElement; +} - node.appendChild(document.createTextNode(parsedNumber.after)) +function createNumberElement(tag: string, parsedNumber: ParsedNumber): NumberElement { + const numberElement = h( + 'input', + { + 'class': 'g-Number', + 'value': prettyPrintNumber(parsedNumber.number) + } + ) as HTMLInputElement return { - all: node, - number: numberNode, + node: h(tag, {}, [parsedNumber.before, numberElement, parsedNumber.after]), + number: numberElement, } } @@ -104,7 +106,8 @@ interface ParsedNumber { } function parseNumber(str: string): ParsedNumber | undefined { - for (var start = 0; start < str.length; start++) { + let start; + for (start = 0; start < str.length; start++) { if (isDigit(str.charAt(start))) { break } @@ -115,8 +118,9 @@ function parseNumber(str: string): ParsedNumber | undefined { } // Integer part - var integerPart = ''; - for (var end = start; end < str.length; end++) { + let integerPart = ''; + let end = start; + for (; end < str.length; end++) { const c = str.charAt(end) if (!isDigit(c)) { @@ -132,7 +136,7 @@ function parseNumber(str: string): ParsedNumber | undefined { } // Decimal part - var decimalPart = ''; + let decimalPart = ''; for (; end < str.length; end++) { const c = str.charAt(end) @@ -155,8 +159,8 @@ function isDigit(c: string) { return c >= '0' && c <= '9' } -function nodeListToArray(nodeList: NodeListOf): Array { - const xs: Array = []; +function nodeListToArray(nodeList: NodeListOf): HTMLElement[] { + const xs: HTMLElement[] = []; nodeList.forEach(node => xs.push(node)) return xs } @@ -170,3 +174,40 @@ function prettyPrintNumber(n: number): string { return xs[0] } } + +/* Element creation helper */ + +type Attribute = string | boolean | ((e: Event) => void) + +type Child = Element | string + +function h(tag: string, attrs: {[key: string]: Attribute}, children: Array = []): Element { + let element = document.createElement(tag) + + for (let name in attrs) { + let value = attrs[name] + if (typeof value === 'boolean') { + if (value) { + element.setAttribute(name, name) + } + } else if (typeof value === 'function') { + (element as any)[name] = (e: Event) => { + if (e.target !== null) { + console.log((e.target as HTMLInputElement).value) + } + } + } else { + element.setAttribute(name, value) + } + } + + children.forEach(child => { + if (typeof child === 'string') { + element.appendChild(document.createTextNode(child)) + } else { + element.appendChild(child) + } + }) + + return element +} -- cgit v1.2.3