From 9ec917b4611d87b1a72c798bcd0f5a23d22fa972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw=20K=C5=82ys?= Date: Tue, 16 Jun 2026 13:48:03 +0200 Subject: [PATCH] Fix chart number format bracket parsing --- OfficeIMO.Drawing/OfficeChartDrawingRenderer.Text.cs | 11 ++++++++--- OfficeIMO.Tests/Pdf/PdfDocumentChartDrawingTests.cs | 11 +++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/OfficeIMO.Drawing/OfficeChartDrawingRenderer.Text.cs b/OfficeIMO.Drawing/OfficeChartDrawingRenderer.Text.cs index 0d0c69242..691862b9b 100644 --- a/OfficeIMO.Drawing/OfficeChartDrawingRenderer.Text.cs +++ b/OfficeIMO.Drawing/OfficeChartDrawingRenderer.Text.cs @@ -596,6 +596,7 @@ private static string NormalizeDataLabelFormatLiteral(string value) { var builder = new System.Text.StringBuilder(value.Length); bool inQuotedLiteral = false; bool escaped = false; + int nextClosingBracket = value.IndexOf(']'); for (int i = 0; i < value.Length; i++) { char c = value[i]; if (escaped) { @@ -615,9 +616,13 @@ private static string NormalizeDataLabelFormatLiteral(string value) { } if (!inQuotedLiteral && c == '[') { - int close = value.IndexOf(']', i + 1); - if (close > i) { - i = close; + while (nextClosingBracket >= 0 && nextClosingBracket < i) { + nextClosingBracket = value.IndexOf(']', nextClosingBracket + 1); + } + + if (nextClosingBracket > i) { + i = nextClosingBracket; + nextClosingBracket = value.IndexOf(']', nextClosingBracket + 1); continue; } } diff --git a/OfficeIMO.Tests/Pdf/PdfDocumentChartDrawingTests.cs b/OfficeIMO.Tests/Pdf/PdfDocumentChartDrawingTests.cs index e9e380a18..c4d3457a6 100644 --- a/OfficeIMO.Tests/Pdf/PdfDocumentChartDrawingTests.cs +++ b/OfficeIMO.Tests/Pdf/PdfDocumentChartDrawingTests.cs @@ -408,6 +408,17 @@ public void FlowDrawing_AppliesScalingCommasInDataLabelNumberFormats() { Assert.Equal("1,235 K", literalSuffix); } + [Fact] + public void FlowDrawing_IgnoresBracketDirectivesInDataLabelNumberFormatsLinearly() { + MethodInfo method = typeof(OfficeChartDrawingRenderer).GetMethod("FormatDataLabelValue", BindingFlags.NonPublic | BindingFlags.Static)!; + string unmatchedPrefixFormat = new string('[', 4096) + "0"; + string directivePrefix = (string)method.Invoke(null, new object?[] { 123D, "[Red]$0" })!; + string unmatchedPrefix = (string)method.Invoke(null, new object?[] { 123D, unmatchedPrefixFormat })!; + + Assert.Equal("$123", directivePrefix); + Assert.Equal(new string('[', 4096) + "123", unmatchedPrefix); + } + [Fact] public void FlowDrawing_AppliesNumberFormatsToPercentDataLabels() { OfficeDrawing drawing = OfficeChartDrawingRenderer.Render(new OfficeChartSnapshot(