Browse Source

Code refactoring

Marcin Ziąbek 1 year ago
parent
commit
2110a29184

+ 7 - 5
Source/QuestPDF/Drawing/DocumentGenerator.cs

@@ -232,7 +232,7 @@ namespace QuestPDF.Drawing
                 content.ApplyLayoutOverflowDetection();
                 content.Measure(Size.Max);
 
-                var overflowState = content.ExtractElementsOfType<OverflowDebuggingProxy>().FirstOrDefault();
+                var overflowState = content.ExtractElementsOfType<OverflowDebuggingProxy>().Single();
                 overflowState.ApplyLayoutOverflowVisualization();
                 
                 content.ApplyContentDirection();
@@ -247,11 +247,11 @@ namespace QuestPDF.Drawing
                 content.ApplyLayoutOverflowDetection();
                 content.Measure(Size.Max);
                 
-                var overflowState = content.ExtractElementsOfType<OverflowDebuggingProxy>().FirstOrDefault();
-                overflowState.CaptureOriginalValues();
+                var overflowState = content.ExtractElementsOfType<OverflowDebuggingProxy>().Single();
+                overflowState.CaptureOriginalMeasurementValues();
                 overflowState.ApplyLayoutOverflowVisualization();
 
-                var rootCause = overflowState.FindLayoutOverflowVisualization();
+                var rootCause = overflowState.FindElementOfType<LayoutOverflowVisualization>();
                 
                 var stack = rootCause
                     .ExtractAncestors()
@@ -274,7 +274,9 @@ namespace QuestPDF.Drawing
                     $"For example, some elements may require more space than is available. {newParagraph}" +
                     $"To quickly determine the place where the problem is likely occurring, please generate the document with the attached debugger. " +
                     $"The library will generate a PDF document with visually annotated places where layout constraints are invalid. {newParagraph}" +
-                    $"Alternatively, if you don’t want to or cannot attach the debugger, you can set the {nameof(QuestPDF)}.{nameof(Settings)}.{nameof(Settings.EnableDebugging)} flag to true.";
+                    $"Alternatively, if you don’t want to or cannot attach the debugger, you can set the {nameof(QuestPDF)}.{nameof(Settings)}.{nameof(Settings.EnableDebugging)} flag to true. {newParagraph}" +
+                    $"The layout issue is likely present in the following part of the document: {newParagraph}{stack}{newParagraph}" +
+                    $"Please analyse the document measurement to learn more: {newParagraph}{inside}";
                 
                 throw new DocumentLayoutException(message);
             }

+ 6 - 38
Source/QuestPDF/Drawing/Proxy/Helpers.cs → Source/QuestPDF/Drawing/Proxy/LayoutDebugging.cs

@@ -9,7 +9,7 @@ using QuestPDF.Infrastructure;
 
 namespace QuestPDF.Drawing.Proxy;
 
-internal static class Helpers
+internal static class LayoutDebugging
 {
     internal static SpacePlan TryMeasureWithOverflow(this Element element, Size availableSpace)
     {
@@ -145,45 +145,12 @@ internal static class Helpers
         });
     }
 
-    public static void CaptureOriginalValues(this TreeNode<OverflowDebuggingProxy> parent)
+    public static void CaptureOriginalMeasurementValues(this TreeNode<OverflowDebuggingProxy> parent)
     {
         parent.Value.CaptureOriginalValues();
             
         foreach (var child in parent.Children)
-            CaptureOriginalValues(child);
-    }
-
-    public static TreeNode<OverflowDebuggingProxy>? FindLayoutOverflowVisualization(this TreeNode<OverflowDebuggingProxy> element)
-    {
-        TreeNode<OverflowDebuggingProxy> result = null;
-        Traverse(element);
-        return result;
-        
-        void Traverse(TreeNode<OverflowDebuggingProxy> currentElement)
-        {
-            if (currentElement.Value.Child is LayoutOverflowVisualization)
-            {
-                result = currentElement;
-                return;
-            }
-
-            foreach (var child in currentElement.Children)
-                Traverse(child);
-        }
-    }
-    
-    public static ICollection<TreeNode<OverflowDebuggingProxy>> ExtractAncestors(this TreeNode<OverflowDebuggingProxy> element)
-    {
-        var parent = element;
-        var result = new List<TreeNode<OverflowDebuggingProxy>>();
-        
-        while (parent is not null)
-        {
-            result.Add(parent);
-            parent = parent.Parent;
-        }
-
-        return result;
+            CaptureOriginalMeasurementValues(child);
     }
     
     public static string FormatAncestors(this IEnumerable<OverflowDebuggingProxy> ancestors)
@@ -244,7 +211,7 @@ internal static class Helpers
             var indent = indentationCache[indentationLevel];
             
             foreach (var content in Format(proxy))
-                result.AppendLine($"{indent} {content}");
+                result.AppendLine($"{indent}{content}");
             
             result.AppendLine();
             result.AppendLine();
@@ -278,6 +245,8 @@ internal static class Helpers
             
             string SpacePlanDot()
             {
+                var issueIndicator = "🚨"; 
+                
                 return proxy.OriginalSpacePlan.Value.Type switch
                 {
                     SpacePlanType.Wrap => "🔴",
@@ -316,7 +285,6 @@ internal static class Helpers
                     return text;
 
                 return text.Substring(0, maxLength) + "...";
-                //return text.AsSpan(0, maxLength).ToString() + "...";
             }
         }
     }

+ 33 - 0
Source/QuestPDF/Drawing/Proxy/TreeTraversal.cs

@@ -47,4 +47,37 @@ internal static class TreeTraversal
             foreach (var innerChild in Flatten(child))
                 yield return innerChild;
     }
+    
+    public static ICollection<TreeNode<T>> ExtractAncestors<T>(this TreeNode<T> element)
+    {
+        var parent = element;
+        var result = new List<TreeNode<T>>();
+        
+        while (parent is not null)
+        {
+            result.Add(parent);
+            parent = parent.Parent;
+        }
+
+        return result;
+    }
+    
+    public static TreeNode<OverflowDebuggingProxy>? FindElementOfType<TChild>(this TreeNode<OverflowDebuggingProxy> element)
+    {
+        TreeNode<OverflowDebuggingProxy> result = null;
+        Traverse(element);
+        return result;
+        
+        void Traverse(TreeNode<OverflowDebuggingProxy> currentElement)
+        {
+            if (currentElement.Value.Child is TChild)
+            {
+                result = currentElement;
+                return;
+            }
+
+            foreach (var child in currentElement.Children)
+                Traverse(child);
+        }
+    }
 }