From 1906946a493c4343384edf2e74a73b693770f0b5 Mon Sep 17 00:00:00 2001 From: Zuxxied Date: Fri, 18 Oct 2024 23:27:11 -0400 Subject: [PATCH] lazy loading and other optimizations --- js/tree.js | 83 +++++++++++++++++++++++++++++------------------------- 1 file changed, 44 insertions(+), 39 deletions(-) diff --git a/js/tree.js b/js/tree.js index 2a052cc..09a68bb 100644 --- a/js/tree.js +++ b/js/tree.js @@ -6,8 +6,17 @@ const magConst = 150; const itemWidth = 120; const itemHeight = 90; +let cache = ''; + +function escapeHtml(unsafe) { + return (unsafe + '') + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); +} function genElement(type, area, content, attribs) { - var elem = document.createElementNS("http://www.w3.org/2000/svg",type); var directAttribs = attribs.direct || {}; var styleAttribs = attribs.style || {}; @@ -20,13 +29,15 @@ function genElement(type, area, content, attribs) { directAttribs.style = fullStyle; + var elem = ''; + Object.keys(directAttribs).forEach(function (attrib) { - elem.setAttribute(attrib, directAttribs[attrib]); + elem += `${escapeHtml(attrib)}="${escapeHtml(directAttribs[attrib])}" `; }); - elem.textContent = content; + elem = `<${type} ${elem}>${content}` - area.appendChild(elem); + cache += elem; return elem; } @@ -37,13 +48,18 @@ function genEntry(posEntry, area, fetchData) { var x = posEntry.x * magConst; var y = posEntry.y * treeHeight; + var x2 = x * zoom + mpos[0]; + var y2 = y * zoom + mpos[1]; + + if (y2 < -250 || y2 > area2.clientHeight+ 250) return; + if (y > 0) { genElement('path', area, '', { 'direct': { 'class': 'line', 'd': `M ${x + (itemWidth / 2)} ${y - treeHeight + itemHeight / 2} v ${itemHeight} z` } - }); + }); } if (posEntry.offbranch >= 0) { @@ -52,24 +68,21 @@ function genEntry(posEntry, area, fetchData) { 'class': 'line', 'd': `M ${x + (itemWidth / 2)} ${y + itemHeight / 2} h ${magConst * (posEntry.offbranch)} z` } - }); + }); } let a = genElement('a', area, '', { 'direct': { 'href': `https://scratch.mit.edu/projects/${posEntry.id}`, 'class': `${posEntry.visible ? '' : 'red'}`, - }, - 'style': { - 'transform': `translate(${x}px, ${y}px)` } - }); + }); genElement('image', a, '', { 'direct': { 'href': `https://uploads.scratch.mit.edu/get_image/project/${posEntry.id}_1920x1080.png`, - 'x': '10', - 'y': '-15', + 'x': x - 10, + 'y': y - 15, 'width': '100' } }); @@ -85,25 +98,11 @@ function genEntry(posEntry, area, fetchData) { genElement('text', a, text[i], { 'direct': { - 'x': '75', - 'y': 75 + 8 * i + 'x': x + 75, + 'y': y + 75 + 8 * i } - }); + }); } - - - /* - {#if Math.abs((mpos[0] + elem.x * zoom) - width/2) < width/2 * 1.2 && Math.abs((mpos[1] + elem.y * zoom) - height/2) < height/2 * 1.2 } - - {:else} - - {/if} - {elem.name} - {elem.y / treeHeight} proj. deep - {(elem.date) ? (new Date(elem.date.$date) + '').split('GMT')[0] : 'Date not available'} - {elem.user} - - */ } @@ -118,22 +117,28 @@ async function genTree(id) { let keys = Object.keys(fetchData); - keys.forEach(id => { - if (id == fetchData.root_id || id == 'root_id') return; + let r = fetchData[fetchData.root_id]; - let allChild = keys.map(x => fetchData[x].children).flat(); + let i = 0; + for (let id of keys) { + if (id == fetchData.root_id || id == 'root_id') continue; - if (allChild.indexOf(id) == -1) { - fetchData[fetchData.root_id].children.push(id); + if (!fetchData[id].parent_id && keys.findIndex(x => fetchData[x].children && fetchData[x].children.indexOf(id) != -1) == -1) { + r.children.push(id); } - - }); + i++; + console.log(i) + }; let pos = await main(fetchData); - pos.forEach(function (posEntry) { - genEntry(posEntry, area, fetchData); - }) + setInterval(function () { + cache = ''; + for (let posEntry of pos) { + genEntry(posEntry, area, fetchData); + } + area.innerHTML = cache; + }, 1000) return pos; } \ No newline at end of file