Skip to content

Commit 31df468

Browse files
fix arrow direction with small padding
1 parent 5f63525 commit 31df468

2 files changed

Lines changed: 54 additions & 14 deletions

File tree

cmd/arrow.go

Lines changed: 53 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,9 @@ func (g *graph) drawArrow(from gridCoord, to gridCoord, e *edge) (*drawing, *dra
111111
}
112112
log.Debugf("Drawing arrow from %v to %v with path %v", from, to, e.path)
113113
dLabel := g.drawArrowLabel(e)
114-
dPath, linesDrawn := g.drawPath(e.path)
114+
dPath, linesDrawn, lineDirs := g.drawPath(e.path)
115115
dBoxStart := g.drawBoxStart(e.path, linesDrawn[0])
116-
dArrowHead := g.drawArrowHead(linesDrawn[len(linesDrawn)-1])
116+
dArrowHead := g.drawArrowHead(linesDrawn[len(linesDrawn)-1], lineDirs[len(lineDirs)-1])
117117
dCorners := g.drawCorners(e.path)
118118
return dPath, dBoxStart, dArrowHead, dCorners, dLabel
119119
}
@@ -145,27 +145,31 @@ func mergePath(path []gridCoord) []gridCoord {
145145
return newPath
146146
}
147147

148-
func (g *graph) drawPath(path []gridCoord) (*drawing, [][]drawingCoord) {
148+
func (g *graph) drawPath(path []gridCoord) (*drawing, [][]drawingCoord, []direction) {
149149
d := copyCanvas(g.drawing)
150150
previousCoord := path[0]
151151
linesDrawn := make([][]drawingCoord, 0)
152+
lineDirs := make([]direction, 0)
152153
var previousDrawingCoord drawingCoord
153-
for idx, nextCoord := range path[1:] {
154+
for _, nextCoord := range path[1:] {
154155
previousDrawingCoord = g.gridToDrawingCoord(previousCoord, nil)
155156
nextDrawingCoord := g.gridToDrawingCoord(nextCoord, nil)
156157
if previousDrawingCoord.Equals(nextDrawingCoord) {
157158
log.Debugf("Skipping drawing identical line on %v", nextCoord)
158159
continue
159160
}
160-
if idx == 0 {
161-
// Don't cross the node border
162-
linesDrawn = append(linesDrawn, d.drawLine(previousDrawingCoord, nextDrawingCoord, 1, -1))
163-
} else {
164-
linesDrawn = append(linesDrawn, d.drawLine(previousDrawingCoord, nextDrawingCoord, 1, -1))
161+
dir := determineDirection(genericCoord(previousCoord), genericCoord(nextCoord))
162+
s := d.drawLine(previousDrawingCoord, nextDrawingCoord, 1, -1)
163+
if len(s) == 0 {
164+
// drawLine may return no coords if offsets collapse the line. Use at least one point so arrow and junction logic
165+
// can still infer a direction.
166+
s = append(s, previousDrawingCoord)
165167
}
168+
linesDrawn = append(linesDrawn, s)
169+
lineDirs = append(lineDirs, dir)
166170
previousCoord = nextCoord
167171
}
168-
return d, linesDrawn
172+
return d, linesDrawn, lineDirs
169173
}
170174

171175
func (g *graph) drawBoxStart(path []gridCoord, firstLine []drawingCoord) *drawing {
@@ -191,11 +195,17 @@ func (g *graph) drawBoxStart(path []gridCoord, firstLine []drawingCoord) *drawin
191195
return &d
192196
}
193197

194-
func (g *graph) drawArrowHead(line []drawingCoord) *drawing {
198+
func (g *graph) drawArrowHead(line []drawingCoord, fallback direction) *drawing {
195199
d := *(copyCanvas(g.drawing))
200+
if len(line) == 0 {
201+
return &d
202+
}
196203
from := line[0]
197204
lastPos := line[len(line)-1]
198205
dir := determineDirection(genericCoord(from), genericCoord(lastPos))
206+
if len(line) == 1 || dir == Middle {
207+
dir = fallback
208+
}
199209

200210
var char string
201211
if !useAscii {
@@ -217,7 +227,26 @@ func (g *graph) drawArrowHead(line []drawingCoord) *drawing {
217227
case LowerLeft:
218228
char = "◣"
219229
default:
220-
char = "●"
230+
switch fallback {
231+
case Up:
232+
char = "▲"
233+
case Down:
234+
char = "▼"
235+
case Left:
236+
char = "◄"
237+
case Right:
238+
char = "►"
239+
case UpperRight:
240+
char = "◥"
241+
case UpperLeft:
242+
char = "◤"
243+
case LowerRight:
244+
char = "◢"
245+
case LowerLeft:
246+
char = "◣"
247+
default:
248+
char = "●"
249+
}
221250
}
222251
} else {
223252
switch dir {
@@ -230,7 +259,18 @@ func (g *graph) drawArrowHead(line []drawingCoord) *drawing {
230259
case Right:
231260
char = ">"
232261
default:
233-
char = "*"
262+
switch fallback {
263+
case Up:
264+
char = "^"
265+
case Down:
266+
char = "v"
267+
case Left:
268+
char = "<"
269+
case Right:
270+
char = ">"
271+
default:
272+
char = "*"
273+
}
234274
}
235275
}
236276

cmd/testdata/ascii/backlink_with_short_y_padding.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ D --> C
1212
+---+ +---+ | +---+
1313
| | |
1414
| +----+
15-
| ^
15+
| v
1616
| +---+
1717
| | |
1818
+------>| C |

0 commit comments

Comments
 (0)