|
1 | | -const PAR_NAME_DOC = 'd'; // Help file path |
| 1 | +let arcData = null; |
2 | 2 |
|
3 | | -const id_JSAppRun = 'appRun'; |
4 | | -const FILENAME_ZIP_ON_USER_INPUT = '!.zip'; |
5 | | - |
6 | | -function _T(id) { |
7 | | - return id; |
8 | | -} |
9 | | - |
10 | | -function appendField(target, id, defaultV = '', type = 'text') { |
11 | | - target.innerHTML += |
12 | | - `<div class="form-row"> |
13 | | - <label for="${id}">${_T(id)}</label> |
14 | | - <input type="${type}" id="${id}" value="${defaultV}" /> |
15 | | - </div>`; |
16 | | -} |
17 | | - |
18 | | -function formCorsHelpFilesUpload() |
19 | | -{ |
20 | | - const formO = document.getElementById('formIn'); |
21 | | - const fieldHvData = 'data.zip'; |
22 | | - const fieldHelpLang = 'Help-(language).zip'; |
23 | | - //const fieldHelpBase = 'Help-.zip'; |
24 | | - const typeFile = 'file'; |
25 | | - |
26 | | - appendField(formO, fieldHvData, '', typeFile); |
27 | | - appendField(formO, fieldHelpLang, '', typeFile); |
28 | | - //appendField(formO, fieldHelpBase, '', typeFile); |
29 | | - |
30 | | - const formM = document.getElementById('form'); |
31 | | - formM.addEventListener("submit", function(e) { |
32 | | - e.preventDefault(); |
33 | | - |
34 | | - const hvData = document.getElementById(fieldHvData); |
35 | | - const helpLang = document.getElementById(fieldHelpLang); |
36 | | - |
37 | | - if (!hvData?.files?.length || !helpLang?.files?.length) |
38 | | - return; |
39 | | - |
40 | | - const fileHvData = hvData.files[0]; |
41 | | - const fileHelpLang = helpLang.files[0]; |
42 | | - |
43 | | - // var fileHelpBase = document.getElementById(fieldHelpBase); |
44 | | - |
45 | | - // if (fileHelpBase?.files?.length) |
46 | | - // fileHelpBase = fileHelpBase[0]; |
47 | | - // else |
48 | | - // fileHelpBase = null; |
49 | | - |
50 | | - document.getElementById(id_JSAppRun)?.remove(); |
51 | | - st = _Storage.add(STO_HELP, FILENAME_ZIP_ON_USER_INPUT, fileHelpLang).then(obsah => { |
52 | | - main(fileHvData); |
53 | | - const url = new URL(window.location.href); |
54 | | - url.searchParams.set(PAR_NAME_DOC, FILENAME_ZIP_ON_USER_INPUT); |
55 | | - window.history.pushState({}, "", url); |
56 | | - }); |
57 | | - |
58 | | - }) |
59 | | -} |
60 | | - |
61 | | -const STO_DATA = 'STO_DATA'; |
62 | | -const STO_HELP = 'STO_HELP'; |
63 | | -const STOF_TEXT = 'text'; |
64 | | -const STOF_B64 = 'base64'; |
65 | | - |
66 | | -const DATA_FILE_PATH_BASE = 'hvdata/data'; |
67 | | - |
68 | | -const STORAGE_ENGINES = { |
69 | | - '.zip': async (path) => newStorageZip(path), |
70 | | - '/': async (path) => newStorageDir(path), |
71 | | -}; |
72 | | - |
73 | | -var _Storage = (() => { |
74 | | - var storagesC = new Map(); |
75 | | - |
76 | | - async function add(key, path, data = null) { |
77 | | - for (const keyC in STORAGE_ENGINES) { |
78 | | - if (path.endsWith(keyC)) { |
79 | | - const eng = await STORAGE_ENGINES[keyC](data || path); |
80 | | - storagesC.set(key, eng); |
81 | | - return true; |
82 | | - } |
83 | | - } |
84 | | - return null; |
85 | | - } |
86 | | - |
87 | | - async function search(key, filePath, format = STOF_TEXT) { |
88 | | - if (!storagesC.has(key)) |
89 | | - return null; |
90 | | - |
91 | | - return await storagesC.get(key).search(filePath, format); |
92 | | - } |
93 | | - |
94 | | - async function getSubdirs(key, parentPath) { |
95 | | - if (!storagesC.has(key)) |
96 | | - return []; |
97 | | - |
98 | | - return await storagesC.get(key).getSubdirs(parentPath); |
99 | | - } |
100 | | - |
101 | | - async function searchImage(key, filePath) { |
102 | | - if (!storagesC.has(key)) |
103 | | - return null; |
104 | | - |
105 | | - return await storagesC.get(key).searchImage(filePath); |
106 | | - } |
107 | | - |
108 | | - return { |
109 | | - add, |
110 | | - search, |
111 | | - getSubdirs, |
112 | | - searchImage |
113 | | - }; |
114 | | -})(); |
115 | | - |
116 | | -async function newStorageZip(path) { |
117 | | - var storageO = await init(path); |
118 | | - |
119 | | - async function init(path) { |
120 | | - return await ZIPHelpers.loadZipFromUrl(path); |
121 | | - } |
122 | | - |
123 | | - async function search(filePath, format = STOF_TEXT) { |
124 | | - return await ZIPHelpers.searchArchiveForFile(filePath, storageO, format); |
125 | | - } |
126 | | - |
127 | | - async function getSubdirs(parentPath) { |
128 | | - const subdirs = new Set(); |
129 | | - |
130 | | - storageO?.forEach((relativePath, file) => { |
131 | | - if (relativePath.startsWith(parentPath) && relativePath !== parentPath) |
132 | | - { |
133 | | - const subPath = relativePath.slice(parentPath.length); |
134 | | - const parts = subPath.split("/"); |
135 | | - |
136 | | - if (parts.length > 1) { |
137 | | - subdirs.add(parts[0]); |
138 | | - } else if (file.dir) { |
139 | | - subdirs.add(parts[0]); |
140 | | - } |
141 | | - } |
142 | | - }); |
143 | | - |
144 | | - return [...subdirs]; |
145 | | - } |
146 | | - |
147 | | - async function searchImage(filePath) { |
148 | | - const content = await search(filePath, STOF_B64); |
149 | | - if (!content) return null; |
150 | | - var mimeType = 'image/' + filePath.split('.').pop().toLowerCase(); |
151 | | - return `data:${mimeType};base64,${content}`; |
152 | | - } |
153 | | - |
154 | | - return { |
155 | | - search, |
156 | | - getSubdirs, |
157 | | - searchImage |
158 | | - }; |
159 | | -} |
160 | | - |
161 | | -async function newStorageDir(path) { |
162 | | - var storageO = await init(path); |
163 | | - |
164 | | - async function init(path) { |
165 | | - return path.replace(/\/$/, ''); |
166 | | - } |
167 | | - async function search(filePath, format = STOF_TEXT) { |
168 | | - var fpath = `${storageO}/${filePath}`; |
169 | | - const doubleSlash = '//'; |
170 | | - const doubleSlashIndexLast = fpath.lastIndexOf(doubleSlash); |
171 | | - const doubleSlashIndex = fpath.indexOf(doubleSlash); |
172 | | - |
173 | | - if (doubleSlashIndexLast != doubleSlashIndex && doubleSlashIndex >= 0 && doubleSlashIndexLast >= 0) { |
174 | | - var replacement = '/_base/'; |
175 | | - if (fpath.startsWith('http') || fpath.startsWith('ftp')) |
176 | | - replacement = '/'; |
177 | | - |
178 | | - fpath = fpath.slice(0, doubleSlashIndexLast) + replacement + fpath.slice(doubleSlashIndexLast + 2); |
179 | | - } |
180 | | - |
181 | | - const response = await fetchDataOrEmpty(fpath); |
182 | | - |
183 | | - switch (format) { |
184 | | - case STOF_B64: |
185 | | - const zip = new JSZip(); |
186 | | - const fname = "a.txt"; |
187 | | - zip.file(fname, response, { compression: "STORE" }); |
188 | | - const base64zip = await zip.generateAsync({ type: STOF_B64 }); |
189 | | - await zip.loadAsync(base64zip, { base64: true }); |
190 | | - const file = zip.file(fname); |
191 | | - const b64Data = await file.async(STOF_B64); |
192 | | - return b64Data; |
193 | | - case STOF_TEXT: |
194 | | - default: |
195 | | - return toText(response); |
196 | | - } |
197 | | - } |
198 | | - |
199 | | - function toText(ab) { |
200 | | - const decoder = new TextDecoder("utf-8"); |
201 | | - const text = decoder.decode(ab); |
202 | | - return text; |
203 | | - } |
204 | | - |
205 | | - async function getSubdirs(parentPath) { |
206 | | - const list = search(`${storageO}/${parentPath}/__dir.lst`, format = STOF_TEXT); |
207 | | - const text = toText(list); |
208 | | - text = text.trim().replace(/\r\n/g, "\n").split('\n'); |
209 | | - |
210 | | - const subdirs = new Set(); |
211 | | - text?.forEach((line, index) => { |
212 | | - subdirs.add(line); |
213 | | - }); |
214 | | - |
215 | | - return [...subdirs]; |
216 | | - } |
217 | | - |
218 | | - async function fetchDataOrEmpty(url) { |
219 | | - try { |
220 | | - const response = await fetchData(url); |
221 | | - return response; |
222 | | - } catch (error) { |
223 | | - return new ArrayBuffer(0); |
224 | | - } |
225 | | - } |
226 | | - |
227 | | - async function searchImage(filePath) { |
228 | | - const fpath = `${storageO}/${filePath}`; |
229 | | - const response = await fetchDataOrEmpty(fpath); |
230 | | - if (response.byteLength == 0) |
231 | | - return null; |
232 | | - return fpath; |
233 | | - } |
234 | | - |
235 | | - return { |
236 | | - search, |
237 | | - getSubdirs, |
238 | | - searchImage |
239 | | - }; |
240 | | -} |
241 | | - |
242 | | -async function main(baseDataStream = null) { |
243 | | - var st = null; |
244 | | - if (!baseDataStream) { |
245 | | - try { |
246 | | - st = await _Storage.add(STO_DATA, `${DATA_FILE_PATH_BASE}.zip`); |
247 | | - } catch (error) { |
248 | | - st = await _Storage.add(STO_DATA, `${DATA_FILE_PATH_BASE}/`); |
249 | | - } |
250 | | - } else { |
251 | | - st = await _Storage.add(STO_DATA, `${DATA_FILE_PATH_BASE}.zip`, baseDataStream); |
252 | | - } |
253 | | - const srcT = await _Storage.search(STO_DATA, 'appmainRun.js'); |
254 | | - appendJavaScript(id_JSAppRun, srcT, document.body); |
| 3 | +async function main() { |
| 4 | + arcData = await loadZipFromUrl('hvdata/data.zip'); |
| 5 | + const srcT = await searchArchiveForFile('appmainRun.js', arcData); |
| 6 | + appendJavaScript('appRun', srcT, document.body); |
255 | 7 | runApp(); |
256 | 8 | } |
257 | 9 |
|
258 | | -async function fetchData(url) { |
| 10 | +async function loadZipFromUrl(url) { |
259 | 11 | try { |
260 | 12 | const response = await fetch(url); |
261 | 13 | if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); |
262 | 14 | const arrayBuffer = await response.arrayBuffer(); |
263 | | - return arrayBuffer; |
| 15 | + |
| 16 | + const arch = await JSZip.loadAsync(arrayBuffer); |
| 17 | + return arch; |
264 | 18 | } catch (error) { |
265 | 19 | throw error; |
266 | 20 | } |
267 | 21 | } |
268 | 22 |
|
269 | | -const ZIPHelpers = (() => { |
270 | | - async function loadZipFromUrl(url) { |
271 | | - try { |
272 | | - var arrayBuffer = null; |
273 | | - if (typeof url === "string") { |
274 | | - arrayBuffer = await fetchData(url); |
275 | | - } else { |
276 | | - arrayBuffer = await url.arrayBuffer(); |
277 | | - } |
278 | | - const arch = await JSZip.loadAsync(arrayBuffer); |
279 | | - return arch; |
280 | | - } catch (error) { |
281 | | - throw error; |
282 | | - } |
283 | | - } |
284 | | - |
285 | | - async function searchArchiveForFile(fileName, arch, format = STOF_TEXT) { |
286 | | - try { |
287 | | - const fileContent = await arch.file(fileName)?.async(format); |
288 | | - return fileContent ?? ""; |
289 | | - } catch (error) { |
290 | | - return ""; |
291 | | - } |
| 23 | +async function searchArchiveForFile(fileName, arch) { |
| 24 | + try { |
| 25 | + const fileContent = await arch.file(fileName)?.async('text'); |
| 26 | + return fileContent ?? ""; |
| 27 | + } catch (error) { |
| 28 | + return ""; |
292 | 29 | } |
293 | | - |
294 | | - return { |
295 | | - loadZipFromUrl, |
296 | | - searchArchiveForFile |
297 | | - }; |
298 | | -})(); |
| 30 | +} |
299 | 31 |
|
300 | 32 | function appendCSS(id, content) { |
301 | 33 | //if (document.getElementById(id)) return; |
|
0 commit comments