Beispiel #1
0
            public void Should_Replace_Emojis_In_Text()
            {
                // Given, When
                var result = Emoji.Replace("Hello :globe_showing_europe_africa:!");

                // Then
                result.ShouldBe("Hello 🌍!");
            }
Beispiel #2
0
        public static Paragraph Parse(string text, Style?style = null)
        {
            if (text is null)
            {
                throw new ArgumentNullException(nameof(text));
            }

            style ??= Style.Plain;

            var result = new Paragraph();

            using var tokenizer = new MarkupTokenizer(text);

            var stack = new Stack <Style>();

            while (tokenizer.MoveNext())
            {
                var token = tokenizer.Current;
                if (token == null)
                {
                    break;
                }

                if (token.Kind == MarkupTokenKind.Open)
                {
                    var parsedStyle = StyleParser.Parse(token.Value);
                    stack.Push(parsedStyle);
                }
                else if (token.Kind == MarkupTokenKind.Close)
                {
                    if (stack.Count == 0)
                    {
                        throw new InvalidOperationException($"Encountered closing tag when none was expected near position {token.Position}.");
                    }

                    stack.Pop();
                }
                else if (token.Kind == MarkupTokenKind.Text)
                {
                    // Get the effecive style.
                    var effectiveStyle = style.Combine(stack.Reverse());
                    result.Append(Emoji.Replace(token.Value), effectiveStyle);
                }
                else
                {
                    throw new InvalidOperationException("Encountered unkown markup token.");
                }
            }

            if (stack.Count > 0)
            {
                throw new InvalidOperationException("Unbalanced markup stack. Did you forget to close a tag?");
            }

            return(result);
        }