'use strict'; import {Pipe} from 'angular2/core'; import {isBlank} from 'angular2/src/facade/lang'; var level = 1; const COLLAPSE_LEVEL = 2; @Pipe({ name: 'jsonFormatter' }) export class JsonFormatter { transform(value) { if (isBlank(value)) return value; return jsonToHTML(value); } } function htmlEncode(t) { return t != null ? t.toString().replace(/&/g, '&').replace(/"/g, '"').replace(//g, '>') : ''; } function decorateWithSpan(value, className) { return '' + htmlEncode(value) + ''; } function valueToHTML(value) { var valueType = typeof value, output = ''; if (value == null) { output += decorateWithSpan('null', 'type-null'); } else if (value && value.constructor === Array) { level++; output += arrayToHTML(value); level--; } else if (valueType === 'object') { level++; output += objectToHTML(value); level--; } else if (valueType === 'number') { output += decorateWithSpan(value, 'type-number'); } else if (valueType === 'string') { if (/^(http|https):\/\/[^\\s]+$/.test(value)) { output += decorateWithSpan('"', 'type-string') + '' + htmlEncode(value) + '' + decorateWithSpan('"', 'type-string'); } else { output += decorateWithSpan('"' + value + '"', 'type-string'); } } else if (valueType === 'boolean') { output += decorateWithSpan(value, 'type-boolean'); } return output; } function arrayToHTML(json) { var collapsed = level > COLLAPSE_LEVEL ? 'collapsed' : ''; var i, length; var output = '
[