|
46 | 46 | return data; |
47 | 47 | } |
48 | 48 |
|
| 49 | + renderPlain(value) { |
| 50 | + const pre = document.createElement('pre'); |
| 51 | + pre.className = 'sf-dump'; |
| 52 | + const savedDepth = this.expandedDepth; |
| 53 | + this.expandedDepth = 0; |
| 54 | + pre.innerHTML = this.plainToHtml(value, 0) + '\n'; |
| 55 | + this.expandedDepth = savedDepth; |
| 56 | + return pre; |
| 57 | + } |
| 58 | + |
| 59 | + plainToHtml(value, depth) { |
| 60 | + if (value === null) return '<span class=sf-dump-const>null</span>'; |
| 61 | + switch (typeof value) { |
| 62 | + case 'boolean': |
| 63 | + return '<span class=sf-dump-const>' + value + '</span>'; |
| 64 | + case 'number': |
| 65 | + return '<span class=sf-dump-num>' + this.esc(String(value)) + '</span>'; |
| 66 | + case 'string': |
| 67 | + return '"<span class=sf-dump-str>' + this.esc(value) + '</span>"'; |
| 68 | + case 'object': { |
| 69 | + const isIndexed = Array.isArray(value); |
| 70 | + const keys = isIndexed ? null : Object.keys(value); |
| 71 | + const len = isIndexed ? value.length : keys.length; |
| 72 | + |
| 73 | + if (len === 0) return '[]'; |
| 74 | + |
| 75 | + const expanded = depth < this.expandedDepth; |
| 76 | + let html = '<span class=sf-dump-note>array:' + len + '</span> ['; |
| 77 | + html += '<a class=sf-dump-toggle><span>' + (expanded ? '▼' : '▶') + '</span></a>'; |
| 78 | + |
| 79 | + // Preview |
| 80 | + const previewParts = []; |
| 81 | + const maxPreview = Math.min(len, 8); |
| 82 | + for (let i = 0; i < maxPreview; i++) { |
| 83 | + const k = isIndexed ? i : keys[i]; |
| 84 | + const v = isIndexed ? value[i] : value[keys[i]]; |
| 85 | + const pv = v === null ? 'null' |
| 86 | + : typeof v === 'string' ? '"' + this.esc(v.length > 40 ? v.substring(0, 40) + '…' : v) + '"' |
| 87 | + : typeof v === 'boolean' ? String(v) |
| 88 | + : typeof v === 'number' ? String(v) |
| 89 | + : '[…]'; |
| 90 | + previewParts.push(isIndexed ? pv : this.esc(String(k)) + ': ' + pv); |
| 91 | + } |
| 92 | + let preview = previewParts.join(', '); |
| 93 | + if (len > maxPreview) preview += ', …'; |
| 94 | + html += '<span class="sf-dump-preview' + (expanded ? ' sf-dump-hidden' : '') + '"> ' + preview + ' ]</span>'; |
| 95 | + |
| 96 | + if (expanded) { |
| 97 | + html += '<samp class=sf-dump-expanded>'; |
| 98 | + html += this.plainChildrenToHtml(value, isIndexed, keys, depth); |
| 99 | + html += '</samp>'; |
| 100 | + } else { |
| 101 | + const id = ++lazySeq; |
| 102 | + lazyStore.set(id, { plain: value, isArr: isIndexed, keys, depth, renderer: this, expandedDepth: this.expandedDepth }); |
| 103 | + html += '<samp class=sf-dump-compact data-lazy=' + id + '></samp>'; |
| 104 | + } |
| 105 | + html += '<span class="sf-dump-close' + (expanded ? '' : ' sf-dump-hidden') + '">]</span>'; |
| 106 | + return html; |
| 107 | + } |
| 108 | + default: |
| 109 | + return this.esc(String(value)); |
| 110 | + } |
| 111 | + } |
| 112 | + |
| 113 | + plainChildrenToHtml(value, isIndexed, keys, depth) { |
| 114 | + const len = isIndexed ? value.length : keys.length; |
| 115 | + let html = ''; |
| 116 | + for (let i = 0; i < len; i++) { |
| 117 | + if (i > 0) html += '\n'; |
| 118 | + if (isIndexed) { |
| 119 | + html += '<span class=sf-dump-index>' + i + '</span> => '; |
| 120 | + html += this.plainToHtml(value[i], depth + 1); |
| 121 | + } else { |
| 122 | + html += '"<span class=sf-dump-key>' + this.esc(keys[i]) + '</span>" => '; |
| 123 | + html += this.plainToHtml(value[keys[i]], depth + 1); |
| 124 | + } |
| 125 | + } |
| 126 | + return html; |
| 127 | + } |
| 128 | + |
49 | 129 | esc(s) { |
50 | 130 | return String(s).replace(escRe, m => escMap[m]); |
51 | 131 | } |
|
301 | 381 | const savedDepth = renderer.expandedDepth; |
302 | 382 | renderer.expandedDepth = data.expandedDepth; |
303 | 383 |
|
304 | | - samp.innerHTML = renderer.childrenToHtml(data.children, data.cut, data.depth, data.ht); |
| 384 | + if (data.plain !== undefined) { |
| 385 | + samp.innerHTML = renderer.plainChildrenToHtml(data.plain, data.isArr, data.keys, data.depth); |
| 386 | + } else { |
| 387 | + samp.innerHTML = renderer.childrenToHtml(data.children, data.cut, data.depth, data.ht); |
| 388 | + } |
305 | 389 |
|
306 | 390 | renderer.expandedDepth = savedDepth; |
307 | 391 | } |
|
0 commit comments