'use strict'; /* global document XMLHttpRequest */ function nodeScriptReplace(node) { if ( node.tagName === 'SCRIPT' ) { node.parentNode.replaceChild( nodeScriptClone(node) , node ); } else if(node.children) { for ( const child of node.children ) { nodeScriptReplace( child ); } } return node; } function nodeScriptClone(node){ const script = document.createElement("script"); script.text = node.innerHTML; [ ...node.attributes].forEach( attr => { script.setAttribute( attr.name, attr.value ); }); return script; } document.addEventListener('DOMContentLoaded', () => { const httpRequest = new XMLHttpRequest(); httpRequest.onreadystatechange = () => { if (httpRequest.readyState === 4 && httpRequest.status === 200) { const response = httpRequest.responseText; const data = JSON.parse(response); document.getElementById('tree').appendChild(addDirectory(data)); Array.from(document.getElementsByTagName('a')).forEach(a => { a.onclick = function (e) { e.preventDefault(); e.stopPropagation(); const setMd = new XMLHttpRequest(); setMd.onreadystatechange = () => { if (setMd.readyState === 4 && setMd.status === 200) { document.getElementById('md').innerHTML = setMd.responseText; nodeScriptReplace(document.getElementById('md')); } }; setMd.open('GET', a.href); setMd.send(); }; }); Array.from(document.getElementsByClassName('directory')).forEach(dir => { dir.querySelectorAll('ul').forEach(ul => { ul.style.display = 'none'; }); dir.onclick = e => { e.stopPropagation(); dir.querySelectorAll('ul').forEach(ul => { ul.style.display = ul.style.display === 'none' ? 'block' : 'none'; }); }; }); } }; httpRequest.open('GET', '/data'); httpRequest.send(); }); function addDirectory(data) { const ul = document.createElement('ul'); data.children.forEach(item => { const li = document.createElement('li'); const text = document.createTextNode(item.name); if (item.type === 'file') { const a = document.createElement('a'); a.appendChild(text); a.href = item.path; li.appendChild(a); li.classList.add('file'); } else { li.appendChild(text); li.tabIndex = 0; li.appendChild(addDirectory(item)); li.classList.add('directory'); } ul.appendChild(li); }); return ul; }