-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
120 lines (102 loc) · 4.75 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import init, { generate_struct_from_csv } from './pkg/rust_struct_creator_wasm.js';
window.addEventListener('DOMContentLoaded', async (event) => {
const fileInput = document.getElementById('file-input');
const output = document.getElementById('output');
const codeBlock = document.getElementById('code-block');
const downloadBtn = document.getElementById('download-btn');
const reOutputBtn = document.getElementById('re-output-btn');
let csvContentArray = []; // csvContentArrayを定義
// クエリパラメータからラジオボタンの状態を取得
const params = new URLSearchParams(window.location.search);
const implOption = params.get('impl-option') || 'include'; // デフォルトは 'include'
// ラジオボタンの選択状態をセット
document.querySelector(`input[name="impl-option"][value="${implOption}"]`).checked = true;
// ファイル選択時にCSVを読み込む
if (fileInput) {
fileInput.addEventListener('change', async function() {
const files = this.files;
for (const file of files) {
if (file.type === 'text/csv') {
const reader = new FileReader();
reader.onload = async (event) => {
csvContentArray.push(event.target.result); // 変換するCSVを配列に追加
await generateStruct(); // 呼び出しを正しいスコープ内で行う
};
reader.readAsText(file);
}
}
});
}
// ドロップゾーンの処理を追加
const dropZone = document.getElementById('drop-zone');
dropZone.addEventListener('drop', (e) => {
e.preventDefault();
const files = e.dataTransfer.files;
fileInput.files = files; // fileInputにファイルを設定
for (let i = 0; i < files.length; i++) {
const file = files[i];
if (file.type === 'text/csv') {
const reader = new FileReader();
reader.onload = async (event) => {
csvContentArray.push(event.target.result); // 変換するCSVを配列に追加
await generateStruct(); // 呼び出しを正しいスコープ内で行う
};
reader.readAsText(file);
}
}
});
// ラジオボタンの状態をクエリパラメータに保存
const saveRadioStateToURL = () => {
const selectedValue = document.querySelector('input[name="impl-option"]:checked').value;
const newParams = new URLSearchParams(window.location.search);
newParams.set('impl-option', selectedValue);
history.replaceState(null, '', `?${newParams.toString()}`); // URLを更新
};
// 構造体生成の処理
const generateStruct = async () => {
if (csvContentArray.length === 0) return;
await init();
const includeImpl = document.querySelector('input[name="impl-option"]:checked').value === 'include';
const zip = new JSZip();
for (let i = 0; i < csvContentArray.length; i++) {
let structCode;
try {
structCode = generate_struct_from_csv(csvContentArray[i], includeImpl);
} catch (error) {
console.error('Error generating struct:', error);
continue; // 次のCSVへ
}
const lines = csvContentArray[i].split('\n');
const structName = lines[0].split(',')[1].trim();
// ZIPファイルに構造体コードを追加
zip.file(`${structName}.rs`, structCode);
if (i==0){
output.textContent = structCode;
codeBlock.style.display = 'block';
Prism.highlightElement(output);
}
}
// ZIPファイルを生成
zip.generateAsync({ type: 'blob' })
.then((content) => {
const url = URL.createObjectURL(content);
downloadBtn.href = url;
downloadBtn.download = 'structs.zip'; // ZIPファイル名
downloadBtn.style.display = 'block';
})
.catch((error) => {
console.error('Error generating ZIP:', error);
});
};
// 再出力ボタンのクリックイベント
if (reOutputBtn) {
reOutputBtn.addEventListener('click', async () => {
saveRadioStateToURL(); // ラジオボタンの状態をURLに保存
await generateStruct(); // 再度生成
});
}
// ラジオボタンの変更時にもURLを更新
document.querySelectorAll('input[name="impl-option"]').forEach((radio) => {
radio.addEventListener('change', saveRadioStateToURL);
});
});