I need a javascript function that can be use to divide(with the specified defined number ) an array inside textarea after click button
<textarea id="source>
const uint8_t ArrayName [] PROGMEM = { // 10 lines
0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x01, 0x01, 0x01, 0x01,
0x22, 0x22, 0x22, 0x22, 0x22,
0x33, 0x33, 0x33, 0x33, 0x33,
};
</textarea>
into this on the result textarea (this sample divide by 3)
<textarea id="result>
const uint8_t ArrayName_0 [] PROGMEM = {
0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC
};
const uint8_t ArrayName_1 [] PROGMEM = {
0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
const uint8_t ArrayName_2 [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x01, 0x01, 0x01, 0x01,
0x22, 0x22, 0x22, 0x22, 0x22
};
const uint8_t ArrayName_3 [] PROGMEM = { // rest of line
0x33, 0x33, 0x33, 0x33, 0x33
};
</textarea>
I use this function that get from here to, but the result is wrong I'm confused about adding a copy of the first line, to the beginning of each resulting array
function divide() {
var lines = $('#source').val().split(/\n/);
var texts = []
for (var i = 0; i < lines.length; i ) {
if (/\S/.test(lines[i])) {
texts.push($.trim(lines[i]));
}
}
var list = texts;
var li = "";
for (var e = 0; e < list.length; e ) {
if (e % 3)
{
var lit = li list[e] ;
li = lit.substring(0,lit.length-1);
li = li '\n}\n';
} else
{
li = li list[e] '\n';
}
}
li = lit.substring(0,lit.length-1);
li = li '\n}';
document.getElementById("result").value = li;
}
Thanks for anybody help in this source.
CodePudding user response:
Using reduce, you can group the lines into sets of n
and then use a little string manipulation and array editing to reassemble into the format you specified
function divide(n) {
var lines = $('#source').val().trim().split(/\n/).slice(0, -1);
let ii = 0, prefix = lines.splice(0, 1)[0], result = [];
let groups = lines.reduce((b, a, i) => {
if (i % n === 0) {
b.push([a]);
ii
} else b[ii].push(a);
return b;
}, [[]]).filter(a => a.length > 0);
groups.forEach((g,i) => {
g.unshift(prefix.replace('ArrayName', `ArrayName_${i}`))
g[g.length-1] = g[g.length-1].slice(0,-1)
g.push("}");
result.push(g.join("\n"));
})
document.getElementById("result").value = result.join("\n\n");
}
divide(3)
textarea {
height: 300px;
width: 400px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea id="source">
const uint8_t ArrayName [] PROGMEM = {
0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
0xBB, 0xBB, 0xBB, 0xBB, 0xBB,
0xCC, 0xCC, 0xCC, 0xCC, 0xCC,
0xDD, 0xDD, 0xDD, 0xDD, 0xDD,
0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x01, 0x01, 0x01, 0x01,
0x22, 0x22, 0x22, 0x22, 0x22,
0x33, 0x33, 0x33, 0x33, 0x33,
};
</textarea>
<textarea id="result"> </textarea>