// 원본 「블럭 파일로 저장하기」(mnuBlockSaveToFile)·「블럭 파일에서 붙여넣기」(mnuLoadFromFile) — 복사·잘라낸 행 묶음을 // 파일(.estblock.json)로 내려받고, 파일을 읽어 복사판에 올린 뒤 현재 화면에 붙여넣는다(같은 종류 자료만). const EstBlockFile = (() => { const KIND = "est-web-block-1"; function save() { const { table, rows } = EstActions.clip(); if (!rows.length) throw Error("먼저 행을 복사하거나 잘라내세요."); EstApp.download( `${EstApp.state.project.name || "블럭"}.${table}.estblock.json`, JSON.stringify({ kind: KIND, table, rows }, null, 1), ); } function parse(text) { const data = JSON.parse(text); if (data?.kind !== KIND || !Array.isArray(data.rows) || !data.rows.length || !data.table) throw Error("블럭 파일이 아닙니다."); if (data.rows.some((r) => !r || typeof r !== "object" || Array.isArray(r))) throw Error("블럭 파일 행이 올바르지 않습니다."); return data; } function load(state) { const picker = document.createElement("input"); picker.type = "file"; picker.accept = ".json"; picker.addEventListener("change", async () => { try { const file = picker.files[0]; if (!file) return; const data = parse(await file.text()); if (data.table !== state.view) throw Error("블럭 파일과 같은 종류의 자료 화면에서 붙여넣으세요."); EstActions.setClip(data.table, data.rows); document.querySelector('[data-action="paste-row"]')?.click(); } catch (error) { state.notice = error.message; EstApp.render(); } }); picker.click(); } function handle(name, state) { if (name === "block-save-file") save(); else if (name === "block-load-file") load(state); else return false; return true; } return { parse, handle }; })();