complete basic structures

This commit is contained in:
Timo Hocker
2020-04-24 12:02:32 +02:00
parent b586e57fd7
commit e63ce1f8ed
13 changed files with 221 additions and 52 deletions

View File

@ -2,6 +2,11 @@ export class Edge {
public origin: string;
public target: string;
public constructor (origin: string, target: string) {
this.origin = origin;
this.target = target;
}
// eslint-disable-next-line @typescript-eslint/naming-convention
public toString (): string {
return `${this.origin} -> ${this.target}`;

17
lib/Element.ts Normal file
View File

@ -0,0 +1,17 @@
export class Element {
public name: string;
public parent: string;
public get full_name (): string {
return `${this.parent}_${this.name}`;
}
public constructor (name: string, parent = '') {
this.name = name;
this.parent = parent;
}
// eslint-disable-next-line @typescript-eslint/naming-convention
public toString (): string {
return this.full_name;
}
}

View File

@ -1,23 +1,54 @@
import { Node } from './Node';
import { Element } from './Element';
import { Edge } from './Edge';
import { Node } from './Node';
export class Graph extends Node {
export class Graph extends Element {
public children: Array<Graph> = [];
public nodes: Array<GraphNode> = [];
public nodes: Array<Node> = [];
public is_root = false;
public edges: Array<Edge>;
public edges: Array<Edge> = [];
// eslint-disable-next-line @typescript-eslint/naming-convention
public toString (): string {
return `subgraph cluster_${this.full_name} {
${this.children.map ((c) => c.toString ())
.join ('\n')}
public toString (level = 0): string {
return `subgraph cluster_${this.full_name} {
${this.children.map ((c) => c.toString (level + 1))
.join ('\n ')}
${this.nodes.map ((c) => c.toString ())
.join ('\n')}
.join ('\n ')}
${this.edges.map ((c) => c.toString ())
.join ('\n')}
}`;
.join ('\n ')}
}`.replace (/\n/gu, `\n${' '.repeat (level)}`)
.replace (/^\s+$/gmu, '');
}
public add_node (constructor: () => Node): void {
const node = constructor ();
node.parent = this.full_name;
this.nodes.push (node);
}
public add_graph (constructor: () => Graph): void {
const graph = constructor ();
graph.parent = this.full_name;
graph.update_parent ();
this.children.push (graph);
}
public update_parent (): void {
for (const node of this.nodes)
node.parent = this.full_name;
for (const graph of this.children) {
graph.parent = this.full_name;
graph.update_parent ();
}
}
public add_edge (origin: string, target: string): void {
this.edges.push (
new Edge (`${this.full_name}_${origin}`, `${this.full_name}_${target}`)
);
}
}

View File

@ -1,20 +0,0 @@
import { Node } from './Node';
export class GraphNode extends Node {
public label: string;
public is_table: boolean;
public table_contents: Array<Array<string>>;
private get serialized_table (): string {
const mapped_columns = this.table_contents
.map ((val) => `<td>${val.join ('</td><td>')}</td>`);
return `<table><tr>${mapped_columns.join ('</tr><tr>')}</tr></table>`;
}
// eslint-disable-next-line @typescript-eslint/naming-convention
public toString (): string {
return `${this.full_name}[label=<${this.is_table
? this._serialized_table
: this.label}>]`;
}
}

View File

@ -1,12 +1,33 @@
export class Node {
public name;
public parent;
public get full_name (): string {
return `${this.parent}_${this.name}`;
import { Element } from './Element';
export class Node extends Element {
public label?: string;
public is_table = false;
public table_contents?: Array<Array<string>>;
public constructor (name: string, parent?: string, label?: string) {
super (name, parent);
this.label = label;
}
private get serialized_table (): string {
if (typeof this.table_contents === 'undefined')
throw new Error ('table contents are undefined');
const mapped_columns = this.table_contents
.map ((val) => `<td>${val.join ('</td><td>')}</td>`);
return `<table>\n <tr>${
mapped_columns.join ('</tr>\n <tr>')
}</tr>\n</table>`;
}
// eslint-disable-next-line @typescript-eslint/naming-convention
public toString (): string {
return this.full_name;
if (this.is_table || typeof this.label !== 'undefined') {
return `${this.full_name} [label=<${this.is_table
? this.serialized_table
: this.label}>]`;
}
return `${this.full_name}`;
}
}

View File

@ -1,4 +1,4 @@
export { Graph } from './Graph';
export { GraphNode } from './GraphNode';
export { Node } from './Node';
export { Element } from './Element';
export { Edge } from './Edge';