UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

83 lines (57 loc) 2.1 kB
import LineBuilder from "../codegen/LineBuilder.js"; import { EdgeDirectionType } from "./Edge.js"; /** * @template T * @param {T} node * @return {string} */ function defaultNodeToDot(node) { return `[label="${node.toString()}"]`; } /** * Build a Graphviz DOT representation of the graph * @template Node * @param {Graph<Node>} graph * @param {function(Node):string} nodeToDot * @returns {string} */ export function convert_graph_to_dot_string({ graph, nodeToDot = defaultNodeToDot }) { const lb = new LineBuilder(); lb.add('strict digraph Graph {'); lb.indent(); const nodes = Array.from(graph.getNodes()); const nodeCount = nodes.length; function nodeId(index) { return `n${index}`; } for (let i = 0; i < nodeCount; i++) { const node = nodes[i]; lb.add(`${nodeId(i)} ${nodeToDot(node)};`); } //add edges for (let i = 0; i < nodeCount; i++) { const node = nodes[i]; const attachedEdges = []; const nAttachedEdges = graph.getAttachedEdges(attachedEdges, node); for (let j = 0; j < nAttachedEdges; j++) { const edge = attachedEdges[j]; const direction = edge.direction; if ((direction === EdgeDirectionType.Forward || direction === EdgeDirectionType.Undirected) && edge.first === node) { const id0 = nodeId(i); const index1 = nodes.indexOf(edge.second); const id1 = nodeId(index1); const attributes = []; if (direction === EdgeDirectionType.Undirected) { attributes.push('dir="both"'); } lb.add(`${id0} -> ${id1}${attributes.length === 0 ? '' : ` [${attributes.join(' ')}]`};`); } } } lb.dedent(); lb.add('}'); return lb.build(); }