UNPKG

mdo

Version:

Markdown Object Parser

116 lines (108 loc) 3.14 kB
var M = module.exports = {} M.parseJson = function (json) { // Simplified JSON json = json.replace(/(\W)(\w+):/gm, '$1"$2":') // id: => "id": return JSON.parse(json) } M.parseValue = function (value) { var json try { if (value.match(/.*\|.*\n\|?-+\|[|-]+\n/)) { json = M.parseTable(value) } else { json = M.parseJson(value) } } catch (e) { json = value } return json } M.parseTable = function (table, skipFields) { skipFields = skipFields || [] // console.log('table.length=', table.length, 'typeof table=', typeof table) var lines = table.split(/\r?\n/) var len = lines.length var jsonTable = [] var types = [] var fields = lines[0].split(/\s*\|\s*/) for (var i = 0; i < fields.length; i++) { var tokens = fields[i].split(':') fields[i] = tokens[0].trim() types[i] = (tokens.length >= 2) ? tokens[1].trim() : 'string' } for (i = 2; i < len; i++) { var line = lines[i].split('//')[0] if (line.length === 0) continue var values = line.split('|') var vlen = values.length var json = {} for (var vi = 0; vi < vlen; vi++) { var value = values[vi].trim() switch (types[vi]) { case 'json' : value = M.parseJson(value); break case 'number': value = parseFloat(value); break case 'boolean': value = JSON.parse(value); break case 'date' : value = (new Date(value)).toJSON(); break } if (skipFields.indexOf(fields[vi]) < 0 && value.length > 0 && fields[vi].length > 0) { json[fields[vi]] = value } } jsonTable.push(json) } return jsonTable } M.list2str = function (objs, fields) { var lines = [] var head = fields.join('|') lines.push(head) lines.push(head.replace(/[^|]/g, '-')) for (var i in objs) { var obj = objs[i] var line = '' for (var fi in fields) { var value = obj[fields[fi]] || '' line += '|' + value } lines.push(line.substring(1)) } return lines.join('\n') } M.tableReorder = function(table, fields) { var objs = M.parseTable(table) return M.list2str(objs, fields) } M.parseMdo = function (mdo) { var obj = {} var field var valueLines = [] var lines = mdo.split(/\r?\n/) for (var i = 0, len = lines.length; i < len; i++) { var line = lines[i] var m = line.match(/^([^\s\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./<=>?@[\]^`{|}~]+)\s*:\s*(.*)$/) if (m) { if (typeof field !== 'undefined') { obj[field] = M.parseValue(valueLines.join('\n').trim()) } field = m[1] valueLines = [ m[2] ] } else { valueLines.push(line) } } if (valueLines.length > 0 && typeof field !== 'undefined') { obj[field] = M.parseValue(valueLines.join('\n').trim()) } return obj } M.index = function (jsons, field, append) { append = append || false var map = {} for (var i in jsons) { var json = jsons[i] var key = json[field] if (append || typeof map[key] === 'undefined') { map[key] = json } } return map }