public static IReadOnlyList <IAttributedText> CreateParagraphs(this IAttributedText attributedText)
        {
            if (attributedText?.Text == null)
            {
                return(null);
            }

            List <IAttributedText> paragraphs = new List <IAttributedText>();

            int start          = 0;
            int attributeIndex = 0;

            using (var sr = new StringReader(attributedText.Text))
            {
                string line;
                while ((line = sr.ReadLine()) != null)
                {
                    var length = line.Length;

                    var runs = new List <IAttributedTextRun>();
                    attributeIndex = attributedText.CreateParagraphRun(start, length, runs, attributeIndex);

                    var paragraph = new AttributedText(line, runs);
                    paragraphs.Add(paragraph);

                    start += length + 1;
                }
            }

            return(paragraphs);
        }
        internal static List <IAttributedTextRun> OptimizeRuns(this IAttributedText attributedText)
        {
            if (attributedText?.Text == null)
            {
                return(null);
            }

            if (attributedText is AbstractAttributedText abstractAttributedText && abstractAttributedText.Optimal)
            {
                if (attributedText.Runs == null)
                {
                    return(null);
                }

                if (attributedText.Runs is List <IAttributedTextRun> list)
                {
                    return(list);
                }

                return(attributedText.Runs.ToList());
            }

            var start          = 0;
            var attributeIndex = 0;
            var text           = attributedText.Text;
            var length         = text.Length;
            var runs           = new List <IAttributedTextRun>();

            attributedText.CreateParagraphRun(start, length, runs, attributeIndex);
            return(runs);
        }
        public static IAttributedText Optimize(this IAttributedText attributedText)
        {
            if (attributedText?.Text == null)
            {
                return(null);
            }

            if (attributedText is AbstractAttributedText abstractAttributedText && abstractAttributedText.Optimal)
            {
                return(attributedText);
            }

            var start          = 0;
            var attributeIndex = 0;
            var text           = attributedText.Text;
            var length         = text.Length;
            var runs           = new List <IAttributedTextRun>();

            attributedText.CreateParagraphRun(start, length, runs, attributeIndex);
            return(new AttributedText(text, runs, true));
        }