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
|
const
createUOL = ({type = 'ul', lis = []} = {}) => ({type, lis}),
createLI = ({name = ''} = {}) => ({name}), //+ uol (0,1)
L = l => { //l = line
const
type = l[0] === '-' ? 'ul' : 'ol',
level = l.split(' ')[0].length - (type === 'ul' ? 0 : 1),
name = htmlize(l.substring(level + 1).trim())
return {type, level, name}
},
getUOL = lines => {
const lis = getLIs(lines)
return [
createUOL({type: lines[0].type, lis: lis[0]}),
lis[1]
]
},
getLIs = lines => {
let lis = [], li, i = 0, l1 = lines[0]
while (i < lines.length) {
let l = lines[i]
const li = createLI({name: l.name})
if (l.level > l1.level) {
let uol = getUOL(lines.slice(i))
let myLi = lis.pop()
myLi.uol = uol[0]
lis.push(myLi)
i += uol[1]
} else if (l.level === l1.level) {
lis.push(li)
i ++
} else break
}
return [lis, i]
}
let lines = [
'1- elt1',
'-- EL1',
'-- EL2',
'1--- ele1',
'--- ele2',
'- elt2',
'- elt3',
'-- EL1',
'-- EL2',
'1--- ele1',
'--- ele2',
'- elt4',
].map(l => L(l))
const res = getUOL(lines)[0] //Objet qui contient le résultat, non formaté en HTML
console.log(JSON.stringify(res))
// Le code suivant convertit l'objet "res" en HTML
const
getHTML = uol => {
const uol1 = document.createElement(uol.type)
for (let li of uol.lis) {
const
li1 = document.createElement('li'),
name = document.createTextNode(li.name)
li1.appendChild(name)
if (li.uol) li1.appendChild(getHTML(li.uol))
uol1.appendChild(li1)
}
return uol1
},
html = getHTML(res).outerHTML
document.body.innerHTML = html |
Partager