[
  {
    "path": ".gitattributes",
    "content": "# Auto detect text files and perform LF normalization\n* text=auto\n\n# Custom for Visual Studio\n*.cs     diff=csharp\n*.sln    merge=union\n*.csproj merge=union\n*.vbproj merge=union\n*.fsproj merge=union\n*.dbproj merge=union\n\n# Standard to msysgit\n*.doc\t diff=astextplain\n*.DOC\t diff=astextplain\n*.docx diff=astextplain\n*.DOCX diff=astextplain\n*.dot  diff=astextplain\n*.DOT  diff=astextplain\n*.pdf  diff=astextplain\n*.PDF\t diff=astextplain\n*.rtf\t diff=astextplain\n*.RTF\t diff=astextplain\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: .NET\n\non:\n  pull_request:\n    branches: [ master ]\n  workflow_dispatch:\n\njobs:\n  build:\n    runs-on: windows-latest\n\n    strategy:\n      matrix:\n        versions: [ 12.0.0, 12.0.1 ]\n\n    steps:\n    - uses: actions/checkout@v2\n      with:\n          submodules: 'true'\n    - name: Clean\n      run: dotnet clean\n      env:\n        AVA_VER: ${{ matrix.versions }}\n    - name: Restore\n      run: dotnet restore\n      env:\n        AVA_VER: ${{ matrix.versions }}\n    - name: Build\n      run: dotnet build --no-restore\n      env:\n        AVA_VER: ${{ matrix.versions }}\n    - name: Test\n      run: dotnet test --no-build --verbosity normal\n      env:\n        AVA_VER: ${{ matrix.versions }}\n"
  },
  {
    "path": ".gitignore",
    "content": "#################\n## Eclipse\n#################\n\n*.pydevproject\n.project\n.metadata\nbin/\ntmp/\n*.tmp\n*.bak\n*.swp\n*~.nib\nlocal.properties\n.classpath\n.settings/\n.loadpath\n\n# External tool builders\n.externalToolBuilders/\n\n# Locally stored \"Eclipse launch configurations\"\n*.launch\n\n# CDT-specific\n.cproject\n\n# PDT-specific\n.buildpath\n\n\n#################\n## Visual Studio\n#################\n\n## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n.vs\npackages\n\n# User-specific files\n*.suo\n*.user\n*.sln.docstates\n\n# Build results\n[Dd]ebug/\n[Rr]elease/\n*_i.c\n*_p.c\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.vspscc\n.builds\n*.dotCover\n\n## TODO: If you have NuGet Package Restore enabled, uncomment this\n#packages/\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opensdf\n*.sdf\n\n# Visual Studio profiler\n*.psess\n*.vsp\n\n# ReSharper is a .NET coding add-in\n_ReSharper*\n\n# Installshield output folder\n[Ee]xpress\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish\n\n# Others\n[Bb]in\n[Oo]bj\nsql\nTestResults\n*.Cache\nClientBin\nstylecop.*\n~$*\n*.dbmdl\nGenerated_Code #added for RIA/Silverlight projects\n\n# Backup & report files from converting an old project file to a newer\n# Visual Studio version. Backup files are not needed, because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\n\n\n\n############\n## Windows\n############\n\n# Windows image file caches\nThumbs.db\n\n# Folder config file\nDesktop.ini\n\n\n#############\n## Python\n#############\n\n*.py[co]\n\n# Packages\n*.egg\n*.egg-info\ndist\nbuild\neggs\nparts\nbin\nvar\nsdist\ndevelop-eggs\n.installed.cfg\n\n# Installer logs\npip-log.txt\n\n# Unit test / coverage reports\n.coverage\n.tox\n\n#Translations\n*.mo\n\n#Mr Developer\n.mr.developer.cfg\n\n# Mac crap\n.DS_Store"
  },
  {
    "path": "ColorDocument.Avalonia/ClassNames.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace ColorDocument.Avalonia\n{\n    public static class ClassNames\n    {\n        public const string Heading1Class = \"Heading1\";\n        public const string Heading2Class = \"Heading2\";\n        public const string Heading3Class = \"Heading3\";\n        public const string Heading4Class = \"Heading4\";\n        public const string Heading5Class = \"Heading5\";\n        public const string Heading6Class = \"Heading6\";\n\n        public const string CodeBlockClass = \"CodeBlock\";\n        public const string ContainerBlockClass = \"ContainerBlock\";\n        public const string NoContainerClass = \"NoContainer\";\n        public const string BlockquoteClass = \"Blockquote\";\n        public const string NoteClass = \"Note\";\n\n        public const string ParagraphClass = \"Paragraph\";\n\n        public const string TableClass = \"Table\";\n        public const string TableHeaderClass = \"TableHeader\";\n        public const string TableFirstRowClass = \"FirstTableRow\";\n        public const string TableRowOddClass = \"OddTableRow\";\n        public const string TableRowEvenClass = \"EvenTableRow\";\n        public const string TableLastRowClass = \"LastTableRow\";\n        public const string TableFooterClass = \"TableFooter\";\n\n        public const string ListClass = \"List\";\n        public const string ListMarkerClass = \"ListMarker\";\n    }\n}\n"
  },
  {
    "path": "ColorDocument.Avalonia/ColorDocument.Avalonia.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <Import Project=\"..\\Markdown.Avalonia.props\" />\n\n  <PropertyGroup>\n    <TargetFrameworks>$(PackageTargetFrameworks)</TargetFrameworks>\n    <Version>$(PackageVersion)</Version>\n    <Authors>Bevan Arps(original); whistyun</Authors>\n    <PackageId>ColorDocument.Avalonia</PackageId>\n\n    <Version>$(PackageVersion)</Version>\n    <Authors>whistyun</Authors>\n    <Copyright>Copyright (c) 2024 whistyun</Copyright>\n    <PackageProjectUrl>https://github.com/whistyun/Markdown.Avalonia/tree/master/ColorDocument.Avalonia/</PackageProjectUrl>\n    <LangVersion>9</LangVersion>\n    <PackageLicenseExpression>MIT</PackageLicenseExpression>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" Version=\"$(AvaloniaVersion)\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ColorTextBlock.Avalonia\\ColorTextBlock.Avalonia.csproj\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "ColorDocument.Avalonia/DocumentElement.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Layout;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace ColorDocument.Avalonia\n{\n    public abstract class DocumentElement\n    {\n        private ISelectionRenderHelper? _helper;\n\n        public abstract Control Control { get; }\n        public abstract IEnumerable<DocumentElement> Children { get; }\n\n        public ISelectionRenderHelper? Helper\n        {\n            get => _helper;\n            set\n            {\n                _helper = value;\n                foreach (var child in Children)\n                    child.Helper = value;\n            }\n        }\n\n        public Rect GetRect(Layoutable anchor) => Control.GetRectInDoc(anchor).GetValueOrDefault();\n        public abstract void Select(Point from, Point to);\n        public abstract void UnSelect();\n\n        public virtual string GetSelectedText()\n        {\n            var builder = new StringBuilder();\n            ConstructSelectedText(builder);\n            return builder.ToString();\n        }\n\n        public abstract void ConstructSelectedText(StringBuilder stringBuilder);\n\n    }\n\n    public interface ISelectionRenderHelper\n    {\n        void Register(Control control);\n        void Unregister(Control control);\n    }\n}\n"
  },
  {
    "path": "ColorDocument.Avalonia/DocumentElements/BlockquoteElement.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Layout;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace ColorDocument.Avalonia.DocumentElements\n{\n    /// <summary>\n    /// The document element for expression of blockquote.\n    /// </summary>\n    // 引用を表現するためのドキュメント要素\n    public class BlockquoteElement : DocumentElement\n    {\n        private Lazy<Border> _block;\n        private EnumerableEx<DocumentElement> _children;\n        private SelectionList? _prevSelection;\n\n        public override Control Control => _block.Value;\n        public override IEnumerable<DocumentElement> Children => _children;\n\n        public BlockquoteElement(IEnumerable<DocumentElement> child)\n        {\n            _block = new Lazy<Border>(Create);\n            _children = child.ToEnumerable();\n        }\n\n        private Border Create()\n        {\n            var panel = new StackPanel();\n            panel.Orientation = Orientation.Vertical;\n            panel.Classes.Add(ClassNames.BlockquoteClass);\n            foreach (var child in Children)\n                panel.Children.Add(child.Control);\n\n            var border = new Border();\n            border.Classes.Add(ClassNames.BlockquoteClass);\n            border.Child = panel;\n\n            return border;\n        }\n\n        public override void Select(Point from, Point to)\n        {\n            var selection = SelectionUtil.SelectVertical(Control, _children, from, to);\n\n            if (_prevSelection is not null)\n            {\n                foreach (var ps in _prevSelection)\n                {\n                    if (!selection.Any(cs => ReferenceEquals(cs, ps)))\n                    {\n                        ps.UnSelect();\n                    }\n                }\n            }\n\n            _prevSelection = selection;\n        }\n\n        public override void UnSelect()\n        {\n            foreach (var child in _children)\n                child.UnSelect();\n        }\n\n        public override void ConstructSelectedText(StringBuilder builder)\n        {\n            if (_prevSelection is null)\n                return;\n\n            var preLen = builder.Length;\n\n            foreach (var para in _prevSelection)\n            {\n                para.ConstructSelectedText(builder);\n\n                if (preLen == builder.Length)\n                    continue;\n\n                if (builder[builder.Length - 1] != '\\n')\n                    builder.Append('\\n');\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "ColorDocument.Avalonia/DocumentElements/CTextBlockElement.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Media;\nusing ColorTextBlock.Avalonia;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace ColorDocument.Avalonia.DocumentElements\n{\n    public class CTextBlockElement : DocumentElement\n    {\n        private Lazy<CTextBlock> _text;\n\n        public string Text => _text.Value.Text;\n\n        public override Control Control => _text.Value;\n\n        public override IEnumerable<DocumentElement> Children => Array.Empty<DocumentElement>();\n\n        public CTextBlockElement(IEnumerable<CInline> inlines)\n        {\n            _text = new Lazy<CTextBlock>(() =>\n            {\n                var text = new CTextBlock();\n                foreach (var inline in inlines)\n                    text.Content.Add(inline);\n                return text;\n            });\n        }\n        public CTextBlockElement(IEnumerable<CInline> inlines, string appendClass)\n        {\n            _text = new Lazy<CTextBlock>(() =>\n            {\n                var text = new CTextBlock();\n                foreach (var inline in inlines)\n                    text.Content.Add(inline);\n\n                text.Classes.Add(appendClass);\n                return text;\n            });\n        }\n\n        public CTextBlockElement(IEnumerable<CInline> inlines, string appendClass, TextAlignment alignment)\n        {\n            _text = new Lazy<CTextBlock>(() =>\n            {\n                var text = new CTextBlock();\n                foreach (var inline in inlines)\n                    text.Content.Add(inline);\n\n                text.TextAlignment = alignment;\n                text.Classes.Add(appendClass);\n                return text;\n            });\n        }\n\n\n        public override void Select(Point from, Point to)\n        {\n            var text = _text.Value;\n\n            var fromPoint = text.CalcuatePointerFrom(from.X, from.Y);\n            var toPoint = text.CalcuatePointerFrom(to.X, to.Y);\n            text.Select(fromPoint, toPoint);\n        }\n\n        public override void UnSelect()\n        {\n            _text.Value.ClearSelection();\n        }\n\n        public override void ConstructSelectedText(StringBuilder builder)\n        {\n            builder.Append(_text.Value.GetSelectedText());\n        }\n    }\n}\n"
  },
  {
    "path": "ColorDocument.Avalonia/DocumentElements/DocumentRootElement.cs",
    "content": "using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Layout;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace ColorDocument.Avalonia.DocumentElements\n{\n    /// <summary>\n    /// The top document element.\n    /// </summary>\n    public class DocumentRootElement : DocumentElement\n    {\n        private Lazy<StackPanel> _block;\n        private EnumerableEx<DocumentElement> _children;\n        private SelectionList? _prevSelection;\n\n        public override Control Control => _block.Value;\n        public override IEnumerable<DocumentElement> Children => _children;\n\n        public DocumentRootElement(IEnumerable<DocumentElement> child)\n        {\n            _block = new Lazy<StackPanel>(Create);\n            _children = child.ToEnumerable();\n        }\n\n        private StackPanel Create()\n        {\n            var panel = new StackPanel();\n            panel.Orientation = Orientation.Vertical;\n            foreach (var child in _children)\n                panel.Children.Add(child.Control);\n\n            return panel;\n        }\n\n        public override void Select(Point from, Point to)\n        {\n            var selection = SelectionUtil.SelectVertical(Control, _children, from, to);\n\n            if (_prevSelection is not null)\n            {\n                foreach (var ps in _prevSelection)\n                {\n                    if (!selection.Any(cs => ReferenceEquals(cs, ps)))\n                    {\n                        ps.UnSelect();\n                    }\n                }\n            }\n\n            _prevSelection = selection;\n        }\n\n        public override void UnSelect()\n        {\n            foreach (var child in _children)\n                child.UnSelect();\n        }\n\n        public override void ConstructSelectedText(StringBuilder builder)\n        {\n            if (_prevSelection is null)\n                return;\n\n            var preLen = builder.Length;\n\n            foreach (var para in _prevSelection)\n            {\n                para.ConstructSelectedText(builder);\n\n                if (preLen == builder.Length)\n                    continue;\n\n                if (builder[builder.Length - 1] != '\\n')\n                    builder.Append('\\n');\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "ColorDocument.Avalonia/DocumentElements/HeaderElement.cs",
    "content": "﻿using ColorTextBlock.Avalonia;\nusing System.Collections.Generic;\n\nnamespace ColorDocument.Avalonia.DocumentElements\n{\n    public class HeaderElement : CTextBlockElement\n    {\n        public int Level { get; }\n\n        public HeaderElement(IEnumerable<CInline> inlines, int level) :\n            base(inlines, level switch\n            {\n                1 => ClassNames.Heading1Class,\n                2 => ClassNames.Heading2Class,\n                3 => ClassNames.Heading3Class,\n                4 => ClassNames.Heading4Class,\n                5 => ClassNames.Heading5Class,\n                _ => ClassNames.Heading6Class,\n            })\n        {\n            Level = level switch\n            {\n                1 => 1,\n                2 => 2,\n                3 => 3,\n                4 => 4,\n                5 => 5,\n                _ => 6,\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "ColorDocument.Avalonia/DocumentElements/ListBlockElement.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Media;\nusing ColorTextBlock.Avalonia;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace ColorDocument.Avalonia.DocumentElements\n{\n    public class ListBlockElement : DocumentElement\n    {\n        private Lazy<Grid> _control;\n        private EnumerableEx<ListItemElement> _items;\n        private SelectionList? _prevSelection;\n\n        public override Control Control => _control.Value;\n        public override IEnumerable<DocumentElement> Children => _items;\n\n        public ListBlockElement(TextMarkerStyle marker, IEnumerable<ListItemElement> items)\n        {\n            _control = new Lazy<Grid>(() => CreateList(marker));\n            _items = items.ToEnumerable();\n        }\n\n        public override void Select(Point from, Point to)\n        {\n            var selection = SelectionUtil.SelectVertical(Control, _items, from, to);\n\n            if (_prevSelection is not null)\n            {\n                foreach (var ps in _prevSelection)\n                {\n                    if (!selection.Any(cs => ReferenceEquals(cs, ps)))\n                    {\n                        ps.UnSelect();\n                    }\n                }\n            }\n\n            _prevSelection = selection;\n        }\n\n        public override void UnSelect()\n        {\n            foreach (var c in _items)\n                c.UnSelect();\n        }\n\n        private Grid CreateList(TextMarkerStyle marker)\n        {\n            var grid = new Grid();\n            grid.Classes.Add(ClassNames.ListClass);\n            grid.ColumnDefinitions.Add(new ColumnDefinition(GridLength.Auto));\n            grid.ColumnDefinitions.Add(new ColumnDefinition());\n\n            int index = 0;\n            foreach (var item in _items)\n            {\n                var markerTxt = new CTextBlock(marker.CreateMakerText(index));\n                var itemCtrl = item.Control;\n\n                item.MarkerText = markerTxt.Text;\n\n                // adjust baseline\n                if (FindFirstFrom(itemCtrl) is { } controlTxt)\n                    markerTxt.ObserveBaseHeightOf(controlTxt);\n\n                grid.RowDefinitions.Add(new RowDefinition());\n\n                markerTxt.TextAlignment = TextAlignment.Right;\n                markerTxt.TextWrapping = TextWrapping.NoWrap;\n                markerTxt.Classes.Add(ClassNames.ListMarkerClass);\n                Grid.SetRow(markerTxt, index);\n                Grid.SetColumn(markerTxt, 0);\n                grid.Children.Add(markerTxt);\n\n                Grid.SetRow(itemCtrl, index);\n                Grid.SetColumn(itemCtrl, 1);\n                grid.Children.Add(itemCtrl);\n\n                ++index;\n            }\n\n            return grid;\n\n            static CTextBlock? FindFirstFrom(Control ctrl)\n            {\n                if (ctrl is Panel pnl)\n                {\n                    foreach (var chld in pnl.Children)\n                    {\n                        var res = FindFirstFrom(chld);\n                        if (res != null) return res;\n                    }\n                }\n                if (ctrl is CTextBlock ctxt)\n                {\n                    return ctxt;\n                }\n                return null;\n            }\n        }\n\n        public override void ConstructSelectedText(StringBuilder builder)\n        {\n            if (_prevSelection is null)\n                return;\n\n            foreach (var para in _prevSelection.Cast<ListItemElement>())\n            {\n                builder.Append(para.MarkerText).Append(' ');\n\n                var listElmTxt = para.GetSelectedText().Replace(\"\\r\\n\", \"\\n\").Replace('\\r', '\\n');\n                builder.Append(listElmTxt);\n\n                if (!listElmTxt.EndsWith(\"\\n\"))\n                    builder.Append('\\n');\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "ColorDocument.Avalonia/DocumentElements/ListItemElement.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace ColorDocument.Avalonia.DocumentElements\n{\n    public class ListItemElement : DocumentElement\n    {\n        private Lazy<StackPanel> _panel;\n        private EnumerableEx<DocumentElement> _elements;\n        private SelectionList? _prevSelection;\n\n        internal string MarkerText { get; set; }\n\n        public override Control Control => _panel.Value;\n        public override IEnumerable<DocumentElement> Children => _elements;\n\n        public ListItemElement(IEnumerable<DocumentElement> contents)\n        {\n            _elements = contents.ToEnumerable();\n            _panel = new Lazy<StackPanel>(() =>\n            {\n                var panel = new StackPanel();\n                foreach (var content in _elements)\n                    panel.Children.Add(content.Control);\n\n                return panel;\n            });\n        }\n\n\n        public override void Select(Point from, Point to)\n        {\n            var selection = SelectionUtil.SelectVertical(Control, _elements, from, to);\n\n            if (_prevSelection is not null)\n            {\n                foreach (var ps in _prevSelection)\n                {\n                    if (!selection.Any(cs => ReferenceEquals(cs, ps)))\n                    {\n                        ps.UnSelect();\n                    }\n                }\n            }\n\n            _prevSelection = selection;\n        }\n\n        public override void UnSelect()\n        {\n            foreach (var c in _elements)\n                c.UnSelect();\n        }\n\n        public override void ConstructSelectedText(StringBuilder builder)\n        {\n            if (_prevSelection is null)\n                return;\n\n            var preLen = builder.Length;\n\n            foreach (var para in _prevSelection)\n            {\n                para.ConstructSelectedText(builder);\n\n                if (preLen == builder.Length)\n                    continue;\n\n                if (builder[builder.Length - 1] != '\\n')\n                    builder.Append('\\n');\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "ColorDocument.Avalonia/DocumentElements/NoteBlockElement.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Media;\nusing ColorTextBlock.Avalonia;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace ColorDocument.Avalonia.DocumentElements\n{\n    public class NoteBlockElement : DocumentElement\n    {\n        private CTextBlockElement _child;\n        private TextAlignment? _indiAlignment;\n        private Lazy<Border> _block;\n\n        public override Control Control => _block.Value;\n\n        public override IEnumerable<DocumentElement> Children => new[] { _child };\n\n        public NoteBlockElement(IEnumerable<CInline> content, TextAlignment? indiAlignment)\n        {\n            _child = new CTextBlockElement(content);\n            _indiAlignment = indiAlignment;\n\n            _block = new Lazy<Border>(Create);\n        }\n\n        private Border Create()\n        {\n            var note = (CTextBlock)_child.Control;\n\n            note.Classes.Add(ClassNames.NoteClass);\n            if (_indiAlignment.HasValue)\n            {\n                note.TextAlignment = _indiAlignment.Value;\n            }\n\n            var result = new Border();\n            result.Classes.Add(ClassNames.NoteClass);\n            result.Child = note;\n\n            return result;\n        }\n\n        public override void Select(Point from, Point to)\n            => _child.Select(from, to);\n\n        public override void UnSelect()\n        {\n            _child.UnSelect();\n        }\n\n        public override void ConstructSelectedText(StringBuilder builder)\n        {\n            _child.ConstructSelectedText(builder);\n        }\n    }\n}\n"
  },
  {
    "path": "ColorDocument.Avalonia/DocumentElements/PlainCodeBlockElement.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Primitives;\nusing Avalonia.Media;\nusing ColorTextBlock.Avalonia;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace ColorDocument.Avalonia.DocumentElements\n{\n    public class PlainCodeBlockElement : DocumentElement\n    {\n        private string _code;\n        private Lazy<Border> _border;\n\n        public override Control Control => _border.Value;\n\n        public override IEnumerable<DocumentElement> Children => Array.Empty<DocumentElement>();\n\n        public PlainCodeBlockElement(string code)\n        {\n            _code = code;\n            _border = new Lazy<Border>(CreateBlock);\n        }\n\n        public override void Select(Point from, Point to)\n        {\n        }\n\n        public override void UnSelect()\n        {\n        }\n\n        public Border CreateBlock()\n        {\n            var ctxt = new TextBlock()\n            {\n                Text = _code,\n                TextWrapping = TextWrapping.NoWrap\n            };\n            ctxt.Classes.Add(ClassNames.CodeBlockClass);\n\n            var scrl = new ScrollViewer();\n            scrl.Classes.Add(ClassNames.CodeBlockClass);\n            scrl.Content = ctxt;\n            scrl.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;\n\n            var result = new Border();\n            result.Classes.Add(ClassNames.CodeBlockClass);\n            result.Child = scrl;\n\n            return result;\n        }\n\n        public override void ConstructSelectedText(StringBuilder stringBuilder)\n        {\n            stringBuilder.Append(_code);\n        }\n    }\n}\n"
  },
  {
    "path": "ColorDocument.Avalonia/DocumentElements/TableBlockElement.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace ColorDocument.Avalonia.DocumentElements\n{\n    public class TableBlockElement : DocumentElement\n    {\n        private Lazy<Border> _table;\n        private TableCellElement[][] _head;\n        private TableCellElement[][] _body;\n        private TableCellElement[][] _foot;\n        private bool _autoAdjust;\n        private EnumerableEx<TableCellElement> _all;\n        private SelectionList? _prevSelection;\n\n        public override Control Control => _table.Value;\n        public override IEnumerable<DocumentElement> Children => _all;\n\n        public TableBlockElement(\n            IEnumerable<IEnumerable<TableCellElement>> thead,\n            IEnumerable<IEnumerable<TableCellElement>> tbody,\n            IEnumerable<IEnumerable<TableCellElement>> tfoot,\n            bool autoAdjust) :\n                this(\n                    thead.Select(ln => ln.ToArray()).ToArray(),\n                    tbody.Select(ln => ln.ToArray()).ToArray(),\n                    tfoot.Select(ln => ln.ToArray()).ToArray(),\n                    autoAdjust)\n        { }\n\n        public TableBlockElement(\n            TableCellElement[][] thead,\n            TableCellElement[][] tbody,\n            TableCellElement[][] tfoot,\n            bool autoAdjust)\n        {\n            _head = thead;\n            _body = tbody;\n            _foot = tfoot;\n\n            _all = _head.SelectMany(l => l)\n                        .Concat(_body.SelectMany(l => l))\n                        .Concat(_foot.SelectMany(l => l))\n                        .ToEnumerable();\n\n            _autoAdjust = autoAdjust;\n\n            _table = new Lazy<Border>(CreateTable);\n        }\n\n        public override void Select(Point from, Point to)\n        {\n            var selection = SelectionUtil.SelectGrid(Control, _all, from, to);\n\n            if (_prevSelection is not null)\n            {\n                foreach (var ps in _prevSelection)\n                {\n                    if (!selection.Any(cs => ReferenceEquals(cs, ps)))\n                    {\n                        ps.UnSelect();\n                    }\n                }\n            }\n\n            _prevSelection = selection;\n        }\n\n        public override void UnSelect()\n        {\n            foreach (var child in _all)\n                child.UnSelect();\n        }\n\n        private Border CreateTable()\n        {\n            var rowInfs = new List<RowInf>();\n            CreateRows(rowInfs, _head, ClassNames.TableHeaderClass);\n            CreateRows(rowInfs, _body);\n            CreateRows(rowInfs, _foot, ClassNames.TableFooterClass);\n\n            int maxColCnt = rowInfs.Max(r => r.ColumnCount);\n\n            if (_autoAdjust)\n            {\n                for (int i = 0; i < rowInfs.Count; ++i)\n                {\n                    var rowInf = rowInfs[i];\n                    while (rowInf.ColumnCount < maxColCnt)\n                    {\n                        var cellCtrl = new Border();\n                        Grid.SetRow(cellCtrl, i);\n                        Grid.SetColumn(cellCtrl, rowInf.ColumnCount);\n                        rowInf.Cells.Add(cellCtrl);\n                        rowInf.ColumnCount++;\n                    }\n                }\n            }\n\n            var grid = new Grid();\n            grid.Classes.Add(ClassNames.TableClass);\n\n            grid.RowDefinitions.AddRange(Enumerable.Range(0, rowInfs.Count).Select(_ => new RowDefinition()));\n            grid.ColumnDefinitions.AddRange(Enumerable.Range(0, maxColCnt).Select(_ => new ColumnDefinition()));\n\n            foreach (var rowInf in rowInfs)\n            {\n                foreach (var cell in rowInf.Cells)\n                    cell.Classes.AddRange(rowInf.Classes);\n\n                grid.Children.AddRange(rowInf.Cells);\n            }\n\n            var border = new Border();\n            border.Classes.Add(ClassNames.TableClass);\n            border.Child = grid;\n\n            //var grid = new Grid();\n            //grid.Classes.Add(ClassNames.TableClass);\n            //var border = new Border();\n            //border.Classes.Add(ClassNames.TableClass);\n            //border.Child = grid;\n            //int rowOffset = 0;\n            //\n            //int hRowOffset = rowOffset;\n            //List<RowInfo> hInfs = SetupRow(grid, _head, ref rowOffset, ClassNames.TableHeaderClass);\n            //int bRowOffset = rowOffset;\n            //List<RowInfo> bInfs = SetupRow(grid, _body, ref rowOffset);\n            //int fRowOffset = rowOffset;\n            //List<RowInfo> fInfs = SetupRow(grid, _foot, ref rowOffset, ClassNames.TableFooterClass);\n            //\n            //int colCnt = hInfs.Concat(bInfs).Concat(fInfs).Max(i => i.ColumnCount);\n            //\n            //if (_autoAdjust)\n            //{\n            //    AdjustRow(grid, hInfs, hRowOffset, colCnt);\n            //    AdjustRow(grid, bInfs, bRowOffset, colCnt);\n            //    AdjustRow(grid, fInfs, fRowOffset, colCnt);\n            //}\n            //\n            //foreach (var _ in Enumerable.Range(0, colCnt))\n            //{\n            //    grid.ColumnDefinitions.Add(new ColumnDefinition());\n            //}\n\n            return border;\n        }\n\n        private static List<RowInfo> SetupRow(\n            Grid grid,\n            TableCellElement[][] rows,\n            ref int gridRowIdx,\n            string? classNm = null)\n        {\n            // The list of multi-row cells.\n            // Key: Column index where the target cell is located.\n            var multiRowsAtColIdx = new Dictionary<int, MdSpan>();\n\n            var rowInfs = new List<RowInfo>();\n            var maxColCount = 0;\n\n            int startRowInSection = gridRowIdx;\n            for (var i = 0; i < rows.Length; ++gridRowIdx)\n            {\n                var row = rows[i];\n                grid.RowDefinitions.Add(new RowDefinition());\n\n                // Set up classes for cell in this row.\n                string[] classes;\n                if (classNm is not null)\n                    classes = new[] { classNm };\n                else\n                {\n                    var rowIdxInSection = gridRowIdx - startRowInSection;\n\n                    if (rowIdxInSection == 0)\n                    {\n                        if (i == rows.Length - 1)\n                            classes = new[] { ClassNames.TableRowOddClass, ClassNames.TableFirstRowClass, ClassNames.TableLastRowClass };\n                        else\n                            classes = new[] { ClassNames.TableRowOddClass, ClassNames.TableFirstRowClass };\n                    }\n                    else\n                    {\n                        var oddOrEven = rowIdxInSection % 2 == 0 ? ClassNames.TableRowOddClass : ClassNames.TableRowEvenClass;\n\n                        if (i == rows.Length - 1)\n                            classes = new[] { oddOrEven, ClassNames.TableLastRowClass };\n                        else\n                            classes = new[] { oddOrEven };\n                    }\n                }\n\n\n                var rowspansColOffset = multiRowsAtColIdx.Sum(e => e.Value.ColSpan);\n\n                /*\n                 * In this row, is space exists to insert cell?\n                 * \n                 * eg. has space\n                 *    __________________________________\n                 *    | 2x1 cell | 1x1 cell | 1x1 cell |\n                 * -> |          |‾‾‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾|\n                 *    ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\n                 *    \n                 * eg. has no space: multi-rows occupy all space in this row.\n                 *    __________________________________\n                 *    | 2x1 cell |      2x2 cell        |\n                 * -> |          |                      |\n                 *    ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\n                 * \n                 */\n                if (rowspansColOffset == 0 || rowspansColOffset < maxColCount)\n                {\n                    int colIdx = 0;\n                    foreach (var cell in row)\n                    {\n                        while (multiRowsAtColIdx.TryGetValue(colIdx, out var span))\n                        {\n                            colIdx += span.ColSpan;\n                        }\n\n                        var cellCtrl = cell.Control;\n                        cell.Row = gridRowIdx;\n                        cell.Column = colIdx;\n                        Grid.SetRow(cellCtrl, gridRowIdx);\n                        Grid.SetColumn(cellCtrl, colIdx);\n                        if (cell.RowSpan > 1) Grid.SetRowSpan(cellCtrl, cell.RowSpan);\n                        if (cell.ColSpan > 1) Grid.SetColumnSpan(cellCtrl, cell.ColSpan);\n                        cellCtrl.Classes.AddRange(classes);\n                        grid.Children.Add(cellCtrl);\n\n\n                        if (cell.RowSpan > 1)\n                        {\n                            multiRowsAtColIdx[colIdx] =\n                                new MdSpan(cell.RowSpan, cell.ColSpan);\n                        }\n\n                        colIdx += cell.ColSpan;\n                    }\n\n                    rowInfs.Add(new RowInfo(classes, colIdx));\n\n                    if (maxColCount < colIdx) maxColCount = colIdx;\n\n                    ++i;\n                }\n                else\n                {\n                    rowInfs.Add(new RowInfo(classes, rowspansColOffset));\n                }\n\n                // Removes multi-row cells,   複数行にまたがるセルの削除(必要なら)\n                foreach (var spanEntry in multiRowsAtColIdx.ToArray())\n                {\n                    if (--spanEntry.Value.Life == 0)\n                    {\n                        multiRowsAtColIdx.Remove(spanEntry.Key);\n                    }\n                }\n            }\n\n            // if any multirow is left, insert an empty row.\n            while (multiRowsAtColIdx.Count > 0)\n            {\n                grid.RowDefinitions.Add(new RowDefinition());\n\n                var colOffset = 0;\n\n                foreach (var spanEntry in multiRowsAtColIdx.OrderBy(tpl => tpl.Key))\n                {\n                    while (colOffset < spanEntry.Key)\n                    {\n                        var cellCtrl = new Border();\n                        Grid.SetRow(cellCtrl, gridRowIdx);\n                        Grid.SetColumn(cellCtrl, colOffset);\n                        grid.Children.Add(cellCtrl);\n                        colOffset++;\n\n                    }\n                    colOffset += spanEntry.Value.ColSpan;\n\n\n                    if (--spanEntry.Value.Life == 0)\n                    {\n                        multiRowsAtColIdx.Remove(spanEntry.Key);\n                    }\n                }\n\n                rowInfs.Add(new RowInfo(Array.Empty<string>(), colOffset));\n                gridRowIdx++;\n            }\n\n            return rowInfs;\n        }\n\n        private static void AdjustRow(Grid grid, List<RowInfo> rowInfs, int rowOffset, int colCnt)\n        {\n            for (var rowIdx = 0; rowIdx < rowInfs.Count; ++rowIdx)\n            {\n                var rowInf = rowInfs[rowIdx];\n                for (var colIdx = rowInf.ColumnCount; colIdx < colCnt; ++colIdx)\n                {\n                    var cellCtrl = new Border();\n                    Grid.SetRow(cellCtrl, rowIdx + rowOffset);\n                    Grid.SetColumn(cellCtrl, colIdx);\n                    cellCtrl.Classes.AddRange(rowInf.Classes);\n                    grid.Children.Insert(SearchInsPos(grid.Children, cellCtrl), cellCtrl);\n                }\n            }\n\n            int SearchInsPos(IList<Control> list, Control tgt)\n            {\n                int min = 0, max = list.Count;\n\n                var tgtRow = Grid.GetRow(tgt);\n                var tgtCol = Grid.GetColumn(tgt);\n                int mid = 0;\n\n                while (min < max)\n                {\n                    mid = (min + max) / 2;\n\n                    var ctrl = list[mid];\n                    var ctrlRow = Grid.GetRow(ctrl);\n                    var ctrlCol = Grid.GetColumn(ctrl);\n\n                    if (tgtRow < ctrlRow || (tgtRow == ctrlRow && tgtCol < ctrlCol))\n                    {\n                        max = mid - 1;\n                    }\n                    else if (tgtRow > ctrlRow || (tgtRow == ctrlRow && tgtCol > ctrlCol))\n                    {\n                        min = mid + 1;\n                    }\n                    else break;\n                }\n\n                for (var i = Math.Min(Math.Min(Math.Min(min, max), mid), list.Count); i < list.Count; ++i)\n                {\n                    var ctrl = list[i];\n                    var ctrlRow = Grid.GetRow(ctrl);\n                    var ctrlCol = Grid.GetColumn(ctrl);\n\n                    if (tgtRow < ctrlRow || (tgtRow == ctrlRow && tgtCol < ctrlCol))\n                    {\n                        return i;\n                    }\n                }\n\n                return list.Count;\n            }\n        }\n\n\n        private void CreateRows(List<RowInf> rowInfs, TableCellElement[][] rows, string? classNm = null)\n        {\n            // The list of multi-row cells.\n            // Key: Column index where the target cell is located.\n            var multiRowsAtColIdx = new Dictionary<int, MdSpan>();\n\n            var maxColCount = 0;\n            int detailsRowIdx = 0;\n            for (int i = 0; i < rows.Length;)\n            {\n                var rinf = new RowInf();\n                SetupClass(rinf, detailsRowIdx++, classNm);\n\n\n                var rowspansColOffset = multiRowsAtColIdx.Sum(e => e.Value.ColSpan);\n                /*\n                 * In this row, is space exists to insert cell?\n                 * \n                 * eg. has space\n                 *    __________________________________\n                 *    | 2x1 cell | 1x1 cell | 1x1 cell |\n                 * -> |          |‾‾‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾|\n                 *    ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\n                 *    \n                 * eg. has no space: multi-rows occupy all space in this row.\n                 *    __________________________________\n                 *    | 2x1 cell |      2x2 cell        |\n                 * -> |          |                      |\n                 *    ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\n                 * \n                 */\n                if (rowspansColOffset == 0 || rowspansColOffset < maxColCount)\n                {\n                    int colIdx = 0;\n                    foreach (var cell in rows[i])\n                    {\n                        while (multiRowsAtColIdx.TryGetValue(colIdx, out var span))\n                        {\n                            colIdx += span.ColSpan;\n                        }\n\n                        var cellCtrl = cell.Control;\n                        cell.Row = rowInfs.Count;\n                        cell.Column = colIdx;\n                        Grid.SetRow(cellCtrl, rowInfs.Count);\n                        Grid.SetColumn(cellCtrl, colIdx);\n                        if (cell.RowSpan > 1) Grid.SetRowSpan(cellCtrl, cell.RowSpan);\n                        if (cell.ColSpan > 1) Grid.SetColumnSpan(cellCtrl, cell.ColSpan);\n                        rinf.Cells.Add(cellCtrl);\n\n\n                        if (cell.RowSpan > 1)\n                        {\n                            multiRowsAtColIdx[colIdx] =\n                                new MdSpan(cell.RowSpan, cell.ColSpan);\n                        }\n\n                        colIdx += cell.ColSpan;\n                    }\n\n\n                    foreach (var left in multiRowsAtColIdx.Where(tpl => tpl.Key >= colIdx)\n                                                          .OrderBy(tpl => tpl.Key))\n                    {\n                        while (colIdx < left.Key)\n                        {\n                            var cellCtrl = new Border();\n                            Grid.SetRow(cellCtrl, rowInfs.Count);\n                            Grid.SetColumn(cellCtrl, colIdx);\n                            rinf.Cells.Add(cellCtrl);\n\n                            ++colIdx;\n                        }\n                        colIdx += left.Value.ColSpan;\n                    }\n\n\n                    rinf.ColumnCount = colIdx;\n                    if (maxColCount < colIdx) maxColCount = colIdx;\n\n\n                    ++i;\n                }\n                else\n                {\n                    rinf.ColumnCount = rowspansColOffset;\n                }\n\n                rowInfs.Add(rinf);\n\n\n                // Removes multi-row cells,   複数行にまたがるセルの削除(必要なら)\n                foreach (var spanEntry in multiRowsAtColIdx.ToArray())\n                {\n                    if (--spanEntry.Value.Life == 0)\n                    {\n                        multiRowsAtColIdx.Remove(spanEntry.Key);\n                    }\n                }\n            }\n\n\n            // if any multirow is left, insert an empty row.\n            while (multiRowsAtColIdx.Count > 0)\n            {\n                var rinf = new RowInf();\n                SetupClass(rinf, detailsRowIdx++, classNm);\n\n                var colIdx = 0;\n                foreach (var spanEntry in multiRowsAtColIdx.OrderBy(tpl => tpl.Key))\n                {\n                    while (colIdx < spanEntry.Key)\n                    {\n                        var cellCtrl = new Border();\n                        Grid.SetRow(cellCtrl, rowInfs.Count);\n                        Grid.SetColumn(cellCtrl, colIdx);\n                        rinf.Cells.Add(cellCtrl);\n                        colIdx++;\n                    }\n                    colIdx += spanEntry.Value.ColSpan;\n\n                    if (--spanEntry.Value.Life == 0)\n                    {\n                        multiRowsAtColIdx.Remove(spanEntry.Key);\n                    }\n                }\n                rinf.ColumnCount = colIdx;\n                rowInfs.Add(rinf);\n            }\n\n\n            if (classNm is null)\n            {\n                rowInfs.Last().Classes.Add(ClassNames.TableLastRowClass);\n            }\n\n\n            static void SetupClass(RowInf rinf, int rowIndex, string? classNm)\n            {\n                if (classNm is not null)\n                    rinf.Classes.Add(classNm);\n                else if (rowIndex == 0)\n                    rinf.Classes.AddRange(new[] { ClassNames.TableRowOddClass, ClassNames.TableFirstRowClass });\n                else if (rowIndex % 2 == 0)\n                    rinf.Classes.Add(ClassNames.TableRowOddClass);\n                else\n                    rinf.Classes.Add(ClassNames.TableRowEvenClass);\n            }\n        }\n\n        public override void ConstructSelectedText(StringBuilder builder)\n        {\n            if (_prevSelection is null)\n                return;\n\n            string[,] cellTxt = new string[\n                _all.Max(c => c.Row + c.RowSpan),\n                _all.Max(c => c.Column + c.ColSpan)\n            ];\n\n            foreach (var para in _prevSelection.Cast<TableCellElement>())\n            {\n                cellTxt[para.Row, para.Column] = para.GetSelectedText().TrimEnd().Replace(\"\\r\\n\", \"\\r\").Replace('\\n', '\\r');\n            }\n\n            for (int i = 0; i < cellTxt.GetLength(0); i++)\n            {\n                var preLen = builder.Length;\n\n                for (int j = 0; j < cellTxt.GetLength(1); j++)\n                {\n                    builder.Append(cellTxt[i, j] ?? \"\");\n                    builder.Append(\"\\t\");\n                }\n\n                if (builder.Length - preLen == 0)\n                    continue;\n\n                if (builder[builder.Length - 1] != '\\n')\n                    builder.Append('\\n');\n            }\n        }\n\n        class MdSpan\n        {\n            public int Life { get; set; }\n            public int ColSpan { get; }\n\n            public MdSpan(int l, int c)\n            {\n                Life = l;\n                ColSpan = c;\n            }\n        }\n\n\n        class RowInf\n        {\n            public List<string> Classes { get; } = new List<string>(5);\n            public List<Control> Cells { get; } = new List<Control>();\n            public int ColumnCount;\n        }\n\n        class RowInfo\n        {\n            public string[] Classes { get; }\n            public int ColumnCount { get; }\n\n            public RowInfo(string[] classes, int colCount)\n            {\n                Classes = classes;\n                ColumnCount = colCount;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "ColorDocument.Avalonia/DocumentElements/TableCellElement.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Layout;\nusing Avalonia.Media;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace ColorDocument.Avalonia.DocumentElements\n{\n    public class TableCellElement : DocumentElement\n    {\n        private readonly Lazy<Border> _control;\n        private readonly EnumerableEx<DocumentElement> _items;\n        private SelectionList? _prevSelection;\n\n        internal int Row { get; set; }\n        internal int Column { get; set; }\n        public int RowSpan { set; get; }\n        public int ColSpan { set; get; }\n        public TextAlignment? Horizontal { set; get; }\n        public VerticalAlignment? Vertical { set; get; }\n\n        public override Control Control => _control.Value;\n\n        public override IEnumerable<DocumentElement> Children => _items;\n\n        public TableCellElement(DocumentElement cell)\n        {\n            _items = new[] { cell }.ToEnumerable();\n            _control = new Lazy<Border>(CreateCell);\n        }\n        public TableCellElement(IEnumerable<DocumentElement> cells)\n        {\n            _items = cells.ToEnumerable();\n            _control = new Lazy<Border>(CreateCell);\n        }\n\n        public override void Select(Point from, Point to)\n        {\n            var selection = SelectionUtil.SelectVertical(Control, _items, from, to);\n\n            if (_prevSelection is not null)\n            {\n                foreach (var ps in _prevSelection)\n                {\n                    if (!selection.Any(cs => ReferenceEquals(cs, ps)))\n                    {\n                        ps.UnSelect();\n                    }\n                }\n            }\n\n            _prevSelection = selection;\n        }\n\n        public override void UnSelect()\n        {\n            foreach (var child in _items)\n                child.UnSelect();\n        }\n\n        private Border CreateCell()\n        {\n            if (_items.Count == 1)\n            {\n\n                return new Border() { Child = Setup(_items[0].Control) };\n            }\n            else\n            {\n                var pnl = new StackPanel() { Orientation = Orientation.Vertical };\n                foreach (var cnt in _items)\n                    pnl.Children.Add(Setup(cnt.Control));\n\n                return new Border() { Child = pnl };\n            }\n        }\n\n        private Control Setup(Control control)\n        {\n            if (Horizontal.HasValue)\n            {\n                control.SetCurrentValue(TextBlock.TextAlignmentProperty, Horizontal.Value);\n\n                switch (Horizontal.Value)\n                {\n                    case TextAlignment.Left:\n                        control.HorizontalAlignment = HorizontalAlignment.Left;\n                        break;\n                    case TextAlignment.Right:\n                        control.HorizontalAlignment = HorizontalAlignment.Right;\n                        break;\n                    case TextAlignment.Center:\n                        control.HorizontalAlignment = HorizontalAlignment.Center;\n                        break;\n                }\n            }\n            return control;\n        }\n\n        public override void ConstructSelectedText(StringBuilder builder)\n        {\n            if (_prevSelection is null)\n                return;\n\n            var preLen = builder.Length;\n\n            foreach (var para in _prevSelection)\n            {\n                para.ConstructSelectedText(builder);\n\n                if (preLen == builder.Length)\n                    continue;\n\n                if (builder[builder.Length - 1] != '\\n')\n                    builder.Append('\\n');\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "ColorDocument.Avalonia/DocumentElements/TextBlockElement.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Documents;\nusing Avalonia.Media;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace ColorDocument.Avalonia.DocumentElements\n{\n    public class TextBlockElement : DocumentElement\n    {\n        private Lazy<TextBlock> _text;\n\n        public string? Text => _text.Value.Text;\n\n        public override Control Control => _text.Value;\n\n        public override IEnumerable<DocumentElement> Children => Array.Empty<DocumentElement>();\n\n        public TextBlockElement(IEnumerable<Inline> inlines)\n        {\n            _text = new Lazy<TextBlock>(() =>\n            {\n                var text = new TextBlock();\n                if (text.Inlines is null)\n                {\n                    text.Inlines = new InlineCollection();\n                }\n\n                text.Inlines.AddRange(inlines);\n\n                return text;\n            });\n        }\n\n        public TextBlockElement(IEnumerable<Inline> inlines, string appendClass)\n        {\n            _text = new Lazy<TextBlock>(() =>\n            {\n                var text = new TextBlock();\n                if (text.Inlines is null)\n                {\n                    text.Inlines = new InlineCollection();\n                }\n                text.Inlines.AddRange(inlines);\n\n                text.Classes.Add(appendClass);\n                return text;\n            });\n        }\n\n        public TextBlockElement(IEnumerable<Inline> inlines, string appendClass, TextAlignment alignment)\n        {\n            _text = new Lazy<TextBlock>(() =>\n            {\n                var text = new TextBlock();\n                if (text.Inlines is null)\n                {\n                    text.Inlines = new InlineCollection();\n                }\n                text.Inlines.AddRange(inlines);\n\n                text.TextAlignment = alignment;\n                text.Classes.Add(appendClass);\n                return text;\n            });\n        }\n\n        public override void Select(Point from, Point to) { }\n\n        public override void UnSelect() { }\n\n        public override void ConstructSelectedText(StringBuilder stringBuilder)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "ColorDocument.Avalonia/DocumentElements/TextMarkerStyle.cs",
    "content": "﻿using Markdown.Avalonia;\nusing System;\n\nnamespace ColorDocument.Avalonia.DocumentElements\n{\n    public enum TextMarkerStyle\n    {\n        Box,\n        Circle,\n        Decimal,\n        Disc,\n\n        LowerLatin,\n        LowerRoman,\n\n        UpperLatin,\n        UpperRoman,\n\n        Square,\n    }\n\n    public static class MarkdownStyleExt\n    {\n        public static string CreateMakerText(this TextMarkerStyle textMarker, int index)\n        {\n            switch (textMarker)\n            {\n                default:\n                    throw new InvalidOperationException(\"sorry library manager forget to modify about listmerker.\");\n\n                case TextMarkerStyle.Disc:\n                    return \"•\";\n\n                case TextMarkerStyle.Box:\n                    return \"▪\";\n\n                case TextMarkerStyle.Circle:\n                    return \"○\";\n\n                case TextMarkerStyle.Square:\n                    return \"❏\";\n\n                case TextMarkerStyle.Decimal:\n                    return (index + 1).ToString() + \".\";\n\n                case TextMarkerStyle.LowerLatin:\n                    return NumberToOrder.ToLatin(index + 1).ToLower() + \".\";\n\n                case TextMarkerStyle.UpperLatin:\n                    return NumberToOrder.ToLatin(index + 1) + \".\";\n\n                case TextMarkerStyle.LowerRoman:\n                    return NumberToOrder.ToRoman(index + 1).ToLower() + \".\";\n\n                case TextMarkerStyle.UpperRoman:\n                    return NumberToOrder.ToRoman(index + 1) + \".\";\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "ColorDocument.Avalonia/DocumentElements/UnBlockElement.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace ColorDocument.Avalonia.DocumentElements\n{\n    public class UnBlockElement : DocumentElement\n    {\n        private Control _control;\n\n        public override Control Control => _control;\n\n        public override IEnumerable<DocumentElement> Children => Array.Empty<DocumentElement>();\n\n        public UnBlockElement(Control control)\n        {\n            _control = control;\n        }\n\n        public override void Select(Point from, Point to) { }\n\n        public override void UnSelect() { }\n\n        public override void ConstructSelectedText(StringBuilder stringBuilder)\n        {\n        }\n    }\n}\n\n"
  },
  {
    "path": "ColorDocument.Avalonia/EnumerableExt.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace ColorDocument.Avalonia\n{\n    internal static class EnumerableExt\n    {\n        public static EnumerableEx<T> ToEnumerable<T>(this IEnumerable<T> enumerable)\n        {\n            if (enumerable is List<T> list)\n                return new EnumerableExLst<T>(list);\n            else if (enumerable is T[] array)\n                return new EnumerableExAry<T>(array);\n\n            return new EnumerableExLzy<T>(enumerable);\n        }\n    }\n\n    internal abstract class EnumerableEx<T> : IEnumerable<T>\n    {\n        public abstract int Count { get; }\n\n        public abstract T this[int idx] { get; }\n\n        public abstract IEnumerator<T> GetEnumerator();\n\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n    }\n\n    internal class EnumerableExLzy<T> : EnumerableEx<T>\n    {\n        private Lazy<T[]> _lzy;\n\n        public EnumerableExLzy(IEnumerable<T> enm)\n        {\n            _lzy = new Lazy<T[]>(() => enm.ToArray());\n        }\n\n        public override int Count => _lzy.Value.Length;\n\n        public override T this[int idx] { get => _lzy.Value[idx]; }\n\n        public override IEnumerator<T> GetEnumerator() => ((ICollection<T>)_lzy.Value).GetEnumerator();\n    }\n\n    internal class EnumerableExAry<T> : EnumerableEx<T>\n    {\n        private T[] _array;\n\n        public EnumerableExAry(T[] array)\n        {\n            _array = array;\n        }\n\n        public override int Count => _array.Length;\n\n        public override T this[int idx] { get => _array[idx]; }\n\n        public override IEnumerator<T> GetEnumerator() => ((ICollection<T>)_array).GetEnumerator();\n    }\n\n    internal class EnumerableExLst<T> : EnumerableEx<T>\n    {\n        private IList<T> _list;\n\n        public EnumerableExLst(IList<T> array)\n        {\n            _list = array;\n        }\n\n        public override int Count => _list.Count;\n\n        public override T this[int idx] { get => _list[idx]; }\n\n        public override IEnumerator<T> GetEnumerator() => _list.GetEnumerator();\n    }\n}\n"
  },
  {
    "path": "ColorDocument.Avalonia/NumberToOrder.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Markdown.Avalonia\n{\n    static class NumberToOrder\n    {\n        public static string ToRoman(int number)\n        {\n            // roman can treat between 1 and 3999\n            if (number < 0 || number >= 4000) return number.ToString();\n\n            if (number >= 1000) return \"M\" + ToRoman(number - 1000);\n            if (number >= 900) return \"CM\" + ToRoman(number - 900);\n            if (number >= 500) return \"D\" + ToRoman(number - 500);\n            if (number >= 400) return \"CD\" + ToRoman(number - 400);\n            if (number >= 100) return \"C\" + ToRoman(number - 100);\n            if (number >= 90) return \"XC\" + ToRoman(number - 90);\n            if (number >= 50) return \"L\" + ToRoman(number - 50);\n            if (number >= 40) return \"XL\" + ToRoman(number - 40);\n            if (number >= 10) return \"X\" + ToRoman(number - 10);\n            if (number >= 9) return \"IX\" + ToRoman(number - 9);\n            if (number >= 5) return \"V\" + ToRoman(number - 5);\n            if (number >= 4) return \"IV\" + ToRoman(number - 4);\n            if (number >= 1) return \"I\" + ToRoman(number - 1);\n            if (number == 0) return \"\";\n\n            throw new ArgumentOutOfRangeException(\"something bad happened\");\n        }\n\n        public static string ToLatin(int number)\n        {\n            var buff = new StringBuilder();\n\n            while (number > 0)\n            {\n                var mod = (number - 1) % 26;\n                buff.Insert(0, (char)(mod + 'A'));\n\n                number = (number - mod) / 26;\n            }\n\n            return buff.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "ColorDocument.Avalonia/RegionUtil.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Layout;\n\nnamespace ColorDocument.Avalonia\n{\n    internal static class RegionUtil\n    {\n        public static Rect? GetRectInDoc(this Control control, Layoutable anchor)\n        {\n            if (!LayoutInformation.GetPreviousArrangeBounds(control).HasValue)\n                return null;\n\n            double driftX = 0;\n            double driftY = 0;\n\n            StyledElement? c;\n            for (c = control.Parent;\n                    c is not null\n                    && c is Layoutable layoutable\n                    && !ReferenceEquals(anchor, layoutable);\n                    c = c.Parent)\n            {\n                driftX += layoutable.Bounds.X;\n                driftY += layoutable.Bounds.Y;\n            }\n\n            return new Rect(\n                        control.Bounds.X + driftX,\n                        control.Bounds.Y + driftY,\n                        control.Bounds.Width,\n                        control.Bounds.Height);\n        }\n\n\n\n        public static EnumerableEx<DocumentElementWithBound> GetRectInDoc<T>(this EnumerableEx<T> controls, Layoutable anchor)\n            where T : DocumentElement\n        {\n            var rs = new DocumentElementWithBound[controls.Count];\n            for (var i = 0; i < rs.Length; ++i)\n            {\n                var doc = controls[i];\n                var rect = doc.Control.GetRectInDoc(anchor);\n                if (rect.HasValue)\n                {\n                    rs[i] = new DocumentElementWithBound(doc, rect.Value);\n                }\n            }\n\n            return new EnumerableExAry<DocumentElementWithBound>(rs);\n        }\n\n    }\n\n    internal struct DocumentElementWithBound\n    {\n        public DocumentElement Element { get; }\n        public Rect Rect { get; }\n\n        public DocumentElementWithBound(DocumentElement c, Rect r)\n        {\n            Element = c;\n            Rect = r;\n        }\n    }\n}\n"
  },
  {
    "path": "ColorDocument.Avalonia/SelectionList.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace ColorDocument.Avalonia\n{\n    public class SelectionList : IList<DocumentElement>\n    {\n        private SelectDirection _direction;\n        private SelectRange _range;\n        private IList<DocumentElement> _elements;\n\n        public SelectionList(SelectDirection direction, SelectRange range, IList<DocumentElement> elements)\n        {\n            _direction = direction;\n            _range = range;\n            _elements = elements;\n        }\n\n        public SelectDirection Direction => _direction;\n\n        public DocumentElement this[int index]\n        {\n            get => _elements[index];\n            set => throw new InvalidOperationException();\n        }\n\n        public int Count => _elements.Count;\n\n        public bool IsReadOnly => true;\n\n        public void Add(DocumentElement item) => throw new InvalidOperationException();\n\n        public void Clear() => throw new InvalidOperationException();\n\n        public bool Contains(DocumentElement item) => _elements.Contains(item);\n\n        public void CopyTo(DocumentElement[] array, int arrayIndex) => _elements.CopyTo(array, arrayIndex);\n\n        public IEnumerator<DocumentElement> GetEnumerator() => _elements.GetEnumerator();\n\n        public int IndexOf(DocumentElement item) => _elements.IndexOf(item);\n\n        public void Insert(int index, DocumentElement item) => throw new InvalidOperationException();\n\n        public bool Remove(DocumentElement item) => throw new InvalidOperationException();\n\n        public void RemoveAt(int index) => throw new InvalidOperationException();\n\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n    }\n\n    public enum SelectDirection\n    {\n        Forward, Backward\n    }\n\n    public enum SelectRange\n    {\n        Part = 0b0001,\n        Begin = 0b0011,\n        End = 0b0101,\n        Fill = 0b0111,\n    }\n}\n"
  },
  {
    "path": "ColorDocument.Avalonia/SelectionUtil.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Layout;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ColorDocument.Avalonia\n{\n    internal static class SelectionUtil\n    {\n        public static SelectionList SelectVertical<T>(Layoutable anchor, EnumerableEx<T> elements, Point from, Point to)\n            where T : DocumentElement\n        {\n            var c = elements.GetRectInDoc(anchor);\n\n            int fp = ComputeIdxVertical(c, from);\n            int tp = ComputeIdxVertical(c, to);\n\n            var list = Select(c, from, to, fp, tp);\n\n            SelectRange rng =\n                 (Math.Min(fp, tp) == 0 ? SelectRange.Begin : SelectRange.Part)\n               | (Math.Max(fp, tp) == elements.Count - 1 ? SelectRange.End : SelectRange.Part);\n\n            if (fp < tp)\n            {\n                return new SelectionList(SelectDirection.Forward, rng, list);\n            }\n            else\n            {\n                list.Reverse();\n                return new SelectionList(SelectDirection.Backward, rng, list);\n            }\n        }\n\n        public static SelectionList SelectGrid<T>(Layoutable anchor, EnumerableEx<T> elements, Point from, Point to)\n            where T : DocumentElement\n        {\n            var c = elements.GetRectInDoc(anchor);\n\n            int fp = ComputeIdxGrid(c, from);\n            int tp = ComputeIdxGrid(c, to);\n\n            var list = Select(c, from, to, fp, tp);\n\n            SelectRange rng =\n                 (Math.Min(fp, tp) == 0 ? SelectRange.Begin : SelectRange.Part)\n               | (Math.Max(fp, tp) == elements.Count - 1 ? SelectRange.End : SelectRange.Part);\n\n            if (fp < tp)\n            {\n                return new SelectionList(SelectDirection.Forward, rng, list);\n            }\n            else\n            {\n                list.Reverse();\n                return new SelectionList(SelectDirection.Backward, rng, list);\n            }\n        }\n\n        static int ComputeIdxVertical(EnumerableEx<DocumentElementWithBound> elements, Point pnt)\n        {\n            if (pnt.X <= 0 && pnt.Y <= 0)\n                return 0;\n\n            if (pnt.X == Double.PositiveInfinity && pnt.Y == Double.PositiveInfinity)\n                return elements.Count - 1;\n\n            foreach ((var c, int i) in elements.Select((value, index) => (value, index)))\n            {\n                var bounds = c.Rect;\n\n                if (pnt.Y < bounds.Bottom)\n                    return i;\n            }\n\n            return elements.Count - 1;\n        }\n\n        static int ComputeIdxGrid(EnumerableEx<DocumentElementWithBound> elements, Point pnt)\n        {\n            if (pnt.X <= 0 && pnt.Y <= 0)\n                return 0;\n\n            if (pnt.X == Double.PositiveInfinity && pnt.Y == Double.PositiveInfinity)\n                return elements.Count - 1;\n\n\n            double prevLeft = double.NegativeInfinity;\n            int verticalLastHit = -1;\n\n            foreach ((var c, int i) in elements.Select((value, index) => (value, index)))\n            {\n                var bounds = c.Rect;\n\n                if (pnt.Y < bounds.Bottom)\n                {\n                    if (pnt.X < bounds.Right)\n                        return i;\n\n                    if (bounds.Left < prevLeft)\n                        return verticalLastHit;\n\n                    prevLeft = bounds.Left;\n                    verticalLastHit = i;\n                }\n            }\n\n            return elements.Count - 1;\n        }\n\n        private static List<DocumentElement> Select(EnumerableEx<DocumentElementWithBound> elements, Point from, Point to, int fp, int tp)\n        {\n            var list = new List<DocumentElement>();\n\n            if (fp < tp)\n            {\n                var workF = from;\n                var workT = new Point(Double.PositiveInfinity, Double.PositiveInfinity);\n\n                for (var i = fp; i <= tp; ++i)\n                {\n                    if (i == tp)\n                    {\n                        workT = to;\n                    }\n\n                    var element = elements[i].Element;\n                    var rect = elements[i].Rect;\n\n                    element.Select(\n                        new Point(workF.X - rect.X, workF.Y - rect.Y),\n                        new Point(workT.X - rect.X, workT.Y - rect.Y));\n\n                    list.Add(element);\n                    workF = new Point(0, 0);\n                }\n            }\n            else if (tp < fp)\n            {\n                var workF = from;\n                var workT = new Point(0, 0);\n\n                for (var i = fp; i >= tp; --i)\n                {\n                    if (i == tp)\n                    {\n                        workT = to;\n                    }\n\n                    var element = elements[i].Element;\n                    var rect = elements[i].Rect;\n\n                    element.Select(\n                        new Point(workF.X - rect.X, workF.Y - rect.Y),\n                        new Point(workT.X - rect.X, workT.Y - rect.Y));\n\n                    list.Add(element);\n                    workF = new Point(Double.PositiveInfinity, Double.PositiveInfinity);\n                }\n            }\n            else\n            {\n                var element = elements[tp].Element;\n                var rect = elements[tp].Rect;\n\n                element.Select(\n                       new Point(from.X - rect.X, from.Y - rect.Y),\n                       new Point(to.X - rect.X, to.Y - rect.Y));\n\n                list.Add(element);\n            }\n\n            return list;\n        }\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/CBold.cs",
    "content": "﻿using System.Collections.Generic;\nusing Weight = Avalonia.Media.FontWeight;\n\nnamespace ColorTextBlock.Avalonia\n{\n    /// <summary>\n    /// Bold decoration\n    /// </summary>\n    public class CBold : CSpan\n    {\n        public CBold() { }\n\n        public CBold(IEnumerable<CInline> inlines) : base(inlines)\n        {\n            FontWeight = Weight.Bold;\n        }\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/CCode.cs",
    "content": "﻿using System.Collections.Generic;\nusing Avalonia.Media;\nusing Avalonia;\nusing ColorTextBlock.Avalonia.Fonts;\n\nnamespace ColorTextBlock.Avalonia\n{\n    /// <summary>\n    /// Monospace decoration\n    /// </summary>\n    public class CCode : CSpan\n    {\n        /// <summary>\n        /// Monospace font family used for code display.\n        /// </summary>\n        /// <see cref=\"MonospaceFontFamily\"/>\n        public static readonly StyledProperty<FontFamily> MonospaceFontFamilyProperty =\n            AvaloniaProperty.Register<CCode, FontFamily>(\n                nameof(MonospaceFontFamily),\n                defaultValue: FontFamilyCollector.TryGetMonospace() ?? FontFamily.Default,\n                inherits: true);\n\n        public CCode() {\n            var obsvr = this.GetBindingObservable(MonospaceFontFamilyProperty);\n            Bind(FontFamilyProperty, obsvr);\n        }\n\n        public CCode(IEnumerable<CInline> inlines) : base(inlines)\n        {\n            var obsvr = this.GetBindingObservable(MonospaceFontFamilyProperty);\n            Bind(FontFamilyProperty, obsvr);\n        }\n\n        /// <summary>\n        /// Monospace font family used for code display.\n        /// </summary>\n        public FontFamily MonospaceFontFamily\n        {\n            get { return GetValue(MonospaceFontFamilyProperty); }\n            set { SetValue(MonospaceFontFamilyProperty, value); }\n        }\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/CHyperlink.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Input;\nusing Avalonia.Media;\nusing ColorTextBlock.Avalonia.Geometries;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ColorTextBlock.Avalonia\n{\n    /// <summary>\n    /// Hyperlink decoration\n    /// </summary>\n    public class CHyperlink : CSpan\n    {\n        /// <summary>\n        /// Background brush during mouse hover\n        /// </summary>\n        /// <seealso cref=\"HoverBackground\"/>\n        public static readonly StyledProperty<IBrush?> HoverBackgroundProperty =\n            AvaloniaProperty.Register<CHyperlink, IBrush?>(nameof(Foreground));\n\n        /// <summary>\n        /// Foreground brush during mouse hover\n        /// </summary>\n        /// <seealso cref=\"HoverForeground\"/>\n        public static readonly StyledProperty<IBrush?> HoverForegroundProperty =\n            AvaloniaProperty.Register<CHyperlink, IBrush?>(nameof(Foreground));\n\n        /// <summary>\n        /// Background brush during mouse hover\n        /// </summary>\n        public IBrush? HoverBackground\n        {\n            get { return GetValue(HoverBackgroundProperty); }\n            set { SetValue(HoverBackgroundProperty, value); }\n        }\n\n        /// <summary>\n        /// Foreground brush during mouse hover\n        /// </summary>\n        public IBrush? HoverForeground\n        {\n            get { return GetValue(HoverForegroundProperty); }\n            set { SetValue(HoverForegroundProperty, value); }\n        }\n\n        /// <summary>\n        /// Link click action\n        /// </summary>\n        public Action<string>? Command { get; set; }\n        /// <summary>\n        /// Link click action parameter\n        /// </summary>\n        public string? CommandParameter { get; set; }\n\n        public CHyperlink() { }\n\n        public CHyperlink(IEnumerable<CInline> inlines) : base(inlines)\n        {\n        }\n\n\n        protected override IEnumerable<CGeometry> MeasureOverride(\n            double entireWidth,\n            double remainWidth)\n        {\n            var metrics = base.MeasureOverride(\n                entireWidth,\n                remainWidth);\n\n            foreach (CGeometry metry in metrics)\n            {\n                metry.OnClick = ctrl => Command?.Invoke(CommandParameter ?? string.Empty);\n\n                metry.OnMousePressed = ctrl =>\n                {\n                    PseudoClasses.Add(\":pressed\");\n                };\n\n                metry.OnMouseReleased = ctrl =>\n                {\n                    PseudoClasses.Remove(\":pressed\");\n                };\n\n                metry.OnMouseEnter = ctrl =>\n                {\n                    PseudoClasses.Add(\":pointerover\");\n                    PseudoClasses.Add(\":hover\");\n\n                    try\n                    {\n                        ctrl.Cursor = new Cursor(StandardCursorType.Hand);\n                    }\n                    catch { /*I cannot assume Cursor.ctor doesn't throw an exception.*/ }\n\n                    IEnumerable<TextGeometry> tmetries =\n                        (metry is DecoratorGeometry d) ?\n                            d.Targets.OfType<TextGeometry>() :\n                        (metry is TextGeometry t) ?\n                            new[] { t } :\n                            new TextGeometry[0];\n\n                    if (tmetries != null)\n                    {\n                        foreach (var tmetry in tmetries)\n                        {\n                            tmetry.TemporaryForeground = HoverForeground;\n                            tmetry.TemporaryBackground = HoverBackground;\n                        }\n                        RequestRender();\n                    }\n                };\n\n                metry.OnMouseLeave = ctrl =>\n                {\n                    PseudoClasses.Remove(\":pointerover\");\n                    PseudoClasses.Remove(\":hover\");\n\n                    ctrl.Cursor = Cursor.Default;\n\n                    IEnumerable<TextGeometry> tmetries =\n                        (metry is DecoratorGeometry d) ?\n                            d.Targets.OfType<TextGeometry>() :\n                        (metry is TextGeometry t) ?\n                            new[] { t } :\n                            new TextGeometry[0];\n\n                    if (tmetries != null)\n                    {\n                        foreach (var tmetry in tmetries)\n                        {\n                            tmetry.TemporaryForeground = null;\n                            tmetry.TemporaryBackground = null;\n                        }\n                        RequestRender();\n                    }\n                };\n\n                yield return metry;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/CImage.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Media.Imaging;\nusing Avalonia.Platform;\nusing Avalonia.Threading;\nusing ColorTextBlock.Avalonia.Geometries;\nusing System;\nusing System.Collections.Generic;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Avalonia.Media;\n\nnamespace ColorTextBlock.Avalonia\n{\n    /// <summary>\n    /// Displays an image\n    /// </summary>\n    public class CImage : CInline\n    {\n        public static readonly StyledProperty<double?> LayoutWidthProperty =\n            AvaloniaProperty.Register<CImage, double?>(nameof(LayoutWidth));\n\n        public static readonly StyledProperty<double?> LayoutHeightProperty =\n            AvaloniaProperty.Register<CImage, double?>(nameof(LayoutHeight));\n\n        public static readonly StyledProperty<double?> RelativeWidthProperty =\n            AvaloniaProperty.Register<CImage, double?>(nameof(RelativeWidth));\n\n        /// <summary>\n        /// Determine wheither image auto fitting or protrude outside Control\n        /// when image is too width to be rendered in control.\n        /// If you set 'true', Image is fitted to control width.\n        /// </summary>\n        public static readonly StyledProperty<bool> FittingWhenProtrudeProperty =\n            AvaloniaProperty.Register<CImage, bool>(nameof(FittingWhenProtrude), defaultValue: true);\n\n        /// <summary>\n        /// Save aspect ratio if one of <see cref=\"LayoutHeightProperty\"/> or <see cref=\"LayoutWidthProperty\"/> set.\n        /// </summary>\n        public static readonly StyledProperty<bool> SaveAspectRatioProperty =\n            AvaloniaProperty.Register<CImage, bool>(nameof(SaveAspectRatio));\n\n        public double? LayoutWidth\n        {\n            get { return GetValue(LayoutWidthProperty); }\n            set { SetValue(LayoutWidthProperty, value); }\n        }\n        public double? LayoutHeight\n        {\n            get { return GetValue(LayoutHeightProperty); }\n            set { SetValue(LayoutHeightProperty, value); }\n        }\n\n        public double? RelativeWidth\n        {\n            get { return GetValue(RelativeWidthProperty); }\n            set { SetValue(RelativeWidthProperty, value); }\n        }\n\n        public bool FittingWhenProtrude\n        {\n            get { return GetValue(FittingWhenProtrudeProperty); }\n            set { SetValue(FittingWhenProtrudeProperty, value); }\n        }\n\n        public bool SaveAspectRatio\n        {\n            get => GetValue(SaveAspectRatioProperty);\n            set => SetValue(SaveAspectRatioProperty, value);\n        }\n\n        public Task<IImage?>? Task { get; }\n        private IImage WhenError { get; }\n        public IImage? Image { private set; get; }\n\n        public CImage(Task<IImage?> task, IImage whenError)\n        {\n            if (task is null) throw new NullReferenceException(nameof(task));\n            if (whenError is null) throw new NullReferenceException(nameof(whenError));\n\n            this.Task = task;\n            this.WhenError = whenError;\n        }\n\n        public CImage(IImage image)\n        {\n            if (image is null) throw new NullReferenceException(nameof(image));\n            this.WhenError = this.Image = image;\n        }\n\n        protected override IEnumerable<CGeometry> MeasureOverride(\n            double entireWidth, double remainWidth)\n        {\n            if (Image is null)\n            {\n                if (Task is null)\n                {\n                    Image = WhenError;\n                }\n                else if (\n                       Task.Status == TaskStatus.RanToCompletion\n                    || Task.Status == TaskStatus.Faulted\n                    || Task.Status == TaskStatus.Canceled)\n                {\n                    Image = Task.IsFaulted ? WhenError : Task.Result ?? WhenError;\n                }\n                else\n                {\n                    Image = new WriteableBitmap(\n                                    new PixelSize(1, 1),\n                                    new Vector(96, 96),\n                                    PixelFormat.Rgb565,\n                                    AlphaFormat.Premul);\n\n                    Thread.MemoryBarrier();\n\n                    System.Threading.Tasks.Task.Run(() =>\n                    {\n                        Task.Wait();\n                        Dispatcher.UIThread.InvokeAsync(() =>\n                        {\n                            Image = Task.IsFaulted ? WhenError : Task.Result ?? WhenError;\n                            RequestMeasure();\n                        });\n\n                    });\n                }\n            }\n\n            double imageWidth = Image.Size.Width;\n            double imageHeight = Image.Size.Height;\n\n            if (RelativeWidth.HasValue)\n            {\n                var aspect = imageHeight / imageWidth;\n                imageWidth = RelativeWidth.Value * entireWidth;\n                imageHeight = aspect * imageWidth;\n            }\n\n            if (LayoutWidth.HasValue)\n            {\n                imageWidth = LayoutWidth.Value;\n                if (SaveAspectRatio && !LayoutHeight.HasValue)\n                {\n                    var aspect = Image.Size.Height / Image.Size.Width;\n                    imageHeight = aspect * imageWidth;\n                }\n            }\n\n            if (LayoutHeight.HasValue)\n            {\n                imageHeight = LayoutHeight.Value;\n                if (SaveAspectRatio && !LayoutWidth.HasValue)\n                {\n                    var aspect = Image.Size.Width / Image.Size.Height;\n                    imageWidth = aspect * imageHeight;\n                }\n            }\n\n            if (imageWidth > remainWidth)\n            {\n                if (entireWidth != remainWidth)\n                {\n                    yield return new LineBreakMarkGeometry(this);\n                }\n\n                if (FittingWhenProtrude && imageWidth > entireWidth)\n                {\n                    var aspect = imageHeight / imageWidth;\n                    imageWidth = entireWidth;\n                    imageHeight = aspect * imageWidth;\n                }\n            }\n\n            yield return new ImageGeometry(this, Image, imageWidth, imageHeight, TextVerticalAlignment);\n        }\n\n        public override string AsString() => \" $$Image$$ \";\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/CInline.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Layout;\nusing Avalonia.Media;\nusing ColorTextBlock.Avalonia.Geometries;\nusing System.Collections.Generic;\nusing System.ComponentModel;\n\nnamespace ColorTextBlock.Avalonia\n{\n    /// <summary>\n    /// The base class for representing a text element.\n    /// </summary>\n    // テキスト要素を表現するための基底のクラス\n    [TypeConverter(typeof(StringToRunConverter))]\n    public abstract class CInline : StyledElement\n    {\n        /// <summary>\n        /// The brush of background.\n        /// </summary>\n        /// <seealso cref=\"Background\"/>\n        public static readonly StyledProperty<IBrush?> BackgroundProperty =\n            AvaloniaProperty.Register<CInline, IBrush?>(nameof(Background), inherits: true);\n\n        /// <summary>\n        /// The brush of the text element.\n        /// </summary>\n        /// <seealso cref=\"Foreground\"/>\n        public static readonly StyledProperty<IBrush?> ForegroundProperty =\n            TextBlock.ForegroundProperty.AddOwner<CInline>();\n\n        /// <summary>\n        /// The font family of the text element\n        /// </summary>\n        /// <seealso cref=\"FontFamily\"/>\n        public static readonly StyledProperty<FontFamily> FontFamilyProperty =\n            TextBlock.FontFamilyProperty.AddOwner<CInline>();\n\n        /// <summary>\n        /// The font weight of the text element\n        /// </summary>\n        /// <seealso cref=\"FontWeight\"/>\n        public static readonly StyledProperty<FontWeight> FontWeightProperty =\n            TextBlock.FontWeightProperty.AddOwner<CInline>();\n\n        /// <summary>\n        /// The font stretch of the text element\n        /// </summary>\n        /// <seealso cref=\"FontStretch\"/>\n        public static readonly StyledProperty<FontStretch> FontStretchProperty =\n            TextBlock.FontStretchProperty.AddOwner<CInline>();\n\n        /// <summary>\n        /// The font size of the text element\n        /// </summary>\n        /// <seealso cref=\"FontSize\"/>\n        public static readonly StyledProperty<double> FontSizeProperty =\n            TextBlock.FontSizeProperty.AddOwner<CInline>();\n\n        /// <summary>\n        /// The font style of the text element\n        /// </summary>\n        /// <seealso cref=\"FontStyle\"/>\n        public static readonly StyledProperty<FontStyle> FontStyleProperty =\n            TextBlock.FontStyleProperty.AddOwner<CInline>();\n\n        /// <summary>\n        /// Use to indicate the vertical position of text within line.\n        /// For example, it is used to align text to the top or to the bottom.\n        /// </summary>\n        /// <seealso cref=\"TextVerticalAlignment\"/>\n        // テキストを上揃えで描画するか下揃えで描画するか指定します。\n        public static readonly StyledProperty<TextVerticalAlignment> TextVerticalAlignmentProperty =\n            CTextBlock.TextVerticalAlignmentProperty.AddOwner<CInline>();\n\n        /// <summary>\n        /// Indicates whether the text element is underlined.\n        /// If this property value is true, the text element is underlined.\n        /// </summary>\n        /// <seealso cref=\"IsUnderline\"/>\n        public static readonly StyledProperty<bool> IsUnderlineProperty =\n            AvaloniaProperty.Register<CInline, bool>(nameof(IsUnderline), inherits: true);\n\n        /// <summary>\n        /// Indicates whether the text element is strikethrough.\n        /// If the value of this property is true, the text element is strikethrough.\n        /// </summary>\n        /// <seealso cref=\"IsStrikethrough\"/>\n        public static readonly StyledProperty<bool> IsStrikethroughProperty =\n            AvaloniaProperty.Register<CInline, bool>(nameof(IsStrikethrough), inherits: true);\n\n        /// <summary>\n        /// The brush of background.\n        /// </summary>\n        public IBrush? Background\n        {\n            get { return GetValue(BackgroundProperty); }\n            set { SetValue(BackgroundProperty, value); }\n        }\n\n        /// <summary>\n        /// The brush of the text element.\n        /// </summary>\n        public IBrush? Foreground\n        {\n            get { return GetValue(ForegroundProperty); }\n            set { SetValue(ForegroundProperty, value); }\n        }\n\n        /// <summary>\n        /// The font family of the text element\n        /// </summary>\n        public FontFamily FontFamily\n        {\n            get { return GetValue(FontFamilyProperty); }\n            set { SetValue(FontFamilyProperty, value); }\n        }\n\n        /// <summary>\n        /// The font size of the text element\n        /// </summary>\n        public double FontSize\n        {\n            get { return GetValue(FontSizeProperty); }\n            set { SetValue(FontSizeProperty, value); }\n        }\n\n        /// <summary>\n        /// The font stretch of the text element\n        /// </summary>\n        public FontStyle FontStyle\n        {\n            get { return GetValue(FontStyleProperty); }\n            set { SetValue(FontStyleProperty, value); }\n        }\n\n        /// <summary>\n        /// The font weight of the text element\n        /// </summary>\n        public FontWeight FontWeight\n        {\n            get { return GetValue(FontWeightProperty); }\n            set { SetValue(FontWeightProperty, value); }\n        }\n\n        /// <summary>\n        /// The font stretch of the text element\n        /// </summary>\n        public FontStretch FontStretch\n        {\n            get { return GetValue(FontStretchProperty); }\n            set { SetValue(FontStretchProperty, value); }\n        }\n\n        /// <summary>\n        /// Typeface of the text element\n        /// </summary>\n        public Typeface Typeface\n        {\n            get;\n            private set;\n        }\n\n        /// <summary>\n        /// Indicates whether the text element is underlined.\n        /// If this property value is true, the text element is underlined.\n        /// </summary>\n        public bool IsUnderline\n        {\n            get { return GetValue(IsUnderlineProperty); }\n            set { SetValue(IsUnderlineProperty, value); }\n        }\n\n        /// <summary>\n        /// Indicates whether the text element is strikethrough.\n        /// If the value of this property is true, the text element is strikethrough.\n        /// </summary>\n        public bool IsStrikethrough\n        {\n            get { return GetValue(IsStrikethroughProperty); }\n            set { SetValue(IsStrikethroughProperty, value); }\n        }\n\n        /// <summary>\n        /// Use to indicate the vertical position of text within line.\n        /// For example, it is used to align text to the top or to the bottom.\n        /// </summary>\n        public TextVerticalAlignment TextVerticalAlignment\n        {\n            get { return GetValue(TextVerticalAlignmentProperty); }\n            set { SetValue(TextVerticalAlignmentProperty, value); }\n        }\n\n        protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)\n        {\n            base.OnPropertyChanged(change);\n\n            switch (change.Property.Name)\n            {\n                case nameof(Background):\n                case nameof(Foreground):\n                case nameof(IsUnderline):\n                case nameof(IsStrikethrough):\n                    RequestRender();\n                    break;\n\n                case nameof(FontFamily):\n                case nameof(FontSize):\n                case nameof(FontStyle):\n                case nameof(FontWeight):\n                case nameof(FontStretch):\n                    Typeface = new Typeface(FontFamily, FontStyle, FontWeight, FontStretch);\n                    goto case nameof(TextVerticalAlignment);\n\n                case nameof(TextVerticalAlignment):\n                    RequestMeasure();\n                    break;\n            }\n        }\n\n        protected void RequestMeasure()\n        {\n            if (Parent is CInline cline)\n            {\n                cline.RequestMeasure();\n            }\n            else if (Parent is CTextBlock ctxt)\n            {\n                ctxt.OnMeasureSourceChanged();\n            }\n            else if (Parent is Layoutable layout)\n            {\n                layout.InvalidateMeasure();\n            }\n        }\n\n        protected void RequestRender()\n        {\n            try\n            {\n                if (Parent is CInline cline)\n                {\n                    cline.RequestRender();\n                }\n                else if (Parent is Layoutable layout)\n                {\n                    layout.InvalidateVisual();\n                }\n            }\n            catch\n            {\n                // An error occured sometimes with FluentAvalonia.\n            }\n        }\n\n        internal IEnumerable<CGeometry> Measure(double entireWidth, double remainWidth)\n        {\n            Typeface = new Typeface(FontFamily, FontStyle, FontWeight, FontStretch);\n\n            /*\n             * This is Imitation of Layoutable.MeasureCore.\n             * If parent style is changed, StyledElement.InvalidedStyles is called.\n             * This method clear all applied styles, \n             * so we should reapply style after style change.\n             */\n            ApplyStyling();\n\n            return MeasureOverride(entireWidth, remainWidth);\n        }\n\n        protected abstract IEnumerable<CGeometry> MeasureOverride(\n            double entireWidth,\n            double remainWidth);\n\n\n        /// <summary>\n        /// Returns the string that this instance displays.\n        /// </summary>\n        /// <returns></returns>\n        // この要素が表示する文字を返します。\n        public abstract string AsString();\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/CInlineUIContainer.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing ColorTextBlock.Avalonia.Geometies;\nusing ColorTextBlock.Avalonia.Geometries;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace ColorTextBlock.Avalonia\n{\n    /// <summary>\n    /// Places a control as an inline element.\n    /// </summary>\n    public class CInlineUIContainer : CInline\n    {\n        /// <summary>\n        /// A displayed control\n        /// </summary>\n        public Control? Content { get; set; }\n        internal DummyGeometryForControl? Indicator { get; private set; }\n\n        public CInlineUIContainer(Control content)\n        {\n            Content = content;\n        }\n\n        protected override IEnumerable<CGeometry> MeasureOverride(double entireWidth, double remainWidth)\n        {\n            if (Content is null)\n            {\n                Indicator = null;\n                return new CGeometry[0];\n            }\n\n            Content.Measure(new Size(remainWidth, Double.PositiveInfinity));\n\n            if (Content.DesiredSize.Width > remainWidth)\n            {\n                Content.Measure(new Size(entireWidth, Double.PositiveInfinity));\n                Indicator = new DummyGeometryForControl(this, Content, TextVerticalAlignment);\n                return new CGeometry[] { new LineBreakMarkGeometry(this), Indicator };\n            }\n            else\n            {\n                Indicator = new DummyGeometryForControl(this, Content, TextVerticalAlignment);\n                return new[] { Indicator };\n            }\n        }\n\n        /// <inheritdoc/>\n        public override string AsString() => String.Empty;\n    }\n}"
  },
  {
    "path": "ColorTextBlock.Avalonia/CItalic.cs",
    "content": "﻿using System.Collections.Generic;\nusing FStyle = Avalonia.Media.FontStyle;\n\nnamespace ColorTextBlock.Avalonia\n{\n    /// <summary>\n    /// Italic decoration\n    /// </summary>\n    public class CItalic : CSpan\n    {\n        public CItalic() { }\n\n        public CItalic(IEnumerable<CInline> inlines) : base(inlines)\n        {\n            FontStyle = FStyle.Italic;\n        }\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/CLineBreak.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Media;\nusing ColorTextBlock.Avalonia.Geometries;\nusing System.Collections.Generic;\nusing System.Globalization;\n\nnamespace ColorTextBlock.Avalonia\n{\n    /// <summary>\n    /// Expression of the linebreak.\n    /// </summary>\n    public class CLineBreak : CRun\n    {\n        public CLineBreak()\n        {\n            Text = \"\\n\";\n        }\n\n        protected override IEnumerable<CGeometry> MeasureOverride(\n            double entireWidth,\n            double remainWidth)\n        {\n            var ftxt = new FormattedText(\n                        \"Ty\",\n                        CultureInfo.CurrentCulture,\n                        FlowDirection.LeftToRight,\n                        new Typeface(FontFamily, FontStyle, FontWeight),\n                        FontSize,\n                        Foreground);\n\n            yield return new LineBreakMarkGeometry(this, ftxt.Height);\n        }\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/CRun.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Media;\nusing Avalonia.Media.TextFormatting;\nusing Avalonia.Media.TextFormatting.Unicode;\nusing Avalonia.Metadata;\nusing ColorTextBlock.Avalonia.Geometries;\nusing System;\nusing System.Collections.Generic;\n\nnamespace ColorTextBlock.Avalonia\n{\n    /// <summary>\n    /// Expression of a text\n    /// </summary>\n    public class CRun : CInline\n    {\n        /// <summary>\n        /// THe content of the eleemnt\n        /// </summary>\n        /// <seealso cref=\"Content\"/>\n        public static readonly StyledProperty<string> TextProperty =\n            AvaloniaProperty.Register<CRun, string>(nameof(Text));\n\n        /// <summary>\n        /// THe content of the eleemnt\n        /// </summary>\n        [Content]\n        public string Text\n        {\n            get { return GetValue(TextProperty); }\n            set { SetValue(TextProperty, value); }\n        }\n\n        protected override IEnumerable<CGeometry> MeasureOverride(\n            double entireWidth,\n            double remainWidth)\n        {\n            if (String.IsNullOrEmpty(Text))\n            {\n                return Array.Empty<CGeometry>();\n            }\n\n            var runProps = CreateTextRunProperties(Foreground);\n            var paraProps = CreateTextParagraphProperties(runProps);\n            var source = new SimpleTextSource(Text.AsMemory(), runProps);\n\n            if (remainWidth == entireWidth)\n            {\n                return CreateLines(source, entireWidth, paraProps);\n            }\n\n            var firstLine = TextFormatter.Current.FormatLine(source, 0, double.PositiveInfinity, paraProps);\n            if (firstLine is null)\n            {\n                return Array.Empty<CGeometry>();\n            }\n\n            if (firstLine.Width < remainWidth)\n            {\n                if (firstLine.Length == Text.Length)\n                {\n                    return new List<CGeometry>() { new TextLineGeometry(this, source, firstLine, false) };\n                }\n\n                return CreateLines(source, entireWidth, paraProps, firstLine);\n            }\n            else\n            {\n                var firstLineSource = source.Subsource(firstLine.FirstTextSourceIndex, firstLine.Length);\n                var firstLineRemain = TextFormatter.Current.FormatLine(firstLineSource, 0, remainWidth, paraProps)!;\n\n                var breakPosEnum = new LineBreakEnumerator(Text.AsMemory().Slice(firstLine.FirstTextSourceIndex, firstLine.Length).Span);\n                int breakPos = breakPosEnum.MoveNext(out var lnbrk) ? lnbrk.PositionWrap : int.MaxValue;\n\n\n                if (breakPos < firstLineRemain.Length)\n                {\n                    // correct wrap\n\n                    return CreateLines(source, entireWidth, paraProps, firstLineRemain);\n                }\n                else\n                {\n                    // wrong wrap; first line word is too long\n\n                    return CreateLines(source, entireWidth, paraProps, new LineBreakMarkGeometry(this));\n                }\n            }\n        }\n\n        private IEnumerable<CGeometry> CreateLines(\n            SimpleTextSource source,\n            double entireWidth,\n            TextParagraphProperties paraProps,\n            TextLine firstLine)\n        {\n            TextLine prev = firstLine;\n\n            var length = firstLine.Length;\n            while (length < Text.Length)\n            {\n                var line = TextFormatter.Current.FormatLine(source, length, entireWidth, paraProps, prev.TextLineBreak);\n                if (line is null)\n                    break;\n\n                yield return new TextLineGeometry(this, source, prev, true);\n\n                prev = line;\n                length += line.Length;\n            }\n\n            yield return new TextLineGeometry(this, source, prev, false);\n        }\n\n        private IEnumerable<CGeometry> CreateLines(\n            SimpleTextSource source,\n            double entireWidth,\n            TextParagraphProperties paraProps,\n            CGeometry? prevGeo = null)\n        {\n            if (prevGeo is not null)\n                yield return prevGeo;\n\n            TextLine? prev = TextFormatter.Current.FormatLine(source, 0, entireWidth, paraProps);\n            if (prev is null)\n                yield break;\n\n            var length = prev.Length;\n            while (length < Text.Length)\n            {\n                var line = TextFormatter.Current.FormatLine(source, length, entireWidth, paraProps, prev.TextLineBreak);\n                if (line is null)\n                    break;\n\n                yield return new TextLineGeometry(this, source, prev, true);\n\n                prev = line;\n                length += line.Length;\n            }\n\n            yield return new TextLineGeometry(this, source, prev, false);\n        }\n\n\n\n\n        internal TextParagraphProperties CreateTextParagraphProperties(TextRunProperties runProps)\n            => new GenericTextParagraphProperties(\n                        FlowDirection.LeftToRight,\n                        TextAlignment.Left, true, false,\n                        runProps,\n                        TextWrapping.Wrap,\n                        double.NaN,\n                        0,\n                        0);\n\n        internal TextRunProperties CreateTextRunProperties(IBrush? foreground)\n            => new GenericTextRunProperties(Typeface, FontSize, foregroundBrush: foreground);\n\n        public override string AsString() => Text;\n    }\n\n\n    readonly struct SimpleTextSource : ITextSource\n    {\n        private readonly ReadOnlyMemory<char> _text;\n        private readonly TextRunProperties _props;\n\n        public TextRunProperties RunProperties => _props;\n\n        public SimpleTextSource(ReadOnlyMemory<char> text, TextRunProperties props)\n        {\n            _text = text;\n            _props = props;\n        }\n\n        public TextRun? GetTextRun(int textSourceIndex)\n        {\n            return new TextCharacters(_text.Slice(textSourceIndex), _props);\n        }\n\n        public SimpleTextSource Subsource(int start, int length)\n            => new SimpleTextSource(_text.Slice(start, length), _props);\n\n        public string Substring(int start, int length)\n            => _text.Slice(start, length).ToString();\n\n        public string Substring(int start)\n            => _text.Slice(start).ToString();\n\n        public SimpleTextSource ChangeForeground(IBrush? foreground)\n        {\n            var runProps = new GenericTextRunProperties(_props.Typeface, _props.FontRenderingEmSize, foregroundBrush: foreground);\n            return new SimpleTextSource(_text, runProps);\n        }\n\n        public override string ToString() => _text.ToString();\n    }\n}"
  },
  {
    "path": "ColorTextBlock.Avalonia/CSpan.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Collections;\nusing Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Media;\nusing Avalonia.Metadata;\nusing ColorTextBlock.Avalonia.Geometries;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ColorTextBlock.Avalonia\n{\n    /// <summary>\n    /// Text decoration\n    /// </summary>\n    public class CSpan : CInline\n    {\n        /// <summary>\n        /// The thickness of the border\n        /// </summary>\n        /// <seealso cref=\"BorderThickness\"/>\n        public static readonly StyledProperty<Thickness> BorderThicknessProperty =\n            AvaloniaProperty.Register<CSpan, Thickness>(nameof(BorderThickness));\n\n        /// <summary>\n        /// The brush of the border.\n        /// </summary>\n        /// <seealso cref=\"BorderBrush\"/>\n        public static readonly StyledProperty<IBrush> BorderBrushProperty =\n            AvaloniaProperty.Register<CSpan, IBrush>(nameof(BorderBrush));\n\n        /// <summary>\n        /// The radius of the border rounded corners\n        /// </summary>\n        /// <seealso cref=\"CornerRadius\"/>\n        public static readonly StyledProperty<CornerRadius> CornerRadiusProperty =\n            AvaloniaProperty.Register<CSpan, CornerRadius>(nameof(CornerRadius));\n\n        /// <summary>\n        /// The box shadow effect parameters\n        /// </summary>\n        /// <seealso cref=\"BoxShadow\"/>\n        public static readonly StyledProperty<BoxShadows> BoxShadowProperty =\n            AvaloniaProperty.Register<CSpan, BoxShadows>(nameof(BoxShadow));\n\n        /// <summary>\n        /// The padding to place around the Child control.\n        /// </summary>\n        /// <seealso cref=\"Padding\"/>\n        public static readonly StyledProperty<Thickness> PaddingProperty =\n            AvaloniaProperty.Register<CSpan, Thickness>(nameof(Padding));\n\n        /// <summary>\n        /// The margin around the element.\n        /// </summary>\n        /// <seealso cref=\"Margin\"/>\n        public static readonly StyledProperty<Thickness> MarginProperty =\n            InputElement.MarginProperty.AddOwner<CSpan>();\n\n        /// <summary>\n        /// THe content of the eleemnt\n        /// </summary>\n        /// <seealso cref=\"Content\"/>\n        public static readonly StyledProperty<IEnumerable<CInline>> ContentProperty =\n            AvaloniaProperty.Register<CSpan, IEnumerable<CInline>>(nameof(Content));\n\n        static CSpan()\n        {\n            ContentProperty.Changed.AddClassHandler<CSpan>(\n                (x, e) =>\n                {\n                    if (e.OldValue is IEnumerable<CInline> oldlines)\n                    {\n                        foreach (var child in oldlines)\n                            x.LogicalChildren.Remove(child);\n                    }\n                    if (e.NewValue is IEnumerable<CInline> newlines)\n                    {\n                        foreach (var child in newlines)\n                            x.LogicalChildren.Add(child);\n                    }\n                });\n        }\n\n        private Border? _border;\n\n        /// <summary>\n        /// The thickness of the border\n        /// </summary>\n        public Thickness BorderThickness\n        {\n            get => GetValue(BorderThicknessProperty);\n            set => SetValue(BorderThicknessProperty, value);\n        }\n\n        /// <summary>\n        /// The brush of the border.\n        /// </summary>\n        public IBrush BorderBrush\n        {\n            get => GetValue(BorderBrushProperty);\n            set => SetValue(BorderBrushProperty, value);\n        }\n\n        /// <summary>\n        /// The radius of the border rounded corners\n        /// </summary>\n        public CornerRadius CornerRadius\n        {\n            get => GetValue(CornerRadiusProperty);\n            set => SetValue(CornerRadiusProperty, value);\n        }\n\n        /// <summary>\n        /// The box shadow effect parameters\n        /// </summary>\n        public BoxShadows BoxShadow\n        {\n            get => GetValue(BoxShadowProperty);\n            set => SetValue(BoxShadowProperty, value);\n        }\n\n        /// <summary>\n        /// The padding to place around the Child control.\n        /// </summary>\n        public Thickness Padding\n        {\n            get => GetValue(PaddingProperty);\n            set => SetValue(PaddingProperty, value);\n        }\n\n        /// <summary>\n        /// The margin around the element.\n        /// </summary>\n        public Thickness Margin\n        {\n            get => GetValue(MarginProperty);\n            set => SetValue(MarginProperty, value);\n        }\n\n        /// <summary>\n        /// THe content of the eleemnt\n        /// </summary>\n        [Content]\n        public IEnumerable<CInline> Content\n        {\n            get { return GetValue(ContentProperty); }\n            set { SetValue(ContentProperty, value); }\n        }\n\n        public CSpan()\n        {\n            var clst = new AvaloniaList<CInline>();\n            // for xaml loader\n            clst.CollectionChanged += (s, e) =>\n            {\n                if (e.OldItems != null)\n                    foreach (var child in e.OldItems)\n                        LogicalChildren.Remove((CInline)child);\n\n                if (e.NewItems != null)\n                    foreach (var child in e.NewItems)\n                        LogicalChildren.Add((CInline)child);\n            };\n\n            Content = clst;\n        }\n\n        public CSpan(IEnumerable<CInline> inlines)\n        {\n            Content = inlines.ToArray();\n        }\n\n        protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)\n        {\n            base.OnPropertyChanged(change);\n\n            switch (change.Property.Name)\n            {\n                case nameof(BorderThickness):\n                case nameof(CornerRadius):\n                case nameof(BoxShadow):\n                case nameof(Padding):\n                case nameof(Margin):\n                    OnBorderPropertyChanged(true);\n                    break;\n\n                case nameof(BorderBrush):\n                    OnBorderPropertyChanged(false);\n                    break;\n            }\n        }\n\n        private void OnBorderPropertyChanged(bool requestMeasure)\n        {\n            bool borderEnabled =\n                BorderThickness != default ||\n                Padding != default ||\n                CornerRadius != default ||\n                Margin != default ||\n                !BoxShadow.Equals(default);\n\n            if (borderEnabled)\n            {\n                if (_border is null)\n                {\n                    _border = new Border();\n                    LogicalChildren.Add(_border);\n                }\n\n                _border.BorderThickness = BorderThickness;\n                _border.BorderBrush = BorderBrush;\n                _border.CornerRadius = CornerRadius;\n                _border.BoxShadow = BoxShadow;\n                _border.Padding = Padding;\n                _border.Margin = Margin;\n            }\n            else\n            {\n                if (_border is not null)\n                    LogicalChildren.Remove(_border);\n                _border = null;\n            }\n\n            if (requestMeasure) RequestMeasure();\n            else RequestRender();\n        }\n\n        protected override IEnumerable<CGeometry> MeasureOverride(\n            double entireWidth,\n            double remainWidth)\n        {\n            if (_border is not null)\n            {\n                _border.Measure(Size.Infinity);\n\n                entireWidth -= _border.DesiredSize.Width;\n                remainWidth -= _border.DesiredSize.Width;\n\n                return PrivateMeasure(_border, entireWidth, remainWidth);\n            }\n            else\n            {\n                return PrivateMeasure(entireWidth, remainWidth);\n            }\n        }\n\n        private IEnumerable<CGeometry> PrivateMeasure(\n            Border border,\n            double entireWidth,\n            double remainWidth)\n        {\n            var buffer = new List<CGeometry>();\n            foreach (var adding in PrivateMeasure(entireWidth, remainWidth))\n            {\n                // save linebreak before span\n                if (adding is LineBreakMarkGeometry && buffer.Count == 0)\n                {\n                    yield return adding;\n                    continue;\n                }\n\n                buffer.Add(adding);\n\n                if (adding.LineBreak)\n                {\n                    yield return DecoratorGeometry.New(this, buffer, border);\n                    buffer.Clear();\n                }\n            }\n            if (buffer.Count != 0)\n            {\n                yield return DecoratorGeometry.New(this, buffer, border);\n            }\n        }\n\n        private IEnumerable<CGeometry> PrivateMeasure(\n            double entireWidth,\n            double remainWidth)\n        {\n            foreach (CInline inline in Content)\n            {\n                IEnumerable<CGeometry> addings = inline.Measure(entireWidth, remainWidth);\n                foreach (var add in addings)\n                {\n                    yield return add;\n\n                    if (add.LineBreak) remainWidth = entireWidth;\n                    else remainWidth -= add.Width;\n                }\n            }\n        }\n\n        public override string AsString() => String.Join(\"\", Content.Select(c => c.AsString()));\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/CStrikethrough.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace ColorTextBlock.Avalonia\n{\n    /// <summary>\n    /// Strikethrough decoration\n    /// </summary>\n    public class CStrikethrough : CSpan\n    {\n        public CStrikethrough() { }\n\n        public CStrikethrough(IEnumerable<CInline> inlines) : base(inlines)\n        {\n            IsStrikethrough = true;\n        }\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/CTextBlock.cs",
    "content": "﻿\nusing Avalonia;\nusing Avalonia.Automation.Peers;\nusing Avalonia.Collections;\nusing Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Layout;\nusing Avalonia.Media;\nusing Avalonia.Media.Imaging;\nusing Avalonia.Metadata;\nusing Avalonia.Rendering.Composition;\nusing Avalonia.Utilities;\nusing Avalonia.VisualTree;\nusing ColorTextBlock.Avalonia.Geometries;\nusing System;\nusing System.Collections.Generic;\nusing System.Collections.Specialized;\nusing System.Diagnostics;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Linq;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nnamespace ColorTextBlock.Avalonia\n{\n    /// <summary>\n    /// TextBlock to enables character-by-character decoration.\n    /// </summary>\n    // 文字ごとの装飾を可能とするTextBlock\n    public class CTextBlock : Control, ITextPointerHandleable\n    {\n        /// <summary>\n        /// Use for adjusting vertical position between CTextBlocks. e.g. between a list marker and a list item.\n        /// </summary>\n        // リストマーカーと項目の縦位置の調整といった、CTextBlock間で文字の位置調整に使用します。\n        private static readonly StyledProperty<double> BaseHeightProperty =\n            AvaloniaProperty.Register<CTextBlock, double>(\"BaseHeight\");\n\n        /// <summary>\n        /// Use to indicate the height of each lines. If this value is NaN, the height is calculated by content.\n        /// </summary>\n        /// <seealso cref=\"LineHeight\"/>\n        // 一行の高さ指定の為に使用します。指定がない(NaN)の場合、コンテンツによって行の高さが決まります。\n        public static readonly StyledProperty<double> LineHeightProperty =\n            AvaloniaProperty.Register<CTextBlock, double>(nameof(LineHeight), defaultValue: Double.NaN);\n\n        /// <summary>\n        /// Line to line spacing.\n        /// </summary>\n        /// <seealso cref=\"LineSpacing\"/>\n        // 行間の幅\n        public static readonly StyledProperty<double> LineSpacingProperty =\n            AvaloniaProperty.Register<CTextBlock, double>(nameof(LineSpacing), defaultValue: 0);\n\n        /// <summary>\n        /// The brush of background.\n        /// </summary>\n        /// <seealso cref=\"Background\"/>\n        public static readonly StyledProperty<IBrush?> BackgroundProperty =\n            Border.BackgroundProperty.AddOwner<CTextBlock>();\n\n        /// <summary>\n        /// The brush of characters.\n        /// </summary>\n        /// <seealso cref=\"Foreground\"/>\n        public static readonly StyledProperty<IBrush?> ForegroundProperty =\n            TextBlock.ForegroundProperty.AddOwner<CTextBlock>();\n\n        /// <summary>\n        /// The font family of characters\n        /// </summary>\n        /// <seealso cref=\"FontFamily\"/>\n        public static readonly StyledProperty<FontFamily> FontFamilyProperty =\n            TextBlock.FontFamilyProperty.AddOwner<CTextBlock>();\n\n        /// <summary>\n        /// The font weight of characters\n        /// </summary>\n        /// <seealso cref=\"FontWeight\"/>\n        public static readonly StyledProperty<FontWeight> FontWeightProperty =\n            TextBlock.FontWeightProperty.AddOwner<CTextBlock>();\n\n        /// <summary>\n        /// The font size of characters\n        /// </summary>\n        /// <seealso cref=\"FontSize\"/>\n        public static readonly StyledProperty<double> FontSizeProperty =\n            TextBlock.FontSizeProperty.AddOwner<CTextBlock>();\n\n        /// <summary>\n        /// The font style of characters\n        /// </summary>\n        /// <seealso cref=\"FontStyle\"/>\n        public static readonly StyledProperty<FontStyle> FontStyleProperty =\n            TextBlock.FontStyleProperty.AddOwner<CTextBlock>();\n\n        /// <summary>\n        /// Use to indicate the vertical position of text within line.\n        /// For example, it is used to align text to the top or to the bottom.\n        /// </summary>\n        /// <seealso cref=\"TextVerticalAlignment\"/>\n        // テキストを上揃えで描画するか下揃えで描画するか指定します。\n        public static readonly StyledProperty<TextVerticalAlignment> TextVerticalAlignmentProperty =\n            AvaloniaProperty.Register<CTextBlock, TextVerticalAlignment>(\n                nameof(TextVerticalAlignment),\n                defaultValue: TextVerticalAlignment.Base,\n                inherits: true);\n\n        /// <summary>\n        /// Use to indicate the mode of text wrapping.\n        /// </summary>\n        /// <seealso cref=\"TextWrapping\"/>\n        public static readonly StyledProperty<TextWrapping> TextWrappingProperty =\n            AvaloniaProperty.Register<CTextBlock, TextWrapping>(nameof(TextWrapping), defaultValue: TextWrapping.Wrap);\n\n        /// <summary>\n        /// Contents to be displayed.\n        /// </summary>\n        /// <seealso cref=\"Content\"/>\n        public static readonly DirectProperty<CTextBlock, AvaloniaList<CInline>> ContentProperty =\n            AvaloniaProperty.RegisterDirect<CTextBlock, AvaloniaList<CInline>>(\n                nameof(Content),\n                    o => o.Content,\n                    (o, v) => o.Content = v);\n\n        public static readonly StyledProperty<IBrush?> SelectionBrushProperty =\n            SelectableTextBlock.SelectionBrushProperty.AddOwner<CTextBlock>();\n\n        /// <summary>\n        /// Horizontal text alignment.\n        /// </summary>\n        /// <seealso cref=\"TextAlignment\"/>\n        public static readonly StyledProperty<TextAlignment> TextAlignmentProperty =\n            AvaloniaProperty.Register<CTextBlock, TextAlignment>(\n                nameof(TextAlignment), defaultValue: TextAlignment.Left);\n\n        static CTextBlock()\n        {\n            ClipToBoundsProperty.OverrideDefaultValue<CTextBlock>(true);\n\n            AffectsRender<CTextBlock>(\n                BackgroundProperty,\n                TextBlock.ForegroundProperty,\n                TextBlock.FontWeightProperty,\n                TextBlock.FontSizeProperty,\n                TextBlock.FontStyleProperty);\n        }\n\n        private double _computedBaseHeight;\n        private AvaloniaList<CInline> _content;\n        private Size _constraint;\n        private Size _measured;\n        private readonly List<CGeometry> _metries;\n        private readonly List<LineInfo> _lines;\n        private readonly List<CInlineUIContainer> _containers;\n        private CGeometry? _entered;\n        private CGeometry? _pressed;\n        private string? _text;\n        private bool _measureRequested;\n\n        private TextPointer? _beginSelect;\n        private List<CGeometry> _intermediates = new();\n        private TextPointer? _endSelect;\n\n\n        public Selection? Selection =>\n            _beginSelect is not null && _endSelect is not null ?\n                new Selection(_beginSelect.Index, _endSelect.Index) :\n                null;\n\n        /// <summary>\n        /// The brush of background.\n        /// </summary>\n        public IBrush? Background\n        {\n            get { return GetValue(BackgroundProperty); }\n            set { SetValue(BackgroundProperty, value); }\n        }\n\n        /// <summary>\n        /// The brush of characters.\n        /// </summary>\n        public IBrush? Foreground\n        {\n            get { return GetValue(ForegroundProperty); }\n            set { SetValue(ForegroundProperty, value); }\n        }\n\n        /// <summary>\n        /// The font family of characters\n        /// </summary>\n        public FontFamily FontFamily\n        {\n            get { return GetValue(FontFamilyProperty); }\n            set { SetValue(FontFamilyProperty, value); }\n        }\n\n        /// <summary>\n        /// The font size of characters\n        /// </summary>\n        public double FontSize\n        {\n            get { return GetValue(FontSizeProperty); }\n            set { SetValue(FontSizeProperty, value); }\n        }\n\n        /// <summary>\n        /// The font style of characters\n        /// </summary>\n        public FontStyle FontStyle\n        {\n            get { return GetValue(FontStyleProperty); }\n            set { SetValue(FontStyleProperty, value); }\n        }\n\n        /// <summary>\n        /// The font weight of characters\n        /// </summary>\n        public FontWeight FontWeight\n        {\n            get { return GetValue(FontWeightProperty); }\n            set { SetValue(FontWeightProperty, value); }\n        }\n\n        /// <summary>\n        /// Use to indicate the mode of text wrapping.\n        /// </summary>\n        public TextWrapping TextWrapping\n        {\n            get { return GetValue(TextWrappingProperty); }\n            set { SetValue(TextWrappingProperty, value); }\n        }\n\n        /// <summary>\n        /// Horizontal text alignment.\n        /// </summary>\n        public TextAlignment TextAlignment\n        {\n            get { return GetValue(TextAlignmentProperty); }\n            set { SetValue(TextAlignmentProperty, value); }\n        }\n\n        /// <summary>\n        /// Use to indicate the vertical position of text within line.\n        /// For example, it is used to align text to the top or to the bottom.\n        /// </summary>\n        public TextVerticalAlignment TextVerticalAlignment\n        {\n            get { return GetValue(TextVerticalAlignmentProperty); }\n            set { SetValue(TextVerticalAlignmentProperty, value); }\n        }\n\n        /// <summary>\n        /// Use to indicate the height of each lines. If this value is NaN, the height is calculated by content.\n        /// </summary>\n        public double LineHeight\n        {\n            get { return GetValue(LineHeightProperty); }\n            set { SetValue(LineHeightProperty, value); }\n        }\n\n        /// <summary>\n        /// Line to line spacing.\n        /// </summary>\n        public double LineSpacing\n        {\n            get { return GetValue(LineSpacingProperty); }\n            set { SetValue(LineSpacingProperty, value); }\n        }\n\n        /// <summary>\n        /// Contents to be displayed.\n        /// </summary>\n        [Content]\n        public AvaloniaList<CInline> Content\n        {\n\n            get => _content;\n            set\n            {\n                var olds = _content;\n\n                if (SetAndRaise(ContentProperty, ref _content, value))\n                {\n                    olds.CollectionChanged -= ContentCollectionChangedd;\n\n                    DetachChildren(olds);\n                    AttachChildren(_content);\n\n                    _content.CollectionChanged += ContentCollectionChangedd;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Textual presentation of content.\n        /// </summary>\n        public string Text\n        {\n            get => _text ??= String.Join(\"\", Content.Select(c => c.AsString()));\n        }\n\n        public IBrush? SelectionBrush\n        {\n            get => GetValue(SelectionBrushProperty);\n            set => SetValue(SelectionBrushProperty, value);\n        }\n\n\n        public CTextBlock()\n        {\n            _content = new AvaloniaList<CInline>();\n            _content.CollectionChanged += ContentCollectionChangedd;\n\n            _metries = new List<CGeometry>();\n            _lines = new List<LineInfo>();\n            _containers = new List<CInlineUIContainer>();\n\n            RenderOptions.SetBitmapInterpolationMode(this, BitmapInterpolationMode.HighQuality);\n        }\n\n        public CTextBlock(string text) : this()\n        {\n            _content.Add(new CRun() { Text = text });\n        }\n\n        public CTextBlock(params CInline[] inlines) : this((IEnumerable<CInline>)inlines)\n        {\n        }\n\n        public CTextBlock(IEnumerable<CInline> inlines) : this()\n        {\n            _content.AddRange(inlines);\n        }\n\n        #region pointer event\n\n        protected override void OnPointerExited(PointerEventArgs e)\n        {\n            base.OnPointerExited(e);\n\n            if (_entered is not null)\n            {\n                _entered.OnMouseLeave?.Invoke(this);\n                _entered = null;\n            }\n        }\n\n        protected override void OnPointerMoved(PointerEventArgs e)\n        {\n            base.OnPointerMoved(e);\n\n            Point point = e.GetPosition(this);\n\n            if (_entered is not null)\n            {\n                var relX = point.X - _entered.Left;\n                var relY = point.Y - _entered.Top;\n\n                if (!isEntered(_entered))\n                {\n                    _entered.OnMouseLeave?.Invoke(this);\n                    _entered = null;\n                }\n                else return;\n            }\n\n            foreach (CGeometry metry in _metries)\n            {\n                if (isEntered(metry))\n                {\n                    metry.OnMouseEnter?.Invoke(this);\n                    _entered = metry;\n                    break;\n                }\n            }\n\n            bool isEntered(CGeometry metry)\n            {\n                var relX = point.X - metry.Left;\n                var relY = point.Y - metry.Top;\n\n                return 0 <= relX && relX <= metry.Width\n                    && 0 <= relY && relY <= metry.Height;\n            }\n        }\n\n        protected override void OnPointerPressed(PointerPressedEventArgs e)\n        {\n            base.OnPointerPressed(e);\n            if (e.GetCurrentPoint(this).Properties.IsLeftButtonPressed)\n            {\n                Point point = e.GetPosition(this);\n\n                foreach (CGeometry metry in _metries)\n                {\n                    if ((metry.OnMousePressed is not null || metry.OnMouseReleased is not null) && isEntered(metry))\n                    {\n                        metry.OnMousePressed?.Invoke(this);\n                        _pressed = metry;\n                        e.Handled = true;\n                        return;\n                    }\n                }\n\n                bool isEntered(CGeometry metry)\n                {\n                    var relX = point.X - metry.Left;\n                    var relY = point.Y - metry.Top;\n\n                    return 0 <= relX && relX <= metry.Width\n                        && 0 <= relY && relY <= metry.Height;\n                }\n            }\n        }\n\n        protected override void OnPointerReleased(PointerReleasedEventArgs e)\n        {\n            base.OnPointerReleased(e);\n\n            if (_pressed is not null && e.InitialPressMouseButton == MouseButton.Left)\n            {\n                e.Handled = true;\n                _pressed.OnMouseReleased?.Invoke(this);\n\n                Point point = e.GetPosition(this);\n                var relX = point.X - _pressed.Left;\n                var relY = point.Y - _pressed.Top;\n\n                if (0 <= relX && relX <= _pressed.Width\n                    && 0 <= relY && relY <= _pressed.Height)\n                {\n                    _pressed.OnClick?.Invoke(this);\n                }\n\n                _pressed = null;\n            }\n        }\n\n        #endregion\n\n        protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)\n        {\n            base.OnPropertyChanged(change);\n\n            switch (change.Property.Name)\n            {\n                case nameof(Content):\n                case nameof(TextBlock.FontSize):\n                case nameof(TextBlock.FontStyle):\n                case nameof(TextBlock.FontWeight):\n                case nameof(TextWrapping):\n                case nameof(Bounds):\n                case nameof(TextVerticalAlignment):\n                case nameof(LineHeight):\n                case nameof(LineSpacing):\n                    OnMeasureSourceChanged();\n                    break;\n\n                case nameof(BaseHeightProperty):\n                    if (_computedBaseHeight != GetValue(BaseHeightProperty))\n                    {\n                        _measureRequested = true;\n                        InvalidateMeasure();\n                        InvalidateArrange();\n                    }\n                    break;\n            }\n        }\n\n        public void ObserveBaseHeightOf(CTextBlock target)\n        {\n            if (target is not null)\n                this.Bind(BaseHeightProperty, target.GetBindingObservable(BaseHeightProperty));\n        }\n\n        private void ContentCollectionChangedd(object? sender, NotifyCollectionChangedEventArgs e)\n        {\n            switch (e.Action)\n            {\n                case NotifyCollectionChangedAction.Reset:\n                case NotifyCollectionChangedAction.Remove:\n                    if (e.OldItems is not null)\n                        DetachChildren(e.OldItems.Cast<CInline>());\n                    break;\n\n                case NotifyCollectionChangedAction.Replace:\n                    if (e.OldItems is not null)\n                        DetachChildren(e.OldItems.Cast<CInline>());\n\n                    if (e.NewItems is not null)\n                        AttachChildren(e.NewItems.Cast<CInline>());\n                    break;\n\n                case NotifyCollectionChangedAction.Add:\n                    if (e.NewItems is not null)\n                        AttachChildren(e.NewItems.Cast<CInline>());\n                    break;\n            }\n        }\n\n        /// <summary>\n        /// Add CInline to LogicalChildren to inherit the value of AvaloniaProperty.\n        /// And add Control, which is haved by CInlineUIContainer, to VisualChildren.\n        /// </summary>\n        private void AttachChildren(IEnumerable<CInline> newItems)\n        {\n            foreach (CInline item in newItems)\n            {\n                LogicalChildren.Add(item);\n                AttachForVisual(item);\n            }\n\n            void AttachForVisual(CInline item)\n            {\n                if (item is CInlineUIContainer container)\n                {\n                    var content = container.Content;\n\n                    var visparent = container.Content.GetVisualParent();\n                    if (visparent is CTextBlock cblock)\n                    {\n                        cblock.VisualChildren.Remove(content);\n                        cblock.LogicalChildren.Remove(content);\n                    }\n                    else if (visparent is object)\n                    {\n                        Debug.Print(\"Control has another parent\");\n                        return;\n                    }\n\n                    VisualChildren.Add(container.Content);\n                    LogicalChildren.Add(container.Content);\n\n                    _containers.Add(container);\n                }\n                else if (item is CSpan span)\n                    foreach (var child in span.Content)\n                        AttachForVisual(child);\n            }\n        }\n\n        /// <summary>\n        /// Remove CInline to LogicalChildren to inherit the value of AvaloniaProperty.\n        /// And remove Control, which is haved by CInlineUIContainer, to VisualChildren.\n        /// </summary>\n        private void DetachChildren(IEnumerable<CInline> removeItems)\n        {\n            foreach (CInline item in removeItems)\n            {\n                LogicalChildren.Remove(item);\n                DetachForVisual(item);\n            }\n\n            void DetachForVisual(CInline item)\n            {\n                if (item is CInlineUIContainer container)\n                {\n                    VisualChildren.Remove(container.Content);\n                    LogicalChildren.Remove(container.Content);\n\n                    _containers.Remove(container);\n                }\n                else if (item is CSpan span)\n                    foreach (var child in span.Content)\n                        DetachForVisual(child);\n            }\n        }\n\n        internal void OnMeasureSourceChanged()\n        {\n            SetValue(BaseHeightProperty, default);\n            _measureRequested = true;\n            InvalidateMeasure();\n            InvalidateArrange();\n        }\n\n        private void RepaintRequested()\n        {\n            InvalidateVisual();\n        }\n\n        /// <summary>\n        /// Check to see if the arrangement size is different from the size of measuring.\n        /// </summary>\n        // 配置領域が寸法計算時に与えられた領域より広すぎるもしくは狭すぎないか確認します。\n        protected override Size ArrangeOverride(Size finalSize)\n        {\n            if (_measured.Width > finalSize.Width)\n            {\n                finalSize = finalSize.WithWidth(Math.Ceiling(_measured.Width));\n            }\n            foreach (var container in _containers)\n            {\n                var indicator = container.Indicator;\n                if (indicator is null) continue;\n\n                indicator.Control.Arrange(new Rect(indicator.Left, indicator.Top, indicator.Width, indicator.Height));\n            }\n            if (AreClose(_constraint.Width, finalSize.Width))\n            {\n                return finalSize;\n            }\n\n            _constraint = new Size(finalSize.Width, Double.PositiveInfinity);\n            _measured = UpdateGeometry();\n\n            return finalSize;\n        }\n\n        protected override Size MeasureOverride(Size availableSize)\n        {\n            if (_measured.Width == 0d || !AreClose(availableSize.Width, _constraint.Width) || _measureRequested)\n            {\n                _measureRequested = false;\n                _constraint = availableSize;\n                _measured = UpdateGeometry();\n            }\n\n            InvalidateArrange();\n\n            return _measured;\n        }\n\n        private static bool AreClose(double v1, double v2)\n        {\n            if (v1 == v2) return true;\n            double eps = (Math.Abs(v1) + Math.Abs(v2) + 10.0) * 2.2204460492503131e-016;\n            double diff = Math.Abs(v1 - v2);\n            return diff < eps;\n        }\n\n        private Size UpdateGeometry()\n        {\n            _metries.Clear();\n            _lines.Clear();\n\n            double entireWidth = _constraint.Width;\n            if (Double.IsInfinity(_constraint.Width) && Bounds.Width != 0)\n                entireWidth = Bounds.Width;\n\n\n            double width = 0;\n            double height = 0;\n\n            // measure & split by linebreak\n            var reqHeight = GetValue(BaseHeightProperty);\n            var entireLineHeight = LineHeight;\n            {\n                LineInfo? now = null;\n\n                double remainWidth = entireWidth;\n\n                foreach (CInline inline in Content)\n                {\n                    IEnumerable<CGeometry> inlineGeometry =\n                        inline.Measure(\n                            (TextWrapping == TextWrapping.NoWrap) ? Double.PositiveInfinity : entireWidth,\n                            (TextWrapping == TextWrapping.NoWrap) ? Double.PositiveInfinity : remainWidth);\n\n                    foreach (CGeometry metry in inlineGeometry)\n                    {\n                        if (now is null)\n                        {\n                            _lines.Add(now = new LineInfo());\n                            if (_lines.Count == 1)\n                                now.RequestBaseHeight = reqHeight;\n                        }\n\n                        if (now.Add(metry))\n                        {\n                            if (!Double.IsNaN(entireLineHeight))\n                                now.OverwriteHeight(entireLineHeight);\n\n                            width = Math.Max(width, now.Width);\n                            height += now.Height;\n\n                            now = null;\n                            remainWidth = entireWidth;\n                        }\n                        else remainWidth -= metry.Width;\n                    }\n                }\n\n                if (now is not null)\n                {\n                    if (!Double.IsNaN(entireLineHeight))\n                        now.OverwriteHeight(entireLineHeight);\n\n                    width = Math.Max(width, now.Width);\n                    height += now.Height;\n                }\n            }\n\n            if (_lines.Count > 0)\n            {\n                _computedBaseHeight = _lines[0].BaseHeight;\n                SetValue(BaseHeightProperty, _lines[0].BaseHeight);\n            }\n\n            var lineSpc = LineSpacing;\n            height += lineSpc * (_lines.Count - 1);\n\n            // set position\n            {\n                var topOffset = 0d;\n                var leftOffset = 0d;\n\n                foreach (LineInfo lineInf in _lines)\n                {\n                    lineInf.Top = topOffset;\n\n                    switch (TextAlignment)\n                    {\n                        case TextAlignment.Left:\n                            leftOffset = 0d;\n                            break;\n                        case TextAlignment.Center:\n                            leftOffset = (entireWidth - lineInf.Width) / 2;\n                            break;\n                        case TextAlignment.Right:\n                            leftOffset = entireWidth - lineInf.Width;\n                            break;\n                    }\n\n                    foreach (CGeometry metry in lineInf.Metries)\n                    {\n                        metry.Left = leftOffset;\n                        switch (metry.TextVerticalAlignment)\n                        {\n                            case TextVerticalAlignment.Top:\n                                metry.Top = topOffset;\n                                break;\n                            case TextVerticalAlignment.Center:\n                                metry.Top = topOffset + (lineInf.Height - metry.Height) / 2;\n                                break;\n                            case TextVerticalAlignment.Bottom:\n                                metry.Top = topOffset + lineInf.Height - metry.Height;\n                                break;\n                            case TextVerticalAlignment.Base:\n                                metry.Top = topOffset + lineInf.BaseHeight - metry.BaseHeight;\n                                break;\n                        }\n\n                        leftOffset += metry.Width;\n\n                        _metries.Add(metry);\n                        metry.Arranged();\n                    }\n\n                    topOffset += lineInf.Height + lineSpc;\n                }\n            }\n\n            foreach (CGeometry metry in _metries) metry.RepaintRequested += RepaintRequested;\n\n            if (_beginSelect is not null && _endSelect is not null)\n            {\n                Select(_beginSelect.Index, _endSelect.Index);\n            }\n\n            return new Size(width, height);\n        }\n\n        public override void Render(DrawingContext context)\n        {\n            if (Background is not null)\n            {\n                context.FillRectangle(Background, new Rect(0, 0, Bounds.Width, Bounds.Height));\n            }\n\n            IBrush select = SelectionBrush ?? Brushes.Cyan;\n            List<Rect>? fillAfter = null;\n\n            if (_beginSelect is not null && _endSelect is not null)\n            {\n                fillAfter = new List<Rect>();\n\n                TextPointer bgn, end;\n                if (_beginSelect < _endSelect)\n                {\n                    bgn = _beginSelect;\n                    end = _endSelect;\n                }\n                else\n                {\n                    bgn = _endSelect;\n                    end = _beginSelect;\n                }\n\n\n                if (ReferenceEquals(bgn.Geometry, end.Geometry))\n                {\n                    var rct = new Rect(\n                        bgn.Geometry.Left + bgn.Distance,\n                        bgn.Geometry.Top,\n                        end.Distance - bgn.Distance,\n                        bgn.Geometry.Height);\n\n                    TryRender(bgn.Geometry, rct);\n                }\n                else\n                {\n                    TryRender(bgn.Geometry, new Rect(bgn.Geometry.Left + bgn.Distance, bgn.Geometry.Top, bgn.Geometry.Width - bgn.Distance, bgn.Geometry.Height));\n\n                    foreach (var inter in _intermediates)\n                    {\n                        TryRender(inter, new Rect(inter.Left, inter.Top, inter.Width, inter.Height));\n                    }\n\n                    TryRender(end.Geometry, new Rect(end.Geometry.Left, end.Geometry.Top, end.Distance, end.Geometry.Height));\n                }\n\n                void TryRender(CGeometry metry, Rect rct)\n                {\n                    if (metry is TextGeometry)\n                    {\n                        context.FillRectangle(select, rct);\n                    }\n                    else\n                    {\n                        fillAfter.Add(rct);\n                    }\n                }\n            }\n\n            foreach (var metry in _metries)\n            {\n                metry.Render(context);\n            }\n\n            if (fillAfter is not null)\n            {\n                if (select is ISolidColorBrush colorBrush)\n                {\n                    var selectFill = new SolidColorBrush(colorBrush.Color, .5);\n                    foreach (var fillRct in fillAfter)\n                    {\n                        context.FillRectangle(selectFill, fillRct);\n                    }\n                }\n                else\n                {\n                    foreach (var fillRct in fillAfter)\n                    {\n                        var pen = new Pen(select, 2);\n                        var rct = new Rect(fillRct.Left - 1, fillRct.Top - 1, fillRct.Width + 2, fillRct.Height + 2);\n                        context.DrawRectangle(pen, rct);\n                    }\n                }\n            }\n        }\n\n        protected override AutomationPeer OnCreateAutomationPeer()\n        {\n            return new CTextBlockAutomationPeer(this);\n        }\n\n        public void Select(int begin, int end)\n        {\n            int beginBack = begin;\n            int endBack = end;\n            for (var i = 0; i < _metries.Count; ++i)\n            {\n                var metry = _metries[i];\n                var caretLength = metry.CaretLength;\n\n                if (begin < caretLength || (i == _metries.Count - 1 && begin == caretLength))\n                {\n                    _beginSelect = metry.CalcuatePointerFrom(begin).Wrap(this, beginBack - begin);\n                    begin = Int32.MaxValue;\n                }\n                else begin -= caretLength;\n\n                if (end < caretLength || (i == _metries.Count - 1 && end == caretLength))\n                {\n                    _endSelect = metry.CalcuatePointerFrom(end).Wrap(this, endBack - end);\n                    if (endBack != _endSelect.Index)\n                        throw new Exception();\n                    end = Int32.MaxValue;\n                }\n                else end -= caretLength;\n            }\n            ComplementIntermediate();\n            InvalidateVisual();\n        }\n\n        public void Select(TextPointer begin, TextPointer end)\n        {\n            _beginSelect = begin;\n            _endSelect = end;\n            ComplementIntermediate();\n            InvalidateVisual();\n        }\n\n        private void ComplementIntermediate()\n        {\n            bool bgn = false;\n            bool end = false;\n\n            _intermediates.Clear();\n            foreach (var metry in _metries)\n            {\n                bool hitB = false;\n                bool hitE = false;\n                bgn |= (hitB = ReferenceEquals(metry, _beginSelect.Geometry));\n                end |= (hitE = ReferenceEquals(metry, _endSelect.Geometry));\n\n                if (bgn && end) break;\n\n                if (hitB | hitE) continue;\n\n                if (bgn | end)\n                {\n                    _intermediates.Add(metry);\n                }\n            }\n        }\n\n\n        public void ClearSelection()\n        {\n            _beginSelect = null;\n            _endSelect = null;\n            _intermediates.Clear();\n            InvalidateVisual();\n        }\n\n        public TextPointer CalcuatePointerFrom(double x, double y)\n        {\n            if (y < 0)\n            {\n                return GetBegin();\n            }\n\n            int indexAdd = 0;\n            foreach (var line in _lines)\n            {\n                if (y <= line.Top + line.Height)\n                {\n                    foreach (var target in line.Metries)\n                    {\n                        if (x <= target.Left + target.Width)\n                        {\n                            return target.CalcuatePointerFrom(x, y)\n                                         .Wrap(this, indexAdd);\n                        }\n                        else\n                        {\n                            indexAdd += target.CaretLength;\n                        }\n                    }\n                }\n                else\n                {\n                    indexAdd += line.Metries.Sum(t => t.CaretLength);\n                }\n            }\n\n            return GetEnd();\n        }\n\n        public TextPointer CalcuatePointerFrom(int index)\n        {\n            if (index < 0)\n                throw new ArgumentOutOfRangeException(nameof(index));\n\n            foreach (var metry in _metries)\n            {\n                var caretLength = metry.CaretLength;\n\n                if (index < caretLength)\n                {\n                    return metry.CalcuatePointerFrom(index);\n                }\n                else index -= caretLength;\n            }\n\n            throw new ArgumentOutOfRangeException(nameof(index));\n        }\n\n        public TextPointer GetBegin()\n        {\n            if (_metries.Count != 0)\n            {\n                return _metries[0].GetBegin().Wrap(this, 0);\n            }\n            else\n            {\n                return new TextPointer(this, 0);\n            }\n        }\n\n        public TextPointer GetEnd()\n        {\n            if (_metries.Count != 0)\n            {\n                var pointer = _metries[_metries.Count - 1].GetEnd();\n\n                int indexAdd = _metries.Take(_metries.Count - 1).Sum(t => t.CaretLength);\n                return pointer.Wrap(this, indexAdd);\n            }\n            else\n            {\n                return new TextPointer(this, 0);\n            }\n        }\n\n        public string GetSelectedText()\n        {\n            if (_beginSelect is null || _endSelect is null)\n            {\n                return string.Empty;\n            }\n\n            TextPointer bgn, end;\n            if (_beginSelect < _endSelect)\n            {\n                bgn = _beginSelect;\n                end = _endSelect;\n            }\n            else\n            {\n                bgn = _endSelect;\n                end = _beginSelect;\n            }\n\n            if (ReferenceEquals(bgn.Geometry, end.Geometry))\n            {\n                if (bgn.Geometry is TextLineGeometry tlg)\n                {\n                    return tlg.Text.Substring(bgn.InternalIndex, end.InternalIndex - bgn.InternalIndex);\n                }\n                else return \"\";\n            }\n            else\n            {\n                var buffer = new StringBuilder();\n\n                if (bgn.Geometry is TextLineGeometry btlg)\n                    buffer.Append(btlg.Text.Substring(bgn.InternalIndex));\n\n                foreach (var inter in _intermediates)\n                {\n                    if (inter is TextLineGeometry itlg)\n                        buffer.Append(itlg.ToString());\n                }\n\n                if (end.Geometry is TextLineGeometry etlg)\n                    buffer.Append(etlg.Text.Substring(etlg.Line.FirstTextSourceIndex, end.InternalIndex - etlg.Line.FirstTextSourceIndex));\n\n                return buffer.ToString();\n            }\n        }\n    }\n\n\n\n\n    public class Selection\n    {\n        public int From { get; }\n        public int To { get; }\n        public Selection(int f, int t)\n        {\n            From = f;\n            To = t;\n        }\n    }\n\n    class LineInfo\n    {\n        public List<CGeometry> Metries = new();\n\n        public double RequestBaseHeight;\n        private double BaseHeight1;\n        private double BaseHeight2;\n\n        private double _height;\n        private double _dheightTop;\n        private double _dheightBtm;\n\n        public double Top { get; internal set; }\n        public double Width { private set; get; }\n        public double Height => Math.Max(_height, _dheightTop + _dheightBtm);\n        public double BaseHeight => Math.Max(RequestBaseHeight, BaseHeight1 != 0 ? BaseHeight1 : BaseHeight2);\n\n        public bool Add(CGeometry metry)\n        {\n            Metries.Add(metry);\n\n            Width += metry.Width;\n\n            switch (metry.TextVerticalAlignment)\n            {\n                case TextVerticalAlignment.Base:\n                    Max(ref BaseHeight1, metry.BaseHeight);\n                    Max(ref _dheightTop, metry.BaseHeight);\n                    Max(ref _dheightBtm, metry.Height - metry.BaseHeight);\n                    break;\n\n                case TextVerticalAlignment.Top:\n                    Max(ref BaseHeight1, metry.BaseHeight);\n                    Max(ref _height, metry.Height);\n                    break;\n\n                case TextVerticalAlignment.Center:\n                    Max(ref BaseHeight1, metry.Height / 2);\n                    Max(ref _height, metry.Height);\n                    break;\n\n                case TextVerticalAlignment.Bottom:\n                    Max(ref BaseHeight2, metry.BaseHeight);\n                    Max(ref _height, metry.Height);\n                    break;\n\n                default:\n                    Throw(\"sorry library manager forget to modify.\");\n                    break;\n            }\n\n            return metry.LineBreak;\n        }\n\n        public void OverwriteHeight(double height)\n        {\n            _height = height;\n            _dheightBtm = _dheightTop = 0;\n        }\n\n        private static void Max(ref double v1, double v2) => v1 = Math.Max(v1, v2);\n        private static void Throw(string msg) => throw new InvalidOperationException(msg);\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/CTextBlockAutomationPeer.cs",
    "content": "﻿using Avalonia.Automation.Peers;\n\nnamespace ColorTextBlock.Avalonia\n{\n    /// <summary>\n    /// The automation peer for CTextBlock.\n    /// </summary>\n    public class CTextBlockAutomationPeer : ControlAutomationPeer\n    {\n        public CTextBlockAutomationPeer(CTextBlock owner) : base(owner)\n        { }\n\n        public new CTextBlock Owner\n            => (CTextBlock)base.Owner;\n\n        protected override AutomationControlType GetAutomationControlTypeCore()\n            => AutomationControlType.Text;\n\n        protected override string? GetNameCore()\n            => Owner.Text;\n\n        protected override bool IsControlElementCore()\n            => Owner.TemplatedParent is null && base.IsControlElementCore();\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/CUnderline.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace ColorTextBlock.Avalonia\n{\n    /// <summary>\n    /// Underline decoration\n    /// </summary>\n    public class CUnderline : CSpan\n    {\n        public CUnderline() { }\n\n        public CUnderline(IEnumerable<CInline> inlines) : base(inlines)\n        {\n            IsUnderline = true;\n        }\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/ColorTextBlock.Avalonia.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <Import Project=\"..\\Markdown.Avalonia.props\" />\n\n  <PropertyGroup>\n    <OutputType>Library</OutputType>\n    <TargetFrameworks>$(PackageTargetFrameworks)</TargetFrameworks>\n    <PackageId>ColorTextBlock.Avalonia</PackageId>\n    <Version>$(PackageVersion)</Version>\n    <Authors>whistyun</Authors>\n    <Copyright>Copyright (c) 2020 whistyun</Copyright>\n    <PackageProjectUrl>https://github.com/whistyun/Markdown.Avalonia/tree/master/ColorTextBlock.Avalonia/</PackageProjectUrl>\n    <PackageLicenseExpression>MIT</PackageLicenseExpression>\n    <LangVersion>9</LangVersion>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" Version=\"$(AvaloniaVersion)\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/Fonts/FontFamilyCollector.cs",
    "content": "﻿using Avalonia.Media;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace ColorTextBlock.Avalonia.Fonts\n{\n    internal class FontFamilyCollector\n    {\n        public static FontFamily? TryGetMonospace()\n        {\n            string[] RequestFamilies = {\n                \"menlo\",\n                \"monaco\",\n                \"consolas\",\n                \"droid sans mono\",\n                \"inconsolata\",\n                \"courier new\",\n                \"monospace\",\n                \"dejavu sans mono\",\n            };\n\n            var monospaceName = FontManager.Current.SystemFonts\n                                           .Where(family => RequestFamilies.Any(reqNm => family.Name.ToLower().Contains(reqNm)))\n                                           .FirstOrDefault();\n\n            return monospaceName;\n        }\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/Geometies/CGeometry.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Media;\nusing System;\nusing System.Diagnostics.CodeAnalysis;\n\nnamespace ColorTextBlock.Avalonia.Geometries\n{\n    public abstract class CGeometry : ITextPointerHandleable\n    {\n        public CInline Owner { get; }\n        public double Left { get; set; }\n        public double Top { get; set; }\n        public double Width { get; }\n        public double Height { get; }\n        public double BaseHeight { get; }\n        public bool LineBreak { get; }\n        public TextVerticalAlignment TextVerticalAlignment { get; }\n\n        public event Action? RepaintRequested;\n\n        public virtual Action<Control>? OnMouseEnter { get; set; }\n        public virtual Action<Control>? OnMouseLeave { get; set; }\n        public virtual Action<Control>? OnMousePressed { get; set; }\n        public virtual Action<Control>? OnMouseReleased { get; set; }\n        public virtual Action<Control>? OnClick { get; set; }\n\n        private int? _caretLength;\n\n        public CGeometry(\n            CInline owner,\n            double width, double height, double baseHeight,\n            TextVerticalAlignment textVerticalAlignment,\n            bool linebreak)\n        {\n            this.Owner = owner;\n            this.Width = width;\n            this.Height = height;\n            this.BaseHeight = baseHeight;\n            this.TextVerticalAlignment = textVerticalAlignment;\n            this.LineBreak = linebreak;\n        }\n\n        public abstract void Render(DrawingContext ctx);\n\n        internal void RequestRepaint() => RepaintRequested?.Invoke();\n\n        public abstract TextPointer CalcuatePointerFrom(int index);\n        public abstract TextPointer CalcuatePointerFrom(double x, double y);\n        public abstract TextPointer GetBegin();\n        public abstract TextPointer GetEnd();\n\n        public virtual void Arranged() { }\n\n\n        public virtual int CaretLength\n        {\n            get\n            {\n                if (!_caretLength.HasValue)\n                    _caretLength = GetEnd().Index - GetBegin().Index;\n\n                return _caretLength.Value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/Geometies/DecoratorGeometry.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Media;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Linq;\nusing static System.Net.Mime.MediaTypeNames;\n\nnamespace ColorTextBlock.Avalonia.Geometries\n{\n    public class DecoratorGeometry : CGeometry\n    {\n        public CGeometry[] Targets { get; }\n        public Border Decorate { get; }\n\n        private Action<Control>? _OnMouseEnter;\n        private Action<Control>? _OnMouseLeave;\n        private Action<Control>? _OnMousePressed;\n        private Action<Control>? _OnMouseReleased;\n        private Action<Control>? _OnClick;\n\n        public override Action<Control>? OnMouseEnter\n        {\n            get => ctrl =>\n            {\n                _OnMouseEnter?.Invoke(ctrl);\n                foreach (var target in Targets)\n                    target.OnMouseEnter?.Invoke(ctrl);\n            };\n            set => _OnMouseEnter = value;\n        }\n        public override Action<Control>? OnMouseLeave\n        {\n            get => ctrl =>\n            {\n                _OnMouseLeave?.Invoke(ctrl);\n                foreach (var target in Targets)\n                    target.OnMouseLeave?.Invoke(ctrl);\n            };\n            set => _OnMouseLeave = value;\n        }\n        public override Action<Control>? OnMousePressed\n        {\n            get => ctrl =>\n            {\n                _OnMousePressed?.Invoke(ctrl);\n                foreach (var target in Targets)\n                    target.OnMousePressed?.Invoke(ctrl);\n            };\n            set => _OnMousePressed = value;\n        }\n        public override Action<Control>? OnMouseReleased\n        {\n            get => ctrl =>\n            {\n                _OnMouseReleased?.Invoke(ctrl);\n                foreach (var target in Targets)\n                    target.OnMouseReleased?.Invoke(ctrl);\n            };\n            set => _OnMouseReleased = value;\n        }\n        public override Action<Control>? OnClick\n        {\n            get => ctrl =>\n            {\n                _OnClick?.Invoke(ctrl);\n                foreach (var target in Targets)\n                    target.OnClick?.Invoke(ctrl);\n            };\n            set => _OnClick = value;\n        }\n\n        internal static DecoratorGeometry New(\n            CSpan owner,\n            IEnumerable<CGeometry> oneline,\n            Border decorate)\n        {\n            double width = 0;\n            double height = 0;\n\n            double descentHeightTop = 0;\n            double descentHeightBtm = 0;\n\n            double baseHeight = 0;\n            double baseHeight2 = 0;\n\n            void Max(ref double v1, double v2) => v1 = Math.Max(v1, v2);\n\n            foreach (var one in oneline)\n            {\n                width += one.Width;\n\n                switch (one.TextVerticalAlignment)\n                {\n                    case TextVerticalAlignment.Base:\n                        Max(ref baseHeight, one.BaseHeight);\n\n                        Max(ref descentHeightTop, one.BaseHeight);\n                        Max(ref descentHeightBtm, one.Height - one.BaseHeight);\n                        break;\n\n                    case TextVerticalAlignment.Top:\n                        Max(ref baseHeight, one.BaseHeight);\n                        Max(ref height, one.Height);\n                        break;\n\n                    case TextVerticalAlignment.Center:\n                        Max(ref baseHeight, one.Height / 2);\n                        Max(ref height, one.Height);\n                        break;\n\n                    case TextVerticalAlignment.Bottom:\n                        Max(ref baseHeight2, one.BaseHeight);\n                        Max(ref height, one.Height);\n                        break;\n\n                    default:\n                        throw new InvalidOperationException(\"sorry library manager forget to modify.\");\n                }\n\n            }\n\n            Max(ref height, descentHeightTop + descentHeightBtm);\n\n            baseHeight = baseHeight != 0 ? baseHeight : baseHeight2;\n\n            return new DecoratorGeometry(\n                width + decorate.DesiredSize.Width,\n                height + decorate.DesiredSize.Height,\n                baseHeight + decorate.Margin.Top + decorate.BorderThickness.Top + decorate.Padding.Top,\n                owner,\n                oneline.ToArray(),\n                decorate);\n        }\n\n        private DecoratorGeometry(\n            double w, double h, double lh,\n            CSpan owner,\n            CGeometry[] targets,\n            Border decorate) : base(\n                owner,\n                w, h, lh,\n                owner.TextVerticalAlignment,\n                targets[targets.Length - 1].LineBreak)\n        {\n            this.Targets = targets;\n            this.Decorate = decorate;\n        }\n\n        public override void Arranged()\n        {\n            var left = Left + Decorate.BorderThickness.Left + Decorate.Padding.Left + Decorate.Margin.Left;\n            var top = Top + Decorate.BorderThickness.Top + Decorate.Padding.Top + Decorate.Margin.Top;\n            var btm = Top + Height - Decorate.BorderThickness.Bottom - Decorate.Padding.Bottom - Decorate.Margin.Bottom;\n\n            foreach (var target in Targets)\n            {\n                target.Left = left;\n\n                target.Top = target.TextVerticalAlignment switch\n                {\n                    TextVerticalAlignment.Top\n                        => top,\n\n                    TextVerticalAlignment.Center\n                        => (top + btm - target.Height) / 2,\n\n                    TextVerticalAlignment.Bottom\n                        => btm - target.Height,\n\n                    TextVerticalAlignment.Base\n                        => Top + BaseHeight - target.BaseHeight,\n\n                    _ => throw new InvalidOperationException(\"sorry library manager forget to modify.\")\n                };\n\n                left += target.Width;\n\n                target.Arranged();\n            }\n        }\n\n        public override void Render(DrawingContext ctx)\n        {\n            using (ctx.PushTransform(Matrix.CreateTranslation(Left + Decorate.Margin.Left, Top + Decorate.Margin.Top)))\n            {\n                Decorate.Background = Owner.Background;\n                Decorate.Arrange(new Rect(0, 0, Width, Height));\n                Decorate.Render(ctx);\n\n            }\n\n            foreach (var target in Targets)\n                target.Render(ctx);\n        }\n\n        public override TextPointer CalcuatePointerFrom(double x, double y)\n        {\n            if (x < Left)\n            {\n                return GetBegin();\n            }\n\n            int indexAdd = 0;\n            foreach (var target in Targets.Take(Targets.Length - 1))\n            {\n                if (x <= target.Left + target.Width)\n                {\n                    return target.CalcuatePointerFrom(x, y)\n                                 .Wrap(Owner, indexAdd);\n                }\n                else\n                {\n                    indexAdd += target.CaretLength;\n                }\n            }\n\n            return Targets[Targets.Length - 1].GetEnd().Wrap(Owner, indexAdd);\n        }\n\n        public override TextPointer CalcuatePointerFrom(int index)\n        {\n            if (index < 0)\n                throw new ArgumentOutOfRangeException(nameof(index));\n\n            int relindex = index;\n            foreach (var target in Targets)\n            {\n                if (relindex < target.CaretLength)\n                {\n                    return target.CalcuatePointerFrom(relindex)\n                                 .Wrap(Owner, index - relindex);\n                }\n\n                relindex -= target.CaretLength;\n            }\n\n            throw new ArgumentOutOfRangeException(nameof(index));\n        }\n\n\n        public override TextPointer GetBegin()\n        {\n            var pointer = Targets[0].GetBegin();\n            return pointer.Wrap(Owner, 0);\n        }\n\n        public override TextPointer GetEnd()\n        {\n            var pointer = Targets[Targets.Length - 1].GetEnd();\n\n            int indexAdd = Targets.Take(Targets.Length - 1).Sum(t => t.CaretLength);\n            return pointer.Wrap(Owner, indexAdd);\n        }\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/Geometies/DummyGeometryForControl.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Documents;\nusing Avalonia.Media;\nusing ColorTextBlock.Avalonia.Geometries;\nusing System;\nusing static System.Net.Mime.MediaTypeNames;\n\nnamespace ColorTextBlock.Avalonia.Geometies\n{\n    internal class DummyGeometryForControl : CGeometry\n    {\n        public Control Control { get; }\n\n        public DummyGeometryForControl(CInlineUIContainer owner, Control control, TextVerticalAlignment alignment) :\n            base(\n                owner,\n                control.DesiredSize.Width,\n                control.DesiredSize.Height,\n                control.DesiredSize.Height,\n                alignment,\n                false)\n        {\n            Control = control;\n        }\n\n        public override void Render(DrawingContext ctx)\n        {\n        }\n\n        public override TextPointer CalcuatePointerFrom(double x, double y)\n        {\n            if (x < Left + Width / 2)\n            {\n                return GetBegin();\n            }\n            else\n            {\n                return GetEnd();\n            }\n        }\n\n        public override TextPointer CalcuatePointerFrom(int index)\n        {\n            return index switch\n            {\n                0 => GetBegin(),\n                1 => GetEnd(),\n                _ => throw new ArgumentOutOfRangeException(nameof(index))\n            };\n        }\n\n        public override TextPointer GetBegin()\n        {\n            return new TextPointer(this);\n        }\n\n        public override TextPointer GetEnd()\n        {\n            return new TextPointer(this, 1, Width);\n        }\n    }\n}"
  },
  {
    "path": "ColorTextBlock.Avalonia/Geometies/ImageGeometry.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Media;\nusing Avalonia.Media.Imaging;\nusing System;\nusing System.Diagnostics.CodeAnalysis;\n\nnamespace ColorTextBlock.Avalonia.Geometries\n{\n    public class ImageGeometry : CGeometry\n    {\n        public new double Width { get; }\n        public new double Height { get; }\n        public IImage Image { get; }\n\n        internal ImageGeometry(\n            CImage owner,\n            IImage image, double width, double height,\n            TextVerticalAlignment alignment) :\n            base(owner, width, height, height, alignment, false)\n        {\n            this.Image = image;\n            this.Width = width;\n            this.Height = height;\n        }\n\n        public override void Render(DrawingContext ctx)\n        {\n            ctx.DrawImage(\n                Image,\n                new Rect(Image.Size),\n                new Rect(Left, Top, Width, Height));\n        }\n\n        public override TextPointer CalcuatePointerFrom(double x, double y)\n        {\n            if (x < Left + Width / 2)\n            {\n                return GetBegin();\n            }\n            else\n            {\n                return GetEnd();\n            }\n        }\n        public override TextPointer CalcuatePointerFrom(int index)\n        {\n            return index switch\n            {\n                0 => GetBegin(),\n                1 => GetEnd(),\n                _ => throw new ArgumentOutOfRangeException(nameof(index))\n            };\n        }\n        public override TextPointer GetBegin()\n        {\n            return new TextPointer(this);\n        }\n\n        public override TextPointer GetEnd()\n        {\n            return new TextPointer(this, 1, Width);\n        }\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/Geometies/LineBreakMarkGeometry.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls.Shapes;\nusing Avalonia.Media;\nusing Avalonia.Media.TextFormatting;\nusing System;\nusing System.Linq;\nusing static System.Net.Mime.MediaTypeNames;\n\nnamespace ColorTextBlock.Avalonia.Geometries\n{\n    internal class LineBreakMarkGeometry : TextGeometry\n    {\n        private bool IsDummy { get; }\n\n        internal LineBreakMarkGeometry(\n            CInline owner,\n            double lineHeight) :\n            base(owner, 0, lineHeight, lineHeight, TextVerticalAlignment.Base, true)\n        {\n            IsDummy = false;\n        }\n\n        internal LineBreakMarkGeometry(CInline owner) :\n            base(owner, 0, 0, 0, TextVerticalAlignment.Base, true)\n        {\n            IsDummy = true;\n        }\n\n        public override void Render(DrawingContext ctx) { }\n\n        public override TextPointer CalcuatePointerFrom(double x, double y)\n        {\n            throw new InvalidOperationException();\n        }\n\n        public override TextPointer CalcuatePointerFrom(int index)\n        {\n            return index switch\n            {\n                0 => GetBegin(),\n                1 => GetEnd(),\n                _ => throw new ArgumentOutOfRangeException(nameof(index))\n            };\n        }\n\n        public override TextPointer GetBegin()\n        {\n            return new TextPointer(this);\n        }\n\n        public override TextPointer GetEnd()\n        {\n            return IsDummy ?\n                new TextPointer(this) :\n                new TextPointer(this, 1, Width);\n        }\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/Geometies/TextGeometry.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Media;\nusing Avalonia.Media.TextFormatting;\nusing System.Linq;\n\nnamespace ColorTextBlock.Avalonia.Geometries\n{\n    internal abstract class TextGeometry : CGeometry\n    {\n        private IBrush? _TemporaryForeground;\n        public IBrush? TemporaryForeground\n        {\n            get => _TemporaryForeground;\n            set => _TemporaryForeground = value;\n        }\n\n        private IBrush? _TemporaryBackground;\n        public IBrush? TemporaryBackground\n        {\n            get => _TemporaryBackground;\n            set => _TemporaryBackground = value;\n        }\n\n        public IBrush? Foreground\n        {\n            get => Owner?.Foreground;\n        }\n        public IBrush? Background\n        {\n            get => Owner?.Background;\n        }\n        public bool IsUnderline\n        {\n            get => Owner is null ? false : Owner.IsUnderline;\n        }\n        public bool IsStrikethrough\n        {\n            get => Owner is null ? false : Owner.IsStrikethrough;\n        }\n\n        internal TextGeometry(\n            CInline owner,\n            double width, double height, double lineHeight,\n            TextVerticalAlignment alignment,\n            bool linebreak) :\n            base(owner, width, height, lineHeight, alignment, linebreak)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/Geometies/TextLineGeometry.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Media;\nusing Avalonia.Media.TextFormatting;\nusing System;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Linq;\nusing static System.Net.Mime.MediaTypeNames;\n\nnamespace ColorTextBlock.Avalonia.Geometries\n{\n    internal class TextLineGeometry : TextGeometry\n    {\n        public SimpleTextSource Text { get; private set; }\n        public TextLine Line { get; private set; }\n        public IBrush? LayoutForeground { get; private set; }\n\n        internal TextLineGeometry(\n            CRun owner,\n            SimpleTextSource text,\n            TextLine tline,\n            bool linebreak) :\n            base(owner, tline.WidthIncludingTrailingWhitespace, tline.Height, tline.Baseline, owner.TextVerticalAlignment, linebreak)\n        {\n            Text = text;\n            Line = tline;\n            LayoutForeground = owner.Foreground;\n        }\n\n        public override void Render(DrawingContext ctx)\n        {\n            var foreground = TemporaryForeground ?? Foreground;\n            var background = TemporaryBackground ?? Background;\n\n            if (LayoutForeground != foreground)\n            {\n                LayoutForeground = foreground;\n                Text = Text.ChangeForeground(foreground);\n\n                var owner = (CRun)Owner;\n                var parPrps = owner.CreateTextParagraphProperties(Text.RunProperties);\n\n                Line = TextFormatter.Current.FormatLine(\n                            Text,\n                            Line.FirstTextSourceIndex,\n                            Width,\n                            parPrps)!;\n            }\n\n            if (background != null)\n            {\n                ctx.FillRectangle(background, new Rect(Left, Top, Width, Height));\n            }\n\n            Line.Draw(ctx, new Point(Left, Top));\n\n            if (IsUnderline)\n            {\n                var ypos = Math.Round(Top + Height);\n                ctx.DrawLine(new Pen(foreground, 2),\n                    new Point(Left, ypos),\n                    new Point(Left + Width, ypos));\n            }\n\n            if (IsStrikethrough)\n            {\n                var ypos = Math.Round(Top + Height / 2);\n                ctx.DrawLine(new Pen(foreground, 2),\n                    new Point(Left, ypos),\n                    new Point(Left + Width, ypos));\n            }\n        }\n\n        public override TextPointer CalcuatePointerFrom(double x, double y)\n        {\n            var relX = x - Left;\n\n            if (relX < 0) return GetBegin();\n            if (relX >= Width) return GetEnd();\n\n            var hit = Line.GetCharacterHitFromDistance(relX);\n            var dst = Line.GetDistanceFromCharacterHit(hit);\n\n            return new TextPointer((CRun)Owner, this, hit, dst, false);\n        }\n        public override TextPointer CalcuatePointerFrom(int index)\n        {\n            var hit = new CharacterHit(Line.FirstTextSourceIndex + index);\n            var dst = Line.GetDistanceFromCharacterHit(hit);\n\n            return new TextPointer((CRun)Owner, this, hit, dst, false);\n        }\n\n        public override TextPointer GetBegin()\n        {\n            var hit = Line.GetCharacterHitFromDistance(0);\n\n            return new TextPointer((CRun)Owner, this, hit, false);\n        }\n\n        public override TextPointer GetEnd()\n        {\n            var hit = Line.GetCharacterHitFromDistance(Double.MaxValue);\n\n            return new TextPointer((CRun)Owner, this, hit, Width, true);\n        }\n\n        public override string ToString()\n            => Text.Substring(Line.FirstTextSourceIndex, Line.Length);\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/StringToRunConverter.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Globalization;\nusing System.Text.RegularExpressions;\n\nnamespace ColorTextBlock.Avalonia\n{\n    public class StringToRunConverter : TypeConverter\n    {\n        public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType)\n        {\n            return sourceType == typeof(string);\n        }\n\n        public override object ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value)\n        {\n            var txt = (string)value;\n            txt = Regex.Replace(txt, \"[\\r\\n \\t]+\", \" \");\n            return new CRun() { Text = String.IsNullOrEmpty(txt) ? \" \" : txt };\n        }\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/TextPointer.cs",
    "content": "﻿using Avalonia.Media;\nusing ColorTextBlock.Avalonia.Geometries;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ColorTextBlock.Avalonia\n{\n    public class TextPointer : IEquatable<TextPointer>, IComparable<TextPointer>\n    {\n        public int Index { get; }\n        internal int InternalIndex { get; }\n        internal int TrailingLength { get; }\n        internal double Distance { get; }\n        internal CGeometry Geometry { get; }\n\n        internal int PathDepth => _path.Length;\n        internal CInline this[int idx] => _path[idx];\n\n        private CInline[] _path;\n\n        private TextPointer(CInline[] path, CGeometry geometry, int index, int internalIndex, int trallingLength, double distance)\n        {\n            _path = path;\n            Geometry = geometry;\n            Index = index;\n            InternalIndex = internalIndex;\n            TrailingLength = trallingLength;\n            Distance = distance;\n        }\n\n        internal TextPointer(CRun inline, TextLineGeometry target, CharacterHit charHit, bool isLast)\n        {\n            _path = new[] { inline };\n            Geometry = target;\n\n            if (isLast)\n            {\n                var lastIdx = charHit.FirstCharacterIndex + charHit.TrailingLength;\n                Index = lastIdx - target.Line.FirstTextSourceIndex;\n                InternalIndex = lastIdx;\n                TrailingLength = 0;\n            }\n            else\n            {\n                Index = charHit.FirstCharacterIndex - target.Line.FirstTextSourceIndex;\n                InternalIndex = charHit.FirstCharacterIndex;\n                TrailingLength = charHit.TrailingLength;\n            }\n        }\n\n        internal TextPointer(CRun inline, TextLineGeometry target, CharacterHit charHit, double distance, bool isLast) :\n            this(inline, target, charHit, isLast)\n        {\n            Distance = distance;\n        }\n\n        internal TextPointer(CGeometry inline)\n        {\n            _path = new[] { inline.Owner };\n            Geometry = inline;\n            Index = 0;\n            InternalIndex = 0;\n            TrailingLength = 0;\n        }\n\n        internal TextPointer(CGeometry inline, int idx, double distance)\n        {\n            _path = new[] { inline.Owner };\n            Geometry = inline;\n            Index = idx;\n            InternalIndex = 0;\n            TrailingLength = 0;\n            Distance = distance;\n        }\n\n        internal TextPointer(CTextBlock host, int idx)\n        {\n            _path = Array.Empty<CInline>();\n            Index = idx;\n            InternalIndex = 0;\n            TrailingLength = 0;\n        }\n\n        internal TextPointer Wrap(CInline owner, int indexAdding)\n        {\n            var path = new List<CInline>(_path.Length + 1);\n            path.Add(owner);\n            path.AddRange(_path);\n\n            return new TextPointer(\n                path.ToArray(),\n                Geometry,\n                Index + indexAdding,\n                InternalIndex,\n                TrailingLength,\n                Distance);\n        }\n\n        internal TextPointer Wrap(CTextBlock host, int indexAdding)\n        {\n            return new TextPointer(\n                _path,\n                Geometry,\n                Index + indexAdding,\n                InternalIndex,\n                TrailingLength,\n                Distance);\n        }\n\n        public override int GetHashCode()\n        {\n            return _path.Sum(e => e.GetHashCode())\n                + Index.GetHashCode()\n                + InternalIndex.GetHashCode()\n                + TrailingLength.GetHashCode();\n        }\n\n        public bool Equals(TextPointer? other)\n        {\n            return PathDepth == other.PathDepth\n                && Enumerable.Range(0, PathDepth).All(i => Object.ReferenceEquals(_path[i], other[i]))\n                && Index == other.Index\n                && InternalIndex == other.InternalIndex\n                && TrailingLength == other.TrailingLength;\n        }\n\n        public int CompareTo(TextPointer? other)\n            => other is not null ? Index.CompareTo(other.Index) : throw new ArgumentNullException(nameof(other));\n\n        public static bool operator <(TextPointer left, TextPointer right) => left.CompareTo(right) < 0;\n        public static bool operator >(TextPointer left, TextPointer right) => left.CompareTo(right) > 0;\n\n        public static bool operator <=(TextPointer left, TextPointer right) => left.CompareTo(right) <= 0;\n        public static bool operator >=(TextPointer left, TextPointer right) => left.CompareTo(right) >= 0;\n    }\n\n    public interface ITextPointerHandleable\n    {\n        /// <summary>\n        /// Calcuates position from relative coordinates. \n        /// The origin of the relative coordinates is based on CTextBlock.\n        /// </summary>\n        /// <param name=\"x\">The x coordinate of caret position on CTextBlock</param>\n        /// <param name=\"y\">The y coordinate of caret position on CTextBlock</param>\n        /// <returns></returns>\n        public TextPointer CalcuatePointerFrom(double x, double y);\n\n        public TextPointer CalcuatePointerFrom(int index);\n\n        public TextPointer GetBegin();\n\n        public TextPointer GetEnd();\n    }\n\n    public interface ISelectable\n    {\n        public void ClearSelection();\n        public void Select(TextPointer start, TextPointer end);\n    }\n}\n"
  },
  {
    "path": "ColorTextBlock.Avalonia/TextVerticalAlignment.cs",
    "content": "﻿\nnamespace ColorTextBlock.Avalonia\n{\n    /// <summary>\n    /// The vertical position of text within line\n    /// </summary>\n    /// <seealso cref=\"https://github.com/whistyun/Markdown.Avalonia/issues/28\"/>\n    public enum TextVerticalAlignment\n    {\n        /// <summary>\n        /// Text elements are placed at the top of the line.\n        /// </summary>\n        Top,\n        /// <summary>\n        /// Text elements are placed at the middle of the line.\n        /// </summary>\n        Center,\n        /// <summary>\n        /// Text elements are placed at the bottom of the line.\n        /// </summary>\n        Bottom,\n\n        /// <summary>\n        /// Text elements are placed at the bottom of the line.\n        /// This treats only the height of text element and ignores the padding of element.\n        /// Therefore vertical positions of the text will be aligned.\n        /// </summary>\n        Base,\n    }\n}\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "Copyright (c) 2010 Bevan Arps, 2020 Whistyun\n\nPermission is hereby granted, free of charge, to any person obtaining a copy \nof this software and associated documentation files (the \"Software\"), to deal \nin the Software without restriction, including without limitation the rights \nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell \ncopies of the Software, and to permit persons to whom the Software is \nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all \ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR \nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, \nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE \nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER \nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, \nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE \nSOFTWARE.\n"
  },
  {
    "path": "Markdown.Avalonia/Markdown.Avalonia.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <Import Project=\"..\\Markdown.Avalonia.props\" />\n\n  <PropertyGroup>\n    <TargetFrameworks>$(PackageTargetFrameworks)</TargetFrameworks>\n    <Version>$(PackageVersion)</Version>\n    <Authors>Bevan Arps(original); whistyun</Authors>\n    <PackageId>Markdown.Avalonia</PackageId>\n    <AssemblyName>Markdown.Avalonia.Full</AssemblyName>\n    <RootNamespace>Markdown.Avalonia.Full</RootNamespace>\n    <Company />\n    <Description>Markdown Controls for Avalonia</Description>\n    <Copyright>Copyright (c) 2010 Bevan Arps, 2020 whistyun</Copyright>\n    <PackageProjectUrl>https://github.com/whistyun/Markdown.Avalonia</PackageProjectUrl>\n    <LangVersion>9</LangVersion>\n    <PackageLicenseExpression>MIT</PackageLicenseExpression>\n    <PackageReadmeFile>Markdown.Avalonia.md</PackageReadmeFile>\n    <PackageTags>Markdown Avalonia Avaloniaui</PackageTags>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Include=\"..\\pack_readme\\Markdown.Avalonia.md\" Pack=\"true\" PackagePath=\"\\\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Markdown.Avalonia.Html\\Markdown.Avalonia.Html.csproj\" />\n    <ProjectReference Include=\"..\\Markdown.Avalonia.Svg\\Markdown.Avalonia.Svg.csproj\" />\n    <ProjectReference Include=\"..\\Markdown.Avalonia.Tight\\Markdown.Avalonia.Tight.csproj\" />\n  </ItemGroup>\n  <ItemGroup Condition=\"'$(EnableAvaloniaEdit)' == 'enabled'\">\n    <ProjectReference Include=\"..\\Markdown.Avalonia.SyntaxHigh\\Markdown.Avalonia.SyntaxHigh.csproj\" />    \n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Markdown.Avalonia/MarkdownScrollViewer.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Markdown.Avalonia.Full\n{\n    public class MarkdownScrollViewer : global::Markdown.Avalonia.MarkdownScrollViewer\n    {\n\n        public MarkdownScrollViewer()\n        {\n            Plugins = new MdAvPlugins();\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia/MdAvPlugins.cs",
    "content": "﻿using Markdown.Avalonia.Html;\nusing Markdown.Avalonia.Plugins;\nusing Markdown.Avalonia.Svg;\nusing Markdown.Avalonia.SyntaxHigh;\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Markdown.Avalonia.Full\n{\n    public class MdAvPlugins : global::Markdown.Avalonia.MdAvPlugins\n    {\n        public MdAvPlugins()\n        {\n        }\n\n        protected override SetupInfo CreateInfo()\n        {\n            var setupInf = new SetupInfo();\n\n            var hasSyntaxHigh = false;\n            var hasSvgFormat = false;\n            var hasHtml = false;\n\n            SyntaxHighlight? syntaxPlugin = null;\n\n            (\n                IEnumerable<IMdAvPlugin> orderedPlugin,\n                Dictionary<Type, IMdAvPlugin> dic\n            ) = ComputeOrderedPlugins();\n\n            foreach (var plugin in orderedPlugin)\n            {\n                if (plugin is IMdAvPluginRequestAnother another)\n                {\n                    another.Inject(another.DependsOn.Select(dep => dic[dep]));\n                }\n\n                plugin.Setup(setupInf);\n\n                if (plugin is SyntaxHighlight light)\n                {\n                    hasSyntaxHigh = true;\n                    syntaxPlugin = light;\n                }\n                hasSvgFormat |= plugin is SvgFormat;\n                hasHtml |= plugin is HtmlPlugin;\n            }\n\n            if (!hasSyntaxHigh)\n            {\n                syntaxPlugin = new SyntaxHighlight();\n                syntaxPlugin.Setup(setupInf);\n            }\n\n            if (!hasSvgFormat)\n            {\n                var svgPlugin = new SvgFormat();\n                svgPlugin.Setup(setupInf);\n            }\n\n            if (!hasHtml)\n            {\n                var htmlPlugin = new HtmlPlugin();\n                htmlPlugin.Inject(new[] { syntaxPlugin });\n                htmlPlugin.Setup(setupInf);\n            }\n\n            if (PathResolver is not null)\n                setupInf.SetOnce(PathResolver);\n\n            if (ContainerBlockHandler is not null)\n                setupInf.SetOnce(ContainerBlockHandler);\n\n            if (HyperlinkCommand is not null)\n                setupInf.SetOnce(HyperlinkCommand);\n\n            setupInf.Freeze();\n\n            return setupInf;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia/Properties/AssemblyInfo.cs",
    "content": "﻿using Avalonia.Metadata;\n\n[assembly: XmlnsDefinition(\"https://github.com/whistyun/Markdown.Avalonia\", \"Markdown.Avalonia.Full\")]\n[assembly: XmlnsPrefix(\"https://github.com/whistyun/Markdown.Avalonia\", \"mdxaml\")]\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Parsers/ButtonParser.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Layout;\nusing ColorTextBlock.Avalonia;\nusing HtmlAgilityPack;\nusing System.Collections.Generic;\n\nnamespace Markdown.Avalonia.Html.Core.Parsers\n{\n    public class ButtonParser : IInlineTagParser\n    {\n        public IEnumerable<string> SupportTag => new[] { \"button\" };\n\n        bool ITagParser.TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<StyledElement> generated)\n        {\n            var rtn = TryReplace(node, manager, out var list);\n            generated = list;\n            return rtn;\n        }\n\n        public bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<CInline> generated)\n        {\n            var doc = new StackPanel() { Orientation = Orientation.Vertical };\n            doc.Children.AddRange(manager.ParseChildrenAndGroup(node));\n\n            doc.Loaded += (s, e) =>\n            {\n                var desiredWidth = doc.DesiredSize.Width;\n                var desiredHeight = doc.DesiredSize.Height;\n\n\n                for (int i = 0; i < 10; ++i)\n                {\n                    desiredWidth /= 2;\n                    var size = new Size(desiredWidth, double.PositiveInfinity);\n\n                    doc.Measure(size);\n\n                    if (desiredHeight != doc.DesiredSize.Height) break;\n\n                    // Give up because it will not be wrapped back.\n                    if (i == 9) return;\n                }\n\n                var preferedWidth = desiredWidth * 2;\n\n                for (int i = 0; i < 10; ++i)\n                {\n                    var width = (desiredWidth + preferedWidth) / 2;\n\n                    var size = new Size(width, double.PositiveInfinity);\n                    doc.Measure(size);\n\n                    if (desiredHeight == doc.DesiredSize.Height)\n                    {\n                        preferedWidth = width;\n                    }\n                    else\n                    {\n                        desiredWidth = width;\n                    }\n                }\n\n                doc.Width = preferedWidth;\n            };\n\n\n            var btn = new Button()\n            {\n                Content = doc,\n                IsEnabled = false,\n            };\n\n            generated = new[] { new CInlineUIContainer(btn) };\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Parsers/CodeBlockParser.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing HtmlAgilityPack;\nusing Markdown.Avalonia.Html.Core.Utils;\nusing Markdown.Avalonia.SyntaxHigh;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace Markdown.Avalonia.Html.Core.Parsers\n{\n    public class CodeBlockParser : IBlockTagParser\n    {\n        SyntaxHighlightProvider _provider;\n\n        public CodeBlockParser(SyntaxHighlight syntax)\n        {\n            _provider = new SyntaxHighlightProvider(syntax.Aliases);\n        }\n\n\n        public IEnumerable<string> SupportTag => new[] { \"pre\" };\n\n        bool ITagParser.TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<StyledElement> generated)\n        {\n            var rtn = TryReplace(node, manager, out var list);\n            generated = list;\n            return rtn;\n        }\n\n        public bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<Control> generated)\n        {\n            generated = EnumerableExt.Empty<Control>();\n\n            var codeElements = node.ChildNodes.CollectTag(\"code\");\n            if (codeElements.Count != 0)\n            {\n                var rslt = new List<Control>();\n\n                foreach (var codeElement in codeElements)\n                {\n                    // \"language-**\", \"lang-**\", \"**\" or \"sourceCode **\"\n                    var classVal = codeElement.Attributes[\"class\"]?.Value;\n\n                    var langCode = ParseLangCode(classVal);\n                    rslt.Add(DocUtils.CreateCodeBlock(langCode, codeElement.InnerText, manager, _provider));\n                }\n\n                generated = rslt;\n                return rslt.Count > 0;\n            }\n            else if (node.ChildNodes.TryCastTextNode(out var textNodes))\n            {\n                var buff = new StringBuilder();\n                foreach (var textNode in textNodes)\n                    buff.Append(textNode.InnerText);\n\n                generated = new[] { DocUtils.CreateCodeBlock(null, buff.ToString(), manager, _provider) };\n                return true;\n            }\n            else return false;\n        }\n\n        private static string ParseLangCode(string? classVal)\n        {\n            if (classVal is null) return \"\";\n\n            // \"language-**\", \"lang-**\", \"**\" or \"sourceCode **\"\n            var indics = Enumerable.Range(0, classVal.Length)\n                                   .Reverse()\n                                   .Where(i => !Char.IsLetterOrDigit(classVal[i]));\n\n            return classVal.Substring(indics.Any() ? indics.First() + 1 : 0);\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Parsers/CommentParser.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing ColorTextBlock.Avalonia;\nusing HtmlAgilityPack;\nusing Markdown.Avalonia.Html.Core.Utils;\nusing System;\nusing System.Collections.Generic;\n\nnamespace Markdown.Avalonia.Html.Core.Parsers\n{\n    /// <summary>\n    /// remove comment element\n    /// </summary>\n    public class CommentParsre : IBlockTagParser, IInlineTagParser\n    {\n        public IEnumerable<string> SupportTag => new[] { HtmlNode.HtmlNodeTypeNameComment };\n\n        bool ITagParser.TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<StyledElement> generated)\n        {\n            generated = EnumerableExt.Empty<StyledElement>();\n            return true;\n        }\n\n        public bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<Control> generated)\n        {\n            generated = EnumerableExt.Empty<Control>();\n            return true;\n        }\n\n        public bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<CInline> generated)\n        {\n            generated = EnumerableExt.Empty<CInline>();\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Parsers/DetailsParser.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Layout;\nusing HtmlAgilityPack;\nusing Markdown.Avalonia.Html.Core.Utils;\nusing Markdown.Avalonia;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\n\nnamespace Markdown.Avalonia.Html.Core.Parsers\n{\n    public class DetailsParser : IBlockTagParser\n    {\n        public IEnumerable<string> SupportTag => new[] { \"details\" };\n\n        bool ITagParser.TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<StyledElement> generated)\n        {\n            var rtn = TryReplace(node, manager, out var list);\n            generated = list;\n            return rtn;\n        }\n\n        public bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<Control> generated)\n        {\n            var summary = node.ChildNodes.FirstOrDefault(e => e.IsElement(\"summary\"));\n            if (summary is null)\n            {\n                generated = EnumerableExt.Empty<Control>();\n                return false;\n            }\n\n            var content = node.ChildNodes.Where(e => !ReferenceEquals(e, summary));\n\n            var header = Create(manager.Engine, manager.ParseChildrenAndGroup(summary));\n\n            var expander = new Expander()\n            {\n                Header = header,\n                Content = Create(manager.Engine, manager.Grouping(manager.ParseChildrenJagigng(content))),\n            };\n\n            if (node.Attributes[\"open\"] is HtmlAttribute openAttr\n                && bool.TryParse(openAttr.Value, out var isOpened))\n            {\n                expander.IsExpanded = isOpened;\n            }\n\n            generated = new[] { expander };\n            return true;\n        }\n\n        private static StackPanel Create(IMarkdownEngine engine, IEnumerable<Control> blocks)\n        {\n            var doc = new StackPanel() { Orientation = Orientation.Vertical };\n            doc.Children.AddRange(blocks);\n\n            return doc;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Parsers/HorizontalRuleParser.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing HtmlAgilityPack;\nusing Markdown.Avalonia.Controls;\nusing System.Collections.Generic;\n\nnamespace Markdown.Avalonia.Html.Core.Parsers\n{\n    public class HorizontalRuleParser : IBlockTagParser\n    {\n        public IEnumerable<string> SupportTag => new[] { \"hr\" };\n\n        bool ITagParser.TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<StyledElement> generated)\n        {\n            var rtn = TryReplace(node, manager, out var list);\n            generated = list;\n            return rtn;\n        }\n\n        public bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<Control> generated)\n        {\n            var rule = new Rule(RuleType.Single);\n            rule.Classes.Add(Tags.TagRuleSingle.GetClass());\n\n            generated = new[] { rule };\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Parsers/ITagParser.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing ColorTextBlock.Avalonia;\nusing HtmlAgilityPack;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Markdown.Avalonia.Html.Core.Parsers\n{\n    public interface ITagParser\n    {\n        IEnumerable<string> SupportTag { get; }\n        bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<StyledElement> generated);\n    }\n\n    public interface IInlineTagParser : ITagParser\n    {\n        bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<CInline> generated);\n    }\n\n    public interface IBlockTagParser : ITagParser\n    {\n        bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<Control> generated);\n    }\n\n    public interface IHasPriority\n    {\n        int Priority { get; }\n    }\n\n    public static class HasPriority\n    {\n        public const int DefaultPriority = 10000;\n\n        public static int GetPriority(this ITagParser parser)\n            => parser is IHasPriority prop ? prop.Priority : HasPriority.DefaultPriority;\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Parsers/ImageParser.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Data;\nusing Avalonia.Data.Converters;\nusing Avalonia.Layout;\nusing ColorTextBlock.Avalonia;\nusing HtmlAgilityPack;\nusing Markdown.Avalonia.Html.Core.Utils;\nusing Markdown.Avalonia.Plugins;\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\n\nnamespace Markdown.Avalonia.Html.Core.Parsers\n{\n    public class ImageParser : IInlineTagParser\n    {\n        private SetupInfo _setupInfo;\n\n        public ImageParser(SetupInfo info)\n        {\n            _setupInfo = info;\n        }\n\n        public IEnumerable<string> SupportTag => new[] { \"img\", \"image\" };\n\n        bool ITagParser.TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<StyledElement> generated)\n        {\n            var rtn = TryReplace(node, manager, out var list);\n            generated = list;\n            return rtn;\n        }\n\n        public bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<CInline> generated)\n        {\n            var link = node.Attributes[\"src\"]?.Value;\n            var alt = node.Attributes[\"alt\"]?.Value;\n            if (link is null)\n            {\n                generated = EnumerableExt.Empty<CInline>();\n                return false;\n            }\n            var title = node.Attributes[\"title\"]?.Value;\n            var widthTxt = node.Attributes[\"width\"]?.Value;\n            var heightTxt = node.Attributes[\"height\"]?.Value;\n\n\n            CImage image = _setupInfo.LoadImage(link);\n            if (!String.IsNullOrEmpty(title)\n                && !title.Any(ch => !Char.IsLetterOrDigit(ch)))\n            {\n                image.Classes.Add(title);\n            }\n\n\n            if (Length.TryParse(heightTxt, out var heightLen))\n            {\n                if (heightLen.Unit == Unit.Percentage)\n                {\n                    image.Bind(CImage.LayoutHeightProperty,\n                               new Binding(nameof(Layoutable.Height))\n                               {\n                                   RelativeSource = new RelativeSource()\n                                   {\n                                       Mode = RelativeSourceMode.FindAncestor,\n                                       AncestorType = typeof(CTextBlock),\n                                   },\n                                   Converter = new MultiplyConverter(heightLen.Value / 100)\n                               });\n                }\n                else\n                {\n                    image.LayoutHeight = heightLen.ToPoint();\n                }\n            }\n\n            // Bind size so document is updated when image is downloaded\n            if (Length.TryParse(widthTxt, out var widthLen))\n            {\n                if (widthLen.Unit == Unit.Percentage)\n                {\n                    image.Bind(CImage.LayoutHeightProperty,\n                               new Binding(nameof(Layoutable.Width))\n                               {\n                                   RelativeSource = new RelativeSource()\n                                   {\n                                       Mode = RelativeSourceMode.FindAncestor,\n                                       AncestorType = typeof(CTextBlock),\n                                   },\n                                   Converter = new MultiplyConverter(widthLen.Value / 100)\n                               });\n                }\n                else\n                {\n                    if (image.LayoutHeight.HasValue)\n                        image.LayoutWidth = widthLen.ToPoint();\n                    else\n                        image.RelativeWidth = widthLen.ToPoint();\n                }\n            }\n\n            generated = new[] { image };\n            return true;\n        }\n\n        class MultiplyConverter : IValueConverter\n        {\n            public double Value { get; }\n\n            public MultiplyConverter(double v)\n            {\n                Value = v;\n            }\n\n            public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)\n            {\n                return value is null ? 0d : Value * (Double)value;\n            }\n\n            public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)\n            {\n                return value is null ? 0d : ((Double)value) / Value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Parsers/InputParser.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing ColorTextBlock.Avalonia;\nusing HtmlAgilityPack;\nusing System;\nusing System.Collections.Generic;\n\nnamespace Markdown.Avalonia.Html.Core.Parsers\n{\n    public class InputParser : IInlineTagParser\n    {\n        public IEnumerable<string> SupportTag => new[] { \"input\" };\n\n        bool ITagParser.TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<StyledElement> generated)\n        {\n            var rtn = TryReplace(node, manager, out var list);\n            generated = list;\n            return rtn;\n        }\n\n        public bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<CInline> generated)\n        {\n            var type = node.Attributes[\"type\"]?.Value ?? \"text\";\n\n            double? width = null;\n            var widAttr = node.Attributes[\"width\"];\n            var sizAttr = node.Attributes[\"size\"];\n\n            if (widAttr is not null)\n            {\n                if (double.TryParse(widAttr.Value, out var v))\n                    width = v;\n            }\n            if (sizAttr is not null)\n            {\n                if (int.TryParse(sizAttr.Value, out var v))\n                    width = v * 7;\n            }\n\n            CInlineUIContainer inline;\n            switch (type)\n            {\n                default:\n                case \"text\":\n                    var txt = new TextBox()\n                    {\n                        Text = node.Attributes[\"value\"]?.Value ?? \"\",\n                        IsReadOnly = true,\n                    };\n                    if (width.HasValue) txt.Width = width.Value;\n                    else if (String.IsNullOrEmpty(txt.Text)) txt.Width = 100;\n\n\n                    inline = new CInlineUIContainer(txt);\n                    break;\n\n\n                case \"button\":\n                case \"reset\":\n                case \"submit\":\n                    var btn = new Button()\n                    {\n                        Content = node.Attributes[\"value\"]?.Value ?? \"\",\n                        IsEnabled = false,\n                    };\n                    if (width.HasValue) btn.Width = width.Value;\n                    else if (String.IsNullOrEmpty(btn.Content.ToString())) btn.Width = 100;\n\n                    inline = new CInlineUIContainer(btn);\n                    break;\n\n\n                case \"radio\":\n                    var radio = new RadioButton()\n                    {\n                        IsEnabled = false,\n                    };\n                    if (node.Attributes[\"checked\"] != null) radio.IsChecked = true;\n\n                    inline = new CInlineUIContainer(radio);\n                    break;\n\n\n                case \"checkbox\":\n                    var chk = new CheckBox()\n                    {\n                        IsEnabled = false\n                    };\n                    if (node.Attributes[\"checked\"] != null)\n                        chk.IsChecked = true;\n\n                    inline = new CInlineUIContainer(chk);\n                    break;\n\n\n                case \"range\":\n                    var slider = new Slider()\n                    {\n                        IsEnabled = false,\n                        Minimum = 0,\n                        Value = 50,\n                        Maximum = 100,\n                        Width = 100,\n                    };\n\n                    var minAttr = node.Attributes[\"min\"];\n                    if (minAttr is not null && double.TryParse(minAttr.Value, out var minVal))\n                    {\n                        slider.Minimum = minVal;\n                    }\n\n                    var maxAttr = node.Attributes[\"max\"];\n                    if (maxAttr is not null && double.TryParse(maxAttr.Value, out var maxVal))\n                    {\n                        slider.Maximum = maxVal;\n                    }\n\n                    var valAttr = node.Attributes[\"value\"];\n                    if (valAttr is not null && double.TryParse(valAttr.Value, out var val))\n                    {\n                        slider.Value = val;\n                    }\n                    else\n                    {\n                        slider.Value = (slider.Minimum + slider.Maximum) / 2;\n                    }\n\n                    inline = new CInlineUIContainer(slider);\n                    break;\n            }\n\n            generated = new[] { inline };\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Parsers/OrderListParser.cs",
    "content": "﻿using HtmlAgilityPack;\nusing System;\nusing System.Collections.Generic;\nusing Markdown.Avalonia.Html.Core.Utils;\nusing System.Windows;\nusing System.Linq;\nusing Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Layout;\nusing System.Reflection;\nusing ColorTextBlock.Avalonia;\nusing Avalonia.Media;\n\nnamespace Markdown.Avalonia.Html.Core.Parsers\n{\n    public class OrderListParser : IBlockTagParser\n    {\n        public IEnumerable<string> SupportTag => new[] { \"ol\" };\n\n        bool ITagParser.TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<StyledElement> generated)\n        {\n            var rtn = TryReplace(node, manager, out var list);\n            generated = list;\n            return rtn;\n        }\n\n        public bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<Control> generated)\n        {\n            var list = new Grid();\n            list.ColumnDefinitions.Add(new ColumnDefinition(GridLength.Auto));\n            list.ColumnDefinitions.Add(new ColumnDefinition(new GridLength(1, GridUnitType.Star)));\n\n            int index = 0;\n            int order = 1;\n\n            var startAttr = node.Attributes[\"start\"];\n            if (startAttr is not null && Int32.TryParse(startAttr.Value, out var start))\n            {\n                order = start;\n            }\n\n            foreach (var listItemTag in node.ChildNodes.CollectTag(\"li\"))\n            {\n                var itemContent = manager.ParseChildrenAndGroup(listItemTag);\n\n                var markerTxt = new CTextBlock(order + \".\");\n                markerTxt.TextAlignment = TextAlignment.Right;\n                markerTxt.TextWrapping = TextWrapping.NoWrap;\n                markerTxt.Classes.Add(global::Markdown.Avalonia.Markdown.ListMarkerClass);\n\n                var item = CreateItem(itemContent);\n\n                list.RowDefinitions.Add(new RowDefinition());\n                list.Children.Add(markerTxt);\n                list.Children.Add(item);\n\n                Grid.SetRow(markerTxt, index);\n                Grid.SetColumn(markerTxt, 0);\n\n                Grid.SetRow(item, index);\n                Grid.SetColumn(item, 1);\n\n                ++index;\n                ++order;\n            }\n\n            generated = new[] { list };\n            return true;\n        }\n\n        private StackPanel CreateItem(IEnumerable<Control> children)\n        {\n            var panel = new StackPanel() { Orientation = Orientation.Vertical };\n            foreach (var child in children)\n                panel.Children.Add(child);\n\n            return panel;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Parsers/ProgressParser.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing ColorTextBlock.Avalonia;\nusing HtmlAgilityPack;\nusing System.Collections.Generic;\n\nnamespace Markdown.Avalonia.Html.Core.Parsers\n{\n    public class ProgressParser : IInlineTagParser\n    {\n        public IEnumerable<string> SupportTag => new[] { \"progress\", \"meter\" };\n\n        bool ITagParser.TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<StyledElement> generated)\n        {\n            var rtn = TryReplace(node, manager, out var list);\n            generated = list;\n            return rtn;\n        }\n\n        public bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<CInline> generated)\n        {\n            var bar = new ProgressBar()\n            {\n                Value = TryParse(node.Attributes[\"value\"]?.Value, 1),\n                Minimum = TryParse(node.Attributes[\"min\"]?.Value, 0),\n                Maximum = TryParse(node.Attributes[\"max\"]?.Value, 1),\n                Width = 50,\n                Height = 12,\n            };\n            generated = new[] { new CInlineUIContainer(bar) };\n            return true;\n        }\n\n        private static int TryParse(string? txt, int def)\n        {\n            if (txt is null) return def;\n            return int.TryParse(txt, out var v) ? v : def;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Parsers/TagIgnoreParser.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing ColorTextBlock.Avalonia;\nusing HtmlAgilityPack;\nusing Markdown.Avalonia.Html.Core.Utils;\nusing System.Collections.Generic;\n\nnamespace Markdown.Avalonia.Html.Core.Parsers\n{\n    public class TagIgnoreParser : IBlockTagParser, IInlineTagParser\n    {\n        public IEnumerable<string> SupportTag => new[] { \"title\", \"meta\", \"link\", \"script\", \"style\", \"datalist\" };\n\n        bool ITagParser.TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<StyledElement> generated)\n        {\n            generated = EnumerableExt.Empty<StyledElement>();\n            return true;\n        }\n\n        public bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<Control> generated)\n        {\n            generated = EnumerableExt.Empty<Control>();\n            return true;\n        }\n\n        public bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<CInline> generated)\n        {\n            generated = EnumerableExt.Empty<CInline>();\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Parsers/TextAreaParser.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Media;\nusing ColorTextBlock.Avalonia;\nusing HtmlAgilityPack;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Markdown.Avalonia.Html.Core.Parsers\n{\n    public class TextAreaParser : IInlineTagParser\n    {\n        public IEnumerable<string> SupportTag => new[] { \"textarea\" };\n\n        bool ITagParser.TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<StyledElement> generated)\n        {\n            var rtn = TryReplace(node, manager, out var list);\n            generated = list;\n            return rtn;\n        }\n\n        public bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<CInline> generated)\n        {\n            var area = new TextBox()\n            {\n                AcceptsReturn = true,\n                AcceptsTab = true,\n                Text = node.InnerText.Trim(),\n                TextWrapping = TextWrapping.Wrap,\n            };\n\n            int? rows = null;\n            int? cols = null;\n            var rowsAttr = node.Attributes[\"rows\"];\n            var colsAttr = node.Attributes[\"cols\"];\n\n            if (rowsAttr is not null)\n            {\n                if (int.TryParse(rowsAttr.Value, out var v))\n                    rows = v * 14;\n            }\n            if (colsAttr is not null)\n            {\n                if (int.TryParse(colsAttr.Value, out var v))\n                    cols = v * 7;\n            }\n\n            if (rows.HasValue) area.Height = rows.Value;\n            if (cols.HasValue) area.Width = cols.Value;\n\n            generated = new[] { new CInlineUIContainer(area) };\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Parsers/TextNodeParser.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls.Documents;\nusing ColorTextBlock.Avalonia;\nusing HtmlAgilityPack;\nusing Markdown.Avalonia.Html.Core.Utils;\nusing System.Collections.Generic;\n\nnamespace Markdown.Avalonia.Html.Core.Parsers\n{\n    public class TextNodeParser : IInlineTagParser\n    {\n        public IEnumerable<string> SupportTag => new[] { HtmlNode.HtmlNodeTypeNameText };\n\n        bool ITagParser.TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<StyledElement> generated)\n        {\n            var rtn = TryReplace(node, manager, out var list);\n            generated = list;\n            return rtn;\n        }\n\n        public bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<CInline> generated)\n        {\n            if (node is HtmlTextNode textNode)\n            {\n                generated = Replace(textNode.Text, manager);\n                return true;\n            }\n\n            generated = EnumerableExt.Empty<CInline>();\n            return false;\n        }\n\n        public IEnumerable<CInline> Replace(string text, ReplaceManager manager)\n            => text.StartsWith(\"\\n\") ?\n                    new[] { new CRun() { Text = text.Replace('\\n', ' ') } } :\n                    manager.Engine.RunSpanGamut(text.Replace('\\n', ' '));\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Parsers/TypicalBlockParser.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing HtmlAgilityPack;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Markdown.Avalonia.Html.Core.Parsers\n{\n    public class TypicalBlockParser : IBlockTagParser\n    {\n        private const string _resource = \"Markdown.Avalonia.Html.Core.Parsers.TypicalBlockParser.tsv\";\n        private TypicalParseInfo _parser;\n\n        public IEnumerable<string> SupportTag => new[] { _parser.HtmlTag };\n\n        public TypicalBlockParser(TypicalParseInfo parser)\n        {\n            _parser = parser;\n        }\n\n        bool ITagParser.TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<StyledElement> generated)\n        {\n            var rtn = _parser.TryReplace(node, manager, out var list);\n            generated = list;\n            return rtn;\n        }\n\n        public bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<Control> generated)\n        {\n            var rtn = _parser.TryReplace(node, manager, out var list);\n            generated = list.Cast<Control>();\n            return rtn;\n        }\n\n        public static IEnumerable<TypicalBlockParser> Load()\n        {\n            foreach (var info in TypicalParseInfo.Load(_resource))\n            {\n                yield return new TypicalBlockParser(info);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Parsers/TypicalBlockParser.tsv",
    "content": "﻿#HtmlTag   | FlowDocumentTag                    | TagName              | ExtraModify\naddress    | #border                            | TagAddress           |\narticle    | #border                            | TagArticle           |\naside      | #border                            | TagAside             |\nblockquote | #border                            | TagBlockquote        |\ncenter     | #border                            | TagCenter            | Center\ndiv        | #blocks                            |                      |\nfooter     | #border                            | TagFooter            |\nh1         | #blocks                            | TagHeading1          |\nh2         | #blocks                            | TagHeading2          |\nh3         | #blocks                            | TagHeading3          |\nh4         | #blocks                            | TagHeading4          |\nh5         | #blocks                            | TagHeading5          |\nh6         | #blocks                            | TagHeading6          |\nnoframes   | #blocks                            |                      |\nnoscript   | #blocks                            |                      |\np          | #blocks                            |                      |"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Parsers/TypicalInlineParser.cs",
    "content": "﻿using Avalonia;\nusing ColorTextBlock.Avalonia;\nusing HtmlAgilityPack;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Markdown.Avalonia.Html.Core.Parsers\n{\n    public class TypicalInlineParser : IInlineTagParser\n    {\n        private const string _resource = \"Markdown.Avalonia.Html.Core.Parsers.TypicalInlineParser.tsv\";\n        private readonly TypicalParseInfo _parser;\n\n        public IEnumerable<string> SupportTag => new[] { _parser.HtmlTag };\n\n        public TypicalInlineParser(TypicalParseInfo parser)\n        {\n            _parser = parser;\n        }\n\n        bool ITagParser.TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<StyledElement> generated)\n        {\n            var rtn = _parser.TryReplace(node, manager, out var list);\n            generated = list;\n            return rtn;\n        }\n\n        public bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<CInline> generated)\n        {\n            var rtn = _parser.TryReplace(node, manager, out var list);\n            generated = list.Cast<CInline>();\n            return rtn;\n        }\n\n        public static IEnumerable<TypicalInlineParser> Load()\n        {\n            foreach (var info in TypicalParseInfo.Load(_resource))\n            {\n                yield return new TypicalInlineParser(info);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Parsers/TypicalInlineParser.tsv",
    "content": "﻿#HtmlTag   | FlowDocumentTag                    | TagName              | ExtraModify\na          | ColorTextBlock.Avalonia.CHyperlink | TagHyperlink         | Hyperlink\nabbr       | ColorTextBlock.Avalonia.CSpan      | TagAbbr              | Acronym\nacronym    | ColorTextBlock.Avalonia.CSpan      | TagAbbr              | Acronym\nb          | ColorTextBlock.Avalonia.CBold      | TagBold              |\nbdi        | ColorTextBlock.Avalonia.CSpan      | TagBdi               |\nbr         | ColorTextBlock.Avalonia.CLineBreak |                      |\ncite       | ColorTextBlock.Avalonia.CSpan      | TagCite              |\ndel        | ColorTextBlock.Avalonia.CSpan      | TagStrikethrough     | Strikethrough\nem         | ColorTextBlock.Avalonia.CItalic    | TagItalic            |\ni          | ColorTextBlock.Avalonia.CItalic    | TagItalic            |\nins        | ColorTextBlock.Avalonia.CUnderline | TagUnderline         |\nmark       | ColorTextBlock.Avalonia.CSpan      | TagMark              |\ns          | ColorTextBlock.Avalonia.CSpan      | TagStrikethrough     | Strikethrough\nstrike     | ColorTextBlock.Avalonia.CSpan      | TagStrikethrough     | Strikethrough\nstrong     | ColorTextBlock.Avalonia.CBold      | TagBold              |\nsub        | ColorTextBlock.Avalonia.CSpan      | TagSubscript         | Subscript\nsup        | ColorTextBlock.Avalonia.CSpan      | TagSuperscript       | Superscript\nu          | ColorTextBlock.Avalonia.CUnderline | TagUnderline         |\ncode       | ColorTextBlock.Avalonia.CCode      | TagCodeSpan          |\nkbd        | ColorTextBlock.Avalonia.CCode      | TagCodeSpan          |\nvar        | ColorTextBlock.Avalonia.CCode      | TagCodeSpan          |"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Parsers/TypicalParseInfo.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Collections;\nusing Avalonia.Controls;\nusing Avalonia.Layout;\nusing ColorTextBlock.Avalonia;\nusing HtmlAgilityPack;\nusing Markdown.Avalonia.Html.Core.Utils;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Xml.Linq;\n\nnamespace Markdown.Avalonia.Html.Core.Parsers\n{\n    public class TypicalParseInfo\n    {\n        public string HtmlTag { get; }\n        public string FlowDocumentTagText { get; }\n        public Type? FlowDocumentTag { get; }\n        public string? TagNameReference { get; }\n        public Tags TagName { get; }\n        public string? ExtraModifyName { get; }\n\n        public TypicalParseInfo(string[] line)\n        {\n            FlowDocumentTagText = line[1];\n\n            if (FlowDocumentTagText.StartsWith(\"#\"))\n            {\n                FlowDocumentTag = null;\n            }\n            else\n            {\n                Type? elementType = AppDomain.CurrentDomain\n                                             .GetAssemblies()\n                                             .Select(asm => asm.GetType(FlowDocumentTagText))\n                                             .OfType<Type>()\n                                             .FirstOrDefault();\n\n                if (elementType is null)\n                    throw new ArgumentException($\"Failed to load type '{line[1]}'\");\n\n                FlowDocumentTag = elementType;\n            }\n\n\n            HtmlTag = line[0];\n            TagNameReference = GetArrayAt(line, 2);\n            ExtraModifyName = GetArrayAt(line, 3);\n\n            if (TagNameReference is not null)\n            {\n                TagName = (Tags)Enum.Parse(typeof(Tags), TagNameReference);\n            }\n\n            if (ExtraModifyName is not null)\n            {\n                switch (\"ExtraModify\" + ExtraModifyName)\n                {\n                    case nameof(ExtraModifyHyperlink):\n                    case nameof(ExtraModifyStrikethrough):\n                    case nameof(ExtraModifySubscript):\n                    case nameof(ExtraModifySuperscript):\n                    case nameof(ExtraModifyAcronym):\n                    case nameof(ExtraModifyCenter):\n                        break;\n\n                    default:\n                        throw new InvalidOperationException(\"unknown method ExtraModify\" + ExtraModifyName);\n                }\n            }\n\n            static string? GetArrayAt(string[] array, int idx)\n            {\n                if (idx < array.Length\n                    && !string.IsNullOrWhiteSpace(array[idx]))\n                {\n                    return array[idx];\n                }\n                return null;\n            }\n        }\n\n        public bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<StyledElement> generated)\n        {\n            // create instance\n\n            if (FlowDocumentTag is null)\n            {\n                switch (FlowDocumentTagText)\n                {\n                    case \"#border\":\n                        var pnl = new StackPanel();\n                        pnl.Orientation = Orientation.Vertical;\n                        var parseResult = manager.ParseChildrenAndGroup(node).ToArray();\n                        foreach (var ctrl in parseResult)\n                            pnl.Children.Add(ctrl);\n\n                        var bdr = new Border();\n                        bdr.Child = pnl;\n\n                        generated = new[] { bdr };\n                        break;\n\n\n                    case \"#blocks\":\n                        generated = manager.ParseChildrenAndGroup(node).ToArray();\n                        break;\n\n                    case \"#jagging\":\n                        generated = manager.ParseChildrenJagging(node).ToArray();\n                        break;\n\n                    case \"#inlines\":\n                        if (manager.ParseChildrenJagging(node).TryCast<CInline>(out var inlines))\n                        {\n                            generated = inlines.ToArray();\n                            break;\n                        }\n                        else\n                        {\n                            generated = EnumerableExt.Empty<StyledElement>();\n                            return false;\n                        }\n\n                    default:\n                        throw new InvalidOperationException();\n                }\n\n                // for href anchor\n                //if (node.Attributes[\"id\"]?.Value is string idval\n                //    && generated.FirstOrDefault() is AvaloniaObject tag)\n                //{\n                //    tag.SetValue(DocumentAnchor.HyperlinkAnchorProperty, idval);\n                //}\n            }\n            else\n            {\n                var tag = (StyledElement)Activator.CreateInstance(FlowDocumentTag)!;\n\n                // for href anchor\n                //if (node.Attributes[\"id\"]?.Value is string idval)\n                //{\n                //    tag.SetValue(DocumentAnchor.HyperlinkAnchorProperty, idval);\n                //}\n\n                if (tag is StackPanel pnl)\n                {\n                    pnl.Orientation = Orientation.Vertical;\n                    var parseResult = manager.ParseChildrenAndGroup(node).ToArray();\n                    foreach (var ctrl in parseResult)\n                        pnl.Children.Add(ctrl);\n                }\n                else if (tag is CTextBlock textbox)\n                {\n                    var parseResult = manager.ParseChildrenJagging(node).ToArray();\n\n                    if (parseResult.TryCast<CInline>(out var parsed))\n                    {\n                        textbox.Content.AddRange(parsed);\n                    }\n                    else if (parseResult.Length == 1 && parseResult[0] is CTextBlock)\n                    {\n                        tag = parseResult[0];\n                    }\n                    else\n                    {\n                        generated = EnumerableExt.Empty<StyledElement>();\n                        return false;\n                    }\n                }\n                else if (tag is CSpan span)\n                {\n                    if (!SetupCSpan(span))\n                    {\n                        generated = EnumerableExt.Empty<StyledElement>();\n                        return false;\n                    }\n                }\n                else if (tag is CCode code)\n                {\n                    var codecontent = (AvaloniaList<CInline>)code.Content;\n                    var codespan = new CSpan();\n                    codecontent.Add(codespan);\n\n                    if (!SetupCSpan(codespan))\n                    {\n                        generated = EnumerableExt.Empty<StyledElement>();\n                        return false;\n                    }\n                }\n                else if (tag is not CLineBreak)\n                {\n                    throw new InvalidOperationException();\n                }\n\n                generated = new[] { tag };\n\n                bool SetupCSpan(CSpan span)\n                {\n                    var content = (AvaloniaList<CInline>)span.Content;\n\n                    var parseResult = manager.ParseChildrenJagging(node).ToArray();\n\n                    if (parseResult.TryCast<CInline>(out var parsed))\n                    {\n                        content.AddRange(parsed);\n                    }\n                    else if (tag is CSpan && manager.Grouping(parseResult).TryCast<CTextBlock>(out var paragraphs))\n                    {\n                        // FIXME: Markdonw.Avalonia can't bubbling a block element in a inline element.\n                        foreach (var para in paragraphs)\n                            foreach (var inline in para.Content.ToArray())\n                                content.Add(inline);\n                    }\n                    else return false;\n\n                    return true;\n                }\n            }\n\n            // apply tag\n\n            if (TagNameReference is not null)\n            {\n                var clsNm = TagName.GetClass();\n                foreach (var tag in generated)\n                {\n                    tag.Classes.Add(clsNm);\n\n                    if (tag is Border bdr)\n                        bdr.Child.Classes.Add(clsNm);\n                }\n            }\n\n            // extra modify\n            if (ExtraModifyName is not null)\n            {\n                switch (\"ExtraModify\" + ExtraModifyName)\n                {\n                    case nameof(ExtraModifyHyperlink):\n                        foreach (var tag in generated)\n                            ExtraModifyHyperlink((CHyperlink)tag, node, manager);\n                        break;\n                    case nameof(ExtraModifyStrikethrough):\n                        foreach (var tag in generated)\n                            ExtraModifyStrikethrough((CSpan)tag, node, manager);\n                        break;\n                    case nameof(ExtraModifySubscript):\n                        foreach (var tag in generated)\n                            ExtraModifySubscript((CSpan)tag, node, manager);\n                        break;\n                    case nameof(ExtraModifySuperscript):\n                        foreach (var tag in generated)\n                            ExtraModifySuperscript((CSpan)tag, node, manager);\n                        break;\n                    case nameof(ExtraModifyAcronym):\n                        foreach (var tag in generated)\n                            ExtraModifyAcronym((CSpan)tag, node, manager);\n                        break;\n                    case nameof(ExtraModifyCenter):\n                        foreach (var tag in generated)\n                            ExtraModifyCenter((Border)tag, node, manager);\n                        break;\n                }\n            }\n\n            return true;\n        }\n\n\n        public void ExtraModifyHyperlink(CHyperlink link, HtmlNode node, ReplaceManager manager)\n        {\n            var href = node.Attributes[\"href\"]?.Value;\n\n            if (href is not null)\n            {\n                link.CommandParameter = href;\n                link.Command = (urlTxt) =>\n                {\n                    var command = manager.HyperlinkCommand;\n                    if (command != null && command.CanExecute(urlTxt))\n                    {\n                        command.Execute(urlTxt);\n                    }\n                };\n            }\n        }\n\n        public void ExtraModifyStrikethrough(CSpan span, HtmlNode node, ReplaceManager manager)\n        {\n            span.IsStrikethrough = true;\n        }\n\n        public void ExtraModifySubscript(CSpan span, HtmlNode node, ReplaceManager manager)\n        {\n            // TODO implements Subscript\n            //Typography.SetVariants(span, FontVariants.Subscript);\n        }\n\n        public void ExtraModifySuperscript(CSpan span, HtmlNode node, ReplaceManager manager)\n        {\n            // TODO implements Superscript\n            //Typography.SetVariants(span, FontVariants.Superscript);\n        }\n\n        public void ExtraModifyAcronym(CSpan span, HtmlNode node, ReplaceManager manager)\n        {\n            // TODO implements Acronym\n            //var title = node.Attributes[\"title\"]?.Value;\n            //if (title is not null)\n            //    span.ToolTip = title;\n        }\n\n        public void ExtraModifyCenter(Border center, HtmlNode node, ReplaceManager manager)\n        {\n            center.HorizontalAlignment = HorizontalAlignment.Center;\n\n            foreach (var child in ((StackPanel)center.Child!).Children)\n            {\n                if (child is CTextBlock cbox)\n                {\n                    cbox.HorizontalAlignment = HorizontalAlignment.Center;\n                }\n            }\n        }\n\n        internal static IEnumerable<TypicalParseInfo> Load(string resourcePath)\n        {\n            var asm = typeof(TypicalBlockParser).Assembly;\n            using var stream = asm.GetManifestResourceStream(resourcePath);\n\n            if (stream is null)\n                throw new ArgumentException($\"resource not found: '{resourcePath}'\");\n\n            using var reader = new StreamReader(stream!);\n            while (reader.ReadLine() is string line)\n            {\n                if (line.StartsWith(\"#\")) continue;\n\n                var elements = line.Split('|').Select(t => t.Trim()).ToArray();\n                yield return new TypicalParseInfo(elements);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Parsers/UnorderListParser.cs",
    "content": "﻿using HtmlAgilityPack;\nusing System.Collections.Generic;\nusing Markdown.Avalonia.Html.Core.Utils;\nusing Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Layout;\nusing Avalonia.Media;\nusing ColorTextBlock.Avalonia;\n\nnamespace Markdown.Avalonia.Html.Core.Parsers\n{\n    public class UnorderListParser : IBlockTagParser\n    {\n        public IEnumerable<string> SupportTag => new[] { \"ul\" };\n\n        bool ITagParser.TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<StyledElement> generated)\n        {\n            var rtn = TryReplace(node, manager, out var list);\n            generated = list;\n            return rtn;\n        }\n\n        public bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<Control> generated)\n        {\n            var list = new Grid();\n            list.ColumnDefinitions.Add(new ColumnDefinition(GridLength.Auto));\n            list.ColumnDefinitions.Add(new ColumnDefinition(new GridLength(1, GridUnitType.Star)));\n\n            int index = 0;\n\n            foreach (var listItemTag in node.ChildNodes.CollectTag(\"li\"))\n            {\n                var itemContent = manager.ParseChildrenAndGroup(listItemTag);\n\n                var markerTxt = new CTextBlock(\"・\");\n                markerTxt.TextAlignment = TextAlignment.Right;\n                markerTxt.TextWrapping = TextWrapping.NoWrap;\n                markerTxt.Classes.Add(global::Markdown.Avalonia.Markdown.ListMarkerClass);\n\n                var item = CreateItem(itemContent);\n\n                list.RowDefinitions.Add(new RowDefinition());\n                list.Children.Add(markerTxt);\n                list.Children.Add(item);\n\n                Grid.SetRow(markerTxt, index);\n                Grid.SetColumn(markerTxt, 0);\n\n                Grid.SetRow(item, index);\n                Grid.SetColumn(item, 1);\n\n                ++index;\n            }\n\n            generated = new[] { list };\n            return true;\n        }\n\n        private StackPanel CreateItem(IEnumerable<Control> children)\n        {\n            var panel = new StackPanel() { Orientation = Orientation.Vertical };\n            foreach (var child in children)\n                panel.Children.Add(child);\n\n            return panel;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Parsers.MarkdigExtensions/FigureParser.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Layout;\nusing HtmlAgilityPack;\nusing Markdown.Avalonia.Html.Core.Utils;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Markdown.Avalonia.Html.Core.Parsers.MarkdigExtensions\n{\n    public class FigureParser : IBlockTagParser\n    {\n        public IEnumerable<string> SupportTag => new[] { \"figure\" };\n\n        bool ITagParser.TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<StyledElement> generated)\n        {\n            var rtn = TryReplace(node, manager, out var list);\n            generated = list;\n            return rtn;\n        }\n\n        public bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<Control> generated)\n        {\n            var captionPair =\n                node.ChildNodes\n                    .SkipComment()\n                    .Filter(nd => string.Equals(nd.Name, \"figcaption\", StringComparison.OrdinalIgnoreCase));\n\n            var captionList = captionPair.Item1;\n            var contentList = captionPair.Item2;\n\n\n            var captionBlock = captionList.SelectMany(c => manager.Grouping(manager.ParseBlockAndInline(c)));\n            var contentBlock = contentList.SelectMany(c => manager.Grouping(manager.ParseChildrenJagging(c)));\n\n            var section = new DockPanel() { LastChildFill = true };\n            section.Tag = Tags.TagFigure.GetClass();\n\n            foreach (var caption in captionBlock)\n            {\n                DockPanel.SetDock(caption, Dock.Top);\n                section.Children.Add(caption);\n            }\n\n            var contentPanel = new StackPanel() { Orientation = Orientation.Vertical };\n            foreach (var content in contentBlock)\n            {\n                contentPanel.Children.Add(content);\n            }\n            section.Children.Add(contentPanel);\n\n            generated = new[] { section };\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Parsers.MarkdigExtensions/GridTableParser.cs",
    "content": "﻿using HtmlAgilityPack;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text.RegularExpressions;\nusing Markdown.Avalonia.Html.Core.Utils;\nusing Avalonia;\nusing Avalonia.Controls;\nusing Markdown.Avalonia.Html.Tables;\nusing Avalonia.Layout;\n\nnamespace Markdown.Avalonia.Html.Core.Parsers.MarkdigExtensions\n{\n    public class GridTableParser : IBlockTagParser, IHasPriority\n    {\n        public int Priority => HasPriority.DefaultPriority + 1000;\n\n        public IEnumerable<string> SupportTag => new[] { \"table\" };\n\n        bool ITagParser.TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<StyledElement> generated)\n        {\n            var rtn = TryReplace(node, manager, out var list);\n            generated = list;\n            return rtn;\n        }\n\n        public bool TryReplace(HtmlNode node, ReplaceManager manager, out IEnumerable<Control> generated)\n        {\n            var table = new Table();\n\n            var theadRows = node.SelectNodes(\"./thead/tr\");\n            if (theadRows is not null)\n            {\n                var group = CreateRowGroup(theadRows, manager);\n\n                SetupClass(group, Tags.TagTableHeader.GetClass());\n\n                table.RowGroups.AddRange(group);\n            }\n\n            var tbodyRows = new List<HtmlNode>();\n            foreach (var child in node.ChildNodes)\n            {\n                if (string.Equals(child.Name, \"tr\", StringComparison.OrdinalIgnoreCase))\n                    tbodyRows.Add(child);\n\n                if (string.Equals(child.Name, \"tbody\", StringComparison.OrdinalIgnoreCase))\n                    tbodyRows.AddRange(child.ChildNodes.CollectTag(\"tr\"));\n            }\n            if (tbodyRows.Count > 0)\n            {\n                var group = CreateRowGroup(tbodyRows, manager);\n\n                table.RowGroups.AddRange(group);\n\n                int idx = 0;\n                foreach (var row in group)\n                {\n                    var useTag = (++idx & 1) == 0 ? Tags.TagEvenTableRow : Tags.TagOddTableRow;\n                    var clsNm = useTag.GetClass();\n\n                    foreach (var cell in row)\n                        cell.Content.Classes.Add(clsNm);\n                }\n            }\n\n            var tfootRows = node.SelectNodes(\"./tfoot/tr\");\n            if (tfootRows is not null)\n            {\n                var group = CreateRowGroup(tfootRows, manager);\n\n                SetupClass(group, Tags.TagTableFooter.GetClass());\n\n                table.RowGroups.AddRange(group);\n            }\n\n            ParseColumnStyle(node, table);\n\n            table.Structure();\n\n            // table\n            var grid = new Grid();\n\n            // table columns\n            grid.ColumnDefinitions = new AutoScaleColumnDefinitions(table.ColumnLengths, grid);\n\n            // table rows\n            int rowIdx = 0;\n            foreach (var row in table.RowGroups)\n            {\n                grid.RowDefinitions.Add(new RowDefinition());\n\n                foreach (var cell in row)\n                {\n                    grid.Children.Add(cell.Content);\n                    Grid.SetRow(cell.Content, rowIdx);\n                    Grid.SetColumn(cell.Content, cell.ColumnIndex);\n                    Grid.SetRowSpan(cell.Content, cell.RowSpan);\n                    Grid.SetColumnSpan(cell.Content, cell.ColSpan);\n                }\n                ++rowIdx;\n            }\n\n            grid.Classes.Add(global::Markdown.Avalonia.Markdown.TableClass);\n\n            var border = new Border();\n            border.Child = grid;\n            border.Classes.Add(global::Markdown.Avalonia.Markdown.TableClass);\n\n            if (table.ColumnLengths.All(l => l.Unit != LengthUnit.Percent))\n            {\n                border.Classes.Add(\"TightTable\");\n            }\n\n            var captions = node.SelectNodes(\"./caption\");\n            if (captions is not null)\n            {\n                var section = new DockPanel() { LastChildFill = true };\n\n                foreach (var captionNode in captions)\n                {\n                    foreach (var caption in manager.ParseChildrenAndGroup(captionNode))\n                    {\n                        DockPanel.SetDock(caption, Dock.Top);\n                        caption.Classes.Add(Tags.TagTableCaption.GetClass());\n                        section.Children.Add(caption);\n                    }\n                }\n\n                section.Children.Add(border);\n\n                generated = new[] { section };\n            }\n            else\n            {\n                generated = new[] { border };\n            }\n\n            return true;\n        }\n\n        private static void SetupClass(List<List<TableCell>> group, string cls)\n        {\n            foreach (var row in group)\n                foreach (var cell in row)\n                    cell.Content.Classes.Add(cls);\n        }\n\n\n        private static void ParseColumnStyle(HtmlNode tableTag, Table table)\n        {\n            var colHolder = tableTag.ChildNodes.HasOneTag(\"colgroup\", out var colgroup) ? colgroup! : tableTag;\n\n            foreach (var col in colHolder.ChildNodes.CollectTag(\"col\"))\n            {\n\n                var styleAttr = col.Attributes[\"style\"];\n                if (styleAttr is null) continue;\n\n                var mch = Regex.Match(styleAttr.Value, \"width[ \\t]*:[ \\t]*([^;\\\"]+)(%|em|ex|mm|cm|in|pt|pc|)\");\n                if (!mch.Success) continue;\n\n                if (!Length.TryParse(mch.Groups[1].Value + mch.Groups[2].Value, out var length))\n                    continue;\n\n                table.ColumnLengths.Add(length.Unit switch\n                {\n                    Unit.Percentage => new LengthInfo(length.Value, LengthUnit.Percent),\n                    _ => new LengthInfo(length.ToPoint(), LengthUnit.Pixel)\n                });\n            }\n        }\n\n\n        private static List<List<TableCell>> CreateRowGroup(\n            IEnumerable<HtmlNode> rows,\n            ReplaceManager manager)\n        {\n            var group = new List<List<TableCell>>();\n\n            foreach (var rowTag in rows)\n            {\n                var row = new List<TableCell>();\n\n                foreach (var cellTag in rowTag.ChildNodes.CollectTag(\"td\", \"th\"))\n                {\n                    var cell = new TableCell(manager.ParseChildrenAndGroup(cellTag));\n\n                    int colspan = TryParse(cellTag.Attributes[\"colspan\"]?.Value);\n                    int rowspan = TryParse(cellTag.Attributes[\"rowspan\"]?.Value);\n\n                    cell.RowSpan = rowspan;\n                    cell.ColSpan = colspan;\n\n                    row.Add(cell);\n                }\n\n                group.Add(row);\n            }\n\n            return group;\n\n            static int TryParse(string? txt) => int.TryParse(txt, out var v) ? v : 1;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/ReplaceManager.cs",
    "content": "﻿using HtmlAgilityPack;\nusing System;\nusing System.Collections.Generic;\nusing System.Windows.Input;\nusing Markdown.Avalonia.Html.Core.Parsers;\nusing Markdown.Avalonia.Html.Core.Utils;\nusing Markdown.Avalonia.Html.Core.Parsers.MarkdigExtensions;\nusing System.Linq;\nusing System.Text;\nusing Markdown.Avalonia;\nusing Avalonia.Controls;\nusing Avalonia;\nusing ColorTextBlock.Avalonia;\nusing Markdown.Avalonia.Parsers;\nusing Markdown.Avalonia.Plugins;\nusing Markdown.Avalonia.SyntaxHigh;\n\nnamespace Markdown.Avalonia.Html.Core\n{\n    public class ReplaceManager\n    {\n        private readonly Dictionary<string, List<IInlineTagParser>> _inlineBindParsers;\n        private readonly Dictionary<string, List<IBlockTagParser>> _blockBindParsers;\n        private readonly Dictionary<string, List<ITagParser>> _bindParsers;\n\n        private TextNodeParser textParser;\n\n        public ReplaceManager(SyntaxHighlight highlight, SetupInfo info)\n        {\n            _inlineBindParsers = new();\n            _blockBindParsers = new();\n            _bindParsers = new();\n\n            UnknownTags = UnknownTagsOption.Drop;\n\n            Register(new TagIgnoreParser());\n            Register(new CommentParsre());\n            Register(new ImageParser(info));\n            Register(new CodeBlockParser(highlight));\n            //Register(new CodeSpanParser());\n            Register(new OrderListParser());\n            Register(new UnorderListParser());\n            Register(textParser = new TextNodeParser());\n            Register(new HorizontalRuleParser());\n            Register(new FigureParser());\n            Register(new GridTableParser());\n            Register(new InputParser());\n            Register(new ButtonParser());\n            Register(new TextAreaParser());\n            Register(new ProgressParser());\n            Register(new DetailsParser());\n\n            foreach (var parser in TypicalBlockParser.Load())\n                Register(parser);\n\n            foreach (var parser in TypicalInlineParser.Load())\n                Register(parser);\n        }\n\n        public IEnumerable<string> InlineTags => _inlineBindParsers.Keys.Where(tag => !tag.StartsWith(\"#\"));\n        public IEnumerable<string> BlockTags => _blockBindParsers.Keys.Where(tag => !tag.StartsWith(\"#\"));\n\n        public bool MaybeSupportBodyTag(string tagName)\n            => _blockBindParsers.ContainsKey(tagName.ToLower());\n\n        public bool MaybeSupportInlineTag(string tagName)\n            => _inlineBindParsers.ContainsKey(tagName.ToLower());\n\n        public UnknownTagsOption UnknownTags { get; set; }\n\n        public IMarkdownEngine Engine { get; set; }\n\n        public ICommand? HyperlinkCommand => Engine.HyperlinkCommand;\n\n        public string? AssetPathRoot => Engine.AssetPathRoot;\n\n        public void Register(ITagParser parser)\n        {\n\n            if (parser is IInlineTagParser inlineParser)\n            {\n                PrivateRegister(inlineParser, _inlineBindParsers);\n            }\n            if (parser is IBlockTagParser blockParser)\n            {\n                PrivateRegister(blockParser, _blockBindParsers);\n            }\n\n            PrivateRegister(parser, _bindParsers);\n\n            static void PrivateRegister<T>(T parser, Dictionary<string, List<T>> bindParsers) where T : ITagParser\n            {\n                foreach (var tag in parser.SupportTag)\n                {\n                    if (!bindParsers.TryGetValue(tag.ToLower(), out var list))\n                    {\n                        list = new();\n                        bindParsers.Add(tag.ToLower(), list);\n                    }\n\n                    int parserPriority = GetPriority(parser);\n\n                    int i = 0;\n                    int count = list.Count;\n                    for (; i < count; ++i)\n                        if (parserPriority <= GetPriority(list[i]))\n                            break;\n\n                    list.Insert(i, parser);\n                }\n            }\n\n            static int GetPriority(object? p)\n                => p is IHasPriority prop ? prop.Priority : HasPriority.DefaultPriority;\n        }\n\n        /// <summary>\n        /// Convert a html tag list to an element of markdown.\n        /// </summary>\n        public IEnumerable<Control> Parse(string htmldoc)\n        {\n            var doc = new HtmlDocument();\n            doc.LoadHtml(htmldoc);\n\n            return Parse(doc);\n        }\n\n        /// <summary>\n        /// Convert a html tag list to an element of markdown.\n        /// </summary>\n        public IEnumerable<Control> Parse(HtmlDocument doc)\n        {\n            var contents = new List<HtmlNode>();\n\n            var head = PickBodyOrHead(doc.DocumentNode, \"head\");\n            if (head is not null)\n                contents.AddRange(head.ChildNodes.SkipComment());\n\n            var body = PickBodyOrHead(doc.DocumentNode, \"body\");\n            if (body is not null)\n                contents.AddRange(body.ChildNodes.SkipComment());\n\n            if (contents.Count == 0)\n            {\n                var root = doc.DocumentNode.ChildNodes.SkipComment();\n\n                if (root.Count == 1 && string.Equals(root[0].Name, \"html\", StringComparison.OrdinalIgnoreCase))\n                    contents.AddRange(root[0].ChildNodes.SkipComment());\n                else\n                    contents.AddRange(root);\n            }\n\n            var jaggingResult = ParseJagging(contents);\n\n            return Grouping(jaggingResult);\n        }\n\n        /// <summary>\n        /// Convert html tag children to an element of markdown.\n        /// Inline elements are aggreated into paragraph.\n        /// </summary>\n        public IEnumerable<Control> ParseChildrenAndGroup(HtmlNode node)\n        {\n            var jaggingResult = ParseChildrenJagging(node);\n\n            return Grouping(jaggingResult);\n        }\n\n        /// <summary>\n        /// Convert html tag children to an element of markdown.\n        /// this result contains a block element and an inline element.\n        /// </summary>\n        public IEnumerable<StyledElement> ParseChildrenJagging(HtmlNode node)\n        {\n            return ParseChildrenJagigng(node.ChildNodes);\n        }\n\n        public IEnumerable<StyledElement> ParseChildrenJagigng(IEnumerable<HtmlNode> nodes)\n        {\n            // search empty line\n            var empNd = nodes.Select((nd, idx) => new { Node = nd, Index = idx })\n                             .Where(tpl => tpl.Node is HtmlTextNode)\n                             .Select(tpl => new\n                             {\n                                 NodeIndex = tpl.Index,\n                                 TextIndex = tpl.Node.InnerText.IndexOf(\"\\n\\n\")\n                             })\n                             .FirstOrDefault(tpl => tpl.TextIndex != -1);\n\n            if (empNd is null)\n            {\n                return ParseJagging(nodes);\n            }\n            else\n            {\n                return ParseJaggingAndRunBlockGamut(nodes, empNd.NodeIndex, empNd.TextIndex);\n            }\n        }\n\n\n        /// <summary>\n        /// Convert a html tag to an element of markdown.\n        /// this result contains a block element and an inline element.\n        /// </summary>\n        private IEnumerable<StyledElement> ParseJagging(IEnumerable<HtmlNode> nodes)\n        {\n            bool isPrevBlock = true;\n            StyledElement? lastElement = null;\n\n            foreach (var node in nodes)\n            {\n                if (node.IsComment())\n                    continue;\n\n                // remove blank text between the blocks.\n                if (isPrevBlock\n                    && node is HtmlTextNode txt\n                    && String.IsNullOrWhiteSpace(txt.Text))\n                    continue;\n\n                foreach (var element in ParseBlockAndInline(node))\n                {\n                    lastElement = element;\n                    yield return element;\n                }\n\n                isPrevBlock = lastElement is Control;\n            }\n        }\n\n        private IEnumerable<StyledElement> ParseJaggingAndRunBlockGamut(IEnumerable<HtmlNode> nodes, int nodeIdx, int textIdx)\n        {\n            var parseTargets = new List<HtmlNode>();\n            var textBuf = new StringBuilder();\n            var mdTextBuf = new StringBuilder();\n\n            foreach (var tpl in nodes.Select((value, i) => new { Node = value, Index = i }))\n            {\n                if (tpl.Index < nodeIdx)\n                {\n                    parseTargets.Add(tpl.Node);\n                }\n                else if (tpl.Index == nodeIdx)\n                {\n                    var nodeText = tpl.Node.InnerText;\n\n                    textBuf.Append(nodeText.Substring(0, textIdx));\n                    mdTextBuf.Append(nodeText.Substring(textIdx + 2));\n                }\n                else\n                {\n                    mdTextBuf.Append(tpl.Node.OuterHtml);\n                }\n            }\n\n            foreach (var elm in ParseJagging(parseTargets))\n                yield return elm;\n\n            foreach (var elm in textParser.Replace(textBuf.ToString(), this))\n                yield return elm;\n\n            foreach (var elm in Engine.RunBlockGamut(mdTextBuf.ToString(), ParseStatus.Init))\n                yield return elm;\n        }\n\n        /// <summary>\n        /// Convert a html tag to an element of markdown.\n        /// Only tag node and text node are accepted.\n        /// </summary>\n        /// <param name=\"node\"></param>\n        /// <returns></returns>\n        public IEnumerable<StyledElement> ParseBlockAndInline(HtmlNode node)\n        {\n            if (_bindParsers.TryGetValue(node.Name.ToLower(), out var binds))\n            {\n                foreach (var bind in binds)\n                {\n                    if (bind.TryReplace(node, this, out var parsed))\n                    {\n                        return parsed;\n                    }\n                }\n            }\n\n            return UnknownTags switch\n            {\n                UnknownTagsOption.PassThrough\n                    => HtmlUtils.IsBlockTag(node.Name) ?\n                        new[] { new CTextBlock(new CRun() { Text = node.OuterHtml }) } :\n                        new[] { new CRun() { Text = node.OuterHtml } },\n\n                UnknownTagsOption.Drop\n                    => EnumerableExt.Empty<StyledElement>(),\n\n                UnknownTagsOption.Bypass\n                    => ParseJagging(node.ChildNodes),\n\n                _ => throw new UnknownTagException(node)\n            };\n        }\n\n        public IEnumerable<Control> ParseBlock(string html)\n        {\n            var doc = new HtmlDocument();\n            doc.LoadHtml(html);\n\n            foreach (var node in doc.DocumentNode.ChildNodes)\n                foreach (var block in ParseBlock(node))\n                    yield return block;\n        }\n\n        public IEnumerable<CInline> ParseInline(string html)\n        {\n            var doc = new HtmlDocument();\n            doc.LoadHtml(html);\n\n            foreach (var node in doc.DocumentNode.ChildNodes)\n                foreach (var inline in ParseInline(node))\n                    yield return inline;\n        }\n\n        public IEnumerable<Control> ParseBlock(HtmlNode node)\n        {\n            if (_blockBindParsers.TryGetValue(node.Name.ToLower(), out var binds))\n            {\n                foreach (var bind in binds)\n                {\n                    if (bind.TryReplace(node, this, out var parsed))\n                    {\n                        return parsed;\n                    }\n                }\n            }\n\n            return UnknownTags switch\n            {\n                UnknownTagsOption.PassThrough\n                    => new[] {\n                        new CTextBlock(new CRun() { Text = node.OuterHtml })\n                    },\n\n                UnknownTagsOption.Drop\n                    => EnumerableExt.Empty<Control>(),\n\n                UnknownTagsOption.Bypass\n                    => node.ChildNodes\n                           .SkipComment()\n                           .SelectMany(nd => ParseBlock(nd)),\n\n                _ => throw new UnknownTagException(node)\n            };\n        }\n\n        public IEnumerable<CInline> ParseInline(HtmlNode node)\n        {\n            if (_inlineBindParsers.TryGetValue(node.Name.ToLower(), out var binds))\n            {\n                foreach (var bind in binds)\n                {\n                    if (bind.TryReplace(node, this, out var parsed))\n                    {\n                        return parsed;\n                    }\n                }\n            }\n\n            return UnknownTags switch\n            {\n                UnknownTagsOption.PassThrough\n                    => new[] { new CRun() { Text = node.OuterHtml } },\n\n                UnknownTagsOption.Drop\n                    => EnumerableExt.Empty<CInline>(),\n\n                UnknownTagsOption.Bypass\n                    => node.ChildNodes\n                           .SkipComment()\n                           .SelectMany(nd => ParseInline(nd)),\n\n                _ => throw new UnknownTagException(node)\n            };\n        }\n\n        /// <summary>\n        /// Convert IMdElement to IMdBlock.\n        /// Inline elements are aggreated into paragraph.\n        /// </summary>\n        public IEnumerable<Control> Grouping(IEnumerable<StyledElement> elements)\n        {\n            static CTextBlock? Group(IList<CInline> inlines)\n            {\n                // trim whiltepace plain\n\n                while (inlines.Count > 0)\n                {\n                    if (inlines[0] is CRun run\n                        && String.IsNullOrWhiteSpace(run.Text))\n                    {\n                        inlines.RemoveAt(0);\n                    }\n                    else break;\n                }\n\n                while (inlines.Count > 0)\n                {\n                    if (inlines[inlines.Count - 1] is CRun run\n                        && String.IsNullOrWhiteSpace(run.Text))\n                    {\n                        inlines.RemoveAt(inlines.Count - 1);\n                    }\n                    else break;\n                }\n\n                using (var list = inlines.GetEnumerator())\n                {\n                    CInline? prev = null;\n\n                    if (list.MoveNext())\n                    {\n                        prev = list.Current;\n                        DocUtils.TrimStart(prev);\n\n                        while (list.MoveNext())\n                        {\n                            var now = list.Current;\n\n                            if (now is CLineBreak)\n                            {\n                                DocUtils.TrimEnd(prev);\n\n                                if (list.MoveNext())\n                                {\n                                    now = list.Current;\n                                    DocUtils.TrimStart(now);\n                                }\n                            }\n\n                            prev = now;\n                        }\n                    }\n\n                    if (prev is not null)\n                        DocUtils.TrimEnd(prev);\n                }\n\n                if (inlines.Count > 0)\n                {\n                    var para = new CTextBlock();\n                    para.Content.AddRange(inlines);\n                    return para;\n                }\n                return null;\n            }\n\n            List<CInline> stored = new();\n            foreach (var e in elements)\n            {\n                if (e is CInline inline)\n                {\n                    stored.Add(inline);\n                    continue;\n                }\n\n                // grouping inlines\n                if (stored.Count != 0)\n                {\n                    var para = Group(stored);\n                    if (para is not null) yield return para;\n                    stored.Clear();\n                }\n\n                yield return (Control)e;\n            }\n\n            if (stored.Count != 0)\n            {\n                var para = Group(stored);\n                if (para is not null) yield return para;\n                stored.Clear();\n            }\n        }\n\n        private static HtmlNode? PickBodyOrHead(HtmlNode documentNode, string headOrBody)\n        {\n            // html?\n            foreach (var child in documentNode.ChildNodes)\n            {\n                if (child.Name == HtmlNode.HtmlNodeTypeNameText\n                    || child.Name == HtmlNode.HtmlNodeTypeNameComment)\n                    continue;\n\n                switch (child.Name.ToLower())\n                {\n                    case \"html\":\n                        // body? head?\n                        foreach (var descendants in child.ChildNodes)\n                        {\n                            if (descendants.Name == HtmlNode.HtmlNodeTypeNameText\n                                || descendants.Name == HtmlNode.HtmlNodeTypeNameComment)\n                                continue;\n                            switch (descendants.Name.ToLower())\n                            {\n                                case \"head\":\n                                    if (headOrBody == \"head\")\n                                        return descendants;\n                                    break;\n\n                                case \"body\":\n                                    if (headOrBody == \"body\")\n                                        return descendants;\n                                    break;\n\n                                default:\n                                    return null;\n                            }\n                        }\n                        break;\n\n                    case \"head\":\n                        if (headOrBody == \"head\")\n                            return child;\n                        break;\n\n                    case \"body\":\n                        if (headOrBody == \"body\")\n                            return child;\n                        break;\n\n                    default:\n                        return null;\n                }\n            }\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Tags.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing Engine = Markdown.Avalonia.Markdown;\n\nnamespace Markdown.Avalonia.Html.Core\n{\n    public enum Tags\n    {\n        TagTable,\n        TagTableHeader,\n        TagTableBody,\n        TagEvenTableRow,\n        TagOddTableRow,\n        TagTableFooter,\n        TagTableCaption,\n\n        TagBlockquote,\n        TagBold,\n        TagCite,\n        TagFooter,\n        TagItalic,\n        TagMark,\n        TagStrikethrough,\n        TagSubscript,\n        TagSuperscript,\n        TagUnderline,\n        TagHyperlink,\n\n        TagFigure,\n        TagRuleSingle,\n\n        TagHeading1,\n        TagHeading2,\n        TagHeading3,\n        TagHeading4,\n        TagHeading5,\n        TagHeading6,\n\n        TagCodeSpan,\n        TagCodeBlock,\n        TagAddress,\n        TagArticle,\n        TagAside,\n        TagCenter,\n        TagAbbr,\n        TagBdi\n    }\n\n    public static class TagsExt\n    {\n        public static string GetClass(this Tags tag)\n        {\n            return tag switch\n            {\n                Tags.TagHeading1 => Engine.Heading1Class,\n                Tags.TagHeading2 => Engine.Heading2Class,\n                Tags.TagHeading3 => Engine.Heading3Class,\n                Tags.TagHeading4 => Engine.Heading4Class,\n                Tags.TagHeading5 => Engine.Heading5Class,\n                Tags.TagHeading6 => Engine.Heading6Class,\n\n                Tags.TagTable => Engine.TableClass,\n                Tags.TagTableHeader => Engine.TableHeaderClass,\n                Tags.TagEvenTableRow => Engine.TableRowEvenClass,\n                Tags.TagOddTableRow => Engine.TableRowOddClass,\n                Tags.TagTableFooter => Engine.TableFooterClass,\n\n                Tags.TagBlockquote => Engine.BlockquoteClass,\n\n                Tags.TagCodeBlock => Engine.CodeBlockClass,\n\n                _ => tag.ToString().Substring(3)\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/TextRange.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Markdown.Avalonia.Html.Core\n{\n    public struct TextRange\n    {\n        public int Start { get; }\n        public int End { get; }\n        public int Length => End - Start;\n\n        public TextRange(int start, int end)\n        {\n            Start = start;\n            End = end;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/UnknownTagException.cs",
    "content": "﻿using HtmlAgilityPack;\nusing System;\n\nnamespace Markdown.Avalonia.Html.Core\n{\n    /// <summary>\n    /// MarkdownFromHtml can not convert a certain tag.\n    /// This exception is thrown when <see cref=\"UnknownTagsOption.Raise\"/> is set to <see cref=\"ReplaceManager.UnknownTags\"/>.\n    /// </summary>\n    public class UnknownTagException : Exception\n    {\n        /// <summary>\n        /// Tag name that could not be converted\n        /// </summary>\n        public string TagName { get; }\n\n        /// <summary>\n        /// Tag that could not be converted\n        /// </summary>\n        public string Content { get; }\n\n        public UnknownTagException(HtmlNode node) : base($\"unknown tag: {node.Name}\")\n        {\n            TagName = node.Name;\n            Content = node.OuterHtml;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/UnknownTagsOption.cs",
    "content": "﻿namespace Markdown.Avalonia.Html.Core\n{\n    /// <summary>\n    /// Behavior options about unknown tag.\n    /// </summary>\n    public enum UnknownTagsOption\n    {\n        /// <summary>\n        /// Unknown tag is outputed as is.\n        /// </summary>\n        PassThrough,\n\n        /// <summary>\n        /// Unknown tag is removed from the result.\n        /// </summary>\n        Drop,\n\n        /// <summary>\n        /// The unknown tag itself is ignored.\n        /// Only the content of the tag is evaluated.\n        /// </summary>\n        Bypass,\n\n        /// <summary>\n        /// Throw UnknownTagException.\n        /// </summary>\n        Raise,\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Utils/DocUtils.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Layout;\nusing AvaloniaEdit;\nusing ColorTextBlock.Avalonia;\nusing Markdown.Avalonia.SyntaxHigh;\nusing Markdown.Avalonia.SyntaxHigh.Extensions;\nusing System;\nusing System.Linq;\nusing System.Windows;\nusing System.Windows.Input;\n\nnamespace Markdown.Avalonia.Html.Core.Utils\n{\n    static class DocUtils\n    {\n        public static Control CreateCodeBlock(string? lang, string code, ReplaceManager manager, SyntaxHighlightProvider provider)\n        {\n            var txtEdit = new TextEditor();\n\n            if (!String.IsNullOrEmpty(lang))\n            {\n                txtEdit.Tag = lang;\n                txtEdit.SetValue(SyntaxHighlightWrapperExtension.ProviderProperty, provider);\n            }\n\n            txtEdit.Text = code;\n            txtEdit.HorizontalAlignment = HorizontalAlignment.Stretch;\n            txtEdit.IsReadOnly = true;\n\n            var result = new Border();\n            result.Classes.Add(Tags.TagCodeBlock.GetClass());\n            result.Child = txtEdit;\n\n            return result;\n        }\n\n        public static void TrimStart(CInline? inline)\n        {\n            if (inline is null) return;\n\n            if (inline is CSpan span)\n            {\n                TrimStart(span.Content.FirstOrDefault());\n            }\n            else if (inline is CRun run)\n            {\n                run.Text = run.Text.TrimStart();\n            }\n        }\n\n        public static void TrimEnd(CInline? inline)\n        {\n            if (inline is null) return;\n\n            if (inline is CSpan span)\n            {\n                TrimEnd(span.Content.LastOrDefault());\n            }\n            else if (inline is CRun run)\n            {\n                run.Text = run.Text.TrimEnd();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Utils/EnumerableExt.cs",
    "content": "﻿using System.Collections;\nusing System.Collections.Generic;\n\nnamespace Markdown.Avalonia.Html.Core.Utils\n{\n    internal static class EnumerableExt\n    {\n        public static bool TryCast<T>(this IEnumerable list, out List<T> casts)\n        {\n            casts = new List<T>();\n\n            foreach (var e in list)\n            {\n                if (e is T t) casts.Add(t);\n                else return false;\n            }\n\n            return true;\n        }\n\n        public static T[] Empty<T>() => EmptyArray<T>.Value;\n    }\n\n    internal class EmptyArray<T>\n    {\n        // net45 dosen't have Array.Empty<T>()\n#pragma warning disable CA1825\n        public static T[] Value = new T[0];\n#pragma warning restore CA1825\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Utils/HtmlUtils.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Markdown.Avalonia.Html.Core.Utils\n{\n    class HtmlUtils\n    {\n        private static readonly HashSet<string> s_blockTags = new()\n        {\n            \"address\",\n            \"article\",\n            \"aside\",\n            \"base\",\n            \"basefont\",\n            \"blockquote\",\n            \"caption\",\n            \"center\",\n            \"col\",\n            \"colgroup\",\n            \"dd\",\n            \"details\",\n            \"dialog\",\n            \"dir\",\n            \"div\",\n            \"dl\",\n            \"dt\",\n            \"fieldset\",\n            \"figcaption\",\n            \"figure\",\n            \"footer\",\n            \"form\",\n            \"frame\",\n            \"frameset\",\n            \"h1\",\n            \"h2\",\n            \"h3\",\n            \"h4\",\n            \"h5\",\n            \"h6\",\n            \"head\",\n            \"header\",\n            \"hr\",\n            \"html\",\n            \"iframe\",\n            \"legend\",\n            \"li\",\n            \"link\",\n            \"main\",\n            \"menu\",\n            \"menuitem\",\n            \"nav\",\n            \"noframes\",\n            \"ol\",\n            \"optgroup\",\n            \"option\",\n            \"p\",\n            \"param\",\n            \"pre\",\n            \"script\",\n            \"section\",\n            \"source\",\n            \"style\",\n            \"summary\",\n            \"table\",\n            \"textarea\",\n            \"tbody\",\n            \"td\",\n            \"tfoot\",\n            \"th\",\n            \"thead\",\n            \"title\",\n            \"tr\",\n            \"track\",\n            \"ul\",\n        };\n\n        public static bool IsBlockTag(string tagName) => s_blockTags.Contains(tagName.ToLower());\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Utils/Length.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Text;\nusing System.Text.RegularExpressions;\n\nnamespace Markdown.Avalonia.Html.Core.Utils\n{\n    internal class Length\n    {\n        public double Value { get; }\n        public Unit Unit { get; }\n\n        public Length(double value, Unit unit)\n        {\n            Value = value;\n            Unit = unit;\n        }\n\n        public double ToPoint()\n        {\n            return Unit switch\n            {\n                Unit.Percentage => throw new InvalidOperationException(\"Percentage canot convert point\"),\n                Unit.em => Value * 11,\n                Unit.ex => Value * 11 / 2,\n                Unit.QuarterMillimeters => Value * 3.77952755905512 / 4,\n                Unit.Millimeters => Value * 3.77952755905512,\n                Unit.Centimeters => Value * 37.7952755905512,\n                Unit.Inches => Value * 96.0,\n                Unit.Points => Value * 1.33333333333333,\n                Unit.Picas => Value * 16,\n                Unit.Pixels => Value,\n\n                _ => throw new NotSupportedException(\"\")\n            };\n        }\n\n        public static bool TryParse(string? text,\n#if NET6_0_OR_GREATER\n            [MaybeNullWhen(false)]\n            out Length rslt)\n#else\n            out Length rslt)\n#endif\n        {\n            if (String.IsNullOrEmpty(text))\n                goto failParse;\n\n            var mch = Regex.Match(text, @\"^([0-9\\.\\+\\-eE]+)(%|em|ex|mm|Q|cm|in|pt|pc|px|)$\");\n\n            if (!mch.Success)\n                goto failParse;\n\n            var numTxt = mch.Groups[1].Value.Trim();\n            var unitTxt = mch.Groups[2].Value;\n\n            if (!double.TryParse(numTxt, out var numVal))\n                goto failParse;\n\n            var unitEnm = unitTxt switch\n            {\n                \"%\" => Unit.Percentage,\n                \"em\" => Unit.em,\n                \"ex\" => Unit.ex,\n                \"mm\" => Unit.Millimeters,\n                \"Q\" => Unit.QuarterMillimeters,\n                \"cm\" => Unit.Centimeters,\n                \"in\" => Unit.Inches,\n                \"pt\" => Unit.Points,\n                \"pc\" => Unit.Picas,\n                \"px\" => Unit.Pixels,\n                \"\" => Unit.Pixels,\n                _ => Unit.Pixels,\n            };\n\n            rslt = new Length(numVal, unitEnm);\n            return true;\n\n        failParse:\n            rslt = null;\n            return false;\n        }\n    }\n\n    internal enum Unit\n    {\n        Percentage,\n        em,\n        ex,\n        QuarterMillimeters,\n        Millimeters,\n        Centimeters,\n        Inches,\n        // pt: 1/72 in\n        Points,\n        // pc: 1/6 in\n        Picas,\n        // px; 1/96 in\n        Pixels\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Utils/NodeCollectionExt.cs",
    "content": "﻿using HtmlAgilityPack;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Linq;\n\nnamespace Markdown.Avalonia.Html.Core.Utils\n{\n    internal static class NodeCollectionExt\n    {\n        public static List<HtmlNode> SkipComment(this HtmlNodeCollection list)\n        {\n            var count = list.Count;\n\n            var store = new List<HtmlNode>(count);\n\n            for (var i = 0; i < count; ++i)\n            {\n                var e = list[i];\n                if (e.IsComment()) continue;\n\n                store.Add(e);\n            }\n\n            return store;\n        }\n\n        public static bool IsElement(this HtmlNode node, string tagName)\n        {\n            return node.NodeType == HtmlNodeType.Element\n                && string.Equals(node.Name, tagName, StringComparison.OrdinalIgnoreCase);\n        }\n        public static bool IsComment(this HtmlNode node) => node is HtmlCommentNode;\n\n        public static List<HtmlNode> CollectTag(this HtmlNodeCollection list)\n        {\n            var count = list.Count;\n\n            var store = new List<HtmlNode>(count);\n\n            for (var i = 0; i < count; ++i)\n            {\n                var e = list[i];\n                if (e.NodeType != HtmlNodeType.Element) continue;\n\n                store.Add(e);\n            }\n\n            return store;\n        }\n\n        public static List<HtmlNode> CollectTag(this HtmlNodeCollection list, string tagName)\n        {\n            var count = list.Count;\n\n            var store = new List<HtmlNode>(count);\n\n            for (var i = 0; i < count; ++i)\n            {\n                var e = list[i];\n                if (e.IsElement(tagName))\n                    store.Add(e);\n            }\n\n            return store;\n        }\n\n        public static List<HtmlNode> CollectTag(this HtmlNodeCollection list, params string[] tagNames)\n        {\n            var count = list.Count;\n\n            var store = new List<HtmlNode>(count);\n\n            for (var i = 0; i < count; ++i)\n            {\n                var e = list[i];\n                if (e.NodeType != HtmlNodeType.Element) continue;\n\n                if (tagNames.Any(tagName => e.IsElement(tagName)))\n                    store.Add(e);\n            }\n\n            return store;\n        }\n\n        public static bool HasOneTag(\n            this HtmlNodeCollection list,\n            string tagName,\n#if NET6_0_OR_GREATER\n            [MaybeNullWhen(false)]\n            out HtmlNode child)\n#else\n            out HtmlNode child)\n#endif\n        {\n            var children = CollectTag(list, tagName);\n\n            if (children.Count == 1)\n            {\n                child = children[0];\n                return true;\n            }\n            else\n            {\n                child = null!;\n                return false;\n            }\n        }\n\n        public static bool TryCastTextNode(this HtmlNodeCollection list, out List<HtmlTextNode> texts)\n        {\n            var count = list.Count;\n\n            texts = new List<HtmlTextNode>(count);\n\n            for (var i = 0; i < count; ++i)\n            {\n                var e = list[i];\n\n                if (e is HtmlTextNode txtNd)\n                {\n                    texts.Add(txtNd);\n                    continue;\n                }\n\n                if (e.IsComment())\n                {\n                    continue;\n                }\n\n                return false;\n            }\n\n            return true;\n        }\n\n        public static Tuple<List<HtmlNode>, List<HtmlNode>> Filter(this IEnumerable<HtmlNode> list, Func<HtmlNode, bool> filterFunc)\n        {\n            var filterIn = new List<HtmlNode>();\n            var filterOut = new List<HtmlNode>();\n\n            foreach (var e in list)\n            {\n                if (filterFunc(e))\n                {\n                    filterIn.Add(e);\n                }\n                else\n                {\n                    filterOut.Add(e);\n                }\n            }\n\n            return Tuple.Create(filterIn, filterOut);\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Core/Utils/StringExt.cs",
    "content": "﻿using System;\nusing System.Net;\n\nnamespace Markdown.Avalonia.Html.Core.Utils\n{\n    internal static class StringExt\n    {\n        public static string[] SplitLine(this string text) => text.Split('\\n');\n\n        internal static bool TryDecode(this string text, ref int start, out string decoded)\n        {\n            //  max length of entity is 33 (&CounterClockwiseContourIntegral;)\n            var hit = text.IndexOf(';', start, Math.Min(text.Length - start, 40));\n\n            if (hit == -1)\n            {\n                decoded = string.Empty;\n                return false;\n            }\n\n            var entity = text.Substring(start, hit - start + 1);\n            decoded = WebUtility.HtmlDecode(entity);\n            start = hit;\n\n            if (decoded == \"<\" && start + 1 < text.Length)\n            {\n                var c = text[start + 1];\n                if ('a' <= c && c <= 'z' && 'A' <= c && c <= 'Z')\n                {\n                    // '<[a-zA-Z]' may be treated as tag\n                    decoded = entity;\n                }\n            }\n\n\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/HtmlBlockParser.cs",
    "content": "﻿using Markdown.Avalonia.Html.Core;\nusing System.Collections.Generic;\nusing System.Text.RegularExpressions;\nusing Markdown.Avalonia.Parsers;\nusing Markdown.Avalonia;\nusing Avalonia.Controls;\nusing Markdown.Avalonia.SyntaxHigh;\nusing Markdown.Avalonia.Plugins;\n\nnamespace Markdown.Avalonia.Html\n{\n    public class HtmlBlockParser : BlockParser\n    {\n        private static readonly Regex s_emptyLine = new Regex(\"\\n{2,}\", RegexOptions.Compiled);\n        private static readonly Regex s_headTagPattern = new(@\"^<[\\t ]*(?'tagname'[a-z][a-z0-9]*)(?'attributes'[ \\t][^>]*|/)?>\",\n            RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled | RegexOptions.IgnoreCase);\n        private static readonly Regex s_tagPattern = new(@\"<(?'close'/?)[\\t ]*(?'tagname'[a-z][a-z0-9]*)(?'attributes'[ \\t][^>]*|/)?>\",\n            RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled | RegexOptions.IgnoreCase);\n\n        private ReplaceManager _replacer;\n\n        public HtmlBlockParser(SyntaxHighlight highlight, SetupInfo info) : base(s_headTagPattern, nameof(HtmlBlockParser))\n        {\n            _replacer = new ReplaceManager(highlight, info);\n        }\n\n        public override IEnumerable<Control> Convert(\n            string text,\n            Match firstMatch,\n            ParseStatus status,\n            IMarkdownEngine engine,\n            out int parseTextBegin, out int parseTextEnd)\n        {\n            parseTextBegin = firstMatch.Index;\n            parseTextEnd = SimpleHtmlUtils.SearchTagRangeContinuous(text, firstMatch);\n\n            _replacer.Engine = engine;\n\n            var textchip = text.Substring(parseTextBegin, parseTextEnd - parseTextBegin);\n\n            return _replacer.Parse(textchip);\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/HtmlInlineParser.cs",
    "content": "﻿using ColorTextBlock.Avalonia;\nusing Markdown.Avalonia.Html.Core;\nusing Markdown.Avalonia;\nusing Markdown.Avalonia.Parsers;\nusing Markdown.Avalonia.Plugins;\nusing Markdown.Avalonia.SyntaxHigh;\nusing System.Collections.Generic;\nusing System.Text.RegularExpressions;\n\nnamespace Markdown.Avalonia.Html\n{\n    public class HtmlInlineParser : InlineParser\n    {\n        private readonly ReplaceManager _replacer;\n\n        public HtmlInlineParser(SyntaxHighlight highlight, SetupInfo info) : this(new ReplaceManager(highlight, info)) { }\n\n        private HtmlInlineParser(ReplaceManager replacer) : base(SimpleHtmlUtils.CreateTagstartPattern(replacer.InlineTags), nameof(HtmlInlineParser))\n        {\n            _replacer = replacer;\n            FirstMatchPattern = SimpleHtmlUtils.CreateTagstartPattern(_replacer.InlineTags);\n        }\n\n        public Regex FirstMatchPattern { get; }\n\n        public override IEnumerable<CInline> Convert(\n            string text,\n            Match firstMatch,\n            IMarkdownEngine engine,\n            out int parseTextBegin, out int parseTextEnd)\n        {\n            parseTextBegin = firstMatch.Index;\n            parseTextEnd = SimpleHtmlUtils.SearchTagRange(text, firstMatch);\n\n            _replacer.Engine = engine;\n\n            return _replacer.ParseInline(text.Substring(parseTextBegin, parseTextEnd - parseTextBegin));\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/HtmlPlugin.cs",
    "content": "﻿using Markdown.Avalonia.Plugins;\nusing Markdown.Avalonia.SyntaxHigh;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Markdown.Avalonia.Html\n{\n    public class HtmlPlugin : IMdAvPluginRequestAnother\n    {\n        private SyntaxHighlight? _syntax;\n\n        public IEnumerable<Type> DependsOn => new[] { typeof(SyntaxHighlight) };\n\n        public void Inject(IEnumerable<IMdAvPlugin> plugin)\n        {\n            _syntax = (SyntaxHighlight)plugin.First();\n        }\n\n        public void Setup(SetupInfo info)\n        {\n            if (_syntax is null)\n                throw new InvalidOperationException(\"SyntaxHighlight requried\");\n\n            var _block = new HtmlBlockParser(_syntax, info);\n            var _inline = new HtmlInlineParser(_syntax, info);\n\n            info.EnableNoteBlock = false;\n            info.RegisterTop(_block);\n            info.Register(_inline);\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Markdown.Avalonia.Html.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <Import Project=\"..\\Markdown.Avalonia.props\" />\n\n  <PropertyGroup>\n    <OutputType>Library</OutputType>\n    <TargetFrameworks>$(PackageTargetFrameworks)</TargetFrameworks>\n    <PackageId>Markdown.Avalonia.Html</PackageId>\n    <Version>$(PackageVersion)</Version>\n    <Authors>whistyun</Authors>\n    <Description>html tag processor for Markdown.Avalonia</Description>     \n    <Copyright>© Simon Baynes 2013; whistyun 2023</Copyright>        \n    <PackageProjectUrl>https://github.com/whistyun/Markdown.Avalonia</PackageProjectUrl>\n    <PackageReadmeFile>Markdown.Avalonia.Html.md</PackageReadmeFile>\n    <PackageLicenseExpression>MIT</PackageLicenseExpression>\n    <Company />\n    <LangVersion>9</LangVersion>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <None Remove=\"Core\\Parsers\\TypicalBlockParser.tsv\" />\n    <None Remove=\"Core\\Parsers\\TypicalInlineParser.tsv\" />\n  </ItemGroup>\n  <ItemGroup>\n    <EmbeddedResource Include=\"Core\\Parsers\\TypicalBlockParser.tsv\" />\n    <EmbeddedResource Include=\"Core\\Parsers\\TypicalInlineParser.tsv\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" Version=\"$(AvaloniaVersion)\" />\n    <PackageReference Include=\"HtmlAgilityPack\" Version=\"1.11.42\" />\n  </ItemGroup>\n  \n  <ItemGroup>\n    <None Include=\"..\\pack_readme\\Markdown.Avalonia.Html.md\" Pack=\"true\" PackagePath=\"\\\" />\n  </ItemGroup>\n  \n  <ItemGroup>\n    <ProjectReference Include=\"..\\ColorTextBlock.Avalonia\\ColorTextBlock.Avalonia.csproj\" />\n    <ProjectReference Include=\"..\\Markdown.Avalonia.SyntaxHigh\\Markdown.Avalonia.SyntaxHigh.csproj\" />\n    <ProjectReference Include=\"..\\Markdown.Avalonia.Tight\\Markdown.Avalonia.Tight.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Markdown.Avalonia.Html/SimpleHtmlUtils.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Text.RegularExpressions;\n\nnamespace Markdown.Avalonia.Html\n{\n    internal static class SimpleHtmlUtils\n    {\n        private static readonly HashSet<string> s_emptyList = new(new[] {\n            \"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"param\", \"source\",\n        });\n\n        private static readonly Regex s_tagPattern = new(@\"<(?'close'/?)[\\t ]*(?'tagname'[a-z][a-z0-9]*)(?'attributes'[ \\t][^>]*|/)?>\",\n            RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled | RegexOptions.IgnoreCase);\n\n        private static readonly Regex s_emptylinePattern = new(@\"\\n{2}\", RegexOptions.Compiled);\n\n        public static Regex CreateTagstartPattern(IEnumerable<string> tags)\n        {\n            var taglist = string.Join(\"|\", tags);\n\n            return new Regex(@$\"<[\\t ]*(?'tagname'{taglist})(?'attributes'[ \\t][^>]*|/)?>\",\n                RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled | RegexOptions.IgnoreCase);\n        }\n\n        public static int SearchTagRange(string text, Match tagStartPatternMatch)\n        {\n            int searchStart = tagStartPatternMatch.Index + tagStartPatternMatch.Length;\n\n            if (tagStartPatternMatch.Value.EndsWith(\"/>\"))\n            {\n                return searchStart;\n            }\n            else\n            {\n                int end = SearchTagEnd(text, searchStart, tagStartPatternMatch.Groups[\"tagname\"].Value);\n                return end == -1 ? text.Length : end;\n            }\n        }\n\n        public static int SearchTagRangeContinuous(string text, Match tagStartPatternMatch)\n        {\n            int idx = SearchTagRange(text, tagStartPatternMatch);\n\n            for (; ; )\n            {\n                if (text.Length - 1 <= idx) return idx;\n\n                var emp = s_emptylinePattern.Match(text, idx);\n                if (!emp.Success) return text.Length - 1;\n\n                var tag = s_tagPattern.Match(text, idx);\n                if (tag.Success && tag.Index < emp.Index)\n                {\n                    idx = SearchTagRange(text, tag);\n                }\n                else return emp.Index;\n            }\n        }\n\n\n        public static int SearchTagEnd(string text, int start, string startTagName)\n        {\n            var tags = new Stack<string>();\n            tags.Push(startTagName);\n\n            for (; ; )\n            {\n                var isEmptyTag = s_emptyList.Contains(tags.Peek());\n\n                var mch = s_tagPattern.Match(text, start);\n\n                if (isEmptyTag && (!mch.Success || mch.Index != start))\n                {\n                    if (tags.Count == 1) return start;\n\n                    tags.Pop();\n                }\n\n                if (!mch.Success) return -1;\n\n                start = mch.Index + mch.Length;\n\n                if (mch.Value.EndsWith(\"/>\"))\n                {\n                    continue;\n                }\n\n                var tagName = mch.Groups[\"tagname\"].Value.ToLower();\n\n                if (!String.IsNullOrEmpty(mch.Groups[\"close\"].Value))\n                {\n                    // pop until same tag name be found.\n\n                    while (tags.Count > 0)\n                    {\n                        var peekTag = tags.Peek();\n\n                        tags.Pop();\n\n                        if (peekTag == tagName) break;\n                    }\n\n                    if (tags.Count == 0)\n                    {\n                        return mch.Index + mch.Length;\n                    }\n                }\n                else\n                {\n                    if (s_emptyList.Contains(tags.Peek()))\n                    {\n                        tags.Pop();\n                    }\n\n                    tags.Push(mch.Groups[\"tagname\"].Value);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Tables/AutoScaleColumnDefinitions.cs",
    "content": "﻿using Avalonia.Controls;\nusing System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Security.Cryptography;\n\nnamespace Markdown.Avalonia.Html.Tables\n{\n    class AutoScaleColumnDefinitions : ColumnDefinitions\n    {\n\n        private readonly int _columnCount;\n        private Grid _grid;\n        private bool _isAutoArrangeTried = false;\n        private readonly ReadOnlyCollection<LengthInfo> _baseLength;\n\n        public AutoScaleColumnDefinitions(IEnumerable<LengthInfo> baseLength, Grid owner)\n        {\n            _baseLength = baseLength.ToList().AsReadOnly();\n            _columnCount = _baseLength.Count;\n            _grid = owner;\n\n            // To determine the required width for each column, use `Auto`\n            foreach (var def in _baseLength)\n            {\n                if (def.Unit == LengthUnit.Pixel)\n                    Add(new ColumnDefinition(def.Value, GridUnitType.Pixel));\n                else if (def.Unit == LengthUnit.Percent)\n                    Add(new ColumnDefinition(1, GridUnitType.Pixel));\n                else\n                    Add(new ColumnDefinition(1, GridUnitType.Auto));\n            }\n\n            _grid.LayoutUpdated += _grid_LayoutUpdated;\n        }\n\n\n        private void _grid_LayoutUpdated(object? sender, EventArgs e)\n        {\n            // If auto scale is disabled, use `1 *` for each column.\n            // This is default value used for grid column width in Markdown.Avalonia.\n\n            var isEnabled = global::Markdown.Avalonia.Controls.AutoScaleColumnDefinitions.GetIsEnabled(_grid);\n            if (!isEnabled)\n            {\n                if (_grid.ColumnDefinitions.All(def => def.Width.IsStar && def.Width.Value == 1d))\n                    return;\n\n                _isAutoArrangeTried = false;\n\n                Clear();\n\n                for (var i = 0; i < _columnCount; ++i)\n                    Add(new ColumnDefinition(1, GridUnitType.Star));\n\n                ReSetGridChildren();\n            }\n            // If column width adjustement is already done, skip the following process.\n            else\n            {\n                if (_isAutoArrangeTried)\n                    return;\n\n                _isAutoArrangeTried = true;\n\n                AdjustColumn();\n            }\n        }\n\n        private void AdjustColumn()\n        {\n            double entireWidth = _grid.Bounds.Width;\n            double entireColumnWidth = entireWidth / _columnCount;\n\n            double[] widths = MeasureColumnWidths();\n\n            int[] scaleIndics = Enumerable.Range(0, _columnCount)\n                                          .Where(i => _baseLength[i].IsPercent)\n                                          .ToArray();\n\n            int[] fixedIndics = Enumerable.Range(0, _columnCount)\n                                          .Where(i => !_baseLength[i].IsPercent)\n                                          .ToArray();\n\n            foreach (var i in scaleIndics)\n                widths[i] = entireWidth / widths.Length / 2;\n\n            double scaleWidth = scaleIndics.Sum(i => widths[i]);\n\n            double wealthy = entireWidth - scaleWidth;\n\n            var minColWid = entireWidth / widths.Length / 2;\n            var allowedColWid = wealthy / fixedIndics.Length;\n\n            // sum of the shortfall width for each columns, excluding extra widths.\n            var required = fixedIndics.Sum(i => Math.Max(widths[i] - allowedColWid, 0));\n\n            if (required < 1d)\n            {\n                // equality arrange\n                Clear();\n\n                for (var i = 0; i < _columnCount; ++i)\n                {\n                    if (_baseLength[i].IsPercent)\n                        Add(new ColumnDefinition(_baseLength[i].Value, GridUnitType.Star));\n                    else\n                        Add(new ColumnDefinition(widths[i], GridUnitType.Pixel));\n                }\n\n                ReSetGridChildren();\n            }\n            else\n            {\n                var units = _baseLength.Select(l => l.Unit).ToArray();\n\n                if (minColWid < allowedColWid)\n                {\n                    CollectWidthFrom(\n                        Enumerable.Range(0, _columnCount).ToArray(),\n                        widths,\n                        units,\n                        minColWid);\n                }\n                else\n                {\n                    CollectWidthFrom(\n                        fixedIndics,\n                        widths,\n                        units,\n                        allowedColWid);\n                }\n\n                // equality arrange\n                Clear();\n\n                for (var i = 0; i < _columnCount; ++i)\n                {\n                    if (units[i] == LengthUnit.Percent)\n                    {\n                        Add(new ColumnDefinition(_baseLength[i].Value, GridUnitType.Star));\n                    }\n                    else\n                    {\n                        Add(new ColumnDefinition(widths[i], GridUnitType.Pixel));\n                    }\n                }\n\n                ReSetGridChildren();\n            }\n        }\n\n        void CollectWidthFrom(int[] indics, double[] widths, LengthUnit[] units, double colWid)\n        {\n            var required = indics.Sum(i => Math.Max(widths[i] - colWid, 0));\n\n            // collect from wealthy columns\n            var wealthy = indics.Sum(i => Math.Max(colWid - widths[i], 0));\n\n            bool isShortabe;\n            double collect = (isShortabe = required > wealthy) ? wealthy : required;\n\n            foreach (var i in indics)\n            {\n                if (widths[i] < colWid)\n                {\n                    widths[i] = colWid - collect * (colWid - widths[i]) / wealthy;\n\n                    if (isShortabe)\n                        units[i] = LengthUnit.Pixel;\n                }\n                else\n                {\n                    widths[i] = colWid + collect * (widths[i] - colWid) / required;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Determines the maximum requred width for each column.\n        /// </summary>\n        private double[] MeasureColumnWidths()\n        {\n            var width = new double[_columnCount];\n\n            foreach (var element in _grid.Children.OfType<Control>())\n            {\n                var colidx = Grid.GetColumn(element);\n                var colspan = Grid.GetColumnSpan(element);\n                if (colspan == 1)\n                {\n                    width[colidx] = Math.Max(width[colidx], element.Bounds.Width);\n                }\n                else\n                {\n                    // If the cell spans multiple columns, check whether there is sufficient width available for each column.\n\n                    var requreWidth = element.Bounds.Width;\n                    var consumedWid = Enumerable.Range(colidx, colspan).Sum(i => width[i]);\n\n                    if (consumedWid >= requreWidth)\n                        continue;\n\n                    // If there is insufficient width, distribute the shortfall for each column.\n\n                    var adding = Math.Ceiling((requreWidth - consumedWid) / colspan);\n\n                    foreach (var i in Enumerable.Range(colidx, colspan))\n                    {\n                        width[i] += adding;\n                    }\n                }\n\n                if (width.All(d => d != 0d)) break;\n            }\n\n            for (var i = 0; i < width.Length; ++i)\n                width[i] = Math.Max(width[i], 1);\n\n            return width;\n        }\n\n        private void ReSetGridChildren()\n        {\n            var backup = _grid.Children.ToArray();\n            _grid.Children.Clear();\n            _grid.Children.AddRange(backup);\n        }\n    }\n\n    readonly struct LengthInfo\n    {\n        public double Value { get; }\n        public LengthUnit Unit { get; }\n        public bool IsPixcel => Unit == LengthUnit.Pixel;\n        public bool IsPercent => Unit == LengthUnit.Percent;\n        public bool IsAutoFit => Unit == LengthUnit.Auto;\n\n        public LengthInfo(double v, LengthUnit u)\n        {\n            Value = v;\n            Unit = u;\n        }\n    }\n\n    enum LengthUnit\n    {\n        Pixel,\n        Percent,\n        Auto\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Tables/Table.cs",
    "content": "﻿using Avalonia.Controls;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Markdown.Avalonia.Html.Tables\n{\n    class Table\n    {\n        public List<LengthInfo> ColumnLengths { get; }\n        public List<List<TableCell>> RowGroups { get; }\n        public int ColCount { get; private set; }\n        public int RowCount { get; private set; }\n\n        public Table()\n        {\n            ColumnLengths = new();\n            RowGroups = new();\n        }\n\n        public void Structure()\n        {\n            var colCntAtDetail = new List<int>();\n            var maxColCntInDetails = Math.Max(1, ColumnLengths.Count);\n\n            // The list of multi-row cells.\n            // Key: Column index where the target cell is located.\n            var multiRowsAtColIdx = new Dictionary<int, MdSpan>();\n\n            for (var rowIdx = 0; rowIdx < RowGroups.Count; ++rowIdx)\n            {\n                List<TableCell> row = RowGroups[rowIdx];\n\n                var colOffset = 0;\n\n                // Setup ColspanIndex of each cells in the current row.\n                for (int colIdx = 0; colIdx < row.Count;)\n                {\n                    int colSpan;\n                    if (multiRowsAtColIdx.TryGetValue(colOffset, out var span))\n                    {\n                        colSpan = span.ColSpan;\n                    }\n                    else\n                    {\n                        var cell = (TableCell)row[colIdx];\n                        cell.ColumnIndex = colOffset;\n\n                        colSpan = cell.ColSpan;\n\n                        if (cell.RowSpan > 1)\n                        {\n                            multiRowsAtColIdx[colOffset] =\n                                new MdSpan(cell.RowSpan, cell.ColSpan);\n                        }\n\n                        ++colIdx;\n                    }\n\n                    colOffset += colSpan;\n                }\n\n                // Increments end of column index by the sum of the remaining multi-row cells.\n                colOffset += multiRowsAtColIdx\n                    .Where(ent => ent.Key >= colOffset)\n                    .Sum(ent => ent.Value.ColSpan);\n\n                // Removes multi-row cells,   複数行にまたがるセルの削除(必要なら)\n                foreach (var spanEntry in multiRowsAtColIdx.ToArray())\n                {\n                    if (--spanEntry.Value.Life == 0)\n                    {\n                        multiRowsAtColIdx.Remove(spanEntry.Key);\n                    }\n                }\n\n                colCntAtDetail.Add(colOffset);\n                maxColCntInDetails = Math.Max(maxColCntInDetails, colOffset);\n            }\n\n            // If multi-row cells remain, insert empty rows.\n            while (multiRowsAtColIdx.Count > 0)\n            {\n                var row = new List<TableCell>();\n                RowGroups.Add(row);\n\n                var colOffset = 0;\n\n                foreach (var spanEntry in multiRowsAtColIdx.OrderBy(tpl => tpl.Key))\n                {\n                    while (colOffset < spanEntry.Key)\n                    {\n                        var cell = new TableCell();\n                        cell.ColumnIndex = colOffset++;\n                        row.Add(cell);\n\n                    }\n\n                    colOffset += spanEntry.Value.ColSpan;\n\n                    if (--spanEntry.Value.Life == 0)\n                    {\n                        multiRowsAtColIdx.Remove(spanEntry.Key);\n                    }\n                }\n\n                colCntAtDetail.Add(colOffset);\n            }\n\n            ColCount = maxColCntInDetails;\n            RowCount = RowGroups.Count;\n\n            // insert coldef for the shortfall\n\n            var hasScaleWidCol = ColumnLengths.Any(c => c.Unit == LengthUnit.Percent);\n\n            while (ColumnLengths.Count < ColCount)\n            {\n                if (hasScaleWidCol)\n                    ColumnLengths.Add(new LengthInfo(1, LengthUnit.Auto));\n                else\n                    ColumnLengths.Add(new LengthInfo(1, LengthUnit.Percent));\n            }\n\n            // insert cell for the shortfall\n\n            for (var rowIdx = 0; rowIdx < RowGroups.Count; ++rowIdx)\n            {\n                for (var retry = colCntAtDetail[rowIdx]; retry < ColCount; ++retry)\n                {\n                    var cell = new TableCell();\n                    cell.ColumnIndex = retry;\n                    RowGroups[rowIdx].Add(cell);\n                }\n            }\n        }\n\n        class MdSpan\n        {\n            public int Life { set; get; }\n            public int ColSpan { set; get; }\n\n            public MdSpan(int l, int c)\n            {\n                Life = l;\n                ColSpan = c;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Html/Tables/TableCell.cs",
    "content": "﻿using System;\nusing System.Text;\nusing Avalonia.Media;\nusing Avalonia.Layout;\nusing System.Collections.Generic;\nusing Avalonia.Controls;\nusing System.Linq;\n\nnamespace Markdown.Avalonia.Html.Tables\n{\n    class TableCell\n    {\n        public int ColumnIndex { set; get; }\n\n        public Border Content { get; set; }\n        public int RowSpan { set; get; }\n        public int ColSpan { set; get; }\n        public TextAlignment? Horizontal { set; get; }\n        public VerticalAlignment? Vertical { set; get; }\n\n        public TableCell()\n        {\n            RowSpan = 1;\n            ColSpan = 1;\n            Horizontal = null;\n            Vertical = null;\n            Content = new();\n        }\n\n        public TableCell(IEnumerable<Control> controls) : this()\n        {\n            var ctrls = controls.ToArray();\n            switch (ctrls.Length)\n            {\n                case 0:\n                    break;\n\n                case 1:\n                    Content.Child = ctrls[0];\n                    break;\n\n                default:\n                    var panel = new StackPanel() { Orientation = Orientation.Vertical };\n                    panel.Children.AddRange(ctrls);\n\n                    Content.Child = panel;\n                    break;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Svg/Markdown.Avalonia.Svg.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <Import Project=\"..\\Markdown.Avalonia.props\" />\n\n  <PropertyGroup>\n    <OutputType>Library</OutputType>\n    <TargetFrameworks>$(PackageTargetFrameworks)</TargetFrameworks>\n    <PackageId>Markdown.Avalonia.Svg</PackageId>\n    <Version>$(PackageVersion)</Version>\n    <Authors>grifsun; whistyun</Authors>\n    <Copyright>Copyright (c) 2023 grifsun, whistyun</Copyright>\n    <PackageProjectUrl>https://github.com/whistyun/Markdown.Avalonia</PackageProjectUrl>\n    <PackageReadmeFile>Markdown.Avalonia.Svg.md</PackageReadmeFile>\n    <PackageLicenseExpression>MIT</PackageLicenseExpression>\n    <Company />\n    <LangVersion>9</LangVersion>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" Version=\"$(AvaloniaVersion)\" />\n    <PackageReference Include=\"Svg.Controls.Avalonia\" Version=\"$(AvaloniaSvgVersion)\" />\n  </ItemGroup>\n  \n  <ItemGroup>\n    <None Include=\"..\\pack_readme\\Markdown.Avalonia.Svg.md\" Pack=\"true\" PackagePath=\"\\\" />\n  </ItemGroup>\n  \n  <ItemGroup>\n    <ProjectReference Include=\"..\\Markdown.Avalonia.Tight\\Markdown.Avalonia.Tight.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Markdown.Avalonia.Svg/Properties/AssemblyInfo.cs",
    "content": "﻿using Avalonia.Metadata;\n\n[assembly: XmlnsDefinition(\"https://github.com/whistyun/Markdown.Avalonia.Svg\", \"Markdown.Avalonia.Svg\")]\n[assembly: XmlnsPrefix(\"https://github.com/whistyun/Markdown.Avalonia.Svg\", \"mdsvg\")]\n"
  },
  {
    "path": "Markdown.Avalonia.Svg/SvgFormat.cs",
    "content": "﻿using Markdown.Avalonia.Plugins;\n\nnamespace Markdown.Avalonia.Svg\n{\n    public class SvgFormat : IMdAvPlugin\n    {\n        public void Setup(SetupInfo info)\n        {\n            info.Register(new SvgImageResolver());\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Svg/SvgImageResolver.cs",
    "content": "﻿using Avalonia.Media;\nusing Avalonia.Svg;\nusing Markdown.Avalonia.Utils;\nusing System;\nusing System.IO;\nusing System.Reflection.Metadata;\nusing System.Threading.Tasks;\nusing System.Xml;\n\nnamespace Markdown.Avalonia.Svg\n{\n    internal class SvgImageResolver : IImageResolver\n    {\n//        private static readonly AvaloniaAssetLoader _svgAssetLoader = new();\n\n        public async Task<IImage?> Load(Stream stream)\n        {\n            var task = Task.Run(() =>\n            {\n                if (IsSvgFile(stream))\n                {\n                    var source = SvgSource.Load(stream);\n                    var picture = source.Picture;\n                    var svgsrc = new SvgSource() { Picture = picture };\n                    return new VectorImage() { Source = svgsrc };\n                }\n\n                return null;\n            });\n\n            return await task;\n        }\n\n        private static bool IsSvgFile(Stream fileStream)\n        {\n            try\n            {\n                int firstChr = fileStream.ReadByte();\n                if (firstChr != ('<' & 0xFF))\n                    return false;\n\n                fileStream.Seek(0, SeekOrigin.Begin);\n                using (var xmlReader = XmlReader.Create(fileStream))\n                {\n                    return xmlReader.MoveToContent() == XmlNodeType.Element &&\n                           \"svg\".Equals(xmlReader.Name, StringComparison.OrdinalIgnoreCase);\n                }\n            }\n            catch\n            {\n                return false;\n            }\n            finally\n            {\n                fileStream.Seek(0, SeekOrigin.Begin);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Svg/VectorImage.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing Avalonia;\nusing Avalonia.Media;\nusing Avalonia.Svg;\nusing ShimSkiaSharp;\n\nnamespace Markdown.Avalonia.Svg\n{\n    /// <summary>\n    /// An <see cref=\"IImage\"/> that uses a <see cref=\"SvgSource\"/> for content.\n    /// </summary>\n    internal class VectorImage : IImage\n    {\n        /// <summary>\n        /// Gets or sets the <see cref=\"SvgSource\"/> content.\n        /// </summary>\n        public SvgSource? Source { get; set; }\n\n        /// <inheritdoc/>\n        public Size Size =>\n            Source?.Picture is { } ? new Size(Source.Picture.CullRect.Width, Source.Picture.CullRect.Height) : default;\n\n        private SKPicture? _previousPicture = null;\n        private AvaloniaPicture? _avaloniaPicture = null;\n\n        /// <inheritdoc/>\n        void IImage.Draw(\n            DrawingContext context,\n            Rect sourceRect,\n            Rect destRect)\n        {\n            var source = Source;\n            if (source?.Picture is null)\n            {\n                _previousPicture = null;\n                _avaloniaPicture?.Dispose();\n                _avaloniaPicture = null;\n                return;\n            }\n\n            if (Size.Width <= 0 || Size.Height <= 0)\n            {\n                return;\n            }\n\n            var bounds = source.Picture.CullRect;\n            var scaleMatrix = Matrix.CreateScale(\n                destRect.Width / sourceRect.Width,\n                destRect.Height / sourceRect.Height);\n            var translateMatrix = Matrix.CreateTranslation(\n                -sourceRect.X + destRect.X - bounds.Left,\n                -sourceRect.Y + destRect.Y - bounds.Top);\n            using (context.PushClip(destRect))\n            using (context.PushTransform(translateMatrix))\n            using (context.PushTransform(scaleMatrix))\n            {\n                try\n                {\n                    if (_avaloniaPicture is null || source.Picture != _previousPicture)\n                    {\n                        _previousPicture = source.Picture;\n                        _avaloniaPicture?.Dispose();\n                        _avaloniaPicture = AvaloniaPicture.Record(source.Picture);\n                    }\n\n                    if (_avaloniaPicture is { })\n                    {\n                        _avaloniaPicture.Draw(context);\n                    }\n                }\n                catch (Exception ex)\n                {\n                    Debug.WriteLine($\"{ex.Message}\");\n                    Debug.WriteLine($\"{ex.StackTrace}\");\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "Markdown.Avalonia.SyntaxHigh/Alias.cs",
    "content": "﻿using System;\n\nnamespace Markdown.Avalonia.SyntaxHigh\n{\n    public class Alias\n    {\n        public string? Name { get; set; }\n\n        private string? _realName;\n        private Uri? _xshd;\n\n\n        public string? RealName\n        {\n            get => _realName;\n            set\n            {\n                _realName = value;\n                Validation(nameof(RealName));\n            }\n        }\n        public Uri? XSHD\n        {\n            get => _xshd;\n            set\n            {\n                _xshd = value;\n                Validation(nameof(XSHD));\n            }\n        }\n\n\n        private void Validation(string name)\n        {\n            if (_realName != null && _xshd != null)\n            {\n                throw new ArgumentException(name);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.SyntaxHigh/CodeBlockElement.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Input;\nusing Avalonia.Layout;\nusing AvaloniaEdit;\nusing ColorDocument.Avalonia;\nusing Markdown.Avalonia.SyntaxHigh.Extensions;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\nusing static System.Runtime.InteropServices.JavaScript.JSType;\n\nnamespace Markdown.Avalonia.SyntaxHigh\n{\n    internal class CodeBlockElement : DocumentElement\n    {\n        private SyntaxHighlightProvider _provider;\n        private string _code;\n        private Lazy<Border> _control;\n\n        public override Control Control => _control.Value;\n\n        public override IEnumerable<DocumentElement> Children => Array.Empty<DocumentElement>();\n\n        public CodeBlockElement(SyntaxHighlightProvider provider, string lang, string code)\n        {\n            _provider = provider;\n            _code = code;\n            _control = new Lazy<Border>(() => Create(lang, code));\n        }\n\n        public override void ConstructSelectedText(StringBuilder stringBuilder)\n        {\n            stringBuilder.Append(_code);\n        }\n\n        public override void Select(Point from, Point to)\n        {\n            Helper?.Register(Control);\n        }\n\n        public override void UnSelect()\n        {\n            Helper?.Unregister(Control);\n        }\n\n        private Border Create(string lang, string code)\n        {\n            var langLabel = new Label() { Content = lang };\n            langLabel.Classes.Add(\"LangInfo\");\n\n            var copyButton = new Button() { Content = new TextBlock() };\n            copyButton.Classes.Add(\"CopyButton\");\n\n            var txtEdit = new TextEditor();\n            txtEdit.Tag = lang;\n            txtEdit.SetValue(SyntaxHighlightWrapperExtension.ProviderProperty, _provider);\n            txtEdit.Text = code;\n            txtEdit.HorizontalAlignment = HorizontalAlignment.Stretch;\n            txtEdit.IsReadOnly = true;\n\n            copyButton.Click += (s, e) =>\n            {\n                var item = new DataTransferItem();\n                item.Set(DataFormat.Text, txtEdit.Text);\n                var data = new DataTransfer();\n                data.Add(item);\n\n                var clipboard = TopLevel.GetTopLevel(txtEdit)?.Clipboard;\n                clipboard?.SetDataAsync(data);\n            };\n\n\n            var cdPd = new CodePad();\n            cdPd.Content = txtEdit;\n            cdPd.ExandableMenu = copyButton;\n            cdPd.AlwaysShowMenu = langLabel;\n\n            var result = new Border();\n            result.Classes.Add(Markdown.CodeBlockClass);\n            result.Child = cdPd;\n\n            return result;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.SyntaxHigh/CodePad.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Input;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Markdown.Avalonia.SyntaxHigh\n{\n    internal class CodePad : Panel\n    {\n        private bool _isMenuVisible;\n        private Control? _content;\n        private Control? _alwaysShowMenu;\n        private Control? _expandableMenu;\n\n        public Control? Content\n        {\n            get => _content; set\n            {\n                if (_content is not null)\n                {\n                    Children.Remove(_content);\n                }\n                _content = value;\n                if (_content is not null)\n                {\n                    Children.Insert(0, _content);\n                }\n            }\n        }\n\n        public Control? ExandableMenu\n        {\n            get => _expandableMenu;\n            set\n            {\n                if (_expandableMenu is not null)\n                {\n                    Children.Remove(_expandableMenu);\n                }\n\n                _expandableMenu = value;\n\n                if (_expandableMenu is not null && _isMenuVisible)\n                {\n                    Children.Add(_expandableMenu);\n                }\n            }\n        }\n\n        public Control? AlwaysShowMenu\n        {\n            get => _alwaysShowMenu;\n            set\n            {\n                if (_alwaysShowMenu is not null)\n                {\n                    Children.Remove(_alwaysShowMenu);\n                }\n\n                _alwaysShowMenu = value;\n\n                if (_alwaysShowMenu is not null)\n                {\n                    Children.Add(_alwaysShowMenu);\n                }\n            }\n        }\n\n        public CodePad()\n        {\n        }\n\n        protected override void OnPointerEntered(PointerEventArgs args)\n        {\n            if (!_isMenuVisible)\n            {\n                _isMenuVisible = true;\n\n                if (_expandableMenu is not null)\n                {\n                    if (!Children.Contains(_expandableMenu))\n                        Children.Add(_expandableMenu);\n                    else\n                    {\n                        _expandableMenu.IsVisible = true;\n                    }\n                }\n            }\n        }\n\n        protected override void OnPointerExited(PointerEventArgs e)\n        {\n\n            if (_isMenuVisible && _expandableMenu is not null)\n            {\n                if (Children.Contains(_expandableMenu))\n                {\n                    _expandableMenu.IsVisible = false;\n                }\n\n                _isMenuVisible = false;\n            }\n        }\n\n        protected override Size MeasureOverride(Size availableSize)\n        {\n            var reqSz = base.MeasureOverride(availableSize);\n\n            double addHeight =\n                _alwaysShowMenu is not null ? _alwaysShowMenu.DesiredSize.Height : 0d;\n\n            double height =\n                _expandableMenu is not null ? _expandableMenu.DesiredSize.Height : 0d;\n\n            return new Size(reqSz.Width, addHeight + Math.Max(reqSz.Height, height));\n\n        }\n\n        protected override Size ArrangeOverride(Size finalSize)\n        {\n            var yoffset = _alwaysShowMenu is not null ? _alwaysShowMenu.DesiredSize.Height : 0d;\n\n            if (_content is not null)\n            {\n                _content.Arrange(new Rect(0, yoffset / 2, finalSize.Width, finalSize.Height));\n            }\n\n            if (_alwaysShowMenu is not null)\n            {\n                var menuSz = _alwaysShowMenu.DesiredSize;\n                _alwaysShowMenu.Arrange(new Rect(finalSize.Width - menuSz.Width, 0, menuSz.Width, menuSz.Height));\n            }\n\n            if (_expandableMenu is not null)\n            {\n                var menuSz = _expandableMenu.DesiredSize;\n                _expandableMenu.Arrange(new Rect(finalSize.Width - menuSz.Width, yoffset, menuSz.Width, menuSz.Height));\n            }\n\n            return finalSize;\n        }\n\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.SyntaxHigh/Extensions/HSV.cs",
    "content": "﻿using Avalonia.Media;\nusing System;\n\nnamespace Markdown.Avalonia.SyntaxHigh.Extensions\n{\n    struct HSV\n    {\n        public int Hue;\n        public byte Saturation;\n        public byte Value;\n\n        public HSV(Color color)\n        {\n            int max = Math.Max(color.R, Math.Max(color.G, color.B));\n            int min = Math.Min(color.R, Math.Min(color.G, color.B));\n            int div = max - min;\n\n            if (div == 0)\n            {\n                Hue = 0;\n                Saturation = 0;\n            }\n            else\n            {\n                Hue =\n                        (min == color.B) ? 60 * (color.G - color.R) / div + 60 :\n                        (min == color.R) ? 60 * (color.B - color.G) / div + 180 :\n                                           60 * (color.R - color.B) / div + 300;\n                Saturation = (byte)div;\n            }\n\n            Value = (byte)max;\n        }\n\n        public Color ToColor()\n        {\n            if (Hue == 0 && Saturation == 0)\n            {\n                return Color.FromRgb(Value, Value, Value);\n            }\n\n            //byte c = Saturation;\n\n            // int HueInt = Hue / 60;\n\n            int x = (int)(Saturation * (1 - Math.Abs((Hue / 60f) % 2 - 1)));\n\n            static Color FromRgb(int r, int g, int b)\n                => Color.FromRgb((byte)r, (byte)g, (byte)b);\n\n\n            return (Hue / 60) switch\n            {\n                1 => FromRgb(Value - Saturation + x, Value, Value - Saturation),\n                2 => FromRgb(Value - Saturation, Value, Value - Saturation + x),\n                3 => FromRgb(Value - Saturation, Value - Saturation + x, Value),\n                4 => FromRgb(Value - Saturation + x, Value - Saturation, Value),\n                5 or 6 => FromRgb(Value, Value - Saturation, Value - Saturation + x),\n                _ => FromRgb(Value, Value - Saturation + x, Value - Saturation),\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.SyntaxHigh/Extensions/HighlightWrapper.cs",
    "content": "﻿using Avalonia.Media;\nusing AvaloniaEdit.Highlighting;\nusing System;\nusing System.Collections.Generic;\n\nnamespace Markdown.Avalonia.SyntaxHigh.Extensions\n{\n    public class HighlightWrapper : IHighlightingDefinition\n    {\n        private readonly IHighlightingDefinition _baseDef;\n        private readonly Color _foreColor;\n        private readonly Dictionary<HighlightingRuleSet, HighlightingRuleSet> _converted;\n        private readonly Dictionary<string, HighlightingRuleSet> _namedRuleSet;\n        private readonly Dictionary<string, HighlightingColor> _namedColors;\n\n        public HighlightWrapper(IHighlightingDefinition baseDef, Color foreColor)\n        {\n            _baseDef = baseDef;\n            _foreColor = foreColor;\n\n            _converted = new Dictionary<HighlightingRuleSet, HighlightingRuleSet>();\n            _namedRuleSet = new Dictionary<string, HighlightingRuleSet>();\n            _namedColors = new Dictionary<string, HighlightingColor>();\n\n            foreach (var color in baseDef.NamedHighlightingColors)\n            {\n                var name = color.Name;\n\n                var newCol = color.Clone();\n                newCol.Foreground = color.Foreground is null ?\n                    null : new MixHighlightingBrush(color.Foreground, foreColor);\n                _namedColors[name] = newCol;\n            }\n\n            MainRuleSet = Wrap(baseDef.MainRuleSet)!;\n        }\n\n        public string Name => \"Re:\" + _baseDef.Name;\n        public HighlightingRuleSet MainRuleSet { get; }\n        public IEnumerable<HighlightingColor> NamedHighlightingColors => _namedColors.Values;\n        public IDictionary<string, string> Properties => _baseDef.Properties;\n\n        public HighlightingColor? GetNamedColor(string name)\n        {\n            return _namedColors.TryGetValue(name, out var color) ? color : null;\n        }\n\n        public HighlightingRuleSet? GetNamedRuleSet(string name)\n        {\n            return _namedRuleSet.TryGetValue(name, out var rset) ? rset : null;\n        }\n\n        private HighlightingRuleSet? Wrap(HighlightingRuleSet ruleSet)\n        {\n            if (ruleSet is null) return null;\n\n            if (!String.IsNullOrEmpty(ruleSet.Name)\n                && _namedRuleSet.TryGetValue(ruleSet.Name, out var cachedRule))\n                return cachedRule;\n\n            if (_converted.TryGetValue(ruleSet, out var cachedRule2))\n                return cachedRule2;\n\n            var copySet = new HighlightingRuleSet() { Name = ruleSet.Name };\n\n            _converted[ruleSet] = copySet;\n            if (!String.IsNullOrEmpty(copySet.Name))\n                _namedRuleSet[copySet.Name] = copySet;\n\n            foreach (var baseSpan in ruleSet.Spans)\n            {\n                if (baseSpan is null) continue;\n\n                var copySpan = new HighlightingSpan()\n                {\n                    StartExpression = baseSpan.StartExpression,\n                    EndExpression = baseSpan.EndExpression,\n                    RuleSet = Wrap(baseSpan.RuleSet),\n                    StartColor = Wrap(baseSpan.StartColor),\n                    SpanColor = Wrap(baseSpan.SpanColor),\n                    EndColor = Wrap(baseSpan.EndColor),\n                    SpanColorIncludesStart = baseSpan.SpanColorIncludesStart,\n                    SpanColorIncludesEnd = baseSpan.SpanColorIncludesEnd,\n                };\n\n                copySet.Spans.Add(copySpan);\n            }\n\n            foreach (var baseRule in ruleSet.Rules)\n            {\n                var copyRule = new HighlightingRule()\n                {\n                    Regex = baseRule.Regex,\n                    Color = Wrap(baseRule.Color)\n                };\n\n                copySet.Rules.Add(copyRule);\n            }\n\n            return copySet;\n        }\n\n        private HighlightingColor? Wrap(HighlightingColor color)\n        {\n            if (color is null) return null;\n\n            if (!String.IsNullOrEmpty(color.Name)\n                && _namedColors.TryGetValue(color.Name, out var cachedColor))\n                return cachedColor;\n\n            var copyColor = color.Clone();\n            copyColor.Foreground = color.Foreground is null ?\n                null : new MixHighlightingBrush(color.Foreground, _foreColor);\n\n            if (!String.IsNullOrEmpty(copyColor.Name))\n                _namedColors[copyColor.Name] = copyColor;\n\n            return copyColor;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.SyntaxHigh/Extensions/MixHighlightingBrush.cs",
    "content": "﻿using Avalonia.Media;\nusing AvaloniaEdit.Highlighting;\nusing AvaloniaEdit.Rendering;\nusing System;\n\nnamespace Markdown.Avalonia.SyntaxHigh.Extensions\n{\n    class MixHighlightingBrush : HighlightingBrush\n    {\n        private readonly HighlightingBrush _baseBrush;\n        private readonly Color _fore;\n\n        public MixHighlightingBrush(HighlightingBrush baseBrush, Color fore)\n        {\n            this._baseBrush = baseBrush;\n            this._fore = fore;\n        }\n\n        public override IBrush GetBrush(ITextRunConstructionContext context)\n        {\n            var originalBrush = _baseBrush.GetBrush(context);\n\n            return (originalBrush is ISolidColorBrush sbrsh) ?\n                 new SolidColorBrush(WrapColor(sbrsh.Color)) :\n                 originalBrush;\n        }\n\n        public override Color? GetColor(ITextRunConstructionContext context)\n        {\n            if (_baseBrush.GetBrush(context) is ISolidColorBrush sbrsh)\n            {\n                return WrapColor(sbrsh.Color);\n            }\n            else\n            {\n                var colorN = this._baseBrush.GetColor(context);\n                return colorN.HasValue ? WrapColor(colorN.Value) : colorN;\n            }\n        }\n\n        private Color WrapColor(Color color)\n        {\n            if (color.A == 0) return color;\n\n            var foreMax = Math.Max(_fore.R, Math.Max(_fore.G, _fore.B));\n            var tgtHsv = new HSV(color);\n\n            int newValue = tgtHsv.Value + foreMax;\n            int newSaturation = tgtHsv.Saturation;\n            if (newValue > 255)\n            {\n                var newSaturation2 = newSaturation - (newValue - 255);\n                newValue = 255;\n\n                var sChRtLm = (color.R >= color.G && color.R >= color.B) ? 0.95f * 0.7f :\n                              (color.G >= color.R && color.G >= color.B) ? 0.95f :\n                                                                           0.95f * 0.5f;\n\n                var sChRt = Math.Max(sChRtLm, newSaturation2 / (float)newSaturation);\n                if (Single.IsInfinity(sChRt)) sChRt = sChRtLm;\n\n                newSaturation = (int)(newSaturation * sChRt);\n            }\n\n            tgtHsv.Value = (byte)newValue;\n            tgtHsv.Saturation = (byte)newSaturation;\n\n            var newColor = tgtHsv.ToColor();\n            return newColor;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.SyntaxHigh/Extensions/SyntaxHighlightWrapperExtension.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Data;\nusing Avalonia.Data.Converters;\nusing Avalonia.Markup.Xaml;\nusing Avalonia.Markup.Xaml.MarkupExtensions;\nusing Avalonia.Media;\nusing AvaloniaEdit;\nusing AvaloniaEdit.Highlighting;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Globalization;\n\nnamespace Markdown.Avalonia.SyntaxHigh.Extensions\n{\n    /// <summary>\n    /// Change syntax color according to the Foreground color.\n    /// </summary>\n    /// <remarks>\n    /// This class change hue and saturation of the syntax color according to Foreground.\n    /// This class assume that Foreground is the complementary color of Background.\n    /// \n    /// You may think It's better to change it according to Bachground,\n    /// But Background may be declared as absolutly transparent.\n    /// </remarks>\n    public class SyntaxHighlightWrapperExtension : MarkupExtension\n    {\n        public static readonly AvaloniaProperty<SyntaxHighlightProvider> ProviderProperty =\n            AvaloniaProperty.Register<TextEditor, SyntaxHighlightProvider>(\"Provider\");\n\n        private string ForegroundName;\n\n        public SyntaxHighlightWrapperExtension(string colorKey)\n        {\n            this.ForegroundName = colorKey;\n        }\n\n        public override object ProvideValue(IServiceProvider serviceProvider)\n        {\n            var dyExt = new DynamicResourceExtension(ForegroundName);\n            var brush = dyExt.ProvideValue(serviceProvider);\n\n            var tag = new Binding(nameof(TextEditor.Tag))\n            {\n                RelativeSource = new RelativeSource(RelativeSourceMode.Self)\n            };\n\n            var provider = new Binding(ProviderProperty.Name)\n            {\n                RelativeSource = new RelativeSource(RelativeSourceMode.Self)\n            };\n\n            return new MultiBinding()\n            {\n                Bindings = new BindingBase[] { brush, provider, tag },\n                Converter = new SyntaxHighlightWrapperConverter()\n            };\n        }\n\n        class SyntaxHighlightWrapperConverter : IMultiValueConverter\n        {\n            public object? Convert(IList<object?> values, Type targetType, object? parameter, CultureInfo culture)\n            {\n                var provider = values[1] as SyntaxHighlightProvider;\n                var codeLang = values[2] as string;\n\n                if (String.IsNullOrEmpty(codeLang))\n                    return null;\n\n                var highlight = provider is null ?\n                    HighlightingManager.Instance.GetDefinitionByExtension(\".\" + codeLang) :\n                    provider.Solve(codeLang!);\n\n                if (highlight is null) return null;\n\n                Color foreColor = values[0] is SolidColorBrush cBrush ?\n                    cBrush.Color :\n                    values[0] is Color cColor ? cColor : Colors.Black;\n\n                try\n                {\n                    return new HighlightWrapper(highlight, foreColor);\n                }\n                catch (Exception e)\n                {\n                    Trace.TraceError(e.ToString());\n                    return highlight;\n                }\n            }\n\n            public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)\n            {\n                throw new NotImplementedException();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.SyntaxHigh/Markdown.Avalonia.SyntaxHigh.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <Import Project=\"..\\Markdown.Avalonia.props\" />\n\n  <PropertyGroup>\n    <OutputType>Library</OutputType>\n    <TargetFrameworks>$(PackageTargetFrameworks)</TargetFrameworks>\n    <PackageId>Markdown.Avalonia.SyntaxHigh</PackageId>\n    <Version>$(PackageVersion)</Version>\n    <Authors>whistyun</Authors>\n    <Copyright>Copyright (c) 2021 whistyun</Copyright>\n    <PackageProjectUrl>https://github.com/whistyun/Markdown.Avalonia</PackageProjectUrl>\n    <PackageReadmeFile>Markdown.Avalonia.SyntaxHigh.md</PackageReadmeFile>\n    <PackageLicenseExpression>MIT</PackageLicenseExpression>\n    <Company />\n    <LangVersion>9</LangVersion>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Include=\"..\\pack_readme\\Markdown.Avalonia.SyntaxHigh.md\" Pack=\"true\" PackagePath=\"\\\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" Version=\"$(AvaloniaVersion)\" />\n    <PackageReference Include=\"Avalonia.AvaloniaEdit\" Version=\"$(AvaloniaEditVersion)\" />\n  </ItemGroup>\n  \n  <ItemGroup>\n    <ProjectReference Include=\"..\\Markdown.Avalonia.Tight\\Markdown.Avalonia.Tight.csproj\" PrivateAssets=\"All\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Compile Update=\"StyleCollections\\AppendixOfDefaultTheme.axaml.cs\">\n      <DependentUpon>AppendixOfDefaultTheme.axaml</DependentUpon>\n    </Compile>\n    <Compile Update=\"StyleCollections\\AppendixOfFluentAvalonia.axaml.cs\">\n      <DependentUpon>AppendixOfFluentAvalonia.axaml</DependentUpon>\n    </Compile>\n    <Compile Update=\"StyleCollections\\AppendixOfFluentTheme.axaml.cs\">\n      <DependentUpon>AppendixOfFluentTheme.axaml</DependentUpon>\n    </Compile>\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Markdown.Avalonia.SyntaxHigh/Properties/AssemblyInfo.cs",
    "content": "﻿using Avalonia.Metadata;\n\n[assembly: XmlnsDefinition(\"https://github.com/whistyun/Markdown.Avalonia.SyntaxHigh\", \"Markdown.Avalonia.SyntaxHigh\")]\n[assembly: XmlnsPrefix(\"https://github.com/whistyun/Markdown.Avalonia.SyntaxHigh\", \"mdsyntax\")]\n\n[assembly: XmlnsDefinition(\"https://github.com/whistyun/Markdown.Avalonia.SyntaxHigh/Styles\", \"Markdown.Avalonia.SyntaxHigh.StyleCollections\")]\n[assembly: XmlnsPrefix(\"https://github.com/whistyun/Markdown.Avalonia.SyntaxHigh/Styles\", \"mdsyntaxstyles\")]\n"
  },
  {
    "path": "Markdown.Avalonia.SyntaxHigh/StyleCollections/AppendixOfDefaultTheme.axaml",
    "content": "<Styles\n      xmlns=\"https://github.com/avaloniaui\"\n      xmlns:mde=\"clr-namespace:Markdown.Avalonia.SyntaxHigh.Extensions;assembly=Markdown.Avalonia.SyntaxHigh\"\n      xmlns:mdte=\"clr-namespace:Markdown.Avalonia.Extensions;assembly=Markdown.Avalonia\"\n      xmlns:avedit=\"https://github.com/avaloniaui/avaloniaedit\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n      x:Class=\"Markdown.Avalonia.SyntaxHigh.StyleCollections.AppendixOfDefaultTheme\"\n      >\n  <Style Selector=\".CodeBlock avedit|TextEditor\">\n    <Setter Property=\"SyntaxHighlighting\" Value=\"{mde:SyntaxHighlightWrapper ThemeForegroundColor}\"/>\n    <Setter Property=\"FontFamily\" Value=\"menlo,monaco,consolas,droid sans mono,inconsolata,courier new,monospace,dejavu sans mono\"/>\n    <Setter Property=\"VerticalScrollBarVisibility\" Value=\"Disabled\"/>\n  </Style>\n\n  <Style Selector=\".CodeBlock Label.LangInfo\">\n    <Setter Property=\"Padding\" Value=\"8, 0\"/>\n    <Setter Property=\"Background\" Value=\"{mdte:Alpha ThemeForegroundColor, 0.2}\"/>\n    <Setter Property=\"BorderBrush\" Value=\"{mdte:Alpha ThemeForegroundColor, 0.4}\"/>\n    <Setter Property=\"BorderThickness\" Value=\"1\"/>\n    <Setter Property=\"CornerRadius\" Value=\"2\"/>\n  </Style>\n\n  <Style Selector=\".CodeBlock Button.CopyButton TextBlock\">\n    <Setter Property=\"Text\" Value=\"Copy\"/>\n  </Style>\n</Styles>\n"
  },
  {
    "path": "Markdown.Avalonia.SyntaxHigh/StyleCollections/AppendixOfDefaultTheme.axaml.cs",
    "content": "﻿using Avalonia.Markup.Xaml;\nusing Avalonia.Styling;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Markdown.Avalonia.SyntaxHigh.StyleCollections\n{\n    public class AppendixOfDefaultTheme : Styles\n    {\n        public AppendixOfDefaultTheme()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.SyntaxHigh/StyleCollections/AppendixOfFluentAvalonia.axaml",
    "content": "<Styles\n      xmlns=\"https://github.com/avaloniaui\"\n      xmlns:mde=\"clr-namespace:Markdown.Avalonia.SyntaxHigh.Extensions;assembly=Markdown.Avalonia.SyntaxHigh\"\n      xmlns:mdte=\"clr-namespace:Markdown.Avalonia.Extensions;assembly=Markdown.Avalonia\"\n      xmlns:avedit=\"https://github.com/avaloniaui/avaloniaedit\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n      x:Class=\"Markdown.Avalonia.SyntaxHigh.StyleCollections.AppendixOfFluentAvalonia\"\n      >\n  <Style Selector=\".CodeBlock avedit|TextEditor\">\n    <Setter Property=\"SyntaxHighlighting\" Value=\"{mde:SyntaxHighlightWrapper TextFillColorPrimaryBrush}\"/>\n    <Setter Property=\"FontFamily\" Value=\"menlo,monaco,consolas,droid sans mono,inconsolata,courier new,monospace,dejavu sans mono\"/>\n    <Setter Property=\"VerticalScrollBarVisibility\" Value=\"Disabled\"/>\n  </Style>\n\n  <Style Selector=\".CodeBlock Label.LangInfo\">\n    <Setter Property=\"Padding\" Value=\"8, 0\"/>\n    <Setter Property=\"Background\" Value=\"{mdte:Alpha TextFillColorPrimaryBrush, 0.2}\"/>\n    <Setter Property=\"BorderBrush\" Value=\"{mdte:Alpha TextFillColorPrimaryBrush, 0.4}\"/>\n    <Setter Property=\"BorderThickness\" Value=\"1\"/>\n    <Setter Property=\"CornerRadius\" Value=\"2\"/>\n  </Style>\n\n  <Style Selector=\".CodeBlock Button.CopyButton TextBlock\">\n    <Setter Property=\"Text\" Value=\"Copy\"/>\n  </Style>\n</Styles>"
  },
  {
    "path": "Markdown.Avalonia.SyntaxHigh/StyleCollections/AppendixOfFluentAvalonia.axaml.cs",
    "content": "﻿using Avalonia.Markup.Xaml;\nusing Avalonia.Styling;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Markdown.Avalonia.SyntaxHigh.StyleCollections\n{\n    public class AppendixOfFluentAvalonia : Styles\n    {\n        public AppendixOfFluentAvalonia()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.SyntaxHigh/StyleCollections/AppendixOfFluentTheme.axaml",
    "content": "<Styles\n      xmlns=\"https://github.com/avaloniaui\"\n      xmlns:mde=\"clr-namespace:Markdown.Avalonia.SyntaxHigh.Extensions;assembly=Markdown.Avalonia.SyntaxHigh\"\n      xmlns:mdte=\"clr-namespace:Markdown.Avalonia.Extensions;assembly=Markdown.Avalonia\"\n      xmlns:avedit=\"https://github.com/avaloniaui/avaloniaedit\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n      x:Class=\"Markdown.Avalonia.SyntaxHigh.StyleCollections.AppendixOfFluentTheme\"\n      >\n  <Style Selector=\".CodeBlock avedit|TextEditor\">\n    <Setter Property=\"SyntaxHighlighting\" Value=\"{mde:SyntaxHighlightWrapper SystemBaseHighColor}\"/>\n    <Setter Property=\"FontFamily\" Value=\"menlo,monaco,consolas,droid sans mono,inconsolata,courier new,monospace,dejavu sans mono\"/>\n    <Setter Property=\"VerticalScrollBarVisibility\" Value=\"Disabled\"/>\n  </Style>\n\n  <Style Selector=\".CodeBlock Label.LangInfo\">\n    <Setter Property=\"Padding\" Value=\"8, 0\"/>\n    <Setter Property=\"Background\" Value=\"{mdte:Alpha SystemBaseHighColor, 0.2}\"/>\n    <Setter Property=\"BorderBrush\" Value=\"{mdte:Alpha SystemBaseHighColor, 0.4}\"/>\n    <Setter Property=\"BorderThickness\" Value=\"1\"/>\n    <Setter Property=\"CornerRadius\" Value=\"2\"/>\n  </Style>\n\n  <Style Selector=\".CodeBlock Button.CopyButton TextBlock\">\n    <Setter Property=\"Text\" Value=\"Copy\"/>\n  </Style>\n</Styles>"
  },
  {
    "path": "Markdown.Avalonia.SyntaxHigh/StyleCollections/AppendixOfFluentTheme.axaml.cs",
    "content": "﻿using Avalonia.Markup.Xaml;\nusing Avalonia.Styling;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Markdown.Avalonia.SyntaxHigh.StyleCollections\n{\n    public class AppendixOfFluentTheme : Styles\n    {\n        public AppendixOfFluentTheme()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.SyntaxHigh/StyleEdit.cs",
    "content": "﻿using Markdown.Avalonia.Plugins;\nusing Avalonia.Styling;\nusing Markdown.Avalonia.SyntaxHigh.StyleCollections;\n\nnamespace Markdown.Avalonia.SyntaxHigh\n{\n    internal class StyleEdit : IStyleEdit\n    {\n        public void Edit(string styleName, Styles styles)\n        {\n            switch (styleName)\n            {\n                case nameof(MarkdownStyle.SimpleTheme):\n                    styles.AddRange(new AppendixOfDefaultTheme());\n                    break;\n\n                case nameof(MarkdownStyle.FluentTheme):\n                    styles.AddRange(new AppendixOfFluentTheme());\n                    break;\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "Markdown.Avalonia.SyntaxHigh/SyntaxHighlightProvider.cs",
    "content": "﻿using Avalonia.Platform;\nusing Avalonia;\nusing AvaloniaEdit.Highlighting.Xshd;\nusing AvaloniaEdit.Highlighting;\nusing System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Collections.Specialized;\nusing System.IO;\nusing System.Text;\nusing System.Xml;\nusing System.Linq;\n\nnamespace Markdown.Avalonia.SyntaxHigh\n{\n    public class SyntaxHighlightProvider\n    {\n        private ObservableCollection<Alias> _aliases;\n\n        private Dictionary<string, string> _nameSolver;\n        private Dictionary<string, IHighlightingDefinition> _definitions;\n\n        public SyntaxHighlightProvider(ObservableCollection<Alias> aliases)\n        {\n            _aliases = aliases;\n            _nameSolver = new Dictionary<string, string>();\n            _definitions = new Dictionary<string, IHighlightingDefinition>();\n\n            _aliases.CollectionChanged += (s, e) => AliasesCollectionChanged(e);\n            AliasesCollectionChanged(null);\n        }\n\n        public IHighlightingDefinition Solve(string lang)\n        {\n            for (var i = 0; i < 10; ++i)\n                if (_nameSolver.TryGetValue(lang.ToLower(), out var realName))\n                    lang = realName;\n                else\n                    break;\n\n            if (_definitions.TryGetValue(lang, out var def))\n                return def;\n\n            return HighlightingManager.Instance.GetDefinitionByExtension(\".\" + lang);\n        }\n\n        private void AliasesCollectionChanged(NotifyCollectionChangedEventArgs? arg)\n        {\n            IEnumerable<Alias> adding;\n\n            if (arg is null || arg.OldItems != null)\n            {\n                _nameSolver.Clear();\n                _definitions.Clear();\n                SetupForBuiltIn();\n\n                adding = _aliases;\n            }\n            else if (arg?.NewItems != null)\n            {\n                adding = arg.NewItems.Cast<Alias>();\n            }\n            else\n                adding = Array.Empty<Alias>();\n\n\n            foreach (var alias in adding)\n            {\n                if (alias.Name is null) continue;\n\n                if (!String.IsNullOrEmpty(alias.RealName))\n                {\n                    _nameSolver[alias.Name] = alias.RealName;\n                }\n                else if (alias.XSHD != null)\n                {\n                    var definition = Load(alias.XSHD);\n\n                    if (definition is null)\n                        throw new ArgumentException($\"Failed loading: {alias.XSHD}\");\n\n                    _definitions[alias.Name] = definition;\n                }\n            }\n        }\n\n        private void SetupForBuiltIn()\n        {\n            // https://github.com/AvaloniaUI/AvaloniaEdit/blob/master/src/AvaloniaEdit/Highlighting/Resources/Resources.cs\n\n            _nameSolver[\"c#\"] = \"cs\";\n            _nameSolver[\"csharp\"] = \"cs\";\n            _nameSolver[\"javascript\"] = \"js\";\n            _nameSolver[\"coco\"] = \"atg\";\n            _nameSolver[\"c++\"] = \"c\";\n            _nameSolver[\"powershell\"] = \"ps1\";\n            _nameSolver[\"python\"] = \"py\";\n            _nameSolver[\"markdown\"] = \"md\";\n        }\n\n        private IHighlightingDefinition? Load(Uri source)\n        {\n            switch (source.Scheme)\n            {\n                case \"file\":\n                    return File.Exists(source.LocalPath) ?\n                        Open(File.OpenRead(source.LocalPath)) :\n                        null;\n\n                case \"avares\":\n                    return AssetLoader.Exists(source) ?\n                        Open(AssetLoader.Open(source)) :\n                        null;\n\n                default:\n                    throw new ArgumentException($\"unsupport scheme '{source.Scheme}'\");\n            }\n\n            IHighlightingDefinition Open(Stream stream)\n            {\n                try\n                {\n                    using (var reader = XmlReader.Create(stream))\n                        return HighlightingLoader.Load(reader, HighlightingManager.Instance);\n                }\n                finally\n                {\n                    stream.Close();\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.SyntaxHigh/SyntaxHiglight.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Controls.Primitives;\nusing Avalonia.Layout;\nusing Avalonia.Markup.Xaml.Styling;\nusing Avalonia.Media;\nusing Avalonia.Metadata;\nusing AvaloniaEdit.Highlighting;\nusing AvaloniaEdit;\nusing Markdown.Avalonia.Plugins;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing Avalonia;\nusing Avalonia.Styling;\nusing Markdown.Avalonia.SyntaxHigh.StyleCollections;\nusing Avalonia.Collections;\nusing System.Collections.ObjectModel;\n\nnamespace Markdown.Avalonia.SyntaxHigh\n{\n    public class SyntaxHighlight : IMdAvPlugin\n    {\n        [Content]\n        public ObservableCollection<Alias> Aliases { get; } = new ObservableCollection<Alias>();\n\n        public void Setup(SetupInfo info)\n        {\n            info.Register(new SyntaxOverride(Aliases, info));\n            info.Register(new StyleEdit());\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.SyntaxHigh/SyntaxOverride.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Controls.Primitives;\nusing Avalonia.Layout;\nusing Avalonia.Markup.Xaml.Styling;\nusing Avalonia.Media;\nusing AvaloniaEdit;\nusing Markdown.Avalonia.Plugins;\nusing System;\nusing System.Collections.Generic;\nusing System.Text.RegularExpressions;\nusing Avalonia;\nusing System.Collections.ObjectModel;\nusing Markdown.Avalonia.SyntaxHigh.Extensions;\nusing Markdown.Avalonia.Parsers;\nusing System.Diagnostics;\nusing ColorDocument.Avalonia;\nusing ColorDocument.Avalonia.DocumentElements;\n\nnamespace Markdown.Avalonia.SyntaxHigh\n{\n    internal class SyntaxOverride : BlockOverride2\n    {\n        private SyntaxHighlightProvider _provider;\n        private SetupInfo _info;\n\n        public SyntaxOverride(ObservableCollection<Alias> aliases, SetupInfo info) : base(\"CodeBlocksWithLangEvaluator\")\n        {\n            _provider = new SyntaxHighlightProvider(aliases);\n            _info = info;\n        }\n\n        public override IEnumerable<DocumentElement>? Convert2(\n            string text,\n            Match match,\n            ParseStatus status,\n            IMarkdownEngine2 engine,\n            out int parseTextBegin, out int parseTextEnd)\n        {\n            var closeTagPattern = new Regex($\"\\n[ ]*{match.Groups[1].Value}[ ]*\\n\");\n            var closeTagMatch = closeTagPattern.Match(text, match.Index + match.Length);\n\n            int codeEndIndex;\n            if (closeTagMatch.Success)\n            {\n                codeEndIndex = closeTagMatch.Index;\n                parseTextEnd = closeTagMatch.Index + closeTagMatch.Length;\n            }\n            else if (_info.EnablePreRenderingCodeBlock)\n            {\n                codeEndIndex = text.Length;\n                parseTextEnd = text.Length;\n            }\n            else\n            {\n                parseTextBegin = parseTextEnd = -1;\n                return null;\n            }\n\n            parseTextBegin = match.Index;\n\n            string code = text.Substring(match.Index + match.Length, codeEndIndex - (match.Index + match.Length));\n            string lang = match.Groups[2].Value;\n\n            return Convert(lang, code);\n        }\n\n        private IEnumerable<DocumentElement> Convert(string lang, string code)\n        {\n            if (String.IsNullOrEmpty(lang))\n            {\n                yield return new PlainCodeBlockElement(code);\n            }\n            else\n            {\n                // check wheither style is set\n                if (!ThemeDetector.IsAvalonEditSetup)\n                {\n                    SetupStyle();\n                }\n\n                yield return new CodeBlockElement(_provider, lang, code);\n            }\n        }\n\n        private static void SetupStyle()\n        {\n            if (Application.Current is null)\n                return;\n\n            string resourceUriTxt;\n            if (ThemeDetector.IsFluentUsed)\n                resourceUriTxt = \"avares://AvaloniaEdit/Themes/Fluent/AvaloniaEdit.xaml\";\n            else if (ThemeDetector.IsSimpleUsed)\n                resourceUriTxt = \"avares://AvaloniaEdit/Themes/Simple/AvaloniaEdit.xaml\";\n            else\n            {\n                Debug.Print(\"Markdown.Avalonia.SyntaxHigh can't add style for AvaloniaEdit. See https://github.com/whistyun/Markdown.Avalonia/wiki/Setup-AvaloniaEdit-for-syntax-hightlighting\");\n                return;\n            }\n\n            var aeStyle = new StyleInclude(new Uri(\"avares://Markdown.Avalonia/\"))\n            {\n                Source = new Uri(resourceUriTxt)\n            };\n\n            Application.Current.Styles.Add(aeStyle);\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.SyntaxHigh/ThemeDetector.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Markup.Xaml.Styling;\nusing Avalonia.Styling;\n\nnamespace Markdown.Avalonia.SyntaxHigh\n{\n    static class ThemeDetector\n    {\n        private static readonly string s_SimpleThemeFQCN = \"Avalonia.Themes.Simple.SimpleTheme\";\n        private static readonly string s_FluentThemeFQCN = \"Avalonia.Themes.Fluent.FluentTheme\";\n\n        private static readonly string s_SimpleThemeHost = \"Avalonia.Themes.Simple\";\n        private static readonly string s_FluentThemeHost = \"Avalonia.Themes.Fluent\";\n\n        private static bool _isAvalonEditSetup;\n        private static bool? s_isSimpleUsed;\n        private static bool? s_isFluentUsed;\n\n        private static bool CheckStyleSourceHost(IStyle style, string hostName)\n        {\n            if (style is StyleInclude incld)\n            {\n                var uri = incld.Source;\n\n                if (uri is null) return false;\n                if (!uri.IsAbsoluteUri) return false;\n\n                try { return uri.Host == hostName; }\n                catch { return false; }\n            }\n            else return false;\n        }\n\n        private static bool? CheckApplicationCurrentStyle(string themeFQCN, string avaresHost)\n        {\n            if (Application.Current is null\n                    || Application.Current.Styles is null)\n                return null;\n\n            foreach (var style in Application.Current.Styles)\n            {\n                if (style.GetType().FullName == themeFQCN)\n                {\n                    return true;\n                }\n                if (style is StyleInclude incld)\n                {\n                    var uri = incld.Source;\n\n                    if (uri is null) return false;\n                    if (!uri.IsAbsoluteUri) return false;\n\n                    try { return uri.Host == avaresHost; }\n                    catch { return false; }\n                }\n                else return false;\n            }\n\n            return false;\n        }\n\n        public static bool IsAvalonEditSetup\n        {\n            get\n            {\n                if (_isAvalonEditSetup)\n                    return true;\n\n                if (Application.Current is null\n                        || Application.Current.Styles is null)\n                    return false;\n\n                foreach (var style in Application.Current.Styles)\n                {\n                    if (CheckStyleSourceHost(style, \"AvaloniaEdit\"))\n                    {\n                        return _isAvalonEditSetup = true;\n                    }\n                }\n\n                return _isAvalonEditSetup = false;\n            }\n        }\n\n        public static bool IsFluentUsed\n        {\n            get\n            {\n                if (s_isFluentUsed.HasValue)\n                    return s_isFluentUsed.Value;\n\n                return Nvl(s_isFluentUsed = CheckApplicationCurrentStyle(s_FluentThemeFQCN, s_FluentThemeHost));\n            }\n        }\n\n        public static bool IsSimpleUsed\n        {\n            get\n            {\n                if (s_isSimpleUsed.HasValue)\n                    return s_isSimpleUsed.Value;\n\n                return Nvl(s_isSimpleUsed = CheckApplicationCurrentStyle(s_SimpleThemeFQCN, s_SimpleThemeHost));\n            }\n        }\n\n        private static bool Nvl(bool? val) => val.HasValue && val.Value;\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/CascadeDictionary.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing System;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Security.Cryptography;\n\nnamespace Markdown.Avalonia\n{\n    public class CascadeDictionary\n    {\n        public IResourceDictionary Owner { get; set; } = new ResourceDictionary();\n\n        public WeakReference<StyledElement>? Parent { get; set; }\n\n        public void SetParent(StyledElement element)\n        {\n            Parent = new WeakReference<StyledElement>(element);\n        }\n\n#if NET6_0_OR_GREATER\n        public bool TryGet(object key, [MaybeNullWhen(false)] out object? val)\n#else\n        public bool TryGet(object key, out object val)\n#endif\n        {\n            if (Owner.TryGetResource(key, null, out var ownerRsc))\n            {\n                val = ownerRsc!;\n                return true;\n            }\n\n            StyledElement? node;\n\n            if (Parent is null || !Parent.TryGetTarget(out node))\n            {\n                val = null!;\n                return false;\n            }\n\n            while (node is object)\n            {\n                if (node.TryGetResource(key, out var rsc))\n                {\n                    val = rsc!;\n                    return true;\n                }\n\n                node = node.Parent;\n            }\n\n            val = null!;\n            return false;\n        }\n    }\n}"
  },
  {
    "path": "Markdown.Avalonia.Tight/ChatAISetup.cs",
    "content": "﻿using Markdown.Avalonia.Plugins;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Markdown.Avalonia\n{\n    public class ChatAISetup : IMdAvPlugin\n    {\n        public void Setup(SetupInfo info)\n        {\n            info.EnableNoteBlock = false;\n            info.EnableRuleExt = false;\n            info.EnableTextAlignment = false;\n            info.EnableListMarkerExt = false;\n            info.EnableContainerBlockExt = false;\n            info.EnableTextileInline = false;\n\n            info.EnablePreRenderingCodeBlock = true;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/ContainerSwitcher.cs",
    "content": "﻿using Avalonia.Collections;\nusing Avalonia.Controls;\nusing Avalonia.Metadata;\nusing Markdown.Avalonia.Utils;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Text.RegularExpressions;\n\nnamespace Markdown.Avalonia\n{\n    public class ContainerSwitch : AvaloniaDictionary<string, IContainerBlockHandler>, IContainerBlockHandler\n    {\n        public Border? ProvideControl(string assetPathRoot, string blockName, string lines)\n        {\n            // blockName may be \"name [title] (url) {option}\".\n            // This collect some character until \"[\", \"(\" or \"{\".\n            var trimedBlockName = blockName.Trim();\n            var match = Regex.Match(trimedBlockName, @\"[\\(\\[\\{]\");\n            if (match.Success)\n            {\n                trimedBlockName = trimedBlockName.Substring(0, match.Index).Trim();\n            }\n\n            if (this.TryGetValue(trimedBlockName, out var processor))\n            {\n                return processor.ProvideControl(assetPathRoot, blockName, lines);\n            }\n            else return null;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Controls/AutoScaleColumnDefinitions.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Remote.Protocol.Viewport;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace Markdown.Avalonia.Controls\n{\n    public class AutoScaleColumnDefinitions : ColumnDefinitions\n    {\n        public static readonly AttachedProperty<bool> IsEnabledProperty =\n            AvaloniaProperty.RegisterAttached<AutoScaleColumnDefinitions, Grid, bool>(\"IsEnabled\", false);\n\n        public static bool GetIsEnabled(Control control)\n            => control.GetValue(IsEnabledProperty);\n\n        public static void SetIsEnabled(Control control, bool value)\n            => control.SetValue(IsEnabledProperty, value);\n\n\n        private int _columnCount;\n        private Grid _grid;\n        private bool _isAutoArrangeTried = false;\n\n        public AutoScaleColumnDefinitions(int columnCount, Grid owner)\n        {\n            _columnCount = columnCount;\n            _grid = owner;\n\n            for (var i = 0; i < _columnCount; ++i)\n                Add(new ColumnDefinition(1, GridUnitType.Auto));\n\n            _grid.LayoutUpdated += _grid_LayoutUpdated;\n        }\n\n        private void _grid_LayoutUpdated(object? sender, EventArgs e)\n        {\n            // If auto scale is disabled, use `1 *` for each column.\n            // This is default value used for grid column width in Markdown.Avalonia.\n            if (!GetIsEnabled(_grid))\n            {\n                if (_grid.ColumnDefinitions.All(def => def.Width.IsStar && def.Width.Value == 1d))\n                    return;\n\n                _isAutoArrangeTried = false;\n\n                Clear();\n\n                for (var i = 0; i < _columnCount; ++i)\n                    Add(new ColumnDefinition(1, GridUnitType.Star));\n\n                ReSetGridChildren();\n            }\n\n            // If column width adjustement is already done, skip the following process.\n            if (_isAutoArrangeTried)\n                return;\n\n            _isAutoArrangeTried = true;\n\n\n            /// Determines the maximum requred width for each column.\n\n            var width = new double[_columnCount];\n\n            foreach (var element in _grid.Children.OfType<Control>())\n            {\n                var colidx = Grid.GetColumn(element);\n                var colspan = Grid.GetColumnSpan(element);\n                if (colspan == 1)\n                {\n                    width[colidx] = Math.Max(width[colidx], element.Bounds.Width);\n                }\n                else\n                {\n                    var requreWidth = element.Bounds.Width;\n                    var consumedWid = Enumerable.Range(colidx, colspan).Sum(i => width[i]);\n\n                    if (consumedWid >= requreWidth)\n                        continue;\n\n                    var adding = Math.Ceiling((requreWidth - consumedWid) / colspan);\n\n                    foreach (var i in Enumerable.Range(colidx, colspan))\n                    {\n                        width[i] += adding;\n                    }\n                }\n\n                if (width.All(d => d != 0d)) break;\n            }\n\n            for (var i = 0; i < width.Length; ++i)\n                width[i] = Math.Max(width[i], 1);\n\n            // arrange width at every columns\n\n            var allowedWidth = _grid.Bounds.Width;\n            var allowedColWid = allowedWidth / width.Length;\n\n            Clear();\n\n            var required = width.Sum(w => Math.Max(w - allowedColWid, 0));\n\n            if (required < 1d)\n            {\n                // equality arrange\n                for (var i = 0; i < _columnCount; ++i)\n                    Add(new ColumnDefinition(1, GridUnitType.Star));\n            }\n            else\n            {\n                // collect from wealthy columns\n                var wealthy = width.Sum(w => Math.Max(allowedColWid - w, 0));\n\n                var hold = Enumerable.Repeat(allowedColWid, width.Length).ToArray();\n                var unit = Enumerable.Repeat(GridUnitType.Star, width.Length).ToArray();\n\n                bool isShortabe;\n                double collect = (isShortabe = required > wealthy) ? wealthy : required;\n\n                for (var i = 0; i < width.Length; ++i)\n                {\n                    if (width[i] < allowedColWid)\n                    {\n                        hold[i] -= collect * (allowedColWid - width[i]) / wealthy;\n\n                        if (isShortabe)\n                            unit[i] = GridUnitType.Pixel;\n                    }\n                    else\n                    {\n                        hold[i] += collect * (width[i] - allowedColWid) / required;\n                    }\n                }\n\n                for (var i = 0; i < hold.Length; ++i)\n                    Add(new ColumnDefinition(hold[i], unit[i]));\n            }\n\n            ReSetGridChildren();\n        }\n\n        private void ReSetGridChildren()\n        {\n            var backup = _grid.Children.ToArray();\n            _grid.Children.Clear();\n            _grid.Children.AddRange(backup);\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Controls/Rule.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Media;\nusing System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.IO;\nusing System.Text;\nusing HAlign = Avalonia.Layout.HorizontalAlignment;\nusing VAlign = Avalonia.Layout.VerticalAlignment;\n\nnamespace Markdown.Avalonia.Controls\n{\n    public class Rule : UserControl\n    {\n        const double _SingleLineWidth = 1;\n        const double _BoldLineWidth = 2;\n        const double _LineMargin = 1;\n\n        public static readonly StyledProperty<double> SingleLineWidthProperty =\n            AvaloniaProperty.Register<Rule, double>(nameof(SingleLineWidth), defaultValue: _SingleLineWidth);\n\n        public static readonly StyledProperty<double> BoldLineWidthProperty =\n            AvaloniaProperty.Register<Rule, double>(nameof(SingleLineWidth), defaultValue: _BoldLineWidth);\n\n        public static readonly StyledProperty<double> LineMarginProperty =\n            AvaloniaProperty.Register<Rule, double>(nameof(LineMargin), defaultValue: _LineMargin);\n\n        static Rule()\n        {\n            AffectsRender<Rule>(\n                BackgroundProperty,\n                ForegroundProperty);\n\n            AffectsMeasure<Rule>(\n                SingleLineWidthProperty,\n                BoldLineWidthProperty,\n                LineMarginProperty);\n        }\n\n\n        public double SingleLineWidth\n        {\n            get { return GetValue(SingleLineWidthProperty); }\n            set { SetValue(SingleLineWidthProperty, value); }\n        }\n\n        public double BoldLineWidth\n        {\n            get { return GetValue(BoldLineWidthProperty); }\n            set { SetValue(BoldLineWidthProperty, value); }\n        }\n\n        public double LineMargin\n        {\n            get { return GetValue(LineMarginProperty); }\n            set { SetValue(LineMarginProperty, value); }\n        }\n\n\n        public RuleType Type\n        {\n            get; set;\n        }\n\n        public Rule(RuleType ruleType)\n        {\n            this.Type = ruleType;\n            this.HorizontalAlignment = HAlign.Stretch;\n            this.VerticalAlignment = VAlign.Center;\n\n            var cls = Enum.GetName(typeof(RuleType), ruleType);\n            if (cls is null)\n                throw new ArgumentException(nameof(ruleType));\n\n            this.Classes.Add(cls);\n        }\n\n        protected override Size MeasureOverride(Size availableSize)\n        {\n            return Type switch\n            {\n                RuleType.Single\n                    => new Size(10, LineMargin * 2 + SingleLineWidth),\n\n                RuleType.TwoLines\n                    => new Size(10, LineMargin * 2 + SingleLineWidth * 3),\n\n                RuleType.Bold\n                    => new Size(10, LineMargin * 2 + BoldLineWidth),\n\n                RuleType.BoldWithSingle\n                    => new Size(10, LineMargin * 2 + SingleLineWidth * 2 + BoldLineWidth),\n\n                _ => throw new InvalidOperationException(),\n            };\n        }\n\n        public override void Render(DrawingContext context)\n        {\n            var brush = Foreground;\n            var single = new Pen(brush, SingleLineWidth);\n            var bold = new Pen(brush, BoldLineWidth);\n\n            var width = Bounds.Width;\n\n            switch (Type)\n            {\n                case RuleType.Single:\n                    context.DrawLine(\n                        single,\n                        new Point(0d, LineMargin + SingleLineWidth / 2),\n                        new Point(width, LineMargin + SingleLineWidth / 2));\n                    break;\n\n                case RuleType.TwoLines:\n                    context.DrawLine(\n                        single,\n                        new Point(0d, LineMargin + SingleLineWidth / 2),\n                        new Point(width, LineMargin + SingleLineWidth / 2));\n\n                    context.DrawLine(\n                        single,\n                        new Point(0d, LineMargin * 2 + SingleLineWidth * 3 / 2),\n                        new Point(width, LineMargin * 2 + SingleLineWidth * 3 / 2));\n\n                    break;\n\n                case RuleType.Bold:\n                    context.DrawLine(\n                        bold,\n                        new Point(0d, LineMargin + BoldLineWidth / 2),\n                        new Point(width, LineMargin + BoldLineWidth / 2));\n\n                    break;\n\n                case RuleType.BoldWithSingle:\n                    context.DrawLine(\n                        bold,\n                        new Point(0d, LineMargin + BoldLineWidth / 2),\n                        new Point(width, LineMargin + BoldLineWidth / 2));\n\n                    context.DrawLine(\n                        single,\n                        new Point(0d, LineMargin * 2 + BoldLineWidth + SingleLineWidth / 2),\n                        new Point(width, LineMargin * 2 + BoldLineWidth + SingleLineWidth / 2));\n\n                    break;\n\n\n                default:\n                    throw new InvalidOperationException();\n            }\n        }\n\n    }\n\n    public enum RuleType\n    {\n        Single,\n        TwoLines,\n        Bold,\n        BoldWithSingle,\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/CopyMode.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Markdown.Avalonia\n{\n    public enum CopyMode\n    {\n        None,\n        PlainText,\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/EmojiTable.cs",
    "content": "﻿using System;\nusing System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Diagnostics.CodeAnalysis;\nusing System.IO;\nusing System.Reflection;\nusing System.Text;\n\nnamespace Markdown.Avalonia\n{\n    public static class EmojiTable\n    {\n        private static ConcurrentDictionary<String, String> s_keywords;\n\n        static EmojiTable()\n        {\n            s_keywords = LoadTxt();\n        }\n\n\n        /*\n            Workaround for Visual Studio Xaml Designer.\n            When you open MarkdownStyle from Xaml Designer,\n            A null error occurs. Perhaps static constructor is not executed.         \n        */\n        private static ConcurrentDictionary<string, string> LoadTxt()\n        {\n            var resourceName = \"Markdown.Avalonia.EmojiTable.txt\";\n\n            var dic = new ConcurrentDictionary<string, string>();\n\n            Assembly asm = typeof(EmojiTable).Assembly;\n            using var stream = asm.GetManifestResourceStream(resourceName);\n            Debug.Assert(stream is not null);\n\n            using var reader = new StreamReader(stream, true);\n\n            string? line;\n            while ((line = reader.ReadLine()) is not null)\n            {\n                var elms = line.Split('\\t');\n                dic[elms[1]] = elms[0];\n            }\n\n            return dic;\n        }\n\n#if NET6_0_OR_GREATER\n        public static bool TryGet(string keyword, [MaybeNullWhen(false)] out string? emoji)\n#else\n        public static bool TryGet(string keyword, out string emoji)\n#endif\n        {\n            if (s_keywords is null) s_keywords = LoadTxt();\n\n            return s_keywords.TryGetValue(keyword, out emoji);\n        }\n\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/EmojiTable.txt",
    "content": "﻿👎\t-1\n👍\t+1\n💯\t100\n🎱\t8ball\n🅰️\ta\n🆎\tab\n🔤\tabc\n🔡\tabcd\n🉑\taccept\n🚡\taerial_tramway\n✈️\tairplane\n⏰\talarm_clock\n👽\talien\n🚑\tambulance\n⚓\tanchor\n👼\tangel\n💢\tanger\n😠\tangry\n😧\tanguished\n🐜\tant\n🍎\tapple\n♒\taquarius\n♈\taries\n◀️\tarrow_backward\n⏬\tarrow_double_down\n⏫\tarrow_double_up\n⬇️\tarrow_down\n🔽\tarrow_down_small\n▶️\tarrow_forward\n⤵️\tarrow_heading_down\n⤴️\tarrow_heading_up\n⬅️\tarrow_left\n↙️\tarrow_lower_left\n↘️\tarrow_lower_right\n➡️\tarrow_right\n↪️\tarrow_right_hook\n⬆️\tarrow_up\n↕️\tarrow_up_down\n🔼\tarrow_up_small\n↖️\tarrow_upper_left\n↗️\tarrow_upper_right\n🔃\tarrows_clockwise\n🔄\tarrows_counterclockwise\n🎨\tart\n🚛\tarticulated_lorry\n😲\tastonished\n🏧\tatm\n🅱️\tb\n👶\tbaby\n🍼\tbaby_bottle\n🐤\tbaby_chick\n🚼\tbaby_symbol\n🛄\tbaggage_claim\n🎈\tballoon\n☑️\tballot_box_with_check\n🎍\tbamboo\n🍌\tbanana\n‼️\tbangbang\n🏦\tbank\n📊\tbar_chart\n💈\tbarber\n⚾\tbaseball\n🏀\tbasketball\n🛀\tbath\n🛁\tbathtub\n🔋\tbattery\n🐻\tbear\n🍺\tbeer\n🍻\tbeers\n🐞\tbeetle\n🔰\tbeginner\n🔔\tbell\n🍱\tbento\n🚴\tbicyclist\n🚲\tbike\n👙\tbikini\n🐦\tbird\n🎂\tbirthday\n⚫\tblack_circle\n🃏\tblack_joker\n✒️\tblack_nib\n🔲\tblack_square_button\n🌼\tblossom\n🐡\tblowfish\n📘\tblue_book\n🚙\tblue_car\n💙\tblue_heart\n😊\tblush\n🐗\tboar\n⛵\tboat\n💣\tbomb\n📖\tbook\n🔖\tbookmark\n📑\tbookmark_tabs\n📚\tbooks\n💥\tboom\n👢\tboot\n💐\tbouquet\n🙇\tbow\n🎳\tbowling\n👦\tboy\n🍞\tbread\n👰\tbride_with_veil\n🌉\tbridge_at_night\n💼\tbriefcase\n💔\tbroken_heart\n🐛\tbug\n💡\tbulb\n🚅\tbullettrain_front\n🚄\tbullettrain_side\n🚌\tbus\n🚏\tbusstop\n👤\tbust_in_silhouette\n👥\tbusts_in_silhouette\n🌵\tcactus\n🍰\tcake\n📆\tcalendar\n📲\tcalling\n🐫\tcamel\n📷\tcamera\n♋\tcancer\n🍬\tcandy\n🔠\tcapital_abcd\n♑\tcapricorn\n🚗\tcar\n📇\tcard_index\n🎠\tcarousel_horse\n🐱\tcat\n🐈\tcat2\n💿\tcd\n💹\tchart\n📉\tchart_with_downwards_trend\n📈\tchart_with_upwards_trend\n🏁\tcheckered_flag\n🍒\tcherries\n🌸\tcherry_blossom\n🌰\tchestnut\n🐔\tchicken\n🚸\tchildren_crossing\n🍫\tchocolate_bar\n🎄\tchristmas_tree\n⛪\tchurch\n🎦\tcinema\n🎪\tcircus_tent\n🌇\tcity_sunrise\n🌆\tcity_sunset\n🆑\tcl\n👏\tclap\n🎬\tclapper\n📋\tclipboard\n🕐\tclock1\n🕙\tclock10\n🕥\tclock1030\n🕚\tclock11\n🕦\tclock1130\n🕛\tclock12\n🕧\tclock1230\n🕜\tclock130\n🕑\tclock2\n🕝\tclock230\n🕒\tclock3\n🕞\tclock330\n🕓\tclock4\n🕟\tclock430\n🕔\tclock5\n🕠\tclock530\n🕕\tclock6\n🕡\tclock630\n🕖\tclock7\n🕢\tclock730\n🕗\tclock8\n🕣\tclock830\n🕘\tclock9\n🕤\tclock930\n📕\tclosed_book\n🔐\tclosed_lock_with_key\n🌂\tclosed_umbrella\n☁️\tcloud\n♣️\tclubs\n🇨🇳\tcn\n🍸\tcocktail\n☕\tcoffee\n😰\tcold_sweat\n💥\tcollision\n💻\tcomputer\n🎊\tconfetti_ball\n😖\tconfounded\n😕\tconfused\n㊗️\tcongratulations\n🚧\tconstruction\n👷\tconstruction_worker\n🏪\tconvenience_store\n🍪\tcookie\n🆒\tcool\n👮\tcop\n©️\tcopyright\n🌽\tcorn\n👫\tcouple\n💑\tcouple_with_heart\n💏\tcouplekiss\n🐮\tcow\n🐄\tcow2\n💳\tcredit_card\n🐊\tcrocodile\n🎌\tcrossed_flags\n👑\tcrown\n😢\tcry\n😿\tcrying_cat_face\n🔮\tcrystal_ball\n💘\tcupid\n➰\tcurly_loop\n💱\tcurrency_exchange\n🍛\tcurry\n🍮\tcustard\n🛃\tcustoms\n🌀\tcyclone\n💃\tdancer\n👯\tdancers\n🍡\tdango\n🎯\tdart\n💨\tdash\n📅\tdate\n🇩🇪\tde\n🌳\tdeciduous_tree\n🏬\tdepartment_store\n💠\tdiamond_shape_with_a_dot_inside\n♦️\tdiamonds\n😞\tdisappointed\n😥\tdisappointed_relieved\n💫\tdizzy\n😵\tdizzy_face\n🚯\tdo_not_litter\n🐶\tdog\n🐕\tdog2\n💵\tdollar\n🎎\tdolls\n🐬\tdolphin\n🚪\tdoor\n🍩\tdoughnut\n🐉\tdragon\n🐲\tdragon_face\n👗\tdress\n🐪\tdromedary_camel\n💧\tdroplet\n📀\tdvd\n📧\te-mail\n👂\tear\n🌾\tear_of_rice\n🌍\tearth_africa\n🌎\tearth_americas\n🌏\tearth_asia\n🥚\tegg\n🍆\teggplant\n✴️\teight_pointed_black_star\n✳️\teight_spoked_asterisk\n🔌\telectric_plug\n🐘\telephant\n✉️\temail\n🔚\tend\n✉️\tenvelope\n🇪🇸\tes\n💶\teuro\n🏰\teuropean_castle\n🏤\teuropean_post_office\n🌲\tevergreen_tree\n❗\texclamation\n😑\texpressionless\n👓\teyeglasses\n👀\teyes\n👊\tfacepunch\n🏭\tfactory\n🍂\tfallen_leaf\n👪\tfamily\n⏩\tfast_forward\n📠\tfax\n😨\tfearful\n🐾\tfeet\n🎡\tferris_wheel\n📁\tfile_folder\n🔥\tfire\n🚒\tfire_engine\n🎆\tfireworks\n🌓\tfirst_quarter_moon\n🌛\tfirst_quarter_moon_with_face\n🐟\tfish\n🍥\tfish_cake\n🎣\tfishing_pole_and_fish\n✊\tfist\n🎏\tflags\n🔦\tflashlight\n💾\tfloppy_disk\n🎴\tflower_playing_cards\n😳\tflushed\n🌁\tfoggy\n🏈\tfootball\n🍴\tfork_and_knife\n⛲\tfountain\n🍀\tfour_leaf_clover\n🇫🇷\tfr\n🆓\tfree\n🍤\tfried_shrimp\n🍟\tfries\n🐸\tfrog\n😦\tfrowning\n🖕\tfu\n⛽\tfuelpump\n🌕\tfull_moon\n🌝\tfull_moon_with_face\n🎲\tgame_die\n🇬🇧\tgb\n💎\tgem\n♊\tgemini\n👻\tghost\n🎁\tgift\n💝\tgift_heart\n👧\tgirl\n🌐\tglobe_with_meridians\n🐐\tgoat\n⛳\tgolf\n🍇\tgrapes\n🍏\tgreen_apple\n📗\tgreen_book\n💚\tgreen_heart\n❕\tgrey_exclamation\n❔\tgrey_question\n😬\tgrimacing\n😁\tgrin\n😀\tgrinning\n💂‍♂️\tguardsman\n🎸\tguitar\n🔫\tgun\n💇\thaircut\n🍔\thamburger\n🔨\thammer\n🐹\thamster\n✋\thand\n👜\thandbag\n💩\thankey\n🐥\thatched_chick\n🐣\thatching_chick\n🎧\theadphones\n🙉\thear_no_evil\n❤️\theart\n💟\theart_decoration\n😍\theart_eyes\n😻\theart_eyes_cat\n💓\theartbeat\n💗\theartpulse\n♥️\thearts\n✔️\theavy_check_mark\n➗\theavy_division_sign\n💲\theavy_dollar_sign\n❗\theavy_exclamation_mark\n➖\theavy_minus_sign\n✖️\theavy_multiplication_x\n➕\theavy_plus_sign\n🚁\thelicopter\n🌿\therb\n🌺\thibiscus\n🔆\thigh_brightness\n👠\thigh_heel\n🔪\thocho\n🍯\thoney_pot\n🐝\thoneybee\n🐴\thorse\n🏇\thorse_racing\n🏥\thospital\n🏨\thotel\n♨️\thotsprings\n⌛\thourglass\n⏳\thourglass_flowing_sand\n🏠\thouse\n🏡\thouse_with_garden\n😯\thushed\n🍨\tice_cream\n🍦\ticecream\n🆔\tid\n🉐\tideograph_advantage\n👿\timp\n📥\tinbox_tray\n📨\tincoming_envelope\n💁\tinformation_desk_person\nℹ️\tinformation_source\n😇\tinnocent\n⁉️\tinterrobang\n📱\tiphone\n🇮🇹\tit\n🏮\tizakaya_lantern\n🎃\tjack_o_lantern\n🗾\tjapan\n🏯\tjapanese_castle\n👺\tjapanese_goblin\n👹\tjapanese_ogre\n👖\tjeans\n😂\tjoy\n😹\tjoy_cat\n🇯🇵\tjp\n🔑\tkey\n👘\tkimono\n💋\tkiss\n😗\tkissing\n😽\tkissing_cat\n😚\tkissing_closed_eyes\n😘\tkissing_heart\n😙\tkissing_smiling_eyes\n🐨\tkoala\n🈁\tkoko\n🇰🇷\tkr\n🔵\tlarge_blue_circle\n🔷\tlarge_blue_diamond\n🔶\tlarge_orange_diamond\n🌗\tlast_quarter_moon\n🌜\tlast_quarter_moon_with_face\n😆\tlaughing\n🍃\tleaves\n📒\tledger\n🛅\tleft_luggage\n↔️\tleft_right_arrow\n↩️\tleftwards_arrow_with_hook\n🍋\tlemon\n♌\tleo\n🐆\tleopard\n♎\tlibra\n🚈\tlight_rail\n🔗\tlink\n👄\tlips\n💄\tlipstick\n🔒\tlock\n🔏\tlock_with_ink_pen\n🍭\tlollipop\n➿\tloop\n📢\tloudspeaker\n🏩\tlove_hotel\n💌\tlove_letter\n🔅\tlow_brightness\nⓂ️\tm\n🔍\tmag\n🔎\tmag_right\n🀄\tmahjong\n📫\tmailbox\n📪\tmailbox_closed\n📬\tmailbox_with_mail\n📭\tmailbox_with_no_mail\n👨\tman\n👲\tman_with_gua_pi_mao\n👳‍♂️\tman_with_turban\n👞\tmans_shoe\n🍁\tmaple_leaf\n😷\tmask\n💆\tmassage\n🍖\tmeat_on_bone\n📣\tmega\n🍈\tmelon\n📝\tmemo\n🚹\tmens\n🤘\tmetal\n🚇\tmetro\n🎤\tmicrophone\n🔬\tmicroscope\n🌌\tmilky_way\n🚐\tminibus\n💽\tminidisc\n📴\tmobile_phone_off\n💸\tmoney_with_wings\n💰\tmoneybag\n🐒\tmonkey\n🐵\tmonkey_face\n🚝\tmonorail\n🌔\tmoon\n🎓\tmortar_board\n🗻\tmount_fuji\n🚵\tmountain_bicyclist\n🚠\tmountain_cableway\n🚞\tmountain_railway\n🐭\tmouse\n🐁\tmouse2\n🎥\tmovie_camera\n🗿\tmoyai\n💪\tmuscle\n🍄\tmushroom\n🎹\tmusical_keyboard\n🎵\tmusical_note\n🎼\tmusical_score\n🔇\tmute\n💅\tnail_care\n📛\tname_badge\n👔\tnecktie\n❎\tnegative_squared_cross_mark\n😐\tneutral_face\n🆕\tnew\n🌑\tnew_moon\n🌚\tnew_moon_with_face\n📰\tnewspaper\n🆖\tng\n🔕\tno_bell\n🚳\tno_bicycles\n⛔\tno_entry\n🚫\tno_entry_sign\n🙅\tno_good\n📵\tno_mobile_phones\n😶\tno_mouth\n🚷\tno_pedestrians\n🚭\tno_smoking\n🚱\tnon-potable_water\n👃\tnose\n📓\tnotebook\n📔\tnotebook_with_decorative_cover\n🎶\tnotes\n🔩\tnut_and_bolt\n⭕\to\n🅾️\to2\n🌊\tocean\n🐙\toctopus\n🍢\toden\n🏢\toffice\n🆗\tok\n👌\tok_hand\n🙆‍♀️\tok_woman\n👴\tolder_man\n👵\tolder_woman\n🔛\ton\n🚘\toncoming_automobile\n🚍\toncoming_bus\n🚔\toncoming_police_car\n🚖\toncoming_taxi\n📂\topen_file_folder\n👐\topen_hands\n😮\topen_mouth\n⛎\tophiuchus\n📙\torange_book\n📤\toutbox_tray\n🐂\tox\n📄\tpage_facing_up\n📃\tpage_with_curl\n📟\tpager\n🌴\tpalm_tree\n🐼\tpanda_face\n📎\tpaperclip\n🅿️\tparking\n〽️\tpart_alternation_mark\n⛅\tpartly_sunny\n🛂\tpassport_control\n🐾\tpaw_prints\n🍑\tpeach\n🍐\tpear\n📝\tpencil\n✏️\tpencil2\n🐧\tpenguin\n😔\tpensive\n🎭\tperforming_arts\n😣\tpersevere\n☎️\tphone\n🐷\tpig\n🐽\tpig_nose\n🐖\tpig2\n💊\tpill\n🍍\tpineapple\n♓\tpisces\n🍕\tpizza\n👇\tpoint_down\n👈\tpoint_left\n👉\tpoint_right\n☝️\tpoint_up\n👆\tpoint_up_2\n🚓\tpolice_car\n🐩\tpoodle\n💩\tpoop\n🏣\tpost_office\n📯\tpostal_horn\n📮\tpostbox\n🚰\tpotable_water\n👝\tpouch\n🍗\tpoultry_leg\n💷\tpound\n😾\tpouting_cat\n🙏\tpray\n👸\tprincess\n👊\tpunch\n💜\tpurple_heart\n👛\tpurse\n📌\tpushpin\n🚮\tput_litter_in_its_place\n❓\tquestion\n🐰\trabbit\n🐇\trabbit2\n🐎\tracehorse\n📻\tradio\n🔘\tradio_button\n😡\trage\n🚃\trailway_car\n🌈\trainbow\n✋\traised_hand\n🙌\traised_hands\n🙋\traising_hand\n🐏\tram\n🍜\tramen\n🐀\trat\n♻️\trecycle\n🚗\tred_car\n🔴\tred_circle\n®️\tregistered\n☺️\trelaxed\n😌\trelieved\n🔁\trepeat\n🔂\trepeat_one\n🚻\trestroom\n💞\trevolving_hearts\n⏪\trewind\n🎀\tribbon\n🍚\trice\n🍙\trice_ball\n🍘\trice_cracker\n🎑\trice_scene\n💍\tring\n🚀\trocket\n🎢\troller_coaster\n🐓\trooster\n🌹\trose\n🚨\trotating_light\n📍\tround_pushpin\n🚣\trowboat\n🇷🇺\tru\n🏉\trugby_football\n🏃\trunner\n🏃\trunning\n🎽\trunning_shirt_with_sash\n🈂️\tsa\n♐\tsagittarius\n⛵\tsailboat\n🍶\tsake\n👡\tsandal\n🎅\tsanta\n📡\tsatellite\n😆\tsatisfied\n🎷\tsaxophone\n🏫\tschool\n🎒\tschool_satchel\n✂️\tscissors\n♏\tscorpius\n😱\tscream\n🙀\tscream_cat\n📜\tscroll\n💺\tseat\n㊙️\tsecret\n🙈\tsee_no_evil\n🌱\tseedling\n🍧\tshaved_ice\n🐑\tsheep\n🐚\tshell\n🚢\tship\n👕\tshirt\n💩\tshit\n👞\tshoe\n🚿\tshower\n📶\tsignal_strength\n🔯\tsix_pointed_star\n🎿\tski\n💀\tskull\n😴\tsleeping\n😪\tsleepy\n🎰\tslot_machine\n🔹\tsmall_blue_diamond\n🔸\tsmall_orange_diamond\n🔺\tsmall_red_triangle\n🔻\tsmall_red_triangle_down\n😄\tsmile\n😸\tsmile_cat\n😃\tsmiley\n😺\tsmiley_cat\n😈\tsmiling_imp\n😏\tsmirk\n😼\tsmirk_cat\n🚬\tsmoking\n🐌\tsnail\n🐍\tsnake\n🏂\tsnowboarder\n❄️\tsnowflake\n⛄\tsnowman\n😭\tsob\n⚽\tsoccer\n🔜\tsoon\n🆘\tsos\n🔉\tsound\n👾\tspace_invader\n♠️\tspades\n🍝\tspaghetti\n🎇\tsparkler\n✨\tsparkles\n💖\tsparkling_heart\n🙊\tspeak_no_evil\n🔈\tspeaker\n💬\tspeech_balloon\n🚤\tspeedboat\n⭐\tstar\n🌟\tstar2\n🌠\tstars\n🚉\tstation\n🗽\tstatue_of_liberty\n🚂\tsteam_locomotive\n🍲\tstew\n📏\tstraight_ruler\n🍓\tstrawberry\n😛\tstuck_out_tongue\n😝\tstuck_out_tongue_closed_eyes\n😜\tstuck_out_tongue_winking_eye\n🌞\tsun_with_face\n🌻\tsunflower\n😎\tsunglasses\n☀️\tsunny\n🌅\tsunrise\n🌄\tsunrise_over_mountains\n🏄\tsurfer\n🍣\tsushi\n🚟\tsuspension_railway\n😓\tsweat\n💦\tsweat_drops\n😅\tsweat_smile\n🍠\tsweet_potato\n🏊\tswimmer\n🔣\tsymbols\n💉\tsyringe\n🎉\ttada\n🎋\ttanabata_tree\n🍊\ttangerine\n♉\ttaurus\n🚕\ttaxi\n🍵\ttea\n☎️\ttelephone\n📞\ttelephone_receiver\n🔭\ttelescope\n🎾\ttennis\n⛺\ttent\n💭\tthought_balloon\n👎\tthumbsdown\n👍\tthumbsup\n🎫\tticket\n🐯\ttiger\n🐅\ttiger2\n😫\ttired_face\n™️\ttm\n🚽\ttoilet\n🗼\ttokyo_tower\n🍅\ttomato\n👅\ttongue\n🔝\ttop\n🎩\ttophat\n🚜\ttractor\n🚥\ttraffic_light\n🚋\ttrain\n🚆\ttrain2\n🚊\ttram\n🚩\ttriangular_flag_on_post\n📐\ttriangular_ruler\n🔱\ttrident\n😤\ttriumph\n🚎\ttrolleybus\n🏆\ttrophy\n🍹\ttropical_drink\n🐠\ttropical_fish\n🚚\ttruck\n🎺\ttrumpet\n👕\ttshirt\n🌷\ttulip\n🐢\tturtle\n📺\ttv\n🔀\ttwisted_rightwards_arrows\n💕\ttwo_hearts\n👬\ttwo_men_holding_hands\n👭\ttwo_women_holding_hands\n🈹\tu5272\n🈴\tu5408\n🈺\tu55b6\n🈯\tu6307\n🈷️\tu6708\n🈶\tu6709\n🈵\tu6e80\n🈚\tu7121\n🈸\tu7533\n🈲\tu7981\n🈳\tu7a7a\n🇬🇧\tuk\n☔\tumbrella: \n😒\tunamused\n🔞\tunderage\n🔓\tunlock\n🆙\tup\n🇺🇸\tus\n✌️\tv\n🚦\tvertical_traffic_light\n📼\tvhs\n📳\tvibration_mode\n📹\tvideo_camera\n🎮\tvideo_game\n🎻\tviolin\n♍\tvirgo\n🌋\tvolcano\n🆚\tvs\n🚶\twalking\n🌘\twaning_crescent_moon\n🌖\twaning_gibbous_moon\n⚠️\twarning\n⌚\twatch\n🐃\twater_buffalo\n🍉\twatermelon\n👋\twave\n〰️\twavy_dash\n🌒\twaxing_crescent_moon\n🌔\twaxing_gibbous_moon\n🚾\twc\n😩\tweary\n💒\twedding\n🐳\twhale\n🐋\twhale2\n♿\twheelchair\n✅\twhite_check_mark\n⚪\twhite_circle\n💮\twhite_flower\n🔳\twhite_square_button\n🎐\twind_chime\n🍷\twine_glass\n😉\twink\n🐺\twolf\n👩\twoman\n👚\twomans_clothes\n👒\twomans_hat\n🚺\twomens\n😟\tworried\n🔧\twrench\n❌\tx\n💛\tyellow_heart\n💴\tyen\n😋\tyum\n⚡\tzap\n💤\tzzz\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/EngineUpg.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Rendering.Composition.Animations;\nusing ColorDocument.Avalonia;\nusing ColorDocument.Avalonia.DocumentElements;\nusing ColorTextBlock.Avalonia;\nusing Markdown.Avalonia.Parsers;\nusing Markdown.Avalonia.Utils;\nusing System;\nusing System.Collections.Generic;\nusing System.Net.NetworkInformation;\nusing System.Text;\nusing System.Windows.Input;\n\nnamespace Markdown.Avalonia\n{\n    public static class MarkdownEngineExt\n    {\n        public static IMarkdownEngine2 Upgrade(this IMarkdownEngine engine)\n            => engine is IMarkdownEngine2 engine2 ? engine2 : new EngineUpg(engine);\n\n        class EngineUpg : IMarkdownEngine2\n        {\n            private IMarkdownEngine Engine { get; }\n            public string AssetPathRoot { get => Engine.AssetPathRoot; set => Engine.AssetPathRoot = value; }\n            public ICommand? HyperlinkCommand { get => Engine.HyperlinkCommand; set => Engine.HyperlinkCommand = value; }\n            public IBitmapLoader? BitmapLoader { get => Engine.BitmapLoader; set => Engine.BitmapLoader = value; }\n            public IContainerBlockHandler? ContainerBlockHandler { get => Engine.ContainerBlockHandler; set => Engine.ContainerBlockHandler = value; }\n            public MdAvPlugins Plugins { get => Engine.Plugins; set => Engine.Plugins = value; }\n            public bool UseResource { get => Engine.UseResource; set => Engine.UseResource = value; }\n            public CascadeDictionary CascadeResources => Engine.CascadeResources;\n            public IResourceDictionary Resources { get => Engine.Resources; set => Engine.Resources = value; }\n\n            public EngineUpg(IMarkdownEngine engine)\n            {\n                Engine = engine;\n            }\n\n            public Control Transform(string text)\n                => Engine.Transform(text);\n\n            public DocumentElement TransformElement(string text)\n                => new UnBlockElement(Engine.Transform(text));\n\n            public IEnumerable<DocumentElement> ParseGamutElement(string? text, ParseStatus status)\n            {\n                foreach (var ctrl in Engine.RunBlockGamut(text, status))\n                {\n                    yield return new UnBlockElement(ctrl);\n                }\n            }\n\n            public IEnumerable<CInline> ParseGamutInline(string? text)\n                => Engine.RunSpanGamut(text);\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Extensions/AlphaExtension.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Data;\nusing Avalonia.Data.Converters;\nusing Avalonia.Markup.Xaml;\nusing Avalonia.Markup.Xaml.MarkupExtensions;\nusing Avalonia.Media;\nusing Avalonia.Styling;\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text;\n\nnamespace Markdown.Avalonia.Extensions\n{\n    public class AlphaExtension : MarkupExtension\n    {\n        private readonly string _brushName;\n        private readonly float _alpha;\n\n        public AlphaExtension(string colorKey) : this(colorKey, 1f) { }\n\n        public AlphaExtension(string colorKey, float alpha)\n        {\n            this._brushName = colorKey;\n            this._alpha = alpha;\n        }\n\n        public override object ProvideValue(IServiceProvider serviceProvider)\n        {\n            var dyExt = new DynamicResourceExtension(_brushName);\n\n            var brush = dyExt.ProvideValue(serviceProvider);\n\n            return new MultiBinding()\n            {\n                Bindings = new BindingBase[] { brush },\n                Converter = new AlphaConverter(_alpha)\n            };\n        }\n\n        class AlphaConverter : IMultiValueConverter\n        {\n            public float Alpha { get; }\n\n            public AlphaConverter(float alpha)\n            {\n                Alpha = alpha;\n            }\n\n            public object? Convert(IList<object?> values, Type targetType, object? parameter, CultureInfo culture)\n            {\n                Color c;\n                if (values[0] is ISolidColorBrush b)\n                    c = b.Color;\n                else if (values[0] is Color col)\n                    c = col;\n                else\n                    return values[0];\n\n                return new SolidColorBrush(\n                            Color.FromArgb(\n                                (byte)(c.A / 255f * Alpha * 255f),\n                                c.R, c.G, c.B));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Extensions/ComplementaryExtension.cs",
    "content": "﻿using Avalonia.Data;\nusing Avalonia.Data.Converters;\nusing Avalonia.Markup.Xaml;\nusing Avalonia.Markup.Xaml.MarkupExtensions;\nusing Avalonia.Media;\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Text;\n\nnamespace Markdown.Avalonia.Extensions\n{\n    public class ComplementaryExtension : MarkupExtension\n    {\n        private readonly string _brushName;\n\n        public ComplementaryExtension(string colorKey)\n        {\n            this._brushName = colorKey;\n        }\n\n        public override object ProvideValue(IServiceProvider serviceProvider)\n        {\n            var dyExt = new DynamicResourceExtension(_brushName);\n\n            var brush = dyExt.ProvideValue(serviceProvider);\n\n            return new MultiBinding()\n            {\n                Bindings = new BindingBase[] { brush },\n                Converter = new ComplementaryConverter()\n            };\n        }\n\n        class ComplementaryConverter : IMultiValueConverter\n        {\n            public ComplementaryConverter() { }\n\n            public object? Convert(IList<object?> values, Type targetType, object? parameter, CultureInfo culture)\n            {\n                Color c;\n                if (values[0] is ISolidColorBrush b)\n                    c = b.Color;\n                else if (values[0] is Color col)\n                    c = col;\n                else\n                    return values[0];\n\n\n                var rgb = new int[] { c.R, c.G, c.B };\n                var s = rgb.Max() + rgb.Min();\n\n                return new SolidColorBrush(\n                            Color.FromArgb(\n                                c.A,\n                                (byte)(s - c.R),\n                                (byte)(s - c.G),\n                                (byte)(s - c.B)));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Extensions/DivideColorExtension.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Data;\nusing Avalonia.Data.Converters;\nusing Avalonia.Data.Core;\nusing Avalonia.Markup.Xaml;\nusing Avalonia.Markup.Xaml.MarkupExtensions;\nusing Avalonia.Media;\nusing Avalonia.Media.Immutable;\nusing System;\nusing System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Text;\n\nnamespace Markdown.Avalonia.Extensions\n{\n    public class DivideColorExtension : MarkupExtension\n    {\n        private readonly string _frmKey;\n        private readonly string _toKey;\n        private readonly double _relate;\n\n        public DivideColorExtension(string frm, string to, double relate)\n        {\n            this._frmKey = frm;\n            this._toKey = to;\n            this._relate = relate;\n        }\n\n        public override object ProvideValue(IServiceProvider serviceProvider)\n        {\n            BindingBase left;\n            if (Color.TryParse(_frmKey, out var leftColor))\n            {\n                var leftBrush = new ImmutableSolidColorBrush(leftColor);\n                left = CompiledBinding.Create<IBrush, IBrush>(v=>v, leftColor);\n            }\n            else\n            {\n                var lftExt = new DynamicResourceExtension(_frmKey);\n                left = lftExt.ProvideValue(serviceProvider);\n            }\n\n            BindingBase right;\n            if (Color.TryParse(_toKey, out var rightColor))\n            {\n                var rightBrush = new ImmutableSolidColorBrush(rightColor);\n                right = CompiledBinding.Create<IBrush, IBrush>(v=>v, rightColor);\n            }\n            else\n            {\n                var rgtExt = new DynamicResourceExtension(_toKey);\n                right = rgtExt.ProvideValue(serviceProvider);\n            }\n\n            return new MultiBinding()\n            {\n                Bindings = new BindingBase[] { left, right },\n                Converter = new DivideConverter(_relate)\n            };\n        }\n    }\n\n    class DivideConverter : IMultiValueConverter\n    {\n        public double Relate { get; }\n\n        public DivideConverter(double relate)\n        {\n            Relate = relate;\n        }\n\n        public object? Convert(IList<object?> values, Type targetType, object? parameter, CultureInfo culture)\n        {\n            Color colL;\n            if (values[0] is ISolidColorBrush bl)\n                colL = bl.Color;\n            else if (values[0] is Color cl)\n                colL = cl;\n            else\n                return AvaloniaProperty.UnsetValue;\n\n            Color colR;\n            if (values[1] is ISolidColorBrush br)\n                colR = br.Color;\n            else if (values[1] is Color cr)\n                colR = cr;\n            else\n                return new ImmutableSolidColorBrush(colL);\n\n            static byte Calc(byte l, byte r, double d)\n                => (byte)(l * (1 - d) + r * d);\n\n            return new SolidColorBrush(\n                        Color.FromArgb(\n                            Calc(colL.A, colR.A, Relate),\n                            Calc(colL.R, colR.R, Relate),\n                            Calc(colL.G, colR.G, Relate),\n                            Calc(colL.B, colR.B, Relate)));\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Extensions/MultiplyExtension.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Data;\nusing Avalonia.Data.Converters;\nusing Avalonia.Markup.Xaml;\nusing Avalonia.Markup.Xaml.MarkupExtensions;\nusing Avalonia.Media;\nusing Avalonia.Styling;\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text;\n\nnamespace Markdown.Avalonia.Extensions\n{\n    public class MultiplyExtension : MarkupExtension\n    {\n        private readonly string _resourceKey;\n        private readonly double _scale;\n\n        public MultiplyExtension(string resourceKey) : this(resourceKey, 1) { }\n\n        public MultiplyExtension(string resourceKey, double scale)\n        {\n            this._resourceKey = resourceKey;\n            this._scale = scale;\n        }\n\n        public override object ProvideValue(IServiceProvider serviceProvider)\n        {\n            var dyExt = new DynamicResourceExtension(_resourceKey);\n\n            var brush = dyExt.ProvideValue(serviceProvider);\n\n            return new MultiBinding()\n            {\n                Bindings = new BindingBase[] { brush },\n                Converter = new MultiplyConverter(_scale)\n            };\n        }\n\n        class MultiplyConverter : IMultiValueConverter\n        {\n            public double Scale { get; }\n\n            public MultiplyConverter(double scale)\n            {\n                Scale = scale;\n            }\n\n            public object? Convert(IList<object?> values, Type targetType, object? parameter, CultureInfo culture)\n            {\n                return values[0] switch\n                {\n                    short s => (short)(s * Scale),\n                    int i => (int)(i * Scale),\n                    long l => (long)(l * Scale),\n                    float f => (float)(f * Scale),\n                    double d => (double)(d * Scale),\n                    _ => values[0],\n                };\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Header.cs",
    "content": "﻿using System;\n\nnamespace Markdown.Avalonia\n{\n    public class Header : IEquatable<Header>\n    {\n        public int Level { get; }\n        public string Text { get; }\n\n        public Header(int lv, string txt)\n        {\n            Level = lv;\n            Text = txt;\n        }\n\n        public override int GetHashCode()\n            => Level + Text.GetHashCode();\n\n        public override bool Equals(object? obj)\n            => obj is Header arg ? Equals(arg) : false;\n\n        public bool Equals(Header? other)\n            => Level == other.Level && Text == other.Text;\n\n        public static bool operator !=(Header? left, Header? right)\n            => !(left == right);\n\n        public static bool operator ==(Header? left, Header? right)\n            => left is not null ? left.Equals(right) :\n               right is not null ? false :\n               true;\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/HeaderScrolled.cs",
    "content": "﻿namespace Markdown.Avalonia\n{\n    public delegate void HeaderScrolled(object sender, HeaderScrolledEventArgs args);\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/HeaderScrolledEventArgs.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\n\nnamespace Markdown.Avalonia\n{\n    public class HeaderScrolledEventArgs : EventArgs, IEquatable<HeaderScrolledEventArgs>\n    {\n        public IReadOnlyList<Header> Tree { get; }\n        public IReadOnlyList<Header> Viewing { get; }\n\n        public HeaderScrolledEventArgs(IList<Header> tree, IList<Header> viewing)\n        {\n            Tree = new ReadOnlyCollection<Header>(tree);\n            Viewing = new ReadOnlyCollection<Header>(viewing);\n        }\n\n        public override int GetHashCode()\n            => Tree.Sum(e => e.GetHashCode()) + Viewing.Sum(e => e.GetHashCode());\n\n        public override bool Equals(object? obj)\n            => obj is HeaderScrolledEventArgs arg ? Equals(arg) : false;\n\n        public bool Equals(HeaderScrolledEventArgs? other)\n        {\n            if (other is null)\n                return false;\n\n            return Enumerable.SequenceEqual(Tree, other.Tree)\n                && Enumerable.SequenceEqual(Viewing, other.Viewing);\n        }\n\n        public static bool operator !=(HeaderScrolledEventArgs? left, HeaderScrolledEventArgs? right)\n            => !(left == right);\n\n        public static bool operator ==(HeaderScrolledEventArgs? left, HeaderScrolledEventArgs? right)\n            => left is not null ? left.Equals(right) :\n               right is not null ? false :\n               true;\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/IMarkdownEngine.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Rendering.Composition.Animations;\nusing ColorTextBlock.Avalonia;\nusing Markdown.Avalonia.Parsers;\nusing Markdown.Avalonia.Utils;\nusing System;\nusing System.Collections.Generic;\nusing System.Net.NetworkInformation;\nusing System.Text;\nusing System.Windows.Input;\n\nnamespace Markdown.Avalonia\n{\n    public interface IMarkdownEngine : IMarkdownEngineBase\n    {\n        string AssetPathRoot { get; set; }\n\n        ICommand? HyperlinkCommand { get; set; }\n\n        [Obsolete(\"Please use Plugins propety. see https://github.com/whistyun/Markdown.Avalonia/wiki/How-to-migrages-to-ver11\")]\n        IBitmapLoader? BitmapLoader { get; set; }\n\n        IContainerBlockHandler? ContainerBlockHandler { get; set; }\n\n        MdAvPlugins Plugins { get; set; }\n\n        bool UseResource { get; set; }\n        CascadeDictionary CascadeResources { get; }\n        public IResourceDictionary Resources { get; set; }\n\n        Control Transform(string text);\n\n        /// <summary>\n        /// Perform transformations that form block-level tags like paragraphs, headers, and list items.\n        /// </summary>\n        IEnumerable<Control> RunBlockGamut(string? text, ParseStatus status);\n\n        /// <summary>\n        /// Perform transformations that occur *within* block-level tags like paragraphs, headers, and list items.\n        /// </summary>\n        IEnumerable<CInline> RunSpanGamut(string? text);\n    }\n}"
  },
  {
    "path": "Markdown.Avalonia.Tight/IMarkdownEngine2.cs",
    "content": "﻿using Avalonia.Controls;\nusing ColorDocument.Avalonia;\nusing ColorTextBlock.Avalonia;\nusing Markdown.Avalonia.Parsers;\nusing Markdown.Avalonia.Utils;\nusing System;\nusing System.Collections.Generic;\nusing System.Windows.Input;\n\nnamespace Markdown.Avalonia\n{\n    public interface IMarkdownEngine2 : IMarkdownEngineBase\n    {\n        string AssetPathRoot { get; set; }\n\n        ICommand? HyperlinkCommand { get; set; }\n\n        IContainerBlockHandler? ContainerBlockHandler { get; set; }\n\n        MdAvPlugins Plugins { get; set; }\n\n        bool UseResource { get; set; }\n        CascadeDictionary CascadeResources { get; }\n        public IResourceDictionary Resources { get; set; }\n\n        Control Transform(string text);\n\n        DocumentElement TransformElement(string text);\n\n        IEnumerable<DocumentElement> ParseGamutElement(string? text, ParseStatus status);\n\n        IEnumerable<CInline> ParseGamutInline(string? text);\n    }\n}"
  },
  {
    "path": "Markdown.Avalonia.Tight/IMarkdownEngineBase.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Markdown.Avalonia\n{\n    public interface IMarkdownEngineBase\n    {\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Markdown.Avalonia.Tight.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <Import Project=\"..\\Markdown.Avalonia.props\" />\n\n  <PropertyGroup>\n    <OutputType>Library</OutputType>\n    <TargetFrameworks>$(PackageTargetFrameworks)</TargetFrameworks>\n    <PackageId>Markdown.Avalonia.Tight</PackageId>\n    <AssemblyName>Markdown.Avalonia</AssemblyName>\n    <RootNamespace>Markdown.Avalonia</RootNamespace>\n    <Version>$(PackageVersion)</Version>\n    <Authors>Bevan Arps(original); whistyun</Authors>\n    <Company />\n    <Description>Markdown Controls for Avalonia</Description>\n    <Copyright>Copyright (c) 2010 Bevan Arps, 2020 whistyun</Copyright>\n    <PackageProjectUrl>https://github.com/whistyun/Markdown.Avalonia</PackageProjectUrl>\n    <PackageLicenseExpression>MIT</PackageLicenseExpression>\n    <PackageReadmeFile>Markdown.Avalonia.Tight.md</PackageReadmeFile>\n    <PackageTags>Markdown Avalonia Avaloniaui</PackageTags>\n    <Configurations>Debug;Release</Configurations>\n    <LangVersion>9</LangVersion>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Include=\"..\\pack_readme\\Markdown.Avalonia.Tight.md\" Pack=\"true\" PackagePath=\"\\\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" Version=\"$(AvaloniaVersion)\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Remove=\"Assets\\ImageNotFound.bmp\" />\n    <None Remove=\"EmojiTable.txt\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <AvaloniaResource Include=\"Assets\\ImageNotFound.bmp\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <EmbeddedResource Include=\"EmojiTable.txt\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ColorDocument.Avalonia\\ColorDocument.Avalonia.csproj\" />\n    <ProjectReference Include=\"..\\ColorTextBlock.Avalonia\\ColorTextBlock.Avalonia.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup Condition=\" '$(TargetFramework)' == 'net45' \">\n    <Reference Include=\"System.Net.Http\" />\n  </ItemGroup>\n  \n  <!-- see https://stackoverflow.com/questions/41979310/including-referenced-project-dlls-in-nuget-package-net-core-rc3-csproj-file\n  <PropertyGroup>\n    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>\n  </PropertyGroup>\n  <Target Name=\"CopyProjectReferencesToPackage\" DependsOnTargets=\"ResolveReferences\">\n    <ItemGroup>\n      <BuildOutputInPackage Include=\"@(ReferenceCopyLocalPaths-&gt;WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))\" />\n    </ItemGroup>\n  </Target>\n   -->\n\n</Project>\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Markdown.cs",
    "content": "using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Primitives;\nusing Avalonia.Layout;\nusing Avalonia.Media;\nusing Avalonia.Media.Imaging;\nusing Avalonia.Styling;\nusing ColorDocument.Avalonia;\nusing ColorDocument.Avalonia.DocumentElements;\nusing ColorTextBlock.Avalonia;\nusing Markdown.Avalonia.Controls;\nusing Markdown.Avalonia.Parsers;\nusing Markdown.Avalonia.Parsers.Builtin;\nusing Markdown.Avalonia.Plugins;\nusing Markdown.Avalonia.Tables;\nusing Markdown.Avalonia.Utils;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Windows.Input;\n\nnamespace Markdown.Avalonia\n{\n    public class Markdown : AvaloniaObject, IMarkdownEngine, IMarkdownEngine2\n    {\n        #region const\n        /// <summary>\n        /// maximum nested depth of [] and () supported by the transform; implementation detail\n        /// </summary>\n        private const int _nestDepth = 6;\n\n        /// <summary>\n        /// Tabs are automatically converted to spaces as part of the transform  \n        /// this constant determines how \"wide\" those tabs become in spaces  \n        /// </summary>\n        private const int _tabWidth = 4;\n\n        public const string Heading1Class = ClassNames.Heading1Class;\n        public const string Heading2Class = ClassNames.Heading2Class;\n        public const string Heading3Class = ClassNames.Heading3Class;\n        public const string Heading4Class = ClassNames.Heading4Class;\n        public const string Heading5Class = ClassNames.Heading5Class;\n        public const string Heading6Class = ClassNames.Heading6Class;\n\n        public const string CodeBlockClass = ClassNames.CodeBlockClass;\n        public const string ContainerBlockClass = ClassNames.ContainerBlockClass;\n        public const string NoContainerClass = ClassNames.NoContainerClass;\n        public const string BlockquoteClass = ClassNames.BlockquoteClass;\n        public const string NoteClass = ClassNames.NoteClass;\n\n        public const string ParagraphClass = ClassNames.ParagraphClass;\n\n        public const string TableClass = ClassNames.TableClass;\n        public const string TableHeaderClass = ClassNames.TableHeaderClass;\n        public const string TableFirstRowClass = ClassNames.TableFirstRowClass;\n        public const string TableRowOddClass = ClassNames.TableRowOddClass;\n        public const string TableRowEvenClass = ClassNames.TableRowEvenClass;\n        public const string TableLastRowClass = ClassNames.TableLastRowClass;\n        public const string TableFooterClass = ClassNames.TableFooterClass;\n\n        public const string ListClass = ClassNames.ListClass;\n        public const string ListMarkerClass = ClassNames.ListMarkerClass;\n\n        #endregion\n\n        /// <summary>\n        /// when true, bold and italic require non-word characters on either side  \n        /// WARNING: this is a significant deviation from the markdown spec\n        /// </summary>\n        public bool StrictBoldItalic { get; set; }\n\n        private string _assetPathRoot;\n        /// <inheritdoc/>\n        public string AssetPathRoot\n        {\n            get => _assetPathRoot;\n            set\n            {\n                _assetPathRoot = value;\n#pragma warning disable CS0618\n                if (BitmapLoader is not null)\n                    BitmapLoader.AssetPathRoot = value;\n#pragma warning restore CS0618\n                if (_setupInfo is not null)\n                    _setupInfo.PathResolver.AssetPathRoot = value;\n            }\n        }\n\n        private string[] _assetAssemblyNames;\n        public IEnumerable<string> AssetAssemblyNames => _assetAssemblyNames;\n\n        private ICommand? _hyperlinkCommand;\n        /// <inheritdoc/>\n        public ICommand? HyperlinkCommand\n        {\n            get => _hyperlinkCommand ?? _setupInfo?.HyperlinkCommand;\n            set\n            {\n                _hyperlinkCommand = value;\n            }\n        }\n\n        public MdAvPlugins Plugins { get; set; }\n\n        [Obsolete]\n        private IBitmapLoader? _loader;\n        /// <inheritdoc/>\n        [Obsolete(\"Please use Plugins propety. see https://github.com/whistyun/Markdown.Avalonia/wiki/How-to-migrages-to-ver11\")]\n        public IBitmapLoader? BitmapLoader\n        {\n            get => _loader;\n            set\n            {\n                _loader = value;\n                if (_loader is not null)\n                {\n                    _loader.AssetPathRoot = _assetPathRoot;\n                }\n            }\n        }\n\n        private IContainerBlockHandler? _containerBlockHandler;\n        public IContainerBlockHandler? ContainerBlockHandler\n        {\n            get => _containerBlockHandler ?? _setupInfo?.ContainerBlock;\n            set\n            {\n                _containerBlockHandler = value;\n            }\n        }\n\n        public CascadeDictionary CascadeResources { get; } = new CascadeDictionary();\n\n        public IResourceDictionary Resources\n        {\n            get => CascadeResources.Owner;\n            set => CascadeResources.Owner = value;\n        }\n\n        public bool UseResource { get; set; }\n\n        #region dependencyobject property\n\n        public static readonly DirectProperty<Markdown, ICommand?> HyperlinkCommandProperty =\n            AvaloniaProperty.RegisterDirect<Markdown, ICommand?>(nameof(HyperlinkCommand),\n                mdEng => mdEng.HyperlinkCommand,\n                (mdEng, command) => mdEng.HyperlinkCommand = command);\n\n        [Obsolete(\"Please use Plugins propety. see https://github.com/whistyun/Markdown.Avalonia/wiki/How-to-migrages-to-ver11\")]\n        public static readonly DirectProperty<Markdown, IBitmapLoader?> BitmapLoaderProperty =\n            AvaloniaProperty.RegisterDirect<Markdown, IBitmapLoader?>(nameof(BitmapLoader),\n                mdEng => mdEng.BitmapLoader,\n                (mdEng, loader) => mdEng.BitmapLoader = loader);\n\n        #endregion\n\n        #region ParseInfo\n\n        private SetupInfo _setupInfo;\n        private BlockParser2[] _topBlockParsers;\n        private BlockParser2[] _blockParsers;\n        private InlineParser[] _inlines;\n        private bool _supportTextAlignment;\n        private bool _supportStrikethrough;\n        private bool _supportTextileInline;\n\n        #endregion\n\n        public Markdown()\n        {\n            _assetPathRoot = Environment.CurrentDirectory;\n\n            var stack = new StackTrace();\n            _assetAssemblyNames = stack.GetFrames()\n                            .Select(frm => frm?.GetMethod()?.DeclaringType?.Assembly?.GetName()?.Name)\n                            .OfType<string>()\n                            .Where(name => !name.Equals(\"Markdown.Avalonia\"))\n                            .Distinct()\n                            .ToArray();\n\n            Plugins = new MdAvPlugins();\n\n            _setupInfo = null!;\n            _topBlockParsers = null!;\n            _blockParsers = null!;\n            _inlines = null!;\n            SetupParser();\n        }\n\n        private void SetupParser()\n        {\n            var info = Plugins.Info;\n            if (ReferenceEquals(info, _setupInfo))\n                return;\n\n            var topBlocks = new List<BlockParser2>();\n            var subBlocks = new List<BlockParser2>();\n            var inlines = new List<InlineParser>();\n\n\n            // top-level block parser\n            topBlocks.Add(\n                info.EnableListMarkerExt ?\n                    new ExtListParser() :\n                    new CommonListParser());\n\n            topBlocks.Add(new FencedCodeBlockParser(info.EnablePreRenderingCodeBlock));\n\n            if (info.EnableContainerBlockExt)\n            {\n                topBlocks.Add(new ContainerBlockParser());\n            }\n\n\n            // sub-level block parser\n            subBlocks.Add(new BlockquotesParser(info.EnableTextAlignment));\n            subBlocks.Add(new SetextHeaderParser());\n            subBlocks.Add(new AtxHeaderParser());\n\n            subBlocks.Add(\n                info.EnableRuleExt ?\n                    new ExtHorizontalParser() :\n                    new CommonHorizontalParser());\n\n            if (info.EnableTableBlock)\n            {\n                subBlocks.Add(new TableParser());\n            }\n\n            if (info.EnableNoteBlock)\n            {\n                subBlocks.Add(new NoteParser());\n            }\n\n            subBlocks.Add(new IndentCodeBlockParser());\n\n\n            // inline parser\n            inlines.Add(InlineParser.New(_codeSpan, nameof(CodeSpanEvaluator), CodeSpanEvaluator));\n            inlines.Add(InlineParser.New(_imageOrHrefInline, nameof(ImageOrHrefInlineEvaluator), ImageOrHrefInlineEvaluator));\n\n            if (StrictBoldItalic)\n            {\n                inlines.Add(InlineParser.New(_strictBold, nameof(BoldEvaluator), BoldEvaluator));\n                inlines.Add(InlineParser.New(_strictItalic, nameof(ItalicEvaluator), ItalicEvaluator));\n\n                if (info.EnableStrikethrough)\n                    inlines.Add(InlineParser.New(_strikethrough, nameof(StrikethroughEvaluator), StrikethroughEvaluator));\n            }\n\n\n            // parser registered by plugin\n\n            topBlocks.AddRange(info.TopBlock.Select(bp => bp.Upgrade()));\n            subBlocks.AddRange(info.Block.Select(bp => bp.Upgrade()));\n            inlines.AddRange(info.Inline);\n\n\n            // inform path info to resolver\n            info.PathResolver.AssetPathRoot = AssetPathRoot;\n            info.PathResolver.CallerAssemblyNames = AssetAssemblyNames;\n\n            info.Overwrite(_hyperlinkCommand);\n            info.Overwrite(_containerBlockHandler);\n            info.Overwrite(_loader);\n\n\n            _topBlockParsers = topBlocks.Select(p => info.Override(p).Upgrade()).ToArray();\n            _blockParsers = subBlocks.Select(p => info.Override(p).Upgrade()).ToArray();\n            _inlines = inlines.ToArray();\n            _supportTextAlignment = info.EnableTextAlignment;\n            _supportStrikethrough = info.EnableStrikethrough;\n            _supportTextileInline = info.EnableTextileInline;\n            _setupInfo = info;\n        }\n\n        public Control Transform(string? text)\n        {\n            return TransformElement(text).Control;\n        }\n\n        public DocumentElement TransformElement(string? text)\n        {\n            if (text is null)\n            {\n                throw new ArgumentNullException(nameof(text));\n            }\n\n            SetupParser();\n\n            text = TextUtil.Normalize(text, _tabWidth);\n\n            var status = new ParseStatus(true & _supportTextAlignment);\n            var elements = ParseGamutElement(text, status);\n            return new DocumentRootElement(elements);\n        }\n\n        public IEnumerable<DocumentElement> ParseGamutElement(string? text, ParseStatus status)\n        {\n            if (text is null)\n            {\n                throw new ArgumentNullException(nameof(text));\n            }\n            SetupParser();\n            return PrivateRunBlockGamut(text, status);\n        }\n\n        public IEnumerable<CInline> ParseGamutInline(string? text)\n        {\n            if (text is null)\n            {\n                throw new ArgumentNullException(nameof(text));\n            }\n            SetupParser();\n            return PrivateRunSpanGamut(text);\n        }\n\n        public IEnumerable<Control> RunBlockGamut(string? text, ParseStatus status)\n        {\n            if (text is null)\n            {\n                throw new ArgumentNullException(nameof(text));\n            }\n\n            SetupParser();\n\n            text = TextUtil.Normalize(text, _tabWidth);\n\n            var elements = PrivateRunBlockGamut(text, status);\n            return elements.Select(e => e.Control);\n        }\n\n        public IEnumerable<CInline> RunSpanGamut(string? text)\n        {\n            if (text is null)\n            {\n                throw new ArgumentNullException(nameof(text));\n            }\n\n            SetupParser();\n\n            text = TextUtil.Normalize(text, _tabWidth);\n\n            return PrivateRunSpanGamut(text);\n        }\n\n        private IEnumerable<DocumentElement> PrivateRunBlockGamut(string text, ParseStatus status)\n        {\n            var index = 0;\n            var length = text.Length;\n            var rtn = new List<DocumentElement>();\n\n            var candidates = new List<Candidate<BlockParser2>>();\n\n            for (; ; )\n            {\n                candidates.Clear();\n\n                foreach (var parser in _topBlockParsers)\n                {\n                    var match = parser.Pattern.Match(text, index, length);\n                    if (match.Success) candidates.Add(new Candidate<BlockParser2>(match, parser));\n                }\n\n                if (candidates.Count == 0) break;\n\n                candidates.Sort();\n\n                int bestBegin = 0;\n                int bestEnd = 0;\n                IEnumerable<DocumentElement>? result = null;\n\n                foreach (var c in candidates)\n                {\n                    result = c.Parser.Convert2(text, c.Match, status, this, out bestBegin, out bestEnd);\n                    if (result is not null) break;\n                }\n\n                if (result is null) break;\n\n                if (bestBegin > index)\n                {\n                    RunBlockRest(text, index, bestBegin - index, status, 0, rtn);\n                }\n\n                rtn.AddRange(result);\n\n                length -= bestEnd - index;\n                index = bestEnd;\n            }\n\n            if (index < text.Length)\n            {\n                RunBlockRest(text, index, text.Length - index, status, 0, rtn);\n            }\n\n            return rtn;\n\n\n            void RunBlockRest(\n               string text, int index, int length,\n               ParseStatus status,\n                int parserStart,\n               List<DocumentElement> outto)\n            {\n                for (; parserStart < _blockParsers.Length; ++parserStart)\n                {\n                    var parser = _blockParsers[parserStart];\n\n                    for (; ; )\n                    {\n                        var match = parser.Pattern.Match(text, index, length);\n                        if (!match.Success) break;\n\n                        var rslt = parser.Convert2(text, match, status, this, out int parseBegin, out int parserEnd);\n                        if (rslt is null) break;\n\n                        if (parseBegin > index)\n                        {\n                            RunBlockRest(text, index, parseBegin - index, status, parserStart + 1, outto);\n                        }\n                        outto.AddRange(rslt);\n\n                        length -= parserEnd - index;\n                        index = parserEnd;\n                    }\n\n                    if (length == 0) break;\n                }\n\n                if (length != 0)\n                {\n                    outto.AddRange(FormParagraphs(text.Substring(index, length), status));\n                }\n            }\n        }\n\n        private IEnumerable<CInline> PrivateRunSpanGamut(string text)\n        {\n            var rtn = new List<CInline>();\n            RunSpanRest(text, 0, text.Length, 0, rtn);\n            return rtn;\n\n            void RunSpanRest(\n                string text, int index, int length,\n                int parserStart,\n                List<CInline> outto)\n            {\n                for (; parserStart < _inlines.Length; ++parserStart)\n                {\n                    var parser = _inlines[parserStart];\n\n                    for (; ; )\n                    {\n                        var match = parser.Pattern.Match(text, index, length);\n                        if (!match.Success) break;\n\n                        var rslt = parser.Convert(text, match, this, out int parseBegin, out int parserEnd);\n                        if (rslt is null) break;\n\n                        if (parseBegin > index)\n                        {\n                            RunSpanRest(text, index, parseBegin - index, parserStart + 1, outto);\n                        }\n                        outto.AddRange(rslt);\n\n                        length -= parserEnd - index;\n                        index = parserEnd;\n                    }\n\n                    if (length == 0) break;\n                }\n\n                if (length != 0)\n                {\n                    var subtext = text.Substring(index, length);\n\n                    outto.AddRange(\n                        StrictBoldItalic ?\n                            DoText(subtext) :\n                            DoTextDecorations(subtext, s => DoText(s)));\n                }\n            }\n        }\n\n\n        #region grammer - paragraph\n\n        private static readonly Regex _align = new(@\"^p([<=>])\\.\", RegexOptions.Compiled);\n        private static readonly Regex _newlinesLeadingTrailing = new(@\"^\\n+|\\n+\\z\", RegexOptions.Compiled);\n        private static readonly Regex _newlinesMultiple = new(@\"\\n{2,}\", RegexOptions.Compiled);\n\n        /// <summary>\n        /// splits on two or more newlines, to form \"paragraphs\";    \n        /// </summary>\n        private IEnumerable<DocumentElement> FormParagraphs(string text, ParseStatus status)\n        {\n            var trimemdText = _newlinesLeadingTrailing.Replace(text, \"\");\n\n            string[] grafs = trimemdText == \"\" ?\n                new string[0] :\n                _newlinesMultiple.Split(trimemdText);\n\n            foreach (var g in grafs)\n            {\n                var chip = g;\n\n                TextAlignment? indiAlignment = null;\n\n                if (status.SupportTextAlignment)\n                {\n                    var alignMatch = _align.Match(chip);\n                    if (alignMatch.Success)\n                    {\n                        chip = chip.Substring(alignMatch.Length);\n                        switch (alignMatch.Groups[1].Value)\n                        {\n                            case \"<\":\n                                indiAlignment = TextAlignment.Left;\n                                break;\n                            case \">\":\n                                indiAlignment = TextAlignment.Right;\n                                break;\n                            case \"=\":\n                                indiAlignment = TextAlignment.Center;\n                                break;\n                        }\n                    }\n                }\n\n                var inlines = PrivateRunSpanGamut(chip);\n                var ctbox = indiAlignment.HasValue ?\n                    new CTextBlockElement(inlines, ParagraphClass, indiAlignment.Value) :\n                    new CTextBlockElement(inlines, ParagraphClass);\n\n                yield return ctbox;\n            }\n        }\n\n        #endregion\n\n        #region grammer - image or href\n\n        private static readonly Regex _imageOrHrefInline = new(string.Format(@\"\n                (                           # wrap whole match in $1\n                    (!)?                    # image maker = $2\n                    \\[\n                        ({0})               # link text = $3\n                    \\]\n                    \\(                      # literal paren\n                        [ ]*\n                        ({1})               # href = $4\n                        [ ]*\n                        (                   # $5\n                        (['\"\"])             # quote char = $6\n                        (.*?)               # title = $7\n                        \\6                  # matching quote\n                        [ ]*                # ignore any spaces between closing quote and )\n                        )?                  # title is optional\n                    \\)\n                )\", GetNestedBracketsPattern(), GetNestedParensPattern()),\n                  RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled);\n\n\n        private CInline ImageOrHrefInlineEvaluator(Match match)\n        {\n            if (String.IsNullOrEmpty(match.Groups[2].Value))\n            {\n                return TreatsAsHref(match);\n            }\n            else\n            {\n                return TreatsAsImage(match);\n            }\n        }\n\n\n        private CInline TreatsAsHref(Match match)\n        {\n            string linkText = match.Groups[3].Value;\n            string url = match.Groups[4].Value;\n            string title = match.Groups[7].Value;\n\n            var link = new CHyperlink(PrivateRunSpanGamut(linkText))\n            {\n                Command = (urlTxt) =>\n                {\n                    if (HyperlinkCommand != null && HyperlinkCommand.CanExecute(urlTxt))\n                    {\n                        HyperlinkCommand.Execute(urlTxt);\n                    }\n                },\n\n                CommandParameter = url\n            };\n\n            if (!String.IsNullOrEmpty(title)\n                && !title.Any(ch => !Char.IsLetterOrDigit(ch)))\n            {\n                link.Classes.Add(title);\n            }\n\n            return link;\n        }\n\n        private CInline TreatsAsImage(Match match)\n        {\n            string altText = match.Groups[3].Value;\n            string urlTxt = match.Groups[4].Value;\n            string title = match.Groups[7].Value;\n\n            return LoadImage(urlTxt, title);\n        }\n\n        private CInline LoadImage(string urlTxt, string title)\n        {\n            if (UseResource && CascadeResources.TryGet(urlTxt, out var resourceVal))\n            {\n                if (resourceVal is Control control)\n                {\n                    return new CInlineUIContainer(control);\n                }\n\n                CImage? cimg = null;\n                if (resourceVal is Bitmap renderedImage)\n                {\n                    cimg = new CImage(renderedImage);\n                }\n                if (resourceVal is IEnumerable<Byte> byteEnum)\n                {\n                    try\n                    {\n                        using (var memstream = new MemoryStream(byteEnum.ToArray()))\n                        {\n                            var bitmap = new Bitmap(memstream);\n                            cimg = new CImage(bitmap);\n                        }\n                    }\n                    catch { }\n                }\n\n                if (cimg is not null)\n                {\n                    if (!String.IsNullOrEmpty(title)\n                        && !title.Any(ch => !Char.IsLetterOrDigit(ch)))\n                    {\n                        cimg.Classes.Add(title);\n                    }\n                    return cimg;\n                }\n            }\n\n            CImage image = _setupInfo.LoadImage(urlTxt);\n\n            if (!String.IsNullOrEmpty(title)\n                && !title.Any(ch => !Char.IsLetterOrDigit(ch)))\n            {\n                image.Classes.Add(title);\n            }\n\n            return image;\n        }\n\n\n        #endregion\n\n        #region grammer - code\n\n        //    * You can use multiple backticks as the delimiters if you want to\n        //        include literal backticks in the code span. So, this input:\n        //\n        //        Just type ``foo `bar` baz`` at the prompt.\n        //\n        //        Will translate to:\n        //\n        //          <p>Just type <code>foo `bar` baz</code> at the prompt.</p>\n        //\n        //        There's no arbitrary limit to the number of backticks you\n        //        can use as delimters. If you need three consecutive backticks\n        //        in your code, use four for delimiters, etc.\n        //\n        //    * You can use spaces to get literal backticks at the edges:\n        //\n        //          ... type `` `bar` `` ...\n        //\n        //        Turns to:\n        //\n        //          ... type <code>`bar`</code> ...         \n        //\n        private static readonly Regex _codeSpan = new(@\"\n                    (?<!\\\\)   # Character before opening ` can't be a backslash\n                    (`+)      # $1 = Opening run of `\n                    (.+?)     # $2 = The code block\n                    (?<!`)\n                    \\1\n                    (?!`)\", RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline | RegexOptions.Compiled);\n\n        private CCode CodeSpanEvaluator(Match match)\n        {\n            string span = match.Groups[2].Value;\n            span = Regex.Replace(span, @\"^[ ]*\", \"\"); // leading whitespace\n            span = Regex.Replace(span, @\"[ ]*$\", \"\"); // trailing whitespace\n\n            var result = new CCode(new[] { new CRun() { Text = span } });\n\n            return result;\n        }\n\n        #endregion\n\n        #region grammer - textdecorations\n\n        private static readonly Regex _strictBold = new(@\"([\\W_]|^) (\\*\\*|__) (?=\\S) ([^\\r]*?\\S[\\*_]*) \\2 ([\\W_]|$)\",\n            RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline | RegexOptions.Compiled);\n        private static readonly Regex _strictItalic = new(@\"([\\W_]|^) (\\*|_) (?=\\S) ([^\\r\\*_]*?\\S) \\2 ([\\W_]|$)\",\n            RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline | RegexOptions.Compiled);\n        private static readonly Regex _strikethrough = new(@\"(~~) (?=\\S) (.+?) (?<=\\S) \\1\",\n            RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline | RegexOptions.Compiled);\n        private static readonly Regex _underline = new(@\"(__) (?=\\S) (.+?) (?<=\\S) \\1\",\n            RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline | RegexOptions.Compiled);\n\n        /// <summary>\n        /// Turn Markdown *italics* and **bold** into HTML strong and em tags\n        /// </summary>\n        private IEnumerable<CInline> DoTextDecorations(string text, Func<string, IEnumerable<CInline>> defaultHandler)\n        {\n            var rtn = new List<CInline>();\n\n            var buff = new StringBuilder();\n\n            void HandleBefore()\n            {\n                if (buff.Length > 0)\n                {\n                    rtn.AddRange(defaultHandler(buff.ToString()));\n                    buff.Clear();\n                }\n            }\n\n            for (var i = 0; i < text.Length; ++i)\n            {\n                var ch = text[i];\n                switch (ch)\n                {\n                    default:\n                        buff.Append(ch);\n                        break;\n\n                    case '\\\\': // escape\n                        if (++i < text.Length)\n                        {\n                            switch (text[i])\n                            {\n                                default:\n                                    buff.Append('\\\\').Append(text[i]);\n                                    break;\n\n                                case '\\\\': // escape\n                                case ':': // bold? or italic\n                                case '*': // bold? or italic\n                                case '~': // strikethrough?\n                                case '_': // underline?\n                                case '%': // color?\n                                    buff.Append(text[i]);\n                                    break;\n                            }\n                        }\n                        else\n                            buff.Append('\\\\');\n\n                        break;\n\n                    case ':': // emoji?\n                        {\n                            var nxtI = text.IndexOf(':', i + 1);\n                            if (nxtI != -1 && EmojiTable.TryGet(text.Substring(i + 1, nxtI - i - 1), out var emoji))\n                            {\n                                buff.Append(emoji);\n                                i = nxtI;\n                            }\n                            else buff.Append(':');\n                            break;\n                        }\n\n                    case '*': // bold? or italic\n                        {\n                            var oldI = i;\n                            var inline = ParseAsBoldOrItalic(text, ref i);\n                            if (inline == null)\n                            {\n                                buff.Append(text, oldI, i - oldI + 1);\n                            }\n                            else\n                            {\n                                HandleBefore();\n                                rtn.Add(inline);\n                            }\n                            break;\n                        }\n\n                    case '~': // strikethrough?\n                        {\n                            var oldI = i;\n                            var inline = ParseAsStrikethrough(text, ref i);\n                            if (inline == null)\n                            {\n                                buff.Append(text, oldI, i - oldI + 1);\n                            }\n                            else\n                            {\n                                HandleBefore();\n                                rtn.Add(inline);\n                            }\n                            break;\n                        }\n\n                    case '_': // underline?\n                        {\n                            var oldI = i;\n                            var inline = ParseAsUnderline(text, ref i);\n                            if (inline == null)\n                            {\n                                buff.Append(text, oldI, i - oldI + 1);\n                            }\n                            else\n                            {\n                                HandleBefore();\n                                rtn.Add(inline);\n                            }\n                            break;\n                        }\n\n                    case '%': // color?\n                        {\n                            var oldI = i;\n                            var inline = ParseAsColor(text, ref i);\n                            if (inline == null)\n                            {\n                                buff.Append(text, oldI, i - oldI + 1);\n                            }\n                            else\n                            {\n                                HandleBefore();\n                                rtn.Add(inline);\n                            }\n                            break;\n                        }\n                }\n            }\n\n            if (buff.Length > 0)\n            {\n                rtn.AddRange(defaultHandler(buff.ToString()));\n            }\n\n            return rtn;\n        }\n\n        private CUnderline? ParseAsUnderline(string text, ref int start)\n        {\n            var bgnCnt = CountRepeat(text, start, '_');\n\n            int last = EscapedIndexOf(text, start + bgnCnt, '_');\n\n            int endCnt = last >= 0 ? CountRepeat(text, last, '_') : -1;\n\n            if (endCnt >= 2 && bgnCnt >= 2)\n            {\n                int cnt = 2;\n                int bgn = start + cnt;\n                int end = last;\n\n                start = end + cnt - 1;\n                var span = new CUnderline(PrivateRunSpanGamut(text.Substring(bgn, end - bgn)));\n                return span;\n            }\n            else\n            {\n                start += bgnCnt - 1;\n                return null;\n            }\n        }\n\n        private CStrikethrough? ParseAsStrikethrough(string text, ref int start)\n        {\n            var bgnCnt = CountRepeat(text, start, '~');\n\n            int last = EscapedIndexOf(text, start + bgnCnt, '~');\n\n            int endCnt = last >= 0 ? CountRepeat(text, last, '~') : -1;\n\n            if (endCnt >= 2 && bgnCnt >= 2)\n            {\n                int cnt = 2;\n                int bgn = start + cnt;\n                int end = last;\n\n                start = end + cnt - 1;\n                var span = new CStrikethrough(PrivateRunSpanGamut(text.Substring(bgn, end - bgn)));\n                return span;\n            }\n            else\n            {\n                start += bgnCnt - 1;\n                return null;\n            }\n        }\n\n        private CInline? ParseAsBoldOrItalic(string text, ref int start)\n        {\n            // count asterisk (bgn)\n            var bgnCnt = CountRepeat(text, start, '*');\n\n            int last = EscapedIndexOf(text, start + bgnCnt, '*');\n\n            int endCnt = last >= 0 ? CountRepeat(text, last, '*') : -1;\n\n            if (endCnt >= 1)\n            {\n                int cnt = Math.Min(bgnCnt, endCnt);\n                int bgn = start + cnt;\n                int end = last;\n\n                switch (cnt)\n                {\n                    case 1: // italic\n                        {\n                            start = end + cnt - 1;\n\n                            var span = new CItalic(PrivateRunSpanGamut(text.Substring(bgn, end - bgn)));\n                            return span;\n                        }\n                    case 2: // bold\n                        {\n                            start = end + cnt - 1;\n                            var span = new CBold(PrivateRunSpanGamut(text.Substring(bgn, end - bgn)));\n                            return span;\n                        }\n\n                    default: // >3; bold-italic\n                        {\n                            bgn = start + 3;\n                            start = end + 3 - 1;\n\n                            var inline = new CItalic(PrivateRunSpanGamut(text.Substring(bgn, end - bgn)));\n                            var span = new CBold(new[] { inline });\n                            return span;\n                        }\n                }\n            }\n            else\n            {\n                start += bgnCnt - 1;\n                return null;\n            }\n        }\n\n        private CInline? ParseAsColor(string text, ref int start)\n        {\n            if (start + 1 >= text.Length)\n                return null;\n\n            if (text[start + 1] != '{')\n                return null;\n\n            int end = text.IndexOf('}', start + 1);\n\n            if (end == -1)\n                return null;\n\n            var styleTxts = text.Substring(start + 2, end - (start + 2));\n\n            int bgnIdx = end + 1;\n            int endIdx = EscapedIndexOf(text, bgnIdx, '%');\n\n            CSpan span;\n            if (endIdx == -1)\n            {\n                endIdx = text.Length - 1;\n                span = new CSpan(PrivateRunSpanGamut(text.Substring(bgnIdx)));\n            }\n            else\n            {\n                span = new CSpan(PrivateRunSpanGamut(text.Substring(bgnIdx, endIdx - bgnIdx)));\n            }\n\n            foreach (var styleTxt in styleTxts.Split(';'))\n            {\n                var nameAndVal = styleTxt.Split(':');\n\n                if (nameAndVal.Length != 2)\n                    return null;\n\n                var name = nameAndVal[0].Trim();\n                var colorLbl = nameAndVal[1].Trim();\n\n                switch (name)\n                {\n                    case \"color\":\n                        try\n                        {\n                            var color = colorLbl.StartsWith(\"#\") ?\n                                (IBrush?)new BrushConverter().ConvertFrom(colorLbl) :\n                                (IBrush?)new BrushConverter().ConvertFromString(colorLbl);\n\n                            span.Foreground = color;\n                        }\n                        catch { }\n                        break;\n\n                    case \"background\":\n                        try\n                        {\n                            var color = colorLbl.StartsWith(\"#\") ?\n                                (IBrush?)new BrushConverter().ConvertFrom(colorLbl) :\n                                (IBrush?)new BrushConverter().ConvertFromString(colorLbl);\n\n                            span.Background = color;\n                        }\n                        catch { }\n                        break;\n\n                    default:\n                        return null;\n                }\n            }\n\n            start = endIdx;\n            return span;\n        }\n\n\n        private int EscapedIndexOf(string text, int start, char target)\n        {\n            for (var i = start; i < text.Length; ++i)\n            {\n                var ch = text[i];\n                if (ch == '\\\\') ++i;\n                else if (ch == target) return i;\n            }\n            return -1;\n        }\n        private int CountRepeat(string text, int start, char target)\n        {\n            var count = 0;\n\n            for (var i = start; i < text.Length; ++i)\n            {\n                if (text[i] == target) ++count;\n                else break;\n            }\n\n            return count;\n        }\n\n        private CItalic ItalicEvaluator(Match match)\n        {\n            var content = match.Groups[3].Value;\n\n            return new CItalic(PrivateRunSpanGamut(content));\n        }\n\n        private CBold BoldEvaluator(Match match)\n        {\n            var content = match.Groups[3].Value;\n\n            return new CBold(PrivateRunSpanGamut(content));\n        }\n\n        private CStrikethrough StrikethroughEvaluator(Match match)\n        {\n            var content = match.Groups[2].Value;\n\n            return new CStrikethrough(PrivateRunSpanGamut(content));\n        }\n\n        private CUnderline UnderlineEvaluator(Match match)\n        {\n            var content = match.Groups[2].Value;\n\n            return new CUnderline(PrivateRunSpanGamut(content));\n        }\n\n        #endregion\n\n        #region grammer - text\n\n        private static readonly Regex _eoln = new(\"\\\\s+\");\n        private static readonly Regex _lbrk = new(@\"\\ {2,}\\n\");\n\n        private IEnumerable<CRun> DoText(string text)\n        {\n            var lines = _lbrk.Split(text);\n            bool first = true;\n            foreach (var line in lines)\n            {\n                if (first)\n                    first = false;\n                else\n                    yield return new CLineBreak();\n                var t = _eoln.Replace(line, \" \");\n                yield return new CRun() { Text = t };\n            }\n        }\n\n        #endregion\n\n        #region helper - make regex\n\n        /// <summary>\n        /// Reusable pattern to match balanced [brackets]. See Friedl's \n        /// \"Mastering Regular Expressions\", 2nd Ed., pp. 328-331.\n        /// </summary>\n        private static string GetNestedBracketsPattern()\n        {\n            // in other words [this] and [this[also]] and [this[also[too]]]\n            // up to _nestDepth\n            return RepeatString(@\"\n                   (?>              # Atomic matching\n                      [^\\[\\]]+      # Anything other than brackets\n                    |\n                      \\[\n                          \", _nestDepth) + RepeatString(\n                   @\" \\]\n                   )*\"\n                   , _nestDepth);\n        }\n\n        /// <summary>\n        /// Reusable pattern to match balanced (parens). See Friedl's \n        /// \"Mastering Regular Expressions\", 2nd Ed., pp. 328-331.\n        /// </summary>\n        private static string GetNestedParensPattern()\n        {\n            // in other words (this) and (this(also)) and (this(also(too)))\n            // up to _nestDepth\n            return RepeatString(@\"\n                   (?>              # Atomic matching\n                      [^()\\n\\t]+? # Anything other than parens or whitespace\n                    |\n                      \\(\n                          \", _nestDepth) + RepeatString(\n                   @\" \\)\n                   )*?\"\n                   , _nestDepth);\n        }\n\n        /// <summary>\n        /// this is to emulate what's evailable in PHP\n        /// </summary>\n        private static string RepeatString(string text, int count)\n        {\n            var sb = new StringBuilder(text.Length * count);\n            for (int i = 0; i < count; i++)\n                sb.Append(text);\n            return sb.ToString();\n        }\n\n        #endregion\n\n\n        #region helper - parse\n\n        private TResult Create<TResult, TContent>(IEnumerable<TContent> content)\n            where TResult : Panel, new()\n            where TContent : Control\n        {\n            var result = new TResult();\n            foreach (var c in content)\n            {\n                result.Children.Add(c);\n            }\n\n            return result;\n        }\n\n\n        //private IEnumerable<T> Evaluates<T>(\n        //        string text, ParseStatus status,\n        //        BlockParser<T>[] primary,\n        //        BlockParser<T>[] secondly,\n        //        Func<string, ParseStatus, IEnumerable<T>> rest\n        //    )\n        //{\n        //    var index = 0;\n        //    var length = text.Length;\n        //    var rtn = new List<T>();\n        //\n        //    while (true)\n        //    {\n        //        int bestIndex = Int32.MaxValue;\n        //        Match? bestMatch = null;\n        //        BlockParser<T>? bestParser = null;\n        //\n        //        foreach (var parser in primary)\n        //        {\n        //            var match = parser.Pattern.Match(text, index, length);\n        //            if (match.Success && match.Index < bestIndex)\n        //            {\n        //                bestIndex = match.Index;\n        //                bestMatch = match;\n        //                bestParser = parser;\n        //            }\n        //        }\n        //\n        //        if (bestParser is null || bestMatch is null) break;\n        //\n        //        var result = bestParser.Convert(text, bestMatch, status, this, out bestIndex, out int newIndex);\n        //\n        //        if (bestIndex > index)\n        //        {\n        //            EvaluateRest(rtn, text, index, bestIndex - index, status, secondly, 0, rest);\n        //        }\n        //\n        //        rtn.AddRange(result);\n        //\n        //        length -= newIndex - index;\n        //        index = newIndex;\n        //    }\n        //\n        //    if (index < text.Length)\n        //    {\n        //        EvaluateRest(rtn, text, index, text.Length - index, status, secondly, 0, rest);\n        //    }\n        //\n        //    return rtn;\n        //\n        //}\n        //\n        //private void EvaluateRest<T>(\n        //    List<T> resultIn,\n        //    string text, int index, int length,\n        //    ParseStatus status,\n        //    BlockParser<T>[] parsers, int parserStart,\n        //    Func<string, ParseStatus, IEnumerable<T>> rest)\n        //{\n        //    for (; parserStart < parsers.Length; ++parserStart)\n        //    {\n        //        var parser = parsers[parserStart];\n        //\n        //        for (; ; )\n        //        {\n        //            var match = parser.Pattern.Match(text, index, length);\n        //            if (!match.Success) break;\n        //\n        //            var result = parser.Convert(text, match, status, this, out var matchStartIndex, out int newIndex);\n        //\n        //            if (matchStartIndex > index)\n        //            {\n        //                EvaluateRest(resultIn, text, index, match.Index - index, status, parsers, parserStart + 1, rest);\n        //            }\n        //\n        //            resultIn.AddRange(result);\n        //\n        //            length -= newIndex - index;\n        //            index = newIndex;\n        //        }\n        //\n        //        if (length == 0) break;\n        //    }\n        //\n        //    if (length != 0)\n        //    {\n        //        var suffix = text.Substring(index, length);\n        //        resultIn.AddRange(rest(suffix, status));\n        //    }\n        //}\n\n        #endregion\n    }\n\n    internal struct Candidate<T> : IComparable<Candidate<T>>\n    {\n        public Match Match { get; }\n        public T Parser { get; }\n\n        public Candidate(Match result, T parser)\n        {\n            Match = result;\n            Parser = parser;\n        }\n\n        public int CompareTo(Candidate<T> other)\n            => Match.Index.CompareTo(other.Match.Index);\n    }\n\n    internal class UnclosableStream : Stream\n    {\n        private Stream _stream;\n\n        public UnclosableStream(Stream stream)\n        {\n            _stream = stream;\n        }\n\n        public override bool CanRead => _stream.CanRead;\n        public override bool CanSeek => _stream.CanSeek;\n        public override bool CanWrite => _stream.CanWrite;\n        public override long Length => _stream.Length;\n\n        public override long Position\n        {\n            get => _stream.Position;\n            set => _stream.Position = value;\n        }\n\n        public override void Flush() { }\n        public override void Close() { }\n\n        public override int Read(byte[] buffer, int offset, int count) => _stream.Read(buffer, offset, count);\n        public override long Seek(long offset, SeekOrigin origin) => _stream.Seek(offset, origin);\n\n        public override void SetLength(long value) => _stream.SetLength(value);\n\n        public override void Write(byte[] buffer, int offset, int count)\n        {\n            throw new NotImplementedException();\n        }\n    }\n}"
  },
  {
    "path": "Markdown.Avalonia.Tight/MarkdownScrollViewer.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Primitives;\nusing Avalonia.Controls.Shapes;\nusing Avalonia.Input;\nusing Avalonia.Input.Platform;\nusing Avalonia.Layout;\nusing Avalonia.Media;\nusing Avalonia.Metadata;\nusing Avalonia.Platform;\nusing Avalonia.Styling;\nusing ColorDocument.Avalonia;\nusing ColorDocument.Avalonia.DocumentElements;\nusing ColorTextBlock.Avalonia;\nusing Markdown.Avalonia.Plugins;\nusing Markdown.Avalonia.StyleCollections;\nusing Markdown.Avalonia.Utils;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Net.Http;\nusing System.Text.RegularExpressions;\nusing MdStyle = Markdown.Avalonia.MarkdownStyle;\n\nnamespace Markdown.Avalonia\n{\n    public class MarkdownScrollViewer : Control\n    {\n        public static readonly DirectProperty<MarkdownScrollViewer, Uri?> SourceDirectProperty =\n            AvaloniaProperty.RegisterDirect<MarkdownScrollViewer, Uri?>(\n                nameof(Source),\n                o => o.Source,\n                (o, v) => o.Source = v);\n\n        public static readonly AvaloniaProperty<Uri?> SourceProperty = SourceDirectProperty;\n\n        private static readonly DirectProperty<MarkdownScrollViewer, string?> MarkdownDirectProperty =\n            AvaloniaProperty.RegisterDirect<MarkdownScrollViewer, string?>(\n                nameof(Markdown),\n                o => o.Markdown,\n                (o, v) => o.Markdown = v);\n\n        public static readonly AvaloniaProperty<string?> MarkdownProperty = MarkdownDirectProperty;\n\n        private static readonly AvaloniaProperty<IStyle> MarkdownStyleProperty =\n            AvaloniaProperty.RegisterDirect<MarkdownScrollViewer, IStyle>(\n                nameof(MarkdownStyle),\n                o => o.MarkdownStyle,\n                (o, v) => o.MarkdownStyle = v);\n\n        public static readonly AvaloniaProperty<string?> MarkdownStyleNameProperty =\n            AvaloniaProperty.RegisterDirect<MarkdownScrollViewer, string?>(\n                nameof(MarkdownStyleName),\n                o => o.MarkdownStyleName,\n                (o, v) => o.MarkdownStyleName = v);\n\n        public static readonly AvaloniaProperty<string?> AssetPathRootProperty =\n            AvaloniaProperty.RegisterDirect<MarkdownScrollViewer, string?>(\n                nameof(AssetPathRoot),\n                o => o.AssetPathRoot,\n                (o, v) => o.AssetPathRoot = v);\n\n        public static readonly StyledProperty<bool> SaveScrollValueWhenContentUpdatedProperty =\n            AvaloniaProperty.Register<MarkdownScrollViewer, bool>(\n                nameof(SaveScrollValueWhenContentUpdated),\n                defaultValue: false);\n\n        public static readonly AvaloniaProperty<Vector> ScrollValueProperty =\n            AvaloniaProperty.RegisterDirect<MarkdownScrollViewer, Vector>(\n                nameof(ScrollValue),\n                owner => owner.ScrollValue,\n                (owner, v) => owner.ScrollValue = v);\n\n        public static readonly StyledProperty<IBrush?> SelectionBrushProperty =\n            SelectableTextBlock.SelectionBrushProperty.AddOwner<MarkdownScrollViewer>();\n\n        public static readonly AvaloniaProperty<bool> SelectionEnabledProperty =\n            AvaloniaProperty.RegisterDirect<MarkdownScrollViewer, bool>(\n                nameof(SelectionEnabled),\n                owner => owner.SelectionEnabled,\n                (owner, v) => owner.SelectionEnabled = v);\n\n        public static readonly AvaloniaProperty<Thickness> PaddingProperty =\n            AvaloniaProperty.RegisterDirect<MarkdownScrollViewer, Thickness>(\n                nameof(Padding),\n                owner => owner.Padding,\n                (owner, v) => owner.Padding = v);\n\n        private static readonly HttpClient s_httpclient = new();\n        private readonly ScrollViewer _viewer;\n        private SetupInfo _setup;\n        private DocumentElement? _document;\n        private IBrush? _selectionBrush;\n        private Wrapper _wrapper;\n\n        public MarkdownScrollViewer()\n        {\n            _plugins = new MdAvPlugins();\n            _setup = Plugins.Info;\n\n            var md = new Markdown();\n            md.CascadeResources.SetParent(this);\n            md.UseResource = _useResource;\n            md.Plugins = _plugins;\n\n            _engine = md;\n\n            if (nvl(ThemeDetector.IsFluentAvaloniaUsed))\n            {\n                _markdownStyleName = nameof(MdStyle.FluentAvalonia);\n                _markdownStyle = MdStyle.FluentAvalonia;\n            }\n            else if (nvl(ThemeDetector.IsFluentUsed))\n            {\n                _markdownStyleName = nameof(MdStyle.FluentTheme);\n                _markdownStyle = MdStyle.FluentTheme;\n            }\n            else if (nvl(ThemeDetector.IsSimpleUsed))\n            {\n                _markdownStyleName = nameof(MdStyle.SimpleTheme);\n                _markdownStyle = MdStyle.SimpleTheme;\n            }\n            else\n            {\n                _markdownStyleName = nameof(MdStyle.Standard);\n                _markdownStyle = MdStyle.Standard;\n            }\n            Styles.Insert(0, _markdownStyle);\n            TrySetupSelectionBrush(_markdownStyle);\n\n            _viewer = new ScrollViewer()\n            {\n                // TODO: ScrollViewer does not seem to take Padding into account in 11.0.0-preview1\n                Padding = new Thickness(0),\n                HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled,\n                VerticalScrollBarVisibility = ScrollBarVisibility.Auto,\n            };\n\n            ((ISetLogicalParent)_viewer).SetParent(this);\n            VisualChildren.Add(_viewer);\n            LogicalChildren.Add(_viewer);\n\n            EditStyle(_markdownStyle);\n\n            static bool nvl(bool? vl) => vl.HasValue && vl.Value;\n\n            _viewer.ScrollChanged += (s, e) => OnScrollChanged();\n            _viewer.PointerPressed += _viewer_PointerPressed;\n            _viewer.PointerMoved += _viewer_PointerMoved;\n            _viewer.PointerReleased += _viewer_PointerReleased;\n\n            _wrapper = new Wrapper(this);\n            _viewer.Content = _wrapper;\n        }\n\n        #region text selection\n\n        private bool _isLeftButtonPressed;\n        private Point _startPoint;\n\n        private void _viewer_PointerPressed(object? sender, PointerPressedEventArgs e)\n        {\n            if (_document is null) return;\n            if (!SelectionEnabled) return;\n\n            var point = e.GetCurrentPoint(_document.Control);\n            if (point.Properties.IsLeftButtonPressed && _document is not null)\n            {\n                _isLeftButtonPressed = true;\n                _startPoint = point.Position;\n                _document.Select(_startPoint, point.Position);\n\n                this.Focus();\n            }\n        }\n\n        private void _viewer_PointerMoved(object? sender, PointerEventArgs e)\n        {\n            if (_document is null) return;\n\n            var point = e.GetCurrentPoint(_document.Control);\n            if (_isLeftButtonPressed && point.Properties.IsLeftButtonPressed)\n            {\n                if (_document is not null)\n                    _document.Select(_startPoint, point.Position);\n            }\n        }\n\n        private void _viewer_PointerReleased(object? sender, PointerReleasedEventArgs e)\n        {\n            if (_document is null) return;\n\n            var point = e.GetCurrentPoint(_document.Control);\n            if (_isLeftButtonPressed && !point.Properties.IsLeftButtonPressed)\n            {\n                _isLeftButtonPressed = false;\n\n                if (_document is not null)\n                    _document.Select(_startPoint, point.Position);\n            }\n        }\n\n        protected override void OnKeyDown(KeyEventArgs e)\n        {\n            if (!SelectionEnabled) return;\n\n            // Ctrl+C\n            if (e.Key == Key.C && e.KeyModifiers == KeyModifiers.Control)\n            {\n                if (_document is not null\n                    && TopLevel.GetTopLevel(this) is TopLevel top\n                    && top.Clipboard is IClipboard clipboard)\n                {\n                    clipboard.SetTextAsync(_document.GetSelectedText());\n                }\n            }\n        }\n\n        #endregion\n\n        public event HeaderScrolled? HeaderScrolled;\n        private List<HeaderRect>? _headerRects;\n        private HeaderScrolledEventArgs? _eventArgs;\n\n        private void OnViewportSizeChanged(object? obj, EventArgs arg)\n        {\n            _headerRects = null;\n            _wrapper.Restructure();\n        }\n\n        private void OnScrollChanged()\n        {\n            if (HeaderScrolled is null) return;\n\n            double offsetY = _viewer.Offset.Y;\n            double viewHeight = _viewer.Viewport.Height;\n\n            if (_headerRects is null)\n            {\n                if (_document is null) return;\n\n                _headerRects = new List<HeaderRect>();\n                foreach (var doc in _document.Children.OfType<HeaderElement>())\n                {\n                    var t = doc.GetRect(this);\n                    var rect = new Rect(t.Left, t.Top + offsetY, t.Width, t.Height);\n                    _headerRects.Add(new HeaderRect(rect, doc));\n                }\n            }\n\n            var tree = new Header?[5];\n            var viewing = new List<Header>();\n\n            tree[0] = _headerRects.Where(rct => rct.Header.Level == 1)\n                                  .Select(rct => CreateHeader(rct))\n                                  .FirstOrDefault();\n\n            foreach (var headerRect in _headerRects)\n            {\n                var boundY = headerRect.BaseBound.Bottom - offsetY;\n\n                if (boundY < 0)\n                {\n                    var header = CreateHeader(headerRect);\n                    tree[header.Level - 1] = header;\n\n                    for (var i = header.Level; i < tree.Length; ++i)\n                        tree[i] = null;\n                }\n                else if (0 <= boundY && boundY < viewHeight)\n                {\n                    viewing.Add(CreateHeader(headerRect));\n                }\n                else break;\n            }\n\n            var newEvArg = new HeaderScrolledEventArgs(tree.OfType<Header>().ToList(), viewing);\n            if (_eventArgs != newEvArg)\n            {\n                _eventArgs = newEvArg;\n                HeaderScrolled(this, _eventArgs);\n            }\n\n            static Header CreateHeader(HeaderRect headerRect)\n            {\n                var header = headerRect.Header;\n                return new Header(header.Level, header.Text);\n            }\n        }\n\n        private void EditStyle(IStyle mdstyle)\n        {\n            if (mdstyle is INamedStyle nameStyle && !nameStyle.IsEditted\n             && mdstyle is Styles styles)\n            {\n                foreach (var edit in _setup.StyleEdits)\n                    edit.Edit(nameStyle.Name, styles);\n\n                nameStyle.IsEditted = true;\n            }\n        }\n\n        private void TrySetupSelectionBrush(IStyle style)\n        {\n            _selectionBrush = null;\n\n            var key = \"MarkdownScrollViewer.SelectionBrush\";\n            if (style.TryGetResource(key, null, out var brushObj)\n                && brushObj is IBrush brush)\n            {\n                _selectionBrush = brush;\n            }\n        }\n\n        private void UpdateMarkdown()\n        {\n            if (_wrapper.Document is null && String.IsNullOrEmpty(Markdown))\n                return;\n\n            _document = _engine.TransformElement(Markdown ?? \"\");\n            _document.Control.Classes.Add(\"Markdown_Avalonia_MarkdownViewer\");\n\n            var ofst = _viewer.Offset;\n\n            if (_wrapper.Document?.Control is Control oldContentControl)\n            {\n                oldContentControl.SizeChanged -= OnViewportSizeChanged;\n            }\n\n            _wrapper.Document = _document;\n\n            if (_wrapper.Document?.Control is Control newContentControl)\n            {\n                newContentControl.SizeChanged += OnViewportSizeChanged;\n            }\n\n            _headerRects = null;\n\n            if (SaveScrollValueWhenContentUpdated)\n                _viewer.Offset = ofst;\n        }\n\n        private IMarkdownEngine2 _engine;\n        public IMarkdownEngineBase Engine\n        {\n            set\n            {\n                if (value is null)\n                    throw new ArgumentNullException(nameof(Engine));\n\n                if (value is IMarkdownEngine engine1)\n                    _engine = engine1.Upgrade();\n                else if (value is IMarkdownEngine2 engine)\n                    _engine = engine;\n                else\n                    throw new ArgumentException();\n\n                _engine.CascadeResources.SetParent(this);\n                _engine.UseResource = _useResource;\n                _engine.Plugins = _plugins;\n\n                if (AssetPathRoot is not null)\n                    _engine.AssetPathRoot = AssetPathRoot;\n            }\n            get => _engine;\n        }\n\n        private string? _AssetPathRoot;\n        public string? AssetPathRoot\n        {\n            set\n            {\n                if (value is not null)\n                {\n                    _engine.AssetPathRoot = _AssetPathRoot = value;\n                    UpdateMarkdown();\n                }\n            }\n            get => _AssetPathRoot;\n        }\n\n        public bool SaveScrollValueWhenContentUpdated\n        {\n            set { SetValue(SaveScrollValueWhenContentUpdatedProperty, value); }\n            get { return GetValue(SaveScrollValueWhenContentUpdatedProperty); }\n        }\n\n        public Vector ScrollValue\n        {\n            set { _viewer.Offset = value; }\n            get { return _viewer.Offset; }\n        }\n\n        private bool _selectionEnabled;\n        public bool SelectionEnabled\n        {\n            set\n            {\n                Focusable = _selectionEnabled = value;\n            }\n            get => _selectionEnabled;\n        }\n\n        [Content]\n        public string? HereMarkdown\n        {\n            get { return Markdown; }\n            set\n            {\n                if (String.IsNullOrEmpty(value))\n                {\n                    Markdown = value;\n                }\n                else\n                {\n                    // like PHP's flexible_heredoc_nowdoc_syntaxes,\n                    // The indentation of the closing tag dictates \n                    // the amount of whitespace to strip from each line \n                    var lines = Regex.Split(value, \"\\r\\n|\\r|\\n\", RegexOptions.Multiline);\n\n                    // count last line indent\n                    int lastIdtCnt = TextUtil.CountIndent(lines.Last());\n                    // count full indent\n                    int someIdtCnt = lines\n                        .Where(line => !String.IsNullOrWhiteSpace(line))\n                        .Select(line => TextUtil.CountIndent(line))\n                        .Min();\n\n                    var indentCount = Math.Max(lastIdtCnt, someIdtCnt);\n\n                    Markdown = String.Join(\n                        \"\\n\",\n                        lines\n                            // skip first blank line\n                            .Skip(String.IsNullOrWhiteSpace(lines[0]) ? 1 : 0)\n                            // strip indent\n                            .Select(line =>\n                            {\n                                var realIdx = 0;\n                                var viewIdx = 0;\n\n                                while (viewIdx < indentCount && realIdx < line.Length)\n                                {\n                                    var c = line[realIdx];\n                                    if (c == ' ')\n                                    {\n                                        realIdx += 1;\n                                        viewIdx += 1;\n                                    }\n                                    else if (c == '\\t')\n                                    {\n                                        realIdx += 1;\n                                        viewIdx = ((viewIdx >> 2) + 1) << 2;\n                                    }\n                                    else break;\n                                }\n\n                                return line.Substring(realIdx);\n                            })\n                        );\n                }\n            }\n        }\n\n        private string? _markdown;\n        public string? Markdown\n        {\n            get { return _markdown; }\n            set\n            {\n                if (SetAndRaise(MarkdownDirectProperty, ref _markdown, value))\n                {\n                    UpdateMarkdown();\n                }\n            }\n        }\n\n        private Uri? _source;\n        public Uri? Source\n        {\n            get { return _source; }\n            set\n            {\n                if (!SetAndRaise(SourceDirectProperty, ref _source, value))\n                    return;\n\n                if (value is null)\n                {\n                    _source = value;\n                    Markdown = null;\n                    return;\n                }\n\n                if (!value.IsAbsoluteUri)\n                    throw new ArgumentException(\"it is not absolute.\");\n\n                _source = value;\n\n                switch (_source.Scheme)\n                {\n                    case \"http\":\n                    case \"https\":\n                        using (var res = s_httpclient.GetAsync(_source).Result)\n                        using (var strm = res.Content.ReadAsStreamAsync().Result)\n                        using (var reader = new StreamReader(strm, true))\n                            Markdown = reader.ReadToEnd();\n                        break;\n\n                    case \"file\":\n                        using (var strm = File.OpenRead(_source.LocalPath))\n                        using (var reader = new StreamReader(strm, true))\n                            Markdown = reader.ReadToEnd();\n                        break;\n\n                    case \"avares\":\n                        using (var strm = AssetLoader.Open(_source))\n                        using (var reader = new StreamReader(strm, true))\n                            Markdown = reader.ReadToEnd();\n                        break;\n\n                    default:\n                        throw new ArgumentException($\"unsupport schema {_source.Scheme}\");\n                }\n\n                AssetPathRoot =\n                    value.Scheme == \"file\" ?\n                    value.LocalPath :\n                    value.AbsoluteUri;\n            }\n        }\n\n        private IStyle _markdownStyle;\n        public IStyle MarkdownStyle\n        {\n            get { return _markdownStyle; }\n            set\n            {\n                if (value is null)\n                    throw new ArgumentNullException(nameof(MarkdownStyle));\n\n                if (_markdownStyle != value)\n                {\n                    EditStyle(value);\n\n                    if (_markdownStyle is not null)\n                        Styles.Remove(_markdownStyle);\n\n                    Styles.Insert(0, value);\n\n                    TrySetupSelectionBrush(value);\n                    //ResetContent();\n                }\n\n                _markdownStyle = value;\n            }\n        }\n\n        private string? _markdownStyleName;\n        public string? MarkdownStyleName\n        {\n            get { return _markdownStyleName; }\n            set\n            {\n                _markdownStyleName = value;\n\n                if (_markdownStyleName is null)\n                {\n                    MarkdownStyle =\n                        nvl(ThemeDetector.IsFluentAvaloniaUsed) ? MdStyle.FluentAvalonia :\n                        nvl(ThemeDetector.IsFluentUsed) ? MdStyle.FluentTheme :\n                        nvl(ThemeDetector.IsSimpleUsed) ? MdStyle.SimpleTheme :\n                        MdStyle.Standard;\n                }\n                else if (_markdownStyleName == \"Empty\")\n                {\n                    MarkdownStyle = new Styles();\n                }\n                else\n                {\n                    var prop = typeof(MarkdownStyle).GetProperty(_markdownStyleName);\n                    if (prop is null) return;\n\n                    var propVal = prop.GetValue(null) as IStyle;\n                    if (propVal is null) return;\n\n                    MarkdownStyle = propVal;\n                }\n\n                static bool nvl(bool? vl) => vl.HasValue && vl.Value;\n            }\n        }\n\n        private MdAvPlugins _plugins;\n        public MdAvPlugins Plugins\n        {\n            get => _plugins;\n            set\n            {\n                _plugins = _engine.Plugins = value;\n                _setup = Plugins.Info;\n\n                EditStyle(MarkdownStyle);\n                UpdateMarkdown();\n            }\n        }\n\n        private bool _useResource;\n        public bool UseResource\n        {\n            get => _useResource;\n            set\n            {\n                _engine.UseResource = value;\n                _useResource = value;\n                UpdateMarkdown();\n            }\n        }\n\n        public IBrush? SelectionBrush\n        {\n            get => GetValue(SelectionBrushProperty);\n            set => SetValue(SelectionBrushProperty, value);\n        }\n\n        public Thickness Padding\n        {\n            get => _viewer.Padding;\n            set => _viewer.Padding = value;\n        }\n\n        internal IBrush ComputedSelectionBrush => SelectionBrush ?? _selectionBrush ?? Brushes.Cyan;\n\n        class HeaderRect\n        {\n            public Rect BaseBound { get; }\n            public HeaderElement Header { get; }\n\n            public HeaderRect(Rect bound, HeaderElement header)\n            {\n                BaseBound = bound;\n                Header = header;\n            }\n        }\n\n        class Wrapper : Control, ISelectionRenderHelper\n        {\n            private MarkdownScrollViewer _viewer;\n            private readonly Canvas _canvas;\n            private readonly Dictionary<Control, Rectangle> _rects;\n            private DocumentElement? _document;\n\n            public DocumentElement? Document\n            {\n                get => _document;\n                set\n                {\n                    if (_document is not null)\n                    {\n                        VisualChildren.Remove(_document.Control);\n                        LogicalChildren.Remove(_document.Control);\n                        _document.Helper = null;\n                        Clear();\n                    }\n\n                    _document = value;\n\n                    if (_document is not null)\n                    {\n                        VisualChildren.Insert(0, _document.Control);\n                        LogicalChildren.Insert(0, _document.Control);\n                        _document.Helper = this;\n                        InvalidateMeasure();\n                    }\n                }\n            }\n\n            public Wrapper(MarkdownScrollViewer v)\n            {\n                _viewer = v;\n                _canvas = new Canvas();\n                _canvas.PointerPressed += (s, e) => _document?.UnSelect();\n\n                _rects = new Dictionary<Control, Rectangle>();\n\n                VisualChildren.Add(_canvas);\n            }\n\n            public void Register(Control control)\n            {\n                if (!_rects.ContainsKey(control))\n                {\n                    var brush = _viewer.ComputedSelectionBrush;\n                    var bounds = GetRectInDoc(control);\n                    var rect = new Rectangle()\n                    {\n                        Width = bounds.Value.Width,\n                        Height = bounds.Value.Height,\n                        Fill = brush,\n                        Opacity = .5\n                    };\n\n                    Canvas.SetLeft(rect, bounds.Value.Left);\n                    Canvas.SetTop(rect, bounds.Value.Top);\n\n                    _rects[control] = rect;\n                    _canvas.Children.Add(rect);\n                }\n            }\n\n            public void Unregister(Control control)\n            {\n                if (_rects.TryGetValue(control, out var rct))\n                {\n                    _canvas.Children.Remove(rct);\n                    _rects.Remove(control);\n                }\n            }\n            public void Clear()\n            {\n                _canvas.Children.Clear();\n                _rects.Clear();\n            }\n\n            public void Restructure()\n            {\n                foreach (var rct in _rects)\n                {\n                    var boundN = GetRectInDoc(rct.Key);\n                    if (boundN.HasValue)\n                    {\n                        var bound = boundN.Value;\n                        rct.Value.Width = bound.Width;\n                        rct.Value.Height = bound.Height;\n                        Canvas.SetLeft(rct.Value, bound.Left);\n                        Canvas.SetTop(rct.Value, bound.Top);\n                    }\n                }\n            }\n\n            public Rect? GetRectInDoc(Control control)\n            {\n                if (!LayoutInformation.GetPreviousArrangeBounds(control).HasValue)\n                    return null;\n\n                double driftX = 0;\n                double driftY = 0;\n\n                StyledElement? c;\n                for (c = control.Parent;\n                        c is not null\n                        && c is Layoutable layoutable\n                        && !ReferenceEquals(_document.Control, layoutable);\n                        c = c.Parent)\n                {\n                    driftX += layoutable.Bounds.X;\n                    driftY += layoutable.Bounds.Y;\n                }\n\n                return new Rect(\n                            control.Bounds.X + driftX,\n                            control.Bounds.Y + driftY,\n                            control.Bounds.Width,\n                            control.Bounds.Height);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/MarkdownStyle.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\nusing Avalonia.Markup.Xaml.Styling;\nusing Avalonia.Styling;\nusing Markdown.Avalonia.StyleCollections;\nusing Markdown.Avalonia.Utils;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Reflection;\nusing System.Text;\n\nnamespace Markdown.Avalonia\n{\n    public static class MarkdownStyle\n    {\n        public static Styles Standard\n        {\n            get => new MarkdownStyleStandard();\n        }\n\n        [Obsolete(\"Use SimpleTheme instead\")]\n        public static Styles DefaultTheme\n        {\n            get => SimpleTheme;\n        }\n\n        public static Styles SimpleTheme\n        {\n            get => new MarkdownStyleDefaultTheme();\n        }\n\n        public static Styles FluentTheme\n        {\n            get => new MarkdownStyleFluentTheme();\n        }\n\n        public static Styles FluentAvalonia\n        {\n            get => new MarkdownStyleFluentAvalonia();\n        }\n\n        public static Styles GithubLike\n        {\n            get => new MarkdownStyleGithubLike();\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/MdAvPlugins.cs",
    "content": "﻿using Avalonia.Metadata;\nusing Markdown.Avalonia.Plugins;\nusing Markdown.Avalonia.Utils;\nusing Microsoft.VisualBasic;\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Reflection;\nusing System.Windows.Input;\n\nnamespace Markdown.Avalonia\n{\n    public class MdAvPlugins\n    {\n        private SetupInfo? _cache;\n        private IPathResolver? _pathResolver;\n        private IContainerBlockHandler? _containerBlockHandler;\n        private ICommand? _hyperlinkCommand;\n\n        [Content]\n        public ObservableCollection<IMdAvPlugin> Plugins { get; }\n\n        public IPathResolver? PathResolver\n        {\n            get => _pathResolver; set\n            {\n                _cache = null;\n                _pathResolver = value;\n            }\n        }\n        public IContainerBlockHandler? ContainerBlockHandler\n        {\n            get => _containerBlockHandler;\n            set\n            {\n                _cache = null;\n                _containerBlockHandler = value;\n            }\n        }\n        public ICommand? HyperlinkCommand\n        {\n            get => _hyperlinkCommand;\n            set\n            {\n                _cache = null;\n                _hyperlinkCommand = value;\n            }\n        }\n\n        public SetupInfo Info => _cache ??= CreateInfo();\n\n        public MdAvPlugins()\n        {\n            Plugins = new ObservableCollection<IMdAvPlugin>();\n            Plugins.CollectionChanged += (s, e) => _cache = null;\n        }\n\n        protected virtual SetupInfo CreateInfo()\n        {\n            var setupInf = new SetupInfo();\n            bool hasBuiltin = false;\n\n            (\n                IEnumerable<IMdAvPlugin> orderedPlugin,\n                Dictionary<Type, IMdAvPlugin> dic\n            ) = ComputeOrderedPlugins();\n\n            foreach (var plugin in orderedPlugin)\n            {\n                if (plugin is IMdAvPluginRequestAnother another)\n                {\n                    another.Inject(another.DependsOn.Select(dep => dic[dep]));\n                }\n\n                plugin.Setup(setupInf);\n\n                hasBuiltin |= plugin.GetType().FullName == SetupInfo.BuiltinTpNm;\n            }\n\n            if (!hasBuiltin)\n                setupInf.Builtin();\n\n            if (PathResolver is not null)\n                setupInf.SetOnce(PathResolver);\n\n            if (ContainerBlockHandler is not null)\n                setupInf.SetOnce(ContainerBlockHandler);\n\n            if (HyperlinkCommand is not null)\n                setupInf.SetOnce(HyperlinkCommand);\n\n            setupInf.Freeze();\n\n            return setupInf;\n        }\n\n\n\n        protected (IEnumerable<IMdAvPlugin>, Dictionary<Type, IMdAvPlugin>) ComputeOrderedPlugins()\n        {\n            var plugins = new List<IMdAvPlugin>(Plugins.Count);\n            var dic = Plugins.ToDictionary(p => p.GetType(), p => p);\n\n            foreach (var plugin in Plugins)\n            {\n                if (plugin is IMdAvPluginRequestAnother anoth)\n                {\n                    ComputeDepneds(anoth, plugins, dic);\n                }\n                plugins.Add(plugin);\n            }\n\n            plugins.Sort(new PluginComparer(dic));\n\n            return (plugins, dic);\n\n\n            void ComputeDepneds(IMdAvPluginRequestAnother anoth, List<IMdAvPlugin> plugins, Dictionary<Type, IMdAvPlugin> dic)\n            {\n                foreach (var dep in anoth.DependsOn)\n                {\n                    if (dic.ContainsKey(dep))\n                        continue;\n\n                    var depPlugin = Activator.CreateInstance(dep) as IMdAvPlugin;\n\n                    if (depPlugin is null)\n                        throw new NullReferenceException(\"Failed to create an instance of \" + dep);\n\n                    if (depPlugin is IMdAvPluginRequestAnother anothanoth)\n                        ComputeDepneds(anothanoth, plugins, dic);\n\n                    plugins.Add(depPlugin);\n                    dic[dep] = depPlugin;\n                }\n            }\n\n        }\n\n\n        class PluginComparer : IComparer<IMdAvPlugin>\n        {\n            private Dictionary<Type, IMdAvPlugin> _plugins;\n\n            public PluginComparer(Dictionary<Type, IMdAvPlugin> plugins)\n            {\n                _plugins = plugins;\n            }\n\n            public int Compare(IMdAvPlugin? x, IMdAvPlugin? y)\n            {\n                if (x is IMdAvPluginRequestAnother xanoth && y is IMdAvPluginRequestAnother yanoth)\n                {\n                    return\n                        // dose x request y?\n                        ComputeRequest(xanoth, yanoth) ? -1 :\n                        // dose y request x?\n                        ComputeRequest(yanoth, xanoth) ? 1 :\n                        0;\n                }\n\n                if (x is not IMdAvPluginRequestAnother && y is not IMdAvPluginRequestAnother)\n                    return 0;\n\n                if (x is IMdAvPluginRequestAnother && y is not IMdAvPluginRequestAnother)\n                    return 1;\n\n                if (x is not IMdAvPluginRequestAnother && y is IMdAvPluginRequestAnother)\n                    return -1;\n\n                throw new NotImplementedException();\n            }\n\n            private bool ComputeRequest(IMdAvPluginRequestAnother x, IMdAvPluginRequestAnother y)\n            {\n                foreach (var depType in x.DependsOn)\n                {\n                    var depPlugin = _plugins[depType];\n\n                    if (ReferenceEquals(depPlugin, y))\n                        return true;\n\n                    if (depPlugin is IMdAvPluginRequestAnother depPluginAnoth && ComputeRequest(depPluginAnoth, y))\n                        return true;\n                }\n\n                return false;\n            }\n\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Parsers/BlockParser.cs",
    "content": "﻿using Avalonia.Controls;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text.RegularExpressions;\n\nnamespace Markdown.Avalonia.Parsers\n{\n    public delegate Control? ParseWithPositionChange(string text, Match match, out int parseTextBegin, out int parseTextEnd);\n\n    public abstract class BlockParser\n    {\n        public Regex Pattern { get; }\n\n        public string Name { get; }\n\n        public BlockParser(Regex pattern, string name)\n        {\n            Pattern = pattern;\n            Name = name;\n        }\n\n        public abstract IEnumerable<Control>? Convert(\n            string text, Match firstMatch, ParseStatus status,\n            IMarkdownEngine engine,\n            out int parseTextBegin, out int parseTextEnd);\n\n        public static BlockParser New(Regex pattern, string name, Func<Match, Control?> v1)\n            => new Single(pattern, name, v1);\n\n        public static BlockParser New(Regex pattern, string name, Func<Match, ParseStatus, Control?> v2)\n            => new Single2(pattern, name, v2);\n\n        public static BlockParser New(Regex pattern, string name, Func<Match, IEnumerable<Control>?> v2)\n            => new Multi(pattern, name, v2);\n\n        public static BlockParser New(Regex pattern, string name, Func<Match, ParseStatus, IEnumerable<Control>?> v2)\n            => new Multi2(pattern, name, v2);\n\n        public static BlockParser New(Regex pattern, string name, ParseWithPositionChange v2)\n            => new ParsePosChange(pattern, name, v2);\n\n        abstract class Wrapper : BlockParser\n        {\n            public Wrapper(Regex pattern, string name) : base(pattern, name)\n            {\n            }\n\n            public override IEnumerable<Control>? Convert(\n                string text, Match firstMatch, ParseStatus status,\n                IMarkdownEngine engine,\n                out int parseTextBegin, out int parseTextEnd)\n            {\n                parseTextBegin = firstMatch.Index;\n                parseTextEnd = parseTextBegin + firstMatch.Length;\n                return Convert(firstMatch, status);\n            }\n\n            public abstract IEnumerable<Control>? Convert(Match match, ParseStatus status);\n        }\n\n        sealed class Single : Wrapper\n        {\n            private readonly Func<Match, Control?> converter;\n\n            public Single(Regex pattern, string name, Func<Match, Control?> converter) : base(pattern, name)\n            {\n                this.converter = converter;\n            }\n\n            public override IEnumerable<Control>? Convert(Match match, ParseStatus status)\n            {\n                return converter(match) is Control ctrl ? new[] { ctrl } : null;\n            }\n        }\n\n        sealed class Single2 : Wrapper\n        {\n            private readonly Func<Match, ParseStatus, Control?> converter;\n\n            public Single2(Regex pattern, string name, Func<Match, ParseStatus, Control?> converter) : base(pattern, name)\n            {\n                this.converter = converter;\n            }\n\n            public override IEnumerable<Control>? Convert(Match match, ParseStatus status)\n            {\n                return converter(match, status) is Control ctrl ? new[] { ctrl } : null;\n            }\n        }\n\n        sealed class Multi : Wrapper\n        {\n            private readonly Func<Match, IEnumerable<Control>?> converter;\n\n            public Multi(Regex pattern, string name, Func<Match, IEnumerable<Control>?> converter) : base(pattern, name)\n            {\n                this.converter = converter;\n            }\n\n            public override IEnumerable<Control>? Convert(Match match, ParseStatus status)\n                => converter(match);\n        }\n\n        sealed class Multi2 : Wrapper\n        {\n            private readonly Func<Match, ParseStatus, IEnumerable<Control>?> converter;\n\n            public Multi2(Regex pattern, string name, Func<Match, ParseStatus, IEnumerable<Control>?> converter) : base(pattern, name)\n            {\n                this.converter = converter;\n            }\n\n            public override IEnumerable<Control>? Convert(Match match, ParseStatus status)\n                => converter(match, status);\n        }\n\n        sealed class ParsePosChange : BlockParser\n        {\n            private ParseWithPositionChange converter;\n\n            public ParsePosChange(Regex pattern, string name, ParseWithPositionChange converter) : base(pattern, name)\n            {\n                this.converter = converter;\n            }\n\n            public override IEnumerable<Control>? Convert(string text, Match firstMatch, ParseStatus status, IMarkdownEngine engine, out int parseTextBegin, out int parseTextEnd)\n            {\n                return converter(text, firstMatch, out parseTextBegin, out parseTextEnd) is Control ctrl ?\n                    new[] { ctrl } : null;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Parsers/BlockParser2.cs",
    "content": "﻿using Avalonia.Controls;\nusing ColorDocument.Avalonia;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text.RegularExpressions;\n\nnamespace Markdown.Avalonia.Parsers\n{\n    public abstract class BlockParser2 : BlockParser\n    {\n        public BlockParser2(Regex pattern, string name) : base(pattern, name)\n        {\n        }\n\n        public abstract IEnumerable<DocumentElement>? Convert2(string text, Match firstMatch, ParseStatus status, IMarkdownEngine2 engine, out int parseTextBegin, out int parseTextEnd);\n\n        public override IEnumerable<Control>? Convert(string text, Match firstMatch, ParseStatus status, IMarkdownEngine engine, out int parseTextBegin, out int parseTextEnd)\n        {\n            if (Convert2(text, firstMatch, status, engine.Upgrade(), out parseTextBegin, out parseTextEnd) is { } docs)\n            {\n                return docs.Select(d => d.Control);\n            }\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Parsers/BlockParserExt.cs",
    "content": "﻿using Avalonia.Controls;\nusing ColorDocument.Avalonia;\nusing ColorDocument.Avalonia.DocumentElements;\nusing ColorTextBlock.Avalonia;\nusing Markdown.Avalonia.Utils;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Runtime.CompilerServices;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\nusing System.Windows.Input;\n\nnamespace Markdown.Avalonia.Parsers\n{\n    public static class BlockParserExt\n    {\n        public static BlockParser2 Upgrade(this BlockParser parser)\n        {\n            return parser is BlockParser2 parser2 ? parser2 : new BlockParserUpg(parser);\n        }\n\n        class BlockParserUpg : BlockParser2\n        {\n            private BlockParser _parser;\n\n            public BlockParserUpg(BlockParser parser) : base(parser.Pattern, parser.Name)\n            {\n                _parser = parser;\n            }\n\n            public override IEnumerable<DocumentElement>? Convert2(string text, Match firstMatch, ParseStatus status, IMarkdownEngine2 engine2, out int parseTextBegin, out int parseTextEnd)\n            {\n                IMarkdownEngine engine = engine2 is IMarkdownEngine e ? e : new MarkdownEngineDng(engine2);\n\n                var rtn = _parser.Convert(text, firstMatch, status, engine, out parseTextBegin, out parseTextEnd);\n                return rtn.Select(c => new UnBlockElement(c));\n            }\n        }\n\n        class MarkdownEngineDng : IMarkdownEngine\n        {\n            private IMarkdownEngine2 _engine;\n\n            public string AssetPathRoot { get => _engine.AssetPathRoot; set => _engine.AssetPathRoot = value; }\n            public ICommand? HyperlinkCommand { get => _engine.HyperlinkCommand; set => _engine.HyperlinkCommand = value; }\n            public IBitmapLoader? BitmapLoader { \n                get => throw new NotImplementedException();\n                set => throw new NotImplementedException(); }\n            public IContainerBlockHandler? ContainerBlockHandler { get => _engine.ContainerBlockHandler; set => _engine.ContainerBlockHandler = value; }\n            public MdAvPlugins Plugins { get => _engine.Plugins; set => _engine.Plugins = value; }\n            public bool UseResource { get => _engine.UseResource; set => _engine.UseResource = value; }\n            public CascadeDictionary CascadeResources => _engine.CascadeResources;\n            public IResourceDictionary Resources { get => _engine.Resources; set => _engine.Resources = value; }\n\n            public MarkdownEngineDng(IMarkdownEngine2 engine2)\n            {\n                _engine = engine2;\n            }\n\n            public IEnumerable<Control> RunBlockGamut(string? text, ParseStatus status)\n            {\n                if (text is null)\n                {\n                    throw new ArgumentNullException(nameof(text));\n                }\n\n                return _engine.ParseGamutElement(TextUtil.Normalize(text), status).Select(e => e.Control);\n            }\n\n            public IEnumerable<CInline> RunSpanGamut(string? text)\n            {\n                if (text is null)\n                {\n                    throw new ArgumentNullException(nameof(text));\n                }\n\n                return _engine.ParseGamutInline(TextUtil.Normalize(text));\n            }\n\n            public Control Transform(string text)\n            {\n                return _engine.Transform(text);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Parsers/Builtin/AbstractHeaderParser.cs",
    "content": "﻿using ColorDocument.Avalonia;\nusing ColorDocument.Avalonia.DocumentElements;\nusing ColorTextBlock.Avalonia;\nusing System.Collections.Generic;\nusing System.Text.RegularExpressions;\n\nnamespace Markdown.Avalonia.Parsers.Builtin\n{\n    internal abstract class AbstractHeaderParser : BlockParser2\n    {\n        protected AbstractHeaderParser(Regex pattern, string name) : base(pattern, name)\n        {\n        }\n\n        protected IEnumerable<DocumentElement> Create(int level, string header, IMarkdownEngine2 engine)\n        {\n            var inlines = engine.ParseGamutInline(header.Trim());\n            var element = new HeaderElement(inlines, level);\n            return new[] { element };\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Parsers/Builtin/AbstractHorizontalParser.cs",
    "content": "﻿using Avalonia.Controls;\nusing ColorDocument.Avalonia;\nusing ColorDocument.Avalonia.DocumentElements;\nusing Markdown.Avalonia.Controls;\nusing System.Collections.Generic;\nusing System.Text.RegularExpressions;\n\nnamespace Markdown.Avalonia.Parsers.Builtin\n{\n    internal abstract class AbstractHorizontalParser : BlockParser2\n    {\n        protected AbstractHorizontalParser(Regex pattern) : base(pattern, \"RuleEvaluator\")\n        {\n        }\n\n        public override IEnumerable<DocumentElement>? Convert2(string text, Match firstMatch, ParseStatus status, IMarkdownEngine2 engine, out int parseTextBegin, out int parseTextEnd)\n        {\n            parseTextBegin = firstMatch.Index;\n            parseTextEnd = parseTextBegin + firstMatch.Length;\n\n            return new[] { new UnBlockElement(RuleEvaluator(firstMatch)) };\n        }\n\n        public override IEnumerable<Control>? Convert(string text, Match firstMatch, ParseStatus status, IMarkdownEngine engine, out int parseTextBegin, out int parseTextEnd)\n        {\n            parseTextBegin = firstMatch.Index;\n            parseTextEnd = parseTextBegin + firstMatch.Length;\n\n            return new[] { RuleEvaluator(firstMatch) };\n        }\n\n        private static Rule RuleEvaluator(Match match)\n        {\n            return match.Groups[1].Value switch\n            {\n                \"=\" => new Rule(RuleType.TwoLines),\n                \"*\" => new Rule(RuleType.Bold),\n                \"_\" => new Rule(RuleType.BoldWithSingle),\n                \"-\" => new Rule(RuleType.Single),\n                _ => new Rule(RuleType.Single),\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Parsers/Builtin/AbstractListParser.cs",
    "content": "﻿using ColorDocument.Avalonia;\nusing ColorDocument.Avalonia.DocumentElements;\nusing Markdown.Avalonia.Utils;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\n\nnamespace Markdown.Avalonia.Parsers.Builtin\n{\n    internal abstract class AbstractListParser : BlockParser2\n    {\n        // Unordered List\n        private const string _markerUL_Disc = @\"[*]\";\n        private const string _markerUL_Box = @\"[+]\";\n        private const string _markerUL_Circle = @\"[-]\";\n        private const string _markerUL_Square = @\"[=]\";\n\n        // Ordered List\n        private const string _markerOL_Number = @\"\\d+[.]\";\n        private const string _markerOL_LetterLower = @\"[a-c][.]\";\n        private const string _markerOL_LetterUpper = @\"[A-C][.]\";\n        private const string _markerOL_RomanLower = @\"[cdilmvx]+[,]\";\n        private const string _markerOL_RomanUpper = @\"[CDILMVX]+[,]\";\n\n        /// <summary>\n        /// Maximum number of levels a single list can have.\n        /// In other words, _listDepth - 1 is the maximum number of nested lists.\n        /// </summary>\n        private const int _listDepth = 4;\n\n\n        private static readonly string _firstListLine = @\"\n              ^\n              (?![ ]{{0,3}}(?<hrm>[-=*_])([ ]{{0,2}}\\k<hrm>){{2,}}[ ]*\\n) # ignore horizontal syntax\n              (?<indent>[ ]{{0,{2}}})                                     # indent\n              (?<marker>{0})                                              # first list item marker\n              [ ]+\n              (?:[^ \\n]|\\n)\n            \";\n\n        private static readonly string _ruleLine = @\"\n            \\G\n            [ ]{{0,{0}}}\n            (?<hrm>[-=*_])([ ]{{0,2}}\\k<hrm>){{2,}}[ ]*\\n\";\n\n        private static readonly string _listLine = @\"\n            \\G\n            (?<indent>[ ]{{0,{0}}})\n            {1}                                                            # list marker\n            [ ]+\n            (?<content>[^\\n]*)                                         # content\n            \";\n\n        private static readonly Regex _startQuoteOrHeader = new(@\"\n            \\G(\\#{1,6}[ ]|>|```)\",\n            RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled);\n\n        protected AbstractListParser(Regex pattern) : base(pattern, \"ListEvaluator\")\n        {\n        }\n\n        protected static Regex CreateWholeListPattern(\n                string firstListMarkerPattern,\n                string subseqListMarkerPattern)\n        {\n            var format = string.Format(_firstListLine, firstListMarkerPattern, subseqListMarkerPattern, _listDepth - 1);\n            return new Regex(format, RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled);\n        }\n\n        protected ListBlockElement ListEvalutor(\n            string text,\n            Match match,\n            string alllistMarkersPattern,\n            IMarkdownEngine2 engine,\n            out int parseTextBegin, out int parseTextEnd\n            )\n        {\n            parseTextBegin = match.Index;\n\n            // Check text marker style.\n            (TextMarkerStyle textMarker, string markerPattern, int indentAppending)\n                = GetTextMarkerStyle(match.Groups[\"marker\"].Value);\n\n            // count indent from first marker with indent\n            int countIndent = match.Groups[\"indent\"].Value.Length;\n\n            var ruleLinePtn = new Regex(\n                String.Format(_ruleLine, countIndent + indentAppending - 1),\n                RegexOptions.IgnorePatternWhitespace);\n\n            var listLinePtn = new Regex(\n                String.Format(_listLine, countIndent + indentAppending - 1, markerPattern),\n                RegexOptions.IgnorePatternWhitespace);\n\n            var allListLinePtn = new Regex(\n                String.Format(_listLine, countIndent + indentAppending - 1, alllistMarkersPattern),\n                RegexOptions.IgnorePatternWhitespace);\n\n            int caret = parseTextBegin;\n\n            var listItems = new List<ListItemElement>();\n\n            var hasEmptyLine = false;\n            var listBuilder = new StringBuilder();\n            while (caret < text.Length)\n            {\n                // is it blank line?\n                if (text[caret] == '\\n')\n                {\n                    listBuilder.Append('\\n');\n                    hasEmptyLine = true;\n                    ++caret;\n                }\n                // is it horizontal line?\n                else if (ruleLinePtn.IsMatch(text, caret))\n                {\n                    break;\n                }\n                // is it header or blockquote?\n                else if (_startQuoteOrHeader.IsMatch(text, caret))\n                {\n                    break;\n                }\n                else\n                {\n                    // Dose it have list marker?\n                    var listLineMch = listLinePtn.Match(text, caret);\n                    if (listLineMch.Success)\n                    {\n                        // next list item?\n                        if (listBuilder.Length > 0)\n                        {\n                            TrimEnd(listBuilder);\n                            var elements = engine.ParseGamutElement(listBuilder.ToString(), new ParseStatus(false));\n                            listItems.Add(new ListItemElement(elements));\n                            listBuilder.Length = 0;\n                        }\n\n                        listBuilder.Append(listLineMch.Groups[\"content\"].Value);\n                        caret += listLineMch.Length;\n\n                        if (caret < text.Length && text[caret] == '\\n')\n                        {\n                            ++caret;\n                            listBuilder.Append('\\n');\n                        }\n\n                        hasEmptyLine = false;\n                    }\n                    // Dose it have other list marker?\n                    else if (allListLinePtn.IsMatch(text, caret))\n                    {\n                        break;\n                    }\n                    else\n                    {\n                        var st = caret;\n                        if (!MoveIndent(text, countIndent + indentAppending, ref st))\n                        {\n                            if (hasEmptyLine) break;\n                        }\n\n                        caret = st;\n                        if (caret < text.Length)\n                        {\n                            MoveLineEnd(text, ref caret);\n                            listBuilder.Append(text, st, caret - st);\n\n                            if (caret < text.Length && text[caret] == '\\n')\n                            {\n                                ++caret;\n                                listBuilder.Append('\\n');\n                            }\n                        }\n                    }\n                }\n            }\n\n            if (listBuilder.Length > 0)\n            {\n                TrimEnd(listBuilder);\n                var elements = engine.ParseGamutElement(listBuilder.ToString(), new ParseStatus(false));\n                listItems.Add(new ListItemElement(elements)); ;\n            }\n\n            parseTextEnd = caret;\n            return new ListBlockElement(textMarker.Change(), listItems);\n        }\n\n        private static void TrimEnd(StringBuilder text)\n        {\n            if (text.Length < 2)\n                return;\n\n            if (text[text.Length - 1] != '\\n')\n                return;\n\n            int len = text.Length;\n            while (len >= 2)\n            {\n                if (text[len - 2] == '\\n')\n                    len--;\n                else\n                    break;\n            }\n\n            text.Length = len;\n        }\n\n        private static bool MoveIndent(string text, int count, ref int caret)\n        {\n            for (var i = 0; i < count; ++i)\n            {\n                if (caret == text.Length)\n                    return false;\n\n                if (text[caret] != ' ')\n                    return false;\n\n                ++caret;\n            }\n\n            return true;\n        }\n\n        private static bool MoveLineEnd(string text, ref int caret)\n        {\n            for (; caret < text.Length; ++caret)\n            {\n                if (text[caret] == '\\n')\n                {\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n\n\n        /// <summary>\n        /// Get the text marker style based on a specific regex.\n        /// </summary>\n        /// <param name=\"markerText\">list maker (eg. * + 1. a. </param>\n        /// <returns>\n        ///     1; return Type. \n        ///     2: match regex pattern\n        ///     3: char length of listmaker\n        /// </returns>\n        private static (TextMarkerStyle, string, int) GetTextMarkerStyle(string markerText)\n        {\n            if (Regex.IsMatch(markerText, _markerUL_Disc))\n            {\n                return (TextMarkerStyle.Disc, _markerUL_Disc, 2);\n            }\n            else if (Regex.IsMatch(markerText, _markerUL_Box))\n            {\n                return (TextMarkerStyle.Box, _markerUL_Box, 2);\n            }\n            else if (Regex.IsMatch(markerText, _markerUL_Circle))\n            {\n                return (TextMarkerStyle.Circle, _markerUL_Circle, 2);\n            }\n            else if (Regex.IsMatch(markerText, _markerUL_Square))\n            {\n                return (TextMarkerStyle.Square, _markerUL_Square, 2);\n            }\n            else if (Regex.IsMatch(markerText, _markerOL_Number))\n            {\n                return (TextMarkerStyle.Decimal, _markerOL_Number, 3);\n            }\n            else if (Regex.IsMatch(markerText, _markerOL_LetterLower))\n            {\n                return (TextMarkerStyle.LowerLatin, _markerOL_LetterLower, 3);\n            }\n            else if (Regex.IsMatch(markerText, _markerOL_LetterUpper))\n            {\n                return (TextMarkerStyle.UpperLatin, _markerOL_LetterUpper, 3);\n            }\n            else if (Regex.IsMatch(markerText, _markerOL_RomanLower))\n            {\n                return (TextMarkerStyle.LowerRoman, _markerOL_RomanLower, 3);\n            }\n            else if (Regex.IsMatch(markerText, _markerOL_RomanUpper))\n            {\n                return (TextMarkerStyle.UpperRoman, _markerOL_RomanUpper, 3);\n            }\n\n            Helper.ThrowInvalidOperation(\"sorry library manager forget to modify about listmerker.\");\n            // dummy\n            return (TextMarkerStyle.Disc, _markerUL_Disc, 2);\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Parsers/Builtin/AtxHeaderParser.cs",
    "content": "﻿using ColorDocument.Avalonia;\nusing System.Collections.Generic;\nusing System.Text.RegularExpressions;\n\nnamespace Markdown.Avalonia.Parsers.Builtin\n{\n    internal class AtxHeaderParser : AbstractHeaderParser\n    {\n        /// <summary>\n        /// # Header 1  \n        /// ## Header 2  \n        /// ## Header 2 with closing hashes ##  \n        /// ...  \n        /// ###### Header 6  \n        /// </remarks>\n        private static readonly Regex _headerAtx = new(@\"\n                ^(\\#{1,6})  # $1 = string of #'s\n                [ ]*\n                (.+?)       # $2 = Header text\n                [ ]*\n                \\#*         # optional closing #'s (not counted)\n                \\n+\",\n                RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled);\n\n        public AtxHeaderParser() : base(_headerAtx, \"AtxHeaderEvaluator\")\n        {\n        }\n\n        public override IEnumerable<DocumentElement>? Convert2(string text, Match firstMatch, ParseStatus status, IMarkdownEngine2 engine, out int parseTextBegin, out int parseTextEnd)\n        {\n            parseTextBegin = firstMatch.Index;\n            parseTextEnd = parseTextBegin + firstMatch.Length;\n\n            string header = firstMatch.Groups[2].Value;\n            int level = firstMatch.Groups[1].Value.Length;\n\n            return Create(level, header, engine);\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Parsers/Builtin/BlockquotesParser.cs",
    "content": "﻿using ColorDocument.Avalonia;\nusing ColorDocument.Avalonia.DocumentElements;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\n\nnamespace Markdown.Avalonia.Parsers.Builtin\n{\n    internal class BlockquotesParser : BlockParser2\n    {\n        private static readonly Regex _blockquoteFirst = new(@\"\n            ^\n            ([>].*)\n            (\\n[>].*)*\n            [\\n]*\n            \", RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled);\n\n        private bool _supportTextAlignment;\n\n        public BlockquotesParser(bool supportTextAlignment) : base(_blockquoteFirst, \"BlockquotesEvaluator\")\n        {\n            _supportTextAlignment = supportTextAlignment;\n        }\n\n        public override IEnumerable<DocumentElement>? Convert2(string text, Match firstMatch, ParseStatus status, IMarkdownEngine2 engine, out int parseTextBegin, out int parseTextEnd)\n        {\n            parseTextBegin = firstMatch.Index;\n            parseTextEnd = firstMatch.Index + firstMatch.Length;\n\n            // trim '>'\n            var trimmedTxt = string.Join(\n                    \"\\n\",\n                    firstMatch.Value.Trim().Split('\\n')\n                        .Select(txt =>\n                        {\n                            if (txt.Length <= 1) return string.Empty;\n                            var trimmed = txt.Substring(1);\n                            if (trimmed.FirstOrDefault() == ' ') trimmed = trimmed.Substring(1);\n                            return trimmed;\n                        })\n                        .ToArray()\n            );\n\n            var newStatus = new ParseStatus(true & _supportTextAlignment);\n            var blocks = engine.ParseGamutElement(trimmedTxt + \"\\n\", newStatus);\n\n            return new[] { new BlockquoteElement(blocks) };\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Parsers/Builtin/CommonHorizontalParser.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\n\nnamespace Markdown.Avalonia.Parsers.Builtin\n{\n    internal class CommonHorizontalParser : AbstractHorizontalParser\n    {\n        private static readonly Regex _horizontalCommonRules = new(@\"\n                ^[ ]{0,3}                   # Leading space\n                    ([-*_])                 # $1: First marker ([markers])\n                    (?>                     # Repeated marker group\n                        [ ]{0,2}            # Zero, one, or two spaces.\n                        \\1                  # Marker character\n                    ){2,}                   # Group repeated at least twice\n                    [ ]*                    # Trailing spaces\n                    \\n                      # End of line.\n                \", RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled);\n\n        public CommonHorizontalParser() : base(_horizontalCommonRules)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Parsers/Builtin/CommonListParser.cs",
    "content": "﻿using ColorDocument.Avalonia;\nusing System.Collections.Generic;\nusing System.Text.RegularExpressions;\n\nnamespace Markdown.Avalonia.Parsers.Builtin\n{\n    internal class CommonListParser : AbstractListParser\n    {\n        private const string _commonListMaker = @\"(?:[*+-]|\\d+[.])\";\n\n        private static readonly Regex _commonListNested = CreateWholeListPattern(_commonListMaker, _commonListMaker);\n\n        public CommonListParser() : base(_commonListNested)\n        {\n        }\n\n        public override IEnumerable<DocumentElement>? Convert2(\n            string text, Match firstMatch,\n            ParseStatus status,\n            IMarkdownEngine2 engine,\n            out int parseTextBegin, out int parseTextEnd)\n        {\n            return new DocumentElement[] {\n                ListEvalutor(text, firstMatch, _commonListMaker, engine, out parseTextBegin, out parseTextEnd)\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Parsers/Builtin/ContainerBlockParser.cs",
    "content": "﻿using Avalonia.Controls;\nusing ColorDocument.Avalonia;\nusing ColorDocument.Avalonia.DocumentElements;\nusing System.Collections.Generic;\nusing System.Text.RegularExpressions;\n\nnamespace Markdown.Avalonia.Parsers.Builtin\n{\n    internal class ContainerBlockParser : BlockParser2\n    {\n        private static readonly Regex _containerBlockFirst = new(@\"\n                    ^          # Character before opening\n                    [ ]{0,3}\n                    (:{3,})          # $1 = Opening run of `\n                    ([^\\n`]*)        # $2 = The container type\n                    \\n\n                    ((.|\\n)+?)       # $3 = The code block\n                    \\n[ ]*\n                    \\1\n                    (?!:)[\\n]+\", RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline | RegexOptions.Compiled);\n\n\n        public ContainerBlockParser() : base(_containerBlockFirst, \"ContainerBlockEvaluator\")\n        {\n        }\n\n        public override IEnumerable<DocumentElement>? Convert2(string text, Match firstMatch, ParseStatus status, IMarkdownEngine2 engine, out int parseTextBegin, out int parseTextEnd)\n        {\n            parseTextBegin = firstMatch.Index;\n            parseTextEnd = parseTextBegin + firstMatch.Length;\n\n            var name = firstMatch.Groups[2].Value;\n            var content = firstMatch.Groups[3].Value;\n\n            var gen = engine.ContainerBlockHandler;\n\n            if (gen?.ProvideControl(engine.AssetPathRoot, name, content) is { } container)\n            {\n                container.Classes.Add(Markdown.ContainerBlockClass);\n                return new[] { new UnBlockElement(container) };\n            }\n            else\n            {\n                Border border = FencedCodeBlockParser.Create(firstMatch.Value);\n                border.Classes.Add(Markdown.NoContainerClass);\n                return new[] { new UnBlockElement(border) };\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Parsers/Builtin/ExtHorizontalParser.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\n\nnamespace Markdown.Avalonia.Parsers.Builtin\n{\n    internal class ExtHorizontalParser : AbstractHorizontalParser\n    {\n        /// <summary>\n        /// Turn Markdown horizontal rules into HTML hr tags\n        /// </summary>\n        /// <remarks>\n        /// ***  \n        /// * * *  \n        /// ---\n        /// - - -\n        /// </remarks>\n        private static readonly Regex _horizontalRules = new(@\"\n                ^[ ]{0,3}                   # Leading space\n                    ([-=*_])                # $1: First marker ([markers])\n                    (?>                     # Repeated marker group\n                        [ ]{0,2}            # Zero, one, or two spaces.\n                        \\1                  # Marker character\n                    ){2,}                   # Group repeated at least twice\n                    [ ]*                    # Trailing spaces\n                    \\n                      # End of line.\n                \", RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled);\n\n        public ExtHorizontalParser() : base(_horizontalRules)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Parsers/Builtin/ExtListParser.cs",
    "content": "﻿using ColorDocument.Avalonia;\nusing System.Collections.Generic;\nusing System.Text.RegularExpressions;\n\nnamespace Markdown.Avalonia.Parsers.Builtin\n{\n    internal class ExtListParser : AbstractListParser\n    {\n        // `alphabet order` and `roman number` must start 'a.'～'c.' and 'i,'～'iii,'.\n        // This restrict is avoid to treat \"Yes,\" as list marker.\n        private const string _extFirstListMaker = @\"(?:[*+=-]|\\d+[.]|[a-c][.]|[i]{1,3}[,]|[A-C][.]|[I]{1,3}[,])\";\n        private const string _extSubseqListMaker = @\"(?:[*+=-]|\\d+[.]|[a-c][.]|[cdilmvx]+[,]|[A-C][.]|[CDILMVX]+[,])\";\n\n\n        private static readonly Regex _extListNested = CreateWholeListPattern(_extFirstListMaker, _extSubseqListMaker);\n\n        public ExtListParser() : base(_extListNested)\n        {\n        }\n\n        public override IEnumerable<DocumentElement>? Convert2(\n            string text, Match firstMatch,\n            ParseStatus status,\n            IMarkdownEngine2 engine,\n            out int parseTextBegin, out int parseTextEnd)\n        {\n            return new DocumentElement[] {\n                ListEvalutor(text, firstMatch, _extSubseqListMaker, engine, out parseTextBegin, out parseTextEnd)\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Parsers/Builtin/FencedCodeBlockParser.cs",
    "content": "﻿using Avalonia.Controls.Primitives;\nusing Avalonia.Controls;\nusing Avalonia.Media;\nusing System.Collections.Generic;\nusing System.Text.RegularExpressions;\nusing ColorDocument.Avalonia;\nusing ColorDocument.Avalonia.DocumentElements;\n\nnamespace Markdown.Avalonia.Parsers.Builtin\n{\n    internal class FencedCodeBlockParser : BlockParser2\n    {\n        private static readonly Regex _codeBlockBegin = new(@\"\n                    ^          # Character before opening\n                    [ ]{0,3}\n                    (`{3,})          # $1 = Opening run of `\n                    ([^\\n`]*)        # $2 = The code lang\n                    \\n\", RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline | RegexOptions.Compiled);\n\n        private bool _enablePreRenderingCodeBlock;\n\n        public FencedCodeBlockParser(bool enablePreRenderingCodeBlock) : base(_codeBlockBegin, \"CodeBlocksWithLangEvaluator\")\n        {\n            _enablePreRenderingCodeBlock = enablePreRenderingCodeBlock;\n        }\n\n        public override IEnumerable<DocumentElement>? Convert2(string text, Match firstMatch, ParseStatus status, IMarkdownEngine2 engine, out int parseTextBegin, out int parseTextEnd)\n        {\n            var closeTagPattern = new Regex($\"\\n[ ]*{firstMatch.Groups[1].Value}[ ]*\\n\");\n            var closeTagMatch = closeTagPattern.Match(text, firstMatch.Index + firstMatch.Length);\n\n            int codeEndIndex;\n            if (closeTagMatch.Success)\n            {\n                codeEndIndex = closeTagMatch.Index;\n                parseTextEnd = closeTagMatch.Index + closeTagMatch.Length;\n            }\n            else if (_enablePreRenderingCodeBlock)\n            {\n                codeEndIndex = text.Length;\n                parseTextEnd = text.Length;\n            }\n            else\n            {\n                parseTextBegin = parseTextEnd = -1;\n                return null;\n            }\n\n            parseTextBegin = firstMatch.Index;\n\n            string code = text.Substring(firstMatch.Index + firstMatch.Length, codeEndIndex - (firstMatch.Index + firstMatch.Length));\n            var border = Create(code);\n            return new[] { new UnBlockElement(border) };\n        }\n\n        public static Border Create(string code)\n        {\n            var ctxt = new TextBlock()\n            {\n                Text = code,\n                TextWrapping = TextWrapping.NoWrap\n            };\n            ctxt.Classes.Add(Markdown.CodeBlockClass);\n\n            var scrl = new ScrollViewer();\n            scrl.Classes.Add(Markdown.CodeBlockClass);\n            scrl.Content = ctxt;\n            scrl.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;\n\n            var border = new Border();\n            border.Classes.Add(Markdown.CodeBlockClass);\n            border.Child = scrl;\n\n            return border;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Parsers/Builtin/IndentCodeBlockParser.cs",
    "content": "﻿using ColorDocument.Avalonia;\nusing ColorDocument.Avalonia.DocumentElements;\nusing Markdown.Avalonia.Utils;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text.RegularExpressions;\n\nnamespace Markdown.Avalonia.Parsers.Builtin\n{\n    internal class IndentCodeBlockParser : BlockParser2\n    {\n        private static readonly Regex _newlinesLeadingTrailing = new(@\"^\\n+|\\n+\\z\", RegexOptions.Compiled);\n        private static readonly Regex _indentCodeBlock = new(@\"\n                    (?:\\A|^[ ]*\\n)\n                    (\n                    [ ]{4}.+\n                    (\\n([ ]{4}.+|[ ]*))*\n                    \\n?\n                    )\n                    \", RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline | RegexOptions.Compiled);\n\n        public IndentCodeBlockParser() : base(_indentCodeBlock, \"CodeBlocksWithoutLangEvaluator\")\n        {\n        }\n\n        public override IEnumerable<DocumentElement>? Convert2(string text, Match firstMatch, ParseStatus status, IMarkdownEngine2 engine, out int parseTextBegin, out int parseTextEnd)\n        {\n            parseTextBegin = firstMatch.Index;\n            parseTextEnd = firstMatch.Index + firstMatch.Length;\n\n            var detentTxt = String.Join(\"\\n\", firstMatch.Groups[1].Value.Split('\\n').Select(line => TextUtil.DetentLineBestEffort(line, 4)));\n            var border = FencedCodeBlockParser.Create(_newlinesLeadingTrailing.Replace(detentTxt, \"\"));\n            return new[] { new UnBlockElement(border) };\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Parsers/Builtin/NoteParser.cs",
    "content": "﻿using Avalonia.Media;\nusing ColorDocument.Avalonia;\nusing ColorDocument.Avalonia.DocumentElements;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\n\nnamespace Markdown.Avalonia.Parsers.Builtin\n{\n    internal class NoteParser : BlockParser2\n    {\n        /// <summary>\n        /// Turn Markdown into HTML paragraphs.\n        /// </summary>\n        /// <remarks>\n        /// < Note\n        /// </remarks>\n        private static readonly Regex _note = new(@\"\n                ^(\\<)       # $1 = starting marker <\n                [ ]*\n                (.+?)       # $2 = Header text\n                [ ]*\n                \\>*         # optional closing >'s (not counted)\n                \\n+\n            \", RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled);\n\n        private static readonly Regex _align = new(@\"^p([<=>])\\.\", RegexOptions.Compiled);\n\n        public NoteParser() : base(_note, \"NoteEvaluator\")\n        {\n        }\n\n        public override IEnumerable<DocumentElement>? Convert2(string text, Match firstMatch, ParseStatus status, IMarkdownEngine2 engine, out int parseTextBegin, out int parseTextEnd)\n        {\n            parseTextBegin = firstMatch.Index;\n            parseTextEnd = parseTextBegin + firstMatch.Length;\n\n            string content = firstMatch.Groups[2].Value;\n\n            TextAlignment? indiAlignment = null;\n\n            if (status.SupportTextAlignment)\n            {\n                var alignMatch = _align.Match(content);\n                if (alignMatch.Success)\n                {\n                    content = content.Substring(alignMatch.Length);\n                    switch (alignMatch.Groups[1].Value)\n                    {\n                        case \"<\":\n                            indiAlignment = TextAlignment.Left;\n                            break;\n                        case \">\":\n                            indiAlignment = TextAlignment.Right;\n                            break;\n                        case \"=\":\n                            indiAlignment = TextAlignment.Center;\n                            break;\n                    }\n                }\n            }\n\n            return new[] { new NoteBlockElement(engine.ParseGamutInline(content), indiAlignment) };\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Parsers/Builtin/SetextHeaderParser.cs",
    "content": "﻿using ColorDocument.Avalonia;\nusing System.Collections.Generic;\nusing System.Text.RegularExpressions;\n\nnamespace Markdown.Avalonia.Parsers.Builtin\n{\n    internal class SetextHeaderParser : AbstractHeaderParser\n    {\n        /// <summary>\n        /// Turn Markdown headers into HTML header tags\n        /// </summary>\n        /// <remarks>\n        /// Header 1  \n        /// ========  \n        /// \n        /// Header 2  \n        /// --------  \n        /// </remarks>\n        private static readonly Regex _headerSetext = new(@\"\n                ^(.+?)\n                [ ]*\n                \\n\n                (=+|-+)     # $1 = string of ='s or -'s\n                [ ]*\n                \\n+\",\n                RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled);\n\n        public SetextHeaderParser() : base(_headerSetext, \"SetextHeaderEvaluator\")\n        {\n        }\n\n        public override IEnumerable<DocumentElement>? Convert2(string text, Match firstMatch, ParseStatus status, IMarkdownEngine2 engine, out int parseTextBegin, out int parseTextEnd)\n        {\n            parseTextBegin = firstMatch.Index;\n            parseTextEnd = parseTextBegin + firstMatch.Length;\n\n            string header = firstMatch.Groups[1].Value;\n            int level = firstMatch.Groups[2].Value.StartsWith(\"=\") ? 1 : 2;\n\n            return Create(level, header, engine);\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Parsers/Builtin/TableParser.cs",
    "content": "﻿using Avalonia.Layout;\nusing Avalonia.Media;\nusing ColorDocument.Avalonia;\nusing ColorDocument.Avalonia.DocumentElements;\nusing ColorTextBlock.Avalonia;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\n\nnamespace Markdown.Avalonia.Parsers.Builtin\n{\n    internal class TableParser : BlockParser2\n    {\n        private static readonly Regex _table = new(@\"\n            (                               # whole table\n                [ \\n]*\n                (?<hdr>                     # table header\n                    ([^\\n\\|]*\\|[^\\n]+)\n                )\n                [ ]*\\n[ ]*\n                (?<col>                     # column style\n                    \\|?([ ]*:?-+:?[ ]*(\\||$))+\n                )\n                (?<row>                     # table row\n                    (\n                        [ ]*\\n[ ]*\n                        ([^\\n\\|]*\\|[^\\n]+)\n                    )+\n                )\n            )\",\n            RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled | RegexOptions.ExplicitCapture);\n\n        public TableParser() : base(_table, \"TableEvalutor\")\n        {\n        }\n\n        public override IEnumerable<DocumentElement>? Convert2(\n            string text, Match firstMatch,\n            ParseStatus status,\n            IMarkdownEngine2 engine,\n            out int parseTextBegin, out int parseTextEnd)\n        {\n            parseTextBegin = firstMatch.Index;\n            parseTextEnd = parseTextBegin + firstMatch.Length;\n\n            return new[] { TableEvalutor(firstMatch, engine) };\n        }\n\n        private TableBlockElement TableEvalutor(Match match, IMarkdownEngine2 engine)\n        {\n            Dictionary<int, TextAlignment> styleMt =\n                ExtractCoverBar(match.Groups[\"col\"].Value.Trim())\n                    .Split('|')\n                    .Select((styleText, idx) =>\n                    {\n                        var text = styleText.Trim();\n                        var firstChar = text[0];\n                        var lastChar = text[text.Length - 1];\n\n                        return\n                            firstChar == ':' && lastChar == ':' ?\n                                 Tuple.Create(idx, (TextAlignment?)TextAlignment.Center) :\n\n                            lastChar == ':' ?\n                                Tuple.Create(idx, (TextAlignment?)TextAlignment.Right) :\n\n                            firstChar == ':' ?\n                                Tuple.Create(idx, (TextAlignment?)TextAlignment.Left) :\n\n                                Tuple.Create(idx, (TextAlignment?)null);\n                    })\n                    .Where(tpl => tpl.Item2.HasValue)\n                    .ToDictionary(tpl => tpl.Item1, tpl => tpl.Item2!.Value);\n\n\n            int colOffset = 0;\n            TableCellElement[][] headerCells = new[] { CreateRow(styleMt, match.Groups[\"hdr\"].Value, engine, true) };\n\n            List<TableCellElement[]> detailCells = new();\n            foreach (var cellline in match.Groups[\"row\"].Value.Trim().Split('\\n'))\n            {\n                detailCells.Add(CreateRow(styleMt, cellline, engine, false));\n            }\n\n\n            return new TableBlockElement(headerCells, detailCells.ToArray(), Array.Empty<TableCellElement[]>(), true);\n        }\n\n        private TableCellElement[] CreateRow(Dictionary<int, TextAlignment> styleMt, string txt, IMarkdownEngine2 engine, bool ignoreRowSpan)\n        {\n            int colOffset = 0;\n            List<TableCellElement> cells = new();\n            foreach (var celltxt in ExtractCoverBar(txt.Trim()).Split('|'))\n            {\n                var cell = CreateCell(celltxt, engine);\n\n                if (ignoreRowSpan)\n                    cell.RowSpan = 1;\n\n                // apply text align\n                if (styleMt.TryGetValue(colOffset, out var style))\n                    cell.Horizontal = style;\n\n                cells.Add(cell);\n\n                colOffset += cell.ColSpan;\n            }\n            return cells.ToArray();\n        }\n\n        private TableCellElement CreateCell(string txt, IMarkdownEngine2 engine)\n        {\n            int colspan = 1;\n            int rowspan = 1;\n            TextAlignment? horizontal = null;\n            VerticalAlignment? vertical = null;\n\n            int idx = txt.IndexOf('.');\n            if (idx != -1)\n            {\n                var styleTxt = txt.Substring(0, idx);\n\n                for (var i = 0; i < styleTxt.Length; ++i)\n                {\n                    switch (styleTxt[i])\n                    {\n                        case '/': // /2 rowspan\n                            ++i;\n                            var numTxt = ContinueToNum(styleTxt, ref i);\n                            if (numTxt.Length == 0) goto default;\n                            rowspan = int.Parse(numTxt);\n\n                            break;\n\n                        case '\\\\': // \\2 colspan\n                            ++i;\n                            numTxt = ContinueToNum(styleTxt, ref i);\n                            if (numTxt.Length == 0) goto default;\n                            colspan = int.Parse(numTxt);\n                            break;\n\n                        case '<': // < left align\n                            horizontal = TextAlignment.Left;\n                            break;\n\n                        case '>': // > right align\n                            horizontal = TextAlignment.Right;\n                            break;\n\n                        case '=': // = center align \n                            horizontal = TextAlignment.Center;\n                            break;\n\n                        case '^': // ^ top align\n                            vertical = VerticalAlignment.Top;\n                            break;\n\n                        case '~': // ~ bottom align\n                            vertical = VerticalAlignment.Bottom;\n                            break;\n\n                        default:\n                            rowspan = 1;\n                            colspan = 1;\n                            horizontal = null;\n                            vertical = null;\n                            goto endparse;\n                    }\n                }\n\n                txt = txt.Substring(idx + 1);\n\n            endparse:;\n            }\n\n            var sb = new StringBuilder();\n            for (var i = 0; i < txt.Length; ++i)\n            {\n                var c = txt[i];\n\n                if (c == '\\\\')\n                {\n                    if (++i < txt.Length)\n                    {\n                        if (txt[i] == 'n')\n                            sb.Append(\"  \\n\"); // \\n => linebreak\n                        else\n                            sb.Append('\\\\').Append(txt[i]);\n                    }\n                    else\n                        sb.Append('\\\\');\n                }\n                else\n                    sb.Append(c);\n            }\n\n            return new TableCellElement(new CTextBlockElement(engine.ParseGamutInline(sb.ToString().Trim())))\n            {\n                ColSpan = colspan,\n                RowSpan = rowspan,\n                Horizontal = horizontal,\n                Vertical = vertical,\n            };\n        }\n\n        private static string ExtractCoverBar(string txt)\n        {\n            if (txt[0] == '|')\n                txt = txt.Substring(1);\n\n            if (string.IsNullOrEmpty(txt))\n                return txt;\n\n            if (txt[txt.Length - 1] == '|')\n                txt = txt.Substring(0, txt.Length - 1);\n\n            return txt;\n        }\n\n        private static string ContinueToNum(string charSource, ref int idx)\n        {\n            var builder = new StringBuilder();\n\n            for (; idx < charSource.Length; ++idx)\n            {\n                var c = charSource[idx];\n\n                if ('0' <= c && c <= '9')\n                    builder.Append(c);\n\n                else break;\n            }\n            --idx;\n            return builder.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Parsers/InlineParser.cs",
    "content": "﻿using Avalonia.Controls;\nusing ColorTextBlock.Avalonia;\nusing System;\nusing System.Collections.Generic;\nusing System.Text.RegularExpressions;\n\nnamespace Markdown.Avalonia.Parsers\n{\n    public abstract class InlineParser\n    {\n        public Regex Pattern { get; }\n\n        public string Name { get; }\n\n        public InlineParser(Regex pattern, string name)\n        {\n            Pattern = pattern;\n            Name = name;\n        }\n\n        public abstract IEnumerable<CInline> Convert(\n            string text, Match firstMatch,\n            IMarkdownEngine engine,\n            out int parseTextBegin, out int parseTextEnd);\n\n        public static InlineParser New(Regex pattern, string name, Func<Match, CInline> v1)\n            => new Single(pattern, name, v1);\n\n        public static InlineParser New(Regex pattern, string name, Func<Match, IEnumerable<CInline>> v2)\n            => new Multi(pattern, name, v2);\n\n        abstract class Wrapper : InlineParser\n        {\n            public Wrapper(Regex pattern, string name) : base(pattern, name)\n            {\n            }\n\n            public override IEnumerable<CInline> Convert(\n                string text, Match firstMatch,\n                IMarkdownEngine engine,\n                out int parseTextBegin, out int parseTextEnd)\n            {\n                parseTextBegin = firstMatch.Index;\n                parseTextEnd = parseTextBegin + firstMatch.Length;\n                return Convert(firstMatch);\n            }\n\n            public abstract IEnumerable<CInline> Convert(Match match);\n        }\n\n        sealed class Single : Wrapper\n        {\n            private readonly Func<Match, CInline> converter;\n\n            public Single(Regex pattern, string name, Func<Match, CInline> converter) : base(pattern, name)\n            {\n                this.converter = converter;\n            }\n\n            public override IEnumerable<CInline> Convert(Match match)\n            {\n                yield return converter(match);\n            }\n        }\n\n        sealed class Multi : Wrapper\n        {\n            private readonly Func<Match, IEnumerable<CInline>> converter;\n\n            public Multi(Regex pattern, string name, Func<Match, IEnumerable<CInline>> converter) : base(pattern, name)\n            {\n                this.converter = converter;\n            }\n\n            public override IEnumerable<CInline> Convert(Match match)\n                => converter(match);\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Parsers/ParseStatus.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Markdown.Avalonia.Parsers\n{\n    public struct ParseStatus\n    {\n        public static readonly ParseStatus Init = new ParseStatus(true);\n\n        public bool SupportTextAlignment { get; }\n\n        public ParseStatus(bool supportTextAlignment)\n        {\n            SupportTextAlignment = supportTextAlignment;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Plugins/BlockOverride2.cs",
    "content": "﻿using Avalonia.Controls;\nusing ColorDocument.Avalonia;\nusing Markdown.Avalonia.Parsers;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text.RegularExpressions;\n\nnamespace Markdown.Avalonia.Plugins\n{\n    public abstract class BlockOverride2 : IBlockOverride\n    {\n        private readonly string _parserName;\n        public string ParserName => _parserName;\n\n        public BlockOverride2(string parserName)\n        {\n            _parserName = parserName;\n        }\n\n        public abstract IEnumerable<DocumentElement>? Convert2(string text, Match firstMatch, ParseStatus status, IMarkdownEngine2 engine, out int parseTextBegin, out int parseTextEnd);\n\n        public IEnumerable<Control>? Convert(string text, Match firstMatch, ParseStatus status, IMarkdownEngine engine, out int parseTextBegin, out int parseTextEnd)\n        {\n            if (Convert2(text, firstMatch, status, engine.Upgrade(), out parseTextBegin, out parseTextEnd) is { } docs)\n            {\n                return docs.Select(d => d.Control);\n            }\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Plugins/IBlockOverrider.cs",
    "content": "﻿using Avalonia.Controls;\nusing Markdown.Avalonia.Parsers;\nusing System.Collections.Generic;\nusing System.Text.RegularExpressions;\n\nnamespace Markdown.Avalonia.Plugins\n{\n    /// <summary>\n    /// The interface to change the parsing method for block elements.\n    /// </summary>\n    // ブロック要素の解析方法を変更するためのインターフェイス\n    public interface IBlockOverride\n    {\n        /// <summary>\n        /// The target name to override.\n        /// </summary>\n        string ParserName { get; }\n\n        /// <summary>\n        /// Translates markdown to visual elements.\n        /// </summary>\n        // Markdownを表示要素に変換します。\n        IEnumerable<Control>? Convert(\n            string text, Match firstMatch, ParseStatus status,\n            IMarkdownEngine engine,\n            out int parseTextBegin, out int parseTextEnd);\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Plugins/IMdAvPlugin.cs",
    "content": "﻿using Avalonia.Controls;\nusing System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\n\nnamespace Markdown.Avalonia.Plugins\n{\n    public interface IMdAvPlugin\n    {\n        void Setup(SetupInfo info);\n    }\n\n    public interface IMdAvPluginRequestAnother : IMdAvPlugin\n    {\n        IEnumerable<Type> DependsOn { get; }\n\n        void Inject(IEnumerable<IMdAvPlugin> plugin);\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Plugins/IStyleEditor.cs",
    "content": "﻿using Avalonia.Styling;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Markdown.Avalonia.Plugins\n{\n    public interface IStyleEdit\n    {\n        void Edit(string styleName, Styles style);\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Plugins/SetupInfo.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Media;\nusing Avalonia.Media.Imaging;\nusing Avalonia.Platform;\nusing ColorDocument.Avalonia;\nusing ColorTextBlock.Avalonia;\nusing Markdown.Avalonia.Parsers;\nusing Markdown.Avalonia.Utils;\nusing System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.ComponentModel.Design;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\nusing System.Windows.Input;\nusing static System.Net.Mime.MediaTypeNames;\n\nnamespace Markdown.Avalonia.Plugins\n{\n    public class SetupInfo\n    {\n        internal const string BuiltinAsmNm = \"Markdown.Avalonia.SyntaxHigh\";\n        internal const string BuiltinTpNm = \"Markdown.Avalonia.SyntaxHigh.SyntaxHighlight\";\n\n        private bool _isFreezed = false;\n        private bool _builtinCalled = false;\n\n        private ICommand? _overwriteHyperlink;\n        private ICommand? _command;\n        private ICommand? _defaultHyperlink;\n\n        private IContainerBlockHandler? _overwriteHandler;\n        private IContainerBlockHandler? _containerBlock;\n\n        private IPathResolver? _pathResolver;\n        private IPathResolver? _defaultPathResolver;\n\n        private ImageLoader _imageLoader;\n\n        private bool _EnableNoteBlock = true;\n        private bool _EnableTableBlock = true;\n        private bool _EnableRuleExt = true;\n        private bool _EnableTextAlignment = true;\n        private bool _EnableStrikethrough = true;\n        private bool _EnableListMarkerExt = true;\n        private bool _EnableContainerBlockExt = true;\n        private bool _EnableTextileInline = true;\n        private bool _EnablePreRenderingCodeBlock = false;\n\n        internal List<IBlockOverride> BlockOverrides { get; }\n        internal List<BlockParser> TopBlock { get; }\n        internal List<BlockParser> Block { get; }\n        internal List<InlineParser> Inline { get; }\n        internal List<IStyleEdit> StyleEdits { get; }\n        internal List<IImageResolver> ImageResolvers { get; }\n        internal ICommand HyperlinkCommand => _overwriteHyperlink ?? _command ?? (_defaultHyperlink ??= new DefaultHyperlinkCommand());\n        internal IContainerBlockHandler? ContainerBlock => _overwriteHandler ?? _containerBlock;\n        internal IPathResolver PathResolver => _pathResolver ?? (_defaultPathResolver ??= new DefaultPathResolver());\n\n\n        public SetupInfo()\n        {\n            _imageLoader = new(this);\n\n            BlockOverrides = new();\n            TopBlock = new();\n            Block = new();\n            Inline = new();\n            StyleEdits = new();\n            ImageResolvers = new();\n        }\n\n\n        public bool EnableNoteBlock\n        {\n            get => _EnableNoteBlock;\n            set\n            {\n                CheckChangeable();\n                _EnableNoteBlock = value;\n            }\n        }\n\n        public bool EnableTableBlock\n        {\n            get => _EnableTableBlock;\n            set\n            {\n                CheckChangeable();\n                _EnableTableBlock = value;\n            }\n        }\n\n        public bool EnableRuleExt\n        {\n            get => _EnableRuleExt;\n            set\n            {\n                CheckChangeable();\n                _EnableRuleExt = value;\n            }\n        }\n\n        public bool EnableTextAlignment\n        {\n            get => _EnableTextAlignment;\n            set\n            {\n                CheckChangeable();\n                _EnableTextAlignment = value;\n            }\n        }\n\n        public bool EnableStrikethrough\n        {\n            get => _EnableStrikethrough;\n            set\n            {\n                CheckChangeable();\n                _EnableStrikethrough = value;\n            }\n        }\n\n        public bool EnableListMarkerExt\n        {\n            get => _EnableListMarkerExt;\n            set\n            {\n                CheckChangeable();\n                _EnableListMarkerExt = value;\n            }\n        }\n\n        public bool EnableContainerBlockExt\n        {\n            get => _EnableContainerBlockExt;\n            set\n            {\n                CheckChangeable();\n                _EnableContainerBlockExt = value;\n            }\n        }\n\n        public bool EnableTextileInline\n        {\n            get => _EnableTextileInline;\n            set\n            {\n                CheckChangeable();\n                _EnableTextileInline = value;\n            }\n        }\n\n        public bool EnablePreRenderingCodeBlock\n        {\n            get => _EnablePreRenderingCodeBlock;\n            set\n            {\n                CheckChangeable();\n                _EnablePreRenderingCodeBlock = value;\n            }\n        }\n\n\n        public void Register(IBlockOverride overrider)\n        {\n            CheckChangeable();\n            BlockOverrides.Add(overrider);\n        }\n\n        public void RegisterTop(BlockParser parser)\n        {\n            CheckChangeable();\n            TopBlock.Add(parser);\n        }\n\n        public void RegisterSecond(BlockParser parser)\n        {\n            CheckChangeable();\n            Block.Add(parser);\n        }\n\n        public void Register(InlineParser parser)\n        {\n            CheckChangeable();\n            Inline.Add(parser);\n        }\n\n        public void Register(IStyleEdit editor)\n        {\n            CheckChangeable();\n            StyleEdits.Add(editor);\n        }\n\n        public void SetOnce(ICommand command)\n        {\n            CheckChangeable();\n\n            if (_command is not null)\n            {\n                throw new InvalidOperationException(\"IContainerBlockHandler is already set. Please check Markdown.Avalonia plugins\");\n            }\n\n            _command = command;\n        }\n\n        public void SetOnce(IContainerBlockHandler handler)\n        {\n            CheckChangeable();\n\n            if (_containerBlock is not null)\n            {\n                throw new InvalidOperationException(\"IContainerBlockHandler is already set. Please check Markdown.Avalonia plugins\");\n            }\n\n            _containerBlock = handler;\n        }\n\n        public void SetOnce(IPathResolver resolver)\n        {\n            CheckChangeable();\n\n            if (_pathResolver is not null)\n            {\n                throw new InvalidOperationException(\"IPathResolver is already set. Please check Markdown.Avalonia plugins\");\n            }\n\n            _pathResolver = resolver;\n        }\n\n        public void Register(IImageResolver resolver)\n        {\n            CheckChangeable();\n\n            ImageResolvers.Add(resolver);\n        }\n\n        internal SetupInfo Builtin()\n        {\n            if (_builtinCalled)\n                return this;\n\n            CheckChangeable();\n\n            Assembly asm;\n            try\n            {\n                asm = Assembly.Load(BuiltinAsmNm);\n\n                var type = asm.GetType(BuiltinTpNm);\n                if (type != null && Activator.CreateInstance(type) is IMdAvPlugin plugin)\n                {\n                    plugin.Setup(this);\n                }\n            }\n            catch\n            {\n                return this;\n            }\n\n            _builtinCalled = true;\n            return this;\n        }\n\n        internal BlockParser Override(BlockParser parser)\n        {\n            var overrider = BlockOverrides.FirstOrDefault(b => b.ParserName == parser.Name);\n\n            if (overrider is null)\n                return parser;\n\n\n            if (overrider is BlockOverride2 override2)\n                return new BlockParserOverride2(parser.Pattern, parser.Name, override2);\n            else\n                return new BlockParserOverride(parser.Pattern, parser.Name, overrider);\n        }\n\n        internal void Overwrite(ICommand? hyperlink)\n        {\n            _overwriteHyperlink = hyperlink;\n        }\n\n        internal void Overwrite(IContainerBlockHandler? handler)\n        {\n            _overwriteHandler = handler;\n        }\n\n#pragma warning disable CS0618\n        internal void Overwrite(IBitmapLoader? loader)\n#pragma warning restore CS0618\n        {\n            _imageLoader.BitmapLoader = loader;\n        }\n\n        public void Freeze()\n        {\n            _isFreezed = true;\n        }\n\n\n        public CImage LoadImage(string urlTxt) => _imageLoader.Load(urlTxt);\n\n\n        internal void CheckChangeable()\n        {\n            if (_isFreezed)\n                throw new InvalidOperationException();\n        }\n\n\n        class BlockParserOverride : BlockParser\n        {\n            private IBlockOverride _overrider;\n            public BlockParserOverride(Regex pattern, string name, IBlockOverride overrider) : base(pattern, name)\n            {\n                _overrider = overrider;\n            }\n\n            public override IEnumerable<Control>? Convert(\n                string text,\n                Match firstMatch,\n                ParseStatus status,\n                IMarkdownEngine engine,\n                out int parseTextBegin, out int parseTextEnd)\n            => _overrider.Convert(text, firstMatch, status, engine, out parseTextBegin, out parseTextEnd);\n        }\n\n        class BlockParserOverride2 : BlockParser2\n        {\n            private BlockOverride2 _overrider;\n            public BlockParserOverride2(Regex pattern, string name, BlockOverride2 overrider) : base(pattern, name)\n            {\n                _overrider = overrider;\n            }\n\n            public override IEnumerable<DocumentElement>? Convert2(string text, Match firstMatch, ParseStatus status, IMarkdownEngine2 engine, out int parseTextBegin, out int parseTextEnd)\n                => _overrider.Convert2(text, firstMatch, status, engine, out parseTextBegin, out parseTextEnd);\n        }\n\n        class ImageLoader\n        {\n            private SetupInfo _setupInfo;\n            private Dictionary<string, WeakReference<IImage>> _cache;\n            private Lazy<Bitmap> _imageNotFound;\n\n#pragma warning disable CS0618\n            public IBitmapLoader? BitmapLoader { get; set; }\n#pragma warning restore CS0618\n\n\n            public ImageLoader(SetupInfo info)\n            {\n                _setupInfo = info;\n                _cache = new();\n\n                _imageNotFound = new Lazy<Bitmap>(() =>\n                {\n                    using var strm = AssetLoader.Open(new Uri($\"avares://Markdown.Avalonia/Assets/ImageNotFound.bmp\"));\n                    return new Bitmap(strm);\n                });\n\n            }\n\n            public CImage Load(string urlTxt)\n            {\n                if (_cache.TryGetValue(urlTxt, out var bitmapRef) && bitmapRef.TryGetTarget(out var cachedBitmap))\n                {\n                    return new CImage(cachedBitmap ?? _imageNotFound.Value);\n                }\n                else\n                {\n#pragma warning disable CS0618\n                    var imageTask = BitmapLoader is not null ?\n                        Task.Run(() => (IImage?)BitmapLoader?.Get(urlTxt)) :\n#pragma warning restore CS0618\n                        LoadImageByPlugin(urlTxt);\n\n                    return new CImage(imageTask, _imageNotFound.Value);\n                }\n            }\n\n            private async Task<IImage?> LoadImageByPlugin(string urlTxt)\n            {\n                foreach (var key in _cache.Keys.ToArray())\n                {\n                    if (_cache[key].TryGetTarget(out var _))\n                        _cache.Remove(key);\n                }\n\n\n                var streamTask = _setupInfo.PathResolver.ResolveImageResource(urlTxt);\n                if (streamTask is null)\n                {\n                    _cache[urlTxt] = new WeakReference<IImage>(_imageNotFound.Value);\n                    return null;\n                }\n\n                using var stream = await streamTask;\n                if (stream is null)\n                {\n                    _cache[urlTxt] = new WeakReference<IImage>(_imageNotFound.Value);\n                    return null;\n                }\n\n                Stream seekableStream;\n                if (!stream.CanSeek)\n                {\n                    seekableStream = new MemoryStream();\n                    await stream.CopyToAsync(seekableStream);\n                }\n                else\n                {\n                    seekableStream = stream;\n                }\n\n                var reuseStream = new UnclosableStream(seekableStream);\n\n                foreach (var imageResolver in _setupInfo.ImageResolvers)\n                {\n                    reuseStream.Position = 0;\n                    var image = await imageResolver.Load(reuseStream);\n\n                    if (image is not null)\n                    {\n                        _cache[urlTxt] = new WeakReference<IImage>(image);\n                        return image;\n                    }\n                }\n\n                try\n                {\n                    var image = new Bitmap(reuseStream);\n                    _cache[urlTxt] = new WeakReference<IImage>(image);\n                    return image;\n                }\n                catch\n                {\n                    _cache[urlTxt] = new WeakReference<IImage>(_imageNotFound.Value);\n                    return null;\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Properties/AssemblyInfo.cs",
    "content": "﻿using Avalonia.Metadata;\n\n[assembly: XmlnsDefinition(\"https://github.com/whistyun/Markdown.Avalonia.Tight\", \"Markdown.Avalonia\")]\n[assembly: XmlnsPrefix(\"https://github.com/whistyun/Markdown.Avalonia.Tight\", \"mdxaml\")]\n[assembly: XmlnsDefinition(\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\", \"Markdown.Avalonia.StyleCollections\")]\n[assembly: XmlnsPrefix(\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\", \"mdstyles\")]\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/StyleCollections/INamedStyle.cs",
    "content": "﻿namespace Markdown.Avalonia.StyleCollections\n{\n    internal interface INamedStyle\n    {\n        string Name { get; }\n        bool IsEditted { get; set; }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/StyleCollections/MarkdownStyleDefaultTheme.axaml",
    "content": "<Styles\n      xmlns=\"https://github.com/avaloniaui\"\n        \n      xmlns:md=\"clr-namespace:Markdown.Avalonia;assembly=Markdown.Avalonia\"\n      xmlns:mdc=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\"\n      xmlns:mde=\"clr-namespace:Markdown.Avalonia.Extensions;assembly=Markdown.Avalonia\"\n      xmlns:ctxt=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        \n      x:Class=\"Markdown.Avalonia.StyleCollections.MarkdownStyleDefaultTheme\"\n        >\n  <Styles.Resources>\n    <SolidColorBrush x:Key=\"MarkdownScrollViewer.SelectionBrush\"  Color=\"{StaticResource HighlightColor}\"/>\n  </Styles.Resources>\n\n  <Style Selector=\":is(md|MarkdownScrollViewer)\">\n    <Style.Setters>\n      <Setter Property=\"SelectionBrush\" Value=\"{StaticResource HighlightBrush}\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock\">\n    <Style.Setters>\n      <Setter Property=\"SelectionBrush\" Value=\"{StaticResource HighlightBrush}\"/>\n      <Setter Property=\"FontSize\"   Value=\"{mde:Multiply FontSizeNormal, 1.1}\" />\n      <Setter Property=\"Margin\"     Value=\"0,5\" />\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer TextBlock\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"{mde:Multiply FontSizeNormal, 1.1}\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Heading1\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"{mde:Multiply FontSizeNormal, 3.5}\" />\n      <Setter Property=\"Foreground\" Value=\"{mde:Alpha ThemeForegroundColor}\" />\n      <Setter Property=\"FontWeight\" Value=\"Light\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Heading2\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"{mde:Multiply FontSizeNormal, 1.7}\" />\n      <Setter Property=\"Foreground\" Value=\"{mde:Alpha ThemeForegroundColor}\" />\n      <Setter Property=\"FontWeight\" Value=\"Light\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Heading3\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"{mde:Multiply FontSizeNormal, 1.7}\" />\n      <Setter Property=\"Foreground\" Value=\"{mde:Alpha ThemeForegroundColor, 0.7}\" />\n      <Setter Property=\"FontWeight\" Value=\"Light\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Heading4\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"{mde:Multiply FontSizeNormal, 1.2}\" />\n      <Setter Property=\"Foreground\" Value=\"{mde:Alpha ThemeForegroundColor, 0.7}\" />\n      <Setter Property=\"FontWeight\" Value=\"Light\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CHyperlink\">\n    <Style.Setters>\n      <Setter Property=\"IsUnderline\" Value=\"true\"/>\n      <Setter Property=\"Foreground\" Value=\"{mde:Alpha ThemeAccentColor}\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CHyperlink:pointerover\">\n    <Setter Property=\"Foreground\" Value=\"{mde:Complementary ThemeAccentColor}\"/>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.Table\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"5\"/>\n      <Setter Property=\"BorderThickness\" Value=\"0,0,1,1\"/>\n      <Setter Property=\"BorderBrush\" Value=\"{mde:Alpha ThemeBorderHighColor}\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.TightTable\">\n    <Style.Setters>\n      <Setter Property=\"HorizontalAlignment\" Value=\"Left\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Grid.Table > Border\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"0\"/>\n      <Setter Property=\"BorderThickness\" Value=\"1,1,0,0\"/>\n      <Setter Property=\"BorderBrush\" Value=\"{mde:Alpha ThemeBorderHighColor}\"/>\n      <Setter Property=\"Padding\" Value=\"2\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Grid.Table\">\n    <Style.Setters>\n      <Setter Property=\"mdc:AutoScaleColumnDefinitions.IsEnabled\" Value=\"True\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.TableHeader\">\n    <Style.Setters>\n      <Setter Property=\"Background\" Value=\"{mde:Alpha ThemeForegroundColor, 0.3}\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.TableHeader ctxt|CTextBlock\">\n    <Style.Setters>\n      <Setter Property=\"FontWeight\" Value=\"DemiBold\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.EvenTableRow\">\n    <Style.Setters>\n      <Setter Property=\"Background\" Value=\"{mde:Alpha ThemeForegroundColor, 0.12}\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.CodeBlock\">\n    <Style.Setters>\n      <Setter Property=\"BorderBrush\"     Value=\"{mde:Alpha ThemeForegroundColor, 0.13}\"/>\n      <Setter Property=\"BorderThickness\" Value=\"0,5,0,5\"/>\n      <Setter Property=\"Margin\"          Value=\"5,0,5,0\"/>\n      <Setter Property=\"Background\"      Value=\"{mde:Alpha ThemeForegroundColor, 0.06}\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer TextBlock.CodeBlock\">\n    <Style.Setters>\n      <Setter Property=\"FontFamily\"      Value=\"menlo,monaco,consolas,droid sans mono,inconsolata,courier new,monospace,dejavu sans mono\"/>\n      <Setter Property=\"Foreground\"      Value=\"{mde:DivideColor Blue, ThemeForegroundColor, 0.45}\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.NoContainer\">\n    <Style.Setters>\n      <Setter Property=\"BorderBrush\"     Value=\"Red\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CCode\">\n    <Style.Setters>\n      <Setter Property=\"Foreground\" Value=\"{mde:DivideColor Blue, ThemeForegroundColor, 0.45}\" />\n      <Setter Property=\"Background\" Value=\"{mde:Alpha ThemeForegroundColor, 0.06}\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.Note\">\n    <Style.Setters>\n      <Setter Property=\"Margin\"          Value=\"5,0,5,0\"/>\n      <Setter Property=\"BorderBrush\"     Value=\"{mde:Alpha ThemeForegroundColor, 0.13}\"/>\n      <Setter Property=\"BorderThickness\" Value=\"3,3,3,3\"/>\n      <Setter Property=\"Background\"      Value=\"{mde:Alpha ThemeForegroundColor, 0.02}\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Note\">\n    <Style.Setters>\n      <Setter Property=\"Margin\"         Value=\"10, 5\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Grid.List\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"40,0,0,0\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.ListMarker\">\n    <Style.Setters>\n      <Setter Property=\"Margin\"         Value=\"0,5,5,5\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.Blockquote\">\n    <Style.Setters>\n      <Setter Property=\"BorderBrush\"     Value=\"{mde:Alpha ThemeForegroundColor, 0.13}\"/>\n      <Setter Property=\"BorderThickness\" Value=\"5,0,0,0\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer StackPanel.Blockquote\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"10, 5\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer mdc|Rule\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"0,3\"/>\n    </Style.Setters>\n  </Style>\n</Styles>\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/StyleCollections/MarkdownStyleDefaultTheme.axaml.cs",
    "content": "﻿using Avalonia.Markup.Xaml;\nusing Avalonia.Styling;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Markdown.Avalonia.StyleCollections\n{\n    public class MarkdownStyleDefaultTheme : Styles, INamedStyle\n    {\n        public string Name => nameof(MarkdownStyle.SimpleTheme);\n        public bool IsEditted { get; set; }\n\n        public MarkdownStyleDefaultTheme()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/StyleCollections/MarkdownStyleFluentAvalonia.axaml",
    "content": "<Styles\n      xmlns=\"https://github.com/avaloniaui\"\n        \n      xmlns:md=\"clr-namespace:Markdown.Avalonia;assembly=Markdown.Avalonia\"\n      xmlns:mdc=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\"\n      xmlns:mde=\"clr-namespace:Markdown.Avalonia.Extensions;assembly=Markdown.Avalonia\"\n      xmlns:ctxt=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        \n      x:Class=\"Markdown.Avalonia.StyleCollections.MarkdownStyleFluentAvalonia\"\n      >\n  <Styles.Resources>\n    <SolidColorBrush x:Key=\"MarkdownScrollViewer.SelectionBrush\"  Color=\"{DynamicResource SystemAccentColor}\"/>\n  </Styles.Resources>\n\n  <Style Selector=\":is(md|MarkdownScrollViewer)\">\n    <Style.Setters>\n      <Setter Property=\"SelectionBrush\" Value=\"{DynamicResource TextControlSelectionHighlightColor}\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock\">\n    <Style.Setters>\n      <Setter Property=\"SelectionBrush\" Value=\"{DynamicResource TextControlSelectionHighlightColor}\"/>\n      <Setter Property=\"FontSize\"   Value=\"{mde:Multiply ControlContentThemeFontSize, 1}\" />\n      <Setter Property=\"Margin\"     Value=\"0,5\" />\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer TextBlock\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"{mde:Multiply ControlContentThemeFontSize, 1}\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Heading1\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"{mde:Multiply ControlContentThemeFontSize, 3.2}\" />\n      <Setter Property=\"Foreground\" Value=\"{mde:Alpha TextFillColorPrimaryBrush}\" />\n      <Setter Property=\"FontWeight\" Value=\"Light\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Heading2\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"{mde:Multiply ControlContentThemeFontSize, 1.6}\" />\n      <Setter Property=\"Foreground\" Value=\"{mde:Alpha TextFillColorPrimaryBrush}\" />\n      <Setter Property=\"FontWeight\" Value=\"Light\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Heading3\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"{mde:Multiply ControlContentThemeFontSize, 1.6}\" />\n      <Setter Property=\"Foreground\" Value=\"{mde:Alpha TextFillColorPrimaryBrush, 0.7}\" />\n      <Setter Property=\"FontWeight\" Value=\"Light\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Heading4\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"{mde:Multiply ControlContentThemeFontSize, 1.2}\" />\n      <Setter Property=\"Foreground\" Value=\"{mde:Alpha TextFillColorPrimaryBrush, 0.7}\" />\n      <Setter Property=\"FontWeight\" Value=\"Light\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CHyperlink\">\n    <Style.Setters>\n      <Setter Property=\"IsUnderline\" Value=\"true\"/>\n      <Setter Property=\"Foreground\" Value=\"{StaticResource SystemAccentColor}\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CHyperlink:pointerover\">\n    <Setter Property=\"Foreground\" Value=\"{mde:Complementary SystemAccentColor}\"/>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.Table\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"5\"/>\n      <Setter Property=\"BorderThickness\" Value=\"0,0,1,1\"/>\n      <Setter Property=\"BorderBrush\" Value=\"{mde:Alpha TextFillColorPrimaryBrush, 0.7}\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.TightTable\">\n    <Style.Setters>\n      <Setter Property=\"HorizontalAlignment\" Value=\"Left\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Grid.Table > Border\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"0\"/>\n      <Setter Property=\"BorderThickness\" Value=\"1,1,0,0\"/>\n      <Setter Property=\"BorderBrush\" Value=\"{mde:Alpha TextFillColorPrimaryBrush, 0.7}\"/>\n      <Setter Property=\"Padding\" Value=\"2\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.TableHeader\">\n    <Style.Setters>\n      <Setter Property=\"Background\" Value=\"{mde:Alpha TextFillColorPrimaryBrush, 0.3}\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.TableHeader ctxt|CTextBlock\">\n    <Style.Setters>\n      <Setter Property=\"FontWeight\" Value=\"DemiBold\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.EvenTableRow\">\n    <Style.Setters>\n      <Setter Property=\"Background\" Value=\"{mde:Alpha ControlFillColorDefaultBrush, 0.9}\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.CodeBlock\">\n    <Style.Setters>\n      <Setter Property=\"BorderBrush\"     Value=\"{mde:Alpha TextFillColorPrimaryBrush, 0.2}\"/>\n      <Setter Property=\"BorderThickness\" Value=\"0,5,0,5\"/>\n      <Setter Property=\"Margin\"          Value=\"5,0,5,0\"/>\n      <Setter Property=\"Background\"      Value=\"{mde:Alpha ControlFillColorDefaultBrush, 0.9}\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer TextBlock.CodeBlock\">\n    <Style.Setters>\n      <Setter Property=\"FontFamily\"      Value=\"menlo,monaco,consolas,droid sans mono,inconsolata,courier new,monospace,dejavu sans mono\"/>\n      <Setter Property=\"Foreground\"      Value=\"{mde:DivideColor Blue, TextFillColorPrimary, 0.4}\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.NoContainer\">\n    <Style.Setters>\n      <Setter Property=\"BorderBrush\"     Value=\"Red\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CCode\">\n    <Style.Setters>\n      <Setter Property=\"Foreground\" Value=\"{mde:DivideColor Blue, TextFillColorPrimary, 0.4}\" />\n      <Setter Property=\"Background\" Value=\"{mde:Alpha ControlFillColorDefaultBrush, 0.9}\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.Note\">\n    <Style.Setters>\n      <Setter Property=\"Margin\"          Value=\"5,0,5,0\"/>\n      <Setter Property=\"BorderBrush\"     Value=\"{mde:Alpha TextFillColorPrimaryBrush, 0.2}\"/>\n      <Setter Property=\"BorderThickness\" Value=\"3,3,3,3\"/>\n      <Setter Property=\"Background\"      Value=\"{mde:Alpha ControlFillColorDefaultBrush, 0.9}\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Note\">\n    <Style.Setters>\n      <Setter Property=\"Margin\"         Value=\"10, 5\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Grid.List\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"40,0,0,0\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.ListMarker\">\n    <Style.Setters>\n      <Setter Property=\"Margin\"         Value=\"0,5,5,5\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.Blockquote\">\n    <Style.Setters>\n      <Setter Property=\"BorderBrush\"     Value=\"{mde:Alpha TextFillColorPrimaryBrush, 0.2}\"/>\n      <Setter Property=\"BorderThickness\" Value=\"5,0,0,0\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer StackPanel.Blockquote\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"10, 5\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer mdc|Rule\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"0,3\"/>\n    </Style.Setters>\n  </Style>\n</Styles>"
  },
  {
    "path": "Markdown.Avalonia.Tight/StyleCollections/MarkdownStyleFluentAvalonia.axaml.cs",
    "content": "﻿using Avalonia.Markup.Xaml;\nusing Avalonia.Styling;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Markdown.Avalonia.StyleCollections\n{\n    public class MarkdownStyleFluentAvalonia : Styles, INamedStyle\n    {\n        public string Name => nameof(MarkdownStyle.FluentAvalonia);\n        public bool IsEditted { get; set; }\n\n        public MarkdownStyleFluentAvalonia()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/StyleCollections/MarkdownStyleFluentTheme.axaml",
    "content": "<Styles\n      xmlns=\"https://github.com/avaloniaui\"\n        \n      xmlns:md=\"clr-namespace:Markdown.Avalonia;assembly=Markdown.Avalonia\"\n      xmlns:mdc=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\"\n      xmlns:mde=\"clr-namespace:Markdown.Avalonia.Extensions;assembly=Markdown.Avalonia\"\n      xmlns:ctxt=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        \n      x:Class=\"Markdown.Avalonia.StyleCollections.MarkdownStyleFluentTheme\"\n      >\n  <Styles.Resources>\n    <SolidColorBrush x:Key=\"MarkdownScrollViewer.SelectionBrush\"  Color=\"{DynamicResource SystemAccentColor}\"/>\n  </Styles.Resources>\n\n  <Style Selector=\":is(md|MarkdownScrollViewer)\">\n    <Style.Setters>\n      <Setter Property=\"SelectionBrush\" Value=\"{DynamicResource TextControlSelectionHighlightColor}\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock\">\n    <Style.Setters>\n      <Setter Property=\"SelectionBrush\" Value=\"{DynamicResource TextControlSelectionHighlightColor}\"/>\n      <Setter Property=\"FontSize\"   Value=\"{mde:Multiply ControlContentThemeFontSize, 1}\" />\n      <Setter Property=\"Margin\"     Value=\"0,5\" />\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer TextBlock\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"{mde:Multiply ControlContentThemeFontSize, 1}\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Heading1\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"{mde:Multiply ControlContentThemeFontSize, 3.2}\" />\n      <Setter Property=\"Foreground\" Value=\"{mde:Alpha TextControlForegroundFocused}\" />\n      <Setter Property=\"FontWeight\" Value=\"Light\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Heading2\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"{mde:Multiply ControlContentThemeFontSize, 1.6}\" />\n      <Setter Property=\"Foreground\" Value=\"{mde:Alpha TextControlForegroundFocused}\" />\n      <Setter Property=\"FontWeight\" Value=\"Light\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Heading3\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"{mde:Multiply ControlContentThemeFontSize, 1.6}\" />\n      <Setter Property=\"Foreground\" Value=\"{mde:Alpha TextControlForegroundFocused, 0.7}\" />\n      <Setter Property=\"FontWeight\" Value=\"Light\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Heading4\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"{mde:Multiply ControlContentThemeFontSize, 1.2}\" />\n      <Setter Property=\"Foreground\" Value=\"{mde:Alpha TextControlForegroundFocused, 0.7}\" />\n      <Setter Property=\"FontWeight\" Value=\"Light\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CHyperlink\">\n    <Style.Setters>\n      <Setter Property=\"IsUnderline\" Value=\"true\"/>\n      <Setter Property=\"Foreground\" Value=\"{mde:Alpha SystemAccentColor}\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CHyperlink:pointerover\">\n    <Setter Property=\"Foreground\" Value=\"{mde:Complementary SystemAccentColor}\"/>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.Table\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"5\"/>\n      <Setter Property=\"BorderThickness\" Value=\"0,0,1,1\"/>\n      <Setter Property=\"BorderBrush\" Value=\"{mde:Alpha SystemControlForegroundBaseHighBrush}\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.TightTable\">\n    <Style.Setters>\n      <Setter Property=\"HorizontalAlignment\" Value=\"Left\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Grid.Table > Border\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"0\"/>\n      <Setter Property=\"BorderThickness\" Value=\"1,1,0,0\"/>\n      <Setter Property=\"BorderBrush\" Value=\"{mde:Alpha SystemControlForegroundBaseHighBrush}\"/>\n      <Setter Property=\"Padding\" Value=\"2\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Grid.Table\">\n    <Style.Setters>\n      <Setter Property=\"mdc:AutoScaleColumnDefinitions.IsEnabled\" Value=\"True\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.TableHeader\">\n    <Style.Setters>\n      <Setter Property=\"Background\" Value=\"{mde:Alpha SystemBaseHighColor, 0.3}\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.TableHeader ctxt|CTextBlock\">\n    <Style.Setters>\n      <Setter Property=\"FontWeight\" Value=\"DemiBold\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.EvenTableRow\">\n    <Style.Setters>\n      <Setter Property=\"Background\" Value=\"{mde:Alpha SystemBaseHighColor, 0.15}\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.CodeBlock\">\n    <Style.Setters>\n      <Setter Property=\"BorderBrush\"     Value=\"{mde:Alpha SystemBaseHighColor, 0.16}\"/>\n      <Setter Property=\"BorderThickness\" Value=\"0,5,0,5\"/>\n      <Setter Property=\"Margin\"          Value=\"5,0,5,0\"/>\n      <Setter Property=\"Background\"      Value=\"{mde:Alpha SystemBaseHighColor, 0.1}\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer TextBlock.CodeBlock\">\n    <Style.Setters>\n      <Setter Property=\"FontFamily\"      Value=\"menlo,monaco,consolas,droid sans mono,inconsolata,courier new,monospace,dejavu sans mono\"/>\n      <Setter Property=\"Foreground\"      Value=\"{mde:DivideColor Blue, SystemBaseHighColor, 0.45}\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.NoContainer\">\n    <Style.Setters>\n      <Setter Property=\"BorderBrush\"     Value=\"Red\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CCode\">\n    <Style.Setters>\n      <Setter Property=\"Foreground\" Value=\"{mde:DivideColor Blue, SystemBaseHighColor, 0.45}\" />\n      <Setter Property=\"Background\" Value=\"{mde:Alpha SystemBaseHighColor, 0.15}\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.Note\">\n    <Style.Setters>\n      <Setter Property=\"Margin\"          Value=\"5,0,5,0\"/>\n      <Setter Property=\"BorderBrush\"     Value=\"{mde:Alpha SystemBaseHighColor, 0.16}\"/>\n      <Setter Property=\"BorderThickness\" Value=\"3,3,3,3\"/>\n      <Setter Property=\"Background\"      Value=\"{mde:Alpha SystemBaseHighColor, 0.08}\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Note\">\n    <Style.Setters>\n      <Setter Property=\"Margin\"         Value=\"10, 5\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Grid.List\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"40,0,0,0\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.ListMarker\">\n    <Style.Setters>\n      <Setter Property=\"Margin\"         Value=\"0,5,5,5\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.Blockquote\">\n    <Style.Setters>\n      <Setter Property=\"BorderBrush\"     Value=\"{mde:Alpha SystemBaseHighColor, 0.16}\"/>\n      <Setter Property=\"BorderThickness\" Value=\"5,0,0,0\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer StackPanel.Blockquote\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"10, 5\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer mdc|Rule\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"0,3\"/>\n    </Style.Setters>\n  </Style>\n</Styles>"
  },
  {
    "path": "Markdown.Avalonia.Tight/StyleCollections/MarkdownStyleFluentTheme.axaml.cs",
    "content": "﻿using Avalonia.Markup.Xaml;\nusing Avalonia.Styling;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Markdown.Avalonia.StyleCollections\n{\n    public class MarkdownStyleFluentTheme : Styles, INamedStyle\n    {\n        public string Name => nameof(MarkdownStyle.FluentTheme);\n        public bool IsEditted { get; set; }\n\n        public MarkdownStyleFluentTheme()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/StyleCollections/MarkdownStyleGithubLike.axaml",
    "content": "<Styles\n      xmlns=\"https://github.com/avaloniaui\"\n        \n      xmlns:mdc=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\"\n      xmlns:mde=\"clr-namespace:Markdown.Avalonia.Extensions;assembly=Markdown.Avalonia\"\n      xmlns:ctxt=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        \n      x:Class=\"Markdown.Avalonia.StyleCollections.MarkdownStyleGithubLike\"\n      >\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"14\" />\n      <Setter Property=\"Margin\"     Value=\"0, 5\" />\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer TextBlock\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"14\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Paragraph\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"0, 7, 0, 0\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.Blockquote\">\n    <Style.Setters>\n      <Setter Property=\"BorderBrush\"     Value=\"#DEDEDE\"/>\n      <Setter Property=\"BorderThickness\" Value=\"5,0,0,0\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer StackPanel.Blockquote\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"10, 5\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Heading1\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"0, 0, 15, 0\"/>\n      <Setter Property=\"Foreground\"  Value=\"#ff000000\" />\n      <Setter Property=\"FontSize\"    Value=\"28\"/>\n      <Setter Property=\"FontWeight\"  Value=\"UltraBold\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Heading2\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"0, 0, 15, 0\"/>\n      <Setter Property=\"Foreground\"  Value=\"#ff000000\" />\n      <Setter Property=\"FontSize\"    Value=\"21\"/>\n      <Setter Property=\"FontWeight\"  Value=\"Bold\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Heading3\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"0, 0, 10, 0\"/>\n      <Setter Property=\"Foreground\"  Value=\"#ff000000\" />\n      <Setter Property=\"FontSize\"    Value=\"17.5\" />\n      <Setter Property=\"FontWeight\"  Value=\"Bold\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Heading4\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"0, 0, 5, 0\"/>\n      <Setter Property=\"Foreground\"  Value=\"#ff000000\" />\n      <Setter Property=\"FontSize\"    Value=\"14\"/>\n      <Setter Property=\"FontWeight\"  Value=\"Bold\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CCode\">\n    <Style.Setters>\n      <Setter Property=\"Foreground\" Value=\"DarkBlue\" />\n      <Setter Property=\"Background\" Value=\"LightGray\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.CodeBlock\">\n    <Style.Setters>\n      <Setter Property=\"Background\" Value=\"#12181F25\"/>\n      <Setter Property=\"Padding\"     Value=\"20, 10\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer TextBlock.CodeBlock\">\n    <Style.Setters>\n      <Setter Property=\"FontFamily\" Value=\"menlo,monaco,consolas,droid sans mono,inconsolata,courier new,monospace,dejavu sans mono\"/>\n      <Setter Property=\"FontSize\"   Value=\"11.9\"/>\n      <Setter Property=\"Foreground\" Value=\"DarkBlue\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.NoContainer\">\n    <Style.Setters>\n      <Setter Property=\"BorderBrush\"     Value=\"Red\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.Note\">\n    <Style.Setters>\n      <Setter Property=\"Margin\"      Value=\"5,0,5,0\"/>\n      <Setter Property=\"Padding\"     Value=\"10, 5\"/>\n      <Setter Property=\"BorderBrush\" Value=\"#DEDEDE\"/>\n      <Setter Property=\"BorderThickness\" Value=\"3,3,3,3\"/>\n      <Setter Property=\"Background\"  Value=\"#FAFAFA\"/>\n    </Style.Setters>\n  </Style>\n\n  <!-- <Style Selector=\"ctxt|CTextBlock.Note\">    </Style> -->\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Grid.List\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"40,0,0,0\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.ListMarker\">\n    <Style.Setters>\n      <Setter Property=\"Margin\"         Value=\"0,5,5,5\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.Table\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"5\"/>\n      <Setter Property=\"BorderThickness\" Value=\"0,0,1,1\"/>\n      <Setter Property=\"BorderBrush\" Value=\"#DFE2E5\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.TightTable\">\n    <Style.Setters>\n      <Setter Property=\"HorizontalAlignment\" Value=\"Left\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Grid.Table > Border\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"0\"/>\n      <Setter Property=\"BorderThickness\" Value=\"1,1,0,0\"/>\n      <Setter Property=\"BorderBrush\" Value=\"#DFE2E5\"/>\n      <Setter Property=\"Padding\" Value=\"13, 6\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Grid.Table\">\n    <Style.Setters>\n      <Setter Property=\"mdc:AutoScaleColumnDefinitions.IsEnabled\" Value=\"True\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.TableHeader ctxt|CTextBlock\">\n    <Style.Setters>\n      <Setter Property=\"FontWeight\" Value=\"Bold\"/>\n      <Setter Property=\"Background\" Value=\"#FFFFFF\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.OddTableRow\">\n    <Style.Setters>\n      <Setter Property=\"Background\" Value=\"White\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.EvenTableRow\">\n    <Style.Setters>\n      <Setter Property=\"Background\" Value=\"#F6F8FA\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CHyperlink\">\n    <Style.Setters>\n      <Setter Property=\"IsUnderline\" Value=\"true\"/>\n      <Setter Property=\"Foreground\" Value=\"Blue\"/>\n      <Setter Property=\"HoverForeground\" Value=\"Red\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer mdc|Rule\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"0,3\"/>\n    </Style.Setters>\n  </Style>\n</Styles>\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/StyleCollections/MarkdownStyleGithubLike.axaml.cs",
    "content": "﻿using Avalonia.Markup.Xaml;\nusing Avalonia.Styling;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Markdown.Avalonia.StyleCollections\n{\n    public class MarkdownStyleGithubLike : Styles, INamedStyle\n    {\n        public string Name => nameof(MarkdownStyle.GithubLike);\n        public bool IsEditted { get; set; }\n\n        public MarkdownStyleGithubLike()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/StyleCollections/MarkdownStyleStandard.axaml",
    "content": "<Styles\n      xmlns=\"https://github.com/avaloniaui\"\n        \n      xmlns:mdc=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\"\n      xmlns:mde=\"clr-namespace:Markdown.Avalonia.Extensions;assembly=Markdown.Avalonia\"\n      xmlns:ctxt=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n\n      x:Class=\"Markdown.Avalonia.StyleCollections.MarkdownStyleStandard\"\n      >\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"13\" />\n      <Setter Property=\"Margin\"     Value=\"0,5\" />\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer TextBlock\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"13\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Heading1\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"42\" />\n      <Setter Property=\"Foreground\" Value=\"#ff000000\" />\n      <Setter Property=\"FontWeight\" Value=\"Light\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Heading2\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"20\" />\n      <Setter Property=\"Foreground\" Value=\"#ff000000\" />\n      <Setter Property=\"FontWeight\" Value=\"Light\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Heading3\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"20\" />\n      <Setter Property=\"Foreground\" Value=\"#99000000\" />\n      <Setter Property=\"FontWeight\" Value=\"Light\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Heading4\">\n    <Style.Setters>\n      <Setter Property=\"FontSize\"   Value=\"14\" />\n      <Setter Property=\"Foreground\" Value=\"#99000000\" />\n      <Setter Property=\"FontWeight\" Value=\"Light\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.CodeBlock\">\n    <Style.Setters>\n      <Setter Property=\"BorderBrush\"     Value=\"#DEDEDE\"/>\n      <Setter Property=\"BorderThickness\" Value=\"0,5,0,5\"/>\n      <Setter Property=\"Margin\"          Value=\"5,0,5,0\"/>\n      <Setter Property=\"Background\"      Value=\"#EEEEEE\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer TextBlock.CodeBlock\">\n    <Style.Setters>\n      <Setter Property=\"FontFamily\"      Value=\"menlo,monaco,consolas,droid sans mono,inconsolata,courier new,monospace,dejavu sans mono\"/>\n      <Setter Property=\"Foreground\"      Value=\"DarkBlue\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.NoContainer\">\n    <Style.Setters>\n      <Setter Property=\"BorderBrush\"     Value=\"Red\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CCode\">\n    <Style.Setters>\n      <Setter Property=\"Foreground\" Value=\"DarkBlue\" />\n      <Setter Property=\"Background\" Value=\"LightGray\" />\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.Note\">\n    <Style.Setters>\n      <Setter Property=\"Margin\"          Value=\"5,0,5,0\"/>\n      <Setter Property=\"BorderBrush\"     Value=\"#DEDEDE\"/>\n      <Setter Property=\"BorderThickness\" Value=\"3,3,3,3\"/>\n      <Setter Property=\"Background\"      Value=\"#FAFAFA\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.Note\">\n    <Style.Setters>\n      <Setter Property=\"Margin\"         Value=\"10, 5\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Grid.List\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"40,0,0,0\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CTextBlock.ListMarker\">\n    <Style.Setters>\n      <Setter Property=\"Margin\"         Value=\"0,5,5,5\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.Table\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"5\"/>\n      <Setter Property=\"BorderThickness\" Value=\"0,0,1,1\"/>\n      <Setter Property=\"BorderBrush\" Value=\"Gray\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Grid.Table > Border\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"0\"/>\n      <Setter Property=\"BorderThickness\" Value=\"1,1,0,0\"/>\n      <Setter Property=\"BorderBrush\" Value=\"Gray\"/>\n      <Setter Property=\"Padding\" Value=\"2\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Grid.Table\">\n    <Style.Setters>\n      <Setter Property=\"mdc:AutoScaleColumnDefinitions.IsEnabled\" Value=\"True\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.TightTable\">\n    <Style.Setters>\n      <Setter Property=\"HorizontalAlignment\" Value=\"Left\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.TableHeader\">\n    <Style.Setters>\n      <Setter Property=\"Background\" Value=\"LightGray\"/>\n    </Style.Setters>\n  </Style>\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.TableHeader ctxt|CTextBlock\">\n    <Style.Setters>\n      <Setter Property=\"FontWeight\" Value=\"DemiBold\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.OddTableRow\">\n    <Style.Setters>\n      <Setter Property=\"Background\" Value=\"White\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.EvenTableRow\">\n    <Style.Setters>\n      <Setter Property=\"Background\" Value=\"#F5F5F5\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer Border.Blockquote\">\n    <Style.Setters>\n      <Setter Property=\"BorderBrush\"     Value=\"#DEDEDE\"/>\n      <Setter Property=\"BorderThickness\" Value=\"5,0,0,0\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer StackPanel.Blockquote\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"10, 5\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer ctxt|CHyperlink\">\n    <Style.Setters>\n      <Setter Property=\"IsUnderline\" Value=\"true\"/>\n      <Setter Property=\"Foreground\" Value=\"Blue\"/>\n      <Setter Property=\"HoverForeground\" Value=\"Red\"/>\n    </Style.Setters>\n  </Style>\n\n  <Style Selector=\".Markdown_Avalonia_MarkdownViewer mdc|Rule\">\n    <Style.Setters>\n      <Setter Property=\"Margin\" Value=\"0,3\"/>\n    </Style.Setters>\n  </Style>\n</Styles>\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/StyleCollections/MarkdownStyleStandard.axaml.cs",
    "content": "﻿using Avalonia.Markup.Xaml;\nusing Avalonia.Styling;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Markdown.Avalonia.StyleCollections\n{\n    public class MarkdownStyleStandard : Styles, INamedStyle\n    {\n        public string Name => nameof(MarkdownStyle.Standard);\n        public bool IsEditted { get; set; }\n\n        public MarkdownStyleStandard()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Tables/ITable.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace Markdown.Avalonia.Tables\n{\n    interface ITable\n    {\n        List<ITableCell> Header { get; }\n        List<List<ITableCell>> Details { get; }\n        int ColCount { get; }\n        int RowCount { get; }\n    }\n}\n\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Tables/ITableCell.cs",
    "content": "﻿using Avalonia.Media;\nusing Avalonia.Layout;\n\nnamespace Markdown.Avalonia.Tables\n{\n    interface ITableCell\n    {\n        int ColumnIndex { get; }\n\n        string? RawText { get; }\n        string? Text { get; }\n        int RowSpan { get; }\n        int ColSpan { get; }\n        TextAlignment? Horizontal { get; }\n        VerticalAlignment? Vertical { get; }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Tables/TextileTable.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Linq;\nusing Avalonia.Media;\nusing Avalonia.Layout;\n\nnamespace Markdown.Avalonia.Tables\n{\n    class TextileTable : ITable\n    {\n        public List<ITableCell> Header { get; }\n        public List<List<ITableCell>> Details { get; }\n        public int ColCount { get; }\n        public int RowCount { get; }\n\n        public TextileTable(\n            string[] header,\n            string[] styles,\n            IList<string[]> details)\n        {\n            Header = header.Select(txt =>\n            {\n                var cell = new TextileTableCell(txt);\n                // Ignore Header Row-span\n                cell.RowSpan = 1;\n                return cell;\n            }).ToList<ITableCell>();\n\n            Details = details.Select(row =>\n                row.Select(txt => new TextileTableCell(txt)).ToList<ITableCell>()\n            ).ToList();\n\n            // column-idx vs text-alignment\n            Dictionary<int, TextAlignment> styleMt = styles\n                    .Select((txt, idx) =>\n                    {\n                        var firstChar = txt[0];\n                        var lastChar = txt[txt.Length - 1];\n\n                        return\n                            (firstChar == ':' && lastChar == ':') ?\n                                 Tuple.Create(idx, (TextAlignment?)TextAlignment.Center) :\n\n                            (lastChar == ':') ?\n                                Tuple.Create(idx, (TextAlignment?)TextAlignment.Right) :\n\n                            (firstChar == ':') ?\n                                Tuple.Create(idx, (TextAlignment?)TextAlignment.Left) :\n\n                                Tuple.Create(idx, (TextAlignment?)null);\n                    })\n                    .Where(tpl => tpl.Item2.HasValue)\n                    .ToDictionary(tpl => tpl.Item1, tpl => tpl.Item2!.Value);\n\n            var styleColumnCount = styleMt.Count;\n\n            // apply cell style to header\n            var headerColumnCount = 0;\n            {\n                var colOffset = 0;\n                foreach (TextileTableCell cell in Header)\n                {\n                    cell.ColumnIndex = colOffset;\n\n                    // apply text align\n                    if (styleMt.TryGetValue(colOffset, out var style))\n                    {\n                        cell.Horizontal = style;\n                    }\n\n                    colOffset += cell.ColSpan;\n                }\n\n                headerColumnCount = colOffset;\n            }\n\n            // apply cell style to header\n            var colCntAtDetail = new List<int>();\n            var maxColCntInDetails = 1;\n            {\n                var multiRowsAtColIdx = new Dictionary<int, MdSpan>();\n                for (var rowIdx = 0; rowIdx < Details.Count; ++rowIdx)\n                {\n                    List<ITableCell> row = Details[rowIdx];\n\n                    var hasAnyCell = false;\n                    var colOffset = 0;\n\n                    var rowspansColOffset = multiRowsAtColIdx\n                        .Select(ent => ent.Value.ColSpan)\n                        .Sum();\n\n                    /*\n                     * In this row, is space exists to insert cell?\n                     * \n                     * eg. has space\n                     *    __________________________________\n                     *    | 2x1 cell | 1x1 cell | 1x1 cell |\n                     * -> |          |‾‾‾‾‾‾‾‾‾‾|‾‾‾‾‾‾‾‾‾‾|\n                     *    ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\n                     *    \n                     * eg. has no space: multi-rows occupy all space in this row.\n                     *    __________________________________\n                     *    | 2x1 cell |      2x2 cell        |\n                     * -> |          |                      |\n                     *    ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\n                     * \n                     */\n                    if (rowspansColOffset < maxColCntInDetails)\n                    {\n                        int colIdx;\n                        for (colIdx = 0; colIdx < row.Count;)\n                        {\n                            int colSpan;\n                            if (multiRowsAtColIdx.TryGetValue(colOffset, out var span))\n                            {\n                                colSpan = span.ColSpan;\n                            }\n                            else\n                            {\n                                hasAnyCell = true;\n\n                                var cell = (TextileTableCell)row[colIdx];\n                                cell.ColumnIndex = colOffset;\n\n                                // apply text align\n                                if (!cell.Horizontal.HasValue\n                                            && styleMt.TryGetValue(colOffset, out var style))\n                                {\n                                    cell.Horizontal = style;\n                                }\n\n                                colSpan = cell.ColSpan;\n\n                                if (cell.RowSpan > 1)\n                                {\n                                    multiRowsAtColIdx[colOffset] =\n                                        new MdSpan(cell.RowSpan, cell.ColSpan);\n                                }\n\n                                ++colIdx;\n                            }\n\n                            colOffset += colSpan;\n                        }\n\n                        foreach (var left in multiRowsAtColIdx.Where(tpl => tpl.Key >= colOffset)\n                                                              .OrderBy(tpl => tpl.Key))\n                        {\n                            while (colOffset < left.Key)\n                            {\n                                var cell = new TextileTableCell(null);\n                                cell.ColumnIndex = colOffset++;\n                                row.Add(cell);\n\n                            }\n                            colOffset += left.Value.ColSpan;\n                        }\n                    }\n\n                    colOffset += multiRowsAtColIdx\n                        .Where(ent => ent.Key >= colOffset)\n                        .Select(ent => ent.Value.ColSpan)\n                        .Sum();\n\n                    foreach (var spanEntry in multiRowsAtColIdx.ToArray())\n                    {\n                        if (--spanEntry.Value.Life == 0)\n                        {\n                            multiRowsAtColIdx.Remove(spanEntry.Key);\n                        }\n                    }\n\n                    colCntAtDetail.Add(colOffset);\n                    maxColCntInDetails = Math.Max(maxColCntInDetails, colOffset);\n\n                    if (!hasAnyCell)\n                    {\n                        Details.Insert(rowIdx, new List<ITableCell>());\n                    }\n                }\n\n                // if any multirow is left, insert an empty row.\n                while (multiRowsAtColIdx.Count > 0)\n                {\n                    var row = new List<ITableCell>();\n                    Details.Add(row);\n\n                    var colOffset = 0;\n\n                    foreach (var spanEntry in multiRowsAtColIdx.OrderBy(tpl => tpl.Key))\n                    {\n                        while (colOffset < spanEntry.Key)\n                        {\n                            var cell = new TextileTableCell(null);\n                            cell.ColumnIndex = colOffset++;\n                            row.Add(cell);\n\n                        }\n\n                        colOffset += spanEntry.Value.ColSpan;\n\n                        if (--spanEntry.Value.Life == 0)\n                        {\n                            multiRowsAtColIdx.Remove(spanEntry.Key);\n                        }\n                    }\n\n                    colCntAtDetail.Add(colOffset);\n                }\n            }\n\n            ColCount = Math.Max(Math.Max(headerColumnCount, styleColumnCount), maxColCntInDetails);\n            RowCount = Details.Count;\n\n            // insert cell for the shortfall\n\n            for (var retry = Header.Sum(cell => cell.ColSpan); retry < ColCount; ++retry)\n            {\n                var cell = new TextileTableCell(null);\n                cell.ColumnIndex = retry;\n                Header.Add(cell);\n            }\n\n            for (var rowIdx = 0; rowIdx < Details.Count; ++rowIdx)\n            {\n                for (var retry = colCntAtDetail[rowIdx]; retry < ColCount; ++retry)\n                {\n                    var cell = new TextileTableCell(null);\n                    cell.ColumnIndex = retry;\n                    Details[rowIdx].Add(cell);\n                }\n            }\n        }\n\n        class MdSpan\n        {\n            public int Life { set; get; }\n            public int ColSpan { set; get; }\n\n            public MdSpan(int l, int c)\n            {\n                Life = l;\n                ColSpan = c;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Tables/TextileTableCell.cs",
    "content": "﻿using System;\nusing System.Text;\nusing Avalonia.Media;\nusing Avalonia.Layout;\n\nnamespace Markdown.Avalonia.Tables\n{\n    class TextileTableCell : ITableCell\n    {\n        public int ColumnIndex { set; get; }\n\n        public string? RawText { get; }\n        public string? Text { get; }\n        public int RowSpan { set; get; }\n        public int ColSpan { set; get; }\n        public TextAlignment? Horizontal { set; get; }\n        public VerticalAlignment? Vertical { set; get; }\n\n        public TextileTableCell(string? txt)\n        {\n            RawText = txt;\n            RowSpan = 1;\n            ColSpan = 1;\n            Horizontal = null;\n            Vertical = null;\n\n            if (txt is null) return;\n\n            txt = ParseFormatFrom(txt);\n\n            var sb = new StringBuilder();\n            for (var i = 0; i < txt.Length; ++i)\n            {\n                var c = txt[i];\n\n                if (c == '\\\\')\n                {\n                    if (++i < txt.Length)\n                    {\n                        if (txt[i] == 'n')\n                            sb.Append(\"  \\n\"); // \\n => linebreak\n                        else\n                            sb.Append('\\\\').Append(txt[i]);\n                    }\n                    else\n                        sb.Append('\\\\');\n                }\n                else\n                    sb.Append(c);\n            }\n            Text = sb.ToString();\n        }\n\n        private string ParseFormatFrom(string txt)\n        {\n            int idx = txt.IndexOf('.');\n\n            if (idx == -1)\n            {\n                return txt.Trim();\n            }\n            else\n            {\n                var styleTxt = txt.Substring(0, idx);\n\n                for (var i = 0; i < styleTxt.Length; ++i)\n                {\n                    var c = styleTxt[i];\n\n                    switch (c)\n                    {\n                        case '/': // /2 rowspan\n                            ++i;\n                            var numTxt = ContinueToNum(styleTxt, ref i);\n                            if (numTxt.Length == 0) goto default;\n                            RowSpan = Int32.Parse(numTxt);\n\n                            break;\n\n                        case '\\\\': // \\2 colspan\n                            ++i;\n                            numTxt = ContinueToNum(styleTxt, ref i);\n                            if (numTxt.Length == 0) goto default;\n                            ColSpan = Int32.Parse(numTxt);\n                            break;\n\n                        case '<': // < left align\n                            Horizontal = TextAlignment.Left;\n                            break;\n\n                        case '>': // > right align\n                            Horizontal = TextAlignment.Right;\n                            break;\n\n                        case '=': // = center align \n                            Horizontal = TextAlignment.Center;\n                            break;\n\n                        case '^': // ^ top align\n                            Vertical = VerticalAlignment.Top;\n                            break;\n\n                        case '~': // ~ bottom align\n                            Vertical = VerticalAlignment.Bottom;\n                            break;\n\n                        default:\n                            RowSpan = 1;\n                            ColSpan = 1;\n                            Horizontal = null;\n                            Vertical = null;\n                            return txt.Trim();\n                    }\n                }\n                return txt.Substring(idx + 1).Trim();\n            }\n        }\n\n\n        private static string ContinueToNum(string charSource, ref int idx)\n        {\n            var builder = new StringBuilder();\n\n            for (; idx < charSource.Length; ++idx)\n            {\n                var c = charSource[idx];\n\n                if ('0' <= c && c <= '9')\n                    builder.Append(c);\n\n                else break;\n            }\n            --idx;\n            return builder.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/TextMarkerStyle.cs",
    "content": "﻿using ColorDocument.Avalonia.DocumentElements;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Markdown.Avalonia\n{\n    public enum TextMarkerStyle\n    {\n        Box,\n        Circle,\n        Decimal,\n        Disc,\n\n        LowerLatin,\n        LowerRoman,\n\n        UpperLatin,\n        UpperRoman,\n\n        Square,\n    }\n\n    public static class MarkdownStyleExt\n    {\n        public static ColorDocument.Avalonia.DocumentElements.TextMarkerStyle Change(this TextMarkerStyle style)\n        {\n            return style switch\n            {\n                TextMarkerStyle.Box => ColorDocument.Avalonia.DocumentElements.TextMarkerStyle.Box,\n                TextMarkerStyle.Circle => ColorDocument.Avalonia.DocumentElements.TextMarkerStyle.Circle,\n                TextMarkerStyle.Decimal => ColorDocument.Avalonia.DocumentElements.TextMarkerStyle.Decimal,\n                TextMarkerStyle.Disc => ColorDocument.Avalonia.DocumentElements.TextMarkerStyle.Disc,\n                TextMarkerStyle.LowerLatin => ColorDocument.Avalonia.DocumentElements.TextMarkerStyle.LowerLatin,\n                TextMarkerStyle.LowerRoman => ColorDocument.Avalonia.DocumentElements.TextMarkerStyle.LowerRoman,\n                TextMarkerStyle.UpperLatin => ColorDocument.Avalonia.DocumentElements.TextMarkerStyle.UpperLatin,\n                TextMarkerStyle.UpperRoman => ColorDocument.Avalonia.DocumentElements.TextMarkerStyle.UpperRoman,\n                TextMarkerStyle.Square => ColorDocument.Avalonia.DocumentElements.TextMarkerStyle.Square,\n            };\n        }\n\n        public static string CreateMakerText(this TextMarkerStyle textMarker, int index)\n            => textMarker.Change().CreateMakerText(index);\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Utils/DefaultBitmapLoader.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Media.Imaging;\nusing Avalonia.Platform;\nusing System;\nusing System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing System.Net.Http;\nusing System.Reflection;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Markdown.Avalonia.Utils\n{\n    [Obsolete(\"see https://github.com/whistyun/Markdown.Avalonia/wiki/How-to-migrages-to-ver11\")]\n    public class DefaultBitmapLoader : IBitmapLoader\n    {\n        private static readonly HttpClient _httpclient = new();\n\n        public string AssetPathRoot { set; private get; }\n        private string[] AssetAssemblyNames { get; }\n\n        private ConcurrentDictionary<Uri, WeakReference<Bitmap>> Cache;\n\n        public DefaultBitmapLoader()\n        {\n            AssetPathRoot = Environment.CurrentDirectory;\n\n            var stack = new StackTrace();\n            this.AssetAssemblyNames = stack.GetFrames()\n                            .Select(frm => frm?.GetMethod()?.DeclaringType?.Assembly?.GetName()?.Name)\n                            .OfType<string>()\n                            .Where(name => !name.Equals(\"Markdown.Avalonia\"))\n                            .Distinct()\n                            .ToArray();\n\n            Cache = new ConcurrentDictionary<Uri, WeakReference<Bitmap>>();\n        }\n\n\n        private void Compact()\n        {\n            foreach (var entry in Cache.ToArray())\n            {\n                if (!entry.Value.TryGetTarget(out var _))\n                {\n                    ((IDictionary<Uri, WeakReference<Bitmap>>)Cache).Remove(entry.Key);\n                }\n            }\n        }\n\n        public Task<Bitmap?> GetAsync(string urlTxt)\n        {\n            return Task.Run(() => Get(urlTxt));\n        }\n\n        public Bitmap? Get(string urlTxt)\n        {\n            Bitmap? imgSource = null;\n\n            // check network\n            if (Uri.TryCreate(urlTxt, UriKind.Absolute, out var url))\n            {\n                imgSource = Get(url);\n            }\n\n            // check resources\n            if (imgSource is null)\n            {\n                foreach (var asmNm in AssetAssemblyNames)\n                {\n                    var assetUrl = new Uri($\"avares://{asmNm}/{urlTxt}\");\n                    imgSource = Get(assetUrl);\n\n                    if (imgSource != null) break;\n                }\n            }\n\n            // check filesystem\n            if (imgSource is null && AssetPathRoot != null)\n            {\n                try\n                {\n                    if (Uri.IsWellFormedUriString(AssetPathRoot, UriKind.Absolute))\n                    {\n                        imgSource = Get(new Uri(new Uri(AssetPathRoot), urlTxt));\n                    }\n                    else\n                    {\n                        using (var strm = File.OpenRead(Path.Combine(AssetPathRoot, urlTxt)))\n                            imgSource = new Bitmap(strm);\n                    }\n                }\n                catch { }\n            }\n\n            return imgSource;\n        }\n\n        public Bitmap? Get(Uri url)\n        {\n            if (Cache.TryGetValue(url, out var reference))\n            {\n                if (reference.TryGetTarget(out var image))\n                {\n                    return image;\n                }\n            }\n\n            Compact();\n\n            Bitmap imgSource;\n\n            try\n            {\n                switch (url.Scheme)\n                {\n                    case \"http\":\n                    case \"https\":\n                        using (var res = _httpclient.GetAsync(url).Result)\n                        using (var strm = res.Content.ReadAsStreamAsync().Result)\n                            imgSource = new Bitmap(strm);\n                        break;\n\n                    case \"file\":\n                        if (!File.Exists(url.LocalPath)) return null;\n\n                        using (var strm = File.OpenRead(url.LocalPath))\n                            imgSource = new Bitmap(strm);\n                        break;\n\n                    case \"avares\":\n                        using (var strm = AssetLoader.Open(url))\n                            imgSource = new Bitmap(strm);\n                        break;\n\n                    default:\n                        throw new InvalidDataException($\"unsupport scheme '{url.Scheme}'\");\n                }\n            }\n            catch\n            {\n                return null;\n            }\n\n            Cache[url] = new WeakReference<Bitmap>(imgSource);\n\n            return imgSource;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Utils/DefaultHyperlinkCommand.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing System.Windows.Input;\n\nnamespace Markdown.Avalonia.Utils\n{\n    public class DefaultHyperlinkCommand : ICommand\n    {\n        public event EventHandler? CanExecuteChanged;\n\n        private bool _isExecutable = true;\n        public bool IsExecutable\n        {\n            get => _isExecutable;\n            set\n            {\n                if (_isExecutable != value)\n                {\n                    _isExecutable = value;\n                    CanExecuteChanged?.Invoke(this, new EventArgs());\n                }\n            }\n        }\n\n        public bool CanExecute(object? parameter)\n        {\n            return parameter is string;\n        }\n\n        public void Execute(object? parameter)\n        {\n            var url = parameter as string;\n            GoTo(url ?? \"\");\n        }\n\n        public static void GoTo(string url)\n        {\n            // https://github.com/dotnet/runtime/issues/17938\n            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))\n                Process.Start(new ProcessStartInfo(url)\n                {\n                    UseShellExecute = true,\n                    Verb = \"open\"\n                });\n\n            else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))\n                Process.Start(\"xdg-open\", url);\n\n            else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))\n                Process.Start(\"open\", url);\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Utils/DefaultPathResolver.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Media.Imaging;\nusing Avalonia.Platform;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Net;\nusing System.Net.Http;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Markdown.Avalonia.Utils\n{\n    public class DefaultPathResolver : IPathResolver\n    {\n        private static readonly HttpClient s_httpclient = new();\n\n        public string? AssetPathRoot { set; private get; }\n        public IEnumerable<string>? CallerAssemblyNames { set; private get; }\n\n        public async Task<Stream?>? ResolveImageResource(string relativeOrAbsolutePath)\n        {\n            // absolute path?\n            // ( http://... and C:\\... )\n            if (Uri.TryCreate(relativeOrAbsolutePath, UriKind.Absolute, out var aburl))\n            {\n                var stream = await OpenStream(aburl);\n                if (stream is not null)\n                    return stream;\n            }\n\n            if (CallerAssemblyNames is not null)\n            {\n                foreach (var asmNm in CallerAssemblyNames)\n                {\n                    var assetUrl = new Uri($\"avares://{asmNm}/{relativeOrAbsolutePath}\");\n\n                    var stream = await OpenStream(assetUrl);\n                    if (stream is not null)\n                        return stream;\n                }\n            }\n\n            if (AssetPathRoot is not null)\n            {\n                Uri pathUri;\n                if (Path.IsPathRooted(AssetPathRoot))\n                {\n                    pathUri = new Uri(Path.Combine(AssetPathRoot, relativeOrAbsolutePath));\n                }\n                else\n                {\n                    pathUri = new Uri(new Uri(AssetPathRoot), relativeOrAbsolutePath);\n                }\n\n                var stream = await OpenStream(pathUri);\n                if (stream is not null)\n                    return stream;\n            }\n\n            throw new NotImplementedException();\n        }\n\n        private async Task<Stream?> OpenStream(Uri url)\n        {\n            switch (url.Scheme)\n            {\n                case \"http\":\n                case \"https\":\n                    var response = await s_httpclient.GetAsync(url);\n                    return await response.Content.ReadAsStreamAsync();\n\n                case \"file\":\n                    if (!File.Exists(url.LocalPath)) return null;\n                    return File.OpenRead(url.LocalPath);\n\n                case \"avares\":\n                    if (!AssetLoader.Exists(url))\n                        return null;\n\n                    return AssetLoader.Open(url);\n\n                default:\n                    throw new InvalidDataException($\"unsupport scheme '{url.Scheme}'\");\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Utils/Helper.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Platform;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Markdown.Avalonia.Utils\n{\n    static class Helper\n    {\n        public static void ThrowInvalidOperation(string msg)\n        {\n            throw new InvalidOperationException(msg);\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Utils/IBitmapLoader.cs",
    "content": "﻿using Avalonia.Media.Imaging;\nusing Avalonia.Platform;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Markdown.Avalonia.Utils\n{\n    [Obsolete(\"see https://github.com/whistyun/Markdown.Avalonia/wiki/How-to-migrages-to-ver11\")]\n    public interface IBitmapLoader\n    {\n        /// <summary>\n        /// local file root path or url, the default is current directory.\n        /// </summary>\n        string AssetPathRoot { set; }\n\n        Bitmap? Get(string urlTxt);\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Utils/IContainerBlockHandler.cs",
    "content": "using Avalonia.Controls;\n\nnamespace Markdown.Avalonia.Utils\n{\n  /// <summary>\n  /// support for Container blocks\n  /// https://talk.commonmark.org/t/generic-directives-plugins-syntax/444\n  /// </summary>\n  public interface IContainerBlockHandler\n  {\n    /// <summary>\n    /// Custom text parsing & content generation\n    /// Based on https://talk.commonmark.org/t/generic-directives-plugins-syntax/444\n    /// </summary>\n    /// <param name=\"assetPathRoot\">Asset Path Root</param>\n    /// <param name=\"blockName\">Block Name</param>\n    /// <param name=\"lines\">Text to parse</param>\n    /// <returns>Controls; or null when no container founds</returns>\n    Border? ProvideControl( string assetPathRoot,\n                           string blockName,\n                           string lines );\n  }\n}"
  },
  {
    "path": "Markdown.Avalonia.Tight/Utils/IImageResolver.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Controls.Shapes;\nusing Avalonia.Media;\nusing Avalonia.Media.Imaging;\nusing Avalonia.Platform;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Net;\nusing System.Net.Http;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Markdown.Avalonia.Utils\n{\n    /// <summary>\n    /// Derivered classes create IImage from image resources.\n    /// </summary>\n    public interface IImageResolver\n    {\n        /// <summary>\n        /// Open image\n        /// </summary>\n        /// <param name=\"stream\">image resource. Stream is seek-able and close-able.</param>\n        /// <returns>\n        /// Images.\n        /// Return null if derived class cannot create IImage, e.g. because resource is not supportted.\n        /// </returns>\n        Task<IImage?> Load(Stream stream);\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Utils/IPathResolver.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Controls.Shapes;\nusing Avalonia.Media;\nusing Avalonia.Media.Imaging;\nusing Avalonia.Platform;\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Net;\nusing System.Net.Http;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Markdown.Avalonia.Utils\n{\n    /// <summary>\n    /// Derived classes open an image resources from relative or absolute paths.\n    /// Relative paths may be converted to absolute paths in derived classes.\n    /// </summary>\n    public interface IPathResolver\n    {\n        string? AssetPathRoot { set; }\n        IEnumerable<string>? CallerAssemblyNames { set; }\n\n        /// <summary>\n        /// Open an image resource.\n        /// </summary>\n        /// <param name=\"relativeOrAbsolutePath\">The image path</param>\n        /// <returns>\n        /// The task of the image resource.\n        /// Returns null if the image does not exist or cannot be opened.\n        /// If the result of the asynchronous search cannot be resolved, Task.Result returns null.\n        /// </returns>\n        Task<Stream?>? ResolveImageResource(string relativeOrAbsolutePath);\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Utils/InterassemblyUtil.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing System.Text;\n\nnamespace Markdown.Avalonia.Utils\n{\n    static class InterassemblyUtil\n    {\n        public static T? InvokeInstanceMethodToGetProperty<T>(string asmNm, string typeNm, string methodNm, params object[] methodArgs) where T : class\n        {\n            var asm = Assembly.Load(asmNm);\n            var setupTp = asm.GetType(typeNm);\n            if (setupTp is null)\n                throw new NullReferenceException($\"Failed to load '{typeNm}' in '{asm.FullName}'.\");\n\n            var method = setupTp.GetMethod(methodNm);\n            if (method is null)\n                throw new NullReferenceException($\"'{methodNm}' method dosen't exist in '{typeNm}'.\");\n\n            if (method.IsStatic) return null;\n            if (method.GetParameters().Length != methodArgs.Length) return null;\n\n            var setupObj = Activator.CreateInstance(setupTp);\n            var result = method.Invoke(setupObj, methodArgs);\n\n            return result as T;\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Utils/TextUtil.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\n\nnamespace Markdown.Avalonia.Utils\n{\n    static class TextUtil\n    {\n        /// <summary>\n        /// Count the number of leading whilte-spaces.\n        /// tab is treated as 4-spaces.\n        /// </summary>\n        public static int CountIndent(string line)\n        {\n            var count = 0;\n            foreach (var c in line)\n            {\n                if (c == ' ') count += 1;\n                else if (c == '\\t')\n                {\n                    // In default in vs, tab is treated as four-spaces.\n                    count = ((count >> 2) + 1) << 2;\n                }\n                else break;\n            }\n            return count;\n        }\n\n        /// <summary>\n        /// Removes the leading white-space. the number of removed spaces is `indentCount`.\n        /// \n        /// If the leading white-space is too short than `indentCount`,\n        /// this method removes all leading white-spaces.\n        /// </summary>\n        public static string DetentLineBestEffort(string line, int indentCount)\n        {\n            // this index count tab as 1: for String.Substring\n            var realIdx = 0;\n            // this index count tab as 4: for human (I think most text-editor treats tab as 4spaces)\n            var viewIdx = 0;\n\n            while (viewIdx < indentCount && realIdx < line.Length)\n            {\n                var c = line[realIdx];\n                if (c == ' ')\n                {\n                    realIdx += 1;\n                    viewIdx += 1;\n                }\n                else if (c == '\\t')\n                {\n                    realIdx += 1;\n                    // when mixing space and tab (ex: space space tab), some space should be ignored.\n                    viewIdx = ((viewIdx >> 2) + 1) << 2;\n                }\n\n                // give up ded\n                else break;\n            }\n\n            return line.Substring(realIdx);\n        }\n\n\n        /// <summary>\n        /// Removes the leading white-space. the number of removed spaces is `indentCount`.\n        /// \n        /// If the leading white-space is too short than `indentCount`,\n        /// this method return 'false' and `detendedLine` is set null.\n        /// </summary>\n        public static bool TryDetendLine(string line, int indentCount, out string detendedLine)\n        {\n            // this index count tab as 1: for String.Substring\n            var realIdx = 0;\n            // this index count tab as 4: for human (I think most text-editor treats tab as 4spaces)\n            var viewIdx = 0;\n\n            while (viewIdx < indentCount && realIdx < line.Length)\n            {\n                var c = line[realIdx];\n                if (c == ' ')\n                {\n                    realIdx += 1;\n                    viewIdx += 1;\n                }\n                else if (c == '\\t')\n                {\n                    realIdx += 1;\n                    // when mixing space and tab (ex: space space tab), some space should be ignored.\n                    viewIdx = ((viewIdx >> 2) + 1) << 2;\n                }\n\n                // give up ded\n                else\n                {\n                    detendedLine = string.Empty;\n                    return false;\n                }\n            }\n\n            detendedLine = line.Substring(realIdx);\n            return true;\n        }\n\n        /// <summary>\n        /// convert all tabs to _tabWidth spaces; \n        /// standardizes line endings from DOS (CR LF) or Mac (CR) to UNIX (LF); \n        /// makes sure text ends with a couple of newlines; \n        /// removes any blank lines (only spaces) in the text\n        /// </summary>\n        public static string Normalize(string text, int tabWidth = 4)\n        {\n            if (text is null)\n            {\n                throw new ArgumentNullException(nameof(text));\n            }\n\n            var output = new StringBuilder(text.Length);\n            var line = new StringBuilder();\n            bool valid = false;\n\n            for (int i = 0; i < text.Length; i++)\n            {\n                switch (text[i])\n                {\n                    case '\\n':\n                        if (valid)\n                            output.Append(line);\n                        output.Append('\\n');\n                        line.Length = 0;\n                        valid = false;\n                        break;\n                    case '\\r':\n                        if ((i < text.Length - 1) && (text[i + 1] != '\\n'))\n                        {\n                            if (valid)\n                                output.Append(line);\n                            output.Append('\\n');\n                            line.Length = 0;\n                            valid = false;\n                        }\n                        break;\n                    case '\\t':\n                        int width = (tabWidth - line.Length % tabWidth);\n                        for (int k = 0; k < width; k++)\n                            line.Append(' ');\n                        break;\n                    case '\\x1A':\n                        break;\n                    default:\n                        if (!valid && text[i] != ' ')\n                            valid = true;\n                        line.Append(text[i]);\n                        break;\n                }\n            }\n\n            if (valid)\n                output.Append(line);\n\n            if (output.Length >= 1 && output[output.Length - 1] != '\\n')\n                output.Append('\\n');\n\n            // add two newlines to the end before return\n            return output.ToString();\n        }\n\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.Tight/Utils/ThemeDetector.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Markup.Xaml.Styling;\nusing Avalonia.Styling;\n\n\nnamespace Markdown.Avalonia.Utils\n{\n    static class ThemeDetector\n    {\n        private static readonly string s_SimpleThemeFQCN = \"Avalonia.Themes.Simple.SimpleTheme\";\n        private static readonly string s_FluentThemeFQCN = \"Avalonia.Themes.Fluent.FluentTheme\";\n        private static readonly string s_FluentAvaloniaFQCN = \"FluentAvalonia.Styling.FluentAvaloniaTheme\";\n\n        private static readonly string s_SimpleThemeHost = \"Avalonia.Themes.Simple\";\n        private static readonly string s_FluentThemeHost = \"Avalonia.Themes.Fluent\";\n        private static readonly string s_FluentAvaloniaHost = \"FluentAvalonia\";\n\n        static bool? s_isSimpleUsed;\n        static bool? s_isFluentUsed;\n        static bool? s_isFluentAvaloniaUsed;\n\n        private static bool? CheckApplicationCurrentStyle(string themeFQCN, string avaresHost)\n        {\n            if (Application.Current is null\n                    || Application.Current.Styles is null)\n                return null;\n\n            foreach (var style in Application.Current.Styles)\n            {\n                if (style.GetType().FullName == themeFQCN)\n                {\n                    return true;\n                }\n                if (style is StyleInclude incld)\n                {\n                    var uri = incld.Source;\n\n                    if (uri is null) return false;\n                    if (!uri.IsAbsoluteUri) return false;\n\n                    try { return uri.Host == avaresHost; }\n                    catch { return false; }\n                }\n                else return false;\n            }\n\n            return false;\n        }\n\n        public static bool? IsSimpleUsed\n        {\n            get\n            {\n                if (s_isSimpleUsed.HasValue)\n                    return s_isSimpleUsed;\n\n                return s_isSimpleUsed = CheckApplicationCurrentStyle(s_SimpleThemeFQCN, s_SimpleThemeHost);\n            }\n        }\n\n\n        public static bool? IsFluentUsed\n        {\n            get\n            {\n                if (s_isFluentUsed.HasValue)\n                    return s_isFluentUsed;\n\n                return s_isFluentUsed = CheckApplicationCurrentStyle(s_FluentThemeFQCN, s_FluentThemeHost);\n            }\n        }\n\n\n        public static bool? IsFluentAvaloniaUsed\n        {\n            get\n            {\n                if (s_isFluentAvaloniaUsed.HasValue)\n                    return s_isFluentAvaloniaUsed;\n\n                return s_isFluentAvaloniaUsed = CheckApplicationCurrentStyle(s_FluentAvaloniaFQCN, s_FluentAvaloniaHost);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Markdown.Avalonia.props",
    "content": "<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n\n  <PropertyGroup>\n    <PackageTargetFrameworks>net8.0;net10.0</PackageTargetFrameworks>\n    <DemoAppTargetFrameworks>net8.0;net10.0</DemoAppTargetFrameworks>\n    <TestTargetFrameworks>net8.0;net10.0</TestTargetFrameworks>\n  </PropertyGroup>\n\n  <PropertyGroup>\n    <AvaloniaVersion>12.0.0</AvaloniaVersion>\n    <DemoAvaloniaVersion>12.0.0</DemoAvaloniaVersion>\n    <EnableAvaloniaEdit>enabled</EnableAvaloniaEdit>\n    <AvaloniaEditVersion>12.0.0</AvaloniaEditVersion>\n    <AvaloniaSvgVersion>12.0.0.1</AvaloniaSvgVersion>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\" '$(AVA_VER)' != '' \">\n    <TestAvaloniaVersion>$(AVA_VER)</TestAvaloniaVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(AVA_VER)' == '' \">\n    <TestAvaloniaVersion>$(AvaloniaVersion)</TestAvaloniaVersion>\n  </PropertyGroup>\n\n  <PropertyGroup>\n    <PackageVersion>12.0.0-a3</PackageVersion>\n  </PropertyGroup>\n\n</Project>\n\n\n"
  },
  {
    "path": "Markdown.Avalonia.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.4.33110.190\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Markdown.Avalonia.Tight\", \"Markdown.Avalonia.Tight\\Markdown.Avalonia.Tight.csproj\", \"{B5FBF669-6012-4A62-9EAC-9ECB7BD599FC}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ColorTextBlock.Avalonia\", \"ColorTextBlock.Avalonia\\ColorTextBlock.Avalonia.csproj\", \"{E4F9286F-A812-476E-A37D-EE2B8ED5D958}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Markdown.AvaloniaDemo\", \"demos\\Markdown.AvaloniaDemo\\Markdown.AvaloniaDemo.csproj\", \"{51318A0F-CB37-4DA2-8AE1-BB985B0A4028}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Markdown.AvaloniaFluentDemo\", \"demos\\Markdown.AvaloniaFluentDemo\\Markdown.AvaloniaFluentDemo.csproj\", \"{BC6B016B-B353-4E73-A98E-556DC70E5850}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"tests\", \"tests\", \"{AD84CF32-2208-43FD-95CE-31DF8DFEB2CD}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"UnitTest.Base\", \"tests\\UnitTest.Base\\UnitTest.Base.csproj\", \"{B5F20CDD-025F-4BD8-A1AF-0F3EC9B6E8E4}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"UnitTest.CTxt\", \"tests\\UnitTest.CTxt\\UnitTest.CTxt.csproj\", \"{A3A5D851-4041-403A-95F9-F4ADBA9602A0}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"UnitTest.Md\", \"tests\\UnitTest.Md\\UnitTest.Md.csproj\", \"{C763BC05-5587-479E-8225-AA33F1F8F55B}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Markdown.Avalonia\", \"Markdown.Avalonia\\Markdown.Avalonia.csproj\", \"{29F1D11A-4490-4E50-AE72-72DBBA0157BE}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"UnitTest.MdSyntax\", \"tests\\UnitTest.MdSyntax\\UnitTest.MdSyntax.csproj\", \"{BC356FD7-5D47-495A-9255-A4199AA8E3A1}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Markdown.Avalonia.SyntaxHigh\", \"Markdown.Avalonia.SyntaxHigh\\Markdown.Avalonia.SyntaxHigh.csproj\", \"{B3438E36-4598-49FB-8E52-65C231978E4D}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Markdown.AvaloniaFluentAvaloniaDemo\", \"demos\\Markdown.AvaloniaFluentAvaloniaDemo\\Markdown.AvaloniaFluentAvaloniaDemo.csproj\", \"{58E76A9C-D28E-45BD-85F2-885FF3E4B363}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Markdown.Avalonia.Svg\", \"Markdown.Avalonia.Svg\\Markdown.Avalonia.Svg.csproj\", \"{0514B7E7-23D6-4B9D-8943-995AE57493C1}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"demos\", \"demos\", \"{8F902BB3-7573-4180-A911-6CC019E999CC}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Markdown.Avalonia.Html\", \"Markdown.Avalonia.Html\\Markdown.Avalonia.Html.csproj\", \"{CDAC497D-BF0F-48F0-A156-8DE2DAB15492}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"UnitTest.MdHtml\", \"tests\\UnitTest.MdHtml\\UnitTest.MdHtml.csproj\", \"{6034AA93-6F76-4F4B-B8AC-0A20E3BD35FF}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ColorDocument.Avalonia\", \"ColorDocument.Avalonia\\ColorDocument.Avalonia.csproj\", \"{008A6F1F-A1D9-45ED-B3CF-3106A59A4417}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"benchmark\", \"benchmark\", \"{F5ED37EA-8110-4262-9310-3990EE6D9BFE}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"MdAvBench\", \"benchmark\\MdAvBench\\MdAvBench.csproj\", \"{57CC28E5-9915-4AFA-A5E5-B7977BBF8589}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{B5FBF669-6012-4A62-9EAC-9ECB7BD599FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B5FBF669-6012-4A62-9EAC-9ECB7BD599FC}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B5FBF669-6012-4A62-9EAC-9ECB7BD599FC}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{B5FBF669-6012-4A62-9EAC-9ECB7BD599FC}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{B5FBF669-6012-4A62-9EAC-9ECB7BD599FC}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{B5FBF669-6012-4A62-9EAC-9ECB7BD599FC}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{B5FBF669-6012-4A62-9EAC-9ECB7BD599FC}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B5FBF669-6012-4A62-9EAC-9ECB7BD599FC}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B5FBF669-6012-4A62-9EAC-9ECB7BD599FC}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{B5FBF669-6012-4A62-9EAC-9ECB7BD599FC}.Release|x64.Build.0 = Release|Any CPU\n\t\t{B5FBF669-6012-4A62-9EAC-9ECB7BD599FC}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{B5FBF669-6012-4A62-9EAC-9ECB7BD599FC}.Release|x86.Build.0 = Release|Any CPU\n\t\t{E4F9286F-A812-476E-A37D-EE2B8ED5D958}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E4F9286F-A812-476E-A37D-EE2B8ED5D958}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E4F9286F-A812-476E-A37D-EE2B8ED5D958}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{E4F9286F-A812-476E-A37D-EE2B8ED5D958}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{E4F9286F-A812-476E-A37D-EE2B8ED5D958}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{E4F9286F-A812-476E-A37D-EE2B8ED5D958}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{E4F9286F-A812-476E-A37D-EE2B8ED5D958}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E4F9286F-A812-476E-A37D-EE2B8ED5D958}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E4F9286F-A812-476E-A37D-EE2B8ED5D958}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{E4F9286F-A812-476E-A37D-EE2B8ED5D958}.Release|x64.Build.0 = Release|Any CPU\n\t\t{E4F9286F-A812-476E-A37D-EE2B8ED5D958}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{E4F9286F-A812-476E-A37D-EE2B8ED5D958}.Release|x86.Build.0 = Release|Any CPU\n\t\t{51318A0F-CB37-4DA2-8AE1-BB985B0A4028}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{51318A0F-CB37-4DA2-8AE1-BB985B0A4028}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{51318A0F-CB37-4DA2-8AE1-BB985B0A4028}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{51318A0F-CB37-4DA2-8AE1-BB985B0A4028}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{51318A0F-CB37-4DA2-8AE1-BB985B0A4028}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{51318A0F-CB37-4DA2-8AE1-BB985B0A4028}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{51318A0F-CB37-4DA2-8AE1-BB985B0A4028}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{51318A0F-CB37-4DA2-8AE1-BB985B0A4028}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{51318A0F-CB37-4DA2-8AE1-BB985B0A4028}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{51318A0F-CB37-4DA2-8AE1-BB985B0A4028}.Release|x64.Build.0 = Release|Any CPU\n\t\t{51318A0F-CB37-4DA2-8AE1-BB985B0A4028}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{51318A0F-CB37-4DA2-8AE1-BB985B0A4028}.Release|x86.Build.0 = Release|Any CPU\n\t\t{BC6B016B-B353-4E73-A98E-556DC70E5850}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{BC6B016B-B353-4E73-A98E-556DC70E5850}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{BC6B016B-B353-4E73-A98E-556DC70E5850}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{BC6B016B-B353-4E73-A98E-556DC70E5850}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{BC6B016B-B353-4E73-A98E-556DC70E5850}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{BC6B016B-B353-4E73-A98E-556DC70E5850}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{BC6B016B-B353-4E73-A98E-556DC70E5850}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{BC6B016B-B353-4E73-A98E-556DC70E5850}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{BC6B016B-B353-4E73-A98E-556DC70E5850}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{BC6B016B-B353-4E73-A98E-556DC70E5850}.Release|x64.Build.0 = Release|Any CPU\n\t\t{BC6B016B-B353-4E73-A98E-556DC70E5850}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{BC6B016B-B353-4E73-A98E-556DC70E5850}.Release|x86.Build.0 = Release|Any CPU\n\t\t{B5F20CDD-025F-4BD8-A1AF-0F3EC9B6E8E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B5F20CDD-025F-4BD8-A1AF-0F3EC9B6E8E4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B5F20CDD-025F-4BD8-A1AF-0F3EC9B6E8E4}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{B5F20CDD-025F-4BD8-A1AF-0F3EC9B6E8E4}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{B5F20CDD-025F-4BD8-A1AF-0F3EC9B6E8E4}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{B5F20CDD-025F-4BD8-A1AF-0F3EC9B6E8E4}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{B5F20CDD-025F-4BD8-A1AF-0F3EC9B6E8E4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B5F20CDD-025F-4BD8-A1AF-0F3EC9B6E8E4}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B5F20CDD-025F-4BD8-A1AF-0F3EC9B6E8E4}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{B5F20CDD-025F-4BD8-A1AF-0F3EC9B6E8E4}.Release|x64.Build.0 = Release|Any CPU\n\t\t{B5F20CDD-025F-4BD8-A1AF-0F3EC9B6E8E4}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{B5F20CDD-025F-4BD8-A1AF-0F3EC9B6E8E4}.Release|x86.Build.0 = Release|Any CPU\n\t\t{A3A5D851-4041-403A-95F9-F4ADBA9602A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A3A5D851-4041-403A-95F9-F4ADBA9602A0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A3A5D851-4041-403A-95F9-F4ADBA9602A0}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{A3A5D851-4041-403A-95F9-F4ADBA9602A0}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{A3A5D851-4041-403A-95F9-F4ADBA9602A0}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{A3A5D851-4041-403A-95F9-F4ADBA9602A0}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{A3A5D851-4041-403A-95F9-F4ADBA9602A0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A3A5D851-4041-403A-95F9-F4ADBA9602A0}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A3A5D851-4041-403A-95F9-F4ADBA9602A0}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{A3A5D851-4041-403A-95F9-F4ADBA9602A0}.Release|x64.Build.0 = Release|Any CPU\n\t\t{A3A5D851-4041-403A-95F9-F4ADBA9602A0}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{A3A5D851-4041-403A-95F9-F4ADBA9602A0}.Release|x86.Build.0 = Release|Any CPU\n\t\t{C763BC05-5587-479E-8225-AA33F1F8F55B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C763BC05-5587-479E-8225-AA33F1F8F55B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C763BC05-5587-479E-8225-AA33F1F8F55B}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{C763BC05-5587-479E-8225-AA33F1F8F55B}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{C763BC05-5587-479E-8225-AA33F1F8F55B}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{C763BC05-5587-479E-8225-AA33F1F8F55B}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{C763BC05-5587-479E-8225-AA33F1F8F55B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C763BC05-5587-479E-8225-AA33F1F8F55B}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C763BC05-5587-479E-8225-AA33F1F8F55B}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{C763BC05-5587-479E-8225-AA33F1F8F55B}.Release|x64.Build.0 = Release|Any CPU\n\t\t{C763BC05-5587-479E-8225-AA33F1F8F55B}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{C763BC05-5587-479E-8225-AA33F1F8F55B}.Release|x86.Build.0 = Release|Any CPU\n\t\t{29F1D11A-4490-4E50-AE72-72DBBA0157BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{29F1D11A-4490-4E50-AE72-72DBBA0157BE}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{29F1D11A-4490-4E50-AE72-72DBBA0157BE}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{29F1D11A-4490-4E50-AE72-72DBBA0157BE}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{29F1D11A-4490-4E50-AE72-72DBBA0157BE}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{29F1D11A-4490-4E50-AE72-72DBBA0157BE}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{29F1D11A-4490-4E50-AE72-72DBBA0157BE}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{29F1D11A-4490-4E50-AE72-72DBBA0157BE}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{29F1D11A-4490-4E50-AE72-72DBBA0157BE}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{29F1D11A-4490-4E50-AE72-72DBBA0157BE}.Release|x64.Build.0 = Release|Any CPU\n\t\t{29F1D11A-4490-4E50-AE72-72DBBA0157BE}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{29F1D11A-4490-4E50-AE72-72DBBA0157BE}.Release|x86.Build.0 = Release|Any CPU\n\t\t{BC356FD7-5D47-495A-9255-A4199AA8E3A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{BC356FD7-5D47-495A-9255-A4199AA8E3A1}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{BC356FD7-5D47-495A-9255-A4199AA8E3A1}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{BC356FD7-5D47-495A-9255-A4199AA8E3A1}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{BC356FD7-5D47-495A-9255-A4199AA8E3A1}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{BC356FD7-5D47-495A-9255-A4199AA8E3A1}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{BC356FD7-5D47-495A-9255-A4199AA8E3A1}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{BC356FD7-5D47-495A-9255-A4199AA8E3A1}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{BC356FD7-5D47-495A-9255-A4199AA8E3A1}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{BC356FD7-5D47-495A-9255-A4199AA8E3A1}.Release|x64.Build.0 = Release|Any CPU\n\t\t{BC356FD7-5D47-495A-9255-A4199AA8E3A1}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{BC356FD7-5D47-495A-9255-A4199AA8E3A1}.Release|x86.Build.0 = Release|Any CPU\n\t\t{B3438E36-4598-49FB-8E52-65C231978E4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B3438E36-4598-49FB-8E52-65C231978E4D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B3438E36-4598-49FB-8E52-65C231978E4D}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{B3438E36-4598-49FB-8E52-65C231978E4D}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{B3438E36-4598-49FB-8E52-65C231978E4D}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{B3438E36-4598-49FB-8E52-65C231978E4D}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{B3438E36-4598-49FB-8E52-65C231978E4D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B3438E36-4598-49FB-8E52-65C231978E4D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B3438E36-4598-49FB-8E52-65C231978E4D}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{B3438E36-4598-49FB-8E52-65C231978E4D}.Release|x64.Build.0 = Release|Any CPU\n\t\t{B3438E36-4598-49FB-8E52-65C231978E4D}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{B3438E36-4598-49FB-8E52-65C231978E4D}.Release|x86.Build.0 = Release|Any CPU\n\t\t{58E76A9C-D28E-45BD-85F2-885FF3E4B363}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{58E76A9C-D28E-45BD-85F2-885FF3E4B363}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{58E76A9C-D28E-45BD-85F2-885FF3E4B363}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{58E76A9C-D28E-45BD-85F2-885FF3E4B363}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{58E76A9C-D28E-45BD-85F2-885FF3E4B363}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{58E76A9C-D28E-45BD-85F2-885FF3E4B363}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{58E76A9C-D28E-45BD-85F2-885FF3E4B363}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{58E76A9C-D28E-45BD-85F2-885FF3E4B363}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{58E76A9C-D28E-45BD-85F2-885FF3E4B363}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{58E76A9C-D28E-45BD-85F2-885FF3E4B363}.Release|x64.Build.0 = Release|Any CPU\n\t\t{58E76A9C-D28E-45BD-85F2-885FF3E4B363}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{58E76A9C-D28E-45BD-85F2-885FF3E4B363}.Release|x86.Build.0 = Release|Any CPU\n\t\t{0514B7E7-23D6-4B9D-8943-995AE57493C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0514B7E7-23D6-4B9D-8943-995AE57493C1}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0514B7E7-23D6-4B9D-8943-995AE57493C1}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{0514B7E7-23D6-4B9D-8943-995AE57493C1}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{0514B7E7-23D6-4B9D-8943-995AE57493C1}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{0514B7E7-23D6-4B9D-8943-995AE57493C1}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{0514B7E7-23D6-4B9D-8943-995AE57493C1}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0514B7E7-23D6-4B9D-8943-995AE57493C1}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{0514B7E7-23D6-4B9D-8943-995AE57493C1}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{0514B7E7-23D6-4B9D-8943-995AE57493C1}.Release|x64.Build.0 = Release|Any CPU\n\t\t{0514B7E7-23D6-4B9D-8943-995AE57493C1}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{0514B7E7-23D6-4B9D-8943-995AE57493C1}.Release|x86.Build.0 = Release|Any CPU\n\t\t{CDAC497D-BF0F-48F0-A156-8DE2DAB15492}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CDAC497D-BF0F-48F0-A156-8DE2DAB15492}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CDAC497D-BF0F-48F0-A156-8DE2DAB15492}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{CDAC497D-BF0F-48F0-A156-8DE2DAB15492}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{CDAC497D-BF0F-48F0-A156-8DE2DAB15492}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{CDAC497D-BF0F-48F0-A156-8DE2DAB15492}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{CDAC497D-BF0F-48F0-A156-8DE2DAB15492}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CDAC497D-BF0F-48F0-A156-8DE2DAB15492}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{CDAC497D-BF0F-48F0-A156-8DE2DAB15492}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{CDAC497D-BF0F-48F0-A156-8DE2DAB15492}.Release|x64.Build.0 = Release|Any CPU\n\t\t{CDAC497D-BF0F-48F0-A156-8DE2DAB15492}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{CDAC497D-BF0F-48F0-A156-8DE2DAB15492}.Release|x86.Build.0 = Release|Any CPU\n\t\t{6034AA93-6F76-4F4B-B8AC-0A20E3BD35FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{6034AA93-6F76-4F4B-B8AC-0A20E3BD35FF}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{6034AA93-6F76-4F4B-B8AC-0A20E3BD35FF}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{6034AA93-6F76-4F4B-B8AC-0A20E3BD35FF}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{6034AA93-6F76-4F4B-B8AC-0A20E3BD35FF}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{6034AA93-6F76-4F4B-B8AC-0A20E3BD35FF}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{6034AA93-6F76-4F4B-B8AC-0A20E3BD35FF}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{6034AA93-6F76-4F4B-B8AC-0A20E3BD35FF}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{6034AA93-6F76-4F4B-B8AC-0A20E3BD35FF}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{6034AA93-6F76-4F4B-B8AC-0A20E3BD35FF}.Release|x64.Build.0 = Release|Any CPU\n\t\t{6034AA93-6F76-4F4B-B8AC-0A20E3BD35FF}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{6034AA93-6F76-4F4B-B8AC-0A20E3BD35FF}.Release|x86.Build.0 = Release|Any CPU\n\t\t{008A6F1F-A1D9-45ED-B3CF-3106A59A4417}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{008A6F1F-A1D9-45ED-B3CF-3106A59A4417}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{008A6F1F-A1D9-45ED-B3CF-3106A59A4417}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{008A6F1F-A1D9-45ED-B3CF-3106A59A4417}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{008A6F1F-A1D9-45ED-B3CF-3106A59A4417}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{008A6F1F-A1D9-45ED-B3CF-3106A59A4417}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{008A6F1F-A1D9-45ED-B3CF-3106A59A4417}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{008A6F1F-A1D9-45ED-B3CF-3106A59A4417}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{008A6F1F-A1D9-45ED-B3CF-3106A59A4417}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{008A6F1F-A1D9-45ED-B3CF-3106A59A4417}.Release|x64.Build.0 = Release|Any CPU\n\t\t{008A6F1F-A1D9-45ED-B3CF-3106A59A4417}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{008A6F1F-A1D9-45ED-B3CF-3106A59A4417}.Release|x86.Build.0 = Release|Any CPU\n\t\t{57CC28E5-9915-4AFA-A5E5-B7977BBF8589}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{57CC28E5-9915-4AFA-A5E5-B7977BBF8589}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{57CC28E5-9915-4AFA-A5E5-B7977BBF8589}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{57CC28E5-9915-4AFA-A5E5-B7977BBF8589}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{57CC28E5-9915-4AFA-A5E5-B7977BBF8589}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{57CC28E5-9915-4AFA-A5E5-B7977BBF8589}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{57CC28E5-9915-4AFA-A5E5-B7977BBF8589}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{57CC28E5-9915-4AFA-A5E5-B7977BBF8589}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{57CC28E5-9915-4AFA-A5E5-B7977BBF8589}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{57CC28E5-9915-4AFA-A5E5-B7977BBF8589}.Release|x64.Build.0 = Release|Any CPU\n\t\t{57CC28E5-9915-4AFA-A5E5-B7977BBF8589}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{57CC28E5-9915-4AFA-A5E5-B7977BBF8589}.Release|x86.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{51318A0F-CB37-4DA2-8AE1-BB985B0A4028} = {8F902BB3-7573-4180-A911-6CC019E999CC}\n\t\t{BC6B016B-B353-4E73-A98E-556DC70E5850} = {8F902BB3-7573-4180-A911-6CC019E999CC}\n\t\t{B5F20CDD-025F-4BD8-A1AF-0F3EC9B6E8E4} = {AD84CF32-2208-43FD-95CE-31DF8DFEB2CD}\n\t\t{A3A5D851-4041-403A-95F9-F4ADBA9602A0} = {AD84CF32-2208-43FD-95CE-31DF8DFEB2CD}\n\t\t{C763BC05-5587-479E-8225-AA33F1F8F55B} = {AD84CF32-2208-43FD-95CE-31DF8DFEB2CD}\n\t\t{BC356FD7-5D47-495A-9255-A4199AA8E3A1} = {AD84CF32-2208-43FD-95CE-31DF8DFEB2CD}\n\t\t{58E76A9C-D28E-45BD-85F2-885FF3E4B363} = {8F902BB3-7573-4180-A911-6CC019E999CC}\n\t\t{6034AA93-6F76-4F4B-B8AC-0A20E3BD35FF} = {AD84CF32-2208-43FD-95CE-31DF8DFEB2CD}\n\t\t{57CC28E5-9915-4AFA-A5E5-B7977BBF8589} = {F5ED37EA-8110-4262-9310-3990EE6D9BFE}\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {A7580602-9393-4620-89A0-6BFD34FFB7E0}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Packages.ps1",
    "content": "dotnet pack -c Release -o .\\Packages"
  },
  {
    "path": "README.md",
    "content": "# Markdown.Avalonia\n\nMarkdown.Avalonia is a portted version of [MdXaml](https://github.com/whistyun/MdXaml) for [Avalonia UI](https://www.avaloniaui.net/).\nIt can render Markdown with avalonia.\n\n\n## Sample\n\n![img1](docs/img.demo/scrn1.png)  \n![img1](docs/img.demo/scrn2.png)  \n![img1](docs/img.demo/scrn3.png)  \n![img1](docs/img.demo/scrn4.png)  \n\n## Nuget\n\nhttps://www.nuget.org/packages/Markdown.Avalonia/  \nhttps://www.nuget.org/packages/Markdown.Avalonia.Tight/\n\nThe table of compability with Avalonia's version.\n\n| AvaloniaUI         | Markdown.Avalonia |\n|--------------------|-------------------|\n| 12.0.0             | 12.0.0-a1         |\n| 11.1.0-beta1       | 11.0.3-a1         |\n| 11.0.0             | 11.0.0～11.0.3-a1 |\n| 11.0.0-rc1.1       | 11.0.0-d1～d2     |\n| 11.0.0-preview8    | 11.0.0-c1         |\n| 11.0.0-preview7    | 11.0.0-b2         |\n| 11.0.0-preview6    | 11.0.0-a10, b1    |\n| 11.0.0-preview5    | 11.0.0-a9         |\n| 11.0.0-preview4    | 11.0.0-a6, a8     |\n| 11.0.0-preview3    | 11.0.0-a5         |\n| 11.0.0-preview1～2 | 11.0.0-a1～a4     |\n| 0.10.1～0.10.6     | 0.10.4            |\n| 0.10.0             | 0.10.1～0.10.3    |\n| 0.9.11             | 0.9.0-a1～a7      |\n\n## [How to use](https://github.com/whistyun/Markdown.Avalonia/wiki/How-to-use)\n\nI make some document in [wiki](https://github.com/whistyun/Markdown.Avalonia/wiki)\n\n\n## License\n\nMarkdown.Avalonia is licensed under the MIT license.\n\n\n## Dependencies (Runtime)\n\n* Markdown.Avalonia.Tight\n  * Avalonia (MIT) https://github.com/AvaloniaUI/Avalonia\n\n* Markdown.Avalonia.SyntaxHigh\n  * AvaloniaEdit (MIT) https://github.com/AvaloniaUI/AvaloniaEdit\n\n* MdXaml.Html\n  * HtmlAgilityPack (MIT) https://github.com/zzzprojects/html-agility-pack\n\n* Markdown.Avalonia.Svg\n  * Avalonia.Svg (MIT) https://github.com/wieslawsoltes/Svg.Skia\n"
  },
  {
    "path": "benchmark/MdAvBench/Apps/App.axaml",
    "content": "﻿<Application xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:local=\"clr-namespace:MdAvBench.Apps\"\n             x:Class=\"MdAvBench.Apps.App\"\n             RequestedThemeVariant=\"Light\">\n\n  <Application.Styles>\n    <SimpleTheme/>\n  </Application.Styles>\n</Application>\n"
  },
  {
    "path": "benchmark/MdAvBench/Apps/App.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Input;\nusing Avalonia.Layout;\nusing Avalonia.Platform;\nusing Avalonia.Styling;\nusing Avalonia.Controls;\nusing Avalonia.Rendering;\nusing Avalonia.Threading;\nusing Avalonia.Markup.Xaml;\n\nusing System;\nusing Avalonia.Controls.ApplicationLifetimes;\nusing System.Collections.Generic;\nusing System.Threading;\nusing System.Diagnostics;\n\nnamespace MdAvBench.Apps\n{\n    public class App : Application\n    {\n        internal static bool ApplicationStarted = false;\n        internal static Window MainWindow { private set; get; }\n\n        public override void Initialize()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n\n        public override void OnFrameworkInitializationCompleted()\n        {\n            Debug.Print(\"OnFrameworkInitializationCompleted Called\");\n\n            if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)\n            {\n                Debug.Print(\"Lifetime is ClassicDesktop\");\n\n                MainWindow = new Window();\n                MainWindow.Loaded += (s, e) => Loaded();\n                \n                desktop.MainWindow = MainWindow ;\n            }\n            else Loaded();\n\n            base.OnFrameworkInitializationCompleted();\n        }\n\n        private void Loaded()\n        {\n            Debug.Print(\"MainWindowLoaded\");\n            ApplicationStarted = true;\n        }\n\n        public static IDisposable Start()\n        {\n            var starter = new AppStarter();\n\n            var th = new Thread(starter.Start);\n            th.Start();\n\n            return starter;\n        }\n\n        public static void StartOnThread()\n        {\n            var starter = new AppStarter();\n            starter.Start();\n        }\n    }\n\n    class AppStarter : IDisposable\n    {\n        ClassicDesktopStyleApplicationLifetime lifetime;\n\n        public void Start()\n        {\n            var builder = AppBuilder.Configure<App>();\n            builder.UsePlatformDetect();\n\n            var ags = new string[0];\n\n            lifetime = new ClassicDesktopStyleApplicationLifetime()\n            {\n                Args = ags,\n                ShutdownMode = ShutdownMode.OnMainWindowClose\n            };\n            builder.SetupWithLifetime(lifetime);\n\n            lifetime.Start(ags);\n        }\n\n        public void Dispose()\n        {\n            try { lifetime.Shutdown(); }\n            finally { lifetime.Dispose(); }\n        }\n    }\n}\n"
  },
  {
    "path": "benchmark/MdAvBench/BenchmarkOfCTextBlock.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Media.Imaging;\nusing BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Jobs;\nusing System;\nusing System.IO;\nusing System.Threading;\nusing UnitTest.CTxt.Xamls;\nusing MdAvBench.Apps;\nusing Avalonia.Threading;\nusing MdAvBench.Xamls;\n\nnamespace MdAvBench\n{\n    [SimpleJob]\n    public class BenchmarkOfCTextBlock\n    {\n        private RenderTargetBitmap _bitmapCTB;\n        private RenderTargetBitmap _bitmapTB;\n\n        public BenchmarkOfCTextBlock()\n        {\n            App.Start();\n\n            while (!App.ApplicationStarted)\n                Thread.Sleep(100);\n\n            while (App.MainWindow is null)\n                Thread.Sleep(100);\n\n            Dispatcher.UIThread.Invoke(() =>\n            {\n                var dpi = new Vector(96, 96);\n                var size = new Size(400, 400);\n                _bitmapCTB = new RenderTargetBitmap(PixelSize.FromSizeWithDpi(size, dpi), dpi);\n                _bitmapTB = new RenderTargetBitmap(PixelSize.FromSizeWithDpi(size, dpi), dpi);\n\n                App.MainWindow.Width = 400;\n            });\n        }\n\n        [Benchmark]\n        public void DispatcherDelay()\n        {\n            Dispatcher.UIThread.Invoke(() => { });\n        }\n\n        [Benchmark]\n        public void RenderByCTextBlock()\n        {\n            CTextBlockData? control = null;\n\n            Dispatcher.UIThread.Invoke(() =>\n            {\n                control = new CTextBlockData();\n                App.MainWindow.Content = control;\n            });\n\n            while (control is null || !control.IsLoaded) ;\n\n            Dispatcher.UIThread.Invoke(() =>\n            {\n                _bitmapCTB.Render(control);\n            });\n        }\n\n        [Benchmark]\n        public void RenderByTextBlock()\n        {\n            TextBlockData? control = null;\n\n            Dispatcher.UIThread.Invoke(() =>\n            {\n                control = new TextBlockData();\n                App.MainWindow.Content = control;\n            });\n\n            while (control is null || !control.IsLoaded) ;\n\n            Dispatcher.UIThread.Invoke(() =>\n            {\n                _bitmapTB.Render(control);\n            });\n        }\n\n        [GlobalCleanup]\n        public void Cleanup()\n        {\n            string path;\n\n            path = $@\"D:\\debugs\\renderingCTB_{DateTime.Now.Ticks}.png\";\n            if (!File.Exists(path))\n                using (var strm = File.OpenWrite(path))\n                    _bitmapCTB.Save(strm);\n\n            path = $@\"D:\\debugs\\renderingTB_{DateTime.Now.Ticks}.png\";\n            if (!File.Exists(path))\n                using (var strm = File.OpenWrite(path))\n                    _bitmapTB.Save(strm);\n        }\n    }\n}\n"
  },
  {
    "path": "benchmark/MdAvBench/MdAvBench.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <Import Project=\"..\\..\\Markdown.Avalonia.props\" />\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFrameworks>net10.0</TargetFrameworks>\n    <IsPackable>false</IsPackable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" Version=\"$(TestAvaloniaVersion)\" />\n    <PackageReference Include=\"Avalonia.Desktop\" Version=\"$(TestAvaloniaVersion)\" />\n    <PackageReference Include=\"Avalonia.Themes.Simple\" Version=\"$(TestAvaloniaVersion)\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.13.12\" />\n    <PackageReference Include=\"Html2Markdown\" Version=\"6.2.0.3\" />\n    <PackageReference Include=\"ReverseMarkdown\" Version=\"4.3.0\" />\n    <PackageReference Include=\"MarkdownFromHtml\" Version=\"1.1.1\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <!--<PackageReference Include=\"ColorTextBlock.Avalonia\" Version=\"11.0.2\" />-->\n    <ProjectReference Include=\"..\\..\\ColorTextBlock.Avalonia\\ColorTextBlock.Avalonia.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Compile Update=\"Apps\\App.axaml.cs\">\n      <SubType>Code</SubType>\n      <DependentUpon>%(Filename)</DependentUpon>\n    </Compile>\n    <Compile Update=\"Xamls\\CTextBlockData.axaml.cs\">\n      <DependentUpon>CTextBlockData.axaml</DependentUpon>\n    </Compile>\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Update=\"Apps\\App.axaml\">\n      <SubType>Designer</SubType>\n    </None>\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "benchmark/MdAvBench/Program.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Exporters;\nusing BenchmarkDotNet.Jobs;\nusing BenchmarkDotNet.Loggers;\nusing BenchmarkDotNet.Reports;\nusing BenchmarkDotNet.Running;\nusing Microsoft.CodeAnalysis.CSharp.Syntax;\nusing ReverseMarkdown.Converters;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing MdAvBench.Apps;\nusing System.Threading;\n\nnamespace MdAvBench\n{\n    class Program\n    {\n        public static void Main(string[] args)\n        {\n            var summaries = BenchmarkRunner.Run(typeof(Program).Assembly);\n            var exporter = AsciiDocExporter.Default;\n\n            var logger = new StringLogger();\n\n            foreach (var summary in summaries)\n            {\n                exporter.ExportToLog(summary, logger);\n                logger.WriteLine();\n            }\n            File.WriteAllText(\"summary.md\", logger.ToString());\n        }\n    }\n}"
  },
  {
    "path": "benchmark/MdAvBench/StringLogger.cs",
    "content": "﻿using BenchmarkDotNet.Loggers;\nusing System.Text;\n\nnamespace MdAvBench\n{\n    internal class StringLogger : ILogger\n    {\n        private StringBuilder _builder = new StringBuilder();\n\n        public string Id => \"StringLogger\";\n        public int Priority => 0;\n\n        public StringLogger() { }\n\n        public void Flush()\n        {\n        }\n\n        public void Write(LogKind logKind, string text)\n        {\n            _builder.Append(text);\n        }\n\n        public void WriteLine()\n        {\n            _builder.AppendLine();\n        }\n\n        public void WriteLine(LogKind logKind, string text)\n        {\n            _builder.AppendLine(text);\n        }\n\n        public override string ToString() => _builder.ToString();\n    }\n}\n"
  },
  {
    "path": "benchmark/MdAvBench/Xamls/CTextBlockData.axaml",
    "content": "﻿<UserControl\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n    xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\"\n    x:Class=\"UnitTest.CTxt.Xamls.CTextBlockData\">\n  \n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"MdXaml is a modify version of Markdown.Xaml. Markdown XAML is a port of the popular \" />\n    <c:CItalic>\n      <c:CRun Text=\"MarkdownSharp\" />\n    </c:CItalic>\n    <c:CRun Text=\" Markdown processor, but with one very significant difference: Instead of rendering to a string containing HTML, it renders to a FlowDocument suitable for embedding into a WPF window or usercontrol.\" />\n    <c:CLineBreak/>\n    <c:CRun Text=\"Example:\" />\n    <c:CLineBreak/>\n    <c:CRun Text=\"\" />\n    <c:CItalic>\n      <c:CRun Text=\"italic\" />\n    </c:CItalic>\n    <c:CRun Text=\", \" />\n    <c:CBold>\n      <c:CRun Text=\"bold\" />\n    </c:CBold>\n    <c:CRun Text=\", \" />\n    <c:CBold>\n      <c:CItalic>\n        <c:CRun Text=\"bold-italic\" />\n      </c:CItalic>\n    </c:CBold>\n    <c:CRun Text=\", \" />\n    <c:CStrikethrough>\n      <c:CRun Text=\"strikethrough\" />\n    </c:CStrikethrough>\n    <c:CRun Text=\", \" />\n    <c:CUnderline>\n      <c:CRun Text=\"underline\" />\n    </c:CUnderline>\n    <c:CRun Text=\" and \" />\n    <c:CSpan>\n      <c:CRun Text=\"color\" />\n    </c:CSpan>\n    <c:CRun Text=\".\" />\n    <c:CLineBreak/>\n    <c:CRun Text=\"\" />\n    <c:CSpan>\n      <c:CBold>\n        <c:CItalic>\n          <c:CStrikethrough>\n            <c:CUnderline>\n              <c:CRun Text=\"Mixing Text\" />\n            </c:CUnderline>\n          </c:CStrikethrough>\n        </c:CItalic>\n      </c:CBold>\n    </c:CSpan>\n    <c:CRun Text=\" Link:\" />\n    <c:CLineBreak/>\n    <c:CRun Text=\"Links \" />\n    <c:CHyperlink CommandParameter=\"https://www.google.com\">\n      <c:CRun Text=\"Go to Google!\" />\n    </c:CHyperlink>\n    <c:CRun Text=\"\" />\n    <c:CLineBreak/>\n    <c:CRun Text=\"Links with title \" />\n    <c:CHyperlink CommandParameter=\"https://www.google.com\">\n      <c:CRun Text=\"Go to Google!\" />\n    </c:CHyperlink>\n    <c:CRun Text=\"\" />\n    <c:CLineBreak/>\n    <c:CRun Text=\"Links with image \" />\n    <c:CRun Text=\" \" />\n  </c:CTextBlock>\n</UserControl>\n"
  },
  {
    "path": "benchmark/MdAvBench/Xamls/CTextBlockData.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\nusing ColorTextBlock.Avalonia;\n\nnamespace UnitTest.CTxt.Xamls\n{\n    public partial class CTextBlockData : UserControl\n    {\n        public CTextBlockData()\n        {\n            this.InitializeComponent();\n        }\n\n        private void InitializeComponent()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "benchmark/MdAvBench/Xamls/TextBlockData.axaml",
    "content": "<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"MdAvBench.Xamls.TextBlockData\">\n  <TextBlock Classes=\"Paragraph\" TextWrapping=\"Wrap\">\n    <Run Text=\"MdXaml is a modify version of Markdown.Xaml. Markdown XAML is a port of the popular \" />\n    <Italic>\n      <Run Text=\"MarkdownSharp\" />\n    </Italic>\n    <Run Text=\" Markdown processor, but with one very significant difference: Instead of rendering to a string containing HTML, it renders to a FlowDocument suitable for embedding into a WPF window or usercontrol.\" />\n    <LineBreak />\n    <Run Text=\"Example:\" />\n    <LineBreak />\n    <Run Text=\"\" />\n    <Italic>\n      <Run Text=\"italic\" />\n    </Italic>\n    <Run Text=\", \" />\n    <Bold>\n      <Run Text=\"bold\" />\n    </Bold>\n    <Run Text=\", \" />\n    <Bold>\n      <Italic>\n        <Run Text=\"bold-italic\" />\n      </Italic>\n    </Bold>\n    <Run Text=\", \" />\n    <Italic >\n      <Run Text=\"strikethrough\" />\n    </Italic>\n    <Run Text=\", \" />\n    <Underline>\n      <Run Text=\"underline\" />\n    </Underline>\n    <Run Text=\" and \" />\n    <Span>\n      <Run Text=\"color\" />\n    </Span>\n    <Run Text=\".\" />\n    <LineBreak/>\n    <Run Text=\"\" />\n    <Span>\n      <Bold>\n        <Italic>\n          <Italic>\n            <Underline>\n              <Run Text=\"Mixing Text\" />\n            </Underline>\n          </Italic>\n        </Italic>\n      </Bold>\n    </Span>\n    <Run Text=\" Link:\" />\n    <LineBreak/>\n    <Run Text=\"Links \" />\n    <Underline>\n      <Run Text=\"Go to Google!\" />\n    </Underline>\n    <Run Text=\"\" />\n    <LineBreak/>\n    <Run Text=\"Links with title \" />\n    <Underline>\n      <Run Text=\"Go to Google!\" />\n    </Underline>\n    <Run Text=\"\" />\n    <LineBreak/>\n    <Run Text=\"Links with image \" />\n    <Run Text=\" \" />\n  </TextBlock>\n</UserControl>\n"
  },
  {
    "path": "benchmark/MdAvBench/Xamls/TextBlockData.axaml.cs",
    "content": "using Avalonia.Controls;\n\nnamespace MdAvBench.Xamls\n{\n    public partial class TextBlockData : UserControl\n    {\n        public TextBlockData()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaDemo/App.axaml",
    "content": "﻿<Application xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:local=\"clr-namespace:Markdown.AvaloniaDemo\"\n             x:Class=\"Markdown.AvaloniaDemo.App\">\n  <Application.DataTemplates>\n    <local:ViewLocator/>\n  </Application.DataTemplates>\n\n  <Application.Styles>\n    <SimpleTheme/>\n    <StyleInclude Source=\"/Assets/AppendingStyles.axaml\"/>\n  </Application.Styles>\n</Application>\n"
  },
  {
    "path": "demos/Markdown.AvaloniaDemo/App.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls.ApplicationLifetimes;\nusing Avalonia.Markup.Xaml;\nusing Markdown.AvaloniaDemo.ViewModels;\nusing Markdown.AvaloniaDemo.Views;\n\nnamespace Markdown.AvaloniaDemo\n{\n    public class App : Application\n    {\n        public override void Initialize()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n\n        public override void OnFrameworkInitializationCompleted()\n        {\n            if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)\n            {\n                desktop.MainWindow = new MainWindow\n                {\n                    DataContext = new MainWindowViewModel(),\n                };\n            }\n\n            base.OnFrameworkInitializationCompleted();\n        }\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaDemo/Assets/AppendingStyles.axaml",
    "content": "<Styles xmlns=\"https://github.com/avaloniaui\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\n    <Design.PreviewWith>\n      <Button>Sample</Button>\n    </Design.PreviewWith>\n\n    <Style Selector=\"Button\">\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource ThemeForegroundColor}\"/>\n        <Setter Property=\"BorderThickness\" Value=\"1\" />        \n    </Style>\n</Styles>"
  },
  {
    "path": "demos/Markdown.AvaloniaDemo/Assets/Pegasus-Mode.xshd",
    "content": "﻿<?xml version=\"1.0\"?>\n<SyntaxDefinition name=\"Pegasus\" extensions=\".peg\" xmlns=\"http://icsharpcode.net/sharpdevelop/syntaxdefinition/2008\">\n  <!-- The named colors 'Comment' and 'String' are used in SharpDevelop to detect if a line is inside a multiline string/comment -->\n  <Color name=\"Comment\" foreground=\"Green\" exampleText=\"// comment\" />\n  <Color name=\"Regex\" foreground=\"Red\" exampleText=\"string text = &quot;Hello, World!&quot;\"/>\n  <Color name=\"String\" foreground=\"Blue\" exampleText=\"string text = &quot;Hello, World!&quot;\"/>\n  <Color name=\"StringInterpolation\" foreground=\"Black\" exampleText=\"string text = $&quot;Hello, {name}!&quot;\"/>\n  <Color name=\"Char\" foreground=\"Magenta\" exampleText=\"char linefeed = '\\n';\"/>\n  <Color name=\"Preprocessor\" foreground=\"Green\" exampleText=\"#region Title\" />\n  <Color name=\"Punctuation\" exampleText=\"a(b.c);\" />\n  <Color name=\"ValueTypeKeywords\" fontWeight=\"bold\" foreground=\"Red\" exampleText=\"bool b = true;\" />\n  <Color name=\"ReferenceTypeKeywords\" foreground=\"Red\" exampleText=\"object o;\" />\n  <Color name=\"MethodCall\" foreground=\"MidnightBlue\" fontWeight=\"bold\" exampleText=\"o.ToString();\"/>\n  <Color name=\"NumberLiteral\" foreground=\"DarkBlue\" exampleText=\"3.1415f\"/>\n  <Color name=\"ThisOrBaseReference\" fontWeight=\"bold\" exampleText=\"this.Do(); base.Do();\"/>\n  <Color name=\"NullOrValueKeywords\" fontWeight=\"bold\" exampleText=\"if (value == null)\"/>\n  <Color name=\"Keywords\" fontWeight=\"bold\" foreground=\"Blue\" exampleText=\"if (a) {} else {}\"/>\n  <Color name=\"FlagWords\" foreground=\"Blue\" exampleText=\"-public\"/>\n  <Color name=\"GotoKeywords\" foreground=\"Navy\" exampleText=\"continue; return null;\"/>\n  <Color name=\"ContextKeywords\" foreground=\"Navy\" exampleText=\"var a = from x in y select z;\"/>\n  <Color name=\"ExceptionKeywords\" fontWeight=\"bold\" foreground=\"Teal\" exampleText=\"try {} catch {} finally {}\"/>\n  <Color name=\"CheckedKeyword\" fontWeight=\"bold\" foreground=\"DarkGray\" exampleText=\"checked {}\"/>\n  <Color name=\"UnsafeKeywords\" foreground=\"Olive\" exampleText=\"unsafe { fixed (..) {} }\"/>\n  <Color name=\"OperatorKeywords\" fontWeight=\"bold\" foreground=\"Pink\" exampleText=\"public static implicit operator...\"/>\n  <Color name=\"ParameterModifiers\" fontWeight=\"bold\" foreground=\"DeepPink\" exampleText=\"(ref int a, params int[] b)\"/>\n  <Color name=\"Modifiers\" foreground=\"Brown\" exampleText=\"static readonly int a;\"/>\n  <Color name=\"Visibility\" fontWeight=\"bold\" foreground=\"Blue\" exampleText=\"public override void ToString();\"/>\n  <Color name=\"NamespaceKeywords\" fontWeight=\"bold\" foreground=\"Green\" exampleText=\"namespace A.B { using System; }\"/>\n  <Color name=\"GetSetAddRemove\" foreground=\"SaddleBrown\" exampleText=\"int Prop { get; set; }\"/>\n  <Color name=\"TrueFalse\" fontWeight=\"bold\" foreground=\"DarkCyan\" exampleText=\"b = false; a = true;\" />\n  <Color name=\"TypeKeywords\" fontWeight=\"bold\" foreground=\"DarkCyan\" exampleText=\"if (x is int) { a = x as int; type = typeof(int); size = sizeof(int); c = new object(); }\"/>\n  <Color name=\"SemanticKeywords\" fontWeight=\"bold\" foreground=\"DarkCyan\" exampleText=\"if (args == null) throw new ArgumentNullException(nameof(args));\" />\n\n  <Property name=\"DocCommentMarker\" value=\"///\" />\n\n  <RuleSet name=\"CommentMarkerSet\">\n    <Keywords fontWeight=\"bold\" foreground=\"Red\">\n      <Word>TODO</Word>\n      <Word>FIXME</Word>\n    </Keywords>\n    <Keywords fontWeight=\"bold\" foreground=\"#E0E000\">\n      <Word>HACK</Word>\n      <Word>UNDONE</Word>\n    </Keywords>\n  </RuleSet>\n\n  <RuleSet name=\"CSCode\">\n    <Import ruleSet=\"C#/\" />\n    <Span ruleSet=\"CSCode\" multiline=\"true\">\n      <Begin>\\{</Begin>\n      <End>\\}</End>\n    </Span>\n  </RuleSet>\n\n  <!-- This is the main ruleset. -->\n  <RuleSet>\n    <Keywords color=\"SemanticKeywords\">\n      <Word>\\#error</Word>\n      <Word>\\#parse</Word>\n    </Keywords>\n    <Keywords color=\"Keywords\">\n      <Word>@namespace</Word>\n      <Word>@accessibility</Word>\n      <Word>@classname</Word>\n      <Word>@ignorecase</Word>\n      <Word>@resources</Word>\n      <Word>@start</Word>\n      <Word>@trace</Word>\n      <Word>@using</Word>\n      <Word>@members</Word>\n    </Keywords>\n    <Keywords color=\"FlagWords\">\n      <Word>-memoize</Word>\n      <Word>-lexical</Word>\n      <Word>-export</Word>\n      <Word>-public</Word>\n    </Keywords>\n\n    <Span color=\"Comment\">\n      <Begin color=\"XmlDoc/DocComment\">///(?!/)</Begin>\n      <RuleSet>\n        <Import ruleSet=\"XmlDoc/DocCommentSet\"/>\n        <Import ruleSet=\"CommentMarkerSet\"/>\n      </RuleSet>\n    </Span>\n\n    <Span color=\"Comment\" ruleSet=\"CommentMarkerSet\">\n      <Begin>//</Begin>\n    </Span>\n\n    <Span color=\"Comment\" ruleSet=\"CommentMarkerSet\" multiline=\"true\">\n      <Begin>/\\*</Begin>\n      <End>\\*/</End>\n    </Span>\n\n    <Span color=\"Regex\">\n      <Begin>\\[</Begin>\n      <End>\\]</End>\n      <RuleSet>\n        <!-- span for escape sequences -->\n        <Span begin=\"\\\\\" end=\".\"/>\n      </RuleSet>\n    </Span>\n\n    <Span color=\"String\">\n      <Begin>\"</Begin>\n      <End>\"</End>\n      <RuleSet>\n        <!-- span for escape sequences -->\n        <Span begin=\"\\\\\" end=\".\"/>\n      </RuleSet>\n    </Span>\n\n    <Span color=\"Char\">\n      <Begin>'</Begin>\n      <End>'</End>\n      <RuleSet>\n        <!-- span for escape sequences -->\n        <Span begin=\"\\\\\" end=\".\"/>\n      </RuleSet>\n    </Span>\n\n    <Span color=\"String\" multiline=\"true\">\n      <Begin>@\"</Begin>\n      <End>\"</End>\n      <RuleSet>\n        <!-- span for escape sequences -->\n        <Span begin='\"\"' end=\"\"/>\n      </RuleSet>\n    </Span>\n\n    <Span color=\"String\">\n      <Begin>\\$\"</Begin>\n      <End>\"</End>\n      <RuleSet>\n        <!-- span for escape sequences -->\n        <Span begin=\"\\\\\" end=\".\"/>\n        <Span begin=\"\\{\\{\" end=\"\"/>\n        <!-- string interpolation -->\n        <Span begin=\"{\" end=\"}\" color=\"StringInterpolation\" ruleSet=\"\"/>\n      </RuleSet>\n    </Span>\n\n    <Span ruleSet=\"CSCode\" multiline=\"true\">\n      <Begin>\\{</Begin>\n      <End>\\}</End>\n    </Span>\n\n    <Rule color=\"Punctuation\">\n      [?,.;(){}+\\-/%*&lt;&gt;^+~!|&amp;]+\n    </Rule>\n  </RuleSet>\n</SyntaxDefinition>"
  },
  {
    "path": "demos/Markdown.AvaloniaDemo/Assets/XamlTemplate.txt",
    "content": "﻿<Styles\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:mdc=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\"\n    xmlns:ctxt=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\">\n\n\n\n\n</Styles>"
  },
  {
    "path": "demos/Markdown.AvaloniaDemo/DynamicStyleBehavior.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\nusing Avalonia.Markup.Xaml.Styling;\nusing Avalonia.Styling;\nusing Markdown.Avalonia;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Input;\n\nnamespace Markdown.AvaloniaDemo\n{\n    public class DynamicStyleBehavior\n    {\n        public static readonly AttachedProperty<string> MyIdProperty =\n            AvaloniaProperty.RegisterAttached<DynamicStyleBehavior, Styles, string>(\"MyId\");\n\n        public static readonly AttachedProperty<string> MyLastParsedProperty =\n            AvaloniaProperty.RegisterAttached<DynamicStyleBehavior, MarkdownScrollViewer, string>(\"MyLastParsed\");\n\n        public static readonly AttachedProperty<string> XamlTextProperty =\n            AvaloniaProperty.RegisterAttached<DynamicStyleBehavior, MarkdownScrollViewer, string>(\n                \"XamlText\", coerce: Validate);\n\n        public static readonly AttachedProperty<ICommand> ValidationResultProperty =\n            AvaloniaProperty.RegisterAttached<DynamicStyleBehavior, MarkdownScrollViewer, ICommand>(\n                \"ValidationResult\");\n\n        public static string Validate(AvaloniaObject obj, string xamlTxt)\n        {\n            var ctrl = obj as MarkdownScrollViewer;\n\n            try\n            {\n                var old = ctrl.GetValue(MyLastParsedProperty);\n                if (old == xamlTxt) return xamlTxt;\n\n                var style = (Styles)AvaloniaRuntimeXamlLoader.Load(xamlTxt);\n                style.SetValue(MyIdProperty, nameof(DynamicStyleBehavior));\n\n                foreach (var exists in ctrl.Styles.ToArray())\n                    if (exists is Styles existsStyle)\n                        if (existsStyle.GetValue(MyIdProperty) == nameof(DynamicStyleBehavior))\n                            ctrl.Styles.Remove(exists);\n\n\n                ctrl.SetValue(MyLastParsedProperty, xamlTxt);\n                ctrl.Styles.Add(style);\n\n                var resultMsgr = ctrl.GetValue(ValidationResultProperty);\n                resultMsgr?.Execute(null);\n            }\n            catch (Exception e)\n            {\n                string message = e.GetType().FullName + \"\\r\\n\" + e.Message;\n\n                var resultMsgr = ctrl.GetValue(ValidationResultProperty);\n                resultMsgr?.Execute(message);\n            }\n\n            return xamlTxt;\n        }\n\n\n        public static void SetXamlText(MarkdownScrollViewer ctrl, string xamlTxt)\n            => ctrl.SetValue(XamlTextProperty, xamlTxt);\n\n        public static string GetXamlText(MarkdownScrollViewer ctrl)\n            => ctrl.GetValue(XamlTextProperty);\n\n        public static void SetValidationResult(MarkdownScrollViewer ctrl, ICommand cmd)\n            => ctrl.SetValue(ValidationResultProperty, cmd);\n\n        public static ICommand GetValidationResult(MarkdownScrollViewer ctrl)\n            => ctrl.GetValue(ValidationResultProperty);\n\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaDemo/MainWindow.md",
    "content": "﻿# MdXaml #\n\nMdXaml is a modify version of Markdown.Xaml.\nMarkdown XAML is a port of the popular *MarkdownSharp* Markdown processor, but \nwith one very significant difference: Instead of rendering to a string \ncontaining HTML, it renders to a FlowDocument suitable for embedding into a \nWPF window or usercontrol.\n\n\n## The Example Of ... ##\n\n### Text decolation [included original enhance] ###\n*italic*, **bold**, ***bold-italic***, ~~strikethrough~~, __underline__ and %{color:red}color%.  \n%{color:blue}***~~__Mixing Text__~~***%\n\n### Link ###\nLinks [Go to Google!](https://www.google.com)  \nLinks with title [Go to Google!](https://www.google.com \"google.\")  \nLinks with image [![faviicon](https://www.google.com/favicon.ico)](https://www.google.com \"google favicon\")\n\n### Image ###\n#### Remote images ####\n![image1](https://github.com/whistyun/Markdown.Avalonia/raw/master/docs/img.demo/scrn1.png)\n#### Local and resource images ####\n![localimage](LocalPath.png)\n![ResourceImage](Assets/ResourceImage.png)\n![VectorImage](Assets/Vector.svg)\n\n### List ###\n#### ul\n* one\n* two\n\n#### ol\n1. one\n2. two\n#### alphabet-ol [original enhance]\na. one\nb. two\n\n#### roman-ol [original enhance]\ni, one\nii, two\n\n### Table [included original enhance] ###\n|a|b|c|d|\n|:-:|:-|-:|\n|a1234567890|b1234567890|c1234567890|d1234567890|\n|a|/2.b|c|d|\n|A|\\2.C|\n|1|2|3|4|\n|あ|い|う|え|\n\n### Code ###\nMarkdown.Xaml support ```inline code ``` and block code.\n```c\n#include <stdio.h>\nint main()\n{\n   // printf() displays the string inside quotation\n   printf(\"Hello, World!\");\n   return 0;\n}\n```\n\n### Note ###\n\n< notetext >\n\n<p>. notetext\n\n\n### Separator ###\nsingle line\n ---\ntwo lines\n ===\nbold line\n ***\nbold with single\n___\n\n### Blockquote ###\n> ## Features ##\n> MarkDown.Xaml has a number of convenient features\n> \n> * The engine itself is a single file, for easy inclusion in your own projects\n> * Code for the engine is structured in the same manner as the original MarkdownSharp  \n> * Includes a `TextToFlowDocumentConverter` to make it easy to bind Markdown text\n\n### Text Alignment [original enhance] ###\nMdXaml parse a head of paragraph. If 'p[<=>].' is found, apply text alignment to it.\n> p<. left alignment text\n> \n> p>. right alignment text\n> \n> p=. center alignment\n\n\n## What is this Demo? ##\n\nThis demo application shows MdXaml in use - as you make changes to the \nleft pane, the rendered MarkDown will appear in the right pane.\n\n### Source ###\n\nReview the source for this demo to see how MdXaml works in practice, how to use the MarkdownScrollViewer,\nand how to style the output to appear the way you desire.\n\n"
  },
  {
    "path": "demos/Markdown.AvaloniaDemo/Markdown.AvaloniaDemo.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <Import Project=\"..\\..\\Markdown.Avalonia.props\" />\n\n  <PropertyGroup>\n    <OutputType>WinExe</OutputType>\n    <IsPackable>false</IsPackable>\n    <TargetFrameworks>$(DemoAppTargetFrameworks)</TargetFrameworks>\n    <LangVersion>9</LangVersion>\n    <Nullable>disable</Nullable>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(TargetFramework)' == 'net7' \">\n    <PublishAot>true</PublishAot>\n  </PropertyGroup>\n  <ItemGroup>\n    <AvaloniaResource Include=\"Assets\\**\" />\n  </ItemGroup>\n  <ItemGroup>\n    <AvaloniaXaml Remove=\"Assets\\AppendingStyles.axaml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" Version=\"$(DemoAvaloniaVersion)\" />\n    <PackageReference Include=\"Avalonia.Desktop\" Version=\"$(DemoAvaloniaVersion)\" />\n    <PackageReference Include=\"Avalonia.Themes.Simple\" Version=\"$(DemoAvaloniaVersion)\" />\n    <PackageReference Include=\"ReactiveUI.Avalonia\" Version=\"11.4.12\" />\n    <PackageReference Include=\"Avalonia.Markup.Xaml.Loader\" Version=\"$(DemoAvaloniaVersion)\" />\n\n    <PackageReference Include=\"Serilog\" Version=\"3.0.1\" />\n    <PackageReference Include=\"Serilog.Sinks.File\" Version=\"5.0.0\" />\n    <None Remove=\"Assets\\XamlTemplate.txt\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\Markdown.Avalonia\\Markdown.Avalonia.csproj\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Update=\"LocalPath.png\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Update=\"MainWindow.md\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "demos/Markdown.AvaloniaDemo/MyConverter.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Data.Converters;\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Text;\n\nnamespace Markdown.AvaloniaDemo\n{\n    public class MyConverter : IValueConverter\n    {\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            if (value is ContentControl ctrl)\n            {\n                return ctrl.Content?.ToString();\n            }\n\n            return value?.ToString();\n        }\n\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            throw new NotImplementedException();\n        }\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaDemo/Program.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing Avalonia;\nusing Avalonia.Logging;\nusing Serilog;\n\nnamespace Markdown.AvaloniaDemo\n{\n    class Program\n    {\n        // Initialization code. Don't use any Avalonia, third-party APIs or any\n        // SynchronizationContext-reliant code before AppMain is called: things aren't initialized\n        // yet and stuff might break.\n        public static void Main(string[] args)\n        {\n            Log.Logger = new LoggerConfiguration()\n                .WriteTo.File(\"log.txt\")\n                .CreateLogger();\n\n            try\n            {\n                BuildAvaloniaApp().StartWithClassicDesktopLifetime(args);\n            }\n            catch (Exception e)\n            {\n                Log.Fatal(e, \"Something very bad happened\");\n            }\n        }\n\n        // Avalonia configuration, don't remove; also used by visual designer.\n        public static AppBuilder BuildAvaloniaApp()\n            => AppBuilder.Configure<App>()\n                .UsePlatformDetect();\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaDemo/ViewLocator.cs",
    "content": "using System;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Templates;\nusing Markdown.AvaloniaDemo.ViewModels;\n\nnamespace Markdown.AvaloniaDemo\n{\n    public class ViewLocator : IDataTemplate\n    {\n        public bool SupportsRecycling => false;\n\n        public Control Build(object data)\n        {\n            var name = data.GetType().FullName.Replace(\"ViewModel\", \"View\");\n            var type = Type.GetType(name);\n\n            if (type != null)\n            {\n                return (Control)Activator.CreateInstance(type);\n            }\n            else\n            {\n                return new TextBlock { Text = \"Not Found: \" + name };\n            }\n        }\n\n        public bool Match(object data)\n        {\n            return data is ViewModelBase;\n        }\n    }\n}"
  },
  {
    "path": "demos/Markdown.AvaloniaDemo/ViewModels/MainWindowViewModel.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml.Styling;\nusing Avalonia.Platform;\nusing Avalonia.Styling;\nusing Avalonia.Themes.Simple;\nusing Markdown.Avalonia;\nusing ReactiveUI;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\n\nnamespace Markdown.AvaloniaDemo.ViewModels\n{\n    public class MainWindowViewModel : ViewModelBase\n    {\n        private string _text;\n        public string Text\n        {\n            get => _text;\n            set => this.RaiseAndSetIfChanged(ref _text, value);\n        }\n\n        private string _edittingStyleXamlText;\n        public string EdittingStyleXamlText\n        {\n            get => _edittingStyleXamlText;\n            set => this.RaiseAndSetIfChanged(ref _edittingStyleXamlText, value);\n        }\n\n        private string _appendStyleXamlText;\n        public string AppendStyleXamlText\n        {\n            get => _appendStyleXamlText;\n            set => this.RaiseAndSetIfChanged(ref _appendStyleXamlText, value);\n        }\n\n        private StyleViewModel _selectedStyle;\n        public StyleViewModel SelectedStyle\n        {\n            get => _selectedStyle;\n            set => this.RaiseAndSetIfChanged(ref _selectedStyle, value);\n        }\n\n        private string _ErrorInfo;\n        public string ErrorInfo\n        {\n            get => _ErrorInfo;\n            set => this.RaiseAndSetIfChanged(ref _ErrorInfo, value);\n        }\n\n        public List<StyleViewModel> Styles { set; get; }\n\n        public void XamlParseResult(string result) => ErrorInfo = result;\n\n        public void TryParse() => AppendStyleXamlText = EdittingStyleXamlText;\n\n        public MainWindowViewModel()\n        {\n            try\n            {\n                using (var stream = new FileStream(\"MainWindow.md\", FileMode.Open))\n                using (var reader = new StreamReader(stream))\n                {\n                    Text = reader.ReadToEnd();\n                }\n            }\n            catch { }\n\n            Styles = new List<StyleViewModel>\n            {\n                new StyleViewModel() { Name = nameof(MarkdownStyle.Standard) },\n                new StyleViewModel() { Name = nameof(MarkdownStyle.SimpleTheme) },\n                new StyleViewModel() { Name = nameof(MarkdownStyle.GithubLike) }\n            };\n\n            SelectedStyle = Styles[1];\n\n            using (var strm = AssetLoader.Open(new Uri(\"avares://Markdown.AvaloniaDemo/Assets/XamlTemplate.txt\")))\n            using (var reader = new StreamReader(strm))\n            {\n                EdittingStyleXamlText = reader.ReadToEnd();\n            }\n        }\n    }\n\n    public class StyleViewModel\n    {\n        public string Name { get; set; }\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaDemo/ViewModels/ViewModelBase.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing ReactiveUI;\n\nnamespace Markdown.AvaloniaDemo.ViewModels\n{\n    public class ViewModelBase : ReactiveObject\n    {\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaDemo/Views/MainWindow.axaml",
    "content": "﻿<Window xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n\n        xmlns:i=\"clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity\"\n        xmlns:vm=\"clr-namespace:Markdown.AvaloniaDemo.ViewModels;assembly=Markdown.AvaloniaDemo\"\n        xmlns:local=\"clr-namespace:Markdown.AvaloniaDemo;assembly=Markdown.AvaloniaDemo\"\n\n        xmlns:md=\"https://github.com/whistyun/Markdown.Avalonia\"\n        xmlns:mde=\"https://github.com/whistyun/Markdown.Avalonia.SyntaxHigh\"\n\n        mc:Ignorable=\"d\" d:DesignWidth=\"900\" d:DesignHeight=\"450\"\n        x:Class=\"Markdown.AvaloniaDemo.Views.MainWindow\"\n        \n        x:DataType=\"vm:MainWindowViewModel\"\n        x:CompileBindings=\"True\"\n        Icon=\"/Assets/avalonia-logo.ico\"\n        Title=\"Markdown.AvaloniaDemo\"\n        >\n\n  <Design.DataContext>\n    <vm:MainWindowViewModel/>\n  </Design.DataContext>\n\n  <Grid>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition Width=\"10*\"/>\n      <ColumnDefinition Width=\"10*\"/>\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition Height=\"Auto\"/>\n      <RowDefinition Height=\"10*\"/>\n    </Grid.RowDefinitions>\n\n    <TabControl\n      Grid.Row=\"0\"\n      Grid.Column=\"0\"\n      Grid.RowSpan=\"2\"\n      VerticalAlignment=\"Stretch\">\n\n      <TabItem\n          Header=\"Source\"\n          Grid.Row=\"0\"\n          Grid.Column=\"0\"\n          >\n\n        <TextBox\n          VerticalAlignment=\"Stretch\"\n          AcceptsReturn=\"True\"\n          Text=\"{Binding Text}\"\n          TextWrapping=\"Wrap\"\n          />\n\n      </TabItem>\n\n      <TabItem Header=\"Style\">\n        <Grid>\n          <Grid.ColumnDefinitions>\n            <ColumnDefinition Width=\"Auto\"/>\n            <ColumnDefinition Width=\"10*\"/>\n          </Grid.ColumnDefinitions>\n          <Grid.RowDefinitions>\n            <RowDefinition Height=\"Auto\"/>\n            <RowDefinition Height=\"10*\"/>\n          </Grid.RowDefinitions>\n\n          <TextBlock\n              Grid.Row=\"0\"\n              Grid.Column=\"0\"\n              VerticalAlignment=\"Center\"\n              Text=\"Markdown Style\"/>\n\n          <ComboBox\n              Grid.Row=\"0\"\n              Grid.Column=\"1\"\n              SelectedItem=\"{Binding SelectedStyle}\"\n              ItemsSource=\"{Binding Styles}\"\n              >\n            <ComboBox.ItemTemplate>\n              <DataTemplate>\n                <TextBlock Text=\"{Binding Name}\"/>\n              </DataTemplate>\n            </ComboBox.ItemTemplate>\n          </ComboBox>\n\n          <Border\n              Grid.Row=\"1\"\n              Grid.Column=\"0\"\n              Grid.ColumnSpan=\"2\"\n              Padding=\"1\"\n              Margin=\"1\"\n              BorderThickness=\"1\" BorderBrush=\"{DynamicResource ThemeBorderHighBrush}\">\n\n            <DockPanel LastChildFill=\"True\">\n              <DockPanel DockPanel.Dock=\"Top\" LastChildFill=\"False\">\n                <TextBlock DockPanel.Dock=\"Left\">Append Styles</TextBlock>\n                <Button DockPanel.Dock=\"Right\" Content=\"Parse\" Command=\"{Binding TryParse}\"/>\n              </DockPanel>\n\n              <Expander Header=\"Error\" DockPanel.Dock=\"Bottom\" IsExpanded=\"True\">\n                <TextBlock Foreground=\"Red\"\n                           Text=\"{Binding ErrorInfo}\"/>\n              </Expander>\n              <TextBox\n                  AcceptsReturn=\"True\"\n                  TextWrapping=\"NoWrap\"\n                  Text=\"{Binding EdittingStyleXamlText}\"\n                  />\n            </DockPanel>\n          </Border>\n        </Grid>\n      </TabItem>\n\n    </TabControl>\n\n    <Label\n      x:Name=\"Breadcrumb\"\n      Grid.Row=\"0\"\n      Grid.Column=\"1\"\n      Content=\" \"\n      BorderThickness=\"0,0,0,1\"\n      />\n    \n    <md:MarkdownScrollViewer\n      Grid.Row=\"1\"\n      Grid.Column=\"1\"\n      VerticalAlignment=\"Stretch\"\n      MarkdownStyleName=\"{Binding SelectedStyle.Name}\"\n      SaveScrollValueWhenContentUpdated=\"True\"\n      Markdown=\"{Binding Text}\"\n      HeaderScrolled=\"HeaderScrolled\"\n      \n      local:DynamicStyleBehavior.XamlText=\"{Binding AppendStyleXamlText}\"\n      local:DynamicStyleBehavior.ValidationResult=\"{Binding XamlParseResult}\"\n      >\n      <md:MarkdownScrollViewer.Plugins>\n        <md:MdAvPlugins>\n          <mde:SyntaxHighlight>\n            <mde:Alias Name=\"peg\" XSHD=\"avares://Markdown.AvaloniaDemo/Assets/Pegasus-Mode.xshd\" />\n          </mde:SyntaxHighlight>\n        </md:MdAvPlugins>\n      </md:MarkdownScrollViewer.Plugins>\n\n    </md:MarkdownScrollViewer>\n  </Grid>\n\n</Window>\n"
  },
  {
    "path": "demos/Markdown.AvaloniaDemo/Views/MainWindow.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\nusing Markdown.Avalonia;\nusing System.Linq;\n\nnamespace Markdown.AvaloniaDemo.Views\n{\n    public partial class MainWindow : Window\n    {\n        private Label _breadcrumb;\n\n        public MainWindow()\n        {\n            InitializeComponent();\n\n            _breadcrumb = this.FindControl<Label>(\"Breadcrumb\");\n        }\n\n        private void InitializeComponent()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n\n        private void HeaderScrolled(object sender, HeaderScrolledEventArgs args)\n        {\n            _breadcrumb.Content = string.Join(\" > \", args.Tree.Select(tag => tag.Text));\n        }\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaDemo/nuget.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- \n  To use the Avalonia CI feed to get unstable packages, move this file to the root of your solution.\n-->\n\n<configuration>\n  <packageSources>\n    <add key=\"AvaloniaCI\" value=\"https://www.myget.org/F/avalonia-ci/api/v2\" />\n  </packageSources>\n</configuration>\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentAvaloniaDemo/App.axaml",
    "content": "﻿<Application xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:local=\"clr-namespace:Markdown.AvaloniaFluentAvaloniaDemo\"\n             xmlns:sty=\"using:FluentAvalonia.Styling\"\n             x:Class=\"Markdown.AvaloniaFluentAvaloniaDemo.App\">\n  <Application.DataTemplates>\n    <local:ViewLocator/>\n  </Application.DataTemplates>\n\n  <Application.Styles>\n    <!-- Light, Dark, or HighContrast -->\n    <SimpleTheme />\n    <sty:FluentAvaloniaTheme />\n    <StyleInclude Source=\"/Assets/AppendingStyles.axaml\"/>\n  </Application.Styles>\n</Application>\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentAvaloniaDemo/App.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls.ApplicationLifetimes;\nusing Avalonia.Markup.Xaml;\nusing Markdown.AvaloniaFluentAvaloniaDemo.ViewModels;\nusing Markdown.AvaloniaFluentAvaloniaDemo.Views;\n\nnamespace Markdown.AvaloniaFluentAvaloniaDemo\n{\n    public class App : Application\n    {\n        public override void Initialize()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n\n        public override void OnFrameworkInitializationCompleted()\n        {\n            if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)\n            {\n                desktop.MainWindow = new MainWindow\n                {\n                    DataContext = new MainWindowViewModel(),\n                };\n            }\n\n            base.OnFrameworkInitializationCompleted();\n        }\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentAvaloniaDemo/Assets/AppendingStyles.axaml",
    "content": "<Styles xmlns=\"https://github.com/avaloniaui\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\n    <Design.PreviewWith>\n      <Button>Sample</Button>\n    </Design.PreviewWith>\n\n    <Style Selector=\"Button\">\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource TextControlForegroundFocused}\"/>\n        <Setter Property=\"BorderThickness\" Value=\"1\" />        \n    </Style>\n</Styles>"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentAvaloniaDemo/Assets/XamlTemplate.txt",
    "content": "﻿<Styles\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:mdc=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\"\n    xmlns:ctxt=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\">\n\n\n\n\n</Styles>"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentAvaloniaDemo/Assets2/MainWindow.md",
    "content": "﻿### Image ###\n#### Remote images ####\n![image1](http://placehold.it/300x25)  \n![imageleft](http://placehold.it/150x25/0000FF \"blue\")![imageright](http://placehold.it/150x25/00FFFF \"cyan\")\n#### Local and resource images ####\n![localimage](Assets2/ResourceImage.png)\n![ResourceImage](Assets/ResourceImage.png)\n\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentAvaloniaDemo/DynamicStyleBehavior.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\nusing Avalonia.Markup.Xaml.Styling;\nusing Avalonia.Styling;\nusing Markdown.Avalonia;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Input;\n\nnamespace Markdown.AvaloniaFluentAvaloniaDemo\n{\n    public class DynamicStyleBehavior\n    {\n        public static readonly AttachedProperty<string> MyIdProperty =\n            AvaloniaProperty.RegisterAttached<DynamicStyleBehavior, Styles, string>(\"MyId\");\n\n        public static readonly AttachedProperty<string> MyLastParsedProperty =\n            AvaloniaProperty.RegisterAttached<DynamicStyleBehavior, MarkdownScrollViewer, string>(\"MyLastParsed\");\n\n        public static readonly AttachedProperty<string> XamlTextProperty =\n            AvaloniaProperty.RegisterAttached<DynamicStyleBehavior, MarkdownScrollViewer, string>(\n                \"XamlText\", coerce: Validate);\n\n        public static readonly AttachedProperty<ICommand> ValidationResultProperty =\n            AvaloniaProperty.RegisterAttached<DynamicStyleBehavior, MarkdownScrollViewer, ICommand>(\n                \"ValidationResult\");\n\n        public static string Validate(AvaloniaObject obj, string xamlTxt)\n        {\n            var ctrl = obj as MarkdownScrollViewer;\n\n            try\n            {\n                var old = ctrl.GetValue(MyLastParsedProperty);\n                if (old == xamlTxt) return xamlTxt;\n\n                var style = (Styles)AvaloniaRuntimeXamlLoader.Load(xamlTxt);\n                style.SetValue(MyIdProperty, nameof(DynamicStyleBehavior));\n\n                foreach (var exists in ctrl.Styles.ToArray())\n                    if (exists is Styles existsStyle)\n                        if (existsStyle.GetValue(MyIdProperty) == nameof(DynamicStyleBehavior))\n                            ctrl.Styles.Remove(exists);\n\n                ctrl.SetValue(MyLastParsedProperty, xamlTxt);\n                ctrl.Styles.Add(style);\n\n                var resultMsgr = ctrl.GetValue(ValidationResultProperty);\n                resultMsgr?.Execute(null);\n            }\n            catch (Exception e)\n            {\n                string message = e.GetType().FullName + \"\\r\\n\" + e.Message;\n\n                var resultMsgr = ctrl.GetValue(ValidationResultProperty);\n                resultMsgr?.Execute(message);\n            }\n\n            return xamlTxt;\n        }\n\n\n        public static void SetXamlText(MarkdownScrollViewer ctrl, string xamlTxt)\n            => ctrl.SetValue(XamlTextProperty, xamlTxt);\n\n        public static string GetXamlText(MarkdownScrollViewer ctrl)\n            => ctrl.GetValue(XamlTextProperty);\n\n        public static void SetValidationResult(MarkdownScrollViewer ctrl, ICommand cmd)\n            => ctrl.SetValue(ValidationResultProperty, cmd);\n\n        public static ICommand GetValidationResult(MarkdownScrollViewer ctrl)\n            => ctrl.GetValue(ValidationResultProperty);\n\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentAvaloniaDemo/MainWindow.md",
    "content": "﻿# MdXaml #\n\nMdXaml is a modify version of Markdown.Xaml.\nMarkdown XAML is a port of the popular *MarkdownSharp* Markdown processor, but \nwith one very significant difference: Instead of rendering to a string \ncontaining HTML, it renders to a FlowDocument suitable for embedding into a \nWPF window or usercontrol.\n\n\n## The Example Of ... ##\n\n### Text decolation [included original enhance] ###\n*italic*, **bold**, ***bold-italic***, ~~strikethrough~~, __underline__ and %{color:red}color%.  \n%{color:blue}***~~__Mixing Text__~~***%\n\n### Link ###\nLinks [Go to Google!](https://www.google.com)  \nLinks with title [Go to Google!](https://www.google.com \"google.\")  \nLinks with image [![faviicon](https://www.google.com/favicon.ico)](https://www.google.com \"google favicon\")\n\n### Image ###\n#### Remote images ####\n![image1](https://github.com/whistyun/Markdown.Avalonia/raw/master/docs/img.demo/scrn1.png)\n#### Local and resource images ####\n![localimage](LocalPath.png)\n![ResourceImage](Assets/ResourceImage.png)\n\n### List ###\n#### ul\n* one\n* two\n\n#### ol\n1. one\n2. two\n#### alphabet-ol [original enhance]\na. one\nb. two\n\n#### roman-ol [original enhance]\ni, one\nii, two\n\n### Table [included original enhance] ###\n|a|b|c|d|\n|:-:|:-|-:|\n|a1234567890|b1234567890|c1234567890|d1234567890|\n|a|/2.b|c|d|\n|A|\\2.C|\n|1|2|3|4|\n|あ|い|う|え|\n\n### Code ###\nMarkdown.Xaml support ```inline code ``` and block code.\n```c\n#include <stdio.h>\nint main()\n{\n   // printf() displays the string inside quotation\n   printf(\"Hello, World!\");\n   return 0;\n}\n```\n\n### Note ###\n\n< notetext >\n\n<p>. notetext\n\n\n### Separator ###\nsingle line\n ---\ntwo lines\n ===\nbold line\n ***\nbold with single\n___\n\n### Blockquote ###\n> ## Features ##\n> MarkDown.Xaml has a number of convenient features\n> \n> * The engine itself is a single file, for easy inclusion in your own projects\n> * Code for the engine is structured in the same manner as the original MarkdownSharp  \n> * Includes a `TextToFlowDocumentConverter` to make it easy to bind Markdown text\n\n### Text Alignment [original enhance] ###\nMdXaml parse a head of paragraph. If 'p[<=>].' is found, apply text alignment to it.\n> p<. left alignment text\n> \n> p>. right alignment text\n> \n> p=. center alignment\n\n\n## What is this Demo? ##\n\nThis demo application shows MdXaml in use - as you make changes to the \nleft pane, the rendered MarkDown will appear in the right pane.\n\n### Source ###\n\nReview the source for this demo to see how MdXaml works in practice, how to use the MarkdownScrollViewer,\nand how to style the output to appear the way you desire.\n\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentAvaloniaDemo/Markdown.AvaloniaFluentAvaloniaDemo.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <Import Project=\"..\\..\\Markdown.Avalonia.props\" />\n\n  <PropertyGroup>\n    <OutputType>WinExe</OutputType>\n    <IsPackable>false</IsPackable>\n    <TargetFrameworks>$(DemoAppTargetFrameworks)</TargetFrameworks>\n    <LangVersion>9</LangVersion>\n    <Nullable>disable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <AvaloniaResource Include=\"Assets\\**\" />\n    <AvaloniaResource Include=\"Assets2\\**\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" Version=\"$(DemoAvaloniaVersion)\" />\n    <PackageReference Include=\"Avalonia.Themes.Simple\" Version=\"$(DemoAvaloniaVersion)\" />\n    <PackageReference Include=\"Avalonia.Desktop\" Version=\"$(DemoAvaloniaVersion)\" />\n    <PackageReference Include=\"FluentAvaloniaUI\" Version=\"2.0.5\" />\n    <PackageReference Include=\"ReactiveUI.Avalonia\" Version=\"11.4.12\" />\n    <PackageReference Include=\"Avalonia.Markup.Xaml.Loader\" Version=\"$(DemoAvaloniaVersion)\" />\n    <None Remove=\"Assets\\XamlTemplate.txt\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\..\\tests\\UnitTest.Base\\Utils\\BrokenXamlWriter.cs\" Link=\"BrokenXamlWriter.cs\" />\n    <Compile Include=\"..\\..\\tests\\UnitTest.Base\\Utils\\Util.cs\" Link=\"Util.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\Markdown.Avalonia\\Markdown.Avalonia.csproj\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Update=\"LocalPath.png\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Update=\"MainWindow.md\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentAvaloniaDemo/MyConverter.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Data.Converters;\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Text;\n\nnamespace Markdown.AvaloniaFluentAvaloniaDemo\n{\n    public class MyConverter : IValueConverter\n    {\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            if (value is ContentControl ctrl)\n            {\n                return ctrl.Content?.ToString();\n            }\n\n            return value?.ToString();\n        }\n\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            throw new NotImplementedException();\n        }\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentAvaloniaDemo/Program.cs",
    "content": "﻿using System;\nusing Avalonia;\n\nnamespace Markdown.AvaloniaFluentAvaloniaDemo\n{\n    class Program\n    {\n        // Initialization code. Don't use any Avalonia, third-party APIs or any\n        // SynchronizationContext-reliant code before AppMain is called: things aren't initialized\n        // yet and stuff might break.\n        public static void Main(string[] args) => BuildAvaloniaApp()\n            .StartWithClassicDesktopLifetime(args);\n\n        // Avalonia configuration, don't remove; also used by visual designer.\n        public static AppBuilder BuildAvaloniaApp()\n            => AppBuilder.Configure<App>()\n                .UsePlatformDetect();\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentAvaloniaDemo/ViewLocator.cs",
    "content": "using System;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Templates;\nusing Markdown.AvaloniaFluentAvaloniaDemo.ViewModels;\n\nnamespace Markdown.AvaloniaFluentAvaloniaDemo\n{\n    public class ViewLocator : IDataTemplate\n    {\n        public bool SupportsRecycling => false;\n\n        public Control Build(object data)\n        {\n            var name = data.GetType().FullName.Replace(\"ViewModel\", \"View\");\n            var type = Type.GetType(name);\n\n            if (type != null)\n            {\n                return (Control)Activator.CreateInstance(type);\n            }\n            else\n            {\n                return new TextBlock { Text = \"Not Found: \" + name };\n            }\n        }\n\n        public bool Match(object data)\n        {\n            return data is ViewModelBase;\n        }\n    }\n}"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentAvaloniaDemo/ViewModels/MainWindowViewModel.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml.Styling;\nusing Avalonia.Platform;\nusing Avalonia.Styling;\nusing Markdown.Avalonia;\nusing ReactiveUI;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\n\nnamespace Markdown.AvaloniaFluentAvaloniaDemo.ViewModels\n{\n    public class MainWindowViewModel : ViewModelBase\n    {\n        private string _text;\n        public string Text\n        {\n            get => _text;\n            set => this.RaiseAndSetIfChanged(ref _text, value);\n        }\n\n        private string _edittingStyleXamlText;\n        public string EdittingStyleXamlText\n        {\n            get => _edittingStyleXamlText;\n            set => this.RaiseAndSetIfChanged(ref _edittingStyleXamlText, value);\n        }\n\n        private string _appendStyleXamlText;\n        public string AppendStyleXamlText\n        {\n            get => _appendStyleXamlText;\n            set => this.RaiseAndSetIfChanged(ref _appendStyleXamlText, value);\n        }\n\n        private string _ErrorInfo;\n        public string ErrorInfo\n        {\n            get => _ErrorInfo;\n            set => this.RaiseAndSetIfChanged(ref _ErrorInfo, value);\n        }\n\n        private string _AssetPathRootText;\n        public string AssetPathRootText\n        {\n            get => _AssetPathRootText;\n            set => this.RaiseAndSetIfChanged(ref _AssetPathRootText, value);\n        }\n\n        private string _SourceText;\n        public string SourceText\n        {\n            get => _SourceText;\n            set => this.RaiseAndSetIfChanged(ref _SourceText, value);\n        }\n\n        private string _AssetPathRoot;\n        public string AssetPathRoot\n        {\n            get => _AssetPathRoot;\n            set\n            {\n                _AssetPathRoot = value;\n                this.RaisePropertyChanged();\n            }\n        }\n\n        private Uri _Source;\n        public Uri Source\n        {\n            get => _Source;\n            set\n            {\n                _Source = value;\n                this.RaisePropertyChanged();\n            }\n        }\n\n        public void XamlParseResult(string result) => ErrorInfo = result;\n\n        public void TryParse() => AppendStyleXamlText = EdittingStyleXamlText;\n\n        public MainWindowViewModel()\n        {\n            using (var stream = new FileStream(\"MainWindow.md\", FileMode.Open))\n            using (var reader = new StreamReader(stream))\n            {\n                Text = reader.ReadToEnd();\n            }\n\n            using (var strm = AssetLoader.Open(new Uri(\"avares://Markdown.AvaloniaFluentAvaloniaDemo/Assets/XamlTemplate.txt\")))\n            using (var reader = new StreamReader(strm))\n            {\n                EdittingStyleXamlText = reader.ReadToEnd();\n            }\n        }\n\n        public void ApplyAssetPathRoot()\n            => AssetPathRoot = AssetPathRootText;\n\n        public void ApplySource()\n            => Source = new Uri(SourceText);\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentAvaloniaDemo/ViewModels/ViewModelBase.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing ReactiveUI;\n\nnamespace Markdown.AvaloniaFluentAvaloniaDemo.ViewModels\n{\n    public class ViewModelBase : ReactiveObject\n    {\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentAvaloniaDemo/Views/MainWindow.axaml",
    "content": "﻿<Window xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n\n        xmlns:i=\"clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity\"\n        xmlns:vm=\"clr-namespace:Markdown.AvaloniaFluentAvaloniaDemo.ViewModels;assembly=Markdown.AvaloniaFluentAvaloniaDemo\"\n        xmlns:local=\"clr-namespace:Markdown.AvaloniaFluentAvaloniaDemo;assembly=Markdown.AvaloniaFluentAvaloniaDemo\"\n\n        xmlns:md=\"clr-namespace:Markdown.Avalonia;assembly=Markdown.Avalonia\"\n\n        mc:Ignorable=\"d\" d:DesignWidth=\"900\" d:DesignHeight=\"450\"\n        x:Class=\"Markdown.AvaloniaFluentAvaloniaDemo.Views.MainWindow\"\n        Icon=\"/Assets/avalonia-logo.ico\"\n        Title=\"Markdown.AvaloniaFluentAvaloniaDemo\"\n       \n        x:DataType=\"vm:MainWindowViewModel\"\n        >\n\n  <Design.DataContext>\n    <vm:MainWindowViewModel/>\n  </Design.DataContext>\n\n  <Grid>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition Width=\"10*\"/>\n      <ColumnDefinition Width=\"10*\"/>\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition Height=\"10*\"/>\n    </Grid.RowDefinitions>\n\n    <TabControl\n      Grid.Row=\"0\"\n      Grid.Column=\"0\"\n      VerticalAlignment=\"Stretch\">\n\n      <TabItem\n          Header=\"Source\"\n          Grid.Row=\"0\"\n          Grid.Column=\"0\"\n          >\n\n        <TextBox\n          VerticalAlignment=\"Stretch\"\n          AcceptsReturn=\"True\"\n          Text=\"{Binding Text}\"\n          TextWrapping=\"Wrap\"\n          />\n\n      </TabItem>\n\n      <TabItem Header=\"Style\">\n        <Border\n            Padding=\"1\"\n            Margin=\"1\"\n            BorderThickness=\"1\" BorderBrush=\"{DynamicResource ThemeBorderHighBrush}\">\n\n          <DockPanel LastChildFill=\"True\">\n            <DockPanel DockPanel.Dock=\"Top\" LastChildFill=\"False\">\n              <TextBlock DockPanel.Dock=\"Left\">Append Styles</TextBlock>\n              <Button DockPanel.Dock=\"Right\" Content=\"Parse\" Command=\"{Binding TryParse}\"/>\n            </DockPanel>\n\n            <Expander Header=\"Error\" DockPanel.Dock=\"Bottom\" IsExpanded=\"True\">\n              <TextBlock Foreground=\"Red\"\n                          Text=\"{Binding ErrorInfo}\"/>\n            </Expander>\n            <TextBox\n                AcceptsReturn=\"True\"\n                TextWrapping=\"NoWrap\"\n                Text=\"{Binding EdittingStyleXamlText}\"\n                />\n          </DockPanel>\n        </Border>\n      </TabItem>\n\n      <TabItem Header=\"Other\">\n        <Grid>\n          <Grid.RowDefinitions>\n            <RowDefinition Height=\"Auto\"/>\n            <RowDefinition Height=\"Auto\"/>\n            <RowDefinition Height=\"*\"/>\n          </Grid.RowDefinitions>\n          <Grid.ColumnDefinitions>\n            <ColumnDefinition Width=\"Auto\"/>\n            <ColumnDefinition Width=\"10*\"/>\n            <ColumnDefinition Width=\"Auto\"/>\n          </Grid.ColumnDefinitions>\n\n          <TextBlock Grid.Row=\"0\" Grid.Column=\"0\"\n              VerticalAlignment=\"Center\">\n            AssetPathRoot\n          </TextBlock>\n\n          <TextBox Grid.Row=\"0\" Grid.Column=\"1\"\n                   Text=\"{Binding AssetPathRootText}\" />\n\n          <Button Grid.Row=\"0\" Grid.Column=\"2\"\n                  Content=\"Apply\"\n                  Command=\"{Binding ApplyAssetPathRoot}\" />\n\n          <TextBlock Grid.Row=\"1\" Grid.Column=\"0\"\n              VerticalAlignment=\"Center\">\n            Source\n          </TextBlock>\n\n          <TextBox Grid.Row=\"1\" Grid.Column=\"1\"\n                   Text=\"{Binding SourceText}\"/>\n\n          <Button Grid.Row=\"1\" Grid.Column=\"2\"\n                  Content=\"Apply\"\n                  Command=\"{Binding ApplySource}\" />\n\n        </Grid>\n\n      </TabItem>\n\n    </TabControl>\n\n    <TabControl\n          Grid.Row=\"0\"\n          Grid.Column=\"1\"\n          VerticalAlignment=\"Stretch\">\n\n      <TabItem Header=\"View\">\n        <md:MarkdownScrollViewer\n          x:Name=\"MarkdownViewer\"\n          SaveScrollValueWhenContentUpdated=\"True\"\n          \n          Markdown=\"{Binding Text}\"\n\n          AssetPathRoot=\"{Binding AssetPathRoot}\"\n          Source=\"{Binding Source}\"\n      \n          local:DynamicStyleBehavior.XamlText=\"{Binding AppendStyleXamlText}\"\n          local:DynamicStyleBehavior.ValidationResult=\"{Binding XamlParseResult}\">\n        </md:MarkdownScrollViewer>\n      </TabItem>\n\n      <TabItem Header=\"Xaml (broken)\" x:Name=\"SourceTab\">\n        <TextBox\n            x:Name=\"MarkdownSource\"\n            AcceptsReturn=\"True\"\n            TextWrapping=\"NoWrap\"\n            />\n      </TabItem>\n    </TabControl>\n\n  </Grid>\n\n</Window>\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentAvaloniaDemo/Views/MainWindow.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\nusing Markdown.Avalonia;\nusing UnitTest.Base.Utils;\n\nnamespace Markdown.AvaloniaFluentAvaloniaDemo.Views\n{\n    public partial class MainWindow : Window\n    {\n        public MainWindow()\n        {\n            InitializeComponent();\n            SetupComponent();\n        }\n\n        private void InitializeComponent()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n\n\n        private void SetupComponent()\n        {\n            var tabitem = this.FindControl<TabItem>(\"SourceTab\");\n            var viewer = this.FindControl<MarkdownScrollViewer>(\"MarkdownViewer\");\n            var txtbox = this.FindControl<TextBox>(\"MarkdownSource\");\n\n            var engine = new global::Markdown.Avalonia.Markdown();\n            var reverter = new BrokenXamlWriter();\n\n            void UpdateMarkdown(string mdtxt)\n            {\n                var mdctl = engine.Transform(mdtxt);\n                txtbox.Text = Util.AsXaml(mdctl);\n            }\n\n            TabItem.IsSelectedProperty.Changed.AddClassHandler<TabItem>(\n                (ctrl, x) =>\n                {\n                    if (ctrl == tabitem && tabitem.IsSelected)\n                        UpdateMarkdown(viewer.Markdown);\n                }\n            );\n\n            MarkdownScrollViewer.MarkdownProperty.Changed.AddClassHandler<MarkdownScrollViewer>(\n                (ctrl, x) =>\n                {\n                    if (tabitem.IsSelected)\n                        UpdateMarkdown((string)x.NewValue);\n                }\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentAvaloniaDemo/nuget.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- \n  To use the Avalonia CI feed to get unstable packages, move this file to the root of your solution.\n-->\n\n<configuration>\n  <packageSources>\n    <add key=\"AvaloniaCI\" value=\"https://www.myget.org/F/avalonia-ci/api/v2\" />\n  </packageSources>\n</configuration>\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentDemo/App.axaml",
    "content": "﻿<Application xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:local=\"clr-namespace:Markdown.AvaloniaFluentDemo\"\n             x:Class=\"Markdown.AvaloniaFluentDemo.App\"\n             RequestedThemeVariant=\"Light\">\n  <Application.DataTemplates>\n    <local:ViewLocator/>\n  </Application.DataTemplates>\n\n  <Application.Styles>\n    <!--\n    <StyleInclude Source=\"avares://Avalonia.Themes.Fluent/FluentDark.xaml\"/>\n    -->\n    <FluentTheme/>\n    <StyleInclude Source=\"/Assets/AppendingStyles.axaml\"/>\n  </Application.Styles>\n</Application>\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentDemo/App.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls.ApplicationLifetimes;\nusing Avalonia.Markup.Xaml;\nusing Markdown.AvaloniaFluentDemo.ViewModels;\nusing Markdown.AvaloniaFluentDemo.Views;\n\nnamespace Markdown.AvaloniaFluentDemo\n{\n    public class App : Application\n    {\n        public override void Initialize()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n\n        public override void OnFrameworkInitializationCompleted()\n        {\n            if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)\n            {\n                desktop.MainWindow = new MainWindow\n                {\n                    DataContext = new MainWindowViewModel(),\n                };\n            }\n\n            base.OnFrameworkInitializationCompleted();\n        }\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentDemo/Assets/AppendingStyles.axaml",
    "content": "<Styles xmlns=\"https://github.com/avaloniaui\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\n    <Design.PreviewWith>\n      <Button>Sample</Button>\n    </Design.PreviewWith>\n\n    <Style Selector=\"Button\">\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource TextControlForegroundFocused}\"/>\n        <Setter Property=\"BorderThickness\" Value=\"1\" />        \n    </Style>\n</Styles>"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentDemo/Assets/XamlTemplate.txt",
    "content": "﻿<Styles\n    xmlns=\"https://github.com/avaloniaui\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:mdc=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\"\n    xmlns:ctxt=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\">\n\n\n\n\n</Styles>"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentDemo/Assets2/MainWindow.md",
    "content": "﻿### Image ###\n#### Remote images ####\n![image1](http://placehold.it/300x25)  \n![imageleft](http://placehold.it/150x25/0000FF \"blue\")![imageright](http://placehold.it/150x25/00FFFF \"cyan\")\n#### Local and resource images ####\n![localimage](Assets2/ResourceImage.png)\n![ResourceImage](Assets/ResourceImage.png)\n\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentDemo/DynamicStyleBehavior.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\nusing Avalonia.Markup.Xaml.Styling;\nusing Avalonia.Styling;\nusing Markdown.Avalonia;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text;\nusing System.Windows.Input;\n\nnamespace Markdown.AvaloniaFluentDemo\n{\n    public class DynamicStyleBehavior\n    {\n        public static readonly AttachedProperty<string> MyIdProperty =\n            AvaloniaProperty.RegisterAttached<DynamicStyleBehavior, Styles, string>(\"MyId\");\n\n        public static readonly AttachedProperty<string> MyLastParsedProperty =\n            AvaloniaProperty.RegisterAttached<DynamicStyleBehavior, MarkdownScrollViewer, string>(\"MyLastParsed\");\n\n        public static readonly AttachedProperty<string> XamlTextProperty =\n            AvaloniaProperty.RegisterAttached<DynamicStyleBehavior, MarkdownScrollViewer, string>(\n                \"XamlText\", coerce: Validate);\n\n        public static readonly AttachedProperty<ICommand> ValidationResultProperty =\n            AvaloniaProperty.RegisterAttached<DynamicStyleBehavior, MarkdownScrollViewer, ICommand>(\n                \"ValidationResult\");\n\n        public static string Validate(AvaloniaObject obj, string xamlTxt)\n        {\n            var ctrl = obj as MarkdownScrollViewer;\n\n            try\n            {\n                var old = ctrl.GetValue(MyLastParsedProperty);\n                if (old == xamlTxt) return xamlTxt;\n\n                var style = (Styles)AvaloniaRuntimeXamlLoader.Load(xamlTxt);\n                style.SetValue(MyIdProperty, nameof(DynamicStyleBehavior));\n\n                foreach (var exists in ctrl.Styles.ToArray())\n                    if (exists is Styles existsStyle)\n                        if (existsStyle.GetValue(MyIdProperty) == nameof(DynamicStyleBehavior))\n                            ctrl.Styles.Remove(exists);\n\n                ctrl.SetValue(MyLastParsedProperty, xamlTxt);\n                ctrl.Styles.Add(style);\n\n                var resultMsgr = ctrl.GetValue(ValidationResultProperty);\n                resultMsgr?.Execute(null);\n            }\n            catch (Exception e)\n            {\n                string message = e.GetType().FullName + \"\\r\\n\" + e.Message;\n\n                var resultMsgr = ctrl.GetValue(ValidationResultProperty);\n                resultMsgr?.Execute(message);\n            }\n\n            return xamlTxt;\n        }\n\n\n        public static void SetXamlText(MarkdownScrollViewer ctrl, string xamlTxt)\n            => ctrl.SetValue(XamlTextProperty, xamlTxt);\n\n        public static string GetXamlText(MarkdownScrollViewer ctrl)\n            => ctrl.GetValue(XamlTextProperty);\n\n        public static void SetValidationResult(MarkdownScrollViewer ctrl, ICommand cmd)\n            => ctrl.SetValue(ValidationResultProperty, cmd);\n\n        public static ICommand GetValidationResult(MarkdownScrollViewer ctrl)\n            => ctrl.GetValue(ValidationResultProperty);\n\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentDemo/MainWindow.md",
    "content": "﻿# MdXaml #\n\nMdXaml is a modify version of Markdown.Xaml.\nMarkdown XAML is a port of the popular *MarkdownSharp* Markdown processor, but \nwith one very significant difference: Instead of rendering to a string \ncontaining HTML, it renders to a FlowDocument suitable for embedding into a \nWPF window or usercontrol.\n\n\n## The Example Of ... ##\n\n### Text decolation [included original enhance] ###\n*italic*, **bold**, ***bold-italic***, ~~strikethrough~~, __underline__ and %{color:red}color%.  \n%{color:blue}***~~__Mixing Text__~~***%\n\n### Link ###\nLinks [Go to Google!](https://www.google.com)  \nLinks with title [Go to Google!](https://www.google.com \"google.\")  \nLinks with image [![faviicon](https://www.google.com/favicon.ico)](https://www.google.com \"google favicon\")\n\n### Image ###\n#### Remote images ####\n![image1](https://github.com/whistyun/Markdown.Avalonia/raw/master/docs/img.demo/scrn1.png)\n#### Local and resource images ####\n![localimage](LocalPath.png)\n![ResourceImage](Assets/ResourceImage.png)\n![Svg](Assets/Vector.svg)\n\n### List ###\n#### ul\n* one\n* two\n\n#### ol\n1. one\n2. two\n#### alphabet-ol [original enhance]\na. one\nb. two\n\n#### roman-ol [original enhance]\ni, one\nii, two\n\n### Table [included original enhance] ###\n|a|b|c|d|\n|:-:|:-|-:|\n|a1234567890|b1234567890|c1234567890|d1234567890|\n|a|/2.b|c|d|\n|A|\\2.C|\n|1|2|3|4|\n|あ|い|う|え|\n\n### Code ###\nMarkdown.Xaml support ```inline code ``` and block code.\n```c\n#include <stdio.h>\nint main()\n{\n   // printf() displays the string inside quotation\n   printf(\"Hello, World!\");\n   return 0;\n}\n```\n\n### Note ###\n\n< notetext >\n\n<p>. notetext\n\n\n### Separator ###\nsingle line\n ---\ntwo lines\n ===\nbold line\n ***\nbold with single\n___\n\n### Blockquote ###\n> ## Features ##\n> MarkDown.Xaml has a number of convenient features\n> \n> * The engine itself is a single file, for easy inclusion in your own projects\n> * Code for the engine is structured in the same manner as the original MarkdownSharp  \n> * Includes a `TextToFlowDocumentConverter` to make it easy to bind Markdown text\n\n### Text Alignment [original enhance] ###\nMdXaml parse a head of paragraph. If 'p[<=>].' is found, apply text alignment to it.\n> p<. left alignment text\n> \n> p>. right alignment text\n> \n> p=. center alignment\n\n\n## What is this Demo? ##\n\nThis demo application shows MdXaml in use - as you make changes to the \nleft pane, the rendered MarkDown will appear in the right pane.\n\n### Source ###\n\nReview the source for this demo to see how MdXaml works in practice, how to use the MarkdownScrollViewer,\nand how to style the output to appear the way you desire.\n\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentDemo/Markdown.AvaloniaFluentDemo.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <Import Project=\"..\\..\\Markdown.Avalonia.props\" />\n\n  <PropertyGroup>\n    <OutputType>WinExe</OutputType>\n    <IsPackable>false</IsPackable>\n    <TargetFrameworks>$(DemoAppTargetFrameworks)</TargetFrameworks>\n    <LangVersion>9</LangVersion>\n    <Nullable>disable</Nullable>\n  </PropertyGroup>\n  <ItemGroup>\n    <AvaloniaResource Include=\"Assets\\**\" />\n    <AvaloniaResource Include=\"Assets2\\**\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" Version=\"$(DemoAvaloniaVersion)\" />\n    <PackageReference Include=\"Avalonia.Desktop\" Version=\"$(DemoAvaloniaVersion)\" />\n    <PackageReference Include=\"Avalonia.Themes.Fluent\" Version=\"$(DemoAvaloniaVersion)\" />\n    <PackageReference Include=\"ReactiveUI.Avalonia\" Version=\"11.4.12\" />\n    <PackageReference Include=\"Avalonia.Markup.Xaml.Loader\" Version=\"$(DemoAvaloniaVersion)\" />\n    <None Remove=\"Assets\\Vector.svg\" />\n    <None Remove=\"Assets\\XamlTemplate.txt\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\..\\tests\\UnitTest.Base\\Utils\\BrokenXamlWriter.cs\" Link=\"BrokenXamlWriter.cs\" />\n    <Compile Include=\"..\\..\\tests\\UnitTest.Base\\Utils\\Util.cs\" Link=\"Util.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\Markdown.Avalonia\\Markdown.Avalonia.csproj\" />\n    <ProjectReference Include=\"..\\..\\Markdown.Avalonia.Svg\\Markdown.Avalonia.Svg.csproj\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Update=\"LocalPath.png\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Update=\"MainWindow.md\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentDemo/MyConverter.cs",
    "content": "﻿using Avalonia.Controls;\nusing Avalonia.Data.Converters;\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Text;\n\nnamespace Markdown.AvaloniaFluentDemo\n{\n    public class MyConverter : IValueConverter\n    {\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            if (value is ContentControl ctrl)\n            {\n                return ctrl.Content?.ToString();\n            }\n\n            return value?.ToString();\n        }\n\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            throw new NotImplementedException();\n        }\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentDemo/Program.cs",
    "content": "﻿using System;\nusing Avalonia;\n\nnamespace Markdown.AvaloniaFluentDemo\n{\n    class Program\n    {\n        // Initialization code. Don't use any Avalonia, third-party APIs or any\n        // SynchronizationContext-reliant code before AppMain is called: things aren't initialized\n        // yet and stuff might break.\n        public static void Main(string[] args) => BuildAvaloniaApp()\n            .StartWithClassicDesktopLifetime(args);\n\n        // Avalonia configuration, don't remove; also used by visual designer.\n        public static AppBuilder BuildAvaloniaApp()\n            => AppBuilder.Configure<App>()\n                .UsePlatformDetect();\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentDemo/ViewLocator.cs",
    "content": "using System;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Templates;\nusing Markdown.AvaloniaFluentDemo.ViewModels;\n\nnamespace Markdown.AvaloniaFluentDemo\n{\n    public class ViewLocator : IDataTemplate\n    {\n        public bool SupportsRecycling => false;\n\n        public Control Build(object data)\n        {\n            var name = data.GetType().FullName.Replace(\"ViewModel\", \"View\");\n            var type = Type.GetType(name);\n\n            if (type != null)\n            {\n                return (Control)Activator.CreateInstance(type);\n            }\n            else\n            {\n                return new TextBlock { Text = \"Not Found: \" + name };\n            }\n        }\n\n        public bool Match(object data)\n        {\n            return data is ViewModelBase;\n        }\n    }\n}"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentDemo/ViewModels/MainWindowViewModel.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml.Styling;\nusing Avalonia.Platform;\nusing Avalonia.Styling;\nusing Markdown.Avalonia;\nusing ReactiveUI;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\n\nnamespace Markdown.AvaloniaFluentDemo.ViewModels\n{\n    public class MainWindowViewModel : ViewModelBase\n    {\n        private string _text;\n        public string Text\n        {\n            get => _text;\n            set => this.RaiseAndSetIfChanged(ref _text, value);\n        }\n\n        private string _edittingStyleXamlText;\n        public string EdittingStyleXamlText\n        {\n            get => _edittingStyleXamlText;\n            set => this.RaiseAndSetIfChanged(ref _edittingStyleXamlText, value);\n        }\n\n        private string _appendStyleXamlText;\n        public string AppendStyleXamlText\n        {\n            get => _appendStyleXamlText;\n            set => this.RaiseAndSetIfChanged(ref _appendStyleXamlText, value);\n        }\n\n        private string _ErrorInfo;\n        public string ErrorInfo\n        {\n            get => _ErrorInfo;\n            set => this.RaiseAndSetIfChanged(ref _ErrorInfo, value);\n        }\n\n        private string _AssetPathRootText;\n        public string AssetPathRootText\n        {\n            get => _AssetPathRootText;\n            set => this.RaiseAndSetIfChanged(ref _AssetPathRootText, value);\n        }\n\n        private string _SourceText;\n        public string SourceText\n        {\n            get => _SourceText;\n            set => this.RaiseAndSetIfChanged(ref _SourceText, value);\n        }\n\n        private string _AssetPathRoot;\n        public string AssetPathRoot\n        {\n            get => _AssetPathRoot;\n            set\n            {\n                _AssetPathRoot = value;\n                this.RaisePropertyChanged();\n            }\n        }\n\n        private Uri _Source;\n        public Uri Source\n        {\n            get => _Source;\n            set\n            {\n                _Source = value;\n                this.RaisePropertyChanged();\n            }\n        }\n\n        public void XamlParseResult(string result) => ErrorInfo = result;\n\n        public void TryParse() => AppendStyleXamlText = EdittingStyleXamlText;\n\n        public MainWindowViewModel()\n        {\n            using (var stream = new FileStream(\"MainWindow.md\", FileMode.Open))\n            using (var reader = new StreamReader(stream))\n            {\n                Text = reader.ReadToEnd();\n            }\n\n            using (var strm = AssetLoader.Open(new Uri(\"avares://Markdown.AvaloniaFluentDemo/Assets/XamlTemplate.txt\")))\n            using (var reader = new StreamReader(strm))\n            {\n                EdittingStyleXamlText = reader.ReadToEnd();\n            }\n        }\n\n        public void ApplyAssetPathRoot()\n            => AssetPathRoot = AssetPathRootText;\n\n        public void ApplySource()\n            => Source = new Uri(SourceText);\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentDemo/ViewModels/ViewModelBase.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing ReactiveUI;\n\nnamespace Markdown.AvaloniaFluentDemo.ViewModels\n{\n    public class ViewModelBase : ReactiveObject\n    {\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentDemo/Views/MainWindow.axaml",
    "content": "﻿<Window xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n\n        xmlns:i=\"clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity\"\n        xmlns:vm=\"clr-namespace:Markdown.AvaloniaFluentDemo.ViewModels;assembly=Markdown.AvaloniaFluentDemo\"\n        xmlns:local=\"clr-namespace:Markdown.AvaloniaFluentDemo;assembly=Markdown.AvaloniaFluentDemo\"\n\n        xmlns:md=\"https://github.com/whistyun/Markdown.Avalonia.Tight\"\n        xmlns:mdsvg=\"https://github.com/whistyun/Markdown.Avalonia.Svg\"\n\n        mc:Ignorable=\"d\" d:DesignWidth=\"900\" d:DesignHeight=\"450\"\n        x:Class=\"Markdown.AvaloniaFluentDemo.Views.MainWindow\"\n        x:DataType=\"vm:MainWindowViewModel\"\n        Icon=\"/Assets/avalonia-logo.ico\"\n        Title=\"Markdown.AvaloniaFluentDemo\"\n        >\n\n  <Design.DataContext>\n    <vm:MainWindowViewModel/>\n  </Design.DataContext>\n\n  <Grid>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition Width=\"10*\"/>\n      <ColumnDefinition Width=\"10*\"/>\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition Height=\"10*\"/>\n    </Grid.RowDefinitions>\n\n    <TabControl\n      Grid.Row=\"0\"\n      Grid.Column=\"0\"\n      VerticalAlignment=\"Stretch\">\n\n      <TabItem\n          Header=\"Source\"\n          Grid.Row=\"0\"\n          Grid.Column=\"0\"\n          >\n\n        <TextBox\n          VerticalAlignment=\"Stretch\"\n          AcceptsReturn=\"True\"\n          Text=\"{Binding Text}\"\n          TextWrapping=\"Wrap\"\n          />\n\n      </TabItem>\n\n      <TabItem Header=\"Style\">\n        <Grid>\n          <Grid.ColumnDefinitions>\n            <ColumnDefinition Width=\"Auto\"/>\n            <ColumnDefinition Width=\"10*\"/>\n          </Grid.ColumnDefinitions>\n          <Grid.RowDefinitions>\n            <RowDefinition Height=\"10*\"/>\n          </Grid.RowDefinitions>\n\n          <Border\n              Grid.Row=\"0\"\n              Grid.Column=\"0\"\n              Grid.ColumnSpan=\"2\"\n              Padding=\"1\"\n              Margin=\"1\"\n              BorderThickness=\"1\" BorderBrush=\"{DynamicResource ThemeBorderHighBrush}\">\n\n            <DockPanel LastChildFill=\"True\">\n              <DockPanel DockPanel.Dock=\"Top\" LastChildFill=\"False\">\n                <TextBlock DockPanel.Dock=\"Left\">Append Styles</TextBlock>\n                <Button DockPanel.Dock=\"Right\" Content=\"Parse\" Command=\"{Binding TryParse}\"/>\n              </DockPanel>\n\n              <Expander Header=\"Error\" DockPanel.Dock=\"Bottom\" IsExpanded=\"True\">\n                <TextBlock Foreground=\"Red\"\n                           Text=\"{Binding ErrorInfo}\"/>\n              </Expander>\n              <TextBox\n                  AcceptsReturn=\"True\"\n                  TextWrapping=\"NoWrap\"\n                  Text=\"{Binding EdittingStyleXamlText}\"\n                  />\n            </DockPanel>\n          </Border>\n        </Grid>\n      </TabItem>\n\n      <TabItem Header=\"Other\">\n        <Grid>\n          <Grid.RowDefinitions>\n            <RowDefinition Height=\"Auto\"/>\n            <RowDefinition Height=\"Auto\"/>\n            <RowDefinition Height=\"*\"/>\n          </Grid.RowDefinitions>\n          <Grid.ColumnDefinitions>\n            <ColumnDefinition Width=\"Auto\"/>\n            <ColumnDefinition Width=\"10*\"/>\n            <ColumnDefinition Width=\"Auto\"/>\n          </Grid.ColumnDefinitions>\n\n          <TextBlock Grid.Row=\"0\" Grid.Column=\"0\"\n              VerticalAlignment=\"Center\">\n            AssetPathRoot\n          </TextBlock>\n\n          <TextBox Grid.Row=\"0\" Grid.Column=\"1\"\n                   Text=\"{Binding AssetPathRootText}\" />\n\n          <Button Grid.Row=\"0\" Grid.Column=\"2\"\n                  Content=\"Apply\"\n                  Command=\"{Binding ApplyAssetPathRoot}\" />\n\n          <TextBlock Grid.Row=\"1\" Grid.Column=\"0\"\n              VerticalAlignment=\"Center\">\n            Source\n          </TextBlock>\n\n          <TextBox Grid.Row=\"1\" Grid.Column=\"1\"\n                   Text=\"{Binding SourceText}\"/>\n\n          <Button Grid.Row=\"1\" Grid.Column=\"2\"\n                  Content=\"Apply\"\n                  Command=\"{Binding ApplySource}\" />\n\n        </Grid>\n\n      </TabItem>\n\n    </TabControl>\n\n    <TabControl\n          Grid.Row=\"0\"\n          Grid.Column=\"1\"\n          VerticalAlignment=\"Stretch\">\n\n      <TabItem Header=\"View\">\n        <md:MarkdownScrollViewer\n          x:Name=\"MarkdownViewer\"\n          SaveScrollValueWhenContentUpdated=\"True\"\n          \n          Markdown=\"{Binding Text}\"\n\n          AssetPathRoot=\"{Binding AssetPathRoot}\"\n          Source=\"{Binding Source}\"\n      \n          local:DynamicStyleBehavior.XamlText=\"{Binding AppendStyleXamlText}\"\n          local:DynamicStyleBehavior.ValidationResult=\"{Binding XamlParseResult}\">\n\n          <md:MarkdownScrollViewer.Plugins>\n            <md:MdAvPlugins>\n              <mdsvg:SvgFormat/>\n              <md:ChatAISetup/>\n            </md:MdAvPlugins>\n          </md:MarkdownScrollViewer.Plugins>\n\n        </md:MarkdownScrollViewer>\n      </TabItem>\n\n      <TabItem Header=\"Xaml (broken)\" x:Name=\"SourceTab\">\n        <TextBox\n            x:Name=\"MarkdownSource\"\n            AcceptsReturn=\"True\"\n            TextWrapping=\"NoWrap\"\n            />\n      </TabItem>\n    </TabControl>\n\n  </Grid>\n\n</Window>\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentDemo/Views/MainWindow.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\nusing Markdown.Avalonia;\nusing UnitTest.Base.Utils;\n\nnamespace Markdown.AvaloniaFluentDemo.Views\n{\n    public partial class MainWindow : Window\n    {\n        public MainWindow()\n        {\n            InitializeComponent();\n            SetupComponent();\n        }\n\n        private void InitializeComponent()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n\n\n        private void SetupComponent()\n        {\n            var tabitem = this.FindControl<TabItem>(\"SourceTab\");\n            var viewer = this.FindControl<MarkdownScrollViewer>(\"MarkdownViewer\");\n            var txtbox = this.FindControl<TextBox>(\"MarkdownSource\");\n\n            var engine = new global::Markdown.Avalonia.Markdown();\n            var reverter = new BrokenXamlWriter();\n\n            void UpdateMarkdown(string mdtxt)\n            {\n                var mdctl = engine.Transform(mdtxt);\n                txtbox.Text = Util.AsXaml(mdctl);\n            }\n\n            TabItem.IsSelectedProperty.Changed.AddClassHandler<TabItem>(\n                (ctrl, x) =>\n                {\n                    if (ctrl == tabitem && tabitem.IsSelected)\n                        UpdateMarkdown(viewer.Markdown);\n                }\n            );\n\n            MarkdownScrollViewer.MarkdownProperty.Changed.AddClassHandler<MarkdownScrollViewer>(\n                (ctrl, x) =>\n                {\n                    if (tabitem.IsSelected)\n                        UpdateMarkdown((string)x.NewValue);\n                }\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "demos/Markdown.AvaloniaFluentDemo/nuget.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- \n  To use the Avalonia CI feed to get unstable packages, move this file to the root of your solution.\n-->\n\n<configuration>\n  <packageSources>\n    <add key=\"AvaloniaCI\" value=\"https://www.myget.org/F/avalonia-ci/api/v2\" />\n  </packageSources>\n</configuration>\n"
  },
  {
    "path": "example/CustomStyle/CustomStyle/App.axaml",
    "content": "﻿<Application xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             x:Class=\"CustomStyle.App\">\n    <Application.Styles>\n        <StyleInclude Source=\"avares://Avalonia.Themes.Default/DefaultTheme.xaml\"/>\n        <StyleInclude Source=\"avares://Avalonia.Themes.Default/Accents/BaseLight.xaml\"/>\n    </Application.Styles>\n</Application>\n"
  },
  {
    "path": "example/CustomStyle/CustomStyle/App.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls.ApplicationLifetimes;\nusing Avalonia.Markup.Xaml;\n\nnamespace CustomStyle\n{\n    public class App : Application\n    {\n        public override void Initialize()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n\n        public override void OnFrameworkInitializationCompleted()\n        {\n            if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)\n            {\n                desktop.MainWindow = new MainWindow();\n            }\n\n            base.OnFrameworkInitializationCompleted();\n        }\n    }\n}\n"
  },
  {
    "path": "example/CustomStyle/CustomStyle/CustomStyle.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>WinExe</OutputType>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" Version=\"0.10.0-preview6\" />\n    <PackageReference Include=\"Avalonia.Desktop\" Version=\"0.10.0-preview6\" />\n    <PackageReference Include=\"Markdown.Avalonia\" Version=\"0.10.0-a1\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Update=\"UseEmbeddedStyle.axaml.cs\">\n      <DependentUpon>UseEmbeddedStyle.axaml</DependentUpon>\n    </Compile>\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "example/CustomStyle/CustomStyle/MainWindow.axaml",
    "content": "﻿<Window xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n\n        xmlns:local=\"clr-namespace:CustomStyle;assembly=CustomStyle\"\n        \n        mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n        x:Class=\"CustomStyle.MainWindow\"\n        Title=\"CustomStyle\">\n\n  <TabControl>\n    <TabItem Header=\"UseEmbeddedStyle\">\n      <local:UseEmbeddedStyle/>\n    </TabItem>\n\n    <TabItem Header=\"UseEmbeddedStyle\">\n      <local:SetStyles/>\n    </TabItem>\n\n  </TabControl>\n  \n  \n</Window>\n"
  },
  {
    "path": "example/CustomStyle/CustomStyle/MainWindow.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace CustomStyle\n{\n    public class MainWindow : Window\n    {\n        public MainWindow()\n        {\n            InitializeComponent();\n        }\n\n        private void InitializeComponent()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "example/CustomStyle/CustomStyle/Program.cs",
    "content": "﻿using Avalonia;\n\nnamespace CustomStyle\n{\n    class Program\n    {\n        // Initialization code. Don't use any Avalonia, third-party APIs or any\n        // SynchronizationContext-reliant code before AppMain is called: things aren't initialized\n        // yet and stuff might break.\n        public static void Main(string[] args) => BuildAvaloniaApp()\n            .StartWithClassicDesktopLifetime(args);\n\n        // Avalonia configuration, don't remove; also used by visual designer.\n        public static AppBuilder BuildAvaloniaApp()\n            => AppBuilder.Configure<App>()\n                .UsePlatformDetect()\n                .LogToDebug();\n    }\n}\n"
  },
  {
    "path": "example/CustomStyle/CustomStyle/SetStyles.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             \n             xmlns:md=\"clr-namespace:Markdown.Avalonia;assembly=Markdown.Avalonia\"\n             xmlns:ctxt=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\"\n\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"CustomStyle.SetStyles\">\n\n  <md:MarkdownScrollViewer>\n    <md:MarkdownScrollViewer.Styles>\n\n      <!-- overwrite a style in some parts. -->\n\n      <Style Selector=\"ctxt|CTextBlock.Heading1\">\n        <Setter Property=\"Foreground\" Value=\"Red\"/>\n        <Setter Property=\"Background\" Value=\"Yellow\"/>\n        <Setter Property=\"TextAlignment\" Value=\"Center\"/>\n      </Style>\n\n      <Style Selector=\"ctxt|CTextBlock.ListMarker\">\n        <Setter Property=\"Foreground\" Value=\"Blue\"/>\n      </Style>\n\n      <Style Selector=\"Border.Blockquote ctxt|CTextBlock.Heading1\">\n        <Setter Property=\"Foreground\" Value=\"Black\"/>\n        <Setter Property=\"TextAlignment\" Value=\"Left\"/>\n        <Setter Property=\"FontSize\" Value=\"14\"/>\n      </Style>\n\n    </md:MarkdownScrollViewer.Styles>\n\n    # Heading1\n    ## Heading2\n    ### Heading3\n    #### Heading4\n\n    some text, any text.\n    \n    * listitem1\n    * listitem2\n\n    | col1 | col2 | col3 |\n    |------|------|------|\n    | one  |------|------|\n    | two  |------|------|\n    | three|------|------|\n    \n\n    > #blockquote\n    >\n    > p>. and enhance syntax \n  </md:MarkdownScrollViewer>\n\n\n</UserControl>\n"
  },
  {
    "path": "example/CustomStyle/CustomStyle/SetStyles.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace CustomStyle\n{\n    public class SetStyles : UserControl\n    {\n        public SetStyles()\n        {\n            this.InitializeComponent();\n        }\n\n        private void InitializeComponent()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "example/CustomStyle/CustomStyle/UseEmbeddedStyle.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             \n             xmlns:md=\"clr-namespace:Markdown.Avalonia;assembly=Markdown.Avalonia\"\n\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"CustomStyle.UseEmbeddedStyle\">\n\n\n  <!--\n    MarkdownStyleName can be set either \"Standard\" or \"GithubLike\"\n  -->\n  <md:MarkdownScrollViewer MarkdownStyleName=\"GithubLike\">\n    # Heading1\n    ## Heading2\n    ### Heading3\n    #### Heading4\n\n    some text, any text.\n    \n    * listitem1\n    * listitem2\n\n    | col1 | col2 | col3 |\n    |------|------|------|\n    | one  |------|------|\n    | two  |------|------|\n    | three|------|------|\n    \n\n    > #blockquote\n    >\n    > p>. and enhance syntax \n  </md:MarkdownScrollViewer>\n\n\n</UserControl>\n"
  },
  {
    "path": "example/CustomStyle/CustomStyle/UseEmbeddedStyle.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace CustomStyle\n{\n    public class UseEmbeddedStyle : UserControl\n    {\n        public UseEmbeddedStyle()\n        {\n            this.InitializeComponent();\n        }\n\n        private void InitializeComponent()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "example/CustomStyle/CustomStyle/nuget.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- \n  To use the Avalonia CI feed to get unstable packages, move this file to the root of your solution.\n-->\n\n<configuration>\n  <packageSources>\n    <add key=\"AvaloniaCI\" value=\"https://www.myget.org/F/avalonia-ci/api/v2\" />\n  </packageSources>\n</configuration>\n"
  },
  {
    "path": "example/CustomStyle/CustomStyle.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.30413.136\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"CustomStyle\", \"CustomStyle\\CustomStyle.csproj\", \"{2C4278EF-8E15-4EEF-BE28-F69894D1D71C}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{2C4278EF-8E15-4EEF-BE28-F69894D1D71C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2C4278EF-8E15-4EEF-BE28-F69894D1D71C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2C4278EF-8E15-4EEF-BE28-F69894D1D71C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2C4278EF-8E15-4EEF-BE28-F69894D1D71C}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {846F5F47-9FFB-45AA-A4B8-5CCAC8104D31}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "example/HowToUse/HowToUse/App.axaml",
    "content": "﻿<Application xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             x:Class=\"CustomStyle.App\">\n    <Application.Styles>\n        <StyleInclude Source=\"avares://Avalonia.Themes.Default/DefaultTheme.xaml\"/>\n        <StyleInclude Source=\"avares://Avalonia.Themes.Default/Accents/BaseLight.xaml\"/>\n    </Application.Styles>\n</Application>\n"
  },
  {
    "path": "example/HowToUse/HowToUse/App.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls.ApplicationLifetimes;\nusing Avalonia.Markup.Xaml;\n\nnamespace CustomStyle\n{\n    public class App : Application\n    {\n        public override void Initialize()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n\n        public override void OnFrameworkInitializationCompleted()\n        {\n            if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)\n            {\n                desktop.MainWindow = new MainWindow();\n            }\n\n            base.OnFrameworkInitializationCompleted();\n        }\n    }\n}\n"
  },
  {
    "path": "example/HowToUse/HowToUse/HowToUse.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>WinExe</OutputType>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" Version=\"0.10.0-preview6\" />\n    <PackageReference Include=\"Avalonia.Desktop\" Version=\"0.10.0-preview6\" />\n    <PackageReference Include=\"Avalonia.ReactiveUI\" Version=\"0.10.0-preview6\" />\n    <PackageReference Include=\"Markdown.Avalonia\" Version=\"0.10.0-a1\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "example/HowToUse/HowToUse/MainWindow.axaml",
    "content": "﻿<Window xmlns=\"https://github.com/avaloniaui\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n\n        xmlns:local=\"clr-namespace:HowToUse;assembly=HowToUse\"\n        \n        mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n        x:Class=\"CustomStyle.MainWindow\"\n        Title=\"CustomStyle\">\n\n  <TabControl>\n    <TabItem Header=\"WriteMarkdownInXaml\">\n      <local:WriteMarkdownInXaml/>\n    </TabItem>\n\n    <TabItem Header=\"UseBinding\">\n      <local:UseBinding/>\n    </TabItem>\n  </TabControl>\n  \n  \n</Window>\n"
  },
  {
    "path": "example/HowToUse/HowToUse/MainWindow.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace CustomStyle\n{\n    public class MainWindow : Window\n    {\n        public MainWindow()\n        {\n            InitializeComponent();\n        }\n\n        private void InitializeComponent()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "example/HowToUse/HowToUse/Program.cs",
    "content": "﻿using Avalonia;\n\nnamespace CustomStyle\n{\n    class Program\n    {\n        // Initialization code. Don't use any Avalonia, third-party APIs or any\n        // SynchronizationContext-reliant code before AppMain is called: things aren't initialized\n        // yet and stuff might break.\n        public static void Main(string[] args) => BuildAvaloniaApp()\n            .StartWithClassicDesktopLifetime(args);\n\n        // Avalonia configuration, don't remove; also used by visual designer.\n        public static AppBuilder BuildAvaloniaApp()\n            => AppBuilder.Configure<App>()\n                .UsePlatformDetect()\n                .LogToDebug();\n    }\n}\n"
  },
  {
    "path": "example/HowToUse/HowToUse/UseBinding.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n\n             xmlns:local=\"clr-namespace:HowToUse;assembly=HowToUse\"\n             xmlns:md=\"clr-namespace:Markdown.Avalonia;assembly=Markdown.Avalonia\"\n\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"HowToUse.UseBinding\">\n\n  <UserControl.DataContext>\n    <local:UseBindingViewModel/>\n  </UserControl.DataContext>\n\n  <DockPanel LastChildFill=\"True\">\n\n    <TextBox\n      AcceptsReturn=\"True\"\n      TextWrapping=\"Wrap\"\n      DockPanel.Dock=\"Left\"\n      Text=\"{Binding Text}\"/>\n\n    <md:MarkdownScrollViewer Markdown=\"{Binding Text}\"/>\n\n  </DockPanel>\n\n\n\n</UserControl>\n"
  },
  {
    "path": "example/HowToUse/HowToUse/UseBinding.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace HowToUse\n{\n    public class UseBinding : UserControl\n    {\n        public UseBinding()\n        {\n            this.InitializeComponent();\n        }\n\n        private void InitializeComponent()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "example/HowToUse/HowToUse/UseBindingViewModel.cs",
    "content": "﻿using ReactiveUI;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace HowToUse\n{\n    public class UseBindingViewModel : ReactiveObject\n    {\n        private string _text;\n        public string Text\n        {\n            get => _text;\n            set => this.RaiseAndSetIfChanged(ref _text, value);\n        }\n\n\n        public UseBindingViewModel()\n        {\n            Text = \"# Heading1\\n\\nHello markdown.\\n\\n* listitem1\\n* listitem2\\n\\n| col1 | col2 | col3 |\\n|------|------|------|\\n| one  |------|------|\\n| two  |------|------|\\n\\n> p>. and enhance syntax\";\n        }\n    }\n}\n"
  },
  {
    "path": "example/HowToUse/HowToUse/WriteMarkdownInXaml.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n\n             xmlns:md=\"clr-namespace:Markdown.Avalonia;assembly=Markdown.Avalonia\"\n             \n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"HowToUse.WriteMarkdownInXaml\">\n\n  <md:MarkdownScrollViewer>\n    # Heading1\n\n    Hello markdown.\n\n    * listitem1\n    * listitem2\n\n    | col1 | col2 | col3 |\n    |------|------|------|\n    | one  |------|------|\n    | two  |------|------|\n\n\n    > p>. and enhance syntax\n  </md:MarkdownScrollViewer>\n\n</UserControl>\n"
  },
  {
    "path": "example/HowToUse/HowToUse/WriteMarkdownInXaml.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace HowToUse\n{\n    public class WriteMarkdownInXaml : UserControl\n    {\n        public WriteMarkdownInXaml()\n        {\n            this.InitializeComponent();\n        }\n\n        private void InitializeComponent()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "example/HowToUse/HowToUse/nuget.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- \n  To use the Avalonia CI feed to get unstable packages, move this file to the root of your solution.\n-->\n\n<configuration>\n  <packageSources>\n    <add key=\"AvaloniaCI\" value=\"https://www.myget.org/F/avalonia-ci/api/v2\" />\n  </packageSources>\n</configuration>\n"
  },
  {
    "path": "example/HowToUse/HowToUse.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.30413.136\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"HowToUse\", \"HowToUse\\HowToUse.csproj\", \"{2C4278EF-8E15-4EEF-BE28-F69894D1D71C}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{2C4278EF-8E15-4EEF-BE28-F69894D1D71C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2C4278EF-8E15-4EEF-BE28-F69894D1D71C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2C4278EF-8E15-4EEF-BE28-F69894D1D71C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2C4278EF-8E15-4EEF-BE28-F69894D1D71C}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {846F5F47-9FFB-45AA-A4B8-5CCAC8104D31}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "pack_readme/Markdown.Avalonia.Html.md",
    "content": "This package add HTML support to Markdown.Avalonia.Tight.\nIt dose not support all HTML tags.\n\nsupports only\n\n*\n*\n*\n*\n*\n"
  },
  {
    "path": "pack_readme/Markdown.Avalonia.Svg.md",
    "content": "This package add SVG support to Markdown.Avalonia.Tight\n"
  },
  {
    "path": "pack_readme/Markdown.Avalonia.SyntaxHigh.md",
    "content": "This package add syntax highlighint feature to Markdown.Avalonia.Tight\n"
  },
  {
    "path": "pack_readme/Markdown.Avalonia.Tight.md",
    "content": "Markdown.Avalonia render Markdown with avalonia ui. It transform markdown to controls (ex: Border, Grid, TextBlock).\n\nThere is no syntax highlighting for code blocks in this package. If you want syntax highlighting, use [Markdown.Avalonia](https://www.nuget.org/packages/Markdown.Avalonia) instead.\n\n**How to use**  \n\nMarkdown.Avalonia supports three methods to render markdown.\n\n1. [Load .md from AvaloniaResource](https://github.com/whistyun/Markdown.Avalonia/wiki/How-to-use#Load-.md-from-AvaloniaResource)\n   ```xml\n   <md:MarkdownScrollViewer\n      Source=\"avares://YourAssemblyName/MdTxt/Test.md\"/>\n   ```\n2. [Write markdown in xaml](https://github.com/whistyun/Markdown.Avalonia/wiki/How-to-use#Write-markdown-in-xaml)\n   ```xml\n   <md:MarkdownScrollViewer>\n     # Heading1\n     Hello Markdown.Avalonia!\n   </md:MarkdownScrollViewer>\n   ```\n3. [With binding](https://github.com/whistyun/Markdown.Avalonia/wiki/How-to-use#With-binding)\n   ```xml\n   <md:MarkdownScrollViewer\n      Markdown=\"{Binding MdText}\"/>\n   ```\n\n**Preview**  \n![sc1](https://raw.githubusercontent.com/whistyun/Markdown.Avalonia/master/docs/img.demo/scrn1.png)  \n![sc2](https://raw.githubusercontent.com/whistyun/Markdown.Avalonia/master/docs/img.demo/scrn2.png)  "
  },
  {
    "path": "pack_readme/Markdown.Avalonia.md",
    "content": "Markdown.Avalonia render Markdown with avalonia ui. It transform markdown to controls (ex: Border, Grid, TextBlock). \n\nThis package depends on AvaloniaEdit for syntax highlighting.\nIf you don't want it, use [Markdown.Avalonia.Tight](https://www.nuget.org/packages/Markdown.Avalonia.Tight) instead.\n\n**How to use**  \n\nMarkdown.Avalonia supports three methods to render markdown.\n\n1. [Load .md from AvaloniaResource](https://github.com/whistyun/Markdown.Avalonia/wiki/How-to-use#Load-.md-from-AvaloniaResource)\n   ```xml\n   <md:MarkdownScrollViewer\n      Source=\"avares://YourAssemblyName/Assets/Test.md\"/>\n   ```\n2. [Write markdown in xaml](https://github.com/whistyun/Markdown.Avalonia/wiki/How-to-use#Write-markdown-in-xaml)\n   ```xml\n   <md:MarkdownScrollViewer>\n     # Heading1\n     Hello Markdown.Avalonia!\n   </md:MarkdownScrollViewer>\n   ```\n3. [With binding](https://github.com/whistyun/Markdown.Avalonia/wiki/How-to-use#With-binding)\n   ```xml\n   <md:MarkdownScrollViewer\n      Markdown=\"{Binding MdText}\"/>\n   ```\n\n**Preview**  \n![sc1](https://raw.githubusercontent.com/whistyun/Markdown.Avalonia/master/docs/img.demo/scrn1.png)  \n![sc2](https://raw.githubusercontent.com/whistyun/Markdown.Avalonia/master/docs/img.demo/scrn2.png)  "
  },
  {
    "path": "tests/UnitTest.Base/Apps/App.axaml",
    "content": "﻿<Application xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:local=\"clr-namespace:UnitTest.Base.Apps\"\n             x:Class=\"UnitTest.Base.Apps.App\"\n             RequestedThemeVariant=\"Light\">\n\n  <Application.Styles>\n    <SimpleTheme/>\n  </Application.Styles>\n</Application>\n"
  },
  {
    "path": "tests/UnitTest.Base/Apps/App.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Input;\nusing Avalonia.Layout;\nusing Avalonia.Platform;\nusing Avalonia.Styling;\nusing Avalonia.Controls;\nusing Avalonia.Rendering;\nusing Avalonia.Threading;\nusing Avalonia.Markup.Xaml;\n\nusing System;\nusing Avalonia.Controls.ApplicationLifetimes;\nusing System.Collections.Generic;\nusing System.Threading;\nusing System.Diagnostics;\n\nnamespace UnitTest.Base.Apps\n{\n    public class App : Application\n    {\n        internal static bool ApplicationStarted = false;\n\n        public override void Initialize()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n\n        public override void OnFrameworkInitializationCompleted()\n        {\n            Debug.Print(\"OnFrameworkInitializationCompleted Called\");\n\n            if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)\n            {\n                Debug.Print(\"Lifetime is ClassicDesktop\");\n\n                var win = new Window();\n                win.Loaded += (s, e) => Loaded();\n\n                desktop.MainWindow = win;\n            }\n            else Loaded();\n\n            base.OnFrameworkInitializationCompleted();\n        }\n\n        private void Loaded()\n        {\n            Debug.Print(\"MainWindowLoaded\");\n            ApplicationStarted = true;\n        }\n\n        public static IDisposable Start()\n        {\n            var starter = new AppStarter();\n\n            var th = new Thread(starter.Start);\n            th.Start();\n\n            return starter;\n        }\n    }\n\n    class AppStarter : IDisposable\n    {\n        ClassicDesktopStyleApplicationLifetime lifetime;\n\n        public void Start()\n        {\n            var builder = AppBuilder.Configure<App>();\n            builder.UsePlatformDetect();\n\n            var ags = new string[0];\n\n            lifetime = new ClassicDesktopStyleApplicationLifetime()\n            {\n                Args = ags,\n                ShutdownMode = ShutdownMode.OnMainWindowClose\n            };\n            builder.SetupWithLifetime(lifetime);\n\n            lifetime.Start(ags);\n        }\n\n        public void Dispose()\n        {\n            try { lifetime.Shutdown(); }\n            finally { lifetime.Dispose(); }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/UnitTest.Base/ChangeOutputPathNamer.cs",
    "content": "using ApprovalTests.Namers;\nusing System.IO;\n\nnamespace UnitTest.Base\n{\n    public class ChangeOutputPathNamer : UnitTestFrameworkNamer\n    {\n        private string dir;\n\n\n        public override string SourcePath\n        {\n            get\n            {\n                var basePath = base.SourcePath;\n                return Path.Combine(basePath, dir);\n            }\n        }\n\n        public ChangeOutputPathNamer(string dir)\n        {\n            this.dir = dir;\n        }\n    }\n}\n"
  },
  {
    "path": "tests/UnitTest.Base/UnitTest.Base.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <Import Project=\"..\\UnitTest.props\" />\n\n  <PropertyGroup>\n    <TargetFrameworks>$(TestTargetFrameworks)</TargetFrameworks>\n    <IsPackable>false</IsPackable>\n    <LangVersion>9</LangVersion>\n    <Nullable>disable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Update=\"Apps\\App.axaml.cs\">\n      <DependentUpon>%(Filename)</DependentUpon>\n    </Compile>\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" Version=\"$(TestAvaloniaVersion)\" />\n    <PackageReference Include=\"Avalonia.Desktop\" Version=\"$(TestAvaloniaVersion)\" />\n    <PackageReference Include=\"Avalonia.Themes.Simple\" Version=\"$(TestAvaloniaVersion)\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "tests/UnitTest.Base/UnitTestBase.cs",
    "content": "﻿using ApprovalTests;\nusing NUnit.Framework;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Reflection;\nusing System.Text;\nusing System.Threading;\nusing UnitTest.Base.Apps;\nusing UnitTest.Base.Utils;\n\nnamespace UnitTest.Base\n{\n    public class UnitTestBase\n    {\n        static UnitTestBase()\n        {\n            var fwNm = Util.GetRuntimeName();\n            Approvals.RegisterDefaultNamerCreation(() => new ChangeOutputPathNamer(\"Out\"));\n\n        }\n\n        IDisposable disposable;\n\n        protected string AssetPath;\n\n        public UnitTestBase()\n        {\n            var asm = Assembly.GetExecutingAssembly();\n            AssetPath = Path.GetDirectoryName(asm.Location);\n            disposable = App.Start();\n        }\n\n        [SetUp]\n        public void WaitApplicationStart()\n        {\n            Debug.Print(\"Begin WaitApplicationStart\");\n            while (!App.ApplicationStarted)\n                Thread.Sleep(10);\n            Debug.Print(\"End WaitApplicationStart\");\n        }\n    }\n}\n"
  },
  {
    "path": "tests/UnitTest.Base/Utils/BrokenXamlWriter.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Data.Core;\nusing Avalonia.Metadata;\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text;\nusing System.Xml;\nusing System.Xml.Schema;\n\nnamespace UnitTest.Base.Utils\n{\n    /*\n     * Export AvaloniaObject to xaml-like text\n     *\n     * !!CAUTION!!\n     * \n     * I'm not sure that this class outputed xaml is valid for Avalonia.\n     * I don't implement the logic to export any properties which is converted by any converter.\n     */\n    public class BrokenXamlWriter\n    {\n        #region assembly management\n\n        /// <summary>\n        /// xmlns-previx vs XmlNamespace\n        /// </summary>\n        private readonly HashSet<Assembly> _registeredAssemblies = new();\n        private readonly Dictionary<string, XmlNamespace> _xmlNamespaces = new();\n\n        private readonly List<AvaloniaProperty> _attachedProperties = new();\n\n\n        public void RegisterAssembly(Assembly asm)\n        {\n            if (_registeredAssemblies.Contains(asm))\n                return;\n\n            /*\n             * check XlmnsDefinition\n             */\n            foreach (IGrouping<string, XmlnsDefinitionAttribute> group\n                in asm.GetCustomAttributes<XmlnsDefinitionAttribute>().GroupBy(attr => attr.XmlNamespace))\n            {\n                string xmlurl = group.Key;\n                ClassNamespace[] clrspc = group.Select(def => new ClassNamespace(asm, def.ClrNamespace))\n                                  .ToArray();\n\n                if (_xmlNamespaces.Count == 0)\n                {\n                    _xmlNamespaces[string.Empty]\n                        = new XmlNamespace(string.Empty, xmlurl, clrspc);\n\n                    continue;\n                }\n\n                XmlNamespace alreadyRegistered = _xmlNamespaces.Values.Where(xpc => xpc.Namespace == xmlurl).FirstOrDefault();\n\n                if (alreadyRegistered is null)\n                {\n                    /* register as new*/\n\n                    string prefix = GeneratePrefixFor(asm);\n\n                    _xmlNamespaces[prefix]\n                        = new XmlNamespace(prefix, xmlurl, clrspc);\n                }\n                else\n                {\n                    /* update */\n\n                    alreadyRegistered.ClassSpaces.AddRange(clrspc);\n                }\n            }\n\n            /*\n             * collect AttachedProperty\n             * \n             * It's a dirty hack.\n             * \n             * Because AvaloniaObject dosen't expose ValueStore,\n             * I can't recognize any attached properties.\n             * This hack collect AttachedProperty in Assembly,\n             * And check wheither property is set or not when exporting.\n             */\n            IEnumerable<AvaloniaProperty> attachecProperties = asm.GetTypes()\n                    // only AvaloniaObject\n                    .Where(tp => typeof(AvaloniaObject).IsAssignableFrom(tp))\n                    .SelectMany(aoTp => aoTp.GetFields(BindingFlags.Public | BindingFlags.Static))\n                    // only fields for AttachedProperty\n                    .Where(fld => typeof(AvaloniaProperty).IsAssignableFrom(fld.FieldType))\n                    .Where(fld => fld.FieldType.IsGenericType)\n                    .Where(fld => fld.FieldType.GetGenericTypeDefinition() == typeof(AttachedProperty<>))\n                    .Select(fld => (AvaloniaProperty)fld.GetValue(null));\n\n            _attachedProperties.AddRange(attachecProperties);\n\n\n\n            _registeredAssemblies.Add(asm);\n        }\n\n        private string GeneratePrefixFor(Assembly asm)\n        {\n            // 'Markdown.Avalonia' -> \"ma\"\n            string full = String.Join(\"\", asm.GetName().Name.Split('.')\n                                             .Select(nmchip => nmchip[0].ToString().ToLower()));\n\n            // When full is 'yoghurt', Try 'y', 'yo', 'yog', ...\n            string prefix = Enumerable.Range(1, full.Length)\n                                      .Select(len => full.Substring(0, len))\n                                      .Where(chip => !_xmlNamespaces.ContainsKey(chip))\n                                      .FirstOrDefault();\n\n            // 'yogurt2', 'yogurt3', 'yogurt4', ...\n            for (var idx = 2; prefix is null; ++idx)\n            {\n                var chip = full + idx;\n                if (!_xmlNamespaces.ContainsKey(chip))\n                {\n                    prefix = chip;\n                    break;\n                }\n            }\n\n            return prefix;\n        }\n\n        public string GetPrefixFor(Type type)\n        {\n            Assembly asm = type.Assembly;\n\n            if (!_registeredAssemblies.Contains(asm))\n            {\n                RegisterAssembly(asm);\n            }\n\n            string nmspc = type.Namespace;\n\n            // already registered?\n            KeyValuePair<string, XmlNamespace>[] keyAndValues = _xmlNamespaces\n                .Where(entry => entry.Value.ClassSpaces\n                                     .Any(clsnmspc => clsnmspc.Assembly == asm && clsnmspc.Namespace == nmspc))\n                .ToArray();\n\n            if (keyAndValues.Length > 0)\n            {\n                return keyAndValues[0].Key;\n            }\n\n            // make xmlspace\n            string prefix = GeneratePrefixFor(asm);\n\n            string xmlurl = $\"clr-namespace:{nmspc};assembly={asm.GetName().Name}\";\n\n            var xmlspc = new XmlNamespace(prefix, xmlurl, new ClassNamespace(asm, nmspc));\n\n            _xmlNamespaces[prefix] = xmlspc;\n\n            return xmlspc.Prefix;\n        }\n\n        #endregion\n\n        #region collect properties\n\n        public ObjectNode Collect(AvaloniaObject obj)\n        {\n            var node = new ObjectNode();\n\n            Type objType = obj.GetType();\n\n\n            /*\n             * Check Content property\n             */\n            PropertyInfo contentProp = objType.GetProperties()\n                                              .Where(pinf => pinf.GetCustomAttribute(typeof(ContentAttribute)) != null)\n                                              .FirstOrDefault();\n\n            if (contentProp != null)\n            {\n                var objValue = contentProp.GetValue(obj);\n                if (objValue != null)\n                {\n                    node.Content = new ObjectProperty()\n                    {\n                        Owner = obj,\n                        AttributeName = contentProp.Name,\n                        PropertyInfo = contentProp,\n                        Value = objValue\n                    };\n                }\n            }\n\n            /*\n             * Check Avalonia property\n             */\n            var attrAvaProps = objType.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy)\n                                  .Where(fld => typeof(AvaloniaProperty).IsAssignableFrom(fld.FieldType))\n                                  .Select(fld => ((AvaloniaProperty)fld.GetValue(null)))\n                                  // ignore content property\n                                  .Where(ap => ap.Name != contentProp?.Name);\n\n            node.Attributes = new List<ObjectProperty>();\n            node.Attributes.AddRange(\n                CollectChangedValue(obj, attrAvaProps)\n                    .Select(tpl => new ObjectProperty()\n                    {\n                        Owner = obj,\n                        AvaloniaProperty = tpl.Item1,\n                        AttributeName = tpl.Item1.Name,\n                        PropertyInfo = objType.GetProperty(tpl.Item1.Name),\n                        Value = tpl.Item2\n                    })\n            );\n\n            /*\n             * Check Object property\n             */\n            var plainProps = objType.GetProperties()\n                               // ignore avalonia property\n                               .Where(pinf => !attrAvaProps.Any(nd => nd.Name == pinf.Name))\n                               // ignore content property\n                               .Where(pinf => pinf != contentProp)\n                               // has getter and setter\n                               .Where(pinf => pinf.CanWrite && pinf.CanRead)\n                               .Where(pinf => pinf.GetSetMethod() != null)\n                               .Where(pinf => pinf.GetGetMethod() != null && pinf.GetGetMethod().GetParameters().Length == 0);\n\n            foreach (var pinf in plainProps)\n            {\n                object value = pinf.GetValue(obj);\n\n                if (obj is StyledElement elm)\n                {\n                    switch (pinf.Name)\n                    {\n                        case nameof(StyledElement.Resources):\n                            if (elm.Resources.Count == 0)\n                                continue;\n                            break;\n                    }\n                }\n\n                if (pinf.PropertyType.IsValueType)\n                {\n                    if (value == Activator.CreateInstance(pinf.PropertyType))\n                        continue;\n                }\n                else if (value is null)\n                {\n                    continue;\n                }\n\n                node.Attributes.Add(new ObjectProperty()\n                {\n                    Owner = obj,\n                    AttributeName = pinf.Name,\n                    PropertyInfo = pinf,\n                    Value = pinf.GetValue(obj)\n                });\n            }\n\n\n            var addableProps = objType.GetProperties()\n                   // ignore avalonia property\n                   .Where(pinf => !attrAvaProps.Any(nd => nd.Name == pinf.Name))\n                   // ignore content property\n                   .Where(pinf => pinf != contentProp)\n                   .Where(pinf => pinf.CanRead)\n                   .Where(pinf => pinf.GetSetMethod() == null)\n                   .Where(pinf => pinf.GetGetMethod() != null && pinf.GetGetMethod().GetParameters().Length == 0);\n\n            foreach (var pinf in addableProps)\n            {\n                object value = pinf.GetValue(obj);\n\n                if (obj is StyledElement elm)\n                {\n                    switch (pinf.Name)\n                    {\n                        case nameof(Control.Classes):\n                            if (elm.Classes.Count == 0 || (elm.Classes.Count == 1 && String.IsNullOrEmpty(elm.Classes[0])))\n                                continue;\n                            break;\n                    }\n                }\n\n                if (value is null)\n                    continue;\n\n                if (value is not IList)\n                    continue;\n\n                var list = (IList)value;\n                if (list.Count == 0)\n                    continue;\n\n                node.Attributes.Add(new ObjectProperty()\n                {\n                    Owner = obj,\n                    AttributeName = pinf.Name,\n                    PropertyInfo = pinf,\n                    Value = pinf.GetValue(obj)\n                });\n            }\n\n\n            var attachAvaProps = _attachedProperties.Where(prop => !node.Attributes.Any(attr => attr.AvaloniaProperty == prop));\n            node.Attributes.AddRange(\n                CollectChangedValue(obj, attachAvaProps)\n                    .Select(tpl => new ObjectProperty()\n                    {\n                        Owner = obj,\n                        AvaloniaProperty = tpl.Item1,\n                        AttributePrefix = GetPrefixFor(tpl.Item1.OwnerType),\n                        AttributeName = $\"{tpl.Item1.OwnerType.Name}.{tpl.Item1.Name}\",\n                        PropertyInfo = objType.GetProperty(tpl.Item1.Name),\n                        Value = tpl.Item2\n                    })\n            );\n\n\n            return node;\n        }\n\n        private IEnumerable<(AvaloniaProperty, object)> CollectChangedValue(AvaloniaObject obj, IEnumerable<AvaloniaProperty> aprops)\n        {\n            foreach (var aprop in aprops)\n            {\n                if (aprop.Name == \"Parent\") continue;\n                if (aprop.IsReadOnly) continue;\n\n                if (obj.IsSet(aprop))\n                {\n                    var objValue = obj.GetValue(aprop);\n                    yield return (aprop, objValue);\n                }\n                else if (aprop.Name == \"Text\" && obj.GetValue(aprop) is not null && !String.IsNullOrEmpty(obj.GetValue(aprop).ToString()))\n                {\n                    var objValue = obj.GetValue(aprop);\n                    yield return (aprop, objValue);\n                }\n            }\n        }\n\n        #endregion\n\n        public XmlDocument Document { private set; get; }\n\n        public BrokenXamlWriter()\n        {\n            Document = new XmlDocument();\n            RegisterAssembly(typeof(Control).Assembly);\n        }\n\n        private XmlElement CreateElement(string name)\n        {\n            var spidx = name.IndexOf(':');\n\n            return spidx == -1 ?\n                        CreateElement(null, name) :\n                        CreateElement(name.Substring(0, spidx), name.Substring(spidx + 1));\n        }\n        private XmlElement CreateElement(string prefix, string name)\n        {\n            if (string.IsNullOrEmpty(prefix))\n            {\n                if (name.Contains(\":\")) throw new ArgumentException();\n\n                return Document.CreateElement(name);\n            }\n            else\n            {\n                return Document.CreateElement(prefix, name, _xmlNamespaces[prefix].Namespace);\n            }\n        }\n\n        private XmlAttribute CreateAttribute(string name)\n        {\n            var spidx = name.IndexOf(':');\n\n            return spidx == -1 ?\n                        CreateAttribute(null, name) :\n                        CreateAttribute(name.Substring(0, spidx), name.Substring(spidx + 1));\n        }\n\n        private XmlAttribute CreateAttribute(string prefix, string name)\n        {\n            if (string.IsNullOrEmpty(prefix))\n            {\n                if (name.Contains(\":\")) throw new ArgumentException();\n\n                return Document.CreateAttribute(name);\n            }\n            else\n            {\n                return Document.CreateAttribute(prefix, name, _xmlNamespaces[prefix].Namespace);\n            }\n        }\n\n        public XmlDocument Transform(object value)\n        {\n            var valueType = value.GetType();\n\n            var root = Document.CreateElement(\"\", valueType.Name, _xmlNamespaces[\"\"].Namespace);\n\n            Document.AppendChild(root);\n\n            ApplyTo(root, (AvaloniaObject)value);\n\n            foreach (var xmlSpc in _xmlNamespaces.Values)\n            {\n                if (string.IsNullOrEmpty(xmlSpc.Prefix)) continue;\n\n                Document.DocumentElement.SetAttribute(\"xmlns:\" + xmlSpc.Prefix, xmlSpc.Namespace);\n            }\n            Document.DocumentElement.SetAttribute(\"xmlns:x\", \"http://schemas.microsoft.com/winfx/2006/xaml\");\n\n            return Document;\n        }\n\n        private void ApplyTo(XmlNode valueNode, AvaloniaObject value)\n        {\n            ObjectNode objNode = Collect(value);\n\n            if (objNode.Content != null)\n            {\n                Append(valueNode, objNode.Content, true);\n            }\n\n            foreach (var a in objNode.Attributes)\n            {\n                Append(valueNode, a, false);\n            }\n        }\n\n        private void Append(XmlNode valueNode, ObjectProperty prop, bool isContent)\n        {\n            if (prop.Value is String\n                    || prop.Value is bool\n                    || prop.Value is short || prop.Value is int || prop.Value is long\n                    || prop.Value is float || prop.Value is double)\n            {\n\n                XmlAttribute attr = CreateAttribute(prop.AttributePrefix, prop.AttributeName);\n                attr.Value = prop.Value.ToString();\n\n                ((XmlElement)valueNode).SetAttributeNode(attr);\n            }\n\n            else if (prop.Value is null)\n            {\n                // FIXIT \n\n                XmlAttribute attr = CreateAttribute(prop.AttributePrefix, prop.AttributeName);\n                attr.Value = \"{x:Null}\";\n\n                ((XmlElement)valueNode).SetAttributeNode(attr);\n            }\n\n            else if (prop.Value is Classes clsLst)\n            {\n                XmlAttribute attr = CreateAttribute(prop.AttributeName);\n                attr.Value = String.Join(\",\", clsLst);\n\n                ((XmlElement)valueNode).SetAttributeNode(attr);\n            }\n\n            else if (prop.Value is IEnumerable list)\n            {\n                XmlNode propHolder;\n                if (isContent)\n                {\n                    propHolder = valueNode;\n                }\n                else\n                {\n                    propHolder = CreateElement(valueNode.Name + \".\" + prop.AttributeName);\n                    valueNode.AppendChild(propHolder);\n                }\n\n                foreach (var elm in list)\n                {\n                    Type elmType = elm.GetType();\n                    XmlElement element = CreateElement(GetPrefixFor(elmType), elmType.Name);\n\n                    propHolder.AppendChild(element);\n\n                    if (elm is AvaloniaObject elmAo)\n                    {\n                        ApplyTo(element, elmAo);\n                    }\n                }\n            }\n\n            else if (prop.Value is AvaloniaObject aobj)\n            {\n                Type aoType = aobj.GetType();\n\n                XmlElement propHolder = CreateElement(valueNode.Name + \".\" + prop.AttributeName);\n                XmlElement element = CreateElement(GetPrefixFor(aoType), aoType.Name);\n                propHolder.AppendChild(element);\n\n                valueNode.AppendChild(propHolder);\n\n                ApplyTo(element, aobj);\n            }\n        }\n    }\n\n    class XmlNamespace\n    {\n        public string Prefix { get; }\n        public string Namespace { get; }\n        public List<ClassNamespace> ClassSpaces { get; }\n\n        public XmlNamespace(string prefix, string nmspc, params ClassNamespace[] clsspc)\n            : this(prefix, nmspc, (IEnumerable<ClassNamespace>)clsspc)\n        {\n        }\n\n        public XmlNamespace(string prefix, string nmspc, IEnumerable<ClassNamespace> clsspc)\n        {\n            this.Prefix = prefix;\n            this.Namespace = nmspc;\n            this.ClassSpaces = new List<ClassNamespace>(clsspc);\n        }\n    }\n    class ClassNamespace\n    {\n        public Assembly Assembly { get; }\n        public string Namespace { get; }\n\n        public ClassNamespace(Assembly asm, string nmspc)\n        {\n            this.Assembly = asm;\n            this.Namespace = nmspc;\n        }\n    }\n\n    public class ObjectNode\n    {\n        public object Owner { get; set; }\n        public ObjectProperty Content { get; set; }\n        public List<ObjectProperty> Attributes { get; set; }\n    }\n\n    public class ObjectProperty\n    {\n        public object Owner { get; set; }\n        public string AttributePrefix { get; set; }\n        public string AttributeName { get; set; }\n\n        public AvaloniaProperty AvaloniaProperty { get; set; }\n        public PropertyInfo PropertyInfo { get; set; }\n        public object Value { get; set; }\n    }\n}\n"
  },
  {
    "path": "tests/UnitTest.Base/Utils/RunOnUIAttribute.cs",
    "content": "﻿using Avalonia.Threading;\nusing NUnit.Framework.Interfaces;\nusing NUnit.Framework.Internal;\nusing NUnit.Framework.Internal.Commands;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace UnitTest.Base.Utils\n{\n    [System.AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = false)]\n    public sealed class RunOnUIAttribute : Attribute, IWrapTestMethod\n    {\n        public TestCommand Wrap(TestCommand command) => new RunOnUICommand(command);\n\n        class RunOnUICommand : DelegatingTestCommand\n        {\n            public RunOnUICommand(TestCommand innerCommand)\n                : base(innerCommand)\n            {\n            }\n\n            public override TestResult Execute(TestExecutionContext context)\n            {\n                var dispatcher = Dispatcher.UIThread;\n\n                if (dispatcher.CheckAccess())\n                {\n                    var result = RunTest(context);\n\n                    if (result is Exception ex)\n                        throw ex;\n\n                    return (TestResult)result;\n                }\n                else\n                {\n                    var resultTask = Dispatcher.UIThread.InvokeAsync<object>(() => RunTest(context));\n\n                    if (resultTask.Status != DispatcherOperationStatus.Aborted\n                     && resultTask.Status != DispatcherOperationStatus.Completed)\n                        resultTask.Wait();\n\n                    if (resultTask.Result is Exception ex)\n                        throw ex;\n\n                    return (TestResult)resultTask.Result;\n                }\n            }\n\n            private object RunTest(TestExecutionContext context)\n            {\n                try\n                {\n                    return innerCommand.Execute(context);\n                }\n                catch (Exception e)\n                {\n                    return e;\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/UnitTest.Base/Utils/TextUtil.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Text.RegularExpressions;\n\nnamespace UnitTest.Base.Utils\n{\n    public static class TextUtil\n    {\n        public static string HereDoc(string value)\n        {\n            // like PHP's flexible_heredoc_nowdoc_syntaxes,\n            // The indentation of the closing tag dictates \n            // the amount of whitespace to strip from each line \n            var lines = Regex.Split(value, \"\\r\\n|\\r|\\n\", RegexOptions.Multiline);\n\n            // count last line indent\n            int lastIdtCnt = TextUtil.CountIndent(lines.Last());\n            // count full indent\n            int someIdtCnt = lines\n                .Where(line => !String.IsNullOrWhiteSpace(line))\n                .Select(line => TextUtil.CountIndent(line))\n                .Min();\n\n            var indentCount = Math.Max(lastIdtCnt, someIdtCnt);\n\n            return String.Join(\n                \"\\n\",\n                lines\n                    // skip first blank line\n                    .Skip(String.IsNullOrWhiteSpace(lines[0]) ? 1 : 0)\n                    // strip indent\n                    .Select(line =>\n                    {\n                        var realIdx = 0;\n                        var viewIdx = 0;\n\n                        while (viewIdx < indentCount && realIdx < line.Length)\n                        {\n                            var c = line[realIdx];\n                            if (c == ' ')\n                            {\n                                realIdx += 1;\n                                viewIdx += 1;\n                            }\n                            else if (c == '\\t')\n                            {\n                                realIdx += 1;\n                                viewIdx = ((viewIdx >> 2) + 1) << 2;\n                            }\n                            else break;\n                        }\n\n                        return line.Substring(realIdx);\n                    })\n                );\n        }\n\n        private static int CountIndent(string line)\n        {\n            var count = 0;\n            foreach (var c in line)\n            {\n                if (c == ' ') count += 1;\n                else if (c == '\\t')\n                {\n                    // In default in vs, tab is treated as four-spaces.\n                    count = ((count >> 2) + 1) << 2;\n                }\n                else break;\n            }\n            return count;\n        }\n    }\n}\n"
  },
  {
    "path": "tests/UnitTest.Base/Utils/Util.cs",
    "content": "﻿using Avalonia.Controls;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.InteropServices;\nusing System.Xml;\n\nnamespace UnitTest.Base.Utils\n{\n    public static class Util\n    {\n        public static string[] GetTextNames()\n        {\n            var caller = Assembly.GetCallingAssembly();\n            var resourceDir = Path.Combine(Path.GetDirectoryName(caller.Location), \"Texts\");\n\n            return Directory.GetFiles(resourceDir)\n                            .Select(path => Path.GetFileName(path))\n                            .ToArray();\n        }\n\n        public static string LoadText(string name)\n        {\n            var caller = Assembly.GetCallingAssembly();\n            var resourceFile = Path.Combine(Path.GetDirectoryName(caller.Location), \"Texts\", name);\n\n            using var reader = File.OpenText(resourceFile);\n\n            return reader.ReadToEnd();\n        }\n\n        public static string AsXaml(object instance)\n        {\n            using var writer = new StringWriter();\n            var settings = new XmlWriterSettings { Indent = true };\n            using (var xmlWriter = XmlWriter.Create(writer, settings))\n            {\n                var docGen = new BrokenXamlWriter();\n                var docObj = docGen.Transform(instance);\n                docObj.Save(xmlWriter);\n\n                //XamlServices.Save(xmlWriter, instance);\n                //XamlWriter.Save(instance, xmlWriter);\n            }\n\n            writer.WriteLine();\n            return writer.ToString();\n\n            //using (var writer = new StringWriter())\n            //{\n            //    var settings = new XmlWriterSettings { Indent = true };\n            //    using (var xmlWriter = XmlWriter.Create(writer, settings))\n            //    {\n            //        XamlServices.Save(xmlWriter, instance);\n            //    }\n            //\n            //    writer.WriteLine();\n            //    return writer.ToString();\n            //}\n        }\n\n        public static string GetRuntimeName()\n        {\n            var description = RuntimeInformation.FrameworkDescription.ToLower();\n            // \".NET Framework\"\n            // \".NET Core\"(for .NET Core 1.0 - 3.1)\n            // \".NET Native\"\n            // \".NET\"(for .NET 5.0 and later versions)\n\n            if (description.Contains(\"framework\"))\n            {\n                return \"framework\";\n            }\n\n            if (description.Contains(\"core\"))\n            {\n                return \"core\";\n            }\n\n            if (description.Contains(\"native\"))\n            {\n                return \"native\";\n            }\n\n            return \"dotnet\";\n        }\n\n        public static IEnumerable<T> FindControlsByClassName<T>(Control ctrl, string classNm) where T : Control\n        {\n            if (ctrl.Classes.Contains(classNm))\n                yield return (T)ctrl;\n\n            if (ctrl is Panel panel)\n            {\n                foreach (var rs in panel.Children.SelectMany(p => FindControlsByClassName<T>(p, classNm)))\n                    yield return rs;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/UnitTest.CTxt/.gitignore",
    "content": "Out/*.received.png\nOut/*.bak\nOut13/*.received.png\nOut13/*.bak\n"
  },
  {
    "path": "tests/UnitTest.CTxt/Assets/Fonts/license.html",
    "content": "<html>\n\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html\" charset=\"utf-8\">\n</head>\n<body>\n\n<pre>\n-------------------------------------------------------------------------------\n梅フォントのライセンス (日本語 UTF-8)  (UmeFont license (In Japanese UTF-8))\n-------------------------------------------------------------------------------\n\n本ライセンスは以下の梅フォントに共通のライセンスです。\n\n    * 梅ゴシック\n    * 梅ゴシックC4\n    * 梅ゴシックS4\n    * 梅ゴシックO5\n    * 梅ゴシックC5\n    * 梅ゴシックS5\n    * 梅Pゴシック\n    * 梅PゴシックC4\n    * 梅PゴシックS4\n    * 梅PゴシックO5\n    * 梅PゴシックC5\n    * 梅PゴシックS5\n    * 梅UIゴシック\n    * 梅UIゴシックO5\n    * 梅Hyゴシック\n    * 梅HyゴシックO5    \n    * 梅明朝\n    * 梅明朝S3\n    * 梅P明朝\n    * 梅P明朝S3\n\n\nこれらのフォントはフリー（自由な）ソフトウエアです。\nあらゆる改変の有無に関わらず、また商業的な利用であっても、自由にご利用、複製、\n再配布することができますが、全て無保証とさせていただきます。 \n\n\n\n-------------------------------------------------------------------------------\nUmeFont license (In English)\n-------------------------------------------------------------------------------\n\nThis is common license of the UmeFont family. UmeFont family provides the\nfollowing fonts:\n\n    * Ume Gothic\n    * Ume Gothic C4\n    * Ume Gothic S4\n    * Ume Gothic O5\n    * Ume Gothic C5\n    * Ume Gothic S5\n    * Ume P Gothic\n    * Ume P Gothic C4\n    * Ume P Gothic S4\n    * Ume P Gothic O5\n    * Ume P Gothic C5\n    * Ume P Gothic S5\n    * Ume UI Gothic\n    * Ume UI Gothic O5\n    * Ume Hy Gothic\n    * Ume Hy Gothic O5    \n    * Ume Mincho\n    * Ume Mincho S3\n    * Ume P Mincho\n    * Ume P Mincho S3\n\n\nThese fonts are free software.\nUnlimited permission is granted to use, copy, and distribute it,\nwith or without modification, either commercially and noncommercially.\nTHESE FONTS ARE PROVIDED \"AS IS\" WITHOUT WARRANTY.\n\n</pre>\n</body>\n</html>\n"
  },
  {
    "path": "tests/UnitTest.CTxt/Texts/MainWindow.md",
    "content": "﻿# MdXaml #\n\nMdXaml is a modify version of Markdown.Xaml.\nMarkdown XAML is a port of the popular *MarkdownSharp* Markdown processor, but \nwith one very significant difference: Instead of rendering to a string \ncontaining HTML, it renders to a FlowDocument suitable for embedding into a \nWPF window or usercontrol.\n\n\n## The Example Of ... ##\n\n### Text decolation [included original enhance] ###\n*italic*, **bold**, ***bold-italic***, ~~strikethrough~~, __underline__ and %{color:red}color%.  \n%{color:blue}***~~__Mixing Text__~~***%\n\n### Link ###\nLinks [Go to Google!](https://www.google.com)  \nLinks with title [Go to Google!](https://www.google.com \"google.\")  \nLinks with image [![faviicon](https://www.google.com/favicon.ico)](https://www.google.com \"google favicon\")\n\n### Image ###\n#### Remote images ####\n![image1](http://placehold.it/300x25)  \n![imageleft](http://placehold.it/150x25/0000FF \"blue\")![imageright](http://placehold.it/150x25/00FFFF \"cyan\")\n#### Local and resource images ####\n![localimage](LocalPath.png)\n![ResourceImage](Assets/ResourceImage.png)\n\n### List ###\n#### ul\n* one\n* two\n\n#### ol\n1. one\n2. two\n#### alphabet-ol [original enhance]\na. one\nb. two\n\n#### roman-ol [original enhance]\ni, one\nii, two\n\n### Table [included original enhance] ###\n|a|b|c|d|\n|:-:|:-|-:|\n|a1234567890|b1234567890|c1234567890|d1234567890|\n|a|/2.b|c|d|\n|A|\\2.C|\n|1|2|3|4|\n|あ|い|う|え|\n\n### Code ###\nMarkdown.Xaml support ```inline code ``` and block code.\n```c\n#include <stdio.h>\nint main()\n{\n   // printf() displays the string inside quotation\n   printf(\"Hello, World!\");\n   return 0;\n}\n```\n\n### Note ###\n\n< notetext >\n\n<p>. notetext\n\n\n### Separator ###\nsingle line\n ---\ntwo lines\n ===\nbold line\n ***\nbold with single\n___\n\n### Blockquote ###\n> ## Features ##\n> MarkDown.Xaml has a number of convenient features\n> \n> * The engine itself is a single file, for easy inclusion in your own projects\n> * Code for the engine is structured in the same manner as the original MarkdownSharp  \n> * Includes a `TextToFlowDocumentConverter` to make it easy to bind Markdown text\n\n### Text Alignment [original enhance] ###\nMdXaml parse a head of paragraph. If 'p[<=>].' is found, apply text alignment to it.\n> p<. left alignment text\n> \n> p>. right alignment text\n> \n> p=. center alignment\n\n\n## What is this Demo? ##\n\nThis demo application shows MdXaml in use - as you make changes to the \nleft pane, the rendered MarkDown will appear in the right pane.\n\n### Source ###\n\nReview the source for this demo to see how MdXaml works in practice, how to use the MarkdownScrollViewer,\nand how to style the output to appear the way you desire.\n\n"
  },
  {
    "path": "tests/UnitTest.CTxt/UnitTest.CTxt.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <Import Project=\"..\\UnitTest.props\" />\n\n  <PropertyGroup>\n    <TargetFrameworks>$(TestTargetFrameworks)</TargetFrameworks>\n    <IsPackable>false</IsPackable>\n    <LangVersion>9</LangVersion>\n    <Nullable>disable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <AvaloniaResource Include=\"Assets\\Fonts\\license.html\" />\n    <AvaloniaResource Include=\"Assets\\Fonts\\ume-ugo4.ttf\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Compile Update=\"Xamls\\Test5.axaml.cs\">\n      <DependentUpon>Test5.axaml</DependentUpon>\n    </Compile>\n    <Compile Update=\"Xamls\\Test7 - コピー.axaml.cs\">\n      <DependentUpon>%(Filename)</DependentUpon>\n    </Compile>\n    <Compile Update=\"Xamls\\Test7.axaml.cs\">\n      <DependentUpon>Test7.axaml</DependentUpon>\n    </Compile>\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" Version=\"$(TestAvaloniaVersion)\" />\n    <PackageReference Include=\"Avalonia.Desktop\" Version=\"$(TestAvaloniaVersion)\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\ColorTextBlock.Avalonia\\ColorTextBlock.Avalonia.csproj\" />\n    <ProjectReference Include=\"..\\..\\Markdown.Avalonia.Tight\\Markdown.Avalonia.Tight.csproj\" />\n    <ProjectReference Include=\"..\\UnitTest.Base\\UnitTest.Base.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Update=\"Texts\\*\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Update=\"..\\UnitTest.Md\\Texts\\*\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n      <Link>Texts\\%(Filename)%(Extension)</Link>\n    </None>\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "tests/UnitTest.CTxt/UnitTestCTxt.cs",
    "content": "using ApprovalTests;\nusing ApprovalTests.Core;\nusing ApprovalTests.Reporters;\nusing Avalonia;\nusing Avalonia.Collections;\nusing Avalonia.Controls;\nusing Avalonia.Controls.Documents;\nusing Avalonia.Markup.Xaml.Styling;\nusing Avalonia.Media;\nusing Avalonia.Media.Imaging;\nusing Avalonia.Rendering;\nusing Avalonia.VisualTree;\nusing ColorTextBlock.Avalonia;\nusing Markdown.Avalonia;\nusing NUnit.Framework;\nusing System;\nusing System.Linq;\nusing System.Reflection;\nusing UnitTest.Base;\nusing UnitTest.Base.Apps;\nusing UnitTest.Base.Utils;\nusing UnitTest.CTxt.Utils;\nusing UnitTest.CTxt.Xamls;\n\nnamespace UnitTest.CTxt\n{\n    //[UseReporter(typeof(DiffReporter))]\n    public class UnitTestCTxt : UnitTestBase\n    {\n        public UnitTestCTxt()\n        {\n            Approvals.RegisterDefaultApprover((w, n, c) => new ImageFileApprover(w, n, c));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void GivenTest1_generatesExpectedResult()\n        {\n            var tst1 = new Test1();\n            var ctxt = (CTextBlock)tst1.Content;\n\n            var info = new MetryHolder(ctxt, 360, 1000);\n\n            Approvals.Verify(\n                new ApprovalImageWriter(info.Image),\n                Approvals.GetDefaultNamer(),\n                new DiffToolReporter(DiffEngine.DiffTool.WinMerge));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void GivenTest2_generatesExpectedResult()\n        {\n            var tst2 = new Test2();\n            var ctxt = (CTextBlock)tst2.Content;\n\n            var info = new MetryHolder(ctxt, 1000, 1000);\n\n            Approvals.Verify(\n                new ApprovalImageWriter(info.Image),\n                Approvals.GetDefaultNamer(),\n                new DiffToolReporter(DiffEngine.DiffTool.WinMerge));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void GivenTest3_generatesExpectedResult_sub0()\n        {\n            var tst3 = new Test3();\n            var spnl = (StackPanel)tst3.Content;\n\n            var ctxt = (CTextBlock)spnl.Children[0];\n            var info = new MetryHolder(ctxt, 1000, 1000);\n\n            Approvals.Verify(\n                new ApprovalImageWriter(info.Image),\n                Approvals.GetDefaultNamer(),\n                new DiffToolReporter(DiffEngine.DiffTool.WinMerge));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void GivenTest3_generatesExpectedResult_sub1()\n        {\n            var tst3 = new Test3();\n            var spnl = (StackPanel)tst3.Content;\n\n            var ctxt = (CTextBlock)spnl.Children[1];\n            var info = new MetryHolder(ctxt, 1000, 1000);\n\n            Approvals.Verify(\n                new ApprovalImageWriter(info.Image),\n                Approvals.GetDefaultNamer(),\n                new DiffToolReporter(DiffEngine.DiffTool.WinMerge));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void GivenTest3_generatesExpectedResult_sub2()\n        {\n            var tst3 = new Test3();\n            var spnl = (StackPanel)tst3.Content;\n\n            var ctxt = (CTextBlock)spnl.Children[2];\n            var info = new MetryHolder(ctxt, 1000, 1000);\n\n            Approvals.Verify(\n                new ApprovalImageWriter(info.Image),\n                Approvals.GetDefaultNamer(),\n                new DiffToolReporter(DiffEngine.DiffTool.WinMerge));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void GivenTest3_generatesExpectedResult_sub3()\n        {\n            var tst3 = new Test3();\n            var spnl = (StackPanel)tst3.Content;\n\n            var ctxt = (CTextBlock)spnl.Children[3];\n            var info = new MetryHolder(ctxt, 1000, 1000);\n\n            Approvals.Verify(\n                new ApprovalImageWriter(info.Image),\n                Approvals.GetDefaultNamer(),\n                new DiffToolReporter(DiffEngine.DiffTool.WinMerge));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void GivenTest_drawableSomeMds()\n        {\n            foreach (var mdname in Util.GetTextNames().Where(nm => nm.EndsWith(\".md\")))\n            {\n                var text = Util.LoadText(mdname);\n                var markdown = new Markdown.Avalonia.Markdown();\n                var control = markdown.Transform(text);\n\n                var theme = new Avalonia.Themes.Simple.SimpleTheme();\n                control.Styles.Add(theme);\n\n                control.Styles.Add(MarkdownStyle.SimpleTheme);\n                control.Resources.Add(\"FontSizeNormal\", 16d);\n\n                var umefont = new FontFamily(new Uri(\"avares://UnitTest.CTxt/Assets/Fonts/ume-ugo4.ttf\"), \"Ume UI Gothic\");\n                TextElement.SetFontFamily(control, umefont);\n\n                var info = new MetryHolder(control, 500, 10000);\n            }\n        }\n\n        /*\n         * On Github Action, this test don't pass.\n         * But on my environment, this test pass.\n         * Because of environment dependent, I erase this test case.\n         */\n        //[Test]\n        [RunOnUI]\n        public void GivenTestXXX_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"MainWindow.md\");\n\n            var markdown = new Markdown.Avalonia.Markdown();\n            var control = markdown.Transform(text);\n\n            var theme = new Avalonia.Themes.Simple.SimpleTheme();\n            control.Styles.Add(theme);\n\n            control.Styles.Add(MarkdownStyle.SimpleTheme);\n            control.Resources.Add(\"FontSizeNormal\", 16d);\n\n            var umefont = new FontFamily(new Uri(\"avares://UnitTest.CTxt/Assets/Fonts/ume-ugo4.ttf\"), \"Ume UI Gothic\");\n            TextElement.SetFontFamily(control, umefont);\n\n            var info = new MetryHolder(control, 500, 10000);\n\n            Approvals.Verify(\n                new ApprovalImageWriter(info.Image),\n                Approvals.GetDefaultNamer(),\n                new DiffToolReporter(DiffEngine.DiffTool.WinMerge));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void GivenTest4_generatesExpectedResult()\n        {\n            var tst4 = new Test4();\n            var ctxt = (CTextBlock)tst4.Content;\n\n            var info = new MetryHolder(ctxt, 1000, 1000);\n\n            Approvals.Verify(\n                new ApprovalImageWriter(info.Image),\n                Approvals.GetDefaultNamer(),\n                new DiffToolReporter(DiffEngine.DiffTool.WinMerge));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void GivenTest5_generatesExpectedResult()\n        {\n            var tst5 = new Test5();\n            var ctxt = (CTextBlock)tst5.Content;\n\n            var info = new MetryHolder(ctxt, 1000, 1000);\n\n            Approvals.Verify(\n                new ApprovalImageWriter(info.Image),\n                Approvals.GetDefaultNamer(),\n                new DiffToolReporter(DiffEngine.DiffTool.WinMerge));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void GivenTest6_generatesExpectedResult()\n        {\n            var tst6 = new Test6();\n            var ctxt = (CTextBlock)tst6.Content;\n\n            var info = new MetryHolder(ctxt, 1000, 1000);\n\n            Approvals.Verify(\n                new ApprovalImageWriter(info.Image),\n                Approvals.GetDefaultNamer(),\n                new DiffToolReporter(DiffEngine.DiffTool.WinMerge));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void GivenTest7_generatesExpectedResult()\n        {\n            var tst6 = new Test7();\n            var ctxt = (StackPanel)tst6.Content;\n\n            var info = new MetryHolder(ctxt, 480, 1000);\n\n            Approvals.Verify(\n                new ApprovalImageWriter(info.Image),\n                Approvals.GetDefaultNamer(),\n                new DiffToolReporter(DiffEngine.DiffTool.WinMerge));\n        }\n\n        [Test]\n        [TestCase(500)]\n        [TestCase(510)]\n        [TestCase(520)]\n        [TestCase(530)]\n        [TestCase(540)]\n        [TestCase(550)]\n        [TestCase(560)]\n        [TestCase(570)]\n        [TestCase(580)]\n        [TestCase(590)]\n        [TestCase(600)]\n        [TestCase(610)]\n        [TestCase(620)]\n        [TestCase(630)]\n        [TestCase(640)]\n        [TestCase(650)]\n        [TestCase(660)]\n        [TestCase(670)]\n        [TestCase(680)]\n        [TestCase(690)]\n        [TestCase(700)]\n        [TestCase(710)]\n        [TestCase(720)]\n        [TestCase(730)]\n        [TestCase(740)]\n        [TestCase(750)]\n        [TestCase(760)]\n        [TestCase(770)]\n        [TestCase(780)]\n        [TestCase(790)]\n        [TestCase(800)]\n        [TestCase(810)]\n        [TestCase(820)]\n        [TestCase(830)]\n        [TestCase(840)]\n        [TestCase(850)]\n        [TestCase(860)]\n        [TestCase(870)]\n        [TestCase(880)]\n        [TestCase(890)]\n        [TestCase(900)]\n        [TestCase(910)]\n        [TestCase(920)]\n        [TestCase(930)]\n        [TestCase(940)]\n        [TestCase(950)]\n        [TestCase(960)]\n        [TestCase(970)]\n        [TestCase(980)]\n        [TestCase(990)]\n        [TestCase(1000)]\n        [RunOnUI]\n        public void GivenTest99_generatesExpectedResult(int width)\n        {\n            var tst99 = new Test99();\n            var ctxt = (CTextBlock)tst99.Content;\n\n            var info = new MetryHolder(ctxt, width, 1000);\n\n            Approvals.Verify(\n                new ApprovalImageWriter(\"99\", info.Image, width.ToString()),\n                Approvals.GetDefaultNamer(),\n                new DiffToolReporter(DiffEngine.DiffTool.WinMerge));\n        }\n    }\n\n    class MetryHolder : AvaloniaObject\n    {\n        private static readonly Vector Dpi = new(250, 250);\n\n        public Bitmap Image { get; set; }\n\n        //public MetryHolder(CTextBlock ctxt, int width = 400, int height = 1000)\n        //{\n        //    var reqSz = new Size(width, height);\n        //\n        //    ctxt.Measure(reqSz);\n        //    ctxt.Arrange(new Rect(0, 0, width, ctxt.DesiredSize.Height == 0 ? height : ctxt.DesiredSize.Height));\n        //    ctxt.Measure(reqSz);\n        //\n        //    var newReqSz = new Size(\n        //        ctxt.DesiredSize.Width == 0 ? reqSz.Width : ctxt.DesiredSize.Width,\n        //        ctxt.DesiredSize.Height == 0 ? reqSz.Height : ctxt.DesiredSize.Height);\n        //    ctxt.Arrange(new Rect(0, 0, newReqSz.Width, newReqSz.Height));\n        //\n        //    var bitmap = new RenderTargetBitmap(PixelSize.FromSizeWithDpi(newReqSz, Dpi), Dpi);\n        //\n        //    using (var icontext = bitmap.CreateDrawingContext(null))\n        //    using (var context = new DrawingContext(icontext))\n        //    {\n        //        ctxt.Render(context);\n        //    }\n        //\n        //    Image = bitmap;\n        //}\n\n        public MetryHolder(Control ctxt, int width = 400, int height = 1000)\n        {\n            var reqSz = new Size(width, height);\n            ctxt.Measure(reqSz);\n            ctxt.Arrange(new Rect(0, 0, width, ctxt.DesiredSize.Height == 0 ? height : ctxt.DesiredSize.Height));\n            ctxt.Measure(reqSz);\n\n            var newReqSz = new Size(\n                ctxt.DesiredSize.Width == 0 ? reqSz.Width : ctxt.DesiredSize.Width,\n                ctxt.DesiredSize.Height == 0 ? reqSz.Height : ctxt.DesiredSize.Height);\n            ctxt.Arrange(new Rect(0, 0, newReqSz.Width, newReqSz.Height));\n\n            var bitmap = new RenderTargetBitmap(PixelSize.FromSizeWithDpi(newReqSz, Dpi), Dpi);\n\n            using (var context = bitmap.CreateDrawingContext())\n            {\n                RenderHelper(ctxt, context);\n            }\n            Image = bitmap;\n        }\n\n        private void RenderHelper(Visual vis, DrawingContext ctx)\n        {\n            var sz = new Rect(vis.Bounds.Size);\n            var bnd = vis.Bounds;\n\n            using (ctx.PushTransform(Matrix.CreateTranslation(vis.Bounds.Position)))\n            //using (ctx.PushOpacity(vis.Opacity))\n            using (vis.OpacityMask != null ? ctx.PushOpacityMask(vis.OpacityMask, sz) : default)\n            {\n                vis.Render(ctx);\n\n                var childrenProp = typeof(Visual).GetProperties(BindingFlags.NonPublic | BindingFlags.Instance)\n                                            .Where(fld => fld.Name == \"VisualChildren\")\n                                            .First();\n\n                var children = (IAvaloniaList<Visual>)childrenProp.GetValue(vis);\n                foreach (var child in children)\n                    RenderHelper(child, ctx);\n            }\n        }\n    }\n}"
  },
  {
    "path": "tests/UnitTest.CTxt/Utils/ApprovalImageWriter.cs",
    "content": "﻿using ApprovalTests.Core;\nusing Avalonia.Media.Imaging;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Text;\n\nnamespace UnitTest.CTxt.Utils\n{\n    public class ApprovalImageWriter : IApprovalWriter\n    {\n        public string? Dir { get; set; }\n        public Bitmap Data { get; set; }\n        public string? Suffix { get; set; }\n\n        public ApprovalImageWriter(Bitmap image)\n        {\n            Data = image;\n        }\n        public ApprovalImageWriter(string dir, Bitmap image, string suffix)\n        {\n            Dir = dir;\n            Data = image;\n            Suffix = suffix;\n        }\n\n        public virtual string GetApprovalFilename(string basename)\n        {\n            var name = Suffix is null ? $\"{basename}.approved.png\" : $\"{basename}_{Suffix}.approved.png\";\n            if (Dir is null)\n                return name;\n\n            var basepath = Path.GetDirectoryName(basename);\n            return basepath is null ?\n                        Path.Combine(Dir, Path.GetFileName(name)) :\n                        Path.Combine(basepath, Dir, Path.GetFileName(name));\n        }\n\n        public virtual string GetReceivedFilename(string basename)\n        {\n            var trueBaseName = Path.GetFileName(basename);\n            var name = Suffix is null ? $\"{trueBaseName}.received.png\" : $\"{trueBaseName}_{Suffix}.received.png\";\n            if (Dir is null)\n                return name;\n\n            var basepath = Path.GetDirectoryName(basename);\n            return basepath is null ?\n                        Path.Combine(Dir, name) :\n                        Path.Combine(basepath, Dir, name);\n        }\n\n\n        public string WriteReceivedFile(string received)\n        {\n            Directory.CreateDirectory(Path.GetDirectoryName(received));\n            Data.Save(received);\n            return received;\n        }\n    }\n}\n"
  },
  {
    "path": "tests/UnitTest.CTxt/Utils/ImageFileApprover.cs",
    "content": "﻿using ApprovalTests.Approvers;\nusing ApprovalTests.Core;\nusing ApprovalTests.Core.Exceptions;\nusing Avalonia.Controls;\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Drawing.Imaging;\nusing System.IO;\nusing System.Runtime.InteropServices;\nusing System.Text;\n\nnamespace UnitTest.CTxt.Utils\n{\n    public class ImageFileApprover : FileApprover\n    {\n        public ImageFileApprover(IApprovalWriter writer, IApprovalNamer namer, bool normalizeLineEndingsForTextFiles = false)\n            : base(writer, namer, normalizeLineEndingsForTextFiles)\n        {\n        }\n\n        public override ApprovalException Approve(string approvedPath, string receivedPath)\n        {\n            if (Path.GetExtension(approvedPath) != \".png\")\n                return base.Approve(approvedPath, receivedPath);\n\n            if (!File.Exists(approvedPath))\n            {\n                return new ApprovalMissingException(receivedPath, approvedPath);\n            }\n\n            // FIXME: I have no idea to compare bitmap with Avalonia.Media.Imaging\n            //        This logic use System.Drawing, So only run on Windows.\n\n            using var approvedImg = new Bitmap(approvedPath);\n            using var receivedImg = new Bitmap(receivedPath);\n\n            var approvedByte = BitmapToByte(approvedImg);\n            var receivedByte = BitmapToByte(receivedImg);\n\n            return !Compare(receivedByte, approvedByte) ?\n                    new ApprovalMismatchException(receivedPath, approvedPath) :\n                    null;\n        }\n\n\n        private byte[] BitmapToByte(Bitmap bmp)\n        {\n            var rect = new Rectangle(0, 0, bmp.Width, bmp.Height);\n            var bDt = bmp.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);\n\n            var bary = new byte[bmp.Width * bmp.Height * 3];\n\n            var ptr = bDt.Scan0;\n            var lineLen = bmp.Width * 3;\n            for (int i = 0; i < bmp.Height; ++i)\n            {\n                Marshal.Copy(ptr, bary, i * lineLen, lineLen);\n                ptr += bDt.Stride;\n            }\n\n            bmp.UnlockBits(bDt);\n\n            return bary;\n        }\n\n        private new static bool Compare(ICollection<byte> bytes1, ICollection<byte> bytes2)\n        {\n            if (bytes1.Count != bytes2.Count)\n            {\n                return false;\n            }\n\n            var e1 = bytes1.GetEnumerator();\n            var e2 = bytes2.GetEnumerator();\n\n            while (e1.MoveNext() && e2.MoveNext())\n            {\n                if (e1.Current != e2.Current)\n                {\n                    return false;\n                }\n            }\n\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "tests/UnitTest.CTxt/Xamls/Test1.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n\n             xmlns:ctxt=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\"\n             \n             FontFamily=\"avares://UnitTest.CTxt/Assets/Fonts/ume-ugo4.ttf#Ume UI Gothic\"\n             FontSize=\"24\"\n             \n             x:Class=\"UnitTest.CTxt.Xamls.Test1\">\n  <ctxt:CTextBlock>\n    <ctxt:CRun>Jack0</ctxt:CRun>\n    <ctxt:CRun>Jack1</ctxt:CRun>\n    <ctxt:CRun>Jack2</ctxt:CRun>\n    <ctxt:CRun>Jack3</ctxt:CRun>\n    <ctxt:CRun>Jack4</ctxt:CRun>\n    <ctxt:CRun>Jack5</ctxt:CRun>\n    <ctxt:CRun>Jack6</ctxt:CRun>\n    <ctxt:CRun>Jack7</ctxt:CRun>\n    <ctxt:CRun>Jack8</ctxt:CRun>\n    <ctxt:CRun>Jack9</ctxt:CRun>\n    <ctxt:CRun>ハロハロ世界！</ctxt:CRun>\n  </ctxt:CTextBlock>\n</UserControl>\n"
  },
  {
    "path": "tests/UnitTest.CTxt/Xamls/Test1.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace UnitTest.CTxt.Xamls\n{\n    public partial class Test1 : UserControl\n    {\n        public Test1()\n        {\n            this.InitializeComponent();\n        }\n\n        private void InitializeComponent()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "tests/UnitTest.CTxt/Xamls/Test2.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n\n             xmlns:ctxt=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\"\n             \n             FontFamily=\"avares://UnitTest.CTxt/Assets/Fonts/ume-ugo4.ttf#Ume UI Gothic\"\n             FontSize=\"24\"\n             \n             x:Class=\"UnitTest.CTxt.Xamls.Test2\">\n  <ctxt:CTextBlock>\n    <ctxt:CBold>Top:</ctxt:CBold>\n    <ctxt:CSpan TextVerticalAlignment=\"Top\">\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n\n        <ctxt:CSpan\n            BorderBrush=\"Blue\"\n            BorderThickness=\"2\"\n            Padding=\"2,2,2,10\">\n          Blue0\n        </ctxt:CSpan>\n        Normal0\n        <ctxt:CSpan\n            BorderBrush=\"Red\"\n            BorderThickness=\"2\"\n            Padding=\"2,10,2,2\">\n          Red0\n        </ctxt:CSpan>\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Blue\"\n          BorderThickness=\"2\"\n          Padding=\"2,2,2,10\">\n        Blue1\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n        Red1\n      </ctxt:CSpan>\n\n      <ctxt:CRun FontSize=\"15\">Small</ctxt:CRun>\n      <ctxt:CRun FontSize=\"32\">Large</ctxt:CRun>\n    </ctxt:CSpan>\n    <ctxt:CLineBreak/>\n\n    <ctxt:CBold>Center:</ctxt:CBold>\n    <ctxt:CSpan TextVerticalAlignment=\"Center\">\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n\n        <ctxt:CSpan\n            BorderBrush=\"Blue\"\n            BorderThickness=\"2\"\n            Padding=\"2,2,2,10\">\n          Blue0\n        </ctxt:CSpan>\n        Normal0\n        <ctxt:CSpan\n            BorderBrush=\"Red\"\n            BorderThickness=\"2\"\n            Padding=\"2,10,2,2\">\n          Red0\n        </ctxt:CSpan>\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Blue\"\n          BorderThickness=\"2\"\n          Padding=\"2,2,2,10\">\n        Blue1\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n        Red1\n      </ctxt:CSpan>\n\n      <ctxt:CRun FontSize=\"15\">Small</ctxt:CRun>\n      <ctxt:CRun FontSize=\"32\">Large</ctxt:CRun>\n    </ctxt:CSpan>\n    <ctxt:CLineBreak/>\n\n    <ctxt:CBold>Bottom:</ctxt:CBold>\n    <ctxt:CSpan TextVerticalAlignment=\"Bottom\">\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n\n        <ctxt:CSpan\n            BorderBrush=\"Blue\"\n            BorderThickness=\"2\"\n            Padding=\"2,2,2,10\">\n          Blue0\n        </ctxt:CSpan>\n        Normal0\n        <ctxt:CSpan\n            BorderBrush=\"Red\"\n            BorderThickness=\"2\"\n            Padding=\"2,10,2,2\">\n          Red0\n        </ctxt:CSpan>\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Blue\"\n          BorderThickness=\"2\"\n          Padding=\"2,2,2,10\">\n        Blue1\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n        Red1\n      </ctxt:CSpan>\n\n      <ctxt:CRun FontSize=\"15\">Small</ctxt:CRun>\n      <ctxt:CRun FontSize=\"32\">Large</ctxt:CRun>\n    </ctxt:CSpan>\n    <ctxt:CLineBreak/>\n\n    <ctxt:CBold>Descent:</ctxt:CBold>\n    <ctxt:CSpan>\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n\n        <ctxt:CSpan\n            BorderBrush=\"Blue\"\n            BorderThickness=\"2\"\n            Padding=\"2,2,2,10\">\n          Blue_g\n        </ctxt:CSpan>\n        Normal\n        <ctxt:CSpan\n            BorderBrush=\"Red\"\n            BorderThickness=\"2\"\n            Padding=\"2,10,2,2\">\n          Red_g\n        </ctxt:CSpan>\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Blue\"\n          BorderThickness=\"2\"\n          Padding=\"2,2,2,10\">\n        Blue_g\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n        Red_g\n      </ctxt:CSpan>\n\n      <ctxt:CRun FontSize=\"15\">Small</ctxt:CRun>\n      <ctxt:CRun FontSize=\"32\">Large</ctxt:CRun>\n    </ctxt:CSpan>\n    <ctxt:CLineBreak/>\n\n\n  </ctxt:CTextBlock>\n</UserControl>\n"
  },
  {
    "path": "tests/UnitTest.CTxt/Xamls/Test2.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace UnitTest.CTxt.Xamls\n{\n    public partial class Test2 : UserControl\n    {\n        public Test2()\n        {\n            this.InitializeComponent();\n        }\n\n        private void InitializeComponent()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "tests/UnitTest.CTxt/Xamls/Test3.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             \n             xmlns:ctxt=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\"\n             \n             FontFamily=\"avares://UnitTest.CTxt/Assets/Fonts/ume-ugo4.ttf#Ume UI Gothic\"\n             FontSize=\"24\"\n\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"UnitTest.CTxt.Xamls.Test3\">\n  <StackPanel>\n    <ctxt:CTextBlock TextVerticalAlignment=\"Top\">\n      <ctxt:CBold>Top:</ctxt:CBold>\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n\n        <ctxt:CSpan\n            BorderBrush=\"Blue\"\n            BorderThickness=\"2\"\n            Padding=\"2,2,2,10\">\n          Blue0\n        </ctxt:CSpan>\n        Normal0\n        <ctxt:CSpan\n            BorderBrush=\"Red\"\n            BorderThickness=\"2\"\n            Padding=\"2,10,2,2\">\n          Red0\n        </ctxt:CSpan>\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Blue\"\n          BorderThickness=\"2\"\n          Padding=\"2,2,2,30\">\n        Blue1\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,40,2,2\">\n        Red1\n      </ctxt:CSpan>\n\n      <ctxt:CRun FontSize=\"15\">Small</ctxt:CRun>\n      <ctxt:CRun FontSize=\"32\">Large</ctxt:CRun>\n    </ctxt:CTextBlock >\n    <ctxt:CTextBlock TextVerticalAlignment=\"Center\">\n      <ctxt:CBold>Center:</ctxt:CBold>\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n\n        <ctxt:CSpan\n            BorderBrush=\"Blue\"\n            BorderThickness=\"2\"\n            Padding=\"2,2,2,10\">\n          Blue0\n        </ctxt:CSpan>\n        Normal0\n        <ctxt:CSpan\n            BorderBrush=\"Red\"\n            BorderThickness=\"2\"\n            Padding=\"2,10,2,2\">\n          Red0\n        </ctxt:CSpan>\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Blue\"\n          BorderThickness=\"2\"\n          Padding=\"2,2,2,30\">\n        Blue1\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,40,2,2\">\n        Red1\n      </ctxt:CSpan>\n\n      <ctxt:CRun FontSize=\"15\">Small</ctxt:CRun>\n      <ctxt:CRun FontSize=\"32\">Large</ctxt:CRun>\n    </ctxt:CTextBlock >\n    <ctxt:CTextBlock TextVerticalAlignment=\"Bottom\">\n      <ctxt:CBold>Bottom:</ctxt:CBold>\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n\n        <ctxt:CSpan\n            BorderBrush=\"Blue\"\n            BorderThickness=\"2\"\n            Padding=\"2,2,2,10\">\n          Blue0\n        </ctxt:CSpan>\n        Normal0\n        <ctxt:CSpan\n            BorderBrush=\"Red\"\n            BorderThickness=\"2\"\n            Padding=\"2,10,2,2\">\n          Red0\n        </ctxt:CSpan>\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Blue\"\n          BorderThickness=\"2\"\n          Padding=\"2,2,2,30\">\n        Blue1\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,40,2,2\">\n        Red1\n      </ctxt:CSpan>\n\n      <ctxt:CRun FontSize=\"15\">Small</ctxt:CRun>\n      <ctxt:CRun FontSize=\"32\">Large</ctxt:CRun>\n    </ctxt:CTextBlock >\n    <ctxt:CTextBlock >\n      <ctxt:CBold>Descent:</ctxt:CBold>\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n\n        <ctxt:CSpan\n            BorderBrush=\"Blue\"\n            BorderThickness=\"2\"\n            Padding=\"2,2,2,10\">\n          Blue_g\n        </ctxt:CSpan>\n        Normal\n        <ctxt:CSpan\n            BorderBrush=\"Red\"\n            BorderThickness=\"2\"\n            Padding=\"2,10,2,2\">\n          Red_g\n        </ctxt:CSpan>\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Blue\"\n          BorderThickness=\"2\"\n          Padding=\"2,2,2,40\">\n        Blue_g\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,40,2,2\">\n        Red_g\n      </ctxt:CSpan>\n\n      <ctxt:CRun FontSize=\"15\">Small</ctxt:CRun>\n      <ctxt:CRun FontSize=\"32\">Large</ctxt:CRun>\n    </ctxt:CTextBlock>\n  </StackPanel>\n</UserControl>\n"
  },
  {
    "path": "tests/UnitTest.CTxt/Xamls/Test3.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace UnitTest.CTxt.Xamls\n{\n    public partial class Test3 : UserControl\n    {\n        public Test3()\n        {\n            this.InitializeComponent();\n        }\n\n        private void InitializeComponent()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "tests/UnitTest.CTxt/Xamls/Test4.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             \n             xmlns:ctxt=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\"\n             \n             FontFamily=\"avares://UnitTest.CTxt/Assets/Fonts/ume-ugo4.ttf#Ume UI Gothic\"\n             FontSize=\"24\"\n             \n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"UnitTest.CTxt.Xamls.Test4\">\n  <ctxt:CTextBlock LineSpacing=\"10\">\n    <ctxt:CBold>Top:</ctxt:CBold>\n    <ctxt:CSpan TextVerticalAlignment=\"Top\">\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n\n        <ctxt:CSpan\n            BorderBrush=\"Blue\"\n            BorderThickness=\"2\"\n            Padding=\"2,2,2,10\">\n          Blue0\n        </ctxt:CSpan>\n        Normal0\n        <ctxt:CSpan\n            BorderBrush=\"Red\"\n            BorderThickness=\"2\"\n            Padding=\"2,10,2,2\">\n          Red0\n        </ctxt:CSpan>\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Blue\"\n          BorderThickness=\"2\"\n          Padding=\"2,2,2,10\">\n        Blue1\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n        Red1\n      </ctxt:CSpan>\n\n      <ctxt:CRun FontSize=\"15\">Small</ctxt:CRun>\n      <ctxt:CRun FontSize=\"32\">Large</ctxt:CRun>\n    </ctxt:CSpan>\n    <ctxt:CLineBreak/>\n\n    <ctxt:CBold>Center:</ctxt:CBold>\n    <ctxt:CSpan TextVerticalAlignment=\"Center\">\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n\n        <ctxt:CSpan\n            BorderBrush=\"Blue\"\n            BorderThickness=\"2\"\n            Padding=\"2,2,2,10\">\n          Blue0\n        </ctxt:CSpan>\n        Normal0\n        <ctxt:CSpan\n            BorderBrush=\"Red\"\n            BorderThickness=\"2\"\n            Padding=\"2,10,2,2\">\n          Red0\n        </ctxt:CSpan>\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Blue\"\n          BorderThickness=\"2\"\n          Padding=\"2,2,2,10\">\n        Blue1\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n        Red1\n      </ctxt:CSpan>\n\n      <ctxt:CRun FontSize=\"15\">Small</ctxt:CRun>\n      <ctxt:CRun FontSize=\"32\">Large</ctxt:CRun>\n    </ctxt:CSpan>\n    <ctxt:CLineBreak/>\n\n    <ctxt:CBold>Bottom:</ctxt:CBold>\n    <ctxt:CSpan TextVerticalAlignment=\"Bottom\">\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n\n        <ctxt:CSpan\n            BorderBrush=\"Blue\"\n            BorderThickness=\"2\"\n            Padding=\"2,2,2,10\">\n          Blue0\n        </ctxt:CSpan>\n        Normal0\n        <ctxt:CSpan\n            BorderBrush=\"Red\"\n            BorderThickness=\"2\"\n            Padding=\"2,10,2,2\">\n          Red0\n        </ctxt:CSpan>\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Blue\"\n          BorderThickness=\"2\"\n          Padding=\"2,2,2,10\">\n        Blue1\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n        Red1\n      </ctxt:CSpan>\n\n      <ctxt:CRun FontSize=\"15\">Small</ctxt:CRun>\n      <ctxt:CRun FontSize=\"32\">Large</ctxt:CRun>\n    </ctxt:CSpan>\n    <ctxt:CLineBreak/>\n\n    <ctxt:CBold>Descent:</ctxt:CBold>\n    <ctxt:CSpan>\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n\n        <ctxt:CSpan\n            BorderBrush=\"Blue\"\n            BorderThickness=\"2\"\n            Padding=\"2,2,2,10\">\n          Blue_g\n        </ctxt:CSpan>\n        Normal\n        <ctxt:CSpan\n            BorderBrush=\"Red\"\n            BorderThickness=\"2\"\n            Padding=\"2,10,2,2\">\n          Red_g\n        </ctxt:CSpan>\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Blue\"\n          BorderThickness=\"2\"\n          Padding=\"2,2,2,10\">\n        Blue_g\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n        Red_g\n      </ctxt:CSpan>\n\n      <ctxt:CRun FontSize=\"15\">Small</ctxt:CRun>\n      <ctxt:CRun FontSize=\"32\">Large</ctxt:CRun>\n    </ctxt:CSpan>\n    <ctxt:CLineBreak/>\n  </ctxt:CTextBlock>\n</UserControl>\n"
  },
  {
    "path": "tests/UnitTest.CTxt/Xamls/Test4.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace UnitTest.CTxt.Xamls\n{\n    public partial class Test4 : UserControl\n    {\n        public Test4()\n        {\n            this.InitializeComponent();\n        }\n\n        private void InitializeComponent()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "tests/UnitTest.CTxt/Xamls/Test5.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             \n             xmlns:ctxt=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\"\n             \n             FontFamily=\"avares://UnitTest.CTxt/Assets/Fonts/ume-ugo4.ttf#Ume UI Gothic\"\n             FontSize=\"24\"\n             \n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"UnitTest.CTxt.Xamls.Test5\">\n  <ctxt:CTextBlock LineHeight=\"80\">\n    <ctxt:CBold TextVerticalAlignment=\"Top\">Top:</ctxt:CBold>\n    <ctxt:CSpan TextVerticalAlignment=\"Top\">\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n\n        <ctxt:CSpan\n            BorderBrush=\"Blue\"\n            BorderThickness=\"2\"\n            Padding=\"2,2,2,10\">\n          Blue0\n        </ctxt:CSpan>\n        Normal0\n        <ctxt:CSpan\n            BorderBrush=\"Red\"\n            BorderThickness=\"2\"\n            Padding=\"2,10,2,2\">\n          Red0\n        </ctxt:CSpan>\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Blue\"\n          BorderThickness=\"2\"\n          Padding=\"2,2,2,10\">\n        Blue1\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n        Red1\n      </ctxt:CSpan>\n\n      <ctxt:CRun FontSize=\"15\">Small</ctxt:CRun>\n      <ctxt:CRun FontSize=\"32\">Large</ctxt:CRun>\n    </ctxt:CSpan>\n    <ctxt:CLineBreak/>\n\n    <ctxt:CBold TextVerticalAlignment=\"Top\">Center:</ctxt:CBold>\n    <ctxt:CSpan TextVerticalAlignment=\"Center\">\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n\n        <ctxt:CSpan\n            BorderBrush=\"Blue\"\n            BorderThickness=\"2\"\n            Padding=\"2,2,2,10\">\n          Blue0\n        </ctxt:CSpan>\n        Normal0\n        <ctxt:CSpan\n            BorderBrush=\"Red\"\n            BorderThickness=\"2\"\n            Padding=\"2,10,2,2\">\n          Red0\n        </ctxt:CSpan>\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Blue\"\n          BorderThickness=\"2\"\n          Padding=\"2,2,2,10\">\n        Blue1\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n        Red1\n      </ctxt:CSpan>\n\n      <ctxt:CRun FontSize=\"15\">Small</ctxt:CRun>\n      <ctxt:CRun FontSize=\"32\">Large</ctxt:CRun>\n    </ctxt:CSpan>\n    <ctxt:CLineBreak/>\n\n    <ctxt:CBold TextVerticalAlignment=\"Top\">Bottom:</ctxt:CBold>\n    <ctxt:CSpan TextVerticalAlignment=\"Bottom\">\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n\n        <ctxt:CSpan\n            BorderBrush=\"Blue\"\n            BorderThickness=\"2\"\n            Padding=\"2,2,2,10\">\n          Blue0\n        </ctxt:CSpan>\n        Normal0\n        <ctxt:CSpan\n            BorderBrush=\"Red\"\n            BorderThickness=\"2\"\n            Padding=\"2,10,2,2\">\n          Red0\n        </ctxt:CSpan>\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Blue\"\n          BorderThickness=\"2\"\n          Padding=\"2,2,2,10\">\n        Blue1\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n        Red1\n      </ctxt:CSpan>\n\n      <ctxt:CRun FontSize=\"15\">Small</ctxt:CRun>\n      <ctxt:CRun FontSize=\"32\">Large</ctxt:CRun>\n    </ctxt:CSpan>\n    <ctxt:CLineBreak/>\n\n    <ctxt:CBold TextVerticalAlignment=\"Top\">Descent:</ctxt:CBold>\n    <ctxt:CSpan>\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n\n        <ctxt:CSpan\n            BorderBrush=\"Blue\"\n            BorderThickness=\"2\"\n            Padding=\"2,2,2,10\">\n          Blue_g\n        </ctxt:CSpan>\n        Normal\n        <ctxt:CSpan\n            BorderBrush=\"Red\"\n            BorderThickness=\"2\"\n            Padding=\"2,10,2,2\">\n          Red_g\n        </ctxt:CSpan>\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Blue\"\n          BorderThickness=\"2\"\n          Padding=\"2,2,2,10\">\n        Blue_g\n      </ctxt:CSpan>\n\n      <ctxt:CSpan\n          BorderBrush=\"Red\"\n          BorderThickness=\"2\"\n          Padding=\"2,10,2,2\">\n        Red_g\n      </ctxt:CSpan>\n\n      <ctxt:CRun FontSize=\"15\">Small</ctxt:CRun>\n      <ctxt:CRun FontSize=\"32\">Large</ctxt:CRun>\n    </ctxt:CSpan>\n    <ctxt:CLineBreak/>\n  </ctxt:CTextBlock>\n</UserControl>\n"
  },
  {
    "path": "tests/UnitTest.CTxt/Xamls/Test5.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace UnitTest.CTxt.Xamls\n{\n    public partial class Test5 : UserControl\n    {\n        public Test5()\n        {\n            this.InitializeComponent();\n        }\n\n        private void InitializeComponent()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "tests/UnitTest.CTxt/Xamls/Test6.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             \n             xmlns:ctxt=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\"\n             \n             FontFamily=\"avares://UnitTest.CTxt/Assets/Fonts/ume-ugo4.ttf#Ume UI Gothic\"\n             FontSize=\"24\"\n\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"UnitTest.CTxt.Xamls.Test6\">\n\n  <ctxt:CTextBlock LineHeight=\"70\" LineSpacing=\"12\">\n    <ctxt:CRun TextVerticalAlignment=\"Top\">Top</ctxt:CRun>\n    <ctxt:CRun Text=\" \"/>\n    <ctxt:CRun TextVerticalAlignment=\"Center\">Center</ctxt:CRun>\n    <ctxt:CRun Text=\" \"/>\n    <ctxt:CRun TextVerticalAlignment=\"Bottom\">Bottom</ctxt:CRun>\n    <ctxt:CRun Text=\" \"/>\n    <ctxt:CRun TextVerticalAlignment=\"Base\">Base</ctxt:CRun>\n    <ctxt:CRun Text=\" \"/>\n    <ctxt:CSpan TextVerticalAlignment=\"Base\" Padding=\"2,10,2,2\" BorderThickness=\"2\" BorderBrush=\"Green\" Background=\"LightGreen\">眠い</ctxt:CSpan>\n    <ctxt:CLineBreak/>\n    <ctxt:CRun TextVerticalAlignment=\"Top\">Second line text. Second line</ctxt:CRun>\n  </ctxt:CTextBlock>\n\n</UserControl>\n"
  },
  {
    "path": "tests/UnitTest.CTxt/Xamls/Test6.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace UnitTest.CTxt.Xamls\n{\n    public partial class Test6 : UserControl\n    {\n        public Test6()\n        {\n            this.InitializeComponent();\n        }\n\n        private void InitializeComponent()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "tests/UnitTest.CTxt/Xamls/Test7.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             \n             xmlns:ctxt=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\"\n             \n             FontFamily=\"avares://UnitTest.CTxt/Assets/Fonts/ume-ugo4.ttf#Ume UI Gothic\"\n             FontSize=\"24\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"UnitTest.CTxt.Xamls.Test7\">\n\n  <StackPanel Orientation=\"Vertical\">\n    <ctxt:CTextBlock LineHeight=\"50\" Width=\"480\">\n      <ctxt:CRun>Text:</ctxt:CRun>\n      <ctxt:CRun TextVerticalAlignment=\"Top\" IsUnderline=\"True\" >Top Top Top Top Top Top Top Top Top Top Top Top Top Top Top Top</ctxt:CRun>\n      <ctxt:CRun>:End Text</ctxt:CRun>\n      <ctxt:CLineBreak/>\n      <ctxt:CRun TextVerticalAlignment=\"Top\">= = = = = = = =</ctxt:CRun>\n    </ctxt:CTextBlock>\n\n    <ctxt:CTextBlock LineHeight=\"50\" Width=\"450\">\n      <ctxt:CRun>Text:</ctxt:CRun>\n      <ctxt:CRun TextVerticalAlignment=\"Center\" IsUnderline=\"True\" >Center Center Center Center Center Center Center Center Center</ctxt:CRun>\n      <ctxt:CRun>:End Text</ctxt:CRun>\n      <ctxt:CLineBreak/>\n      <ctxt:CRun TextVerticalAlignment=\"Top\">= = = = = = = =</ctxt:CRun>\n    </ctxt:CTextBlock>\n\n    <ctxt:CTextBlock LineHeight=\"50\" Width=\"480\">\n      <ctxt:CRun>Text:</ctxt:CRun>\n      <ctxt:CRun TextVerticalAlignment=\"Bottom\" IsUnderline=\"True\" >Bottom Bottom Bottom Bottom Bottom Bottom Bottom Bottom Bottom</ctxt:CRun>\n      <ctxt:CRun>:End Text</ctxt:CRun>\n      <ctxt:CLineBreak/>\n      <ctxt:CRun TextVerticalAlignment=\"Top\">= = = = = = = =</ctxt:CRun>\n    </ctxt:CTextBlock>\n\n    <ctxt:CTextBlock LineHeight=\"50\" Width=\"480\">\n      <ctxt:CRun>Text:</ctxt:CRun>\n      <ctxt:CRun TextVerticalAlignment=\"Base\"  IsUnderline=\"True\" >Base Base Base Base Base Base Base Base Base Base Base Base Base</ctxt:CRun>\n      <ctxt:CRun>:End Text</ctxt:CRun>\n      <ctxt:CLineBreak/>\n      <ctxt:CRun TextVerticalAlignment=\"Top\">= = = = = = = =</ctxt:CRun>\n    </ctxt:CTextBlock>\n\n    <ctxt:CTextBlock LineHeight=\"50\" Width=\"430\">\n      <ctxt:CRun>Text:</ctxt:CRun>\n      <ctxt:CSpan TextVerticalAlignment=\"Base\" Padding=\"2,10,2,2\" BorderThickness=\"2\" BorderBrush=\"Green\" Background=\"LightGreen\"\n                                             >お腹空いた 眠い 走りたい ツカレタ お腹空いた 眠い 走りたい ツカレタ お腹空いた</ctxt:CSpan>\n      <ctxt:CRun>:End Text</ctxt:CRun>\n      <ctxt:CLineBreak/>\n      <ctxt:CRun TextVerticalAlignment=\"Top\">= = = = = = = =</ctxt:CRun>\n    </ctxt:CTextBlock>\n  </StackPanel>\n</UserControl>\n"
  },
  {
    "path": "tests/UnitTest.CTxt/Xamls/Test7.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace UnitTest.CTxt.Xamls\n{\n    public partial class Test7 : UserControl\n    {\n        public Test7()\n        {\n            this.InitializeComponent();\n        }\n\n        private void InitializeComponent()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "tests/UnitTest.CTxt/Xamls/Test99.axaml",
    "content": "﻿<UserControl xmlns=\"https://github.com/avaloniaui\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n             \n             xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\"\n             \n             FontFamily=\"avares://UnitTest.CTxt/Assets/Fonts/ume-ugo4.ttf#Ume UI Gothic\"\n             FontSize=\"24\"\n             mc:Ignorable=\"d\" d:DesignWidth=\"800\" d:DesignHeight=\"450\"\n             x:Class=\"UnitTest.CTxt.Xamls.Test99\">\n\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"MdXaml is a modify version of Markdown.Xaml. Markdown XAML is a port of the popular \" />\n    <c:CItalic>\n      <c:CRun Text=\"MarkdownSharp\" />\n    </c:CItalic>\n    <c:CRun Text=\" Markdown processor, but with one very significant difference: Instead of rendering to a string containing HTML, it renders to a FlowDocument suitable for embedding into a WPF window or usercontrol.\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"Example:\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"\" />\n    <c:CItalic>\n      <c:CRun Text=\"italic\" />\n    </c:CItalic>\n    <c:CRun Text=\", \" />\n    <c:CBold>\n      <c:CRun Text=\"bold\" />\n    </c:CBold>\n    <c:CRun Text=\", \" />\n    <c:CBold>\n      <c:CItalic>\n        <c:CRun Text=\"bold-italic\" />\n      </c:CItalic>\n    </c:CBold>\n    <c:CRun Text=\", \" />\n    <c:CStrikethrough IsStrikethrough=\"True\">\n      <c:CRun Text=\"strikethrough\" />\n    </c:CStrikethrough>\n    <c:CRun Text=\", \" />\n    <c:CUnderline IsUnderline=\"True\">\n      <c:CRun Text=\"underline\" />\n    </c:CUnderline>\n    <c:CRun Text=\" and \" />\n    <c:CSpan>\n      <c:CRun Text=\"color\" />\n    </c:CSpan>\n    <c:CRun Text=\".\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"\" />\n    <c:CSpan>\n      <c:CBold>\n        <c:CItalic>\n          <c:CStrikethrough IsStrikethrough=\"True\">\n            <c:CUnderline IsUnderline=\"True\">\n              <c:CRun Text=\"Mixing Text\" />\n            </c:CUnderline>\n          </c:CStrikethrough>\n        </c:CItalic>\n      </c:CBold>\n    </c:CSpan>\n    <c:CRun Text=\" Link:\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"Links \" />\n    <c:CHyperlink CommandParameter=\"https://www.google.com\">\n      <c:CRun Text=\"Go to Google!\" />\n    </c:CHyperlink>\n    <c:CRun Text=\"\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"Links with title \" />\n    <c:CHyperlink CommandParameter=\"https://www.google.com\">\n      <c:CRun Text=\"Go to Google!\" />\n    </c:CHyperlink>\n    <c:CRun Text=\"\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"Links with image \" />\n    <c:CRun Text=\" \" />\n  </c:CTextBlock>\n</UserControl>\n"
  },
  {
    "path": "tests/UnitTest.CTxt/Xamls/Test99.axaml.cs",
    "content": "﻿using Avalonia;\nusing Avalonia.Controls;\nusing Avalonia.Markup.Xaml;\n\nnamespace UnitTest.CTxt.Xamls\n{\n    public partial class Test99 : UserControl\n    {\n        public Test99()\n        {\n            this.InitializeComponent();\n        }\n\n        private void InitializeComponent()\n        {\n            AvaloniaXamlLoader.Load(this);\n        }\n    }\n}\n"
  },
  {
    "path": "tests/UnitTest.Md/.gitignore",
    "content": "Out/*.received.txt\nOut/*.bak\n"
  },
  {
    "path": "tests/UnitTest.Md/Out/UnitTestMd.Transform_givenBlockqoute_generatesExpectedResult.approved.txt",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <Border Classes=\"Blockquote\" xmlns=\"\">\n    <Border.Child>\n      <StackPanel Classes=\"Blockquote\">\n        <c:CTextBlock Classes=\"Heading2\">\n          <c:CRun Text=\"Features\" />\n        </c:CTextBlock>\n        <c:CTextBlock Classes=\"Paragraph\">\n          <c:CRun Text=\"MarkDown.Xaml has a number of convenient features\" />\n        </c:CTextBlock>\n        <Grid Classes=\"List\">\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"The engine itself is a single file, for easy inclusion in your own projects\" />\n            </c:CTextBlock>\n          </StackPanel>\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"Code for the engine is structured in the same manner as the original MarkdownSharp \" />\n            </c:CTextBlock>\n          </StackPanel>\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"Includes a \" />\n              <c:CCode>\n                <c:CRun Text=\"TextToFlowDocumentConverter\" />\n              </c:CCode>\n              <c:CRun Text=\" to make it easy to bind Markdown text\" />\n            </c:CTextBlock>\n          </StackPanel>\n          <Grid.ColumnDefinitions>\n            <ColumnDefinition />\n            <ColumnDefinition />\n          </Grid.ColumnDefinitions>\n          <Grid.RowDefinitions>\n            <RowDefinition />\n            <RowDefinition />\n            <RowDefinition />\n          </Grid.RowDefinitions>\n        </Grid>\n      </StackPanel>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Blockquote\" xmlns=\"\">\n    <Border.Child>\n      <StackPanel Classes=\"Blockquote\">\n        <c:CTextBlock Classes=\"Heading2\">\n          <c:CRun Text=\"Features\" />\n        </c:CTextBlock>\n        <c:CTextBlock Classes=\"Paragraph\">\n          <c:CRun Text=\"MarkDown.Xaml has a number of convenient features\" />\n        </c:CTextBlock>\n        <Grid Classes=\"List\">\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"The engine itself is a single file, for easy inclusion in your own projects\" />\n            </c:CTextBlock>\n          </StackPanel>\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"Code for the engine is structured in the same manner as the original MarkdownSharp \" />\n            </c:CTextBlock>\n          </StackPanel>\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"Includes a \" />\n              <c:CCode>\n                <c:CRun Text=\"TextToFlowDocumentConverter\" />\n              </c:CCode>\n              <c:CRun Text=\" to make it easy to bind Markdown text\" />\n            </c:CTextBlock>\n          </StackPanel>\n          <Grid.ColumnDefinitions>\n            <ColumnDefinition />\n            <ColumnDefinition />\n          </Grid.ColumnDefinitions>\n          <Grid.RowDefinitions>\n            <RowDefinition />\n            <RowDefinition />\n            <RowDefinition />\n          </Grid.RowDefinitions>\n        </Grid>\n      </StackPanel>\n    </Border.Child>\n  </Border>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.Md/Out/UnitTestMd.Transform_givenCodes_generatesExpectedResult.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:m=\"https://github.com/whistyun/Markdown.Avalonia.Tight\" xmlns:ma=\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\" xmlns:ma2=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Heading1\">\n    <c:CCode>\n      <c:CRun Text=\"```\" />\n    </c:CCode>\n  </c:CTextBlock>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"```cs&#xA;public void Main(){&#xA;    Console.WriteLine(&quot;`Hello World`&quot;);&#xA;}&#xA;```\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"public void Main(){&#xA;    Console.WriteLine(&quot;`Hello World`&quot;);&#xA;}\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Blockquote\" xmlns=\"\">\n    <Border.Child>\n      <StackPanel Classes=\"Blockquote\">\n        <Border Classes=\"CodeBlock\">\n          <Border.Child>\n            <ScrollViewer Classes=\"CodeBlock\">\n              <ScrollViewer.Content>\n                <TextBlock Text=\"public void Main(){&#xA;    Console.WriteLine(&quot;`Hello World`&quot;);&#xA;}\" Classes=\"CodeBlock\" />\n              </ScrollViewer.Content>\n            </ScrollViewer>\n          </Border.Child>\n        </Border>\n      </StackPanel>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"   public void Main(){&#xA;       Console.WriteLine(&quot;`Hello World`&quot;);&#xA;   }\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"```cs&#xA;public void Main(){&#xA;    Console.WriteLine(&quot;`Hello World`&quot;);&#xA;}&#xA;```\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <Border Classes=\"CodeBlock\">\n        <Border.Child>\n          <ScrollViewer Classes=\"CodeBlock\">\n            <ScrollViewer.Content>\n              <TextBlock Text=\"public void Main(){&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;}\" Classes=\"CodeBlock\" />\n            </ScrollViewer.Content>\n          </ScrollViewer>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n      <Border Classes=\"CodeBlock\">\n        <Border.Child>\n          <ScrollViewer Classes=\"CodeBlock\">\n            <ScrollViewer.Content>\n              <TextBlock Text=\"public void Main(){&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;}\" Classes=\"CodeBlock\" />\n            </ScrollViewer.Content>\n          </ScrollViewer>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"TwoLines\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n      <Border Classes=\"CodeBlock\">\n        <Border.Child>\n          <ScrollViewer Classes=\"CodeBlock\">\n            <ScrollViewer.Content>\n              <TextBlock Text=\"public void Main(){&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;}\" Classes=\"CodeBlock\" />\n            </ScrollViewer.Content>\n          </ScrollViewer>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Heading1\">\n    <c:CRun Text=\"Indent\" />\n  </c:CTextBlock>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"abcd&#xA;efgh\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\" abcd&#xA;efgh\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"abcd&#xA; efgh&#xA;&#xA; ijkl&#xA;&#xA;opqr\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <Border Classes=\"Blockquote\" xmlns=\"\">\n    <Border.Child>\n      <StackPanel Classes=\"Blockquote\">\n        <Border Classes=\"CodeBlock\">\n          <Border.Child>\n            <ScrollViewer Classes=\"CodeBlock\">\n              <ScrollViewer.Content>\n                <TextBlock Text=\"asdf&#xA; ghij\" Classes=\"CodeBlock\" />\n              </ScrollViewer.Content>\n            </ScrollViewer>\n          </Border.Child>\n        </Border>\n      </StackPanel>\n    </Border.Child>\n  </Border>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <Border Classes=\"CodeBlock\">\n        <Border.Child>\n          <ScrollViewer Classes=\"CodeBlock\">\n            <ScrollViewer.Content>\n              <TextBlock Text=\"public void Main(){&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;}\" Classes=\"CodeBlock\" />\n            </ScrollViewer.Content>\n          </ScrollViewer>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one public void Main(){\" />\n      </c:CTextBlock>\n      <Border Classes=\"CodeBlock\">\n        <Border.Child>\n          <ScrollViewer Classes=\"CodeBlock\">\n            <ScrollViewer.Content>\n              <TextBlock Text=\"}\" Classes=\"CodeBlock\" />\n            </ScrollViewer.Content>\n          </ScrollViewer>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n      <Border Classes=\"CodeBlock\">\n        <Border.Child>\n          <ScrollViewer Classes=\"CodeBlock\">\n            <ScrollViewer.Content>\n              <TextBlock Text=\"public void Main(){&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;}\" Classes=\"CodeBlock\" />\n            </ScrollViewer.Content>\n          </ScrollViewer>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"public void Main(){&#xA;    Console.WriteLine(&quot;`Hello World`&quot;);&#xA;}\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"public void Main(){&#xA;    Console.WriteLine(&quot;`Hello World`&quot;);&#xA;}\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"public void Main(){&#xA;    Console.WriteLine(&quot;`Hello World`&quot;);&#xA;}\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"public void Main(){&#xA;    Console.WriteLine(&quot;`Hello World`&quot;);&#xA;}\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.Md/Out/UnitTestMd.Transform_givenContainer_generatesExpectedResult.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:m=\"https://github.com/whistyun/Markdown.Avalonia.Tight\" xmlns:ma=\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\" xmlns:ma2=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <Border Classes=\"CodeBlock,NoContainer\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"::::&#xA;:::cs&#xA;public void Main(){&#xA;    Console.WriteLine(&quot;:Hello World:&quot;);&#xA;}&#xA;:::&#xA;::::&#xA;&#xA;\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"CodeBlock,NoContainer\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\":::&#xA;public void Main(){&#xA;    Console.WriteLine(&quot;:Hello World:&quot;);&#xA;}&#xA;:::&#xA;&#xA;\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Blockquote\" xmlns=\"\">\n    <Border.Child>\n      <StackPanel Classes=\"Blockquote\">\n        <Border Classes=\"CodeBlock,NoContainer\">\n          <Border.Child>\n            <ScrollViewer Classes=\"CodeBlock\">\n              <ScrollViewer.Content>\n                <TextBlock Text=\":::&#xA;public void Main(){&#xA;    Console.WriteLine(&quot;:Hello World:&quot;);&#xA;}&#xA;:::&#xA;\" Classes=\"CodeBlock\" />\n              </ScrollViewer.Content>\n            </ScrollViewer>\n          </Border.Child>\n        </Border>\n      </StackPanel>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"CodeBlock,NoContainer\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"   :::&#xA;   public void Main(){&#xA;       Console.WriteLine(&quot;:Hello World:&quot;);&#xA;   }&#xA;   :::&#xA;&#xA;&#xA;\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\":::cs&#xA;public void Main(){&#xA;    Console.WriteLine(&quot;:Hello World:&quot;);&#xA;}&#xA;:::\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <Border Classes=\"CodeBlock,NoContainer\">\n        <Border.Child>\n          <ScrollViewer Classes=\"CodeBlock\">\n            <ScrollViewer.Content>\n              <TextBlock Text=\":::&#xA;public void Main(){&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;}&#xA;:::&#xA;\" Classes=\"CodeBlock\" />\n            </ScrollViewer.Content>\n          </ScrollViewer>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n      <Border Classes=\"CodeBlock,NoContainer\">\n        <Border.Child>\n          <ScrollViewer Classes=\"CodeBlock\">\n            <ScrollViewer.Content>\n              <TextBlock Text=\":::&#xA;public void Main(){&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;}&#xA;:::&#xA;\" Classes=\"CodeBlock\" />\n            </ScrollViewer.Content>\n          </ScrollViewer>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"TwoLines\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n      <Border Classes=\"CodeBlock,NoContainer\">\n        <Border.Child>\n          <ScrollViewer Classes=\"CodeBlock\">\n            <ScrollViewer.Content>\n              <TextBlock Text=\":::&#xA;public void Main(){&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;}&#xA;:::&#xA;\" Classes=\"CodeBlock\" />\n            </ScrollViewer.Content>\n          </ScrollViewer>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"TwoLines\" />\n  <Border Classes=\"CodeBlock,NoContainer\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"::: md&#xA;&#xA;* list1&#xA;* list2&#xA;&#xA;```cs&#xA;#define FooBar&#xA;```&#xA;:::&#xA;\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.Md/Out/UnitTestMd.Transform_givenEmoji.approved.txt",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"😄\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"smile😠😄\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\":angry:\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\":unknown_missing_symbols:\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\":lackoftxt\" />\n  </c:CTextBlock>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.Md/Out/UnitTestMd.Transform_givenHorizontalRules_generatesExpectedResult.approved.txt",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:m=\"https://github.com/whistyun/Markdown.Avalonia.Tight\" xmlns:ma=\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\" xmlns:ma2=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Dashes:\" />\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"---\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"- - -\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Asterisks:\" />\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"***\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"* * *\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Underscores:\" />\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"BoldWithSingle\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"BoldWithSingle\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"BoldWithSingle\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"BoldWithSingle\" />\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"___\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"BoldWithSingle\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"BoldWithSingle\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"BoldWithSingle\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"BoldWithSingle\" />\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"_ _ _\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.Md/Out/UnitTestMd.Transform_givenImages_generatesExpectedResult.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"A remote \" />\n    <c:CImage />\n    <c:CRun Text=\".\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Images side by side \" />\n    <c:CImage />\n    <c:CImage />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CImage Classes=\"cyan\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"A resource image \" />\n    <c:CImage />\n    <c:CRun Text=\". A local image \" />\n    <c:CImage />\n    <c:CRun Text=\".\" />\n  </c:CTextBlock>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.Md/Out/UnitTestMd.Transform_givenLinksInline_generatesExpectedResult.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Just a \" />\n    <c:CHyperlink CommandParameter=\"/url/\">\n      <c:CRun Text=\"URL\" />\n    </c:CHyperlink>\n    <c:CRun Text=\".\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CHyperlink CommandParameter=\"/url/\" Classes=\"title\">\n      <c:CRun Text=\"URL and title\" />\n    </c:CHyperlink>\n    <c:CRun Text=\".\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CHyperlink CommandParameter=\"/url/\">\n      <c:CRun Text=\"URL and title\" />\n    </c:CHyperlink>\n    <c:CRun Text=\".\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CHyperlink CommandParameter=\"/url/\">\n      <c:CRun Text=\"URL and title\" />\n    </c:CHyperlink>\n    <c:CRun Text=\".\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CHyperlink CommandParameter=\"/url/\">\n      <c:CRun Text=\"URL and title\" />\n    </c:CHyperlink>\n    <c:CRun Text=\".\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CHyperlink CommandParameter=\"&lt;/url/&gt;\">\n      <c:CRun Text=\"URL wrapped in angle brackets\" />\n    </c:CHyperlink>\n    <c:CRun Text=\".\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CHyperlink CommandParameter=\"&lt;/url/&gt;\">\n      <c:CRun Text=\"URL w/ angle brackets + title\" />\n    </c:CHyperlink>\n    <c:CRun Text=\".\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CHyperlink CommandParameter=\"\">\n      <c:CRun Text=\"Empty\" />\n    </c:CHyperlink>\n    <c:CRun Text=\".\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CHyperlink CommandParameter=\"http://en.wikipedia.org/wiki/WIMP_(computing)\">\n      <c:CRun Text=\"With parens in the URL\" />\n    </c:CHyperlink>\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"(With outer parens and \" />\n    <c:CHyperlink CommandParameter=\"/foo(bar)\">\n      <c:CRun Text=\"parens in url\" />\n    </c:CHyperlink>\n    <c:CRun Text=\")\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CHyperlink CommandParameter=\"/foo(bar)\">\n      <c:CRun Text=\"With parens in the URL\" />\n    </c:CHyperlink>\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"(With outer parens and \" />\n    <c:CHyperlink CommandParameter=\"/foo(bar)\">\n      <c:CRun Text=\"parens in url\" />\n    </c:CHyperlink>\n    <c:CRun Text=\")\" />\n  </c:CTextBlock>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.Md/Out/UnitTestMd.Transform_givenLists1_generatesExpectedResult.approved.txt",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:m=\"https://github.com/whistyun/Markdown.Avalonia.Tight\" xmlns:ma=\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\" xmlns:ma2=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"First we have a simple numeric list\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Alpha\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Beta\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Gamma\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"3\">\n      <c:CRun Text=\"4.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"3\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Delta\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Then we have a simple unordered list\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Han\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Leia\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Luke\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"3\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"3\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Obiwan\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Unordered\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Asterisks tight:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Asterisks loose:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"3\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"3\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CBold>\n          <c:CRun Text=\"bold\" />\n        </c:CBold>\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"4\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"4\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CItalic>\n          <c:CRun Text=\"italic\" />\n        </c:CItalic>\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"5\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"5\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CBold>\n          <c:CItalic>\n            <c:CRun Text=\"bold italic\" />\n          </c:CItalic>\n        </c:CBold>\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Pluses tight:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Pluses loose:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Minuses tight:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Minuses loose:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Ordered\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Tight:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"First\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Second\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Third\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"and:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"One\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Two\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Three\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Loose using tabs:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"First\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Second\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Third\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"and using spaces:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"One\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Two\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Three\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Multiple paragraphs:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Item 1, graf one.\" />\n      </c:CTextBlock>\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\" Item 2. graf two. The quick brown fox jumped over the lazy dog's back.\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Item 2.\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Item 3.\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Nested\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Tab\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Tab\" />\n          </c:CTextBlock>\n          <Grid Classes=\"List\">\n            <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n              <c:CRun Text=\"•\" />\n            </c:CTextBlock>\n            <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n              <c:CTextBlock Classes=\"Paragraph\">\n                <c:CRun Text=\"Tab\" />\n              </c:CTextBlock>\n            </StackPanel>\n            <Grid.ColumnDefinitions>\n              <ColumnDefinition />\n              <ColumnDefinition />\n            </Grid.ColumnDefinitions>\n            <Grid.RowDefinitions>\n              <RowDefinition />\n            </Grid.RowDefinitions>\n          </Grid>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Here's another:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"First\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Second:\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Fee\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Fie\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Foe\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Third\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Same thing but with paragraphs:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"First\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Second:\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Fee\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Fie\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Foe\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Third\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"This was an error in Markdown 1.0.1:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"this\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"sub\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\" that\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Mixing list\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"1.\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"one-one\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <c:CRun Text=\"2.\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"one-two inlist 1 inlist 2 inline 3 inline 4\" />\n          </c:CTextBlock>\n          <Border Classes=\"CodeBlock\">\n            <Border.Child>\n              <ScrollViewer Classes=\"CodeBlock\">\n                <ScrollViewer.Content>\n                  <TextBlock Text=\"as code\" Classes=\"CodeBlock\" />\n                </ScrollViewer.Content>\n              </ScrollViewer>\n            </Border.Child>\n          </Border>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"two\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"three\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"four\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"five\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"six\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"▪\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"seven\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"eight\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"eight\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"nine\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Enhanced syntax alphabet order.\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"ab. foo\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"a.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"bar ab. foo2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"b.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"bar2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"c.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foo3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"3\">\n      <c:CRun Text=\"d.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"3\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"bar3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Enhanced syntax roman order.\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"yes, we can. no, i can.\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"i.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"TwoLines\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"i.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"TwoLines\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"i.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one yes, we can\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"TwoLines\" />\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"iiii, one\" />\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n      <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"two\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"code\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"three\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <Border Classes=\"Blockquote\" xmlns=\"\">\n    <Border.Child>\n      <StackPanel Classes=\"Blockquote\">\n        <c:CTextBlock Classes=\"Paragraph\">\n          <c:CRun Text=\"quote\" />\n        </c:CTextBlock>\n      </StackPanel>\n    </Border.Child>\n  </Border>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"four\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Heading1\">\n    <c:CRun Text=\"head\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"four\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"head\" />\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n      <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"two\" />\n      </c:CTextBlock>\n      <Border Classes=\"CodeBlock\">\n        <Border.Child>\n          <ScrollViewer Classes=\"CodeBlock\">\n            <ScrollViewer.Content>\n              <TextBlock Text=\"code\" Classes=\"CodeBlock\" />\n            </ScrollViewer.Content>\n          </ScrollViewer>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"three\" />\n      </c:CTextBlock>\n      <Border Classes=\"Blockquote\">\n        <Border.Child>\n          <StackPanel Classes=\"Blockquote\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"quote\" />\n            </c:CTextBlock>\n          </StackPanel>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"3\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"3\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"four\" />\n      </c:CTextBlock>\n      <c:CTextBlock Classes=\"Heading1\">\n        <c:CRun Text=\"head\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"4\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"4\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"four\" />\n      </c:CTextBlock>\n      <c:CTextBlock Classes=\"Heading2\">\n        <c:CRun Text=\"head\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.Md/Out/UnitTestMd.Transform_givenLists2_generatesExpectedResult.approved.txt",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:m=\"https://github.com/whistyun/Markdown.Avalonia.Tight\" xmlns:ma=\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\" xmlns:ma2=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"First we have a simple numeric list\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Alpha\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Beta\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Gamma\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"3\">\n      <c:CRun Text=\"4.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"3\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Delta\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Then we have a simple unordered list\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Han\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Leia\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Luke\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"3\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"3\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Obiwan\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Unordered\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Asterisks tight:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Asterisks loose:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Pluses tight:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Pluses loose:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Minuses tight:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Minuses loose:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Ordered\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Tight:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"First\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Second\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Third\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"and:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"One\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Two\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Three\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Loose using tabs:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"First\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Second\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Third\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"and using spaces:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"One\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Two\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Three\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Multiple paragraphs:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Item 1, graf one.\" />\n      </c:CTextBlock>\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\" Item 2. graf two. The quick brown fox jumped over the lazy dog's back.\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Item 2.\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Item 3.\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Nested\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Tab\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Tab\" />\n          </c:CTextBlock>\n          <Grid Classes=\"List\">\n            <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n              <c:CRun Text=\"•\" />\n            </c:CTextBlock>\n            <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n              <c:CTextBlock Classes=\"Paragraph\">\n                <c:CRun Text=\"Tab\" />\n              </c:CTextBlock>\n            </StackPanel>\n            <Grid.ColumnDefinitions>\n              <ColumnDefinition />\n              <ColumnDefinition />\n            </Grid.ColumnDefinitions>\n            <Grid.RowDefinitions>\n              <RowDefinition />\n            </Grid.RowDefinitions>\n          </Grid>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Here's another:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"First\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Second:\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Fee\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Fie\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Foe\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Third\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Same thing but with paragraphs:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"First\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Second:\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Fee\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Fie\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Foe\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Third\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"This was an error in Markdown 1.0.1:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"this\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"sub\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\" that\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one-two\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one-three\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"two\" />\n          </c:CTextBlock>\n          <Grid Classes=\"List\">\n            <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n              <c:CRun Text=\"•\" />\n            </c:CTextBlock>\n            <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n              <c:CTextBlock Classes=\"Paragraph\">\n                <c:CRun Text=\"three\" />\n              </c:CTextBlock>\n              <Grid Classes=\"List\">\n                <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n                  <c:CRun Text=\"•\" />\n                </c:CTextBlock>\n                <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n                  <c:CTextBlock Classes=\"Paragraph\">\n                    <c:CRun Text=\"four\" />\n                  </c:CTextBlock>\n                </StackPanel>\n                <Grid.ColumnDefinitions>\n                  <ColumnDefinition />\n                  <ColumnDefinition />\n                </Grid.ColumnDefinitions>\n                <Grid.RowDefinitions>\n                  <RowDefinition />\n                </Grid.RowDefinitions>\n              </Grid>\n            </StackPanel>\n            <Grid.ColumnDefinitions>\n              <ColumnDefinition />\n              <ColumnDefinition />\n            </Grid.ColumnDefinitions>\n            <Grid.RowDefinitions>\n              <RowDefinition />\n            </Grid.RowDefinitions>\n          </Grid>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"eine\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"eine-twei\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"eine-drei\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"1.\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"twei\" />\n          </c:CTextBlock>\n          <Grid Classes=\"List\">\n            <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n              <c:CRun Text=\"1.\" />\n            </c:CTextBlock>\n            <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n              <c:CTextBlock Classes=\"Paragraph\">\n                <c:CRun Text=\"drei\" />\n              </c:CTextBlock>\n              <Grid Classes=\"List\">\n                <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n                  <c:CRun Text=\"1.\" />\n                </c:CTextBlock>\n                <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n                  <c:CTextBlock Classes=\"Paragraph\">\n                    <c:CRun Text=\"vier\" />\n                  </c:CTextBlock>\n                </StackPanel>\n                <Grid.ColumnDefinitions>\n                  <ColumnDefinition />\n                  <ColumnDefinition />\n                </Grid.ColumnDefinitions>\n                <Grid.RowDefinitions>\n                  <RowDefinition />\n                </Grid.RowDefinitions>\n              </Grid>\n            </StackPanel>\n            <Grid.ColumnDefinitions>\n              <ColumnDefinition />\n              <ColumnDefinition />\n            </Grid.ColumnDefinitions>\n            <Grid.RowDefinitions>\n              <RowDefinition />\n            </Grid.RowDefinitions>\n          </Grid>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.Md/Out/UnitTestMd.Transform_givenLists3_generatesExpectedResult.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"alphabet: \" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"a.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"b.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"c.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"3\">\n      <c:CRun Text=\"d.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"3\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"4\">\n      <c:CRun Text=\"e.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"4\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"5\">\n      <c:CRun Text=\"f.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"5\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"6\">\n      <c:CRun Text=\"g.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"6\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"7\">\n      <c:CRun Text=\"h.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"7\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"8\">\n      <c:CRun Text=\"i.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"8\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"9\">\n      <c:CRun Text=\"j.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"9\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"10\">\n      <c:CRun Text=\"k.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"10\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"11\">\n      <c:CRun Text=\"l.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"11\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"12\">\n      <c:CRun Text=\"m.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"12\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"13\">\n      <c:CRun Text=\"n.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"13\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"14\">\n      <c:CRun Text=\"o.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"14\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"15\">\n      <c:CRun Text=\"p.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"15\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"16\">\n      <c:CRun Text=\"q.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"16\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"17\">\n      <c:CRun Text=\"r.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"17\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"18\">\n      <c:CRun Text=\"s.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"18\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"19\">\n      <c:CRun Text=\"t.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"19\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"20\">\n      <c:CRun Text=\"u.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"20\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"21\">\n      <c:CRun Text=\"v.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"21\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"22\">\n      <c:CRun Text=\"w.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"22\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"23\">\n      <c:CRun Text=\"x.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"23\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"24\">\n      <c:CRun Text=\"y.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"24\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"25\">\n      <c:CRun Text=\"z.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"25\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"26\">\n      <c:CRun Text=\"aa.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"26\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"27\">\n      <c:CRun Text=\"ab.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"27\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"28\">\n      <c:CRun Text=\"ac.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"28\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"29\">\n      <c:CRun Text=\"ad.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"29\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"30\">\n      <c:CRun Text=\"ae.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"30\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"31\">\n      <c:CRun Text=\"af.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"31\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"32\">\n      <c:CRun Text=\"ag.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"32\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"33\">\n      <c:CRun Text=\"ah.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"33\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"34\">\n      <c:CRun Text=\"ai.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"34\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"35\">\n      <c:CRun Text=\"aj.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"35\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"36\">\n      <c:CRun Text=\"ak.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"36\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"37\">\n      <c:CRun Text=\"al.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"37\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"38\">\n      <c:CRun Text=\"am.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"38\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"39\">\n      <c:CRun Text=\"an.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"39\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"40\">\n      <c:CRun Text=\"ao.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"40\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"41\">\n      <c:CRun Text=\"ap.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"41\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"42\">\n      <c:CRun Text=\"aq.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"42\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"43\">\n      <c:CRun Text=\"ar.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"43\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"44\">\n      <c:CRun Text=\"as.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"44\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"45\">\n      <c:CRun Text=\"at.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"45\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"46\">\n      <c:CRun Text=\"au.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"46\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"47\">\n      <c:CRun Text=\"av.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"47\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"48\">\n      <c:CRun Text=\"aw.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"48\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"49\">\n      <c:CRun Text=\"ax.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"49\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"50\">\n      <c:CRun Text=\"ay.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"50\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"51\">\n      <c:CRun Text=\"az.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"51\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"52\">\n      <c:CRun Text=\"ba.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"52\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"roman: \" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"i.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"ii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"iii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"3\">\n      <c:CRun Text=\"iv.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"3\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"4\">\n      <c:CRun Text=\"v.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"4\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"5\">\n      <c:CRun Text=\"vi.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"5\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"6\">\n      <c:CRun Text=\"vii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"6\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"7\">\n      <c:CRun Text=\"viii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"7\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"8\">\n      <c:CRun Text=\"ix.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"8\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"9\">\n      <c:CRun Text=\"x.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"9\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"10\">\n      <c:CRun Text=\"xi.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"10\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"11\">\n      <c:CRun Text=\"xii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"11\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"12\">\n      <c:CRun Text=\"xiii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"12\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"13\">\n      <c:CRun Text=\"xiv.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"13\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"14\">\n      <c:CRun Text=\"xv.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"14\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"15\">\n      <c:CRun Text=\"xvi.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"15\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"16\">\n      <c:CRun Text=\"xvii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"16\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"17\">\n      <c:CRun Text=\"xviii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"17\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"18\">\n      <c:CRun Text=\"xix.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"18\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"19\">\n      <c:CRun Text=\"xx.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"19\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"20\">\n      <c:CRun Text=\"xxi.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"20\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"21\">\n      <c:CRun Text=\"xxii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"21\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"22\">\n      <c:CRun Text=\"xxiii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"22\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"23\">\n      <c:CRun Text=\"xxiv.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"23\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"24\">\n      <c:CRun Text=\"xxv.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"24\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"25\">\n      <c:CRun Text=\"xxvi.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"25\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"26\">\n      <c:CRun Text=\"xxvii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"26\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"27\">\n      <c:CRun Text=\"xxviii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"27\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"28\">\n      <c:CRun Text=\"xxix.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"28\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"29\">\n      <c:CRun Text=\"xxx.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"29\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"30\">\n      <c:CRun Text=\"xxxi.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"30\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"31\">\n      <c:CRun Text=\"xxxii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"31\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"32\">\n      <c:CRun Text=\"xxxiii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"32\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"33\">\n      <c:CRun Text=\"xxxiv.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"33\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"34\">\n      <c:CRun Text=\"xxxv.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"34\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"35\">\n      <c:CRun Text=\"xxxvi.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"35\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"36\">\n      <c:CRun Text=\"xxxvii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"36\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"37\">\n      <c:CRun Text=\"xxxviii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"37\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"38\">\n      <c:CRun Text=\"xxxix.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"38\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"39\">\n      <c:CRun Text=\"xl.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"39\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"40\">\n      <c:CRun Text=\"xli.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"40\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"41\">\n      <c:CRun Text=\"xlii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"41\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"42\">\n      <c:CRun Text=\"xliii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"42\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"43\">\n      <c:CRun Text=\"xliv.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"43\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"44\">\n      <c:CRun Text=\"xlv.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"44\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"45\">\n      <c:CRun Text=\"xlvi.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"45\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"46\">\n      <c:CRun Text=\"xlvii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"46\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"47\">\n      <c:CRun Text=\"xlviii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"47\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"48\">\n      <c:CRun Text=\"xlix.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"48\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"49\">\n      <c:CRun Text=\"l.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"49\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"50\">\n      <c:CRun Text=\"li.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"50\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.Md/Out/UnitTestMd.Transform_givenMixing2_generatesExpectedResult.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"abcd\" />\n  </c:CTextBlock>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"* one&#xA;* two&#xA;* three\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"abcd\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n      <Border Classes=\"CodeBlock\">\n        <Border.Child>\n          <ScrollViewer Classes=\"CodeBlock\">\n            <ScrollViewer.Content>\n              <TextBlock Text=\"::: plugin&#xA;parameter&#xA;:::\" Classes=\"CodeBlock\" />\n            </ScrollViewer.Content>\n          </ScrollViewer>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"two *three\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"one-two\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"three four\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"abcd\" />\n  </c:CTextBlock>\n  <Border Classes=\"CodeBlock,NoContainer\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"::: plugin&#xA;* one&#xA;* two&#xA;* three&#xA;:::&#xA;\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.Md/Out/UnitTestMd.Transform_givenMixing_generatesExpectedResult.approved.txt",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:m=\"https://github.com/whistyun/Markdown.Avalonia.Tight\" xmlns:ma=\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\" xmlns:ma2=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Heading1\">\n    <c:CRun Text=\"Markdown.Xaml\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Markdown XAML is a port of the popular \" />\n    <c:CItalic>\n      <c:CRun Text=\"MarkdownSharp\" />\n    </c:CItalic>\n    <c:CRun Text=\" Markdown processor, but with one very significant difference: Instead of rendering to a string containing HTML, it renders to a FlowDocument suitable for embedding into a WPF window or usercontrol.\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Features\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"MarkDown.Xaml has a number of convenient features\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"The engine itself is a single file, for easy inclusion in your own projects\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Code for the engine is structured in the same manner as the original MarkdownSharp\" />\n        <c:CLineBreak Text=\"&#xA;\" />\n        <c:CRun Text=\"If there are any bug fixes to the regular expressions in MarkdownSharp, merging those fixes in the Markdown.Xaml should be straightforward\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Includes a \" />\n        <c:CCode>\n          <c:CRun Text=\"TextToFlowDocumentConverter\" />\n        </c:CCode>\n        <c:CRun Text=\" to make it easy to bind Markdown text\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Markdown capabilities and customizables styles\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Links \" />\n        <c:CHyperlink CommandParameter=\"https://www.google.com\">\n          <c:CRun Text=\"Go to Google!\" />\n        </c:CHyperlink>\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Links with title \" />\n        <c:CHyperlink CommandParameter=\"https://www.google.com\">\n          <c:CRun Text=\"Go to Google!\" />\n        </c:CHyperlink>\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Remote images\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CImage />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CImage Classes=\"blue\" />\n    <c:CImage Classes=\"cyan\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Local images\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CImage />\n    <c:CRun Text=\" \" />\n    <c:CImage />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Table\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"table begin string\" />\n  </c:CTextBlock>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"3\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a1234567890\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"1\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b1234567890\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"2\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c1234567890\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"3\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d1234567890\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"A\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"1\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"C\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"3\" Grid.Row=\"3\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"あ\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"1\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"い\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"2\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"う\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"3\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"え\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"table end string\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Code\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Markdown.Xaml support \" />\n    <c:CCode>\n      <c:CRun Text=\"inline code\" />\n    </c:CCode>\n  </c:CTextBlock>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"#include &lt;stdio.h&gt;&#xA;int main()&#xA;{&#xA;   // printf() displays the string inside quotation&#xA;   printf(&quot;Hello, World!&quot;);&#xA;   return 0;&#xA;}\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Separator\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Blockquote\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <Border Classes=\"Blockquote\" xmlns=\"\">\n    <Border.Child>\n      <StackPanel Classes=\"Blockquote\">\n        <c:CTextBlock Classes=\"Heading2\">\n          <c:CRun Text=\"Features\" />\n        </c:CTextBlock>\n        <c:CTextBlock Classes=\"Paragraph\">\n          <c:CRun Text=\"MarkDown.Xaml has a number of convenient features\" />\n        </c:CTextBlock>\n        <Grid Classes=\"List\">\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"The engine itself is a single file, for easy inclusion in your own projects\" />\n            </c:CTextBlock>\n          </StackPanel>\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"Code for the engine is structured in the same manner as the original MarkdownSharp \" />\n            </c:CTextBlock>\n          </StackPanel>\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"Includes a \" />\n              <c:CCode>\n                <c:CRun Text=\"TextToFlowDocumentConverter\" />\n              </c:CCode>\n              <c:CRun Text=\" to make it easy to bind Markdown text\" />\n            </c:CTextBlock>\n          </StackPanel>\n          <Grid.ColumnDefinitions>\n            <ColumnDefinition />\n            <ColumnDefinition />\n          </Grid.ColumnDefinitions>\n          <Grid.RowDefinitions>\n            <RowDefinition />\n            <RowDefinition />\n            <RowDefinition />\n          </Grid.RowDefinitions>\n        </Grid>\n      </StackPanel>\n    </Border.Child>\n  </Border>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"What is this Demo?\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"This demo application shows MarkDown.Xaml in use - as you make changes to the left pane, the rendered MarkDown will appear in the right pane.\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Heading3\">\n    <c:CRun Text=\"Source\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Review the source for this demo to see how MarkDown.Xaml works in practice, how to use the TextToFlowDocumentConverter, and how to style the output to appear the way you desire.\" />\n  </c:CTextBlock>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.Md/Out/UnitTestMd.Transform_givenTables1_generatesExpectedResult.approved.txt",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:m=\"https://github.com/whistyun/Markdown.Avalonia.Tight\" xmlns:ma=\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\" xmlns:ma2=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"firstTable\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"asdf\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"3\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"1\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"2\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"3\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"1\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"2\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"3\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"3\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"4\" Grid.Row=\"0\" />\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"1\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"2\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"3\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"4\" Grid.Row=\"1\" />\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"1\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"2\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"3\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"4\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"e\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"3\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"4\" Grid.Row=\"0\" />\n        <Border Classes=\"TableHeader\" Grid.Column=\"5\" Grid.Row=\"0\" />\n        <Border Classes=\"TableHeader\" Grid.Column=\"6\" Grid.Row=\"0\" />\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\" Grid.ColumnSpan=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"A\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"3\" Grid.Row=\"1\" Grid.ColumnSpan=\"2\" Grid.RowSpan=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"C\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"5\" Grid.Row=\"1\" />\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"6\" Grid.Row=\"1\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"5\" Grid.Row=\"2\" Grid.ColumnSpan=\"2\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"あ\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"1\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"い\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"う\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"4\" Grid.ColumnSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"5\" Grid.Row=\"4\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"6\" Grid.Row=\"4\" />\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"5\" />\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"1\" Grid.Row=\"5\" />\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"2\" Grid.Row=\"5\" />\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"5\" Grid.Row=\"5\" />\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"6\" Grid.Row=\"5\" />\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\" />\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\" />\n        <Border Classes=\"TableHeader\" Grid.Column=\"3\" Grid.Row=\"0\" />\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"alpha\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"1\" Grid.Row=\"1\" />\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"2\" Grid.Row=\"1\" />\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"3\" Grid.Row=\"1\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"beta\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"gamma\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"2\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"2\" />\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"3\" Grid.ColumnSpan=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"delta\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"3\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"epsilon\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"3\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1-1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"1\" Grid.Row=\"1\" Grid.ColumnSpan=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1-2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"2\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"2-2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"2\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"2\" />\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"3\" />\n        <Border Classes=\"OddTableRow\" Grid.Column=\"3\" Grid.Row=\"3\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"4\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"4-3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"4\" />\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"1\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"3\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"6\" Grid.ColumnSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"6-1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"6\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"6-3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"6\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"6-4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"7\" Grid.ColumnSpan=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"7-1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"3\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1-1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"1\" Grid.Row=\"1\" Grid.ColumnSpan=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1-2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"2\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"2-2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"2\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"2\" />\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"3\" />\n        <Border Classes=\"OddTableRow\" Grid.Column=\"3\" Grid.Row=\"3\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"4\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"4-3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"4\" />\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"1\" Grid.Row=\"5\" />\n        <Border Classes=\"OddTableRow\" Grid.Column=\"3\" Grid.Row=\"5\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"6\" Grid.ColumnSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"6-1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"6\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"6-3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"6\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"6-4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"7\" Grid.ColumnSpan=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"7-1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"3\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"1\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"2\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"3\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"1\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"2\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"3\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"3\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"4\" Grid.Row=\"0\" />\n        <Border Classes=\"TableHeader\" Grid.Column=\"5\" Grid.Row=\"0\" />\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\" Grid.ColumnSpan=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"A\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"3\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"4\" Grid.Row=\"1\" Grid.ColumnSpan=\"2\" Grid.RowSpan=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"C\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"あ\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"1\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"い\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"う\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"3\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"え\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"4\" Grid.ColumnSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"2\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"3\" Grid.Row=\"4\" />\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n              <c:CLineBreak Text=\"&#xA;\" />\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\" />\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"alpha\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"1\" Grid.Row=\"1\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"be\" />\n              <c:CLineBreak Text=\"&#xA;\" />\n              <c:CRun Text=\"ta\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"gamma\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"\\a. delta\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"1\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"epsilon\" />\n              <c:CLineBreak Text=\"&#xA;\" />\n              <c:CRun Text=\"kappa?\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"3\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a1234567890\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"1\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b1234567890\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"2\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c1234567890\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"3\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d1234567890\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"2\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"A\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"3\" Grid.ColumnSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"C\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"あ\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"1\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"い\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"2\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"う\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"3\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"え\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\" Grid.ColumnSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\" Grid.RowSpan=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"alpha\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"1\" Grid.Row=\"1\" Grid.ColumnSpan=\"2\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"beta\" />\n              <c:CLineBreak Text=\"&#xA;\" />\n              <c:CRun Text=\"Gamma\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"3\" Grid.Row=\"1\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"Farms\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"1\" Grid.Row=\"3\" Grid.RowSpan=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"alpha\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"3\" Grid.ColumnSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"bar3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"foo3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"foo3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"5\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"delta\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"foo3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"3\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"foo3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"1\" Grid.Row=\"6\" Grid.ColumnSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"bar3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"3\" Grid.Row=\"6\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"foo3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.Md/Out/UnitTestMd.Transform_givenTest1_generatesExpectedResult.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Heading1\">\n    <c:CRun Text=\"Header 1\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, hendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit consectetur faucibus quis a urna. \" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Header 2\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, hendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit consectetur faucibus quis a urna. \" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Heading1\">\n    <c:CRun Text=\"Header Level 1\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, hendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit consectetur faucibus quis a urna. \" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Header Level 2\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, hendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit consectetur faucibus quis a urna. \" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Heading3\">\n    <c:CRun Text=\"Header Level 3\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, hendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit consectetur faucibus quis a urna. \" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Heading4\">\n    <c:CRun Text=\"Header Level 4\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, hendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit consectetur faucibus quis a urna. \" />\n  </c:CTextBlock>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.Md/Out/UnitTestMd.Transform_givenTextStyles_generatesExpectedResult.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CItalic>\n      <c:CRun Text=\"This text will be italic\" />\n    </c:CItalic>\n    <c:CRun Text=\" \" />\n    <c:CBold>\n      <c:CRun Text=\"This text will be bold\" />\n    </c:CBold>\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CStrikethrough IsStrikethrough=\"True\">\n      <c:CRun Text=\"This text will be striketrhough\" />\n    </c:CStrikethrough>\n    <c:CRun Text=\" \" />\n    <c:CUnderline IsUnderline=\"True\">\n      <c:CRun Text=\"This text will be underline\" />\n    </c:CUnderline>\n  </c:CTextBlock>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.Md/Texts/Blockquite.md",
    "content": "﻿> ## Features ##\n> MarkDown.Xaml has a number of convenient features\n> \n> * The engine itself is a single file, for easy inclusion in your own projects\n> * Code for the engine is structured in the same manner as the original MarkdownSharp  \n> * Includes a `TextToFlowDocumentConverter` to make it easy to bind Markdown text\n\n> ## Features ##\n> MarkDown.Xaml has a number of convenient features\n> \n> * The engine itself is a single file, for easy inclusion in your own projects\n> * Code for the engine is structured in the same manner as the original MarkdownSharp  \n> * Includes a `TextToFlowDocumentConverter` to make it easy to bind Markdown text"
  },
  {
    "path": "tests/UnitTest.Md/Texts/Codes.md",
    "content": "﻿# ` ``` `\n\n````\n```cs\npublic void Main(){\n    Console.WriteLine(\"`Hello World`\");\n}\n```\n````\n\n```\npublic void Main(){\n    Console.WriteLine(\"`Hello World`\");\n}\n```\n\n> ```\n> public void Main(){\n>     Console.WriteLine(\"`Hello World`\");\n> }\n> ```\n\n   ```\n   public void Main(){\n       Console.WriteLine(\"`Hello World`\");\n   }\n   ```\n\n\n    ```cs\n    public void Main(){\n        Console.WriteLine(\"`Hello World`\");\n    }\n    ```\n\n* ```\n  public void Main(){\n\n\n\n\n  \n\n\n\n\n  }\n  ```\n\n* * *\n\n+ one\n  ```\n  public void Main(){\n\n\n\n\n  \n\n\n\n\n  }\n  ```\n\n= = =\n\n+ one\n\n  ```\n  public void Main(){\n\n\n\n\n  \n\n\n\n\n  }\n  ```\n\n# Indent\n\n    abcd\n    efgh\n\n---\n\n     abcd\n    efgh\n\n---\n\n    abcd\n     efgh\n     \n     ijkl\n\n    opqr\n    \n---\n\n>     asdf\n>      ghij\n\n*   \n      public void Main(){\n\n\n\n\n  \n\n\n\n\n      }\n\n* * *\n\n+ one\n      public void Main(){\n\n\n\n\n  \n\n\n\n\n      }\n\n* * *\n\n+ one\n\n      public void Main(){\n\n\n\n\n  \n\n\n\n\n      }\n\n* * *\n\n```c\npublic void Main(){\n    Console.WriteLine(\"`Hello World`\");\n}\n```\n\n```cs\npublic void Main(){\n    Console.WriteLine(\"`Hello World`\");\n}\n```\n\n```java\npublic void Main(){\n    Console.WriteLine(\"`Hello World`\");\n}\n```\n\n```html\npublic void Main(){\n    Console.WriteLine(\"`Hello World`\");\n}\n```"
  },
  {
    "path": "tests/UnitTest.Md/Texts/ContainerBlock.md",
    "content": "﻿::::\n:::cs\npublic void Main(){\n    Console.WriteLine(\":Hello World:\");\n}\n:::\n::::\n\n:::\npublic void Main(){\n    Console.WriteLine(\":Hello World:\");\n}\n:::\n\n> :::\n> public void Main(){\n>     Console.WriteLine(\":Hello World:\");\n> }\n> :::\n\n   :::\n   public void Main(){\n       Console.WriteLine(\":Hello World:\");\n   }\n   :::\n\n\n    :::cs\n    public void Main(){\n        Console.WriteLine(\":Hello World:\");\n    }\n    :::\n\n* :::\n  public void Main(){\n\n\n\n\n  \n\n\n\n\n  }\n  :::\n\n* * *\n\n+ one\n  :::\n  public void Main(){\n\n\n\n\n  \n\n\n\n\n  }\n  :::\n\n= = =\n\n1. one\n\n   :::\n   public void Main(){\n \n \n \n \n   \n \n \n \n \n   }\n   :::\n\n===\n\n::: md\n\n* list1\n* list2\n\n```cs\n#define FooBar\n```\n:::"
  },
  {
    "path": "tests/UnitTest.Md/Texts/Emoji.md",
    "content": "﻿:smile:\n\nsmile:angry::smile:\n\n\\:angry:\n\n:unknown_missing_symbols:\n\n:lackoftxt"
  },
  {
    "path": "tests/UnitTest.Md/Texts/HorizontalRules.md",
    "content": "﻿Dashes:\n\n---\n\n ---\n \n  ---\n\n   ---\n\n\t---\n\n- - -\n\n - - -\n \n  - - -\n\n   - - -\n\n\t- - -\n\n\nAsterisks:\n\n***\n\n ***\n \n  ***\n\n   ***\n\n\t***\n\n* * *\n\n * * *\n \n  * * *\n\n   * * *\n\n\t* * *\n\n***\n\n *** \n\n  ***  \n\n* * *\n\n * * * \n\n  * * *  \n\n\nUnderscores:\n\n___\n\n ___\n \n  ___\n\n   ___\n\n    ___\n\n_ _ _\n\n _ _ _\n \n  _ _ _\n\n   _ _ _\n\n    _ _ _\n"
  },
  {
    "path": "tests/UnitTest.Md/Texts/Images.md",
    "content": "A remote ![image](http://placehold.it/350x150).\n\nImages side by side \n![imageleft](http://placehold.it/100x150/0000FF)![imageright](http://placehold.it/100x150/00FFFF)\n\n![imageright](http://placehold.it/100x150/00FFFF \"cyan\")\n\nA resource image ![image](RscImg.png).\nA local image ![image](ExtImg.png).\n"
  },
  {
    "path": "tests/UnitTest.Md/Texts/Links_inline_style.md",
    "content": "Just a [URL](/url/).\n\n[URL and title](/url/ \"title\").\n\n[URL and title](/url/  \"title preceded by two spaces\").\n\n[URL and title](/url/\t\"title preceded by a tab\").\n\n[URL and title](/url/ \"title has spaces afterward\"  ).\n\n[URL wrapped in angle brackets](</url/>).\n\n[URL w/ angle brackets + title](</url/> \"Here's the title\").\n\n[Empty]().\n\n[With parens in the URL](http://en.wikipedia.org/wiki/WIMP_(computing))\n\n(With outer parens and [parens in url](/foo(bar)))\n\n\n[With parens in the URL](/foo(bar) \"and a title\")\n\n(With outer parens and [parens in url](/foo(bar) \"and a title\"))\n"
  },
  {
    "path": "tests/UnitTest.Md/Texts/Lists1.md",
    "content": "﻿\nFirst we have a simple numeric list\n\n1. Alpha\n1. Beta\n2. Gamma\n3. Delta\n\nThen we have a simple unordered list\n\n* Han\n* Leia\n* Luke\n* Obiwan\n\n## Unordered\n\nAsterisks tight:\n\n*\tasterisk 1\n*\tasterisk 2\n*\tasterisk 3\n\n\nAsterisks loose:\n\n*\tasterisk 1\n\n*\tasterisk 2\n\n*\tasterisk 3\n\n*\t**bold**\n\n*\t*italic*\n\n*\t***bold italic***\n\n* * *\n\nPluses tight:\n\n+\tPlus 1\n+\tPlus 2\n+\tPlus 3\n\n\nPluses loose:\n\n+\tPlus 1\n\n+\tPlus 2\n\n+\tPlus 3\n\n* * *\n\n\nMinuses tight:\n\n-\tMinus 1\n-\tMinus 2\n-\tMinus 3\n\n\nMinuses loose:\n\n-\tMinus 1\n\n-\tMinus 2\n\n-\tMinus 3\n\n\n## Ordered\n\nTight:\n\n1.\tFirst\n2.\tSecond\n3.\tThird\n\nand:\n\n1. One\n2. Two\n3. Three\n\n\nLoose using tabs:\n\n1.\tFirst\n\n2.\tSecond\n\n3.\tThird\n\nand using spaces:\n\n1. One\n\n2. Two\n\n3. Three\n\nMultiple paragraphs:\n\n1.\tItem 1, graf one.\n\n\tItem 2. graf two. The quick brown fox jumped over the lazy dog's\n\tback.\n\t\n2.\tItem 2.\n\n3.\tItem 3.\n\n\n\n## Nested\n\n*\tTab\n\t*\tTab\n\t\t*\tTab\n\nHere's another:\n\n1. First\n2. Second:\n\t* Fee\n\t* Fie\n\t* Foe\n3. Third\n\nSame thing but with paragraphs:\n\n1. First\n\n2. Second:\n\t* Fee\n\t* Fie\n\t* Foe\n\n3. Third\n\n\nThis was an error in Markdown 1.0.1:\n\n*\tthis\n\n\t*\tsub\n\n\tthat\n\n\nMixing list\n\n1. one\n    1. one-one\n    1. one-two\n       inlist 1\n        inlist 2\n         inline 3\n          inline 4\n\n           as code\n2. two\n* three\n* four\n+ five\n+ six\n    + seven\n+ eight\n- eight\n- nine\n\nEnhanced syntax alphabet order.\n\nab. foo\na. bar\nab. foo2\na. bar2\na. foo3\na. bar3\n\nEnhanced syntax roman order.\n\nyes, we can.\nno, i can.\ni, one\n\n===\n\nii, one\n\n===\n\niii, one\nyes, we can\n\n===\n\niiii, one\n\n\n* * *\n* one\n* * *\n* one\n * * *\n* one\n  * * *\n* two\n```\ncode\n```\n* three\n> quote\n* four\n# head\n* four\n## head\n\n* * *\n* one\n   * * *\n* two\n ```\n code\n ```\n* three\n > quote\n* four\n # head\n* four\n ## head\n"
  },
  {
    "path": "tests/UnitTest.Md/Texts/Lists2.md",
    "content": "﻿\nFirst we have a simple numeric list\n1. Alpha\n1. Beta\n2. Gamma\n3. Delta\n\nThen we have a simple unordered list\n* Han\n* Leia\n* Luke\n* Obiwan\n\n## Unordered\n\nAsterisks tight:\n*\tasterisk 1\n*\tasterisk 2\n*\tasterisk 3\n\n\nAsterisks loose:\n*\tasterisk 1\n\n*\tasterisk 2\n\n*\tasterisk 3\n\n* * *\n\nPluses tight:\n+\tPlus 1\n+\tPlus 2\n+\tPlus 3\n\n\nPluses loose:\n+\tPlus 1\n\n+\tPlus 2\n\n+\tPlus 3\n\n* * *\n\n\nMinuses tight:\n-\tMinus 1\n-\tMinus 2\n-\tMinus 3\n\n\nMinuses loose:\n-\tMinus 1\n\n-\tMinus 2\n\n-\tMinus 3\n\n\n## Ordered\n\nTight:\n1.\tFirst\n2.\tSecond\n3.\tThird\n\nand:\n1. One\n2. Two\n3. Three\n\n\nLoose using tabs:\n1.\tFirst\n\n2.\tSecond\n\n3.\tThird\n\nand using spaces:\n1. One\n\n2. Two\n\n3. Three\n\nMultiple paragraphs:\n1.\tItem 1, graf one.\n\n\tItem 2. graf two. The quick brown fox jumped over the lazy dog's\n\tback.\n\t\n2.\tItem 2.\n\n3.\tItem 3.\n\n\n\n## Nested\n*\tTab\n\t*\tTab\n\t\t*\tTab\n\nHere's another:\n1. First\n2. Second:\n\t* Fee\n\t* Fie\n\t* Foe\n3. Third\n\nSame thing but with paragraphs:\n1. First\n\n2. Second:\n\t* Fee\n\t* Fie\n\t* Foe\n\n3. Third\n\n\nThis was an error in Markdown 1.0.1:\n*\tthis\n\n\t*\tsub\n\n\tthat\n\n\n* * * *\n\n* one\n * one-two\n* one-three\n  * two\n    * three\n      * four\n1. eine\n  1. eine-twei\n1. eine-drei\n   1. twei\n      1. drei\n         1. vier"
  },
  {
    "path": "tests/UnitTest.Md/Texts/Lists3.md",
    "content": "﻿alphabet:  \n\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\n\nroman:  \ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\n"
  },
  {
    "path": "tests/UnitTest.Md/Texts/Mixing.md",
    "content": "﻿# Markdown.Xaml #\n\nMarkdown XAML is a port of the popular *MarkdownSharp* Markdown processor, but \nwith one very significant difference: Instead of rendering to a string \ncontaining HTML, it renders to a FlowDocument suitable for embedding into a \nWPF window or usercontrol.\n\n## Features ##\n\nMarkDown.Xaml has a number of convenient features\n\n* The engine itself is a single file, for easy inclusion in your own projects\n* Code for the engine is structured in the same manner as the original MarkdownSharp  \nIf there are any bug fixes to the regular expressions in MarkdownSharp, merging those fixes in the Markdown.Xaml should be straightforward\n* Includes a `TextToFlowDocumentConverter` to make it easy to bind Markdown text\n\n\n## Markdown capabilities and customizables styles ##\n\n* Links [Go to Google!](https://www.google.com)\n* Links with title [Go to Google!](https://www.google.com \"google.\")\n* Remote images\n\n![image1](http://placehold.it/350x150)\n\n![imageleft](http://placehold.it/100x150/0000FF \"blue\")![imageright](http://placehold.it/100x150/00FFFF \"cyan\")\n\n* Local images\n\n![image](RscImg.png)\n![image](ExtImg.png)\n\n* Table\n\ntable begin string\n|a|b|c|d|\n|:-:|:-|-:|\n|a1234567890|b1234567890|c1234567890|d1234567890|\n|a|b|c|d|\n|A||C|\n|1|2|3|4|\n|あ|い|う|え|\ntable end string\n\n* Code\n\nMarkdown.Xaml support ```inline code ```\n\n```\n#include <stdio.h>\nint main()\n{\n   // printf() displays the string inside quotation\n   printf(\"Hello, World!\");\n   return 0;\n}\n```\n\n* Separator\n***\n\n* Blockquote\n\n> ## Features ##\n> MarkDown.Xaml has a number of convenient features\n> \n> * The engine itself is a single file, for easy inclusion in your own projects\n> * Code for the engine is structured in the same manner as the original MarkdownSharp  \n> * Includes a `TextToFlowDocumentConverter` to make it easy to bind Markdown text\n\n\n## What is this Demo? ##\n\nThis demo application shows MarkDown.Xaml in use - as you make changes to the \nleft pane, the rendered MarkDown will appear in the right pane.\n\n### Source ###\n\nReview the source for this demo to see how MarkDown.Xaml works in practice, how to use the TextToFlowDocumentConverter,\nand how to style the output to appear the way you desire.\n\n\n"
  },
  {
    "path": "tests/UnitTest.Md/Texts/Mixing2.md",
    "content": "﻿abcd\n```md\n* one\n* two\n* three\n```\n\nabcd\n* one\n  ```md\n  ::: plugin\n  parameter\n  :::\n  ```\n* two\n*three\n   * one-two\n   * three four\n\nabcd\n::: plugin\n* one\n* two\n* three\n:::"
  },
  {
    "path": "tests/UnitTest.Md/Texts/Tables.md",
    "content": "﻿\n|firstTable|\n|-|\n|asdf|\n\n|a|b|c|d|\n|--|:-|-:|:-:|\n|a|b|c|d|\n|a|b|c|d|\n\n|a|b|c|d|\n|--|:-|-:|:-:|\n|a|b|c|d|\n|a|b|c|d|e|\n\n|a|b|c|d|\n|:-:|:-|-:|\n|\\3.A|\\2/5.C|\n|1|2|3|\\2/2.4|\n|あ|い|う|\n|\\2. a|b\n\n| a   |\n| -----: | :-----: |\n| alpha |\n| beta  | gamma |\n|\\3. delta | epsilon |\n\n|column1| column2| column3| column4|\n|---|---|---|---|\n|/2. 1-1|\\3. 1-2|\n|/2. 2-2|\n| \n| | |/2. 4-3|\n| | | |\n|\\2. 6-1| 6-3|/2. 6-4|\n|\\3. 7-1|\n\n|column1| column2| column3| column4|\n|---|---|---|---|\n|/2. 1-1|\\3. 1-2|\n|/2. 2-2|\n||\n| | |/2. 4-3|\n||\n|\\2. 6-1| 6-3|/2. 6-4\n|\\3. 7-1\n\n\n---\n\n|a|b|c|d|\n--|:-|-:|:-:\na|b|c|d\na|b|c|d\n\n\na|b|c|d\n:-:|:-|-:\n\\3.A||\\2/4.C\n1|2|3|4\nあ|い|う|え\n\\2. a|b\n\n---\n\n| a\\nb   |\n| -----: | :-----: |\n| alpha |\n| be\\nta  | gamma |\n|\\a. delta | epsilon\\nkappa? |\n\n\n---\n\n|a|b|c|d|\n|:-:|:-|-:|\n|a1234567890|b1234567890|c1234567890|d1234567890|\n|a|/2.b|c|d|\n|A|\\2.C|\n|1|2|3|4|\n|あ|い|う|え|\n\n\n| column1| column2|\\2. column3|\n|---:|:---:|---:|---|\n|/4. alpha|/2\\2. beta\\nGamma|/2. Farms|\n|/3. alpha|\\2. bar3|\n| foo3| foo3|\n|/2. delta| foo3| foo3|\n|\\2. bar3| foo3|\n"
  },
  {
    "path": "tests/UnitTest.Md/Texts/Test1.md",
    "content": "﻿Header 1\n========\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, \nhendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit \nconsectetur faucibus quis a urna. \n\nHeader 2\n-----------\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, \nhendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit \nconsectetur faucibus quis a urna. \n\n# Header Level 1\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, \nhendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit \nconsectetur faucibus quis a urna. \n\n## Header Level 2\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, \nhendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit \nconsectetur faucibus quis a urna. \n\n### Header Level 3\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, \nhendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit \nconsectetur faucibus quis a urna. \n\n#### Header Level 4\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, \nhendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit \nconsectetur faucibus quis a urna. \n"
  },
  {
    "path": "tests/UnitTest.Md/Texts/Text_style.md",
    "content": "﻿*This text will be italic*\n**This text will be bold**\n\n~~This text will be striketrhough~~\n__This text will be underline__"
  },
  {
    "path": "tests/UnitTest.Md/UnitTest.Md.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <Import Project=\"..\\UnitTest.props\" />\n\n  <PropertyGroup>\n    <TargetFrameworks>$(TestTargetFrameworks)</TargetFrameworks>\n    <IsPackable>false</IsPackable>\n    <LangVersion>9</LangVersion>\n    <Nullable>disable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" Version=\"$(TestAvaloniaVersion)\" />\n    <PackageReference Include=\"Avalonia.Desktop\" Version=\"$(TestAvaloniaVersion)\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\ColorTextBlock.Avalonia\\ColorTextBlock.Avalonia.csproj\" />\n    <ProjectReference Include=\"..\\..\\Markdown.Avalonia.Tight\\Markdown.Avalonia.Tight.csproj\" />\n    <ProjectReference Include=\"..\\UnitTest.Base\\UnitTest.Base.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Update=\"Texts\\*\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "tests/UnitTest.Md/UnitTestMd.cs",
    "content": "using ApprovalTests;\nusing ApprovalTests.Reporters;\nusing Avalonia.Controls;\nusing NUnit.Framework;\nusing System.Linq;\nusing UnitTest.Base;\nusing UnitTest.Base.Utils;\n\nnamespace UnitTest.Md\n{\n    [UseReporter(typeof(DiffReporter))]\n    public class UnitTestMd : UnitTestBase\n    {\n        [Test]\n        [RunOnUI]\n        public void Transform_givenTest1_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Test1.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenLists1_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Lists1.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenLists2_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Lists2.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenLists3_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Lists3.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenTables1_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Tables.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenHorizontalRules_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"HorizontalRules.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenLinksInline_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Links_inline_style.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenTextStyles_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Text_style.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenImages_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Images.md\");\n            var markdown = new Markdown.Avalonia.Markdown() { AssetPathRoot = AssetPath };\n\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenBlockqoute_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Blockquite.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenMixing_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Mixing.md\");\n            var markdown = new Markdown.Avalonia.Markdown() { AssetPathRoot = AssetPath };\n\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenMixing2_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Mixing2.md\");\n            var markdown = new Markdown.Avalonia.Markdown() { AssetPathRoot = AssetPath };\n\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenCodes_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Codes.md\");\n            var markdown = new Markdown.Avalonia.Markdown() { AssetPathRoot = AssetPath };\n\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenContainer_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"ContainerBlock.md\");\n            var markdown = new Markdown.Avalonia.Markdown() { AssetPathRoot = AssetPath };\n\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenEmoji()\n        {\n            var text = Util.LoadText(\"Emoji.md\");\n            var markdown = new Markdown.Avalonia.Markdown() { AssetPathRoot = AssetPath };\n\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void CheckSwitch()\n        {\n            var markdown = new Markdown.Avalonia.Markdown\n            {\n                ContainerBlockHandler = new Markdown.Avalonia.ContainerSwitch() {\n                    { \"test\", new EmptyBorder(\"TestBorder1\")},\n                    { \"test2\", new EmptyBorder(\"TestBorder2\")},\n                }\n            };\n\n            {\n                var control1_1 = markdown.Transform(TextUtil.HereDoc(@\"\n                    ::: test{}\n                    some text\n                    :::\n                \"));\n                Assert.AreEqual(1, Util.FindControlsByClassName<Border>(control1_1, \"TestBorder1\").Count());\n            }\n\n            {\n                var control1_2 = markdown.Transform(TextUtil.HereDoc(@\"\n                    ::: test             []\n                    some text\n                    :::\n                \"));\n                Assert.AreEqual(1, Util.FindControlsByClassName<Border>(control1_2, \"TestBorder1\").Count());\n            }\n\n            {\n                var control2 = markdown.Transform(TextUtil.HereDoc(@\"\n                    :::    test2    ()\n                    some text\n                    :::\n                \"));\n                Assert.AreEqual(1, Util.FindControlsByClassName<Border>(control2, \"TestBorder2\").Count());\n            }\n\n        }\n\n\n        class EmptyBorder : Markdown.Avalonia.Utils.IContainerBlockHandler\n        {\n            public string ClassName { private set; get; }\n\n            public EmptyBorder(string classNm)\n            {\n                ClassName = classNm;\n            }\n\n            public Avalonia.Controls.Border ProvideControl(string assetPathRoot, string blockName, string lines)\n            {\n                var border = new Avalonia.Controls.Border();\n                border.Classes.Add(ClassName);\n\n                return border;\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "tests/UnitTest.MdHtml/.gitignore",
    "content": "Out/*.received.txt\nOut/*.bak\n"
  },
  {
    "path": "tests/UnitTest.MdHtml/Out/UnitTest.Button.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock>\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <Button IsEnabled=\"False\" Classes=\":disabled\" xmlns=\"\">\n          <Button.Content>\n            <StackPanel />\n          </Button.Content>\n        </Button>\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n    <c:CRun Text=\" \" />\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <Button IsEnabled=\"False\" Classes=\":disabled\" xmlns=\"\">\n          <Button.Content>\n            <StackPanel />\n          </Button.Content>\n        </Button>\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n    <c:CRun Text=\" \" />\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <Button IsEnabled=\"False\" Classes=\":disabled\" xmlns=\"\">\n          <Button.Content>\n            <StackPanel>\n              <c:CTextBlock>\n                <c:CRun Text=\"some text\" />\n              </c:CTextBlock>\n            </StackPanel>\n          </Button.Content>\n        </Button>\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n    <c:CRun Text=\" \" />\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <Button IsEnabled=\"False\" Classes=\":disabled\" xmlns=\"\">\n          <Button.Content>\n            <StackPanel>\n              <Border Classes=\"Center\">\n                <Border.Child>\n                  <StackPanel Classes=\"Center\">\n                    <c:CTextBlock Classes=\"Heading1\">\n                      <c:CRun Text=\"title\" />\n                    </c:CTextBlock>\n                  </StackPanel>\n                </Border.Child>\n              </Border>\n              <c:CTextBlock>\n                <c:CRun Text=\"description1 description2\" />\n              </c:CTextBlock>\n            </StackPanel>\n          </Button.Content>\n        </Button>\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n  </c:CTextBlock>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdHtml/Out/UnitTest.CodeBlock.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:a=\"https://github.com/avaloniaui/avaloniaedit\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <a:TextEditor IsReadOnly=\"True\" IsModified=\"True\" Text=\"plain text&#xA;Sub Test()&#xA;    Dim A As Long&#xA;    Dim B As Integer&#xA;End Sub&#xA;\" SelectedText=\"\" CaretOffset=\"0\" SelectionStart=\"0\" SelectionLength=\"0\" />\n    </Border.Child>\n  </Border>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <a:TextEditor IsReadOnly=\"True\" IsModified=\"True\" Tag=\"java\" Text=\"import java.lang.*;&#xA;public class Program {&#xA;    public static void main(String[] args) {&#xA;        System.out.println(&quot;Hello&quot;);&#xA;    }    &#xA;}&#xA;\" SelectedText=\"\" CaretOffset=\"0\" SelectionStart=\"0\" SelectionLength=\"0\" />\n    </Border.Child>\n  </Border>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <a:TextEditor IsReadOnly=\"True\" IsModified=\"True\" Text=\"NEMUI&#xA;ONAKASUITA&#xA;SHINDOI&#xA;\" SelectedText=\"\" CaretOffset=\"0\" SelectionStart=\"0\" SelectionLength=\"0\" />\n    </Border.Child>\n  </Border>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdHtml/Out/UnitTest.Details.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:m=\"https://github.com/whistyun/Markdown.Avalonia.Tight\" xmlns:ma=\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\" xmlns:ma2=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <Expander Classes=\":down\" xmlns=\"\">\n    <Expander.Content>\n      <StackPanel>\n        <c:CTextBlock Classes=\"Heading1\">\n          <c:CRun Text=\"Heading1\" />\n        </c:CTextBlock>\n        <Grid Classes=\"List\">\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"list item1\" />\n            </c:CTextBlock>\n          </StackPanel>\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"list item2\" />\n            </c:CTextBlock>\n          </StackPanel>\n          <Grid.ColumnDefinitions>\n            <ColumnDefinition />\n            <ColumnDefinition />\n          </Grid.ColumnDefinitions>\n          <Grid.RowDefinitions>\n            <RowDefinition />\n            <RowDefinition />\n          </Grid.RowDefinitions>\n        </Grid>\n      </StackPanel>\n    </Expander.Content>\n    <Expander.Header>\n      <StackPanel>\n        <c:CTextBlock>\n          <c:CRun Text=\"Spoiler warning \" />\n          <c:CHyperlink CommandParameter=\"https://www.google.com\" Classes=\"Hyperlink\">\n            <c:CRun Text=\"link\" />\n          </c:CHyperlink>\n        </c:CTextBlock>\n      </StackPanel>\n    </Expander.Header>\n  </Expander>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single,RuleSingle\" />\n  <Expander IsExpanded=\"True\" Classes=\":down,:expanded\" xmlns=\"\">\n    <Expander.Content>\n      <StackPanel>\n        <c:CTextBlock Classes=\"Heading1\">\n          <c:CRun Text=\"Heading1\" />\n        </c:CTextBlock>\n        <Grid Classes=\"List\">\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"list item1\" />\n            </c:CTextBlock>\n          </StackPanel>\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"list item2\" />\n            </c:CTextBlock>\n          </StackPanel>\n          <Grid.ColumnDefinitions>\n            <ColumnDefinition />\n            <ColumnDefinition />\n          </Grid.ColumnDefinitions>\n          <Grid.RowDefinitions>\n            <RowDefinition />\n            <RowDefinition />\n          </Grid.RowDefinitions>\n        </Grid>\n      </StackPanel>\n    </Expander.Content>\n    <Expander.Header>\n      <StackPanel>\n        <c:CTextBlock>\n          <c:CRun Text=\"Spoiler warning\" />\n        </c:CTextBlock>\n      </StackPanel>\n    </Expander.Header>\n  </Expander>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single,RuleSingle\" />\n  <Expander IsExpanded=\"False\" Classes=\":down\" xmlns=\"\">\n    <Expander.Content>\n      <StackPanel>\n        <c:CTextBlock Classes=\"Heading1\">\n          <c:CRun Text=\"Heading1\" />\n        </c:CTextBlock>\n        <Grid Classes=\"List\">\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"list item1\" />\n            </c:CTextBlock>\n          </StackPanel>\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"list item2\" />\n            </c:CTextBlock>\n          </StackPanel>\n          <Grid.ColumnDefinitions>\n            <ColumnDefinition />\n            <ColumnDefinition />\n          </Grid.ColumnDefinitions>\n          <Grid.RowDefinitions>\n            <RowDefinition />\n            <RowDefinition />\n          </Grid.RowDefinitions>\n        </Grid>\n      </StackPanel>\n    </Expander.Content>\n    <Expander.Header>\n      <StackPanel>\n        <c:CTextBlock>\n          <c:CRun Text=\"Spoiler warning\" />\n        </c:CTextBlock>\n      </StackPanel>\n    </Expander.Header>\n  </Expander>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdHtml/Out/UnitTest.InlineCode.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:m=\"https://github.com/whistyun/Markdown.Avalonia.Tight\" xmlns:ma=\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\" xmlns:ma2=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"An \" />\n    <c:CCode Classes=\"CodeSpan\">\n      <c:CRun Text=\"apple \" />\n    </c:CCode>\n    <c:CRun Text=\" is an editable fruit produced by an \" />\n    <c:CCode Classes=\"CodeSpan\">\n      <c:CRun Text=\"apple tree \" />\n    </c:CCode>\n    <c:CRun Text=\".\" />\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single,RuleSingle\" />\n  <c:CTextBlock>\n    <c:CCode Classes=\"CodeSpan\">\n      <c:CRun Text=\"Apple trees \" />\n    </c:CCode>\n    <c:CRun Text=\" are caltivated wordwide.\" />\n  </c:CTextBlock>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdHtml/Out/UnitTest.Input.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:m=\"https://github.com/whistyun/Markdown.Avalonia.Tight\" xmlns:ma=\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\" xmlns:ma2=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock>\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <TextBox Text=\"\" IsReadOnly=\"True\" Width=\"100\" SelectedText=\"\" UseFloatingWatermark=\"False\" Classes=\":empty\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n    <c:CRun Text=\" \" />\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <TextBox Text=\"\" IsReadOnly=\"True\" Width=\"98\" SelectedText=\"\" UseFloatingWatermark=\"False\" Classes=\":empty\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n    <c:CRun Text=\" \" />\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <TextBox Text=\"\" IsReadOnly=\"True\" Width=\"100\" SelectedText=\"\" UseFloatingWatermark=\"False\" Classes=\":empty\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n    <c:CRun Text=\" \" />\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <TextBox Text=\"textbox\" IsReadOnly=\"True\" SelectedText=\"\" UseFloatingWatermark=\"False\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single,RuleSingle\" />\n  <c:CTextBlock>\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <Button Content=\"\" IsEnabled=\"False\" Width=\"100\" Classes=\":disabled\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n    <c:CRun Text=\" \" />\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <Button Content=\"\" IsEnabled=\"False\" Width=\"98\" Classes=\":disabled\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n    <c:CRun Text=\" \" />\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <Button Content=\"\" IsEnabled=\"False\" Width=\"100\" Classes=\":disabled\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n    <c:CRun Text=\" \" />\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <Button Content=\"button\" IsEnabled=\"False\" Classes=\":disabled\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single,RuleSingle\" />\n  <c:CTextBlock>\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <Button Content=\"\" IsEnabled=\"False\" Width=\"100\" Classes=\":disabled\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n    <c:CRun Text=\" \" />\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <Button Content=\"\" IsEnabled=\"False\" Width=\"98\" Classes=\":disabled\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n    <c:CRun Text=\" \" />\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <Button Content=\"\" IsEnabled=\"False\" Width=\"100\" Classes=\":disabled\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n    <c:CRun Text=\" \" />\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <Button Content=\"button\" IsEnabled=\"False\" Classes=\":disabled\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single,RuleSingle\" />\n  <c:CTextBlock>\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <Button Content=\"\" IsEnabled=\"False\" Width=\"100\" Classes=\":disabled\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n    <c:CRun Text=\" \" />\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <Button Content=\"\" IsEnabled=\"False\" Width=\"98\" Classes=\":disabled\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n    <c:CRun Text=\" \" />\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <Button Content=\"\" IsEnabled=\"False\" Width=\"100\" Classes=\":disabled\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n    <c:CRun Text=\" \" />\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <Button Content=\"button\" IsEnabled=\"False\" Classes=\":disabled\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single,RuleSingle\" />\n  <c:CTextBlock>\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <RadioButton IsEnabled=\"False\" Classes=\":unchecked,:disabled\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n    <c:CRun Text=\" \" />\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <RadioButton IsChecked=\"True\" IsEnabled=\"False\" Classes=\":disabled,:checked\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n    <c:CRun Text=\" \" />\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <RadioButton IsChecked=\"True\" IsEnabled=\"False\" Classes=\":disabled,:checked\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single,RuleSingle\" />\n  <c:CTextBlock>\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <CheckBox IsEnabled=\"False\" Classes=\":unchecked,:disabled\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n    <c:CRun Text=\" \" />\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <CheckBox IsChecked=\"True\" IsEnabled=\"False\" Classes=\":disabled,:checked\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n    <c:CRun Text=\" \" />\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <CheckBox IsChecked=\"True\" IsEnabled=\"False\" Classes=\":disabled,:checked\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single,RuleSingle\" />\n  <c:CTextBlock>\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <Slider Minimum=\"0\" Maximum=\"100\" Value=\"50\" IsEnabled=\"False\" Width=\"100\" Classes=\":horizontal,:disabled\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n    <c:CRun Text=\" \" />\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <Slider Minimum=\"0\" Maximum=\"200\" Value=\"50\" IsEnabled=\"False\" Width=\"100\" Classes=\":horizontal,:disabled\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n    <c:CRun Text=\" \" />\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <Slider Minimum=\"50\" Maximum=\"100\" Value=\"90\" IsEnabled=\"False\" Width=\"100\" Classes=\":horizontal,:disabled\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single,RuleSingle\" />\n  <c:CTextBlock>\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <TextBox Text=\"asasdfasdfsadfasdfasd&#xA;&#xA;sd&#xA;&#xA;df\" AcceptsReturn=\"True\" AcceptsTab=\"True\" SelectedText=\"\" UseFloatingWatermark=\"False\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single,RuleSingle\" />\n  <c:CTextBlock>\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <TextBox Text=\"afsadfasdfasd&#xA;&#xA;sd&#xA;&#xA;df\" AcceptsReturn=\"True\" AcceptsTab=\"True\" Width=\"210\" Height=\"42\" SelectedText=\"\" UseFloatingWatermark=\"False\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n  </c:CTextBlock>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdHtml/Out/UnitTest.List.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:m=\"https://github.com/whistyun/Markdown.Avalonia.Tight\" xmlns:ma=\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\" xmlns:ma2=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <Grid xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock>\n        <c:CRun Text=\"asdf \" />\n        <c:CBold Classes=\"Bold\">\n          <c:CRun Text=\"fdsa \" />\n        </c:CBold>\n        <c:CRun Text=\" jkl; \" />\n        <c:CItalic Classes=\"Italic\">\n          <c:CRun Text=\";lkj\" />\n        </c:CItalic>\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock>\n        <c:CRun Text=\"1234567\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock>\n        <c:CInlineUIContainer>\n          <c:CInlineUIContainer.Content>\n            <RadioButton IsEnabled=\"False\" Classes=\":unchecked,:disabled\" />\n          </c:CInlineUIContainer.Content>\n        </c:CInlineUIContainer>\n        <c:CRun Text=\"ねむい\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single,RuleSingle\" />\n  <Grid xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"・\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock>\n        <c:CRun Text=\"asdf \" />\n        <c:CBold Classes=\"Bold\">\n          <c:CRun Text=\"fdsa \" />\n        </c:CBold>\n        <c:CRun Text=\" jkl; \" />\n        <c:CItalic Classes=\"Italic\">\n          <c:CRun Text=\";lkj\" />\n        </c:CItalic>\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"・\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock>\n        <c:CRun Text=\"1234567\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"・\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock>\n        <c:CInlineUIContainer>\n          <c:CInlineUIContainer.Content>\n            <RadioButton IsEnabled=\"False\" Classes=\":unchecked,:disabled\" />\n          </c:CInlineUIContainer.Content>\n        </c:CInlineUIContainer>\n        <c:CRun Text=\"ねむい\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single,RuleSingle\" />\n  <Grid xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"12.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock>\n        <c:CRun Text=\"asdf \" />\n        <c:CBold Classes=\"Bold\">\n          <c:CRun Text=\"fdsa \" />\n        </c:CBold>\n        <c:CRun Text=\" jkl; \" />\n        <c:CItalic Classes=\"Italic\">\n          <c:CRun Text=\";lkj\" />\n        </c:CItalic>\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"13.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock>\n        <c:CRun Text=\"1234567\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"14.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock>\n        <c:CInlineUIContainer>\n          <c:CInlineUIContainer.Content>\n            <RadioButton IsEnabled=\"False\" Classes=\":unchecked,:disabled\" />\n          </c:CInlineUIContainer.Content>\n        </c:CInlineUIContainer>\n        <c:CRun Text=\"ねむい\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdHtml/Out/UnitTest.Mixing.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:m=\"https://github.com/whistyun/Markdown.Avalonia.Tight\" xmlns:ma=\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\" xmlns:ma2=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Heading1\">\n    <c:CRun Text=\"Html Mixing\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Html style\" />\n  </c:CTextBlock>\n  <c:CTextBlock>\n    <c:CHyperlink CommandParameter=\"http://example.com\" Classes=\"Hyperlink\">\n      <c:CImage />\n      <c:CRun Text=\" asdf \" />\n      <c:CItalic>\n        <c:CRun Text=\"asdf\" />\n      </c:CItalic>\n      <c:CRun Text=\" asdf\" />\n    </c:CHyperlink>\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Html style\" />\n  </c:CTextBlock>\n  <c:CTextBlock>\n    <c:CHyperlink CommandParameter=\"http://example.com\" Classes=\"Hyperlink\">\n      <c:CRun Text=\"![](https://img.shields.io/nuget/v/AssemblyInfoHelper.svg) asdf *asdf* asdf\" />\n    </c:CHyperlink>\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <Grid Classes=\"List\">\n              <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n                <c:CRun Text=\"•\" />\n              </c:CTextBlock>\n              <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n                <c:CTextBlock Classes=\"Paragraph\">\n                  <c:CRun Text=\"one\" />\n                </c:CTextBlock>\n              </StackPanel>\n              <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n                <c:CRun Text=\"•\" />\n              </c:CTextBlock>\n              <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n                <c:CTextBlock Classes=\"Paragraph\">\n                  <c:CRun Text=\"two\" />\n                </c:CTextBlock>\n              </StackPanel>\n              <Grid.ColumnDefinitions>\n                <ColumnDefinition />\n                <ColumnDefinition />\n              </Grid.ColumnDefinitions>\n              <Grid.RowDefinitions>\n                <RowDefinition />\n                <RowDefinition />\n              </Grid.RowDefinitions>\n            </Grid>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"* one * two\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdHtml/Out/UnitTest.Progres.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:m=\"https://github.com/whistyun/Markdown.Avalonia.Tight\" xmlns:ma=\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\" xmlns:ma2=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock>\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <ProgressBar Minimum=\"10\" Maximum=\"60\" Value=\"25\" Width=\"50\" Height=\"12\" Classes=\":horizontal\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single,RuleSingle\" />\n  <c:CTextBlock>\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <ProgressBar Minimum=\"100\" Maximum=\"200\" Value=\"100\" Width=\"50\" Height=\"12\" Classes=\":horizontal\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single,RuleSingle\" />\n  <c:CTextBlock>\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <ProgressBar Minimum=\"10\" Maximum=\"60\" Value=\"25\" Width=\"50\" Height=\"12\" Classes=\":horizontal\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single,RuleSingle\" />\n  <c:CTextBlock>\n    <c:CInlineUIContainer>\n      <c:CInlineUIContainer.Content>\n        <ProgressBar Minimum=\"100\" Maximum=\"200\" Value=\"100\" Width=\"50\" Height=\"12\" Classes=\":horizontal\" xmlns=\"\" />\n      </c:CInlineUIContainer.Content>\n    </c:CInlineUIContainer>\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single,RuleSingle\" />\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdHtml/Out/UnitTest.Table.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"6\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"alpha\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"1\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"beta\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"gamma\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Grid.Column=\"3\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"1\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"3\" Grid.Row=\"2\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"3\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Grid.Column=\"2\" Grid.Row=\"4\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"3\" Grid.Row=\"4\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"1\" Grid.Row=\"5\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"2\" Grid.Row=\"5\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"3\" Grid.Row=\"5\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"6\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"alpha\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"1\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"beta\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"gamma\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Grid.Column=\"3\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"1\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"3\" Grid.Row=\"2\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"3\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"4\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Grid.Column=\"3\" Grid.Row=\"4\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"1\" Grid.Row=\"5\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"2\" Grid.Row=\"5\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"3\" Grid.Row=\"5\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"6\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"alpha\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"1\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"beta\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"gamma\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Grid.Column=\"3\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"1\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"3\" Grid.Row=\"2\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"3\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"4\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Grid.Column=\"3\" Grid.Row=\"4\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"5\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"5\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Grid.Column=\"2\" Grid.Row=\"5\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"3\" Grid.Row=\"5\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"6\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"alpha\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"1\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"beta\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"gamma\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Grid.Column=\"3\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"1\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"3\" Grid.Row=\"2\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"3\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"4\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Grid.Column=\"3\" Grid.Row=\"4\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"5\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"5\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Grid.Column=\"2\" Grid.Row=\"5\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"3\" Grid.Row=\"5\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"6\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"6\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Grid.Column=\"1\" Grid.Row=\"6\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"2\" Grid.Row=\"6\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"3\" Grid.Row=\"6\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"6\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"alpha\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"1\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"beta\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"gamma\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"3\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"delta\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"4\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"epsilon\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"1\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"1\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Grid.Column=\"4\" Grid.Row=\"1\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Classes=\"OddTableRow\" Grid.Column=\"1\" Grid.Row=\"2\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"2\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"4\" Grid.Row=\"2\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"5\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"3\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Grid.Column=\"2\" Grid.Row=\"3\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"3\" Grid.Row=\"3\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"4\" Grid.Row=\"3\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"1\" Grid.Row=\"4\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"2\" Grid.Row=\"4\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"3\" Grid.Row=\"4\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"4\" Grid.Row=\"4\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"1\" Grid.Row=\"5\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"2\" Grid.Row=\"5\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"3\" Grid.Row=\"5\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"4\" Grid.Row=\"5\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"6\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"alpha\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"1\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"beta\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"gamma\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"3\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"delta\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"4\" Grid.Row=\"0\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"epsilon\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"1\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"1\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"1\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"D\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Grid.Column=\"4\" Grid.Row=\"1\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Classes=\"OddTableRow\" Grid.Column=\"1\" Grid.Row=\"2\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"2\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"4\" Grid.Row=\"2\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"5\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"3\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Grid.Column=\"3\" Grid.Row=\"3\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"4\" Grid.Row=\"3\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"1\" Grid.Row=\"4\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"2\" Grid.Row=\"4\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"3\" Grid.Row=\"4\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"4\" Grid.Row=\"4\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"1\" Grid.Row=\"5\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"2\" Grid.Row=\"5\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"3\" Grid.Row=\"5\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Border Grid.Column=\"4\" Grid.Row=\"5\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"1\" />\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdHtml/Out/UnitTest.TypicalBlock.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Heading1\">\n    <c:CBold Classes=\"Bold\">\n      <c:CRun Text=\"Heading1 \" />\n    </c:CBold>\n    <c:CRun Text=\" Title\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CItalic Classes=\"Italic\">\n      <c:CRun Text=\"Sub \" />\n    </c:CItalic>\n    <c:CRun Text=\" Titile\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Heading3\">\n    <c:CRun Text=\"H3_Title\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Heading4\">\n    <c:CRun Text=\"H4_Title\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Heading5\">\n    <c:CRun Text=\"H5_Title\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Heading6\">\n    <c:CRun Text=\"H6_Title\" />\n  </c:CTextBlock>\n  <Border Classes=\"Address\" xmlns=\"\">\n    <Border.Child>\n      <StackPanel Classes=\"Address\">\n        <c:CTextBlock>\n          <c:CRun Text=\"Written by \" />\n          <c:CHyperlink CommandParameter=\"mailto:webmaster@example.com\" Classes=\"Hyperlink\">\n            <c:CRun Text=\"Jon Doe \" />\n          </c:CHyperlink>\n          <c:CRun Text=\".\" />\n          <c:CLineBreak Text=\"&#xA;\" />\n          <c:CRun Text=\"simewhere, someland, somecountry\" />\n        </c:CTextBlock>\n      </StackPanel>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Article\" xmlns=\"\">\n    <Border.Child>\n      <StackPanel Classes=\"Article\">\n        <c:CTextBlock Classes=\"Heading3\">\n          <c:CRun Text=\"Article         Element\" />\n        </c:CTextBlock>\n        <c:CTextBlock>\n          <c:CRun Text=\"description of         this element...\" />\n        </c:CTextBlock>\n      </StackPanel>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Aside\" xmlns=\"\">\n    <Border.Child>\n      <StackPanel Classes=\"Aside\">\n        <c:CTextBlock Classes=\"Heading4\">\n          <c:CRun Text=\"ASide         Element\" />\n        </c:CTextBlock>\n        <c:CTextBlock>\n          <c:CRun Text=\"このタグに関する説明を書いてください・・・\" />\n        </c:CTextBlock>\n      </StackPanel>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Blockquote\" xmlns=\"\">\n    <Border.Child>\n      <StackPanel Classes=\"Blockquote\">\n        <Border Classes=\"Aside\">\n          <Border.Child>\n            <StackPanel Classes=\"Aside\">\n              <c:CTextBlock Classes=\"Heading4\">\n                <c:CRun Text=\"ASide             Element\" />\n              </c:CTextBlock>\n              <c:CTextBlock>\n                <c:CRun Text=\"このタグに関する説明を書いてください・・・\" />\n              </c:CTextBlock>\n            </StackPanel>\n          </Border.Child>\n        </Border>\n        <c:CTextBlock>\n          <c:CRun Text=\"hm?\" />\n        </c:CTextBlock>\n      </StackPanel>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Center\" xmlns=\"\">\n    <Border.Child>\n      <StackPanel Classes=\"Center\">\n        <c:CTextBlock Classes=\"Heading5\">\n          <c:CRun Text=\"Center Element\" />\n        </c:CTextBlock>\n        <c:CTextBlock>\n          <c:CRun Text=\"center tag center tag center tag...\" />\n        </c:CTextBlock>\n      </StackPanel>\n    </Border.Child>\n  </Border>\n  <c:CTextBlock Classes=\"Heading6\">\n    <c:CRun Text=\"H6_Title\" />\n  </c:CTextBlock>\n  <c:CTextBlock>\n    <c:CRun Text=\"abcdefghi\" />\n  </c:CTextBlock>\n  <c:CTextBlock>\n    <c:CRun Text=\"jklmnopqr\" />\n  </c:CTextBlock>\n  <c:CTextBlock>\n    <c:CRun Text=\"stuvwxyz\" />\n  </c:CTextBlock>\n  <c:CTextBlock>\n    <c:CRun Text=\"abcdefghi\" />\n  </c:CTextBlock>\n  <c:CTextBlock>\n    <c:CRun Text=\"jklmnopqr \" />\n    <c:CRun Text=\"stuvwxyz\" />\n  </c:CTextBlock>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdHtml/Out/UnitTest.TypicalInline.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock>\n    <c:CHyperlink Classes=\"Hyperlink\">\n      <c:CRun Text=\"asdf \" />\n    </c:CHyperlink>\n    <c:CRun Text=\"\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"\" />\n    <c:CSpan Classes=\"Abbr\">\n      <c:CRun Text=\"asdf \" />\n    </c:CSpan>\n    <c:CRun Text=\"\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"\" />\n    <c:CSpan Classes=\"Abbr\">\n      <c:CRun Text=\"asdf \" />\n    </c:CSpan>\n    <c:CRun Text=\"\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"\" />\n    <c:CBold Classes=\"Bold\">\n      <c:CRun Text=\"asdf \" />\n    </c:CBold>\n    <c:CRun Text=\"\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"\" />\n    <c:CSpan Classes=\"Bdi\">\n      <c:CRun Text=\"asdf \" />\n    </c:CSpan>\n    <c:CRun Text=\"\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"\" />\n    <c:CSpan Classes=\"Cite\">\n      <c:CRun Text=\"asdf \" />\n    </c:CSpan>\n    <c:CRun Text=\"\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"\" />\n    <c:CSpan IsStrikethrough=\"True\" Classes=\"Strikethrough\">\n      <c:CRun Text=\"asdf \" />\n    </c:CSpan>\n    <c:CRun Text=\"\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"\" />\n    <c:CItalic Classes=\"Italic\">\n      <c:CRun Text=\"asdf \" />\n    </c:CItalic>\n    <c:CRun Text=\"\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"\" />\n    <c:CItalic Classes=\"Italic\">\n      <c:CRun Text=\"asdf \" />\n    </c:CItalic>\n    <c:CRun Text=\"\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"\" />\n    <c:CUnderline Classes=\"Underline\">\n      <c:CRun Text=\"asdf \" />\n    </c:CUnderline>\n    <c:CRun Text=\"\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"\" />\n    <c:CSpan Classes=\"Mark\">\n      <c:CRun Text=\"asdf \" />\n    </c:CSpan>\n    <c:CRun Text=\"\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"\" />\n    <c:CSpan IsStrikethrough=\"True\" Classes=\"Strikethrough\">\n      <c:CRun Text=\"asdf \" />\n    </c:CSpan>\n    <c:CRun Text=\"\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"\" />\n    <c:CSpan IsStrikethrough=\"True\" Classes=\"Strikethrough\">\n      <c:CRun Text=\"asdf \" />\n    </c:CSpan>\n    <c:CRun Text=\"\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"\" />\n    <c:CBold Classes=\"Bold\">\n      <c:CRun Text=\"asdf \" />\n    </c:CBold>\n    <c:CRun Text=\"\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"\" />\n    <c:CSpan Classes=\"Subscript\">\n      <c:CRun Text=\"asdf \" />\n    </c:CSpan>\n    <c:CRun Text=\"\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"\" />\n    <c:CSpan Classes=\"Superscript\">\n      <c:CRun Text=\"asdf \" />\n    </c:CSpan>\n    <c:CRun Text=\"\" />\n    <c:CLineBreak Text=\"&#xA;\" />\n    <c:CRun Text=\"\" />\n    <c:CUnderline Classes=\"Underline\">\n      <c:CRun Text=\"asdf\" />\n    </c:CUnderline>\n  </c:CTextBlock>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdHtml/Texts/Button.html",
    "content": "﻿<button></button>\n<button><!--empty--></button>\n<button>some\ntext</button>\n<button>\n<center><h1>title</h1></center>\n<div>description1 description2</div>\n</button>"
  },
  {
    "path": "tests/UnitTest.MdHtml/Texts/CodeBlock.html",
    "content": "﻿<pre><code>plain text\nSub Test()\n    Dim A As Long\n    Dim B As Integer\nEnd Sub\n</code></pre>\n<pre><code class=\"lang-java\">import java.lang.*;\npublic class Program {\n    public static void main(String[] args) {\n        System.out.println(\"Hello\");\n    }    \n}\n</code></pre>\n<pre>NEMUI\nONAKASUITA\nSHINDOI\n</pre>"
  },
  {
    "path": "tests/UnitTest.MdHtml/Texts/Details.html",
    "content": "﻿<details>\n<summary>\nSpoiler warning\n<a href=\"https://www.google.com\">link</a>\n</summary>\n\n# Heading1\n\n* list item1\n* list item2\n</details>\n\n<hr>\n\n<details  open=\"true\">\n<summary>\nSpoiler warning\n</summary>\n\n# Heading1\n\n* list item1\n* list item2\n</details>\n\n<hr>\n\n<details open=\"false\">\n<summary>\nSpoiler warning\n</summary>\n\n# Heading1\n\n* list item1\n* list item2\n</details>\n\n\n"
  },
  {
    "path": "tests/UnitTest.MdHtml/Texts/InlineCode.html",
    "content": "﻿An <code>apple</code> is an editable fruit produced by an <kbd>apple tree</kbd>.\n<hr>\n<var>Apple trees</var> are caltivated wordwide."
  },
  {
    "path": "tests/UnitTest.MdHtml/Texts/Input.html",
    "content": "﻿<input type=\"text\">\n<input type=\"text\" size=\"14\">\n<input type=\"text\" width=\"100\">\n<input type=\"text\" value=\"textbox\">\n<hr />\n<input type=\"button\">\n<input type=\"button\" size=\"14\">\n<input type=\"button\" width=\"100\">\n<input type=\"button\" value=\"button\">\n<hr />\n<input type=\"reset\">\n<input type=\"reset\" size=\"14\">\n<input type=\"reset\" width=\"100\">\n<input type=\"reset\" value=\"button\">\n<hr />\n<input type=\"submit\">\n<input type=\"submit\" size=\"14\">\n<input type=\"submit\" width=\"100\">\n<input type=\"submit\" value=\"button\">\n<hr />\n<input type=\"radio\">\n<input type=\"radio\" checked>\n<input type=\"radio\" checked value=\"aiueo\">\n<hr />\n<input type=\"checkbox\">\n<input type=\"checkbox\" checked>\n<input type=\"checkbox\" checked value=\"aiueo\">\n<hr />\n<input type=\"range\">\n<input type=\"range\" min=\"0\" max=\"200\" value=\"50\">\n<input type=\"range\" min=\"50\" value=\"90\">\n<hr />\n<textarea>asasdfasdfsadfasdfasd\n\nsd\n\ndf</textarea>\n<hr>\n<textarea rows=3 cols=30>afsadfasdfasd\n\nsd\n\ndf</textarea>\n"
  },
  {
    "path": "tests/UnitTest.MdHtml/Texts/List.html",
    "content": "﻿<ol>\n    <li>\n        asdf <strong>fdsa</strong> jkl; <i>;lkj</i>\n    </li>\n    <li>\n        1234567\n    </li>\n    <li><input type=\"radio\" />ねむい</li>\n</ol>\n<hr />\n<ul>\n    <li>\n        asdf <strong>fdsa</strong> jkl; <i>;lkj</i>\n    </li>\n    <li>\n        1234567\n    </li>\n    <li><input type=\"radio\" />ねむい</li>\n</ul>\n<hr />\n<ol start=\"12\">\n    <li>\n        asdf <strong>fdsa</strong> jkl; <i>;lkj</i>\n    </li>\n    <li>\n        1234567\n    </li>\n    <li><input type=\"radio\" />ねむい</li>\n</ol>"
  },
  {
    "path": "tests/UnitTest.MdHtml/Texts/Mixing.html",
    "content": "﻿# Html Mixing\n\n<h2>Html style</h2>\n<a href=\"http://example.com\">\n\n![](https://img.shields.io/nuget/v/AssemblyInfoHelper.svg) asdf *asdf* asdf\n\n</a>\n\n***\n\n<h2>Html style</h2>\n<a href=\"http://example.com\">\n![](https://img.shields.io/nuget/v/AssemblyInfoHelper.svg) asdf *asdf* asdf\n\n</a>\n\n***\n\n<table>\n<tr>\n<td>\n\n* one\n* two\n\n</td>\n</tr>\n</table>\n\n***\n\n<table>\n<tr>\n<td>\n* one\n* two\n</td>\n</tr>\n</table>"
  },
  {
    "path": "tests/UnitTest.MdHtml/Texts/Progres.html",
    "content": "﻿<progress min=\"10\" value=\"25\" max=\"60\"></progress>\n<hr />\n<progress min=\"100\" value=\"110\" max=\"200\">110</progress>\n<hr />\n<meter min=\"10\" value=\"25\" max=\"60\"></meter>\n<hr />\n<meter min=\"100\" value=\"110\" max=\"200\">110</meter>\n<hr />\n"
  },
  {
    "path": "tests/UnitTest.MdHtml/Texts/Table.html",
    "content": "﻿<table border=1>\n    <tr>\n        <td rowspan=6>alpha\n        <td rowspan=5>beta\n        <td rowspan=4>gamma\n    <tr>\n        <td>1\n    <tr>\n        <td>2\n    <tr>\n        <td>3\n</table>\n\n<table border=1>\n    <tr>\n        <td rowspan=6>alpha\n        <td rowspan=5>beta\n        <td rowspan=4>gamma\n    <tr>\n        <td>1\n    <tr>\n        <td>2\n    <tr>\n        <td>3\n    <tr>\n        <td>4\n</table>\n\n<table border=1>\n    <tr>\n        <td rowspan=6>alpha\n        <td rowspan=5>beta\n        <td rowspan=4>gamma\n    <tr>\n        <td>1\n    <tr>\n        <td>2\n    <tr>\n        <td>3\n    <tr>\n        <td>4\n    <tr>\n        <td>5\n</table>\n\n<table border=1>\n    <tr>\n        <td rowspan=6>alpha\n        <td rowspan=5>beta\n        <td rowspan=4>gamma\n    <tr>\n        <td>1\n    <tr>\n        <td>2\n    <tr>\n        <td>3\n    <tr>\n        <td>4\n    <tr>\n        <td>5\n    <tr>\n        <td>6\n</table>\n\n<table border=1>\n    <tr>\n        <td rowspan=6>alpha\n        <td>beta\n        <td>gamma\n        <td rowspan=3>delta\n        <td>epsilon\n    <tr>\n        <td>1\n        <td>2\n    <tr>\n        <td>3\n        <td>4\n        <td>5\n    <tr>\n        <td>4\n</table>\n\n<table border=1>\n    <tr>\n        <td rowspan=6>alpha\n        <td>beta\n        <td>gamma\n        <td>delta\n        <td>epsilon\n    <tr>\n        <td>1\n        <td>2\n        <td rowspan=3>D\n    <tr>\n        <td>3\n        <td>4\n        <td>5\n    <tr>\n        <td>4\n</table>\n"
  },
  {
    "path": "tests/UnitTest.MdHtml/Texts/TypicalBlock.html",
    "content": "﻿<h1><strong>Heading1</strong> Title</h1>\n<h2><i>Sub</i> Titile</h2>\n<h3>H3_Title</h3>\n<h4>H4_Title</h4>\n<h5>H5_Title</h5>\n<h6>H6_Title</h6>\n\n<address>\n    Written by <a href=\"mailto:webmaster@example.com\">Jon Doe</a>.<br>\n    simewhere, someland, somecountry\n</address>\n\n<article>\n    <h3>\n        Article\n        Element\n    </h3>\n    <p>\n        description of\n        this element...\n    </p>\n</article>\n\n<aside>\n    <h4>\n        ASide\n        Element\n    </h4>\n    <p>\n        このタグに関する説明を書いてください・・・\n    </p>\n</aside>\n\n<blockquote>\n    <aside>\n        <h4>\n            ASide\n            Element\n        </h4>\n        <p>\n            このタグに関する説明を書いてください・・・\n        </p>\n    </aside>\n    hm?\n</blockquote>\n\n<center>\n    <h5>Center Element</h5>\n    center tag center tag center tag...\n</center>\n<h6>H6_Title</h6>\n\n<div><div><div>abcdefghi</div>jklmnopqr</div>stuvwxyz</div>\n<p><p><p>abcdefghi</p>jklmnopqr</p>stuvwxyz</p>"
  },
  {
    "path": "tests/UnitTest.MdHtml/Texts/TypicalInline.html",
    "content": "﻿<a>asdf</a>\n<br>\n<abbr>asdf</abbr>\n<br>\n<acronym>asdf</acronym>\n<br>\n<b>asdf</b>\n<br>\n<bdi>asdf</bdi>\n<br>\n<cite>asdf</cite>\n<br>\n<del>asdf</del>\n<br>\n<em>asdf</em>\n<br>\n<i>asdf</i>\n<br>\n<ins>asdf</ins>\n<br>\n<mark>asdf</mark>\n<br>\n<s>asdf</s>\n<br>\n<strike>asdf</strike>\n<br>\n<strong>asdf</strong>\n<br>\n<sub>asdf</sub>\n<br>\n<sup>asdf</sup>\n<br>\n<u>asdf</u>\n<br>"
  },
  {
    "path": "tests/UnitTest.MdHtml/UnitTest.MdHtml.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <Import Project=\"..\\UnitTest.props\" />\n\n  <PropertyGroup>\n    <TargetFrameworks>$(TestTargetFrameworks)</TargetFrameworks>\n    <IsPackable>false</IsPackable>\n    <LangVersion>9</LangVersion>\n    <Nullable>disable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" Version=\"$(TestAvaloniaVersion)\" />\n    <PackageReference Include=\"Avalonia.Desktop\" Version=\"$(TestAvaloniaVersion)\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\ColorTextBlock.Avalonia\\ColorTextBlock.Avalonia.csproj\" />\n    <ProjectReference Include=\"..\\..\\Markdown.Avalonia.Tight\\Markdown.Avalonia.Tight.csproj\" />\n    <ProjectReference Include=\"..\\..\\Markdown.Avalonia.Html\\Markdown.Avalonia.Html.csproj\" />\n    <ProjectReference Include=\"..\\UnitTest.Base\\UnitTest.Base.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Update=\"Texts\\*\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "tests/UnitTest.MdHtml/UnitTest.cs",
    "content": "﻿using ApprovalTests;\nusing ApprovalTests.Reporters;\nusing Avalonia.Controls;\nusing Markdown.Avalonia;\nusing Markdown.Avalonia.Html;\nusing NUnit.Framework;\nusing System.Linq;\nusing UnitTest.Base;\nusing UnitTest.Base.Utils;\nusing UnitTest.MdHtml.Test;\n\nusing MarkdownEngine = Markdown.Avalonia.Markdown;\n\nnamespace UnitTest.MdHtml\n{\n    [UseReporter(typeof(DiffReporter))]\n    public class UnitTest : UnitTestBase\n    {\n        public MarkdownEngine Engine\n        {\n            get\n            {\n                var plugins = new MdAvPlugins();\n                plugins.Plugins.Add(new HtmlPlugin());\n\n                return new MarkdownEngine()\n                {\n                    Plugins = plugins\n                };\n            }\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Button()\n        {\n            var html = Utils.ReadHtml();\n\n            var doc = Engine.Transform(html);\n\n            var xaml = Utils.AsXaml(doc);\n\n            Approvals.Verify(xaml);\n        }\n\n        [Test]\n        [RunOnUI]\n        public void CodeBlock()\n        {\n            var html = Utils.ReadHtml();\n\n            var doc = Engine.Transform(html);\n\n            var xaml = Utils.AsXaml(doc);\n\n            Approvals.Verify(xaml);\n        }\n\n        [Test]\n        [RunOnUI]\n        public void InlineCode()\n        {\n            var html = Utils.ReadHtml();\n\n            var doc = Engine.Transform(html);\n\n            var xaml = Utils.AsXaml(doc);\n\n            Approvals.Verify(xaml);\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Input()\n        {\n            var html = Utils.ReadHtml();\n\n            var doc = Engine.Transform(html);\n\n            var xaml = Utils.AsXaml(doc);\n\n            Approvals.Verify(xaml);\n        }\n\n        [Test]\n        [RunOnUI]\n        public void List()\n        {\n            var html = Utils.ReadHtml();\n\n            var doc = Engine.Transform(html);\n\n            var xaml = Utils.AsXaml(doc);\n\n            Approvals.Verify(xaml);\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Progres()\n        {\n            var html = Utils.ReadHtml();\n\n            var doc = Engine.Transform(html);\n\n            var xaml = Utils.AsXaml(doc);\n\n            Approvals.Verify(xaml);\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Details()\n        {\n            var html = Utils.ReadHtml();\n\n            var doc = Engine.Transform(html);\n\n            var xaml = Utils.AsXaml(doc);\n\n            Approvals.Verify(xaml);\n        }\n\n        [Test]\n        [RunOnUI]\n        public void TypicalBlock()\n        {\n            var html = Utils.ReadHtml();\n\n            var doc = Engine.Transform(html);\n\n            var xaml = Utils.AsXaml(doc);\n\n            Approvals.Verify(xaml);\n        }\n\n        [Test]\n        [RunOnUI]\n        public void TypicalInline()\n        {\n            var html = Utils.ReadHtml();\n\n            var doc = Engine.Transform(html);\n\n            var xaml = Utils.AsXaml(doc);\n\n            Approvals.Verify(xaml);\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Mixing()\n        {\n            var html = Utils.ReadHtml();\n\n            var doc = Engine.Transform(html);\n\n            var xaml = Utils.AsXaml(doc);\n\n            Approvals.Verify(xaml);\n        }\n    }\n}\n"
  },
  {
    "path": "tests/UnitTest.MdHtml/Utils.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing System.Windows.Markup;\nusing System.Xml;\nusing UnitTest.Base;\nusing UnitTest.Base.Utils;\n\nnamespace UnitTest.MdHtml.Test\n{\n    public static class Utils\n    {\n        public static string ReadHtml([CallerMemberName] string fileBaseName = null)\n        {\n            if (fileBaseName is null)\n                throw new ArgumentNullException(nameof(fileBaseName));\n\n            return Util.LoadText(fileBaseName + \".html\");\n        }\n\n        public static string AsXaml(object result)\n        {\n            return global::UnitTest.Base.Utils.Util.AsXaml(result);\n        }\n\n        public static string GetRuntimeName()\n        {\n            var description = RuntimeInformation.FrameworkDescription.ToLower();\n            // \".NET Framework\"\n            // \".NET Core\"(for .NET Core 1.0 - 3.1)\n            // \".NET Native\"\n            // \".NET\"(for .NET 5.0 and later versions)\n\n            if (description.Contains(\"framework\"))\n            {\n                return \"framework\";\n            }\n\n            if (description.Contains(\"core\"))\n            {\n                return \"core\";\n            }\n\n            if (description.Contains(\"native\"))\n            {\n                return \"native\";\n            }\n\n            return \"dotnet\";\n        }\n    }\n}\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/.gitignore",
    "content": "Out/*.received.txt\nOut/*.bak\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Out/UnitTestMdSyntax.Transform_givenBlockqoute_generatesExpectedResult.approved.txt",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <Border Classes=\"Blockquote\" xmlns=\"\">\n    <Border.Child>\n      <StackPanel Classes=\"Blockquote\">\n        <c:CTextBlock Classes=\"Heading2\">\n          <c:CRun Text=\"Features\" />\n        </c:CTextBlock>\n        <c:CTextBlock Classes=\"Paragraph\">\n          <c:CRun Text=\"MarkDown.Xaml has a number of convenient features\" />\n        </c:CTextBlock>\n        <Grid Classes=\"List\">\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"The engine itself is a single file, for easy inclusion in your own projects\" />\n            </c:CTextBlock>\n          </StackPanel>\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"Code for the engine is structured in the same manner as the original MarkdownSharp \" />\n            </c:CTextBlock>\n          </StackPanel>\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"Includes a \" />\n              <c:CCode>\n                <c:CRun Text=\"TextToFlowDocumentConverter\" />\n              </c:CCode>\n              <c:CRun Text=\" to make it easy to bind Markdown text\" />\n            </c:CTextBlock>\n          </StackPanel>\n          <Grid.ColumnDefinitions>\n            <ColumnDefinition />\n            <ColumnDefinition />\n          </Grid.ColumnDefinitions>\n          <Grid.RowDefinitions>\n            <RowDefinition />\n            <RowDefinition />\n            <RowDefinition />\n          </Grid.RowDefinitions>\n        </Grid>\n      </StackPanel>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Blockquote\" xmlns=\"\">\n    <Border.Child>\n      <StackPanel Classes=\"Blockquote\">\n        <c:CTextBlock Classes=\"Heading2\">\n          <c:CRun Text=\"Features\" />\n        </c:CTextBlock>\n        <c:CTextBlock Classes=\"Paragraph\">\n          <c:CRun Text=\"MarkDown.Xaml has a number of convenient features\" />\n        </c:CTextBlock>\n        <Grid Classes=\"List\">\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"The engine itself is a single file, for easy inclusion in your own projects\" />\n            </c:CTextBlock>\n          </StackPanel>\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"Code for the engine is structured in the same manner as the original MarkdownSharp \" />\n            </c:CTextBlock>\n          </StackPanel>\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"Includes a \" />\n              <c:CCode>\n                <c:CRun Text=\"TextToFlowDocumentConverter\" />\n              </c:CCode>\n              <c:CRun Text=\" to make it easy to bind Markdown text\" />\n            </c:CTextBlock>\n          </StackPanel>\n          <Grid.ColumnDefinitions>\n            <ColumnDefinition />\n            <ColumnDefinition />\n          </Grid.ColumnDefinitions>\n          <Grid.RowDefinitions>\n            <RowDefinition />\n            <RowDefinition />\n            <RowDefinition />\n          </Grid.RowDefinitions>\n        </Grid>\n      </StackPanel>\n    </Border.Child>\n  </Border>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Out/UnitTestMdSyntax.Transform_givenCodes_generatesExpectedResult.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:m=\"https://github.com/whistyun/Markdown.Avalonia.Tight\" xmlns:ma=\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\" xmlns:ma2=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\" xmlns:mas=\"https://github.com/whistyun/Markdown.Avalonia.SyntaxHigh\" xmlns:mas2=\"https://github.com/whistyun/Markdown.Avalonia.SyntaxHigh/Styles\" xmlns:a=\"https://github.com/avaloniaui/avaloniaedit\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Heading1\">\n    <c:CCode>\n      <c:CRun Text=\"```\" />\n    </c:CCode>\n  </c:CTextBlock>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"```cs&#xA;public void Main(){&#xA;    Console.WriteLine(&quot;`Hello World`&quot;);&#xA;}&#xA;```\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"public void Main(){&#xA;    Console.WriteLine(&quot;`Hello World`&quot;);&#xA;}\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Blockquote\" xmlns=\"\">\n    <Border.Child>\n      <StackPanel Classes=\"Blockquote\">\n        <Border Classes=\"CodeBlock\">\n          <Border.Child>\n            <ScrollViewer Classes=\"CodeBlock\">\n              <ScrollViewer.Content>\n                <TextBlock Text=\"public void Main(){&#xA;    Console.WriteLine(&quot;`Hello World`&quot;);&#xA;}\" Classes=\"CodeBlock\" />\n              </ScrollViewer.Content>\n            </ScrollViewer>\n          </Border.Child>\n        </Border>\n      </StackPanel>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"   public void Main(){&#xA;       Console.WriteLine(&quot;`Hello World`&quot;);&#xA;   }\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"```cs&#xA;public void Main(){&#xA;    Console.WriteLine(&quot;`Hello World`&quot;);&#xA;}&#xA;```\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <Border Classes=\"CodeBlock\">\n        <Border.Child>\n          <ScrollViewer Classes=\"CodeBlock\">\n            <ScrollViewer.Content>\n              <TextBlock Text=\"public void Main(){&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;}\" Classes=\"CodeBlock\" />\n            </ScrollViewer.Content>\n          </ScrollViewer>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n      <Border Classes=\"CodeBlock\">\n        <Border.Child>\n          <ScrollViewer Classes=\"CodeBlock\">\n            <ScrollViewer.Content>\n              <TextBlock Text=\"public void Main(){&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;}\" Classes=\"CodeBlock\" />\n            </ScrollViewer.Content>\n          </ScrollViewer>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"TwoLines\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n      <Border Classes=\"CodeBlock\">\n        <Border.Child>\n          <ScrollViewer Classes=\"CodeBlock\">\n            <ScrollViewer.Content>\n              <TextBlock Text=\"public void Main(){&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;}\" Classes=\"CodeBlock\" />\n            </ScrollViewer.Content>\n          </ScrollViewer>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Heading1\">\n    <c:CRun Text=\"Indent\" />\n  </c:CTextBlock>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"abcd&#xA;efgh\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\" abcd&#xA;efgh\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"abcd&#xA; efgh&#xA;&#xA; ijkl&#xA;&#xA;opqr\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <Border Classes=\"Blockquote\" xmlns=\"\">\n    <Border.Child>\n      <StackPanel Classes=\"Blockquote\">\n        <Border Classes=\"CodeBlock\">\n          <Border.Child>\n            <ScrollViewer Classes=\"CodeBlock\">\n              <ScrollViewer.Content>\n                <TextBlock Text=\"asdf&#xA; ghij\" Classes=\"CodeBlock\" />\n              </ScrollViewer.Content>\n            </ScrollViewer>\n          </Border.Child>\n        </Border>\n      </StackPanel>\n    </Border.Child>\n  </Border>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <Border Classes=\"CodeBlock\">\n        <Border.Child>\n          <ScrollViewer Classes=\"CodeBlock\">\n            <ScrollViewer.Content>\n              <TextBlock Text=\"public void Main(){&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;}\" Classes=\"CodeBlock\" />\n            </ScrollViewer.Content>\n          </ScrollViewer>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one public void Main(){\" />\n      </c:CTextBlock>\n      <Border Classes=\"CodeBlock\">\n        <Border.Child>\n          <ScrollViewer Classes=\"CodeBlock\">\n            <ScrollViewer.Content>\n              <TextBlock Text=\"}\" Classes=\"CodeBlock\" />\n            </ScrollViewer.Content>\n          </ScrollViewer>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n      <Border Classes=\"CodeBlock\">\n        <Border.Child>\n          <ScrollViewer Classes=\"CodeBlock\">\n            <ScrollViewer.Content>\n              <TextBlock Text=\"public void Main(){&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;}\" Classes=\"CodeBlock\" />\n            </ScrollViewer.Content>\n          </ScrollViewer>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <mas:CodePad>\n        <a:TextEditor IsReadOnly=\"True\" IsModified=\"True\" Tag=\"c\" Text=\"public void Main(){&#xA;    Console.WriteLine(&quot;`Hello World`&quot;);&#xA;}\" SelectedText=\"\" CaretOffset=\"0\" SelectionStart=\"0\" SelectionLength=\"0\" />\n        <Label Content=\"c\" Classes=\"LangInfo\" />\n        <mas:CodePad.Content>\n          <a:TextEditor IsReadOnly=\"True\" IsModified=\"True\" Tag=\"c\" Text=\"public void Main(){&#xA;    Console.WriteLine(&quot;`Hello World`&quot;);&#xA;}\" SelectedText=\"\" CaretOffset=\"0\" SelectionStart=\"0\" SelectionLength=\"0\" />\n        </mas:CodePad.Content>\n        <mas:CodePad.ExandableMenu>\n          <Button Classes=\"CopyButton\">\n            <Button.Content>\n              <TextBlock />\n            </Button.Content>\n          </Button>\n        </mas:CodePad.ExandableMenu>\n        <mas:CodePad.AlwaysShowMenu>\n          <Label Content=\"c\" Classes=\"LangInfo\" />\n        </mas:CodePad.AlwaysShowMenu>\n      </mas:CodePad>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <mas:CodePad>\n        <a:TextEditor IsReadOnly=\"True\" IsModified=\"True\" Tag=\"cs\" Text=\"public void Main(){&#xA;    Console.WriteLine(&quot;`Hello World`&quot;);&#xA;}\" SelectedText=\"\" CaretOffset=\"0\" SelectionStart=\"0\" SelectionLength=\"0\" />\n        <Label Content=\"cs\" Classes=\"LangInfo\" />\n        <mas:CodePad.Content>\n          <a:TextEditor IsReadOnly=\"True\" IsModified=\"True\" Tag=\"cs\" Text=\"public void Main(){&#xA;    Console.WriteLine(&quot;`Hello World`&quot;);&#xA;}\" SelectedText=\"\" CaretOffset=\"0\" SelectionStart=\"0\" SelectionLength=\"0\" />\n        </mas:CodePad.Content>\n        <mas:CodePad.ExandableMenu>\n          <Button Classes=\"CopyButton\">\n            <Button.Content>\n              <TextBlock />\n            </Button.Content>\n          </Button>\n        </mas:CodePad.ExandableMenu>\n        <mas:CodePad.AlwaysShowMenu>\n          <Label Content=\"cs\" Classes=\"LangInfo\" />\n        </mas:CodePad.AlwaysShowMenu>\n      </mas:CodePad>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <mas:CodePad>\n        <a:TextEditor IsReadOnly=\"True\" IsModified=\"True\" Tag=\"java\" Text=\"public void Main(){&#xA;    Console.WriteLine(&quot;`Hello World`&quot;);&#xA;}\" SelectedText=\"\" CaretOffset=\"0\" SelectionStart=\"0\" SelectionLength=\"0\" />\n        <Label Content=\"java\" Classes=\"LangInfo\" />\n        <mas:CodePad.Content>\n          <a:TextEditor IsReadOnly=\"True\" IsModified=\"True\" Tag=\"java\" Text=\"public void Main(){&#xA;    Console.WriteLine(&quot;`Hello World`&quot;);&#xA;}\" SelectedText=\"\" CaretOffset=\"0\" SelectionStart=\"0\" SelectionLength=\"0\" />\n        </mas:CodePad.Content>\n        <mas:CodePad.ExandableMenu>\n          <Button Classes=\"CopyButton\">\n            <Button.Content>\n              <TextBlock />\n            </Button.Content>\n          </Button>\n        </mas:CodePad.ExandableMenu>\n        <mas:CodePad.AlwaysShowMenu>\n          <Label Content=\"java\" Classes=\"LangInfo\" />\n        </mas:CodePad.AlwaysShowMenu>\n      </mas:CodePad>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <mas:CodePad>\n        <a:TextEditor IsReadOnly=\"True\" IsModified=\"True\" Tag=\"html\" Text=\"public void Main(){&#xA;    Console.WriteLine(&quot;`Hello World`&quot;);&#xA;}\" SelectedText=\"\" CaretOffset=\"0\" SelectionStart=\"0\" SelectionLength=\"0\" />\n        <Label Content=\"html\" Classes=\"LangInfo\" />\n        <mas:CodePad.Content>\n          <a:TextEditor IsReadOnly=\"True\" IsModified=\"True\" Tag=\"html\" Text=\"public void Main(){&#xA;    Console.WriteLine(&quot;`Hello World`&quot;);&#xA;}\" SelectedText=\"\" CaretOffset=\"0\" SelectionStart=\"0\" SelectionLength=\"0\" />\n        </mas:CodePad.Content>\n        <mas:CodePad.ExandableMenu>\n          <Button Classes=\"CopyButton\">\n            <Button.Content>\n              <TextBlock />\n            </Button.Content>\n          </Button>\n        </mas:CodePad.ExandableMenu>\n        <mas:CodePad.AlwaysShowMenu>\n          <Label Content=\"html\" Classes=\"LangInfo\" />\n        </mas:CodePad.AlwaysShowMenu>\n      </mas:CodePad>\n    </Border.Child>\n  </Border>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Out/UnitTestMdSyntax.Transform_givenContainer_generatesExpectedResult.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:m=\"https://github.com/whistyun/Markdown.Avalonia.Tight\" xmlns:ma=\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\" xmlns:ma2=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <Border Classes=\"CodeBlock,NoContainer\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"::::&#xA;:::cs&#xA;public void Main(){&#xA;    Console.WriteLine(&quot;:Hello World:&quot;);&#xA;}&#xA;:::&#xA;::::&#xA;&#xA;\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"CodeBlock,NoContainer\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\":::&#xA;public void Main(){&#xA;    Console.WriteLine(&quot;:Hello World:&quot;);&#xA;}&#xA;:::&#xA;&#xA;\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Blockquote\" xmlns=\"\">\n    <Border.Child>\n      <StackPanel Classes=\"Blockquote\">\n        <Border Classes=\"CodeBlock,NoContainer\">\n          <Border.Child>\n            <ScrollViewer Classes=\"CodeBlock\">\n              <ScrollViewer.Content>\n                <TextBlock Text=\":::&#xA;public void Main(){&#xA;    Console.WriteLine(&quot;:Hello World:&quot;);&#xA;}&#xA;:::&#xA;\" Classes=\"CodeBlock\" />\n              </ScrollViewer.Content>\n            </ScrollViewer>\n          </Border.Child>\n        </Border>\n      </StackPanel>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"CodeBlock,NoContainer\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"   :::&#xA;   public void Main(){&#xA;       Console.WriteLine(&quot;:Hello World:&quot;);&#xA;   }&#xA;   :::&#xA;&#xA;&#xA;\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\":::cs&#xA;public void Main(){&#xA;    Console.WriteLine(&quot;:Hello World:&quot;);&#xA;}&#xA;:::\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <Border Classes=\"CodeBlock,NoContainer\">\n        <Border.Child>\n          <ScrollViewer Classes=\"CodeBlock\">\n            <ScrollViewer.Content>\n              <TextBlock Text=\":::&#xA;public void Main(){&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;}&#xA;:::&#xA;\" Classes=\"CodeBlock\" />\n            </ScrollViewer.Content>\n          </ScrollViewer>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n      <Border Classes=\"CodeBlock,NoContainer\">\n        <Border.Child>\n          <ScrollViewer Classes=\"CodeBlock\">\n            <ScrollViewer.Content>\n              <TextBlock Text=\":::&#xA;public void Main(){&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;}&#xA;:::&#xA;\" Classes=\"CodeBlock\" />\n            </ScrollViewer.Content>\n          </ScrollViewer>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"TwoLines\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n      <Border Classes=\"CodeBlock,NoContainer\">\n        <Border.Child>\n          <ScrollViewer Classes=\"CodeBlock\">\n            <ScrollViewer.Content>\n              <TextBlock Text=\":::&#xA;public void Main(){&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;}&#xA;:::&#xA;\" Classes=\"CodeBlock\" />\n            </ScrollViewer.Content>\n          </ScrollViewer>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"TwoLines\" />\n  <Border Classes=\"CodeBlock,NoContainer\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"::: md&#xA;&#xA;* list1&#xA;* list2&#xA;&#xA;```cs&#xA;#define FooBar&#xA;```&#xA;:::&#xA;\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Out/UnitTestMdSyntax.Transform_givenEmoji.approved.txt",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"😄\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"smile😠😄\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\":angry:\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\":unknown_missing_symbols:\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\":lackoftxt\" />\n  </c:CTextBlock>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Out/UnitTestMdSyntax.Transform_givenHorizontalRules_generatesExpectedResult.approved.txt",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:m=\"https://github.com/whistyun/Markdown.Avalonia.Tight\" xmlns:ma=\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\" xmlns:ma2=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Dashes:\" />\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"---\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"- - -\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Asterisks:\" />\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"***\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"* * *\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Underscores:\" />\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"BoldWithSingle\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"BoldWithSingle\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"BoldWithSingle\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"BoldWithSingle\" />\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"___\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"BoldWithSingle\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"BoldWithSingle\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"BoldWithSingle\" />\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"BoldWithSingle\" />\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"_ _ _\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Out/UnitTestMdSyntax.Transform_givenImages_generatesExpectedResult.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"A remote \" />\n    <c:CImage />\n    <c:CRun Text=\".\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Images side by side \" />\n    <c:CImage />\n    <c:CImage />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CImage Classes=\"cyan\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"A resource image \" />\n    <c:CImage />\n    <c:CRun Text=\". A local image \" />\n    <c:CImage />\n    <c:CRun Text=\".\" />\n  </c:CTextBlock>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Out/UnitTestMdSyntax.Transform_givenLinksInline_generatesExpectedResult.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Just a \" />\n    <c:CHyperlink CommandParameter=\"/url/\">\n      <c:CRun Text=\"URL\" />\n    </c:CHyperlink>\n    <c:CRun Text=\".\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CHyperlink CommandParameter=\"/url/\" Classes=\"title\">\n      <c:CRun Text=\"URL and title\" />\n    </c:CHyperlink>\n    <c:CRun Text=\".\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CHyperlink CommandParameter=\"/url/\">\n      <c:CRun Text=\"URL and title\" />\n    </c:CHyperlink>\n    <c:CRun Text=\".\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CHyperlink CommandParameter=\"/url/\">\n      <c:CRun Text=\"URL and title\" />\n    </c:CHyperlink>\n    <c:CRun Text=\".\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CHyperlink CommandParameter=\"/url/\">\n      <c:CRun Text=\"URL and title\" />\n    </c:CHyperlink>\n    <c:CRun Text=\".\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CHyperlink CommandParameter=\"&lt;/url/&gt;\">\n      <c:CRun Text=\"URL wrapped in angle brackets\" />\n    </c:CHyperlink>\n    <c:CRun Text=\".\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CHyperlink CommandParameter=\"&lt;/url/&gt;\">\n      <c:CRun Text=\"URL w/ angle brackets + title\" />\n    </c:CHyperlink>\n    <c:CRun Text=\".\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CHyperlink CommandParameter=\"\">\n      <c:CRun Text=\"Empty\" />\n    </c:CHyperlink>\n    <c:CRun Text=\".\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CHyperlink CommandParameter=\"http://en.wikipedia.org/wiki/WIMP_(computing)\">\n      <c:CRun Text=\"With parens in the URL\" />\n    </c:CHyperlink>\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"(With outer parens and \" />\n    <c:CHyperlink CommandParameter=\"/foo(bar)\">\n      <c:CRun Text=\"parens in url\" />\n    </c:CHyperlink>\n    <c:CRun Text=\")\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CHyperlink CommandParameter=\"/foo(bar)\">\n      <c:CRun Text=\"With parens in the URL\" />\n    </c:CHyperlink>\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"(With outer parens and \" />\n    <c:CHyperlink CommandParameter=\"/foo(bar)\">\n      <c:CRun Text=\"parens in url\" />\n    </c:CHyperlink>\n    <c:CRun Text=\")\" />\n  </c:CTextBlock>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Out/UnitTestMdSyntax.Transform_givenLists1_generatesExpectedResult.approved.txt",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:m=\"https://github.com/whistyun/Markdown.Avalonia.Tight\" xmlns:ma=\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\" xmlns:ma2=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"First we have a simple numeric list\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Alpha\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Beta\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Gamma\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"3\">\n      <c:CRun Text=\"4.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"3\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Delta\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Then we have a simple unordered list\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Han\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Leia\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Luke\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"3\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"3\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Obiwan\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Unordered\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Asterisks tight:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Asterisks loose:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Pluses tight:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Pluses loose:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Minuses tight:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Minuses loose:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Ordered\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Tight:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"First\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Second\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Third\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"and:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"One\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Two\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Three\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Loose using tabs:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"First\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Second\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Third\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"and using spaces:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"One\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Two\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Three\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Multiple paragraphs:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Item 1, graf one.\" />\n      </c:CTextBlock>\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\" Item 2. graf two. The quick brown fox jumped over the lazy dog's back.\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Item 2.\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Item 3.\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Nested\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Tab\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Tab\" />\n          </c:CTextBlock>\n          <Grid Classes=\"List\">\n            <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n              <c:CRun Text=\"•\" />\n            </c:CTextBlock>\n            <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n              <c:CTextBlock Classes=\"Paragraph\">\n                <c:CRun Text=\"Tab\" />\n              </c:CTextBlock>\n            </StackPanel>\n            <Grid.ColumnDefinitions>\n              <ColumnDefinition />\n              <ColumnDefinition />\n            </Grid.ColumnDefinitions>\n            <Grid.RowDefinitions>\n              <RowDefinition />\n            </Grid.RowDefinitions>\n          </Grid>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Here's another:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"First\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Second:\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Fee\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Fie\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Foe\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Third\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Same thing but with paragraphs:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"First\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Second:\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Fee\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Fie\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Foe\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Third\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"This was an error in Markdown 1.0.1:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"this\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"sub\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\" that\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Mixing list\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"1.\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"one-one\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <c:CRun Text=\"2.\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"one-two inlist 1 inlist 2 inline 3 inline 4\" />\n          </c:CTextBlock>\n          <Border Classes=\"CodeBlock\">\n            <Border.Child>\n              <ScrollViewer Classes=\"CodeBlock\">\n                <ScrollViewer.Content>\n                  <TextBlock Text=\"as code\" Classes=\"CodeBlock\" />\n                </ScrollViewer.Content>\n              </ScrollViewer>\n            </Border.Child>\n          </Border>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"two\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"three\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"four\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"five\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"six\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"▪\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"seven\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"eight\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"eight\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"nine\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Enhanced syntax alphabet order.\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"ab. foo\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"a.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"bar ab. foo2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"b.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"bar2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"c.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foo3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"3\">\n      <c:CRun Text=\"d.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"3\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"bar3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Enhanced syntax roman order.\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"yes, we can. no, i can.\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"i.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"TwoLines\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"i.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"TwoLines\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"i.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one yes, we can\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"TwoLines\" />\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"iiii, one\" />\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n      <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"two\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"code\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"three\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <Border Classes=\"Blockquote\" xmlns=\"\">\n    <Border.Child>\n      <StackPanel Classes=\"Blockquote\">\n        <c:CTextBlock Classes=\"Paragraph\">\n          <c:CRun Text=\"quote\" />\n        </c:CTextBlock>\n      </StackPanel>\n    </Border.Child>\n  </Border>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"four\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Heading1\">\n    <c:CRun Text=\"head\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"four\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"head\" />\n  </c:CTextBlock>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n      <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"two\" />\n      </c:CTextBlock>\n      <Border Classes=\"CodeBlock\">\n        <Border.Child>\n          <ScrollViewer Classes=\"CodeBlock\">\n            <ScrollViewer.Content>\n              <TextBlock Text=\"code\" Classes=\"CodeBlock\" />\n            </ScrollViewer.Content>\n          </ScrollViewer>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"three\" />\n      </c:CTextBlock>\n      <Border Classes=\"Blockquote\">\n        <Border.Child>\n          <StackPanel Classes=\"Blockquote\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"quote\" />\n            </c:CTextBlock>\n          </StackPanel>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"3\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"3\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"four\" />\n      </c:CTextBlock>\n      <c:CTextBlock Classes=\"Heading1\">\n        <c:CRun Text=\"head\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"4\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"4\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"four\" />\n      </c:CTextBlock>\n      <c:CTextBlock Classes=\"Heading2\">\n        <c:CRun Text=\"head\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Out/UnitTestMdSyntax.Transform_givenLists2_generatesExpectedResult.approved.txt",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:m=\"https://github.com/whistyun/Markdown.Avalonia.Tight\" xmlns:ma=\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\" xmlns:ma2=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"First we have a simple numeric list\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Alpha\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Beta\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Gamma\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"3\">\n      <c:CRun Text=\"4.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"3\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Delta\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Then we have a simple unordered list\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Han\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Leia\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Luke\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"3\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"3\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Obiwan\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Unordered\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Asterisks tight:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Asterisks loose:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"asterisk 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Pluses tight:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Pluses loose:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"▪\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Plus 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Minuses tight:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Minuses loose:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 1\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 2\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"○\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Minus 3\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Ordered\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Tight:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"First\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Second\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Third\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"and:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"One\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Two\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Three\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Loose using tabs:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"First\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Second\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Third\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"and using spaces:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"One\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Two\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Three\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Multiple paragraphs:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Item 1, graf one.\" />\n      </c:CTextBlock>\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\" Item 2. graf two. The quick brown fox jumped over the lazy dog's back.\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Item 2.\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Item 3.\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Nested\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Tab\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Tab\" />\n          </c:CTextBlock>\n          <Grid Classes=\"List\">\n            <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n              <c:CRun Text=\"•\" />\n            </c:CTextBlock>\n            <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n              <c:CTextBlock Classes=\"Paragraph\">\n                <c:CRun Text=\"Tab\" />\n              </c:CTextBlock>\n            </StackPanel>\n            <Grid.ColumnDefinitions>\n              <ColumnDefinition />\n              <ColumnDefinition />\n            </Grid.ColumnDefinitions>\n            <Grid.RowDefinitions>\n              <RowDefinition />\n            </Grid.RowDefinitions>\n          </Grid>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Here's another:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"First\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Second:\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Fee\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Fie\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Foe\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Third\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Same thing but with paragraphs:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"1.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"First\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"2.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Second:\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Fee\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Fie\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"Foe\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"3.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Third\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"This was an error in Markdown 1.0.1:\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"this\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"sub\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\" that\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Out/UnitTestMdSyntax.Transform_givenLists3_generatesExpectedResult.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"alphabet: \" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"a.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"b.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"c.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"3\">\n      <c:CRun Text=\"d.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"3\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"4\">\n      <c:CRun Text=\"e.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"4\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"5\">\n      <c:CRun Text=\"f.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"5\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"6\">\n      <c:CRun Text=\"g.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"6\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"7\">\n      <c:CRun Text=\"h.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"7\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"8\">\n      <c:CRun Text=\"i.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"8\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"9\">\n      <c:CRun Text=\"j.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"9\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"10\">\n      <c:CRun Text=\"k.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"10\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"11\">\n      <c:CRun Text=\"l.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"11\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"12\">\n      <c:CRun Text=\"m.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"12\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"13\">\n      <c:CRun Text=\"n.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"13\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"14\">\n      <c:CRun Text=\"o.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"14\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"15\">\n      <c:CRun Text=\"p.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"15\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"16\">\n      <c:CRun Text=\"q.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"16\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"17\">\n      <c:CRun Text=\"r.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"17\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"18\">\n      <c:CRun Text=\"s.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"18\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"19\">\n      <c:CRun Text=\"t.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"19\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"20\">\n      <c:CRun Text=\"u.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"20\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"21\">\n      <c:CRun Text=\"v.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"21\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"22\">\n      <c:CRun Text=\"w.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"22\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"23\">\n      <c:CRun Text=\"x.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"23\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"24\">\n      <c:CRun Text=\"y.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"24\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"25\">\n      <c:CRun Text=\"z.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"25\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"26\">\n      <c:CRun Text=\"aa.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"26\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"27\">\n      <c:CRun Text=\"ab.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"27\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"28\">\n      <c:CRun Text=\"ac.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"28\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"29\">\n      <c:CRun Text=\"ad.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"29\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"30\">\n      <c:CRun Text=\"ae.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"30\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"31\">\n      <c:CRun Text=\"af.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"31\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"32\">\n      <c:CRun Text=\"ag.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"32\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"33\">\n      <c:CRun Text=\"ah.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"33\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"34\">\n      <c:CRun Text=\"ai.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"34\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"35\">\n      <c:CRun Text=\"aj.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"35\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"36\">\n      <c:CRun Text=\"ak.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"36\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"37\">\n      <c:CRun Text=\"al.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"37\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"38\">\n      <c:CRun Text=\"am.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"38\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"39\">\n      <c:CRun Text=\"an.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"39\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"40\">\n      <c:CRun Text=\"ao.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"40\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"41\">\n      <c:CRun Text=\"ap.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"41\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"42\">\n      <c:CRun Text=\"aq.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"42\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"43\">\n      <c:CRun Text=\"ar.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"43\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"44\">\n      <c:CRun Text=\"as.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"44\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"45\">\n      <c:CRun Text=\"at.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"45\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"46\">\n      <c:CRun Text=\"au.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"46\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"47\">\n      <c:CRun Text=\"av.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"47\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"48\">\n      <c:CRun Text=\"aw.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"48\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"49\">\n      <c:CRun Text=\"ax.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"49\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"50\">\n      <c:CRun Text=\"ay.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"50\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"51\">\n      <c:CRun Text=\"az.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"51\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"52\">\n      <c:CRun Text=\"ba.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"52\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"foobar\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"roman: \" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"i.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"ii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"iii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"3\">\n      <c:CRun Text=\"iv.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"3\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"4\">\n      <c:CRun Text=\"v.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"4\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"5\">\n      <c:CRun Text=\"vi.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"5\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"6\">\n      <c:CRun Text=\"vii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"6\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"7\">\n      <c:CRun Text=\"viii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"7\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"8\">\n      <c:CRun Text=\"ix.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"8\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"9\">\n      <c:CRun Text=\"x.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"9\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"10\">\n      <c:CRun Text=\"xi.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"10\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"11\">\n      <c:CRun Text=\"xii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"11\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"12\">\n      <c:CRun Text=\"xiii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"12\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"13\">\n      <c:CRun Text=\"xiv.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"13\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"14\">\n      <c:CRun Text=\"xv.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"14\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"15\">\n      <c:CRun Text=\"xvi.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"15\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"16\">\n      <c:CRun Text=\"xvii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"16\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"17\">\n      <c:CRun Text=\"xviii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"17\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"18\">\n      <c:CRun Text=\"xix.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"18\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"19\">\n      <c:CRun Text=\"xx.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"19\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"20\">\n      <c:CRun Text=\"xxi.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"20\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"21\">\n      <c:CRun Text=\"xxii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"21\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"22\">\n      <c:CRun Text=\"xxiii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"22\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"23\">\n      <c:CRun Text=\"xxiv.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"23\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"24\">\n      <c:CRun Text=\"xxv.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"24\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"25\">\n      <c:CRun Text=\"xxvi.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"25\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"26\">\n      <c:CRun Text=\"xxvii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"26\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"27\">\n      <c:CRun Text=\"xxviii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"27\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"28\">\n      <c:CRun Text=\"xxix.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"28\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"29\">\n      <c:CRun Text=\"xxx.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"29\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"30\">\n      <c:CRun Text=\"xxxi.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"30\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"31\">\n      <c:CRun Text=\"xxxii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"31\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"32\">\n      <c:CRun Text=\"xxxiii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"32\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"33\">\n      <c:CRun Text=\"xxxiv.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"33\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"34\">\n      <c:CRun Text=\"xxxv.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"34\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"35\">\n      <c:CRun Text=\"xxxvi.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"35\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"36\">\n      <c:CRun Text=\"xxxvii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"36\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"37\">\n      <c:CRun Text=\"xxxviii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"37\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"38\">\n      <c:CRun Text=\"xxxix.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"38\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"39\">\n      <c:CRun Text=\"xl.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"39\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"40\">\n      <c:CRun Text=\"xli.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"40\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"41\">\n      <c:CRun Text=\"xlii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"41\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"42\">\n      <c:CRun Text=\"xliii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"42\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"43\">\n      <c:CRun Text=\"xliv.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"43\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"44\">\n      <c:CRun Text=\"xlv.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"44\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"45\">\n      <c:CRun Text=\"xlvi.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"45\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"46\">\n      <c:CRun Text=\"xlvii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"46\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"47\">\n      <c:CRun Text=\"xlviii.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"47\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"48\">\n      <c:CRun Text=\"xlix.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"48\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"49\">\n      <c:CRun Text=\"l.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"49\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"50\">\n      <c:CRun Text=\"li.\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"50\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"hogefuga\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Out/UnitTestMdSyntax.Transform_givenMixing2_generatesExpectedResult.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:m=\"https://github.com/whistyun/Markdown.Avalonia.SyntaxHigh\" xmlns:ma=\"https://github.com/whistyun/Markdown.Avalonia.SyntaxHigh/Styles\" xmlns:a=\"https://github.com/avaloniaui/avaloniaedit\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"abcd\" />\n  </c:CTextBlock>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <m:CodePad>\n        <a:TextEditor IsReadOnly=\"True\" IsModified=\"True\" Tag=\"md\" Text=\"* one&#xA;* two&#xA;* three\" SelectedText=\"\" CaretOffset=\"0\" SelectionStart=\"0\" SelectionLength=\"0\" />\n        <Label Content=\"md\" Classes=\"LangInfo\" />\n        <m:CodePad.Content>\n          <a:TextEditor IsReadOnly=\"True\" IsModified=\"True\" Tag=\"md\" Text=\"* one&#xA;* two&#xA;* three\" SelectedText=\"\" CaretOffset=\"0\" SelectionStart=\"0\" SelectionLength=\"0\" />\n        </m:CodePad.Content>\n        <m:CodePad.ExandableMenu>\n          <Button Classes=\"CopyButton\">\n            <Button.Content>\n              <TextBlock />\n            </Button.Content>\n          </Button>\n        </m:CodePad.ExandableMenu>\n        <m:CodePad.AlwaysShowMenu>\n          <Label Content=\"md\" Classes=\"LangInfo\" />\n        </m:CodePad.AlwaysShowMenu>\n      </m:CodePad>\n    </Border.Child>\n  </Border>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"abcd\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"one\" />\n      </c:CTextBlock>\n      <Border Classes=\"CodeBlock\">\n        <Border.Child>\n          <m:CodePad>\n            <a:TextEditor IsReadOnly=\"True\" IsModified=\"True\" Tag=\"md\" Text=\"::: plugin&#xA;parameter&#xA;:::\" SelectedText=\"\" CaretOffset=\"0\" SelectionStart=\"0\" SelectionLength=\"0\" />\n            <Label Content=\"md\" Classes=\"LangInfo\" />\n            <m:CodePad.Content>\n              <a:TextEditor IsReadOnly=\"True\" IsModified=\"True\" Tag=\"md\" Text=\"::: plugin&#xA;parameter&#xA;:::\" SelectedText=\"\" CaretOffset=\"0\" SelectionStart=\"0\" SelectionLength=\"0\" />\n            </m:CodePad.Content>\n            <m:CodePad.ExandableMenu>\n              <Button Classes=\"CopyButton\">\n                <Button.Content>\n                  <TextBlock />\n                </Button.Content>\n              </Button>\n            </m:CodePad.ExandableMenu>\n            <m:CodePad.AlwaysShowMenu>\n              <Label Content=\"md\" Classes=\"LangInfo\" />\n            </m:CodePad.AlwaysShowMenu>\n          </m:CodePad>\n        </Border.Child>\n      </Border>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"two *three\" />\n      </c:CTextBlock>\n      <Grid Classes=\"List\">\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"one-two\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <c:CRun Text=\"•\" />\n        </c:CTextBlock>\n        <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n          <c:CTextBlock Classes=\"Paragraph\">\n            <c:CRun Text=\"three four\" />\n          </c:CTextBlock>\n        </StackPanel>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"abcd\" />\n  </c:CTextBlock>\n  <Border Classes=\"CodeBlock,NoContainer\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"::: plugin&#xA;* one&#xA;* two&#xA;* three&#xA;:::&#xA;\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Out/UnitTestMdSyntax.Transform_givenMixing_generatesExpectedResult.approved.txt",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:m=\"https://github.com/whistyun/Markdown.Avalonia.Tight\" xmlns:ma=\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\" xmlns:ma2=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Heading1\">\n    <c:CRun Text=\"Markdown.Xaml\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Markdown XAML is a port of the popular \" />\n    <c:CItalic>\n      <c:CRun Text=\"MarkdownSharp\" />\n    </c:CItalic>\n    <c:CRun Text=\" Markdown processor, but with one very significant difference: Instead of rendering to a string containing HTML, it renders to a FlowDocument suitable for embedding into a WPF window or usercontrol.\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Features\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"MarkDown.Xaml has a number of convenient features\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"The engine itself is a single file, for easy inclusion in your own projects\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Code for the engine is structured in the same manner as the original MarkdownSharp\" />\n        <c:CLineBreak Text=\"&#xA;\" />\n        <c:CRun Text=\"If there are any bug fixes to the regular expressions in MarkdownSharp, merging those fixes in the Markdown.Xaml should be straightforward\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Includes a \" />\n        <c:CCode>\n          <c:CRun Text=\"TextToFlowDocumentConverter\" />\n        </c:CCode>\n        <c:CRun Text=\" to make it easy to bind Markdown text\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Markdown capabilities and customizables styles\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Links \" />\n        <c:CHyperlink CommandParameter=\"https://www.google.com\">\n          <c:CRun Text=\"Go to Google!\" />\n        </c:CHyperlink>\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Links with title \" />\n        <c:CHyperlink CommandParameter=\"https://www.google.com\">\n          <c:CRun Text=\"Go to Google!\" />\n        </c:CHyperlink>\n      </c:CTextBlock>\n    </StackPanel>\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Remote images\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n      <RowDefinition />\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CImage />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CImage Classes=\"blue\" />\n    <c:CImage Classes=\"cyan\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Local images\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CImage />\n    <c:CRun Text=\" \" />\n    <c:CImage />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Table\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"table begin string\" />\n  </c:CTextBlock>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"3\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a1234567890\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"1\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b1234567890\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"2\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c1234567890\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"3\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d1234567890\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"A\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"1\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"C\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"3\" Grid.Row=\"3\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"あ\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"1\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"い\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"2\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"う\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"3\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"え\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"table end string\" />\n  </c:CTextBlock>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Code\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Markdown.Xaml support \" />\n    <c:CCode>\n      <c:CRun Text=\"inline code\" />\n    </c:CCode>\n  </c:CTextBlock>\n  <Border Classes=\"CodeBlock\" xmlns=\"\">\n    <Border.Child>\n      <ScrollViewer Classes=\"CodeBlock\">\n        <ScrollViewer.Content>\n          <TextBlock Text=\"#include &lt;stdio.h&gt;&#xA;int main()&#xA;{&#xA;   // printf() displays the string inside quotation&#xA;   printf(&quot;Hello, World!&quot;);&#xA;   return 0;&#xA;}\" Classes=\"CodeBlock\" />\n        </ScrollViewer.Content>\n      </ScrollViewer>\n    </Border.Child>\n  </Border>\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Separator\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Bold\" />\n  <Grid Classes=\"List\" xmlns=\"\">\n    <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n      <c:CRun Text=\"•\" />\n    </c:CTextBlock>\n    <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n      <c:CTextBlock Classes=\"Paragraph\">\n        <c:CRun Text=\"Blockquote\" />\n      </c:CTextBlock>\n    </StackPanel>\n    <Grid.ColumnDefinitions>\n      <ColumnDefinition />\n      <ColumnDefinition />\n    </Grid.ColumnDefinitions>\n    <Grid.RowDefinitions>\n      <RowDefinition />\n    </Grid.RowDefinitions>\n  </Grid>\n  <Border Classes=\"Blockquote\" xmlns=\"\">\n    <Border.Child>\n      <StackPanel Classes=\"Blockquote\">\n        <c:CTextBlock Classes=\"Heading2\">\n          <c:CRun Text=\"Features\" />\n        </c:CTextBlock>\n        <c:CTextBlock Classes=\"Paragraph\">\n          <c:CRun Text=\"MarkDown.Xaml has a number of convenient features\" />\n        </c:CTextBlock>\n        <Grid Classes=\"List\">\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"0\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"0\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"The engine itself is a single file, for easy inclusion in your own projects\" />\n            </c:CTextBlock>\n          </StackPanel>\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"1\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"1\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"Code for the engine is structured in the same manner as the original MarkdownSharp \" />\n            </c:CTextBlock>\n          </StackPanel>\n          <c:CTextBlock Classes=\"ListMarker\" Grid.Column=\"0\" Grid.Row=\"2\">\n            <c:CRun Text=\"•\" />\n          </c:CTextBlock>\n          <StackPanel Grid.Column=\"1\" Grid.Row=\"2\">\n            <c:CTextBlock Classes=\"Paragraph\">\n              <c:CRun Text=\"Includes a \" />\n              <c:CCode>\n                <c:CRun Text=\"TextToFlowDocumentConverter\" />\n              </c:CCode>\n              <c:CRun Text=\" to make it easy to bind Markdown text\" />\n            </c:CTextBlock>\n          </StackPanel>\n          <Grid.ColumnDefinitions>\n            <ColumnDefinition />\n            <ColumnDefinition />\n          </Grid.ColumnDefinitions>\n          <Grid.RowDefinitions>\n            <RowDefinition />\n            <RowDefinition />\n            <RowDefinition />\n          </Grid.RowDefinitions>\n        </Grid>\n      </StackPanel>\n    </Border.Child>\n  </Border>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"What is this Demo?\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"This demo application shows MarkDown.Xaml in use - as you make changes to the left pane, the rendered MarkDown will appear in the right pane.\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Heading3\">\n    <c:CRun Text=\"Source\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Review the source for this demo to see how MarkDown.Xaml works in practice, how to use the TextToFlowDocumentConverter, and how to style the output to appear the way you desire.\" />\n  </c:CTextBlock>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Out/UnitTestMdSyntax.Transform_givenTables1_generatesExpectedResult.approved.txt",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:m=\"https://github.com/whistyun/Markdown.Avalonia.Tight\" xmlns:ma=\"https://github.com/whistyun/Markdown.Avalonia.Tight/Styles\" xmlns:ma2=\"clr-namespace:Markdown.Avalonia.Controls;assembly=Markdown.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"firstTable\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"asdf\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"3\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"1\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"2\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"3\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"1\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"2\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"3\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"3\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"4\" Grid.Row=\"0\" />\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"1\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"2\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"3\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"4\" Grid.Row=\"1\" />\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"1\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"2\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"3\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"4\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"e\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"3\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"4\" Grid.Row=\"0\" />\n        <Border Classes=\"TableHeader\" Grid.Column=\"5\" Grid.Row=\"0\" />\n        <Border Classes=\"TableHeader\" Grid.Column=\"6\" Grid.Row=\"0\" />\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\" Grid.ColumnSpan=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"A\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"3\" Grid.Row=\"1\" Grid.ColumnSpan=\"2\" Grid.RowSpan=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"C\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"5\" Grid.Row=\"1\" />\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"6\" Grid.Row=\"1\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"5\" Grid.Row=\"2\" Grid.ColumnSpan=\"2\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"あ\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"1\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"い\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"う\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"4\" Grid.ColumnSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"5\" Grid.Row=\"4\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"6\" Grid.Row=\"4\" />\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"5\" />\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"1\" Grid.Row=\"5\" />\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"2\" Grid.Row=\"5\" />\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"5\" Grid.Row=\"5\" />\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"6\" Grid.Row=\"5\" />\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\" />\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\" />\n        <Border Classes=\"TableHeader\" Grid.Column=\"3\" Grid.Row=\"0\" />\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"alpha\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"1\" Grid.Row=\"1\" />\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"2\" Grid.Row=\"1\" />\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"3\" Grid.Row=\"1\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"beta\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"gamma\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"2\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"2\" />\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"3\" Grid.ColumnSpan=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"delta\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"3\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"epsilon\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"3\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1-1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"1\" Grid.Row=\"1\" Grid.ColumnSpan=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1-2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"2\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"2-2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"2\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"2\" />\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"3\" />\n        <Border Classes=\"OddTableRow\" Grid.Column=\"3\" Grid.Row=\"3\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"4\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"4-3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"4\" />\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"1\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"3\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"6\" Grid.ColumnSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"6-1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"6\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"6-3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"6\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"6-4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"7\" Grid.ColumnSpan=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"7-1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"3\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1-1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"1\" Grid.Row=\"1\" Grid.ColumnSpan=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1-2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"2\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"2-2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"2\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"2\" />\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"3\" />\n        <Border Classes=\"OddTableRow\" Grid.Column=\"3\" Grid.Row=\"3\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"4\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"4-3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"4\" />\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"1\" Grid.Row=\"5\" />\n        <Border Classes=\"OddTableRow\" Grid.Column=\"3\" Grid.Row=\"5\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"6\" Grid.ColumnSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"6-1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"6\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"6-3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"6\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"6-4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"7\" Grid.ColumnSpan=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"7-1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"3\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"1\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"2\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"3\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"1\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"2\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"3\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"3\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"4\" Grid.Row=\"0\" />\n        <Border Classes=\"TableHeader\" Grid.Column=\"5\" Grid.Row=\"0\" />\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\" Grid.ColumnSpan=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"A\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"3\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock />\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"4\" Grid.Row=\"1\" Grid.ColumnSpan=\"2\" Grid.RowSpan=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"C\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"あ\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"1\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"い\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"う\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"3\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"え\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"4\" Grid.ColumnSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"2\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"3\" Grid.Row=\"4\" />\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n              <c:CLineBreak Text=\"&#xA;\" />\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\" />\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"alpha\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"1\" Grid.Row=\"1\" />\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"be\" />\n              <c:CLineBreak Text=\"&#xA;\" />\n              <c:CRun Text=\"ta\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"gamma\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"\\a. delta\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"1\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"epsilon\" />\n              <c:CLineBreak Text=\"&#xA;\" />\n              <c:CRun Text=\"kappa?\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <ma2:Rule BoldLineWidth=\"2\" Classes=\"Single\" />\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"3\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a1234567890\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"1\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b1234567890\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"2\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c1234567890\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"3\" Grid.Row=\"1\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d1234567890\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"a\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"2\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"b\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"c\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"d\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"A\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"3\" Grid.ColumnSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"C\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"0\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"1\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"4\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"0\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"あ\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"1\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"い\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"2\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"う\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,LastTableRow\" Grid.Column=\"3\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"え\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n  <Border Classes=\"Table\" xmlns=\"\">\n    <Border.Child>\n      <Grid Classes=\"Table\">\n        <Border Classes=\"TableHeader\" Grid.Column=\"0\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column1\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"1\" Grid.Row=\"0\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column2\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"TableHeader\" Grid.Column=\"2\" Grid.Row=\"0\" Grid.ColumnSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"column3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"0\" Grid.Row=\"1\" Grid.RowSpan=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"alpha\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"1\" Grid.Row=\"1\" Grid.ColumnSpan=\"2\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"beta\" />\n              <c:CLineBreak Text=\"&#xA;\" />\n              <c:CRun Text=\"Gamma\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow,FirstTableRow\" Grid.Column=\"3\" Grid.Row=\"1\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"Farms\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"1\" Grid.Row=\"3\" Grid.RowSpan=\"3\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"alpha\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"3\" Grid.ColumnSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"bar3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"2\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"foo3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow\" Grid.Column=\"3\" Grid.Row=\"4\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"foo3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"0\" Grid.Row=\"5\" Grid.RowSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"delta\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"2\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"foo3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"OddTableRow\" Grid.Column=\"3\" Grid.Row=\"5\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"foo3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"1\" Grid.Row=\"6\" Grid.ColumnSpan=\"2\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"bar3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Border Classes=\"EvenTableRow,LastTableRow\" Grid.Column=\"3\" Grid.Row=\"6\">\n          <Border.Child>\n            <c:CTextBlock>\n              <c:CRun Text=\"foo3\" />\n            </c:CTextBlock>\n          </Border.Child>\n        </Border>\n        <Grid.ColumnDefinitions>\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n          <ColumnDefinition />\n        </Grid.ColumnDefinitions>\n        <Grid.RowDefinitions>\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n          <RowDefinition />\n        </Grid.RowDefinitions>\n      </Grid>\n    </Border.Child>\n  </Border>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Out/UnitTestMdSyntax.Transform_givenTest1_generatesExpectedResult.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Heading1\">\n    <c:CRun Text=\"Header 1\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, hendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit consectetur faucibus quis a urna. \" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Header 2\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, hendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit consectetur faucibus quis a urna. \" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Heading1\">\n    <c:CRun Text=\"Header Level 1\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, hendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit consectetur faucibus quis a urna. \" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Heading2\">\n    <c:CRun Text=\"Header Level 2\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, hendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit consectetur faucibus quis a urna. \" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Heading3\">\n    <c:CRun Text=\"Header Level 3\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, hendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit consectetur faucibus quis a urna. \" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Heading4\">\n    <c:CRun Text=\"Header Level 4\" />\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CRun Text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, hendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit consectetur faucibus quis a urna. \" />\n  </c:CTextBlock>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Out/UnitTestMdSyntax.Transform_givenTextStyles_generatesExpectedResult.approved.txt",
    "content": "<?xml version=\"1.0\" encoding=\"utf-16\"?>\n<StackPanel xmlns:c=\"clr-namespace:ColorTextBlock.Avalonia;assembly=ColorTextBlock.Avalonia\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns=\"https://github.com/avaloniaui\">\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CItalic>\n      <c:CRun Text=\"This text will be italic\" />\n    </c:CItalic>\n    <c:CRun Text=\" \" />\n    <c:CBold>\n      <c:CRun Text=\"This text will be bold\" />\n    </c:CBold>\n  </c:CTextBlock>\n  <c:CTextBlock Classes=\"Paragraph\">\n    <c:CStrikethrough IsStrikethrough=\"True\">\n      <c:CRun Text=\"This text will be striketrhough\" />\n    </c:CStrikethrough>\n    <c:CRun Text=\" \" />\n    <c:CUnderline IsUnderline=\"True\">\n      <c:CRun Text=\"This text will be underline\" />\n    </c:CUnderline>\n  </c:CTextBlock>\n</StackPanel>\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Texts/Blockquite.md",
    "content": "﻿> ## Features ##\n> MarkDown.Xaml has a number of convenient features\n> \n> * The engine itself is a single file, for easy inclusion in your own projects\n> * Code for the engine is structured in the same manner as the original MarkdownSharp  \n> * Includes a `TextToFlowDocumentConverter` to make it easy to bind Markdown text\n\n> ## Features ##\n> MarkDown.Xaml has a number of convenient features\n> \n> * The engine itself is a single file, for easy inclusion in your own projects\n> * Code for the engine is structured in the same manner as the original MarkdownSharp  \n> * Includes a `TextToFlowDocumentConverter` to make it easy to bind Markdown text"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Texts/Codes.md",
    "content": "﻿# ` ``` `\n\n````\n```cs\npublic void Main(){\n    Console.WriteLine(\"`Hello World`\");\n}\n```\n````\n\n```\npublic void Main(){\n    Console.WriteLine(\"`Hello World`\");\n}\n```\n\n> ```\n> public void Main(){\n>     Console.WriteLine(\"`Hello World`\");\n> }\n> ```\n\n   ```\n   public void Main(){\n       Console.WriteLine(\"`Hello World`\");\n   }\n   ```\n\n\n    ```cs\n    public void Main(){\n        Console.WriteLine(\"`Hello World`\");\n    }\n    ```\n\n* ```\n  public void Main(){\n\n\n\n\n  \n\n\n\n\n  }\n  ```\n\n* * *\n\n+ one\n  ```\n  public void Main(){\n\n\n\n\n  \n\n\n\n\n  }\n  ```\n\n= = =\n\n+ one\n\n  ```\n  public void Main(){\n\n\n\n\n  \n\n\n\n\n  }\n  ```\n\n# Indent\n\n    abcd\n    efgh\n\n---\n\n     abcd\n    efgh\n\n---\n\n    abcd\n     efgh\n     \n     ijkl\n\n    opqr\n    \n---\n\n>     asdf\n>      ghij\n\n*   \n      public void Main(){\n\n\n\n\n  \n\n\n\n\n      }\n\n* * *\n\n+ one\n      public void Main(){\n\n\n\n\n  \n\n\n\n\n      }\n\n* * *\n\n+ one\n\n      public void Main(){\n\n\n\n\n  \n\n\n\n\n      }\n\n* * *\n\n```c\npublic void Main(){\n    Console.WriteLine(\"`Hello World`\");\n}\n```\n\n```cs\npublic void Main(){\n    Console.WriteLine(\"`Hello World`\");\n}\n```\n\n```java\npublic void Main(){\n    Console.WriteLine(\"`Hello World`\");\n}\n```\n\n```html\npublic void Main(){\n    Console.WriteLine(\"`Hello World`\");\n}\n```"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Texts/ContainerBlock.md",
    "content": "﻿::::\n:::cs\npublic void Main(){\n    Console.WriteLine(\":Hello World:\");\n}\n:::\n::::\n\n:::\npublic void Main(){\n    Console.WriteLine(\":Hello World:\");\n}\n:::\n\n> :::\n> public void Main(){\n>     Console.WriteLine(\":Hello World:\");\n> }\n> :::\n\n   :::\n   public void Main(){\n       Console.WriteLine(\":Hello World:\");\n   }\n   :::\n\n\n    :::cs\n    public void Main(){\n        Console.WriteLine(\":Hello World:\");\n    }\n    :::\n\n* :::\n  public void Main(){\n\n\n\n\n  \n\n\n\n\n  }\n  :::\n\n* * *\n\n+ one\n  :::\n  public void Main(){\n\n\n\n\n  \n\n\n\n\n  }\n  :::\n\n= = =\n\n1. one\n\n   :::\n   public void Main(){\n \n \n \n \n   \n \n \n \n \n   }\n   :::\n\n===\n\n::: md\n\n* list1\n* list2\n\n```cs\n#define FooBar\n```\n:::"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Texts/Emoji.md",
    "content": "﻿:smile:\n\nsmile:angry::smile:\n\n\\:angry:\n\n:unknown_missing_symbols:\n\n:lackoftxt"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Texts/HorizontalRules.md",
    "content": "﻿Dashes:\n\n---\n\n ---\n \n  ---\n\n   ---\n\n\t---\n\n- - -\n\n - - -\n \n  - - -\n\n   - - -\n\n\t- - -\n\n\nAsterisks:\n\n***\n\n ***\n \n  ***\n\n   ***\n\n\t***\n\n* * *\n\n * * *\n \n  * * *\n\n   * * *\n\n\t* * *\n\n\nUnderscores:\n\n___\n\n ___\n \n  ___\n\n   ___\n\n    ___\n\n_ _ _\n\n _ _ _\n \n  _ _ _\n\n   _ _ _\n\n    _ _ _\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Texts/Images.md",
    "content": "A remote ![image](http://placehold.it/350x150).\n\nImages side by side \n![imageleft](http://placehold.it/100x150/0000FF)![imageright](http://placehold.it/100x150/00FFFF)\n\n![imageright](http://placehold.it/100x150/00FFFF \"cyan\")\n\nA resource image ![image](RscImg.png).\nA local image ![image](ExtImg.png).\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Texts/Links_inline_style.md",
    "content": "Just a [URL](/url/).\n\n[URL and title](/url/ \"title\").\n\n[URL and title](/url/  \"title preceded by two spaces\").\n\n[URL and title](/url/\t\"title preceded by a tab\").\n\n[URL and title](/url/ \"title has spaces afterward\"  ).\n\n[URL wrapped in angle brackets](</url/>).\n\n[URL w/ angle brackets + title](</url/> \"Here's the title\").\n\n[Empty]().\n\n[With parens in the URL](http://en.wikipedia.org/wiki/WIMP_(computing))\n\n(With outer parens and [parens in url](/foo(bar)))\n\n\n[With parens in the URL](/foo(bar) \"and a title\")\n\n(With outer parens and [parens in url](/foo(bar) \"and a title\"))\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Texts/Lists1.md",
    "content": "﻿\nFirst we have a simple numeric list\n\n1. Alpha\n1. Beta\n2. Gamma\n3. Delta\n\nThen we have a simple unordered list\n\n* Han\n* Leia\n* Luke\n* Obiwan\n\n## Unordered\n\nAsterisks tight:\n\n*\tasterisk 1\n*\tasterisk 2\n*\tasterisk 3\n\n\nAsterisks loose:\n\n*\tasterisk 1\n\n*\tasterisk 2\n\n*\tasterisk 3\n\n* * *\n\nPluses tight:\n\n+\tPlus 1\n+\tPlus 2\n+\tPlus 3\n\n\nPluses loose:\n\n+\tPlus 1\n\n+\tPlus 2\n\n+\tPlus 3\n\n* * *\n\n\nMinuses tight:\n\n-\tMinus 1\n-\tMinus 2\n-\tMinus 3\n\n\nMinuses loose:\n\n-\tMinus 1\n\n-\tMinus 2\n\n-\tMinus 3\n\n\n## Ordered\n\nTight:\n\n1.\tFirst\n2.\tSecond\n3.\tThird\n\nand:\n\n1. One\n2. Two\n3. Three\n\n\nLoose using tabs:\n\n1.\tFirst\n\n2.\tSecond\n\n3.\tThird\n\nand using spaces:\n\n1. One\n\n2. Two\n\n3. Three\n\nMultiple paragraphs:\n\n1.\tItem 1, graf one.\n\n\tItem 2. graf two. The quick brown fox jumped over the lazy dog's\n\tback.\n\t\n2.\tItem 2.\n\n3.\tItem 3.\n\n\n\n## Nested\n\n*\tTab\n\t*\tTab\n\t\t*\tTab\n\nHere's another:\n\n1. First\n2. Second:\n\t* Fee\n\t* Fie\n\t* Foe\n3. Third\n\nSame thing but with paragraphs:\n\n1. First\n\n2. Second:\n\t* Fee\n\t* Fie\n\t* Foe\n\n3. Third\n\n\nThis was an error in Markdown 1.0.1:\n\n*\tthis\n\n\t*\tsub\n\n\tthat\n\n\nMixing list\n\n1. one\n    1. one-one\n    1. one-two\n       inlist 1\n        inlist 2\n         inline 3\n          inline 4\n\n           as code\n2. two\n* three\n* four\n+ five\n+ six\n    + seven\n+ eight\n- eight\n- nine\n\nEnhanced syntax alphabet order.\n\nab. foo\na. bar\nab. foo2\na. bar2\na. foo3\na. bar3\n\nEnhanced syntax roman order.\n\nyes, we can.\nno, i can.\ni, one\n\n===\n\nii, one\n\n===\n\niii, one\nyes, we can\n\n===\n\niiii, one\n\n\n* * *\n* one\n* * *\n* one\n * * *\n* one\n  * * *\n* two\n```\ncode\n```\n* three\n> quote\n* four\n# head\n* four\n## head\n\n* * *\n* one\n   * * *\n* two\n ```\n code\n ```\n* three\n > quote\n* four\n # head\n* four\n ## head\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Texts/Lists2.md",
    "content": "﻿\nFirst we have a simple numeric list\n1. Alpha\n1. Beta\n2. Gamma\n3. Delta\n\nThen we have a simple unordered list\n* Han\n* Leia\n* Luke\n* Obiwan\n\n## Unordered\n\nAsterisks tight:\n*\tasterisk 1\n*\tasterisk 2\n*\tasterisk 3\n\n\nAsterisks loose:\n*\tasterisk 1\n\n*\tasterisk 2\n\n*\tasterisk 3\n\n* * *\n\nPluses tight:\n+\tPlus 1\n+\tPlus 2\n+\tPlus 3\n\n\nPluses loose:\n+\tPlus 1\n\n+\tPlus 2\n\n+\tPlus 3\n\n* * *\n\n\nMinuses tight:\n-\tMinus 1\n-\tMinus 2\n-\tMinus 3\n\n\nMinuses loose:\n-\tMinus 1\n\n-\tMinus 2\n\n-\tMinus 3\n\n\n## Ordered\n\nTight:\n1.\tFirst\n2.\tSecond\n3.\tThird\n\nand:\n1. One\n2. Two\n3. Three\n\n\nLoose using tabs:\n1.\tFirst\n\n2.\tSecond\n\n3.\tThird\n\nand using spaces:\n1. One\n\n2. Two\n\n3. Three\n\nMultiple paragraphs:\n1.\tItem 1, graf one.\n\n\tItem 2. graf two. The quick brown fox jumped over the lazy dog's\n\tback.\n\t\n2.\tItem 2.\n\n3.\tItem 3.\n\n\n\n## Nested\n*\tTab\n\t*\tTab\n\t\t*\tTab\n\nHere's another:\n1. First\n2. Second:\n\t* Fee\n\t* Fie\n\t* Foe\n3. Third\n\nSame thing but with paragraphs:\n1. First\n\n2. Second:\n\t* Fee\n\t* Fie\n\t* Foe\n\n3. Third\n\n\nThis was an error in Markdown 1.0.1:\n*\tthis\n\n\t*\tsub\n\n\tthat\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Texts/Lists3.md",
    "content": "﻿alphabet:  \n\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\na. foobar\n\nroman:  \ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\ni, hogefuga\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Texts/Mixing.md",
    "content": "﻿# Markdown.Xaml #\n\nMarkdown XAML is a port of the popular *MarkdownSharp* Markdown processor, but \nwith one very significant difference: Instead of rendering to a string \ncontaining HTML, it renders to a FlowDocument suitable for embedding into a \nWPF window or usercontrol.\n\n## Features ##\n\nMarkDown.Xaml has a number of convenient features\n\n* The engine itself is a single file, for easy inclusion in your own projects\n* Code for the engine is structured in the same manner as the original MarkdownSharp  \nIf there are any bug fixes to the regular expressions in MarkdownSharp, merging those fixes in the Markdown.Xaml should be straightforward\n* Includes a `TextToFlowDocumentConverter` to make it easy to bind Markdown text\n\n\n## Markdown capabilities and customizables styles ##\n\n* Links [Go to Google!](https://www.google.com)\n* Links with title [Go to Google!](https://www.google.com \"google.\")\n* Remote images\n\n![image1](http://placehold.it/350x150)\n\n![imageleft](http://placehold.it/100x150/0000FF \"blue\")![imageright](http://placehold.it/100x150/00FFFF \"cyan\")\n\n* Local images\n\n![image](RscImg.png)\n![image](ExtImg.png)\n\n* Table\n\ntable begin string\n|a|b|c|d|\n|:-:|:-|-:|\n|a1234567890|b1234567890|c1234567890|d1234567890|\n|a|b|c|d|\n|A||C|\n|1|2|3|4|\n|あ|い|う|え|\ntable end string\n\n* Code\n\nMarkdown.Xaml support ```inline code ```\n\n```\n#include <stdio.h>\nint main()\n{\n   // printf() displays the string inside quotation\n   printf(\"Hello, World!\");\n   return 0;\n}\n```\n\n* Separator\n***\n\n* Blockquote\n\n> ## Features ##\n> MarkDown.Xaml has a number of convenient features\n> \n> * The engine itself is a single file, for easy inclusion in your own projects\n> * Code for the engine is structured in the same manner as the original MarkdownSharp  \n> * Includes a `TextToFlowDocumentConverter` to make it easy to bind Markdown text\n\n\n## What is this Demo? ##\n\nThis demo application shows MarkDown.Xaml in use - as you make changes to the \nleft pane, the rendered MarkDown will appear in the right pane.\n\n### Source ###\n\nReview the source for this demo to see how MarkDown.Xaml works in practice, how to use the TextToFlowDocumentConverter,\nand how to style the output to appear the way you desire.\n\n\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Texts/Mixing2.md",
    "content": "﻿abcd\n```md\n* one\n* two\n* three\n```\n\nabcd\n* one\n  ```md\n  ::: plugin\n  parameter\n  :::\n  ```\n* two\n*three\n   * one-two\n   * three four\n\nabcd\n::: plugin\n* one\n* two\n* three\n:::"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Texts/Tables.md",
    "content": "﻿\n|firstTable|\n|-|\n|asdf|\n\n|a|b|c|d|\n|--|:-|-:|:-:|\n|a|b|c|d|\n|a|b|c|d|\n\n|a|b|c|d|\n|--|:-|-:|:-:|\n|a|b|c|d|\n|a|b|c|d|e|\n\n|a|b|c|d|\n|:-:|:-|-:|\n|\\3.A|\\2/5.C|\n|1|2|3|\\2/2.4|\n|あ|い|う|\n|\\2. a|b\n\n| a   |\n| -----: | :-----: |\n| alpha |\n| beta  | gamma |\n|\\3. delta | epsilon |\n\n|column1| column2| column3| column4|\n|---|---|---|---|\n|/2. 1-1|\\3. 1-2|\n|/2. 2-2|\n| \n| | |/2. 4-3|\n| | | |\n|\\2. 6-1| 6-3|/2. 6-4|\n|\\3. 7-1|\n\n|column1| column2| column3| column4|\n|---|---|---|---|\n|/2. 1-1|\\3. 1-2|\n|/2. 2-2|\n||\n| | |/2. 4-3|\n||\n|\\2. 6-1| 6-3|/2. 6-4\n|\\3. 7-1\n\n\n---\n\n|a|b|c|d|\n--|:-|-:|:-:\na|b|c|d\na|b|c|d\n\n\na|b|c|d\n:-:|:-|-:\n\\3.A||\\2/4.C\n1|2|3|4\nあ|い|う|え\n\\2. a|b\n\n---\n\n| a\\nb   |\n| -----: | :-----: |\n| alpha |\n| be\\nta  | gamma |\n|\\a. delta | epsilon\\nkappa? |\n\n\n---\n\n|a|b|c|d|\n|:-:|:-|-:|\n|a1234567890|b1234567890|c1234567890|d1234567890|\n|a|/2.b|c|d|\n|A|\\2.C|\n|1|2|3|4|\n|あ|い|う|え|\n\n\n| column1| column2|\\2. column3|\n|---:|:---:|---:|---|\n|/4. alpha|/2\\2. beta\\nGamma|/2. Farms|\n|/3. alpha|\\2. bar3|\n| foo3| foo3|\n|/2. delta| foo3| foo3|\n|\\2. bar3| foo3|\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Texts/Test1.md",
    "content": "﻿Header 1\n========\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, \nhendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit \nconsectetur faucibus quis a urna. \n\nHeader 2\n-----------\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, \nhendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit \nconsectetur faucibus quis a urna. \n\n# Header Level 1\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, \nhendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit \nconsectetur faucibus quis a urna. \n\n## Header Level 2\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, \nhendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit \nconsectetur faucibus quis a urna. \n\n### Header Level 3\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, \nhendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit \nconsectetur faucibus quis a urna. \n\n#### Header Level 4\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Duis orci erat, \nhendrerit et interdum at, feugiat non diam. Vestibulum id odio non elit \nconsectetur faucibus quis a urna. \n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/Texts/Text_style.md",
    "content": "﻿*This text will be italic*\n**This text will be bold**\n\n~~This text will be striketrhough~~\n__This text will be underline__"
  },
  {
    "path": "tests/UnitTest.MdSyntax/UnitTest.MdSyntax.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <Import Project=\"..\\UnitTest.props\" />\n\n  <PropertyGroup>\n    <TargetFrameworks>$(TestTargetFrameworks)</TargetFrameworks>\n    <IsPackable>false</IsPackable>\n    <LangVersion>9</LangVersion>\n    <Nullable>disable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Avalonia\" Version=\"$(TestAvaloniaVersion)\" />\n    <PackageReference Include=\"Avalonia.Desktop\" Version=\"$(TestAvaloniaVersion)\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\ColorTextBlock.Avalonia\\ColorTextBlock.Avalonia.csproj\" />\n    <ProjectReference Include=\"..\\..\\Markdown.Avalonia.Tight\\Markdown.Avalonia.Tight.csproj\" />\n    <ProjectReference Include=\"..\\UnitTest.Base\\UnitTest.Base.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup Condition=\"'$(EnableAvaloniaEdit)' == 'enabled'\">\n    <ProjectReference Include=\"..\\..\\Markdown.Avalonia.SyntaxHigh\\Markdown.Avalonia.SyntaxHigh.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup Condition=\"'$(EnableAvaloniaEdit)' == 'disabled'\">\n    <Compile Remove=\"*.cs\" />\n    <None Include=\"*.cs\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Update=\"Texts\\*\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/UnitTestConverter.cs",
    "content": "﻿using Avalonia.Media;\nusing AvaloniaEdit.Highlighting;\nusing Markdown.Avalonia.SyntaxHigh.Extensions;\nusing NUnit.Framework;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text;\nusing UnitTest.Base;\nusing UnitTest.Base.Utils;\n\nnamespace UnitTest.MdSyntax\n{\n    class UnitTestConverter\n    {\n        [Test]\n        public void TryConvert()\n        {\n            var colors = typeof(Colors).GetProperties(BindingFlags.Public | BindingFlags.Static)\n                                       .Select(fld => fld.GetValue(null))\n                                       .Cast<Color>()\n                                       .ToArray();\n\n            Assert.AreNotEqual(0, colors.Length);\n\n            foreach (var def in HighlightingManager.Instance.HighlightingDefinitions)\n            {\n                if (def.Name == \"TeX\")\n                {\n                    /*\n                     Avalonia.AvaloniaEdit (0.10.0) seems to nosupport  \"xfhd\" V1.\n                     Tex-Mode.xshd is written in V1. So TeX-HighlightingDefinition is invalid.\n                     */\n                    continue;\n                }\n\n                foreach (var foreCol in colors)\n                {\n                    var wrapper = new HighlightWrapper(def, foreCol);\n\n                    foreach (var brsh in wrapper.NamedHighlightingColors)\n                    {\n                        brsh.Foreground?.GetColor(null);\n                    }\n\n                    var wrapperType = wrapper.GetType();\n                    var cvtFldInf = wrapperType.GetField(\"_converted\", BindingFlags.NonPublic | BindingFlags.Instance);\n\n                    var cvt = (Dictionary<HighlightingRuleSet, HighlightingRuleSet>)cvtFldInf.GetValue(wrapper);\n                    foreach (var rule in cvt.Values)\n                    {\n                        Look(rule);\n                    }\n                }\n            }\n        }\n\n        private void Look(HighlightingRuleSet ruleSet)\n        {\n            foreach (var span in ruleSet.Spans)\n            {\n                span.StartColor?.Foreground?.GetColor(null);\n                span.SpanColor?.Foreground?.GetColor(null);\n                span.EndColor?.Foreground?.GetColor(null);\n            }\n\n            foreach (var rule in ruleSet.Rules)\n            {\n                rule.Color?.Foreground?.GetColor(null);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tests/UnitTest.MdSyntax/UnitTestMdSyntax.cs",
    "content": "using ApprovalTests;\nusing ApprovalTests.Reporters;\nusing Avalonia.Controls;\nusing NUnit.Framework;\nusing System.Linq;\nusing UnitTest.Base;\nusing UnitTest.Base.Utils;\n\nnamespace UnitTest.MdSyntax\n{\n    [UseReporter(typeof(DiffReporter))]\n    public class UnitTestMdSyntax : UnitTestBase\n    {\n        [Test]\n        [RunOnUI]\n        public void Transform_givenTest1_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Test1.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenLists1_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Lists1.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenLists2_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Lists2.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenLists3_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Lists3.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenTables1_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Tables.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenHorizontalRules_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"HorizontalRules.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenLinksInline_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Links_inline_style.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenTextStyles_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Text_style.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenImages_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Images.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            markdown.AssetPathRoot = AssetPath;\n\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenBlockqoute_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Blockquite.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenMixing_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Mixing.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            markdown.AssetPathRoot = AssetPath;\n\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenMixing2_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Mixing2.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            markdown.AssetPathRoot = AssetPath;\n\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenCodes_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"Codes.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            markdown.AssetPathRoot = AssetPath;\n\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenContainer_generatesExpectedResult()\n        {\n            var text = Util.LoadText(\"ContainerBlock.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            markdown.AssetPathRoot = AssetPath;\n\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void Transform_givenEmoji()\n        {\n            var text = Util.LoadText(\"Emoji.md\");\n            var markdown = new Markdown.Avalonia.Markdown();\n            markdown.AssetPathRoot = AssetPath;\n\n            var result = markdown.Transform(text);\n            Approvals.Verify(Util.AsXaml(result));\n        }\n\n        [Test]\n        [RunOnUI]\n        public void CheckSwitch()\n        {\n            var markdown = new Markdown.Avalonia.Markdown();\n            markdown.ContainerBlockHandler = new Markdown.Avalonia.ContainerSwitch() {\n                { \"test\", new EmptyBorder(\"TestBorder1\")},\n                { \"test2\", new EmptyBorder(\"TestBorder2\")},\n            };\n\n            {\n                var control1_1 = markdown.Transform(TextUtil.HereDoc(@\"\n                    ::: test{}\n                    some text\n                    :::\n                \"));\n                Assert.AreEqual(1, Util.FindControlsByClassName<Border>(control1_1, \"TestBorder1\").Count());\n            }\n\n            {\n                var control1_2 = markdown.Transform(TextUtil.HereDoc(@\"\n                    ::: test             []\n                    some text\n                    :::\n                \"));\n                Assert.AreEqual(1, Util.FindControlsByClassName<Border>(control1_2, \"TestBorder1\").Count());\n            }\n\n            {\n                var control2 = markdown.Transform(TextUtil.HereDoc(@\"\n                    :::    test2    ()\n                    some text\n                    :::\n                \"));\n                Assert.AreEqual(1, Util.FindControlsByClassName<Border>(control2, \"TestBorder2\").Count());\n            }\n\n        }\n\n\n        class EmptyBorder : Markdown.Avalonia.Utils.IContainerBlockHandler\n        {\n            public string ClassName { private set; get; }\n\n            public EmptyBorder(string classNm)\n            {\n                ClassName = classNm;\n            }\n\n            public Avalonia.Controls.Border ProvideControl(string assetPathRoot, string blockName, string lines)\n            {\n                var border = new Avalonia.Controls.Border();\n                border.Classes.Add(ClassName);\n\n                return border;\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "tests/UnitTest.props",
    "content": "<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n\n  <Import Project=\"..\\Markdown.Avalonia.props\" />\n\n  <ItemGroup>\n    <PackageReference Include=\"nunit\" Version=\"3.12.0\" />\n    <PackageReference Include=\"ApprovalTests\" Version=\"5.2.4\" />\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"16.5.0\" />\n    <PackageReference Include=\"NUnit3TestAdapter\" Version=\"3.15.1\" />\n  </ItemGroup>\n</Project>\n"
  }
]