-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathrenderer.ts
122 lines (89 loc) · 2.53 KB
/
renderer.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// for execute from browser.
import {FileReport} from '../../types';
import {Seed} from './Seed';
import {Model} from './model';
export class Renderer {
private _model: Model;
private _tree: Seed[][] = [];
constructor(_model: Model) {
this._model = _model;
}
/**
* generate seed object from json.
* @param data
* @param seed
* @private
*/
private generateSeed(data: FileReport, seed: Seed): Seed[] {
const tree: Seed[] = [];
const {children} = data;
const childSeeds: Seed[] = [];
const {count} = this._model.data;
for (let i = 0, len = children.length; i < len; i++) {
const child = children[i];
const childSeed = new Seed(child, count[child.name], this._model);
childSeeds.push(childSeed);
this.generateSeed(child, childSeed);
}
seed.children = childSeeds;
tree.push(seed);
return tree;
}
/**
* transform json to Tree data for rendering
*/
private ready = () => {
const {data} = this._model;
const {entries} = data;
for (let i = 0, len = entries.length; i < len; i++) {
const entry = entries[i];
if (data) {
const root = new Seed(entry, 0, this._model);
this._tree.push(this.generateSeed(entry, root));
}
}
};
private renderLine(name: string, level: number, isLast: boolean): string {
let line = ' ';
for (let i = 0; i < level; i++) {
line += '│ ';
}
line += isLast ? '└─ ' : '├─ ';
line += name;
return `${line}\n`;
}
private renderEntry(entry: FileReport, level: number): string {
let result = '';
for (let i = 0, len = entry.children.length; i < len; i++) {
const child = entry.children[i];
result += this.renderLine(child.name, level, i === (len - 1));
result += this.renderEntry(child, level + 1);
}
return result;
}
/**
* rendering DOM from tree.
* @private
*/
public render(): string {
let html = '';
this.ready();
for (let i = 0, len = this._tree.length; i < len; i++) {
const [root] = this._tree[i];
html += root.render();
}
html = `<div class="root html">${html}</div>`;
const {entries} = this._model.data;
let text = '';
for (let i = 0, len = entries.length; i < len; i++) {
const entry = entries[i];
text += `${entry.name}\n`;
text += this.renderEntry(entries[i], 0);
if (i < len - 1) {
text += '\n';
}
}
text = `<div class="root text"><pre class="tree">${text}</pre></div>`;
return html + text;
}
}