feat: integrate AI-driven selection panel with context-aware text summarization and quiz generation features.

This commit is contained in:
2026-04-26 20:36:08 +02:00
parent 82d726097f
commit 39a9ca5706
25 changed files with 819 additions and 219 deletions
@@ -0,0 +1,69 @@
using System.Text;
using System.Text.RegularExpressions;
namespace NexusReader.Infrastructure.Helpers;
public static class JsonRepairHelper
{
public static string Repair(string json)
{
if (string.IsNullOrWhiteSpace(json)) return json;
json = json.Trim();
// 1. If it doesn't end with } or ], it's definitely truncated
if (!json.EndsWith("}") && !json.EndsWith("]"))
{
// Try to find the last "clean" closing point before the truncation
// We look for a comma, a closing brace, or a closing bracket that is followed by noise
int lastGoodComma = json.LastIndexOf(',');
int lastGoodBrace = json.LastIndexOf('}');
int lastGoodBracket = json.LastIndexOf(']');
int cutoff = Math.Max(lastGoodComma, Math.Max(lastGoodBrace, lastGoodBracket));
if (cutoff > 0)
{
// Prune the "garbage" at the end
json = json.Substring(0, cutoff);
}
// Now apply the standard stack-based closing logic
var stack = new Stack<char>();
bool inString = false;
bool escaped = false;
foreach (char c in json)
{
if (escaped) { escaped = false; continue; }
if (c == '\\') { escaped = true; continue; }
if (c == '"') { inString = !inString; continue; }
if (inString) continue;
if (c == '{' || c == '[') stack.Push(c);
else if (c == '}' || c == ']')
{
if (stack.Count > 0)
{
var last = stack.Peek();
if ((c == '}' && last == '{') || (c == ']' && last == '['))
stack.Pop();
}
}
}
var builder = new StringBuilder(json);
if (inString) builder.Append('"');
while (stack.Count > 0)
{
var c = stack.Pop();
if (c == '{') builder.Append("}");
else if (c == '[') builder.Append("]");
}
return builder.ToString();
}
return json;
}
}