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
|
L = l => { //l = line
const
type = l[0] === '-' ? 'ul' : 'ol',
level = l.split(' ')[0].length - (type === 'ul' ? 0 : 1),
content = l.substring(level + 1).trim()
return {
type,
level,
content
};
};
function getList(lines) {
let res = [],
tabOlOrUl = [],
currentLevel,
precedentLevel,
currentOlorUl;
addOlorUl(res, lines[0]);
currentOlorUl = tabOlOrUl[0] = res[0];
for (let i = 1, l = lines.length; i < l; i++) {
currentLevel = lines[i].level;
precedentLevel = lines[i - 1].level;
if (currentLevel === precedentLevel) { // si true on ajoute un li au parent courant
currentOlorUl = tabOlOrUl[currentLevel - 1];
currentOlorUl.children.push({
type: "li",
content: lines[i].content,
children: []
});
} else if (currentLevel > precedentLevel) { // si true on ajoute un ol/ul à l'enfant du parent courant
currentOlorUl = tabOlOrUl[precedentLevel - 1].children;
addOlorUl(currentOlorUl, lines[i]);
tabOlOrUl.push(currentOlorUl[currentOlorUl.length - 1]);
} else { // sinon on remonte au ol/ul correspondant au currentLevel...
currentOlorUl = tabOlOrUl[currentLevel - 1];
currentOlorUl.children.push({
type: "li",
content: lines[i].content,
children: []
});
}
}
return res;
}
function addOlorUl(parent, elem) { // Ajoute un ol ou un ul...
parent.push({
type: elem.type,
level: elem.level,
children: [{
type: "li",
content: elem.content,
children: []
}]
});
}
let lines = [
'1- 1',
'-- 1.1',
'--- 1.1.1',
'- 2'
].map(l => L(l));
console.log(lines);
console.log(getList(lines));
lines = [
'1- 1',
'-- 1.1',
'--- 1.1.1',
'--- 1.1.2',
'--- 1.1.3',
'- 2',
'- 3'
].map(l => L(l));
console.log(lines);
console.log(getList(lines)); |
Partager