diff --git a/index.html b/index.html index 65ea3a8..e885727 100644 --- a/index.html +++ b/index.html @@ -69,6 +69,7 @@ const downloadLink = document.querySelector('a'); const progressBar = document.querySelector('progress'); const fileElems = document.querySelectorAll('input[type=file]'); + function concatTypedArrays(a, b) { const c = new (a.constructor)(a.length + b.length); c.set(a, 0); @@ -76,6 +77,20 @@ return c; } + // https://stackoverflow.com/a/68703218/6917520 + + function prefix(words) { + // check border cases size 1 array and empty first word) + if (!words[0] || words.length == 1) return words[0] || ""; + let i = 0; + // while all words have the same character at position i, increment i + while(words[0][i] && words.every(w => w[i] === words[0][i])) + i++; + + // prefix is the substring from the beginning to the last successfully checked i + return words[0].substr(0, i); + } + const textEncoder = new TextEncoder(); function generateIntArray(num) { return Uint8Array.of((num >>> 24) & 0xFF, (num >>> 16) & 0xFF, (num >>> 8) & 0xFF, num & 0xFF); @@ -99,11 +114,12 @@ fileElems.forEach(elem => elem.disabled = true); if (fileElem.files.length == 1) { const zipFile = fileElem.files[0]; - var reader = new FileReader(); + const reader = new FileReader(); reader.onload = function(e) { const zip = new JSZip(); zip.loadAsync(e.target.result).then(function(zip) { progressBar.max = Object.keys(zip.files).length; + const stripFolder = prefix(Object.keys(zip.files)); let i = 0; for (let fileName in zip.files) { if (fileName.endsWith('/')) { @@ -114,7 +130,7 @@ continue; } zip.files[fileName].async('uint8array').then(function(data) { - processFile(fileName, data); + processFile(stripFolder.length == 0 ? fileName : fileName.slice(fileName.indexOf(stripFolder) + stripFolder.length), data); progressBar.value = i++; if (i == progressBar.max) { wrapItUp(fileElem); @@ -126,11 +142,13 @@ reader.readAsArrayBuffer(zipFile); } else if (fileElem.files.length > 1) { progressBar.max = fileElem.files.length; + const stripFolder = prefix(Object.values(fileElem.files).map(file => file.webkitRelativePath)); let i = 0; for (let file of fileElem.files) { - var reader = new FileReader(); + const fileName = file.webkitRelativePath; + const reader = new FileReader(); reader.onload = function(e) { - processFile(file.webkitRelativePath.slice(file.webkitRelativePath.indexOf('/') + 1), new Uint8Array(e.target.result)); + processFile(stripFolder.length == 0 ? fileName : fileName.slice(fileName.indexOf(stripFolder) + stripFolder.length), new Uint8Array(e.target.result)); progressBar.value = i++; if (i == progressBar.max) { wrapItUp(fileElem);