add-border-segments.js 980 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. import _ from 'lodash'
  2. import util from './util'
  3. function addBorderSegments (g) {
  4. function dfs (v) {
  5. const children = g.children(v)
  6. const node = g.node(v)
  7. if (children.length) {
  8. _.forEach(children, dfs)
  9. }
  10. if (_.has(node, 'minRank')) {
  11. node.borderLeft = []
  12. node.borderRight = []
  13. for (let rank = node.minRank, maxRank = node.maxRank + 1;
  14. rank < maxRank;
  15. ++rank) {
  16. addBorderNode(g, 'borderLeft', '_bl', v, node, rank)
  17. addBorderNode(g, 'borderRight', '_br', v, node, rank)
  18. }
  19. }
  20. }
  21. _.forEach(g.children(), dfs)
  22. }
  23. function addBorderNode (g, prop, prefix, sg, sgNode, rank) {
  24. const label = { width: 0, height: 0, rank: rank, borderType: prop }
  25. const prev = sgNode[prop][rank - 1]
  26. const curr = util.addDummyNode(g, 'border', label, prefix)
  27. sgNode[prop][rank] = curr
  28. g.setParent(curr, sg)
  29. if (prev) {
  30. g.setEdge(prev, curr, { weight: 1 })
  31. }
  32. }
  33. export default addBorderSegments