let area = document.querySelector('#area-main'); const treeWidth = 2; const treeHeight = 120; const magConst = 150; const itemWidth = 120; const itemHeight = 90; 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 || {}; var fullStyle = ""; Object.keys(styleAttribs).forEach(function (attrib) { fullStyle += `${attrib}: ${styleAttribs[attrib]};` }); directAttribs.style = fullStyle; Object.keys(directAttribs).forEach(function (attrib) { elem.setAttribute(attrib, directAttribs[attrib]); }); elem.textContent = content; area.appendChild(elem); return elem; } function genEntry(posEntry, area, fetchData) { var data = fetchData[posEntry.id] || {}; var x = posEntry.x * magConst; var y = posEntry.y * treeHeight; 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) { genElement('path', area, '', { 'direct': { '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', 'width': '100' } }); let text = [ `${posEntry.name}`, `${posEntry.y} proj. deep`, `${(posEntry.date) ? (new Date(posEntry.date.$date) + '').split('GMT')[0] : 'Date not available'}`, `${posEntry.user}` ]; for (let i in text) { genElement('text', a, text[i], { 'direct': { 'x': '75', '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} */ } async function genTree(id) { let params = new URLSearchParams(window.location.search); let treeId = params.get("id").replace(/[^0-9]/g, ''); if (id) treeId = id; let fetchData = await fetch(`https://scratch.mit.edu/projects/${treeId}/remixtree/bare`) .then(x => x.json()); let keys = Object.keys(fetchData); keys.forEach(id => { if (id == fetchData.root_id || id == 'root_id') return; let allChild = keys.map(x => fetchData[x].children).flat(); if (allChild.indexOf(id) == -1) { fetchData[fetchData.root_id].children.push(id); } }); let pos = await main(fetchData); pos.forEach(function (posEntry) { genEntry(posEntry, area, fetchData); }) return pos; }