Skip to content

Commit 65d6710

Browse files
added indent lines
1 parent 546199c commit 65d6710

File tree

4 files changed

+75
-17
lines changed

4 files changed

+75
-17
lines changed

src/json_parser/parser.service.ts

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@ import { Injectable } from '@nestjs/common';
33
type AnyObject = Record<string, any>;
44
const brackets_colors = ['#ffd700', '#da70d6', '#179fff'];
55

6+
export type ObjectStructureInfo = {
7+
key: string;
8+
startLine: number;
9+
endLine: number;
10+
depth: number;
11+
};
12+
613
@Injectable()
714
export class ParserService {
815
parse(
@@ -33,6 +40,7 @@ export class ParserService {
3340
depth :
3441
depth - (Math.floor(depth / brackets_colors.length) * brackets_colors.length)
3542
];
43+
3644
if (currentIndent === 0) {
3745
return (
3846
`<tspan x="0" dy="0" style="fill: ${bracket_color};">{</tspan>\n` +
@@ -47,4 +55,31 @@ export class ParserService {
4755
`<tspan x="${currentIndent}" dy="19"><tspan style="fill: ${bracket_color};">}</tspan>`
4856
);
4957
}
50-
}
58+
59+
analyzeObjectStructureFlat(
60+
obj: any,
61+
lineIndex: { current: number } = { current: 2 },
62+
depth: number = 0
63+
): ObjectStructureInfo[] {
64+
if (typeof obj !== 'object' || obj === null) {
65+
return [];
66+
}
67+
68+
const result: ObjectStructureInfo[] = [];
69+
const keys = Object.keys(obj);
70+
71+
for (const key of keys) {
72+
const startLine = lineIndex.current++;
73+
74+
if (typeof obj[key] === 'object' && obj[key] !== null) {
75+
result.push({ key, startLine, endLine: 0, depth });
76+
const children = this.analyzeObjectStructureFlat(obj[key], lineIndex, depth + 1);
77+
result.push(...children);
78+
const endLine = lineIndex.current++;
79+
result.find(item => item.key === key && item.startLine === startLine)!.endLine = endLine;
80+
}
81+
}
82+
83+
return result;
84+
}
85+
}

src/widget/views/index.hbs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@
2020
}
2121
2222
.main_text {
23-
transform: translateX(50px);
23+
transform: translateX(38px);
2424
}
2525
</style>
2626
<rect width="800" height="{{ height_ }}" style="fill: #1e1e1e;" />
2727
<rect width="693" height="40" x="107" style="fill: #252526;" />
28-
<rect width="1" height="{{ height }}" x="40" y="40" style="fill: #404040;" />
28+
<rect width="1" height="{{ height_main_line }}" x="40" y="65" style="fill: #404040;" />
2929

3030
<text y="60" font-family="Consolas, monospace" class="indexes">
3131
{{{indexes}}}
@@ -36,4 +36,8 @@
3636
<text y="60" font-family="Consolas, monospace" class="main_text">
3737
{{{json}}}
3838
</text>
39+
40+
<g style="transform: translate(70px, 45px);">
41+
{{{indents}}}
42+
</g>
3943
</svg>

src/widget/widget.controller.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,17 @@ export class WidgetController {
1616
) {
1717
const content = await this.widgetService.generate();
1818

19-
const lines_count = content.split('\n').length;
19+
const lines_count = content.main.split('\n').length;
2020
const indexes = this.widgetService.generate_indexes(lines_count);
2121

2222
res.header('Content-Type', 'image/svg+xml');
2323
return {
24-
json: content,
24+
json: content.main,
2525
indexes: indexes,
26+
indents: content.indents,
2627
height: 52 + (lines_count * 19),
27-
height_: 60 + (lines_count * 19)
28+
height_: 60 + (lines_count * 19),
29+
height_main_line: (lines_count - 2) * 19
2830
};
2931
}
3032

src/widget/widget.service.ts

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Injectable } from '@nestjs/common';
22
import { APIService } from 'src/apis/apis.service';
3-
import { ParserService } from 'src/json_parser/parser.service';
3+
import { ObjectStructureInfo, ParserService } from 'src/json_parser/parser.service';
44

55

66
@Injectable()
@@ -28,15 +28,6 @@ export class WidgetService {
2828
});
2929
}
3030

31-
generate_indexes(count: number) {
32-
const array = [];
33-
for (let index = 1; index <= count; index++) {
34-
array.push(`<tspan x="${index < 10 ? '9' : '0'}" dy="${index === 1 ? '0' : '19'}">${index}</tspan>`);
35-
}
36-
37-
return array.join('\n');
38-
}
39-
4031
getTimeDiff(start: Date) {
4132
const now = Date.now();
4233
const diff_millis = now - start.getTime();
@@ -118,10 +109,36 @@ export class WidgetService {
118109
message: (e.message ?? "Unknown error. See server console.").slice(0, 60) + (!!e.message && e.message.length > 60 ? '...' : '')
119110
}
120111
}
121-
return this.parserService.parse(json, 30);
112+
113+
const indents = this.parserService.analyzeObjectStructureFlat(json);
114+
return {
115+
main: this.parserService.parse(json, 30),
116+
indents: this.generateIndentLines(indents, 30)
117+
};
122118
}
123119

124120
async generateUser(obj: any) {
125121
return this.parserService.parse(obj, 30);
126122
}
123+
124+
generate_indexes(count: number) {
125+
const array = [];
126+
for (let index = 1; index <= count; index++) {
127+
array.push(`<tspan x="${index < 10 ? '9' : '0'}" dy="${index === 1 ? '0' : '19'}">${index}</tspan>`);
128+
}
129+
130+
return array.join('\n');
131+
}
132+
133+
generateIndentLines(indents: ObjectStructureInfo[], indent_width: number) {
134+
const array = [];
135+
for (const indent of indents) {
136+
array.push(
137+
`<rect fill="#404040" x="${indent.depth * indent_width}" ` +
138+
`y="${indent.startLine * 19}" width="1" height="${((indent.endLine - indent.startLine) - 1) * 19}" />`
139+
);
140+
}
141+
142+
return array.join('\n');
143+
}
127144
}

0 commit comments

Comments
 (0)