Example #1
0
        public void should_remove_dashes_in_title_and_find_page_in_repository()
        {
            // Arrange
            string expectedHref = "/wiki/1/my-page-on-engineering";

            _urlHelperMock
            .Action(Arg.Any <UrlActionContext>())
            .Returns(expectedHref);

            string pageTitle = "foo";
            Page   dummyPage = new Page()
            {
                Id = 1, Title = pageTitle
            };

            _pageRepository
            .GetPageByTitleAsync(pageTitle)
            .Returns(dummyPage);
            HtmlLinkTag linkTag = new HtmlLinkTag("my-page-on-engineering", "my-page-on-engineering", "text", "");

            // Act
            HtmlLinkTag actualTag = _linkHrefParser.Parse(linkTag);

            // Assert
            actualTag.OriginalHref.ShouldBe("my-page-on-engineering");
            actualTag.Href.ShouldBe("/wiki/1/my-page-on-engineering");
        }
Example #2
0
        public void should_set_href_and_target_proprties()
        {
            // Arrange
            string expectedHref = "/wiki/1/despair";

            _urlHelperMock
            .Action(Arg.Any <UrlActionContext>())
            .Returns(expectedHref);

            string pageTitle = "foo";
            Page   dummyPage = new Page()
            {
                Id = 1, Title = pageTitle
            };

            _pageRepository
            .GetPageByTitleAsync(pageTitle)
            .Returns(dummyPage);

            HtmlLinkTag linkTag = new HtmlLinkTag("despair", "", "text", "new");

            // Act
            HtmlLinkTag actualTag = _linkHrefParser.Parse(linkTag);

            // Assert
            actualTag.Href.ShouldBe("/wiki/1/despair");
            actualTag.Target.ShouldBe("");
        }
Example #3
0
        public void href_internal_links_with_querystring_and_anchor_tag_should_find_page_and_retain_querystring_and_anchor()
        {
            // Arrange
            string pageTitle = "foo page";
            Page   dummyPage = new Page()
            {
                Id = 1, Title = pageTitle
            };
            dynamic urlValues = new { id = dummyPage.Id, title = "foo-page" };

            _urlHelperMock
            .Action(Arg.Any <UrlActionContext>())
            .Returns(callInfo => { return("/wiki/" + urlValues.id + "/" + urlValues.title); });

            _pageRepository
            .GetPageByTitleAsync(pageTitle)
            .Returns(dummyPage);

            HtmlLinkTag linkTag = new HtmlLinkTag("foo-page?blah=xyz#myanchor", "foo-page?blah=xyz#myanchor", "text", "");

            // Act
            HtmlLinkTag actualTag = _linkHrefParser.Parse(linkTag);

            // Assert
            actualTag.Href.ShouldBe("/wiki/1/foo-page?blah=xyz#myanchor");
        }
Example #4
0
        public void href_internal_existing_wiki_page_link_should_return_href_with_wiki_prefix()
        {
            // Arrange
            string expectedHref = "/wiki/1/football";

            _urlHelperMock
            .Action(Arg.Any <UrlActionContext>())
            .Returns(expectedHref);

            string pageTitle = "foo";
            Page   dummyPage = new Page()
            {
                Id = 1, Title = pageTitle
            };

            _pageRepository
            .GetPageByTitleAsync(pageTitle)
            .Returns(dummyPage);

            HtmlLinkTag linkTag = new HtmlLinkTag("football", "foo-page", "text", "");

            // Act
            HtmlLinkTag actualTag = _linkHrefParser.Parse(linkTag);

            // Assert
            actualTag.Href.ShouldBe("/wiki/1/football");
        }
Example #5
0
        private HtmlLinkTag InvokeLinkParsedEvent(string url, string text, string target)
        {
            HtmlLinkTag args = new HtmlLinkTag(url, url, text, target);

            _linkDelegate(args);

            return(args);
        }
Example #6
0
        /// <summary>
        /// Is this link tag for an Apple touch icon?
        /// </summary>
        /// <param name="link">Link tag.</param>
        /// <returns>Returns true if the link is for an Apple touch icon.</returns>
        internal static bool IsAppleTouchIcon(this HtmlLinkTag link)
        {
            if (link.Rel.Contains("apple-touch-icon"))
            {
                return(true);
            }

            return(false);
        }
Example #7
0
        public void should_add_missing_page_link_css_class_when_internal_link_does_not_exist()
        {
            // Arrange
            HtmlLinkTag linkTag = new HtmlLinkTag("doesnt-exist", "doesnt-exist", "text", "");

            // Act
            HtmlLinkTag actualTag = _linkHrefParser.Parse(linkTag);

            // Assert
            actualTag.CssClass.ShouldBe("missing-page-link");
        }
Example #8
0
        public void href_links_with_the_word_script_in_url_should_not_be_cleaned()
        {
            // Arrange - Issue #159 (Bitbucket) (deSCRIPTion)
            HtmlLinkTag linkTag = new HtmlLinkTag("http://msdn.microsoft.com/en-us/library/system.componentmodel.descriptionattribute.aspx", "http://msdn.microsoft.com/en-us/library/system.componentmodel.descriptionattribute.aspx", "Component description", "");

            // Act
            HtmlLinkTag actualTag = _linkHrefParser.Parse(linkTag);

            // Assert
            actualTag.Href.ShouldBe("http://msdn.microsoft.com/en-us/library/system.componentmodel.descriptionattribute.aspx");
        }
        public void IsMatch_should_return_false_for_null_link()
        {
            // Arrange
            HtmlLinkTag htmlTag = null;

            // Act
            bool actualMatch = _converter.IsMatch(htmlTag);

            // Assert
            actualMatch.ShouldBeFalse();
        }
        public void IsMatch_should_match_attachment_links(string href, bool expectedMatch)
        {
            // Arrange
            var htmlTag = new HtmlLinkTag(href, href, "text", "");

            // Act
            bool actualMatch = _converter.IsMatch(htmlTag);

            // Assert
            actualMatch.ShouldBe(expectedMatch);
        }
Example #11
0
        public void href_external_link_with_urlencoded_anchor_should_retain_anchor()
        {
            // Arrange - Issue #172 (Bitbucket)
            HtmlLinkTag linkTag = new HtmlLinkTag("http://www.google.com/?blah=xyz%23myanchor", "http://www.google.com/?blah=xyz%23myanchor", "text", "");

            // Act
            HtmlLinkTag actualTag = _linkHrefParser.Parse(linkTag);

            // Assert
            actualTag.Href.ShouldBe("http://www.google.com/?blah=xyz%23myanchor");
        }
Example #12
0
        public void links_starting_with_special_should_resolve_as_full_specialpage()
        {
            // Arrange
            HtmlLinkTag linkTag = new HtmlLinkTag("Special:Foo", "Special:Foo", "text", "");

            // Act
            HtmlLinkTag actualTag = _linkHrefParser.Parse(linkTag);

            // Assert
            actualTag.Href.ShouldBe("~/wiki/Special:Foo");
        }
Example #13
0
        public void href_with_dashes_and_23_are_not_encoded()
        {
            // Arrange
            HtmlLinkTag linkTag = new HtmlLinkTag("https://www.google.com/some-page-23", "https://www.google.com/some-page-23", "text", "");

            // Act
            HtmlLinkTag actualTag = _linkHrefParser.Parse(linkTag);

            // Assert
            actualTag.Href.ShouldBe("https://www.google.com/some-page-23");
        }
Example #14
0
        public void should_not_add_external_link_cssclass_for_anchor_tags()
        {
            // Arrange
            HtmlLinkTag linkTag = new HtmlLinkTag("#my-anchor", "#my-anchor", "text", "");

            // Act
            HtmlLinkTag actualTag = _linkHrefParser.Parse(linkTag);

            // Assert
            actualTag.Href.ShouldBe("#my-anchor");
            actualTag.CssClass.ShouldBe("");
        }
Example #15
0
        public void href_links_starting_with_attachments_should_resolve_as_attachment_paths(string prefix)
        {
            // Arrange
            string      actualPath = $"{prefix}my/folder/image1.jpg";
            HtmlLinkTag linkTag    = new HtmlLinkTag(actualPath, actualPath, "text", "");

            // Act
            HtmlLinkTag actualTag = _linkHrefParser.Parse(linkTag);

            // Assert
            actualTag.Href.ShouldBe("/attachments/my/folder/image1.jpg");
        }
Example #16
0
        public bool IsMatch(HtmlLinkTag htmlLinkTag)
        {
            if (htmlLinkTag == null)
            {
                return(false);
            }

            string href      = htmlLinkTag.OriginalHref;
            string upperHref = href?.ToUpperInvariant() ?? "";

            return(upperHref.StartsWith("SPECIAL:", StringComparison.Ordinal));
        }
Example #17
0
        public void should_add_external_links_css_class_to_links_and_keep_url(string url)
        {
            // Arrange
            HtmlLinkTag linkTag = new HtmlLinkTag(url, url, "text", "");

            // Act
            HtmlLinkTag actualTag = _linkHrefParser.Parse(linkTag);

            // Assert
            actualTag.Href.ShouldBe(url);
            actualTag.CssClass.ShouldBe("external-link");
        }
Example #18
0
        public HtmlLinkTag Convert(HtmlLinkTag htmlLinkTag)
        {
            string href      = htmlLinkTag.OriginalHref;
            string upperHref = href?.ToUpperInvariant();

            if (!upperHref.StartsWith("SPECIAL:", StringComparison.Ordinal))
            {
                return(htmlLinkTag);
            }

            htmlLinkTag.Href = _urlHelper.Content("~/wiki/" + href);

            return(htmlLinkTag);
        }
Example #19
0
        public void should_use_url_helper_for_special_pages()
        {
            // Arrange
            HtmlLinkTag linkTag = new HtmlLinkTag("Special:blah", "Special:blah", "text", "");

            _urlHelperMock
            .Content(Arg.Any <string>())
            .Returns("~/wiki/Special:blah/url-helper");

            // Act
            HtmlLinkTag actualTag = _linkHrefParser.Parse(linkTag);

            // Assert
            actualTag.Href.ShouldBe("~/wiki/Special:blah/url-helper");
        }
        public bool IsMatch(HtmlLinkTag htmlLinkTag)
        {
            if (htmlLinkTag == null)
            {
                return(false);
            }

            if (string.IsNullOrEmpty(htmlLinkTag.OriginalHref))
            {
                return(false);
            }

            string upperHref = htmlLinkTag.OriginalHref.ToUpperInvariant();

            return(upperHref.StartsWith("ATTACHMENT:", StringComparison.Ordinal) || upperHref.StartsWith("~/", StringComparison.Ordinal));
        }
        public void Convert_should_change_expected_urls_to_full_paths(string href, string expectedHref, bool calledUrlHelper)
        {
            // Arrange
            _urlHelperMock
            .Content(Arg.Any <string>())
            .Returns <string>(callInfo => callInfo.Arg <string>());

            var originalTag = new HtmlLinkTag(href, href, "text", "");

            // Act
            var actualTag = _converter.Convert(originalTag);

            // Assert
            originalTag.OriginalHref.ShouldBe(actualTag.OriginalHref);
            expectedHref.ShouldBe(actualTag.Href);

            int timesCalled = (calledUrlHelper) ? 1 : 0;

            _urlHelperMock
            .Received(timesCalled)
            .Content(Arg.Any <string>());
        }
        public HtmlLinkTag Convert(HtmlLinkTag htmlLinkTag)
        {
            string href      = htmlLinkTag.OriginalHref;
            string upperHref = href?.ToUpperInvariant() ?? "";

            if (!upperHref.StartsWith("ATTACHMENT:", StringComparison.Ordinal) &&
                !upperHref.StartsWith("~", StringComparison.Ordinal))
            {
                return(htmlLinkTag);
            }

            if (upperHref.StartsWith("ATTACHMENT:", StringComparison.Ordinal))
            {
                href = href.Remove(0, 11);
                if (!href.StartsWith("/", StringComparison.Ordinal))
                {
                    href = "/" + href;
                }
            }
            else if (upperHref.StartsWith("~/", StringComparison.Ordinal))
            {
                // Remove the ~
                href = href.Remove(0, 1);
            }

            // Get the full path to the attachment
            string attachmentsPath = _textSettings.AttachmentsUrlPath;

            if (attachmentsPath.EndsWith("/", StringComparison.Ordinal))
            {
                attachmentsPath = attachmentsPath.Remove(attachmentsPath.Length - 1);
            }

            htmlLinkTag.Href = _urlHelper.Content(attachmentsPath) + href;

            return(htmlLinkTag);
        }
Example #23
0
        /// <summary>
        /// Is this link tag for a favicon?
        /// </summary>
        /// <param name="link">Link tag.</param>
        /// <returns>Returns true if the link is for a favicon.</returns>
        internal static bool IsFavicon(this HtmlLinkTag link)
        {
            if (link.Rel == "shortcut icon")
            {
                return(true);
            }

            if (link.Rel == "icon")
            {
                return(true);
            }

            if (link.Rel == "mask-icon")
            {
                return(true);
            }

            if (link.Rel.Contains("favicon"))
            {
                return(true);
            }

            return(false);
        }
Example #24
0
        public void WalkAndBindParseEvents(MarkdownObject markdownObject)
        {
            foreach (MarkdownObject child in markdownObject.Descendants())
            {
                // LinkInline can be both an <img.. or a <a href="...">
                LinkInline linkInline = child as LinkInline;
                if (linkInline != null)
                {
                    EnsureAttributesInLink(linkInline);

                    if (linkInline.IsImage)
                    {
                        string altText = "";

                        var descendentForAltTag = child.Descendants().FirstOrDefault();
                        if (descendentForAltTag != null)
                        {
                            altText = descendentForAltTag.ToString();
                        }

                        string title = altText;

                        if (_imageDelegate != null)
                        {
                            HtmlImageTag args = InvokeImageParsedEvent(linkInline.Url, altText);

                            if (!string.IsNullOrEmpty(args.Alt))
                            {
                                altText = args.Alt;
                            }

                            if (!string.IsNullOrEmpty(args.Title))
                            {
                                title = args.Title;
                            }

                            // Update the HTML from the data the event gives back
                            linkInline.Url = args.Src;
                        }

                        // Replace to alt= attribute, it's a literal
                        var literalInline = new LiteralInline(altText);
                        linkInline.FirstChild.ReplaceBy(literalInline);

                        // HTML5 the tag
                        linkInline.Title = title;

                        // Necessary for links and Bootstrap 3
                        AddAttribute(linkInline, "border", "0");

                        // Make all images expand via this Bootstrap class
                        AddClass(linkInline, "img-responsive");
                    }
                    else
                    {
                        if (_linkDelegate != null)
                        {
                            string text = linkInline.Title;
                            var    descendentForAltTag = child.Descendants().FirstOrDefault();
                            if (descendentForAltTag != null)
                            {
                                text = descendentForAltTag.ToString();
                            }

                            HtmlLinkTag args = InvokeLinkParsedEvent(linkInline.Url, text, linkInline.Label);

                            // Update the HTML from the data the event gives back
                            linkInline.Url = args.Href;

                            if (!string.IsNullOrEmpty(args.Target))
                            {
                                AddAttribute(linkInline, "target", args.Target);
                            }

                            if (!string.IsNullOrEmpty(args.CssClass))
                            {
                                AddClass(linkInline, args.CssClass);
                            }

                            // Replace the link's text
                            var literalInline = new LiteralInline(args.Text);
                            linkInline.FirstChild.ReplaceBy(literalInline);
                        }

                        // Markdig TODO: make these configurable (external-links: [])
                        if (!string.IsNullOrEmpty(linkInline.Url))
                        {
                            string upperUrl = linkInline.Url.ToUpperInvariant();
                            if (upperUrl.StartsWith("HTTP://", StringComparison.Ordinal) ||
                                upperUrl.StartsWith("HTTPS://", StringComparison.Ordinal) ||
                                upperUrl.StartsWith("MAILTO:", StringComparison.Ordinal))
                            {
                                AddAttribute(linkInline, "rel", "nofollow");
                            }
                        }
                    }
                }

                WalkAndBindParseEvents(child);
            }
        }