Exemple #1
0
        private Inline MakeBig(ParsedChunk arg)
        {
            var toReturn = new Span(WrapInRun(arg.InnerText));

            toReturn.FontSize = ApplicationSettings.FontSize * 1.5;
            return(toReturn);
        }
Exemple #2
0
 private Span MakeStrikeThrough(ParsedChunk arg)
 {
     return(new Span(WrapInRun(arg.InnerText))
     {
         TextDecorations = TextDecorations.Strikethrough
     });
 }
Exemple #3
0
        private Inline MakeSubscript(ParsedChunk arg)
        {
            var small = MakeSmall(arg);

            small.BaselineAlignment = BaselineAlignment.Subscript;
            return(small);
        }
Exemple #4
0
        private Span MakeColor(ParsedChunk arg)
        {
            var colorString = arg.Arguments;

            if (!ApplicationSettings.AllowColors || colorString == null)
            {
                return(MakeNormalText(arg));
            }

            try
            {
                var brush = new BrushConverter().ConvertFromString(colorString) as SolidColorBrush;

                return(brush == null
                    ? new Span()
                    : new Span {
                    Foreground = brush
                });
            }

            catch (FormatException)
            {
            }

            return(new Span());
        }
Exemple #5
0
        private Inline MakeBlockWithAlignment(ParsedChunk arg, TextAlignment alignment, Thickness thickness)
        {
            if (arg.Children == null || !arg.Children.Any())
            {
                return(MakeNormalText(arg));
            }

            var container = new InlineUIContainer();
            var panel     = new StackPanel();
            var text      = new TextBlock
            {
                Foreground    = Locator.Find <SolidColorBrush>("ForegroundBrush"),
                Margin        = thickness,
                TextWrapping  = TextWrapping.Wrap,
                TextAlignment = alignment
            };

            TextBlockHelper.SetInlineList(text, arg.Children.Select(ToInline).ToList());

            panel.Children.Add(text);
            panel.Children.Add(new Line
            {
                Stretch = Stretch.Fill,
                X2      = 1,
                Stroke  = new SolidColorBrush(Colors.Transparent)
            });

            container.Child = panel;
            arg.Children.Clear();
            return(container);
        }
Exemple #6
0
        private Inline MakeCenterText(ParsedChunk arg)
        {
            var padding = ApplicationSettings.AllowIndent ? 15 : 0;

            return(ApplicationSettings.AllowAlignment
                ? MakeBlockWithAlignment(arg, TextAlignment.Center, new Thickness(padding, 0, padding, 0))
                : MakeNormalText(arg));
        }
Exemple #7
0
 private Inline MakeHorizontalRule(ParsedChunk arg)
 {
     return(new InlineUIContainer(new Line
     {
         Stretch = Stretch.Fill,
         X2 = 1,
         Margin = new Thickness(0, 5, 0, 5),
         Stroke = Locator.Find <SolidColorBrush>("HighlightBrush")
     }));
 }
Exemple #8
0
        private Inline ToInline(ParsedChunk chunk)
        {
            var converters = new Dictionary <BbCodeType, Func <ParsedChunk, Inline> >
            {
                { BbCodeType.Bold, MakeBold },
                { BbCodeType.Italic, MakeItalic },
                { BbCodeType.Underline, MakeUnderline },
                { BbCodeType.Url, MakeUrl },
                { BbCodeType.None, MakeNormalText },
                { BbCodeType.Color, MakeColor },
                { BbCodeType.Strikethrough, MakeStrikeThrough },
                { BbCodeType.Session, MakeSession },
                { BbCodeType.Channel, MakeChannel },
                { BbCodeType.Big, MakeBig },
                { BbCodeType.Small, MakeSmall },
                { BbCodeType.Subscript, MakeSubscript },
                { BbCodeType.Superscript, MakeSuperscript },
                { BbCodeType.User, MakeUser },
                { BbCodeType.NoParse, MakeNormalText },
                { BbCodeType.Icon, MakeIcon },
                { BbCodeType.EIcon, MakeEIcon },
                { BbCodeType.Collapse, MakeCollapse },
                { BbCodeType.Quote, MakeQuote },
                { BbCodeType.HorizontalRule, MakeHorizontalRule },
                { BbCodeType.Indent, MakeIndentText },
                { BbCodeType.Heading, MakeHeading },
                { BbCodeType.Justify, MakeNormalText },
                { BbCodeType.Right, MakeRightText },
                { BbCodeType.Center, MakeCenterText },
                { BbCodeType.Left, MakeBlockText }
            };

            var    converter = converters[chunk.Type];
            Inline toReturn;

            try
            {
                toReturn = converter(chunk);
            }
            catch
            {
                toReturn = MakeNormalText(chunk);
            }

            var span = toReturn as Span;

            if (chunk.Children?.Any() ?? false)
            {
                span?.Inlines.AddRange(chunk.Children.Select(ToInline));
            }

            return(toReturn);
        }
Exemple #9
0
        private Inline MakeSession(ParsedChunk arg)
        {
            if (arg.Children == null || !arg.Children.Any() || string.IsNullOrEmpty(arg.Arguments))
            {
                return(MakeNormalText(arg));
            }

            var channel = MakeChannelLink(ChatModel.FindChannel(arg.Children.First().InnerText, arg.Arguments));

            arg.Children.Clear();
            return(channel);
        }
Exemple #10
0
        private Inline MakeUser(ParsedChunk arg)
        {
            if (arg.Children != null && arg.Children.Any())
            {
                var user = MakeUsernameLink(characters.Find(arg.Children.First().InnerText));
                arg.Children.Clear();
                return(user);
            }

            return(!string.IsNullOrEmpty(arg.Arguments)
                ? MakeUsernameLink(characters.Find(arg.Arguments))
                : MakeNormalText(arg));
        }
Exemple #11
0
        private Inline MakeChannel(ParsedChunk arg)
        {
            if (arg.Children != null && arg.Children.Any())
            {
                var channel = MakeChannelLink(ChatModel.FindChannel(arg.Children.First().InnerText));
                arg.Children.Clear();
                return(channel);
            }

            return(!string.IsNullOrEmpty(arg.Arguments)
                ? MakeChannelLink(ChatModel.FindChannel(arg.Arguments))
                : MakeNormalText(arg));
        }
Exemple #12
0
        private Inline MakeQuote(ParsedChunk arg)
        {
            var container = new InlineUIContainer();

            var text = new TextBlock
            {
                Foreground   = Locator.Find <SolidColorBrush>("ForegroundBrush"),
                Opacity      = 0.8,
                Margin       = new Thickness(50, 5, 0, 5),
                TextWrapping = TextWrapping.Wrap
            };

            TextBlockHelper.SetInlineList(text, arg.Children.Select(ToInline).ToList());

            container.Child = text;
            arg.Children.Clear();
            return(container);
        }
Exemple #13
0
        private Span MakeUrl(ParsedChunk arg)
        {
            if (arg.Arguments == null && arg.Children == null)
            {
                return(MakeNormalText(arg));
            }

            var url     = arg.Arguments;
            var display = arg.Children != null
                ? arg.Children.First().InnerText
                : GetUrlDisplay(arg.Arguments);

            if (url == null)
            {
                url     = arg.InnerText;
                display = arg.Children != null
                    ? GetUrlDisplay(arg.Children.First().InnerText)
                    : string.Empty;
            }

            if (url == null && arg.Children != null)
            {
                url = arg.Children.First().InnerText;
            }

            arg.Children?.Clear();

            var contextMenu      = new ContextMenu();
            var menuItemCopyLink = new MenuItem
            {
                CommandParameter = url,
                Style            = Locator.FindStyle("MenuItemCopy")
            };

            contextMenu.Items.Add(menuItemCopyLink);

            return(new Hyperlink(WrapInRun(display))
            {
                CommandParameter = url,
                ToolTip = url,
                ContextMenu = contextMenu,
                Style = Locator.FindStyle("Hyperlink")
            });
        }
Exemple #14
0
        private Span MakeHeading(ParsedChunk arg)
        {
            var toReturn = new Span
            {
                Foreground = Locator.Find <SolidColorBrush>("ContrastBrush")
            };

            toReturn.FontSize *= 2;
            SpanHelper.SetInlineSource(toReturn, arg.Children.Select(ToInline).ToList());

            toReturn.Inlines.Add(new Line
            {
                Stretch = Stretch.Fill,
                X2      = 1,
                Stroke  = new SolidColorBrush(Colors.Transparent)
            });

            arg.Children.Clear();
            return(toReturn);
        }
Exemple #15
0
        private Inline MakeEIcon(ParsedChunk arg)
        {
            if (!ApplicationSettings.AllowIcons)
            {
                return(new Span());
            }

            if (arg.Children != null && arg.Children.Any())
            {
                var target = arg.Children.First().InnerText;
                var icon   = MakeEIcon(target);

                arg.Children.Clear();
                return(icon);
            }

            return(!string.IsNullOrEmpty(arg.Arguments)
                ? MakeIcon(characters.Find(arg.Arguments))
                : MakeNormalText(arg));
        }
Exemple #16
0
        internal static ParsedChunk FromTag(BbTag tag, string context)
        {
            var last     = tag.ClosingTag?.End ?? tag.End;
            var toReturn = new ParsedChunk
            {
                Start     = tag.Start,
                End       = last,
                Type      = tag.Type,
                Arguments = tag.Arguments
            };

            if (tag.Children != null && tag.Children.Any())
            {
                toReturn.Children = tag.Children.Select(x => FromTag(x, context)).ToList();
            }

            if (tag.Type == BbCodeType.None)
            {
                toReturn.InnerText = context.Substring(tag.Start, tag.End - tag.Start);
            }

            return(toReturn);
        }
Exemple #17
0
        private Inline MakeCollapse(ParsedChunk arg)
        {
            var title = arg.Arguments;

            var container = new InlineUIContainer();
            var panel     = new StackPanel();

            var expander = new Expander
            {
                Header  = title,
                Margin  = new Thickness(0),
                Padding = new Thickness(0)
            };

            var text = new TextBlock
            {
                Foreground   = Locator.Find <SolidColorBrush>("ForegroundBrush"),
                TextWrapping = TextWrapping.Wrap,
                Margin       = new Thickness(25, 0, 0, 0)
            };

            TextBlockHelper.SetInlineList(text, arg.Children.Select(ToInline).ToList());

            expander.Content = text;
            panel.Children.Add(expander);
            panel.Children.Add(new Line
            {
                Stretch = Stretch.Fill,
                X2      = 1,
                Stroke  = new SolidColorBrush(Colors.Transparent)
            });
            container.Child = panel;

            arg.Children.Clear();
            return(container);
        }
 private Inline MakeBlockText(ParsedChunk arg)
 {
     return MakeBlockWithAlignment(arg, TextAlignment.Left, new Thickness(0));
 }
        private Inline MakeEIcon(ParsedChunk arg)
        {
            if (!ApplicationSettings.AllowIcons) return new Span();

            if (arg.Children != null && arg.Children.Any())
            {
                var target = arg.Children.First().InnerText;
                var icon = MakeEIcon(target);

                arg.Children.Clear();
                return icon;
            }

            return !string.IsNullOrEmpty(arg.Arguments)
                ? MakeIcon(characters.Find(arg.Arguments))
                : MakeNormalText(arg);
        }
Exemple #20
0
 private static Span MakeItalic(ParsedChunk arg)
 {
     return new Italic(WrapInRun(arg.InnerText));
 }
        private Inline MakeQuote(ParsedChunk arg)
        {
            var container = new InlineUIContainer();

            var text = new TextBlock
            {
                Foreground = Locator.Find<SolidColorBrush>("ForegroundBrush"),
                Opacity = 0.8,
                Margin = new Thickness(50, 5, 0, 5),
                TextWrapping = TextWrapping.Wrap
            };
            TextBlockHelper.SetInlineList(text, arg.Children.Select(ToInline).ToList());

            container.Child = text;
            arg.Children.Clear();
            return container;
        }
Exemple #22
0
 private static Span MakeBold(ParsedChunk arg)
 {
     return(new Bold(WrapInRun(arg.InnerText)));
 }
        private Span MakeHeading(ParsedChunk arg)
        {
            var toReturn = new Span
            {
                Foreground = Locator.Find<SolidColorBrush>("ContrastBrush")
            };
            toReturn.FontSize *= 2;
            SpanHelper.SetInlineSource(toReturn, arg.Children.Select(ToInline).ToList());

            toReturn.Inlines.Add(new Line
            {
                Stretch = Stretch.Fill,
                X2 = 1,
                Stroke = new SolidColorBrush(Colors.Transparent)
            });

            arg.Children.Clear();
            return toReturn;
        }
Exemple #24
0
 private static Span MakeNormalText(ParsedChunk arg)
 {
     return(new Span(WrapInRun(arg.InnerText)));
 }
Exemple #25
0
 private Span MakeStrikeThrough(ParsedChunk arg)
 {
     return new Span(WrapInRun(arg.InnerText)) {TextDecorations = TextDecorations.Strikethrough};
 }
Exemple #26
0
        internal static ParsedChunk FromTag(BbTag tag, string context)
        {
            var last = tag.ClosingTag != null ? tag.ClosingTag.End : tag.End;
            var toReturn = new ParsedChunk
                {
                    Start = tag.Start,
                    End = last,
                    Type = tag.Type,
                    Arguments = tag.Arguments
                };

            if (tag.Children != null && tag.Children.Any())
                toReturn.Children = tag.Children.Select(x => FromTag(x, context)).ToList();

            if (tag.Type == BbCodeType.None)
                toReturn.InnerText = context.Substring(tag.Start, tag.End - tag.Start);

            return toReturn;
        }
Exemple #27
0
 private Inline MakeSession(ParsedChunk arg)
 {
     var channel = MakeChannelLink(ChatModel.FindChannel(arg.Children.First().InnerText, arg.Arguments));
     arg.Children.Clear();
     return channel;
 }
Exemple #28
0
 private Inline MakeSmall(ParsedChunk arg)
 {
     return new Span(WrapInRun(arg.InnerText)) {FontSize = 9};
 }
Exemple #29
0
        private Span MakeColor(ParsedChunk arg)
        {
            var colorString = arg.Arguments;

            if (!ApplicationSettings.AllowColors || colorString == null)
                return MakeNormalText(arg);

            try
            {
                var brush = new BrushConverter().ConvertFromString(colorString) as SolidColorBrush;

                return brush == null
                    ? new Span()
                    : new Span {Foreground = brush};
            }

            catch (FormatException)
            {
            }

            return new Span();
        }
Exemple #30
0
 private static Span MakeUnderline(ParsedChunk arg)
 {
     return new Underline(WrapInRun(arg.InnerText));
 }
Exemple #31
0
 private static Span MakeNormalText(ParsedChunk arg)
 {
     return new Span(WrapInRun(arg.InnerText));
 }
        private Span MakeUrl(ParsedChunk arg)
        {
            if (arg.Arguments == null && arg.Children == null) return MakeNormalText(arg);

            var url = arg.Arguments;
            var display = arg.Children != null
                ? arg.Children.First().InnerText
                : GetUrlDisplay(arg.Arguments);

            if (url == null)
            {
                url = arg.InnerText;
                display = arg.Children != null
                    ? GetUrlDisplay(arg.Children.First().InnerText)
                    : string.Empty;
            }

            if (url == null && arg.Children != null)
            {
                url = arg.Children.First().InnerText;
            }

            arg.Children?.Clear();

            var contextMenu = new ContextMenu();
            var menuItemCopyLink = new MenuItem
            {
                CommandParameter = url,
                Style = Locator.FindStyle("MenuItemCopy")
            };
            contextMenu.Items.Add(menuItemCopyLink);

            return new Hyperlink(WrapInRun(display))
            {
                CommandParameter = url,
                ToolTip = url,
                ContextMenu = contextMenu,
                Style = Locator.FindStyle("Hyperlink")
            };
        }
        private Inline MakeCenterText(ParsedChunk arg)
        {
            var padding = ApplicationSettings.AllowIndent ? 15 : 0;

            return ApplicationSettings.AllowAlignment
                ? MakeBlockWithAlignment(arg, TextAlignment.Center, new Thickness(padding, 0, padding, 0))
                : MakeNormalText(arg);
        }
        private Inline MakeChannel(ParsedChunk arg)
        {
            if (arg.Children != null && arg.Children.Any())
            {
                var channel = MakeChannelLink(ChatModel.FindChannel(arg.Children.First().InnerText));
                arg.Children.Clear();
                return channel;
            }

            return !string.IsNullOrEmpty(arg.Arguments)
                ? MakeChannelLink(ChatModel.FindChannel(arg.Arguments))
                : MakeNormalText(arg);
        }
Exemple #35
0
 private Inline MakeIndentText(ParsedChunk arg)
 {
     return(MakeBlockWithAlignment(arg, TextAlignment.Left,
                                   new Thickness(ApplicationSettings.AllowIndent ? 15 : 0, 0, 0, 0)));
 }
 private Inline MakeBig(ParsedChunk arg)
 {
     var toReturn = new Span(WrapInRun(arg.InnerText));
     toReturn.FontSize = ApplicationSettings.FontSize * 1.5;
     return toReturn;
 }
        private Inline MakeCollapse(ParsedChunk arg)
        {
            var title = arg.Arguments;

            var container = new InlineUIContainer();
            var panel = new StackPanel();

            var expander = new Expander
            {
                Header = title,
                Margin = new Thickness(0),
                Padding = new Thickness(0)
            };

            var text = new TextBlock
            {
                Foreground = Locator.Find<SolidColorBrush>("ForegroundBrush"),
                TextWrapping = TextWrapping.Wrap,
                Margin = new Thickness(25, 0, 0, 0)
            };
            TextBlockHelper.SetInlineList(text, arg.Children.Select(ToInline).ToList());

            expander.Content = text;
            panel.Children.Add(expander);
            panel.Children.Add(new Line
            {
                Stretch = Stretch.Fill,
                X2 = 1,
                Stroke = new SolidColorBrush(Colors.Transparent)
            });
            container.Child = panel;

            arg.Children.Clear();
            return container;
        }
 private Inline MakeHorizontalRule(ParsedChunk arg)
 {
     return new InlineUIContainer(new Line
     {
         Stretch = Stretch.Fill,
         X2 = 1,
         Margin = new Thickness(0, 5, 0, 5),
         Stroke = Locator.Find<SolidColorBrush>("HighlightBrush")
     });
 }
 private Inline MakeRightText(ParsedChunk arg)
 {
     return ApplicationSettings.AllowAlignment
         ? MakeBlockWithAlignment(arg, TextAlignment.Right, new Thickness(0))
         : MakeNormalText(arg);
 }
Exemple #40
0
 private static Span MakeUnderline(ParsedChunk arg)
 {
     return(new Underline(WrapInRun(arg.InnerText)));
 }
        private Inline MakeBlockWithAlignment(ParsedChunk arg, TextAlignment alignment, Thickness thickness)
        {
            if (arg.Children == null || !arg.Children.Any()) return MakeNormalText(arg);

            var container = new InlineUIContainer();
            var panel = new StackPanel();
            var text = new TextBlock
            {
                Foreground = Locator.Find<SolidColorBrush>("ForegroundBrush"),
                Margin = thickness,
                TextWrapping = TextWrapping.Wrap,
                TextAlignment = alignment
            };
            TextBlockHelper.SetInlineList(text, arg.Children.Select(ToInline).ToList());

            panel.Children.Add(text);
            panel.Children.Add(new Line
            {
                Stretch = Stretch.Fill,
                X2 = 1,
                Stroke = new SolidColorBrush(Colors.Transparent)
            });

            container.Child = panel;
            arg.Children.Clear();
            return container;
        }
Exemple #42
0
 private static Span MakeItalic(ParsedChunk arg)
 {
     return(new Italic(WrapInRun(arg.InnerText)));
 }
 private Inline MakeIndentText(ParsedChunk arg)
 {
     return MakeBlockWithAlignment(arg, TextAlignment.Left,
         new Thickness(ApplicationSettings.AllowIndent ? 15 : 0, 0, 0, 0));
 }
Exemple #44
0
 private Inline MakeRightText(ParsedChunk arg)
 {
     return(ApplicationSettings.AllowAlignment
         ? MakeBlockWithAlignment(arg, TextAlignment.Right, new Thickness(0))
         : MakeNormalText(arg));
 }
Exemple #45
0
 private static Span MakeBold(ParsedChunk arg)
 {
     return new Bold(WrapInRun(arg.InnerText));
 }
        private Inline MakeUser(ParsedChunk arg)
        {
            if (arg.Children != null && arg.Children.Any())
            {
                var user = MakeUsernameLink(characters.Find(arg.Children.First().InnerText));
                arg.Children.Clear();
                return user;
            }

            return !string.IsNullOrEmpty(arg.Arguments)
                ? MakeUsernameLink(characters.Find(arg.Arguments))
                : MakeNormalText(arg);
        }
Exemple #47
0
 private Inline MakeUser(ParsedChunk arg)
 {
     var user = MakeUsernameLink(characterManager.Find(arg.Children.First().InnerText));
     arg.Children.Clear();
     return user;
 }
Exemple #48
0
 private Inline MakeBlockText(ParsedChunk arg)
 {
     return(MakeBlockWithAlignment(arg, TextAlignment.Left, new Thickness(0)));
 }
Exemple #49
0
        private Inline ToInline(ParsedChunk chunk)
        {
            var converters = new Dictionary<BbCodeType, Func<ParsedChunk, Inline>>
                {
                    {BbCodeType.Bold, MakeBold},
                    {BbCodeType.Italic, MakeItalic},
                    {BbCodeType.Underline, MakeUnderline},
                    {BbCodeType.Url, MakeUrl},
                    {BbCodeType.None, MakeNormalText},
                    {BbCodeType.Color, MakeColor},
                    {BbCodeType.Strikethrough, MakeStrikeThrough},
                    {BbCodeType.Session, MakeSession},
                    {BbCodeType.Channel, MakeChannel},
                    {BbCodeType.Big, MakeBig},
                    {BbCodeType.Small, MakeSmall},
                    {BbCodeType.Subscript, MakeSubscript},
                    {BbCodeType.Superscript, MakeSuperscript},
                    {BbCodeType.User, MakeUser},
                    {BbCodeType.NoParse, MakeNormalText}
                };

            var converter = converters[chunk.Type];
            var toReturn = converter(chunk);

            var span = toReturn as Span;
            if (chunk.Children != null && chunk.Children.Any() && span != null)
                span.Inlines.AddRange(chunk.Children.Select(ToInline));

            return toReturn;
        }
Exemple #50
0
 private Inline MakeSuperscript(ParsedChunk arg)
 {
     var small = MakeSmall(arg);
     small.BaselineAlignment = BaselineAlignment.Superscript;
     return small;
 }
        private Inline MakeSession(ParsedChunk arg)
        {
            if (arg.Children == null || !arg.Children.Any() || string.IsNullOrEmpty(arg.Arguments))
                return MakeNormalText(arg);

            var channel = MakeChannelLink(ChatModel.FindChannel(arg.Children.First().InnerText, arg.Arguments));
            arg.Children.Clear();
            return channel;
        }
Exemple #52
0
        private Span MakeUrl(ParsedChunk arg)
        {
            var url = arg.Arguments;
            var display = arg.Children != null
                ? arg.Children.First().InnerText
                : GetUrlDisplay(arg.Arguments);

            if (url == null)
            {
                url = arg.InnerText ?? string.Empty;
                display = arg.Children != null
                    ? GetUrlDisplay(arg.Children.First().InnerText)
                    : string.Empty;
            }

            if (arg.Children != null)
                arg.Children.Clear();

            return new Hyperlink(WrapInRun(display))
                {
                    CommandParameter = url,
                    ToolTip = url,
                    Style = Locator.FindStyle("Hyperlink")
                };
        }
        private Inline ToInline(ParsedChunk chunk)
        {
            var converters = new Dictionary<BbCodeType, Func<ParsedChunk, Inline>>
            {
                {BbCodeType.Bold, MakeBold},
                {BbCodeType.Italic, MakeItalic},
                {BbCodeType.Underline, MakeUnderline},
                {BbCodeType.Url, MakeUrl},
                {BbCodeType.None, MakeNormalText},
                {BbCodeType.Color, MakeColor},
                {BbCodeType.Strikethrough, MakeStrikeThrough},
                {BbCodeType.Session, MakeSession},
                {BbCodeType.Channel, MakeChannel},
                {BbCodeType.Big, MakeBig},
                {BbCodeType.Small, MakeSmall},
                {BbCodeType.Subscript, MakeSubscript},
                {BbCodeType.Superscript, MakeSuperscript},
                {BbCodeType.User, MakeUser},
                {BbCodeType.NoParse, MakeNormalText},
                {BbCodeType.Icon, MakeIcon},
                {BbCodeType.EIcon, MakeEIcon},
                {BbCodeType.Collapse, MakeCollapse},
                {BbCodeType.Quote, MakeQuote},
                {BbCodeType.HorizontalRule, MakeHorizontalRule},
                {BbCodeType.Indent, MakeIndentText},
                {BbCodeType.Heading, MakeHeading},
                {BbCodeType.Justify, MakeNormalText},
                {BbCodeType.Right, MakeRightText},
                {BbCodeType.Center, MakeCenterText},
                {BbCodeType.Left, MakeBlockText}
            };

            var converter = converters[chunk.Type];
            Inline toReturn;
            try
            {
                toReturn = converter(chunk);
            }
            catch
            {
                toReturn = MakeNormalText(chunk);
            }

            var span = toReturn as Span;
            if (chunk.Children?.Any() ?? false)
                span?.Inlines.AddRange(chunk.Children.Select(ToInline));

            return toReturn;
        }