let level = 1; export function jsonToHTML(json, maxExpandLevel) { level = 1; let output = ''; output += '
'; output += valueToHTML(json, maxExpandLevel); output += '
'; return output; } function htmlEncode(t) { return t !== undefined ? t .toString() .replace(/&/g, '&') .replace(/"/g, '"') .replace(//g, '>') : ''; } function escapeForStringLiteral(str: string) { return str.replace(/([\\"])/g, '\\$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(escapeForStringLiteral(value)) + '' + decorateWithSpan('"', 'token string'); } else { output += decorateWithSpan('"' + escapeForStringLiteral(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; }