json.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. const _ = require('./lodash')
  2. const Graph = require('./graph')
  3. module.exports = {
  4. write: write,
  5. read: read
  6. }
  7. function write (g) {
  8. var json = {
  9. options: {
  10. directed: g.isDirected(),
  11. multigraph: g.isMultigraph(),
  12. compound: g.isCompound()
  13. },
  14. nodes: writeNodes(g),
  15. edges: writeEdges(g)
  16. }
  17. if (!_.isUndefined(g.graph())) {
  18. json.value = _.clone(g.graph())
  19. }
  20. return json
  21. }
  22. function writeNodes (g) {
  23. return _.map(g.nodes(), function (v) {
  24. const nodeValue = g.node(v)
  25. const parent = g.parent(v)
  26. const node = { v: v }
  27. if (!_.isUndefined(nodeValue)) {
  28. node.value = nodeValue
  29. }
  30. if (!_.isUndefined(parent)) {
  31. node.parent = parent
  32. }
  33. return node
  34. })
  35. }
  36. function writeEdges (g) {
  37. return _.map(g.edges(), function (e) {
  38. const edgeValue = g.edge(e)
  39. const edge = { v: e.v, w: e.w }
  40. if (!_.isUndefined(e.name)) {
  41. edge.name = e.name
  42. }
  43. if (!_.isUndefined(edgeValue)) {
  44. edge.value = edgeValue
  45. }
  46. return edge
  47. })
  48. }
  49. function read (json) {
  50. var g = new Graph(json.options).setGraph(json.value)
  51. _.each(json.nodes, function (entry) {
  52. g.setNode(entry.v, entry.value)
  53. if (entry.parent) {
  54. g.setParent(entry.v, entry.parent)
  55. }
  56. })
  57. _.each(json.edges, function (entry) {
  58. g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value)
  59. })
  60. return g
  61. }