diff --git a/QuestPDF.Examples/TextBenchmark.cs b/QuestPDF.Examples/TextBenchmark.cs index 07942c6..9a9a10d 100644 --- a/QuestPDF.Examples/TextBenchmark.cs +++ b/QuestPDF.Examples/TextBenchmark.cs @@ -128,7 +128,7 @@ namespace QuestPDF.Examples Chapters(stack); - stack.Item().Element(Summary); + stack.Item().Element(Acknowledgements); }); decoration.Footer().Element(Footer); @@ -152,7 +152,7 @@ namespace QuestPDF.Examples { container.Stack(stack => { - SectionTitle(stack, "Table of contents"); + SectionTitle(stack, "Spis treści"); foreach (var chapter in chapters) { @@ -189,19 +189,19 @@ namespace QuestPDF.Examples }); } - void Summary(IContainer container) + void Acknowledgements(IContainer container) { container.Stack(stack => { - SectionTitle(stack, "Acknowledgements"); + SectionTitle(stack, "Podziękowania"); stack.Item().Text(text => { text.DefaultTextStyle(normalStyle); - text.Span("This document was generated based on the book available on the "); + text.Span("Ten dokument został wygenerowany na podstawie książki w formacie TXT opublikowanej w serwisie "); text.ExternalLocation("wolnelektury.pl", "https://wolnelektury.pl/", normalStyle.Color(Colors.Blue.Medium).Underlined()); - text.Span(" website. Thank you!"); + text.Span(". Dziękuję za wspieranie polskiego czytelnictwa!"); }); }); } diff --git a/QuestPDF.Examples/TextExamples.cs b/QuestPDF.Examples/TextExamples.cs index 90bfdae..b257ba6 100644 --- a/QuestPDF.Examples/TextExamples.cs +++ b/QuestPDF.Examples/TextExamples.cs @@ -31,7 +31,9 @@ namespace QuestPDF.Examples text.Span("Then something bigger. ", TextStyle.Default.Size(28).Color(Colors.DeepOrange.Darken2).BackgroundColor(Colors.Yellow.Lighten3).Underlined()); text.Span("And tiny teeny-tiny. ", TextStyle.Default.Size(6)); text.Span("Stroked text also works fine. ", TextStyle.Default.Size(14).Stroked().BackgroundColor(Colors.Grey.Lighten4)); - + + text.Span("0123456789-0123456789-0123456789-0123456789-0123456789-0123456789-0123456789", TextStyle.Default.Size(18)); + text.NewLine(); text.Span("Is it time for lorem ipsum? ", TextStyle.Default.Size(12).Underlined().BackgroundColor(Colors.Grey.Lighten3)); text.Span(Placeholders.LoremIpsum(), TextStyle.Default.Size(12)); diff --git a/QuestPDF/Elements/Text/Calculation/TextLineElement.cs b/QuestPDF/Elements/Text/Calculation/TextLineElement.cs index bccdc6d..5f631db 100644 --- a/QuestPDF/Elements/Text/Calculation/TextLineElement.cs +++ b/QuestPDF/Elements/Text/Calculation/TextLineElement.cs @@ -4,7 +4,7 @@ namespace QuestPDF.Elements.Text.Items { internal class TextLineElement { - public ITextBlockElement Element { get; set; } + public ITextBlockItem Item { get; set; } public TextMeasurementResult Measurement { get; set; } } } \ No newline at end of file diff --git a/QuestPDF/Elements/Text/Calculation/TextMeasurementRequest.cs b/QuestPDF/Elements/Text/Calculation/TextMeasurementRequest.cs index 69278a1..1b358d3 100644 --- a/QuestPDF/Elements/Text/Calculation/TextMeasurementRequest.cs +++ b/QuestPDF/Elements/Text/Calculation/TextMeasurementRequest.cs @@ -9,5 +9,6 @@ namespace QuestPDF.Elements.Text.Calculation public int StartIndex { get; set; } public float AvailableWidth { get; set; } + public bool IsFirstLineElement { get; set; } } } \ No newline at end of file diff --git a/QuestPDF/Elements/Text/Items/ITextBlockElement.cs b/QuestPDF/Elements/Text/Items/ITextBlockItem.cs similarity index 84% rename from QuestPDF/Elements/Text/Items/ITextBlockElement.cs rename to QuestPDF/Elements/Text/Items/ITextBlockItem.cs index f049933..581dcc9 100644 --- a/QuestPDF/Elements/Text/Items/ITextBlockElement.cs +++ b/QuestPDF/Elements/Text/Items/ITextBlockItem.cs @@ -2,7 +2,7 @@ namespace QuestPDF.Elements.Text.Items { - internal interface ITextBlockElement + internal interface ITextBlockItem { TextMeasurementResult? Measure(TextMeasurementRequest request); void Draw(TextDrawingRequest request); diff --git a/QuestPDF/Elements/Text/Items/TextBlockElement.cs b/QuestPDF/Elements/Text/Items/TextBlockElement.cs index af7ed7e..472d803 100644 --- a/QuestPDF/Elements/Text/Items/TextBlockElement.cs +++ b/QuestPDF/Elements/Text/Items/TextBlockElement.cs @@ -4,7 +4,7 @@ using QuestPDF.Infrastructure; namespace QuestPDF.Elements.Text.Items { - internal class TextBlockElement : ITextBlockElement + internal class TextBlockElement : ITextBlockItem { public Element Element { get; set; } = Empty.Instance; diff --git a/QuestPDF/Elements/Text/Items/TextBlockExternalLink.cs b/QuestPDF/Elements/Text/Items/TextBlockExternalLink.cs index 5c9356f..9eac125 100644 --- a/QuestPDF/Elements/Text/Items/TextBlockExternalLink.cs +++ b/QuestPDF/Elements/Text/Items/TextBlockExternalLink.cs @@ -3,7 +3,7 @@ using QuestPDF.Infrastructure; namespace QuestPDF.Elements.Text.Items { - internal class TextBlockExternalLink : ITextBlockElement + internal class TextBlockExternalLink : ITextBlockItem { public TextStyle Style { get; set; } = new TextStyle(); public string Text { get; set; } @@ -23,9 +23,9 @@ namespace QuestPDF.Elements.Text.Items GetItem().Draw(request); } - private TextItem GetItem() + private TextBlockSpan GetItem() { - return new TextItem + return new TextBlockSpan { Style = Style, Text = Text diff --git a/QuestPDF/Elements/Text/Items/TextBlockInternalLink.cs b/QuestPDF/Elements/Text/Items/TextBlockInternalLink.cs index 08b25e7..914cd61 100644 --- a/QuestPDF/Elements/Text/Items/TextBlockInternalLink.cs +++ b/QuestPDF/Elements/Text/Items/TextBlockInternalLink.cs @@ -3,7 +3,7 @@ using QuestPDF.Infrastructure; namespace QuestPDF.Elements.Text.Items { - internal class TextBlockInternalLink : ITextBlockElement + internal class TextBlockInternalLink : ITextBlockItem { public TextStyle Style { get; set; } = new TextStyle(); public string Text { get; set; } @@ -23,9 +23,9 @@ namespace QuestPDF.Elements.Text.Items GetItem().Draw(request); } - private TextItem GetItem() + private TextBlockSpan GetItem() { - return new TextItem + return new TextBlockSpan { Style = Style, Text = Text diff --git a/QuestPDF/Elements/Text/Items/TextBlockPageNumber.cs b/QuestPDF/Elements/Text/Items/TextBlockPageNumber.cs index 8e97313..fda65ac 100644 --- a/QuestPDF/Elements/Text/Items/TextBlockPageNumber.cs +++ b/QuestPDF/Elements/Text/Items/TextBlockPageNumber.cs @@ -3,7 +3,7 @@ using QuestPDF.Infrastructure; namespace QuestPDF.Elements.Text.Items { - internal class TextBlockPageNumber : ITextBlockElement + internal class TextBlockPageNumber : ITextBlockItem { public TextStyle Style { get; set; } = new TextStyle(); public string SlotName { get; set; } @@ -18,7 +18,7 @@ namespace QuestPDF.Elements.Text.Items GetItem(request.PageContext).Draw(request); } - private TextItem GetItem(IPageContext context) + private TextBlockSpan GetItem(IPageContext context) { var pageNumberPlaceholder = 123; @@ -26,7 +26,7 @@ namespace QuestPDF.Elements.Text.Items ? context.GetLocationPage(SlotName) : pageNumberPlaceholder; - return new TextItem + return new TextBlockSpan { Style = Style, Text = pageNumber.ToString() diff --git a/QuestPDF/Elements/Text/Items/TextItem.cs b/QuestPDF/Elements/Text/Items/TextBlockSpan.cs similarity index 88% rename from QuestPDF/Elements/Text/Items/TextItem.cs rename to QuestPDF/Elements/Text/Items/TextBlockSpan.cs index feb3b39..e3656e5 100644 --- a/QuestPDF/Elements/Text/Items/TextItem.cs +++ b/QuestPDF/Elements/Text/Items/TextBlockSpan.cs @@ -6,7 +6,7 @@ using Size = QuestPDF.Infrastructure.Size; namespace QuestPDF.Elements.Text.Items { - internal class TextItem : ITextBlockElement + internal class TextBlockSpan : ITextBlockItem { public string Text { get; set; } public TextStyle Style { get; set; } = new TextStyle(); @@ -39,12 +39,17 @@ namespace QuestPDF.Elements.Text.Items // break text only on spaces if (breakingIndex < text.Length) { - breakingIndex = text.Substring(0, breakingIndex).LastIndexOf(" "); + var lastSpaceIndex = text.Substring(0, breakingIndex).LastIndexOf(" "); - if (breakingIndex <= 0) - return null; - - breakingIndex += 1; + if (lastSpaceIndex <= 0) + { + if (!request.IsFirstLineElement) + return null; + } + else + { + breakingIndex = lastSpaceIndex + 1; + } } text = text.Substring(0, breakingIndex); diff --git a/QuestPDF/Elements/Text/TextBlock.cs b/QuestPDF/Elements/Text/TextBlock.cs index 1b1df3d..e09012e 100644 --- a/QuestPDF/Elements/Text/TextBlock.cs +++ b/QuestPDF/Elements/Text/TextBlock.cs @@ -10,14 +10,14 @@ namespace QuestPDF.Elements.Text internal class TextBlock : Element, IStateResettable { public HorizontalAlignment Alignment { get; set; } = HorizontalAlignment.Left; - public List Children { get; set; } = new List(); + public List Children { get; set; } = new List(); - public Queue RenderingQueue { get; set; } + public Queue RenderingQueue { get; set; } public int CurrentElementIndex { get; set; } public void ResetState() { - RenderingQueue = new Queue(Children); + RenderingQueue = new Queue(Children); CurrentElementIndex = 0; } @@ -39,7 +39,7 @@ namespace QuestPDF.Elements.Text var fullyRenderedItemsCount = lines .SelectMany(x => x.Elements) - .GroupBy(x => x.Element) + .GroupBy(x => x.Item) .Count(x => x.Any(y => y.Measurement.IsLast)); if (fullyRenderedItemsCount == RenderingQueue.Count) @@ -86,7 +86,7 @@ namespace QuestPDF.Elements.Text TotalAscent = line.Ascent }; - item.Element.Draw(textDrawingRequest); + item.Item.Draw(textDrawingRequest); Canvas.Translate(new Position(item.Measurement.Width, 0)); widthOffset += item.Measurement.Width; @@ -105,7 +105,7 @@ namespace QuestPDF.Elements.Text lines .SelectMany(x => x.Elements) - .GroupBy(x => x.Element) + .GroupBy(x => x.Item) .Where(x => x.Any(y => y.Measurement.IsLast)) .Select(x => x.Key) .ToList() @@ -120,7 +120,7 @@ namespace QuestPDF.Elements.Text public IEnumerable DivideTextItemsIntoLines(float availableWidth, float availableHeight) { - var queue = new Queue(RenderingQueue); + var queue = new Queue(RenderingQueue); var currentItemIndex = CurrentElementIndex; var currentHeight = 0f; @@ -157,7 +157,8 @@ namespace QuestPDF.Elements.Text PageContext = PageContext, StartIndex = currentItemIndex, - AvailableWidth = availableWidth - currentWidth + AvailableWidth = availableWidth - currentWidth, + IsFirstLineElement = !currentLineElements.Any() }; var measurementResponse = currentElement.Measure(measurementRequest); @@ -167,7 +168,7 @@ namespace QuestPDF.Elements.Text currentLineElements.Add(new TextLineElement { - Element = currentElement, + Item = currentElement, Measurement = measurementResponse }); diff --git a/QuestPDF/Fluent/TextExtensions.cs b/QuestPDF/Fluent/TextExtensions.cs index b817012..1d6b61d 100644 --- a/QuestPDF/Fluent/TextExtensions.cs +++ b/QuestPDF/Fluent/TextExtensions.cs @@ -40,12 +40,12 @@ namespace QuestPDF.Fluent Spacing = value; } - private void AddItemToLastTextBlock(ITextBlockElement element) + private void AddItemToLastTextBlock(ITextBlockItem item) { if (!TextBlocks.Any()) TextBlocks.Add(new TextBlock()); - TextBlocks.Last().Children.Add(element); + TextBlocks.Last().Children.Add(item); } public void Span(string text, TextStyle? style = null) @@ -57,7 +57,7 @@ namespace QuestPDF.Fluent var items = text .Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries) - .Select(x => new TextItem + .Select(x => new TextBlockSpan { Text = x, Style = style @@ -70,7 +70,7 @@ namespace QuestPDF.Fluent .Skip(1) .Select(x => new TextBlock { - Children = new List { x } + Children = new List { x } }) .ToList() .ForEach(TextBlocks.Add);