[6a3a178] | 1 | var serialize = null
|
---|
| 2 | try {
|
---|
| 3 | serialize = require('dom-serialize')
|
---|
| 4 | } catch (e) {
|
---|
| 5 | // Ignore failure on IE8
|
---|
| 6 | }
|
---|
| 7 |
|
---|
| 8 | var instanceOf = require('./util').instanceOf
|
---|
| 9 |
|
---|
| 10 | function isNode (obj) {
|
---|
| 11 | return (obj.tagName || obj.nodeName) && obj.nodeType
|
---|
| 12 | }
|
---|
| 13 |
|
---|
| 14 | function stringify (obj, depth) {
|
---|
| 15 | if (depth === 0) {
|
---|
| 16 | return '...'
|
---|
| 17 | }
|
---|
| 18 |
|
---|
| 19 | if (obj === null) {
|
---|
| 20 | return 'null'
|
---|
| 21 | }
|
---|
| 22 |
|
---|
| 23 | switch (typeof obj) {
|
---|
| 24 | case 'symbol':
|
---|
| 25 | return obj.toString()
|
---|
| 26 | case 'string':
|
---|
| 27 | return "'" + obj + "'"
|
---|
| 28 | case 'undefined':
|
---|
| 29 | return 'undefined'
|
---|
| 30 | case 'function':
|
---|
| 31 | try {
|
---|
| 32 | // function abc(a, b, c) { /* code goes here */ }
|
---|
| 33 | // -> function abc(a, b, c) { ... }
|
---|
| 34 | return obj.toString().replace(/\{[\s\S]*\}/, '{ ... }')
|
---|
| 35 | } catch (err) {
|
---|
| 36 | if (err instanceof TypeError) {
|
---|
| 37 | // Support older browsers
|
---|
| 38 | return 'function ' + (obj.name || '') + '() { ... }'
|
---|
| 39 | } else {
|
---|
| 40 | throw err
|
---|
| 41 | }
|
---|
| 42 | }
|
---|
| 43 | case 'boolean':
|
---|
| 44 | return obj ? 'true' : 'false'
|
---|
| 45 | case 'object':
|
---|
| 46 | var strs = []
|
---|
| 47 | if (instanceOf(obj, 'Array')) {
|
---|
| 48 | strs.push('[')
|
---|
| 49 | for (var i = 0, ii = obj.length; i < ii; i++) {
|
---|
| 50 | if (i) {
|
---|
| 51 | strs.push(', ')
|
---|
| 52 | }
|
---|
| 53 | strs.push(stringify(obj[i], depth - 1))
|
---|
| 54 | }
|
---|
| 55 | strs.push(']')
|
---|
| 56 | } else if (instanceOf(obj, 'Date')) {
|
---|
| 57 | return obj.toString()
|
---|
| 58 | } else if (instanceOf(obj, 'Text')) {
|
---|
| 59 | return obj.nodeValue
|
---|
| 60 | } else if (instanceOf(obj, 'Comment')) {
|
---|
| 61 | return '<!--' + obj.nodeValue + '-->'
|
---|
| 62 | } else if (obj.outerHTML) {
|
---|
| 63 | return obj.outerHTML
|
---|
| 64 | } else if (isNode(obj)) {
|
---|
| 65 | if (serialize) {
|
---|
| 66 | return serialize(obj)
|
---|
| 67 | } else {
|
---|
| 68 | return 'Skipping stringify, no support for dom-serialize'
|
---|
| 69 | }
|
---|
| 70 | } else if (instanceOf(obj, 'Error')) {
|
---|
| 71 | return obj.toString() + '\n' + obj.stack
|
---|
| 72 | } else {
|
---|
| 73 | var constructor = 'Object'
|
---|
| 74 | if (obj.constructor && typeof obj.constructor === 'function') {
|
---|
| 75 | constructor = obj.constructor.name
|
---|
| 76 | }
|
---|
| 77 |
|
---|
| 78 | strs.push(constructor)
|
---|
| 79 | strs.push('{')
|
---|
| 80 | var first = true
|
---|
| 81 | for (var key in obj) {
|
---|
| 82 | if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
---|
| 83 | if (first) {
|
---|
| 84 | first = false
|
---|
| 85 | } else {
|
---|
| 86 | strs.push(', ')
|
---|
| 87 | }
|
---|
| 88 |
|
---|
| 89 | strs.push(key + ': ' + stringify(obj[key], depth - 1))
|
---|
| 90 | }
|
---|
| 91 | }
|
---|
| 92 | strs.push('}')
|
---|
| 93 | }
|
---|
| 94 | return strs.join('')
|
---|
| 95 | default:
|
---|
| 96 | return obj
|
---|
| 97 | }
|
---|
| 98 | }
|
---|
| 99 |
|
---|
| 100 | module.exports = stringify
|
---|