101 lines
2.5 KiB
JavaScript
101 lines
2.5 KiB
JavaScript
var serialize = null
|
|
try {
|
|
serialize = require('dom-serialize')
|
|
} catch (e) {
|
|
// Ignore failure on IE8
|
|
}
|
|
|
|
var instanceOf = require('./util').instanceOf
|
|
|
|
function isNode (obj) {
|
|
return (obj.tagName || obj.nodeName) && obj.nodeType
|
|
}
|
|
|
|
function stringify (obj, depth) {
|
|
if (depth === 0) {
|
|
return '...'
|
|
}
|
|
|
|
if (obj === null) {
|
|
return 'null'
|
|
}
|
|
|
|
switch (typeof obj) {
|
|
case 'symbol':
|
|
return obj.toString()
|
|
case 'string':
|
|
return "'" + obj + "'"
|
|
case 'undefined':
|
|
return 'undefined'
|
|
case 'function':
|
|
try {
|
|
// function abc(a, b, c) { /* code goes here */ }
|
|
// -> function abc(a, b, c) { ... }
|
|
return obj.toString().replace(/\{[\s\S]*\}/, '{ ... }')
|
|
} catch (err) {
|
|
if (err instanceof TypeError) {
|
|
// Support older browsers
|
|
return 'function ' + (obj.name || '') + '() { ... }'
|
|
} else {
|
|
throw err
|
|
}
|
|
}
|
|
case 'boolean':
|
|
return obj ? 'true' : 'false'
|
|
case 'object':
|
|
var strs = []
|
|
if (instanceOf(obj, 'Array')) {
|
|
strs.push('[')
|
|
for (var i = 0, ii = obj.length; i < ii; i++) {
|
|
if (i) {
|
|
strs.push(', ')
|
|
}
|
|
strs.push(stringify(obj[i], depth - 1))
|
|
}
|
|
strs.push(']')
|
|
} else if (instanceOf(obj, 'Date')) {
|
|
return obj.toString()
|
|
} else if (instanceOf(obj, 'Text')) {
|
|
return obj.nodeValue
|
|
} else if (instanceOf(obj, 'Comment')) {
|
|
return '<!--' + obj.nodeValue + '-->'
|
|
} else if (obj.outerHTML) {
|
|
return obj.outerHTML
|
|
} else if (isNode(obj)) {
|
|
if (serialize) {
|
|
return serialize(obj)
|
|
} else {
|
|
return 'Skipping stringify, no support for dom-serialize'
|
|
}
|
|
} else if (instanceOf(obj, 'Error')) {
|
|
return obj.toString() + '\n' + obj.stack
|
|
} else {
|
|
var constructor = 'Object'
|
|
if (obj.constructor && typeof obj.constructor === 'function') {
|
|
constructor = obj.constructor.name
|
|
}
|
|
|
|
strs.push(constructor)
|
|
strs.push('{')
|
|
var first = true
|
|
for (var key in obj) {
|
|
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
if (first) {
|
|
first = false
|
|
} else {
|
|
strs.push(', ')
|
|
}
|
|
|
|
strs.push(key + ': ' + stringify(obj[key], depth - 1))
|
|
}
|
|
}
|
|
strs.push('}')
|
|
}
|
|
return strs.join('')
|
|
default:
|
|
return obj
|
|
}
|
|
}
|
|
|
|
module.exports = stringify
|