Migrate all repos into monorepo context folders
Bahn: aisupport, Analyse-O2C-C2S, awesome-bahn-mcp-servers, beam-mcp,
Confluence_Bot, db-planet-mcp-server, O2C-Harness, project-audit,
Projekt-KIQ-HP, teamlandkarte-mcp
Dhive: Jury-Voting
Privat: CV, NoteGraph (NOTE: NoteGraph needs complete redo after consolidation)
Shared: AI-Orchestrator, OrgMyLife, power_skills_and_more
Shared/references: symphony (read-only)
Bahn repos remain available as independent remotes - this monorepo
pulls them in via subtree, the originals are untouched.
This commit is contained in:
@@ -0,0 +1,183 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Test: Pusht eine einzelne Seite um Umlaut-Konvertierung zu pruefen
|
||||
#>
|
||||
|
||||
$ConfluenceUrl = "https://arija-confluence.jaas.service.deutschebahn.com"
|
||||
$SpaceKey = "BES"
|
||||
$ParentPageId = "581013135"
|
||||
$ApiBase = "$ConfluenceUrl/rest/api"
|
||||
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
||||
|
||||
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
||||
|
||||
# Token aus .secrets
|
||||
$SecretsPath = Join-Path $ScriptDir "..\.secrets"
|
||||
$PAT = $null
|
||||
if (Test-Path $SecretsPath) {
|
||||
Get-Content $SecretsPath | ForEach-Object {
|
||||
if ($_ -match "^CONFLUENCE_TOKEN=(.+)$") {
|
||||
$val = $Matches[1].Trim()
|
||||
if ($val -ne "HIER_TOKEN_EINTRAGEN") { $PAT = $val }
|
||||
}
|
||||
}
|
||||
}
|
||||
if (-not $PAT) { $PAT = Read-Host "Confluence PAT" }
|
||||
$Headers = @{ "Authorization" = "Bearer $PAT"; "Content-Type" = "application/json" }
|
||||
|
||||
# Fix-Umlauts Funktion (identisch zum Haupt-Script)
|
||||
function Fix-Umlauts($html) {
|
||||
if ($null -eq $html -or $html -eq "") { return $html }
|
||||
$Protect = @(
|
||||
'Israel','Michael','Raphael','Emmanuel','Manuel','Daniel','Samuel',
|
||||
'Maurer','Enabler','enabler','Container','container','Cluster','cluster',
|
||||
'User','user','Tracing','Staging','Logging','Alerting','Monitoring',
|
||||
'Deployment','deployment','Security','security','Recovery','Discovery',
|
||||
'Delivery','Pipeline','pipeline','Release','release',
|
||||
'Performance','performance','Interface','interface',
|
||||
'Service','service','Feature','feature','Issue','issue',
|
||||
'value','true','blue','Due','due','Queue','queue',
|
||||
'Unique','unique','Continue','continue',
|
||||
'Funnel','Tunnel','tunnel','Buildpacks','Dockerfile',
|
||||
'OpenSearch','Gherkin','Kubernetes','Helmfile','Renovate',
|
||||
'Operate','Template','template','Tasklist',
|
||||
'Smoke','smoke','Analyse','analyse','Analysis',
|
||||
'Baseline','baseline','Namespace','namespace',
|
||||
'Codebase','Database','database','Rescue','rescue'
|
||||
)
|
||||
foreach ($w in $Protect) { $html = $html.Replace($w, "PROTECT_$w") }
|
||||
# Namen
|
||||
$html = $html.Replace('Hoerpel', 'Hörpel')
|
||||
$html = $html.Replace('Ruecker', 'Rücker')
|
||||
$html = $html.Replace('Koehler', 'Köhler')
|
||||
$html = $html.Replace('Goendoer', 'Göndör')
|
||||
# ue
|
||||
$html = $html.Replace('Ueber', 'Über')
|
||||
$html = $html.Replace('ueber', 'über')
|
||||
$html = $html.Replace('Pruef', 'Prüf'); $html = $html.Replace('pruef', 'prüf')
|
||||
$html = $html.Replace('fuehrung', 'führung'); $html = $html.Replace('Fuehrung', 'Führung')
|
||||
$html = $html.Replace('Verfueg', 'Verfüg'); $html = $html.Replace('verfueg', 'verfüg')
|
||||
$html = $html.Replace('Verschluess', 'Verschlüss'); $html = $html.Replace('verschluess', 'verschlüss')
|
||||
$html = $html.Replace('Schluess', 'Schlüss'); $html = $html.Replace('schluess', 'schlüss')
|
||||
$html = $html.Replace('Verknuepf', 'Verknüpf'); $html = $html.Replace('verknuepf', 'verknüpf')
|
||||
$html = $html.Replace('Unterstuetz', 'Unterstütz'); $html = $html.Replace('unterstuetz', 'unterstütz')
|
||||
$html = $html.Replace('Luecke', 'Lücke'); $html = $html.Replace('luecke', 'lücke')
|
||||
$html = $html.Replace('Rueck', 'Rück'); $html = $html.Replace('rueck', 'rück')
|
||||
$html = $html.Replace('Frueh', 'Früh'); $html = $html.Replace('frueh', 'früh')
|
||||
$html = $html.Replace('Nuetzlich', 'Nützlich'); $html = $html.Replace('nuetzlich', 'nützlich')
|
||||
$html = $html.Replace('Abkuerz', 'Abkürz'); $html = $html.Replace('abkuerz', 'abkürz')
|
||||
$html = $html.Replace('wuerde', 'würde'); $html = $html.Replace('Wuerde', 'Würde')
|
||||
$html = $html.Replace('muessen', 'müssen'); $html = $html.Replace('Muessen', 'Müssen')
|
||||
$html = $html.Replace('muesste', 'müsste'); $html = $html.Replace('Muesste', 'Müsste')
|
||||
$html = $html.Replace('koennte', 'könnte'); $html = $html.Replace('Koennte', 'Könnte')
|
||||
$html = $html.Replace('fuer ', 'für '); $html = $html.Replace('Fuer ', 'Für ')
|
||||
# oe
|
||||
$html = $html.Replace('Loesung', 'Lösung'); $html = $html.Replace('loesung', 'lösung')
|
||||
$html = $html.Replace('Erhoeh', 'Erhöh'); $html = $html.Replace('erhoeh', 'erhöh')
|
||||
$html = $html.Replace('noetig', 'nötig'); $html = $html.Replace('Noetig', 'Nötig')
|
||||
$html = $html.Replace('moeglich', 'möglich'); $html = $html.Replace('Moeglich', 'Möglich')
|
||||
$html = $html.Replace('geloest', 'gelöst')
|
||||
$html = $html.Replace('hoechst', 'höchst'); $html = $html.Replace('Hoechst', 'Höchst')
|
||||
$html = $html.Replace('koennen', 'können'); $html = $html.Replace('Koennen', 'Können')
|
||||
$html = $html.Replace('Zugehoer', 'Zugehör'); $html = $html.Replace('zugehoer', 'zugehör')
|
||||
$html = $html.Replace('gehoer', 'gehör')
|
||||
# ae
|
||||
$html = $html.Replace('Aenderung', 'Änderung'); $html = $html.Replace('aenderung', 'änderung')
|
||||
$html = $html.Replace('anfaellig', 'anfällig'); $html = $html.Replace('faellig', 'fällig')
|
||||
$html = $html.Replace('faehig', 'fähig')
|
||||
$html = $html.Replace('traeger', 'träger'); $html = $html.Replace('Traeger', 'Träger')
|
||||
$html = $html.Replace('laenger', 'länger'); $html = $html.Replace('Laenger', 'Länger')
|
||||
$html = $html.Replace('erklaer', 'erklär')
|
||||
$html = $html.Replace('klaer', 'klär'); $html = $html.Replace('Klaer', 'Klär')
|
||||
$html = $html.Replace('verstaerk', 'verstärk')
|
||||
$html = $html.Replace('Verstaend', 'Verständ'); $html = $html.Replace('verstaend', 'verständ')
|
||||
$html = $html.Replace('Abhaengig', 'Abhängig'); $html = $html.Replace('abhaengig', 'abhängig')
|
||||
$html = $html.Replace('haeufig', 'häufig'); $html = $html.Replace('Haeufig', 'Häufig')
|
||||
$html = $html.Replace('laeuft', 'läuft'); $html = $html.Replace('Laeuft', 'Läuft')
|
||||
$html = $html.Replace('waere', 'wäre'); $html = $html.Replace('Waere', 'Wäre')
|
||||
$html = $html.Replace('schaerfen', 'schärfen'); $html = $html.Replace('Schaerfen', 'Schärfen')
|
||||
$html = $html.Replace('aufraeumen', 'aufräumen'); $html = $html.Replace('Aufraeumen', 'Aufräumen')
|
||||
$html = $html.Replace('Verlaenger', 'Verlänger'); $html = $html.Replace('verlaenger', 'verlänger')
|
||||
$html = $html.Replace('Naechst', 'Nächst'); $html = $html.Replace('naechst', 'nächst')
|
||||
$html = $html.Replace('Massnahme', 'Maßnahme'); $html = $html.Replace('massnahme', 'maßnahme')
|
||||
$html = $html.Replace('Groesse', 'Größe'); $html = $html.Replace('groesse', 'größe')
|
||||
$html = $html.Replace('gleichmaessig', 'gleichmäßig')
|
||||
$html = $html -replace '([a-z])taet\b', '$1tät'
|
||||
# Schutz aufheben
|
||||
$html = $html.Replace('PROTECT_', '')
|
||||
return $html
|
||||
}
|
||||
|
||||
# Fuer Seitentitel: Echte Unicode-Zeichen (PS5.1 kompatibel via Char-Codes)
|
||||
function Fix-Title($title) {
|
||||
$title = $title.Replace('ue', "$([char]0xFC)")
|
||||
$title = $title.Replace('Ue', "$([char]0xDC)")
|
||||
$title = $title.Replace('oe', "$([char]0xF6)")
|
||||
$title = $title.Replace('Oe', "$([char]0xD6)")
|
||||
$title = $title.Replace('ae', "$([char]0xE4)")
|
||||
$title = $title.Replace('Ae', "$([char]0xC4)")
|
||||
return $title
|
||||
}
|
||||
|
||||
# Test-HTML mit vielen Umlauten
|
||||
$TestHtml = @"
|
||||
<h2>Umlaut-Test</h2>
|
||||
<p>Ueberblick ueber die Qualitaet: Hoechste Prioritaet fuer Massnahmen.</p>
|
||||
<p>Das Team muesste die Komplexitaet verstaendlich erklaeren koennen.</p>
|
||||
<table>
|
||||
<tr><th>Person</th><th>Rolle</th><th>Bewertung</th></tr>
|
||||
<tr><td>Leon Hoerpel</td><td>Dev</td><td>Bug-anfaellig</td></tr>
|
||||
<tr><td>Dominik Ruecker</td><td>Backend Dev</td><td>Verfuegbar</td></tr>
|
||||
<tr><td>Jonas Koehler</td><td>Dev</td><td>Leistungstraeger</td></tr>
|
||||
<tr><td>Sebastian Goendoer</td><td>Dev (ehem. STeam)</td><td>Wenig aktiv</td></tr>
|
||||
<tr><td>Emmanuel Kontcheu Tagne</td><td>Frontend Dev</td><td>KRITISCH</td></tr>
|
||||
</table>
|
||||
<p>Naechste Schritte: Abhaengigkeiten klaeren, Loesungen erhoehen, Verschluesselung pruefen.</p>
|
||||
"@
|
||||
|
||||
# Konvertieren und anzeigen
|
||||
$Converted = Fix-Umlauts $TestHtml
|
||||
|
||||
Write-Host "=== VORHER (Auszug) ===" -ForegroundColor Yellow
|
||||
Write-Host " Ueberblick, Qualitaet, Hoerpel, Goendoer, Emmanuel"
|
||||
Write-Host ""
|
||||
Write-Host "=== NACHHER (Auszug) ===" -ForegroundColor Green
|
||||
# Zeige ein paar konvertierte Stellen
|
||||
if ($Converted -match 'Überblick') { Write-Host " Ueberblick -> OK" -ForegroundColor Green }
|
||||
if ($Converted -match 'Qualität') { Write-Host " Qualitaet -> OK" -ForegroundColor Green }
|
||||
if ($Converted -match 'Hörpel') { Write-Host " Hoerpel -> OK" -ForegroundColor Green }
|
||||
if ($Converted -match 'Göndör') { Write-Host " Goendoer -> OK" -ForegroundColor Green }
|
||||
if ($Converted -match 'Emmanuel') { Write-Host " Emmanuel -> OK (nicht konvertiert)" -ForegroundColor Green }
|
||||
if ($Converted -match 'Maßnahme') { Write-Host " Massnahme -> OK" -ForegroundColor Green }
|
||||
if ($Converted -match 'für ') { Write-Host " fuer -> OK" -ForegroundColor Green }
|
||||
if ($Converted -match 'Abhängig') { Write-Host " Abhaengig -> OK" -ForegroundColor Green }
|
||||
if ($Converted -match 'klär') { Write-Host " klaeren -> OK" -ForegroundColor Green }
|
||||
if ($Converted -match 'Komplexität') { Write-Host " Komplexitaet -> OK" -ForegroundColor Green }
|
||||
|
||||
# Pruefen ob Emmanuel NICHT kaputt ist
|
||||
if ($Converted -match 'E&') { Write-Host " FEHLER: Emmanuel wurde konvertiert!" -ForegroundColor Red }
|
||||
|
||||
Write-Host ""
|
||||
Write-Host ">> Pushe Test-Seite nach Confluence..." -ForegroundColor Yellow
|
||||
|
||||
# Push
|
||||
$SearchUri = "$ApiBase/content?spaceKey=$SpaceKey&title=$([Uri]::EscapeDataString('TEST Umlaut-Pruefung'))&type=page"
|
||||
$SearchResp = Invoke-WebRequest -Uri $SearchUri -Headers $Headers -UseBasicParsing -ErrorAction Stop
|
||||
$SearchData = $SearchResp.Content | ConvertFrom-Json
|
||||
|
||||
if ($SearchData.results -and $SearchData.results.Count -gt 0) {
|
||||
$PageId = $SearchData.results[0].id
|
||||
$VerResp = Invoke-WebRequest -Uri "$ApiBase/content/$PageId`?expand=version" -Headers $Headers -UseBasicParsing
|
||||
$Version = ($VerResp.Content | ConvertFrom-Json).version.number + 1
|
||||
$Body = @{ version = @{ number = $Version }; title = "TEST Umlaut-Pruefung"; type = "page"; body = @{ storage = @{ value = $Converted; representation = "storage" } } } | ConvertTo-Json -Depth 10
|
||||
$Resp = Invoke-WebRequest -Uri "$ApiBase/content/$PageId" -Method Put -Headers $Headers -Body ([System.Text.Encoding]::UTF8.GetBytes($Body)) -UseBasicParsing
|
||||
Write-Host " Aktualisiert: $ConfluenceUrl/pages/viewpage.action?pageId=$PageId" -ForegroundColor Green
|
||||
} else {
|
||||
$Body = @{ type = "page"; title = "TEST Umlaut-Pruefung"; space = @{ key = $SpaceKey }; ancestors = @(@{ id = $ParentPageId }); body = @{ storage = @{ value = $Converted; representation = "storage" } } } | ConvertTo-Json -Depth 10
|
||||
$Resp = Invoke-WebRequest -Uri "$ApiBase/content" -Method Post -Headers $Headers -Body ([System.Text.Encoding]::UTF8.GetBytes($Body)) -UseBasicParsing
|
||||
$NewId = ($Resp.Content | ConvertFrom-Json).id
|
||||
Write-Host " Erstellt: $ConfluenceUrl/pages/viewpage.action?pageId=$NewId" -ForegroundColor Green
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "Pruefe die Seite in Confluence und sag mir ob die Umlaute stimmen!" -ForegroundColor Cyan
|
||||
Reference in New Issue
Block a user