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"); }
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(""); }
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"); }
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"); }
private HtmlLinkTag InvokeLinkParsedEvent(string url, string text, string target) { HtmlLinkTag args = new HtmlLinkTag(url, url, text, target); _linkDelegate(args); return(args); }
/// <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); }
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"); }
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); }
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"); }
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"); }
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"); }
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(""); }
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"); }
public bool IsMatch(HtmlLinkTag htmlLinkTag) { if (htmlLinkTag == null) { return(false); } string href = htmlLinkTag.OriginalHref; string upperHref = href?.ToUpperInvariant() ?? ""; return(upperHref.StartsWith("SPECIAL:", StringComparison.Ordinal)); }
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"); }
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); }
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); }
/// <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); }
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); } }