let level = 1;
export function jsonToHTML(json, maxExpandLevel) {
level = 1;
let output = '';
output += '
';
output += '';
output += valueToHTML(json, maxExpandLevel);
output += '
';
output += '
';
return output;
}
function htmlEncode(t) {
return t !== undefined
? t
.toString()
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(//g, '>')
: '';
}
function stringifyStringLiteral(str: string) {
return JSON.stringify(str).slice(1, -1);
}
function decorateWithSpan(value, className) {
return '' + htmlEncode(value) + '';
}
function punctuation(val) {
return '' + val + '';
}
function valueToHTML(value, maxExpandLevel: number) {
const valueType = typeof value;
let output = '';
if (value === undefined || value === null) {
output += decorateWithSpan('null', 'token keyword');
} else if (value && value.constructor === Array) {
level++;
output += arrayToHTML(value, maxExpandLevel);
level--;
} else if (value && value.constructor === Date) {
output += decorateWithSpan('"' + value.toISOString() + '"', 'token string');
} else if (valueType === 'object') {
level++;
output += objectToHTML(value, maxExpandLevel);
level--;
} else if (valueType === 'number') {
output += decorateWithSpan(value, 'token number');
} else if (valueType === 'string') {
if (/^(http|https):\/\/[^\s]+$/.test(value)) {
output +=
decorateWithSpan('"', 'token string') +
'' +
htmlEncode(stringifyStringLiteral(value)) +
'' +
decorateWithSpan('"', 'token string');
} else {
output += decorateWithSpan('"' + stringifyStringLiteral(value) + '"', 'token string');
}
} else if (valueType === 'boolean') {
output += decorateWithSpan(value, 'token boolean');
}
return output;
}
function arrayToHTML(json, maxExpandLevel: number) {
const collapsed = level > maxExpandLevel ? 'collapsed' : '';
let output = `${punctuation(
'[',
)}${punctuation(']')}`;
if (!hasContents) {
output = punctuation('[ ]');
}
return output;
}
function objectToHTML(json, maxExpandLevel: number) {
const collapsed = level > maxExpandLevel ? 'collapsed' : '';
const keys = Object.keys(json);
const length = keys.length;
let output = `${punctuation(
'{',
)}${punctuation('}')}`;
if (!hasContents) {
output = punctuation('{ }');
}
return output;
}