Перейти к основному содержимому
claw
am
tools
Инструменты
Документы
Daoark
EN
Главная
Главная
/
Инструменты разработчика
›
Главная
manifest.json
&"']/g, function(c) { return {'<':'<','>':'>','&':'&','"':'"',"'":'''}[c]; }); } function parseDSL(text) { var actors = []; var messages = []; var actorIdx = {}; var lines = text.split('\n'); for (var i = 0; i < lines.length; i++) { var l = lines[i].trim(); if (!l || l[0] === '#') continue; // 匹配 → 或 -> 或 ⇢ var m = l.match(/^(\S+?)\s*(→|->|⇢)\s*(\S+?):\s*(.+)$/); if (m) { var from = m[1], arrow = m[2], to = m[3], msg = m[4]; if (!(from in actorIdx)) { actorIdx[from] = actors.length; actors.push(from); } if (!(to in actorIdx)) { actorIdx[to] = actors.length; actors.push(to); } var type = (arrow === '⇢' || arrow === '->') ? 'dashed' : 'solid'; // -> 视为实线(简化) if (arrow === '->') type = 'solid'; messages.push({ from: from, to: to, msg: msg, type: type }); } } return { actors: actors, messages: messages }; } var lastSvg = ''; function doGen() { try { var dsl = getVal('text-a'); var d = parseDSL(dsl); if (d.actors.length === 0) { showError('请输入 DSL'); return; } var n = d.actors.length; var m = d.messages.length; var actorW = 110, actorH = 40; var W = Math.max(600, n * actorW + 60); var msgH = 50; var topPad = 30, actorRow = topPad + actorH, headH = actorRow + 20; var tailH = 30; var H = headH + m * msgH + tailH; var xStep = (W - 60) / Math.max(1, n - 1); var xs = {}; for (var i = 0; i < n; i++) xs[d.actors[i]] = 30 + i * xStep; var svg = '
'; // actor 头 for (var k = 0; k < n; k++) { var a = d.actors[k]; var x = xs[a]; svg += '
'; svg += '
' + escapeXml(a) + '
'; } // 生命线 for (var k2 = 0; k2 < n; k2++) { var a2 = d.actors[k2]; var x2 = xs[a2]; svg += '
'; } // 消息 var my = headH; for (var mi = 0; mi < m; mi++) { var msg = d.messages[mi]; var x1 = xs[msg.from], x2 = xs[msg.to]; if (msg.type === 'dashed') { svg += '
'; } else { svg += '
'; } var midX = (x1 + x2) / 2; svg += '
' + escapeXml(msg.msg) + '
'; my += msgH; } // 箭头定义 svg = svg.replace('font-family:sans-serif;">', 'font-family:sans-serif;">
' + '
' + '
' + '
'); svg += '
'; lastSvg = svg; showResult(svg + '\n(本 SVG 已生成,含 ' + n + ' actor, ' + m + ' 消息)', n + ' actors · ' + m + ' msgs'); } catch (e) { showError('生成失败: ' + (e.message || e)); } } $('btn-main').addEventListener('click', function(e) { e.preventDefault(); doGen(); }); $('btn-copy').addEventListener('click', function() { if (lastSvg && navigator.clipboard) navigator.clipboard.writeText(lastSvg); }); $('btn-download').addEventListener('click', function() { if (!lastSvg) return; var blob = new Blob([lastSvg], { type: 'image/svg+xml;charset=utf-8' }); var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = 'sequence.svg'; a.click(); URL.revokeObjectURL(url); }); $('btn-clear').addEventListener('click', function() { $('text-a').value = ''; lastSvg = ''; var ra = $('result-area'); ra.hidden = true; ra.style.display = 'none'; var em = $('error-msg'); em.hidden = true; em.style.display = 'none'; $('btn-copy').style.display = 'none'; $('btn-download').style.display = 'none'; }); })();