From 5340be30453a534129b1d14e7d37219ada49e938 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Jasi=C5=84ski?= Date: Mon, 1 Jun 2026 18:59:13 +0200 Subject: [PATCH] chore(beta-deploy): refactor GlobalIntelligence for AOT/Regex compliance and apply CSS polish --- .../Organisms/GlobalIntelligence.razor | 38 +++++++++++++------ .../Organisms/ReaderCanvas.razor.css | 2 +- .../Layout/ReaderLayout.razor | 2 +- .../Layout/ReaderLayout.razor.css | 2 +- .../Pages/SerilogDemo.razor | 2 + 5 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/NexusReader.UI.Shared/Components/Organisms/GlobalIntelligence.razor b/src/NexusReader.UI.Shared/Components/Organisms/GlobalIntelligence.razor index 15674f9..fa67ad8 100644 --- a/src/NexusReader.UI.Shared/Components/Organisms/GlobalIntelligence.razor +++ b/src/NexusReader.UI.Shared/Components/Organisms/GlobalIntelligence.razor @@ -8,7 +8,6 @@ @namespace NexusReader.UI.Shared.Components.Organisms @inject HttpClient Http @inject IKnowledgeService KnowledgeService -@inject AuthenticationStateProvider AuthStateProvider @inject IReaderNavigationService NavigationService
@@ -169,8 +168,29 @@
@code { + private static readonly System.Text.RegularExpressions.Regex CitationRegex = new( + @"\[Source ID:\s*([^\]]+)\]|\[([a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})\]", + System.Text.RegularExpressions.RegexOptions.IgnoreCase | System.Text.RegularExpressions.RegexOptions.Compiled); + + private static readonly System.Text.RegularExpressions.Regex BoldRegex = new( + @"\*\*(.*?)\*\*", + System.Text.RegularExpressions.RegexOptions.Compiled); + + private static readonly System.Text.RegularExpressions.Regex ItalicRegex = new( + @"\*(.*?)\*", + System.Text.RegularExpressions.RegexOptions.Compiled); + + private static readonly System.Text.RegularExpressions.Regex CodeBlockRegex = new( + @"```(?:[a-zA-Z0-9+#]+)?\s*([\s\S]*?)\s*```", + System.Text.RegularExpressions.RegexOptions.Compiled); + + private static readonly System.Text.RegularExpressions.Regex InlineCodeRegex = new( + @"`(.*?)`", + System.Text.RegularExpressions.RegexOptions.Compiled); + [Parameter] public bool IsOpen { get; set; } [Parameter] public EventCallback OnClose { get; set; } + [Parameter] public string? TenantId { get; set; } private string _question = string.Empty; private bool _isLoading; @@ -245,8 +265,7 @@ ebookId = NavigationService.CurrentEbookId; } - var authState = await AuthStateProvider.GetAuthenticationStateAsync(); - var tenantId = authState.User.FindFirst("TenantId")?.Value ?? "global"; + var tenantId = TenantId ?? "global"; var result = await KnowledgeService.AskQuestionAsync(userQuestion, tenantId, ebookId); if (result.IsSuccess) @@ -293,10 +312,7 @@ var segments = new List(); if (string.IsNullOrEmpty(text)) return segments; - var regex = new System.Text.RegularExpressions.Regex( - @"\[Source ID:\s*([^\]]+)\]|\[([a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})\]", - System.Text.RegularExpressions.RegexOptions.IgnoreCase); - var matches = regex.Matches(text); + var matches = CitationRegex.Matches(text); int lastIndex = 0; foreach (System.Text.RegularExpressions.Match match in matches) @@ -340,10 +356,10 @@ if (string.IsNullOrEmpty(text)) return new MarkupString(string.Empty); var html = System.Net.WebUtility.HtmlEncode(text); - html = System.Text.RegularExpressions.Regex.Replace(html, @"\*\*(.*?)\*\*", "$1"); - html = System.Text.RegularExpressions.Regex.Replace(html, @"\*(.*?)\*", "$1"); - html = System.Text.RegularExpressions.Regex.Replace(html, @"```(?:[a-zA-Z0-9+#]+)?\s*([\s\S]*?)\s*```", "
$1
"); - html = System.Text.RegularExpressions.Regex.Replace(html, @"`(.*?)`", "$1"); + html = BoldRegex.Replace(html, "$1"); + html = ItalicRegex.Replace(html, "$1"); + html = CodeBlockRegex.Replace(html, "
$1
"); + html = InlineCodeRegex.Replace(html, "$1"); html = html.Replace("\n", "
"); return new MarkupString(html); diff --git a/src/NexusReader.UI.Shared/Components/Organisms/ReaderCanvas.razor.css b/src/NexusReader.UI.Shared/Components/Organisms/ReaderCanvas.razor.css index 3d10e86..fac7f04 100644 --- a/src/NexusReader.UI.Shared/Components/Organisms/ReaderCanvas.razor.css +++ b/src/NexusReader.UI.Shared/Components/Organisms/ReaderCanvas.razor.css @@ -372,4 +372,4 @@ .theme-light .nexus-chapter-nav-btn:hover:not(:disabled) { background: rgba(0, 0, 0, 0.06); -} \ No newline at end of file +} diff --git a/src/NexusReader.UI.Shared/Layout/ReaderLayout.razor b/src/NexusReader.UI.Shared/Layout/ReaderLayout.razor index bdf5c70..f802a2b 100644 --- a/src/NexusReader.UI.Shared/Layout/ReaderLayout.razor +++ b/src/NexusReader.UI.Shared/Layout/ReaderLayout.razor @@ -233,7 +233,7 @@ OnAssistantClick="OpenAssistant" Checkpoints="@StateService.CurrentCheckpoints" /> - + } diff --git a/src/NexusReader.UI.Shared/Layout/ReaderLayout.razor.css b/src/NexusReader.UI.Shared/Layout/ReaderLayout.razor.css index 6e97fae..7b633c6 100644 --- a/src/NexusReader.UI.Shared/Layout/ReaderLayout.razor.css +++ b/src/NexusReader.UI.Shared/Layout/ReaderLayout.razor.css @@ -647,4 +647,4 @@ main { overflow-y: auto; } -/* Obsolescence managed: consolidated mobile toolbar and sheet styled inside respective components */ \ No newline at end of file +/* Obsolescence managed: consolidated mobile toolbar and sheet styled inside respective components */ diff --git a/src/NexusReader.UI.Shared/Pages/SerilogDemo.razor b/src/NexusReader.UI.Shared/Pages/SerilogDemo.razor index 8e2efbb..140ae01 100644 --- a/src/NexusReader.UI.Shared/Pages/SerilogDemo.razor +++ b/src/NexusReader.UI.Shared/Pages/SerilogDemo.razor @@ -101,6 +101,8 @@ else } @code { + // Compile-time check ensures _isDebug is baked as false in Release/Test/Production builds, + // which completely bypasses/strips rendering of the diagnostic UI and avoids exposing internal controls. #if DEBUG private readonly bool _isDebug = true; #else