UNPKG

sigma

Version:

A JavaScript library aimed at visualizing graphs of thousands of nodes and edges.

69 lines (68 loc) 2.25 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function drawEdgeLabel(context, edgeData, sourceData, targetData, settings) { var size = settings.edgeLabelSize, font = settings.edgeLabelFont, weight = settings.edgeLabelWeight, color = settings.edgeLabelColor.attribute ? edgeData[settings.edgeLabelColor.attribute] || settings.edgeLabelColor.color || "#000" : settings.edgeLabelColor.color; var label = edgeData.label; if (!label) return; context.fillStyle = color; context.font = "".concat(weight, " ").concat(size, "px ").concat(font); // Computing positions without considering nodes sizes: var sSize = sourceData.size; var tSize = targetData.size; var sx = sourceData.x; var sy = sourceData.y; var tx = targetData.x; var ty = targetData.y; var cx = (sx + tx) / 2; var cy = (sy + ty) / 2; var dx = tx - sx; var dy = ty - sy; var d = Math.sqrt(dx * dx + dy * dy); if (d < sSize + tSize) return; // Adding nodes sizes: sx += (dx * sSize) / d; sy += (dy * sSize) / d; tx -= (dx * tSize) / d; ty -= (dy * tSize) / d; cx = (sx + tx) / 2; cy = (sy + ty) / 2; dx = tx - sx; dy = ty - sy; d = Math.sqrt(dx * dx + dy * dy); // Handling ellipsis var textLength = context.measureText(label).width; if (textLength > d) { var ellipsis = "…"; label = label + ellipsis; textLength = context.measureText(label).width; while (textLength > d && label.length > 1) { label = label.slice(0, -2) + ellipsis; textLength = context.measureText(label).width; } if (label.length < 4) return; } var angle; if (dx > 0) { if (dy > 0) angle = Math.acos(dx / d); else angle = Math.asin(dy / d); } else { if (dy > 0) angle = Math.acos(dx / d) + Math.PI; else angle = Math.asin(dx / d) + Math.PI / 2; } context.save(); context.translate(cx, cy); context.rotate(angle); context.fillText(label, -textLength / 2, edgeData.size / 2 + size); context.restore(); } exports.default = drawEdgeLabel;