function kokiInit(jsonString, container, kokiTitle = 'koki', openDetails = true) {
parsedData = JSON.parse(jsonString)
jsonString = JSON.stringify(parsedData, null, 2)
container.classList.add('arbol-root')
container.innerHTML = ''
const details = document.createElement('details')
details.open = true
const summary = document.createElement('summary')
summary.innerHTML = ``
const dataElem = document.createElement('data')
dataElem.value = jsonString
const ul = document.createElement('ul')
const code = document.createElement('code')
code.innerHTML = jsonString
const pre = document.createElement('pre')
pre.appendChild(code)
const fragment = kokiArbol(parsedData, '', false, openDetails)
ul.appendChild(fragment)
details.innerHTML = ``
details.append(summary, pre, dataElem)
dataElem.appendChild(ul)
container.append(details)
}
function kokiArbol(data, keyName = null, parentArr = false, openDetails = true, level = 0) {
const fragment = document.createDocumentFragment()
const li = document.createElement('li')
fragment.appendChild(li)
if (typeof data === 'object' && data !== null) {
const isArray = Array.isArray(data)
const type = isArray ? 'array' : 'object'
const length = isArray ? data.length : Object.keys(data).length
const entries = isArray ? data.entries() : Object.entries(data)
openDetails = (level === 0 && openDetails) || (openDetails && level < 2 && length < 17) ? true : false
li.className = `arbol-type-${type}`
const arrObjSize = length === 0 ? 'empty' : `${length} ${isArray ? 'items' : 'keys'}`
const arrObjInnerHtml = `${(level === 0 || parentArr) ? '' : '' + keyName + ' '}(${type}) ${arrObjSize}`
if (length >= 1) {
const details = document.createElement('details')
details.className = 'arrobj'
details.open = openDetails
const summary = document.createElement('summary')
summary.innerHTML = arrObjInnerHtml
details.appendChild(summary)
li.appendChild(details)
const ul = document.createElement('ul')
for (const [key, value] of entries) {
if (typeof value === 'object' && value !== null) {
const fragment = kokiArbol(value, key, isArray, openDetails, level + 1)
ul.appendChild(fragment)
} else {
const liEntry = document.createElement('li')
const format = kokiGetType(value)
liEntry.className = `arbol-type-${format}`
liEntry.innerHTML = `${isArray ? '' : '' + key + ' '}${value} (${format})`
ul.appendChild(liEntry)
}
}
details.appendChild(ul)
} else {
li.innerHTML = arrObjInnerHtml
}
}
return fragment
}
function kokiGetType(value) {
if (value === null) return 'null'
if (value === undefined) return 'undefined'
return typeof value
}