protected override void Write(UIElementRenderer renderer, CodeBlock obj)
        {
            var codeBlock = GetClassedElement <VisualElement>("code");

            codeBlock.RegisterCallback <MouseUpEvent>(CopyToClipboard);
            renderer.Push(codeBlock);
            renderer.WriteLeafRawLines(obj);
            renderer.Pop();
        }
예제 #2
0
        protected override void Write(UIElementRenderer renderer, ListBlock listBlock)
        {
            renderer.Push(GetClassedElement <VisualElement>("list"));

            foreach (var item in listBlock.OfType <ListItemBlock>())
            {
                var listItem = GetClassedElement <VisualElement>("list-item");

                renderer.Push(listItem);

                var marker = listBlock.IsOrdered ? $"{item.Order}." : $"{listBlock.BulletType}";

                var classes = listBlock.IsOrdered ? "inline" : "bullet";

                renderer.WriteChildren(item);

                listItem.Children()?.FirstOrDefault()?.Insert(0, GetTextElement <Label>(marker, classes));

                renderer.Pop();
            }

            renderer.Pop();
        }
예제 #3
0
        protected override void Write(UIElementRenderer renderer, AutolinkInline link)
        {
            var url         = link.Url;
            var lowerScheme = string.Empty;

            if (link.IsEmail)
            {
                url = "mailto:" + url;
            }

            var isValidUri = Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute);

            if (!isValidUri)
            {
                var match = LinkInlineRenderer.SchemeCheck.Match(url);
                if (match.Success)
                {
                    lowerScheme = match.Groups[1].Value.ToLower();
                }
                else
                {
                    lowerScheme = "#";
                }
            }
            else
            {
                var uri = new Uri(url);
                lowerScheme = uri.Scheme.ToLower();
            }

            var linkLabel = GetClassedElement <VisualElement>("link", lowerScheme);

            if (isValidUri)
            {
                linkLabel.RegisterCallback <MouseUpEvent>(evt =>
                {
                    if (LinkInlineRenderer.SchemeLinkHandlers.ContainsKey(lowerScheme))
                    {
                        LinkInlineRenderer.SchemeLinkHandlers[lowerScheme]?.Invoke(url);
                    }
                });
            }
            linkLabel.tooltip = url;

            renderer.Push(linkLabel);
            renderer.WriteText(url);
            renderer.Pop();
        }
예제 #4
0
        protected override void Write(UIElementRenderer renderer, EmphasisInline obj)
        {
            string delimiterClass = null;

            switch (obj.DelimiterChar)
            {
            case '*':
            case '_':
                delimiterClass = obj.DelimiterCount == 2 ? "bold" : "italic";
                break;

            case '~':
                delimiterClass = obj.DelimiterCount == 2 ? "strikethrough" : "subscript";
                break;

            case '^':
                delimiterClass = "superscript";
                break;

            case '+':
                delimiterClass = "inserted";
                break;

            case '=':
                delimiterClass = "marked";
                break;
            }

            if (delimiterClass != null)
            {
                renderer.Push(GetClassedElement <VisualElement>(delimiterClass));
                renderer.WriteChildren(obj);
                renderer.Pop();
            }
            else
            {
                renderer.WriteChildren(obj);
            }
        }
예제 #5
0
        protected override void Write(UIElementRenderer renderer, LinkInline link)
        {
            var url = link.Url;

            if (link.IsImage)
            {
                var imageElement = GetClassedElement <Image>("image");
                if (IsAssetDirectory(url))
                {
                    var image = AssetDatabase.LoadAssetAtPath <Texture>(url);
                    if (image)
                    {
                        SetupImage(imageElement, image);
                    }
                }
                else
                {
                    async Task DownloadImage(string MediaUrl)
                    {
                        UnityWebRequest request = UnityWebRequestTexture.GetTexture(MediaUrl);
                        var             asyncOp = request.SendWebRequest();

                        while (!asyncOp.isDone)
                        {
                            await Task.Delay(100);
                        }

#if UNITY_2020_1_OR_NEWER
                        if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError)
#else
                        if (request.isNetworkError || request.isHttpError)
#endif
                        { Debug.Log(request.error); }
                        else
                        {
                            SetupImage(imageElement, ((DownloadHandlerTexture)request.downloadHandler).texture);
                        }
                    }

                    _ = DownloadImage(link.Url);
                }

                renderer.Push(imageElement);
                renderer.WriteChildren(link);
                foreach (var child in imageElement.Children())
                {
                    child.AddToClassList("alt-text");
                }
                renderer.Pop();
            }
            else
            {
                var lowerScheme = string.Empty;
                var isValidUri  = Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute);
                if (!isValidUri)
                {
                    var match = LinkInlineRenderer.SchemeCheck.Match(url);
                    if (match.Success)
                    {
                        lowerScheme = match.Groups[1].Value.ToLower();
                    }
                    else
                    {
                        lowerScheme = "#";
                    }
                }
                else
                {
                    var uri = new Uri(url);
                    lowerScheme = uri.Scheme.ToLower();
                }

                var linkLabel = GetClassedElement <VisualElement>("link", lowerScheme);
                linkLabel.tooltip = url;
                if (isValidUri)
                {
                    linkLabel.RegisterCallback <MouseUpEvent>(evt =>
                    {
                        if (LinkInlineRenderer.SchemeLinkHandlers.ContainsKey(lowerScheme))
                        {
                            LinkInlineRenderer.SchemeLinkHandlers[lowerScheme]?.Invoke(url);
                        }
                    });
                }

                renderer.Push(linkLabel);
                renderer.WriteChildren(link);
                renderer.Pop();
            }
        }
 protected override void Write(UIElementRenderer renderer, ParagraphBlock obj)
 {
     renderer.Push(GetClassedElement <VisualElement>("paragraph"));
     renderer.WriteLeafInline(obj);
     renderer.Pop();
 }
예제 #7
0
 protected override void Write(UIElementRenderer renderer, HeadingBlock obj)
 {
     renderer.Push(GetClassedElement <VisualElement>($"header-{obj.Level}"));
     renderer.WriteLeafInline(obj);
     renderer.Pop();
 }
예제 #8
0
 protected override void Write(UIElementRenderer renderer, QuoteBlock obj)
 {
     renderer.Push(GetClassedElement <VisualElement>("quote"));
     renderer.WriteChildren(obj);
     renderer.Pop();
 }
예제 #9
0
        protected override void Write(UIElementRenderer renderer, LinkInline link)
        {
            var url = link.Url;

            if (link.IsImage)
            {
                var imageElement = GetClassedElement <Image>("image");
                if (IsAssetDirectory(url))
                {
                    var image = AssetDatabase.LoadAssetAtPath <Texture>(url);
                    if (image)
                    {
                        SetupImage(imageElement, image);
                    }
                }
                else
                {
                    var imageLoaderObject = new GameObject("MarkdownImageLoader", typeof(ImageLoadBehaviour))
                    {
                        isStatic = true, hideFlags = HideFlags.HideAndDontSave
                    };
                    var imageLoader = imageLoaderObject.GetComponent <ImageLoadBehaviour>();
                    var c           = imageLoader.StartCoroutine(LoadImage(url, imageElement));
                }

                renderer.Push(imageElement);
                renderer.WriteChildren(link);
                foreach (var child in imageElement.Children())
                {
                    child.AddToClassList("alt-text");
                }
                renderer.Pop();
            }
            else
            {
                var lowerScheme = string.Empty;
                var isValidUri  = Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute);
                if (!isValidUri)
                {
                    var match = LinkInlineRenderer.SchemeCheck.Match(url);
                    if (match.Success)
                    {
                        lowerScheme = match.Groups[1].Value.ToLower();
                    }
                    else
                    {
                        lowerScheme = "#";
                    }
                }
                else
                {
                    var uri = new Uri(url);
                    lowerScheme = uri.Scheme.ToLower();
                }

                var linkLabel = GetClassedElement <VisualElement>("link", lowerScheme);
                linkLabel.tooltip = url;
                if (isValidUri)
                {
                    linkLabel.RegisterCallback <MouseUpEvent>(evt =>
                    {
                        if (SchemeLinkHandlers.TryGetValue(lowerScheme, out var handler))
                        {
                            handler?.Invoke(url);
                        }
                    });
                }

                renderer.Push(linkLabel);
                renderer.WriteChildren(link);
                renderer.Pop();
            }
        }