{
"tool_response": {
"type": "update",
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/src\/View\/semantic-explorer\/semantik.php",
"content": "<?php ob_start(); ?>\n\n<nav class=\"breadcrumb\">\n <a href=\"\/\">Home<\/a> » <a href=\"\/explorer\">Explorer<\/a> » <a href=\"\/semantic-explorer\">Semantic Explorer<\/a> » Semantik\n<\/nav>\n\n<h1>Semantik<\/h1>\n<p>Semantische Analyse pro Chunk: Zusammenfassungen, Keywords, Sentiment.<\/p>\n\n<div class=\"stats-grid\">\n <div class=\"stat-card stat-card--primary\">\n <span class=\"stat-card__value\"><?= $stats['total'] ?? 0 ?><\/span>\n <span class=\"stat-card__label\">Analysiert<\/span>\n <\/div>\n <div class=\"stat-card stat-card--success\">\n <span class=\"stat-card__value\"><?= $stats['positive'] ?? 0 ?><\/span>\n <span class=\"stat-card__label\">Positiv<\/span>\n <\/div>\n <div class=\"stat-card\">\n <span class=\"stat-card__value\"><?= $stats['neutral'] ?? 0 ?><\/span>\n <span class=\"stat-card__label\">Neutral<\/span>\n <\/div>\n <div class=\"stat-card stat-card--warning\">\n <span class=\"stat-card__value\"><?= $stats['negative'] ?? 0 ?><\/span>\n <span class=\"stat-card__label\">Negativ<\/span>\n <\/div>\n <div class=\"stat-card stat-card--info\">\n <span class=\"stat-card__value\"><?= $stats['mixed'] ?? 0 ?><\/span>\n <span class=\"stat-card__label\">Gemischt<\/span>\n <\/div>\n<\/div>\n\n<div class=\"filters\">\n <input type=\"search\" id=\"semantics-search\" class=\"form-input\" placeholder=\"Durchsuchen...\">\n <select id=\"filter-sentiment\" class=\"form-select--inline\">\n <option value=\"\">Alle Sentiments<\/option>\n <option value=\"positive\">Positiv<\/option>\n <option value=\"neutral\">Neutral<\/option>\n <option value=\"negative\">Negativ<\/option>\n <option value=\"mixed\">Gemischt<\/option>\n <\/select>\n<\/div>\n\n<?php if (!empty($semantics)): ?>\n<table id=\"semantics-table\" data-sortable>\n <thead>\n <tr>\n <th data-sort=\"chunk_id\">Chunk<\/th>\n <th data-sort=\"filename\">Dokument<\/th>\n <th data-sort=\"sentiment\">Sentiment<\/th>\n <th data-sort=\"language\">Sprache<\/th>\n <th>Keywords<\/th>\n <th data-sort=\"summary\">Zusammenfassung<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <?php foreach ($semantics as $s): ?>\n <tr>\n <td><a href=\"\/semantic-explorer\/chunks\/<?= $s['chunk_id'] ?>\">#<?= $s['chunk_id'] ?><\/a><\/td>\n <td><a href=\"\/semantic-explorer\/dokumente\/<?= $s['document_id'] ?>\"><?= htmlspecialchars($s['filename']) ?><\/a><\/td>\n <td>\n <span class=\"badge badge--<?= $s['sentiment'] === 'positive' ? 'success' : ($s['sentiment'] === 'negative' ? 'warning' : 'info') ?>\">\n <?= $s['sentiment'] ?>\n <\/span>\n <\/td>\n <td><?= htmlspecialchars($s['language'] ?? 'de') ?><\/td>\n <td>\n <?php foreach (array_slice($s['keywords_decoded'], 0, 3) as $kw): ?>\n <span class=\"badge badge--small\"><?= htmlspecialchars($kw) ?><\/span>\n <?php endforeach; ?>\n <\/td>\n <td><?= htmlspecialchars(substr($s['summary'] ?? '', 0, 100)) ?>...<\/td>\n <\/tr>\n <?php endforeach; ?>\n <\/tbody>\n<\/table>\n<?php else: ?>\n<p class=\"empty-state\">Keine semantischen Analysen gefunden. Fuehren Sie die semantische Analyse aus.<\/p>\n<?php endif; ?>\n\n<p class=\"links-bar\">\n <a href=\"\/semantic-explorer\">Zurueck zum Explorer<\/a> |\n <a href=\"\/semantic-explorer\/entitaeten\">Entitaeten<\/a>\n<\/p>\n\n<script type=\"module\">\nimport { init } from '\/js\/components\/data-table.js';\n\nconst dataTable = init({\n clock: { now_epoch_ms_utc: () => Date.now() },\n logger: console,\n ui: {\n showMessage: (msg) => { console.log(msg.type + ': ' + msg.text); },\n disableFeature: (key) => { console.warn('Feature disabled: ' + key); },\n offerRetry: () => Promise.resolve(false)\n },\n runId: crypto.randomUUID()\n});\n\ndataTable.create('semantics-table', {\n searchInput: 'semantics-search',\n pageSize: 20,\n filters: {\n 'filter-sentiment': 2\n }\n});\n<\/script>\n\n<?php $content = ob_get_clean(); ?>\n<?php require VIEW_PATH . '\/layout.php'; ?>\n",
"structuredPatch": [
{
"oldStart": 30,
"oldLines": 24,
"newStart": 30,
"newLines": 19,
"lines": [
" <\/div>",
" <\/div>",
" ",
"-<form method=\"get\" class=\"filter-form\">",
"- <select name=\"sentiment\">",
"+<div class=\"filters\">",
"+ <input type=\"search\" id=\"semantics-search\" class=\"form-input\" placeholder=\"Durchsuchen...\">",
"+ <select id=\"filter-sentiment\" class=\"form-select--inline\">",
" <option value=\"\">Alle Sentiments<\/option>",
"- <option value=\"positive\" <?= $currentSentiment === 'positive' ? 'selected' : '' ?>>Positiv<\/option>",
"- <option value=\"neutral\" <?= $currentSentiment === 'neutral' ? 'selected' : '' ?>>Neutral<\/option>",
"- <option value=\"negative\" <?= $currentSentiment === 'negative' ? 'selected' : '' ?>>Negativ<\/option>",
"- <option value=\"mixed\" <?= $currentSentiment === 'mixed' ? 'selected' : '' ?>>Gemischt<\/option>",
"+ <option value=\"positive\">Positiv<\/option>",
"+ <option value=\"neutral\">Neutral<\/option>",
"+ <option value=\"negative\">Negativ<\/option>",
"+ <option value=\"mixed\">Gemischt<\/option>",
" <\/select>",
"- <button type=\"submit\" class=\"btn btn--primary\">Filtern<\/button>",
"- <?php if ($currentSentiment): ?>",
"- <a href=\"\/semantic-explorer\/semantik\" class=\"btn\">Reset<\/a>",
"- <?php endif; ?>",
"-<\/form>",
"+<\/div>",
" ",
" <?php if (!empty($semantics)): ?>",
"-<p><?= number_format($totalCount) ?> Chunk(s) analysiert. Seite <?= $currentPage ?> von <?= $totalPages ?>.<\/p>",
"-",
"-<table data-sortable>",
"+<table id=\"semantics-table\" data-sortable>",
" <thead>",
" <tr>",
" <th data-sort=\"chunk_id\">Chunk<\/th>"
]
},
{
"oldStart": 55,
"oldLines": 7,
"newStart": 50,
"newLines": 7,
"lines": [
" <th data-sort=\"sentiment\">Sentiment<\/th>",
" <th data-sort=\"language\">Sprache<\/th>",
" <th>Keywords<\/th>",
"- <th>Zusammenfassung<\/th>",
"+ <th data-sort=\"summary\">Zusammenfassung<\/th>",
" <\/tr>",
" <\/thead>",
" <tbody>"
]
},
{
"oldStart": 79,
"oldLines": 21,
"newStart": 74,
"newLines": 8,
"lines": [
" <?php endforeach; ?>",
" <\/tbody>",
" <\/table>",
"-",
"-<?php if ($totalPages > 1): ?>",
"-<div class=\"pagination\">",
"- <?php if ($currentPage > 1): ?>",
"- <a href=\"?page=<?= $currentPage - 1 ?>&sentiment=<?= urlencode($currentSentiment) ?>\" class=\"btn btn--small\">« Zurueck<\/a>",
"- <?php endif; ?>",
"- <span>Seite <?= $currentPage ?> von <?= $totalPages ?><\/span>",
"- <?php if ($currentPage < $totalPages): ?>",
"- <a href=\"?page=<?= $currentPage + 1 ?>&sentiment=<?= urlencode($currentSentiment) ?>\" class=\"btn btn--small\">Weiter »<\/a>",
"- <?php endif; ?>",
"-<\/div>",
"-<?php endif; ?>",
"-",
" <?php else: ?>",
"-<p>Keine semantischen Analysen gefunden. Fuehren Sie die semantische Analyse aus.<\/p>",
"+<p class=\"empty-state\">Keine semantischen Analysen gefunden. Fuehren Sie die semantische Analyse aus.<\/p>",
" <?php endif; ?>",
" ",
" <p class=\"links-bar\">"
]
},
{
"oldStart": 101,
"oldLines": 5,
"newStart": 83,
"newLines": 28,
"lines": [
" <a href=\"\/semantic-explorer\/entitaeten\">Entitaeten<\/a>",
" <\/p>",
" ",
"+<script type=\"module\">",
"+import { init } from '\/js\/components\/data-table.js';",
"+",
"+const dataTable = init({",
"+ clock: { now_epoch_ms_utc: () => Date.now() },",
"+ logger: console,",
"+ ui: {",
"+ showMessage: (msg) => { console.log(msg.type + ': ' + msg.text); },",
"+ disableFeature: (key) => { console.warn('Feature disabled: ' + key); },",
"+ offerRetry: () => Promise.resolve(false)",
"+ },",
"+ runId: crypto.randomUUID()",
"+});",
"+",
"+dataTable.create('semantics-table', {",
"+ searchInput: 'semantics-search',",
"+ pageSize: 20,",
"+ filters: {",
"+ 'filter-sentiment': 2",
"+ }",
"+});",
"+<\/script>",
"+",
" <?php $content = ob_get_clean(); ?>",
" <?php require VIEW_PATH . '\/layout.php'; ?>"
]
}
],
"originalFile": "<?php ob_start(); ?>\n\n<nav class=\"breadcrumb\">\n <a href=\"\/\">Home<\/a> » <a href=\"\/explorer\">Explorer<\/a> » <a href=\"\/semantic-explorer\">Semantic Explorer<\/a> » Semantik\n<\/nav>\n\n<h1>Semantik<\/h1>\n<p>Semantische Analyse pro Chunk: Zusammenfassungen, Keywords, Sentiment.<\/p>\n\n<div class=\"stats-grid\">\n <div class=\"stat-card stat-card--primary\">\n <span class=\"stat-card__value\"><?= $stats['total'] ?? 0 ?><\/span>\n <span class=\"stat-card__label\">Analysiert<\/span>\n <\/div>\n <div class=\"stat-card stat-card--success\">\n <span class=\"stat-card__value\"><?= $stats['positive'] ?? 0 ?><\/span>\n <span class=\"stat-card__label\">Positiv<\/span>\n <\/div>\n <div class=\"stat-card\">\n <span class=\"stat-card__value\"><?= $stats['neutral'] ?? 0 ?><\/span>\n <span class=\"stat-card__label\">Neutral<\/span>\n <\/div>\n <div class=\"stat-card stat-card--warning\">\n <span class=\"stat-card__value\"><?= $stats['negative'] ?? 0 ?><\/span>\n <span class=\"stat-card__label\">Negativ<\/span>\n <\/div>\n <div class=\"stat-card stat-card--info\">\n <span class=\"stat-card__value\"><?= $stats['mixed'] ?? 0 ?><\/span>\n <span class=\"stat-card__label\">Gemischt<\/span>\n <\/div>\n<\/div>\n\n<form method=\"get\" class=\"filter-form\">\n <select name=\"sentiment\">\n <option value=\"\">Alle Sentiments<\/option>\n <option value=\"positive\" <?= $currentSentiment === 'positive' ? 'selected' : '' ?>>Positiv<\/option>\n <option value=\"neutral\" <?= $currentSentiment === 'neutral' ? 'selected' : '' ?>>Neutral<\/option>\n <option value=\"negative\" <?= $currentSentiment === 'negative' ? 'selected' : '' ?>>Negativ<\/option>\n <option value=\"mixed\" <?= $currentSentiment === 'mixed' ? 'selected' : '' ?>>Gemischt<\/option>\n <\/select>\n <button type=\"submit\" class=\"btn btn--primary\">Filtern<\/button>\n <?php if ($currentSentiment): ?>\n <a href=\"\/semantic-explorer\/semantik\" class=\"btn\">Reset<\/a>\n <?php endif; ?>\n<\/form>\n\n<?php if (!empty($semantics)): ?>\n<p><?= number_format($totalCount) ?> Chunk(s) analysiert. Seite <?= $currentPage ?> von <?= $totalPages ?>.<\/p>\n\n<table data-sortable>\n <thead>\n <tr>\n <th data-sort=\"chunk_id\">Chunk<\/th>\n <th data-sort=\"filename\">Dokument<\/th>\n <th data-sort=\"sentiment\">Sentiment<\/th>\n <th data-sort=\"language\">Sprache<\/th>\n <th>Keywords<\/th>\n <th>Zusammenfassung<\/th>\n <\/tr>\n <\/thead>\n <tbody>\n <?php foreach ($semantics as $s): ?>\n <tr>\n <td><a href=\"\/semantic-explorer\/chunks\/<?= $s['chunk_id'] ?>\">#<?= $s['chunk_id'] ?><\/a><\/td>\n <td><a href=\"\/semantic-explorer\/dokumente\/<?= $s['document_id'] ?>\"><?= htmlspecialchars($s['filename']) ?><\/a><\/td>\n <td>\n <span class=\"badge badge--<?= $s['sentiment'] === 'positive' ? 'success' : ($s['sentiment'] === 'negative' ? 'warning' : 'info') ?>\">\n <?= $s['sentiment'] ?>\n <\/span>\n <\/td>\n <td><?= htmlspecialchars($s['language'] ?? 'de') ?><\/td>\n <td>\n <?php foreach (array_slice($s['keywords_decoded'], 0, 3) as $kw): ?>\n <span class=\"badge badge--small\"><?= htmlspecialchars($kw) ?><\/span>\n <?php endforeach; ?>\n <\/td>\n <td><?= htmlspecialchars(substr($s['summary'] ?? '', 0, 100)) ?>...<\/td>\n <\/tr>\n <?php endforeach; ?>\n <\/tbody>\n<\/table>\n\n<?php if ($totalPages > 1): ?>\n<div class=\"pagination\">\n <?php if ($currentPage > 1): ?>\n <a href=\"?page=<?= $currentPage - 1 ?>&sentiment=<?= urlencode($currentSentiment) ?>\" class=\"btn btn--small\">« Zurueck<\/a>\n <?php endif; ?>\n <span>Seite <?= $currentPage ?> von <?= $totalPages ?><\/span>\n <?php if ($currentPage < $totalPages): ?>\n <a href=\"?page=<?= $currentPage + 1 ?>&sentiment=<?= urlencode($currentSentiment) ?>\" class=\"btn btn--small\">Weiter »<\/a>\n <?php endif; ?>\n<\/div>\n<?php endif; ?>\n\n<?php else: ?>\n<p>Keine semantischen Analysen gefunden. Fuehren Sie die semantische Analyse aus.<\/p>\n<?php endif; ?>\n\n<p class=\"links-bar\">\n <a href=\"\/semantic-explorer\">Zurueck zum Explorer<\/a> |\n <a href=\"\/semantic-explorer\/entitaeten\">Entitaeten<\/a>\n<\/p>\n\n<?php $content = ob_get_clean(); ?>\n<?php require VIEW_PATH . '\/layout.php'; ?>\n"
}
}