1 | var serialize = null
|
2 | try {
|
3 | serialize = require('dom-serialize')
|
4 | } catch (e) {
|
5 |
|
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 |
|
33 |
|
34 | return obj.toString().replace(/\{[\s\S]*\}/, '{ ... }')
|
35 | } catch (err) {
|
36 | if (err instanceof TypeError) {
|
37 |
|
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
|