Skip to content

Commit dbad2ca

Browse files
Create multimodal.js
1 parent 192ec34 commit dbad2ca

File tree

1 file changed

+233
-0
lines changed

1 file changed

+233
-0
lines changed

.xlsl/multimodal.js

Lines changed: 233 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,233 @@
1+
import React, { useState } from 'react';
2+
import Papa from 'papaparse';
3+
4+
const COLORS = ['#fffa65', '#a0e7e5', '#ffd6a5', '#ffadad', '#caffbf'];
5+
6+
function AuraXlslCrossSheetManager() {
7+
const [xlslData, setXlslData] = useState({ files: {}, csvs: {} });
8+
const [selectedSheet, setSelectedSheet] = useState('');
9+
const [csvText, setCsvText] = useState('');
10+
const [mavenRegex, setMavenRegex] = useState('');
11+
const [replaceWith, setReplaceWith] = useState('');
12+
const [parsedCsv, setParsedCsv] = useState([]);
13+
const [highlightedCsv, setHighlightedCsv] = useState([]);
14+
15+
// Load XLSL
16+
const loadXlsl = (file) => {
17+
const reader = new FileReader();
18+
reader.onload = (e) => {
19+
try {
20+
const data = JSON.parse(e.target.result);
21+
setXlslData(data);
22+
const sheets = Object.keys(data.csvs);
23+
if (sheets.length > 0) {
24+
setSelectedSheet(sheets[0]);
25+
setCsvText(data.csvs[sheets[0]]);
26+
parseCsv(data.csvs[sheets[0]]);
27+
}
28+
} catch (err) {
29+
alert('Invalid .xlsl file');
30+
}
31+
};
32+
reader.readAsText(file);
33+
};
34+
35+
// Parse CSV
36+
const parseCsv = (text) => {
37+
const parsed = Papa.parse(text, { header: true }).data;
38+
setParsedCsv(parsed);
39+
setHighlightedCsv(parsed);
40+
};
41+
42+
// Convert Maven %regex[...] to JS regex
43+
const convertMavenRegex = (input) => {
44+
const lines = input.split('\n').filter(Boolean);
45+
return lines.map(line => {
46+
const match = line.match(/%regex\[(.*)\]/);
47+
if (match) return new RegExp(match[1].replace(/\$\{project\.build\.directory\}/g, 'target'), 'g');
48+
return null;
49+
}).filter(Boolean);
50+
};
51+
52+
// Highlight CSV matches (single sheet)
53+
const highlightCsvMatches = () => {
54+
const regexList = convertMavenRegex(mavenRegex);
55+
const highlighted = parsedCsv.map(row => {
56+
const newRow = {};
57+
Object.keys(row).forEach((col, idx) => {
58+
let cell = row[col];
59+
regexList.forEach((rx, i) => {
60+
cell = cell.replace(rx, match => `<span style="background:${COLORS[i % COLORS.length]}">${match}</span>`);
61+
});
62+
newRow[col] = cell;
63+
});
64+
return newRow;
65+
});
66+
setHighlightedCsv(highlighted);
67+
};
68+
69+
// Replace CSV matches (single sheet)
70+
const replaceCsvMatches = () => {
71+
const regexList = convertMavenRegex(mavenRegex);
72+
const replaced = parsedCsv.map(row => {
73+
const newRow = {};
74+
Object.keys(row).forEach(col => {
75+
let cell = row[col];
76+
regexList.forEach(rx => { cell = cell.replace(rx, replaceWith); });
77+
newRow[col] = cell;
78+
});
79+
return newRow;
80+
});
81+
setParsedCsv(replaced);
82+
setHighlightedCsv(replaced);
83+
setXlslData({
84+
...xlslData,
85+
csvs: { ...xlslData.csvs, [selectedSheet]: Papa.unparse(replaced) }
86+
});
87+
};
88+
89+
// Apply regex across all sheets
90+
const highlightAllSheets = () => {
91+
const regexList = convertMavenRegex(mavenRegex);
92+
const newCsvs = {};
93+
Object.keys(xlslData.csvs).forEach(sheet => {
94+
const parsed = Papa.parse(xlslData.csvs[sheet], { header: true }).data;
95+
const highlighted = parsed.map(row => {
96+
const newRow = {};
97+
Object.keys(row).forEach(col => {
98+
let cell = row[col];
99+
regexList.forEach((rx, i) => {
100+
cell = cell.replace(rx, match => `<span style="background:${COLORS[i % COLORS.length]}">${match}</span>`);
101+
});
102+
newRow[col] = cell;
103+
});
104+
return newRow;
105+
});
106+
newCsvs[sheet] = highlighted;
107+
});
108+
setHighlightedCsv(newCsvs[selectedSheet] || []);
109+
setXlslData({ ...xlslData, csvs: Object.fromEntries(Object.keys(newCsvs).map(k => [k, Papa.unparse(newCsvs[k])] )) });
110+
};
111+
112+
// Replace regex matches across all sheets
113+
const replaceAllSheets = () => {
114+
const regexList = convertMavenRegex(mavenRegex);
115+
const newCsvs = {};
116+
Object.keys(xlslData.csvs).forEach(sheet => {
117+
const parsed = Papa.parse(xlslData.csvs[sheet], { header: true }).data;
118+
const replaced = parsed.map(row => {
119+
const newRow = {};
120+
Object.keys(row).forEach(col => {
121+
let cell = row[col];
122+
regexList.forEach(rx => { cell = cell.replace(rx, replaceWith); });
123+
newRow[col] = cell;
124+
});
125+
return newRow;
126+
});
127+
newCsvs[sheet] = replaced;
128+
});
129+
setHighlightedCsv(newCsvs[selectedSheet] || []);
130+
setXlslData({ ...xlslData, csvs: Object.fromEntries(Object.keys(newCsvs).map(k => [k, Papa.unparse(newCsvs[k])] )) });
131+
};
132+
133+
// Aggregate all sheets into one master CSV
134+
const exportMasterCsv = () => {
135+
let masterData = [];
136+
Object.keys(xlslData.csvs).forEach(sheet => {
137+
const parsed = Papa.parse(xlslData.csvs[sheet], { header: true }).data;
138+
const parsedWithSheet = parsed.map(row => ({ sheet, ...row }));
139+
masterData = masterData.concat(parsedWithSheet);
140+
});
141+
const csvString = Papa.unparse(masterData);
142+
const blob = new Blob([csvString], { type: 'text/csv' });
143+
const link = document.createElement('a');
144+
link.href = URL.createObjectURL(blob);
145+
link.download = "master.csv";
146+
link.click();
147+
};
148+
149+
// Switch sheet
150+
const switchSheet = (sheet) => {
151+
setSelectedSheet(sheet);
152+
setCsvText(xlslData.csvs[sheet]);
153+
parseCsv(xlslData.csvs[sheet]);
154+
};
155+
156+
// Save XLSL
157+
const saveXlsl = () => {
158+
const blob = new Blob([JSON.stringify(xlslData, null, 2)], { type: 'application/json' });
159+
const link = document.createElement("a");
160+
link.href = URL.createObjectURL(blob);
161+
link.download = "multi-sheet-data.xlsl";
162+
link.click();
163+
};
164+
165+
return (
166+
<div style={{ fontFamily: 'monospace', padding: '20px' }}>
167+
<h2>Aura XLSL Multi-Sheet + Cross-Sheet Manager</h2>
168+
169+
<input type="file" accept=".xlsl" onChange={e => loadXlsl(e.target.files[0])} /><br /><br />
170+
171+
<div>
172+
<strong>Select Sheet:</strong>
173+
{Object.keys(xlslData.csvs).map(sheet => (
174+
<button key={sheet} onClick={() => switchSheet(sheet)} style={{ marginLeft: '5px' }}>
175+
{sheet}
176+
</button>
177+
))}
178+
</div><br />
179+
180+
<textarea
181+
rows={6}
182+
cols={80}
183+
value={csvText}
184+
onChange={e => { setCsvText(e.target.value); parseCsv(e.target.value); }}
185+
placeholder="CSV content..."
186+
/><br /><br />
187+
188+
<textarea
189+
rows={4}
190+
cols={80}
191+
value={mavenRegex}
192+
onChange={e => setMavenRegex(e.target.value)}
193+
placeholder="Paste Maven %regex[...] excludes..."
194+
/><br /><br />
195+
196+
<input
197+
type="text"
198+
value={replaceWith}
199+
onChange={e => setReplaceWith(e.target.value)}
200+
placeholder="Replacement text"
201+
/><br /><br />
202+
203+
<button onClick={highlightCsvMatches}>Highlight Sheet</button>
204+
<button onClick={replaceCsvMatches} style={{ marginLeft: '10px' }}>Replace Sheet</button>
205+
<button onClick={highlightAllSheets} style={{ marginLeft: '10px' }}>Highlight All Sheets</button>
206+
<button onClick={replaceAllSheets} style={{ marginLeft: '10px' }}>Replace All Sheets</button>
207+
<button onClick={exportMasterCsv} style={{ marginLeft: '10px' }}>Export Master CSV</button>
208+
<button onClick={saveXlsl} style={{ marginLeft: '10px' }}>Save XLSL</button>
209+
210+
<h3>Highlighted CSV (Sheet: {selectedSheet})</h3>
211+
<div style={{ overflowX: 'auto' }}>
212+
<table border="1" cellPadding="4" style={{ borderCollapse: 'collapse' }}>
213+
<thead>
214+
<tr>
215+
{parsedCsv[0] && Object.keys(parsedCsv[0]).map((col, i) => <th key={i}>{col}</th>)}
216+
</tr>
217+
</thead>
218+
<tbody>
219+
{highlightedCsv.map((row, rIdx) => (
220+
<tr key={rIdx}>
221+
{Object.keys(row).map((col, cIdx) => (
222+
<td key={cIdx} dangerouslySetInnerHTML={{ __html: row[col] }} />
223+
))}
224+
</tr>
225+
))}
226+
</tbody>
227+
</table>
228+
</div>
229+
</div>
230+
);
231+
}
232+
233+
export default AuraXlslCrossSheetManager;

0 commit comments

Comments
 (0)