@jackens/md2json
Version:
Markdown to JSON
73 lines (68 loc) • 2.33 kB
JavaScript
/* ISC (c) 2018+ Jackens * https://github.com/jackens/md2json */
(function (E, W) {
var PATTERN = /(?:```(\w+)(.+?)```)|(?:`(.*?)`)|(?:\*\*(.*?)\*\*)|(?:\*(.*?)\*)|(?:__(.*?)__)|(?:_(.*?)_)|(?:~~(.*?)~~)|(?:<(.*?)>)/
var KEYS = ['info', 'lang', 'src', 'code', 'a2', 'a1', 'u2', 'u1', 'del', 'url', 'items']
function getNewItem () {
var result = { heading: null }
KEYS.map(function (key) {
result[key] = []
})
return result
}
function $ (md) {
var result = getNewItem()
var heading = 0
var current = result
var parents = [result]
var newItem
md.replace(/\r/g, '').replace(/\t/g, ' ').replace(/```(\w+)\n((.|\n)+?)```/g, function (_, lang, code) {
return '```' + lang + '\t' + code.replace(/\n/g, '\t') + '```'
}).split('\n').map(function (line) {
if (!line) {
return
}
var matchH = line.match(/^(#+)\s*(.*)$/)
if (matchH) {
heading = matchH[1].length
line = matchH[2]
}
var matchLi = line.match(/^(\s*)(?:(\*|-|\d+\.)\s+)?(.*)$/)
var level = heading + (matchLi[1].length >> 2) + +!!matchLi[2]
while (parents.length < level - 1) {
newItem = getNewItem()
parents[parents.length - 1].items.push(newItem)
parents.push(newItem)
}
if (parents.length > level) {
parents.length = level
}
if ((matchH || matchLi[2]) && level > 1) {
newItem = getNewItem()
parents[level - 2].items.push(newItem)
parents[level - 1] = newItem
}
current = parents[level - 1]
if (matchH) {
current.heading = heading
}
matchLi[3].split(PATTERN).forEach(function (_, chunkIndex, chunks) {
if (chunkIndex % 10) {
return
}
KEYS.forEach(function (key, keyIndex) {
var value = (chunks[chunkIndex + keyIndex] || '').replace(/^\s+|\s+$/g, '')
if (value) {
current[key].push(keyIndex === 2 ? value.replace(/\t/g, '\n').replace(new RegExp('\n {' + 4 * (level - heading) + '}', 'g'), '\n') : value)
}
})
})
})
return result
}
try {
(W = window).require = function (I) { return W[E][I] };
(W[E] = W[E] || {})['@jackens/md2json'] = $
} catch (_) {
module.exports = $
}
})('module.exports')