diagrams: re-enable mermaid server via /img/ (raster) endpoint

The mermaid container has been replaced with a proper mermaid.ink
server. Use /img/ endpoint (returns JPEG) instead of /svg/ since
Qt's SVG renderer can't handle CSS class-based styles. Falls back
to mmdc CLI with PNG output if server is unavailable.
This commit is contained in:
Levi Neely 2026-07-29 16:40:18 +02:00
parent a598d0c5cc
commit c76a144de2
1 changed files with 11 additions and 10 deletions

View File

@ -827,11 +827,11 @@ static bool fetchFromPlantUmlServer(const QString &source, const QString &svgPat
return true; return true;
} }
// Fetch SVG from a local Mermaid server (mermaid.ink API), returns true on success // Fetch rendered diagram from local mermaid.ink server as JPEG (Qt-compatible raster).
static bool fetchFromMermaidServer(const QString &source, const QString &svgPath) static bool fetchFromMermaidServer(const QString &source, const QString &outPath)
{ {
QByteArray encoded = source.toUtf8().toBase64(QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals); QByteArray encoded = source.toUtf8().toBase64(QByteArray::Base64UrlEncoding | QByteArray::OmitTrailingEquals);
QUrl url(QStringLiteral("http://localhost:8081/svg/") + QString::fromLatin1(encoded)); QUrl url(QStringLiteral("http://localhost:8081/img/") + QString::fromLatin1(encoded));
QNetworkAccessManager nam; QNetworkAccessManager nam;
QNetworkRequest req(url); QNetworkRequest req(url);
@ -851,14 +851,14 @@ static bool fetchFromMermaidServer(const QString &source, const QString &svgPath
if (!reply->isFinished() || reply->error() != QNetworkReply::NoError) if (!reply->isFinished() || reply->error() != QNetworkReply::NoError)
return false; return false;
QByteArray svg = reply->readAll(); QByteArray data = reply->readAll();
if (svg.isEmpty() || !svg.contains("<svg")) if (data.isEmpty() || data.size() < 100)
return false; return false;
QFile out(svgPath); QFile out(outPath);
if (!out.open(QIODevice::WriteOnly)) if (!out.open(QIODevice::WriteOnly))
return false; return false;
out.write(svg); out.write(data);
return true; return true;
} }
@ -947,9 +947,10 @@ QString ChatBlockModel::diagramUrl(const QString &source, const QString &languag
QFile::rename(actualOutput, outPath); QFile::rename(actualOutput, outPath);
} }
} else if (lang == QStringLiteral("mermaid")) { } else if (lang == QStringLiteral("mermaid")) {
// Mermaid — try local server first (localhost:8081), fall back to mmdc CLI // Mermaid — try local server first (localhost:8081 /img/ endpoint for raster),
// Note: server returns SVG which Qt can't render (CSS classes), so skip it // fall back to mmdc CLI with PNG output.
// and always use CLI with PNG output for Qt compatibility. if (fetchFromMermaidServer(source, outPath))
return QUrl::fromLocalFile(outPath).toString();
QTemporaryFile input; QTemporaryFile input;
input.setFileTemplate(QStringLiteral("/tmp/ollie-diagram-XXXXXX.mmd")); input.setFileTemplate(QStringLiteral("/tmp/ollie-diagram-XXXXXX.mmd"));