diff options
author | David Green | 2015-06-30 13:38:45 +0000 |
---|---|---|
committer | David Green | 2015-06-30 13:38:45 +0000 |
commit | 82aa7a808a2e30c8dfbcbbda3c3228f0432d067f (patch) | |
tree | 4b21670e8e2a99da205fe77c184e6c9ab1519fdc | |
parent | 0a97ccfd32225cfe6fbb296aa1b87be11f4b97c7 (diff) | |
download | org.eclipse.mylyn.docs-82aa7a808a2e30c8dfbcbbda3c3228f0432d067f.tar.gz org.eclipse.mylyn.docs-82aa7a808a2e30c8dfbcbbda3c3228f0432d067f.tar.xz org.eclipse.mylyn.docs-82aa7a808a2e30c8dfbcbbda3c3228f0432d067f.zip |
471443: Markdown links should not escape hash '#'
Change-Id: I9293f95d0a6cc61e06aa362a08c9d7b28f186195
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=471443
2 files changed, 30 insertions, 10 deletions
diff --git a/org.eclipse.mylyn.wikitext.commonmark.tests/src/org/eclipse/mylyn/wikitext/commonmark/CommonMarkLanguageTest.java b/org.eclipse.mylyn.wikitext.commonmark.tests/src/org/eclipse/mylyn/wikitext/commonmark/CommonMarkLanguageTest.java index 4343af04f..06c33e511 100644 --- a/org.eclipse.mylyn.wikitext.commonmark.tests/src/org/eclipse/mylyn/wikitext/commonmark/CommonMarkLanguageTest.java +++ b/org.eclipse.mylyn.wikitext.commonmark.tests/src/org/eclipse/mylyn/wikitext/commonmark/CommonMarkLanguageTest.java @@ -111,6 +111,15 @@ public class CommonMarkLanguageTest { assertEquals(language.isStrictlyConforming(), language.clone().isStrictlyConforming()); } + @Test + public void linksWithHash() { + assertContent("<p><a href=\"#FooBar\">text</a></p>", "[text](#FooBar)"); + assertContent("<p><a href=\"A#FooBar\">text</a></p>", "[text](A#FooBar)"); + assertContent("<p><a href=\"http://example.com/page.html#someId\">text</a></p>", + "[text](http://example.com/page.html#someId)"); + + } + private void assertEvents(String content, DocumentBuilderEvent... events) { assertEvents(content, true, events); } diff --git a/org.eclipse.mylyn.wikitext.commonmark/src/org/eclipse/mylyn/internal/wikitext/commonmark/inlines/PotentialBracketEndDelimiter.java b/org.eclipse.mylyn.wikitext.commonmark/src/org/eclipse/mylyn/internal/wikitext/commonmark/inlines/PotentialBracketEndDelimiter.java index fb4ff7cde..cd193aa1f 100644 --- a/org.eclipse.mylyn.wikitext.commonmark/src/org/eclipse/mylyn/internal/wikitext/commonmark/inlines/PotentialBracketEndDelimiter.java +++ b/org.eclipse.mylyn.wikitext.commonmark/src/org/eclipse/mylyn/internal/wikitext/commonmark/inlines/PotentialBracketEndDelimiter.java @@ -35,7 +35,8 @@ import com.google.common.net.UrlEscapers; public class PotentialBracketEndDelimiter extends InlineWithText { - private static final Pattern HTML_ENTITY_PATTERN = Pattern.compile("(&([a-zA-Z][a-zA-Z0-9]{1,32}|#x[a-fA-F0-9]{1,8}|#[0-9]{1,8});)"); + private static final Pattern HTML_ENTITY_PATTERN = Pattern + .compile("(&([a-zA-Z][a-zA-Z0-9]{1,32}|#x[a-fA-F0-9]{1,8}|#[0-9]{1,8});)"); private static final Pattern NUMERIC_ENTITY_PATTERN = Pattern.compile("&#([0-9]{1,8});"); @@ -67,8 +68,8 @@ public class PotentialBracketEndDelimiter extends InlineWithText { final Pattern referenceLabelPattern = Pattern.compile("(\\s*\\[((?:[^\\]]|\\\\]){0,1000})]).*", Pattern.DOTALL); - final Pattern referenceDefinitionEndPattern = Pattern.compile(":\\s*" + URI_PART + "?(?:\\s+" + TITLE_PART - + ")?\\s*(.*)", Pattern.DOTALL); + final Pattern referenceDefinitionEndPattern = Pattern + .compile(":\\s*" + URI_PART + "?(?:\\s+" + TITLE_PART + ")?\\s*(.*)", Pattern.DOTALL); public PotentialBracketEndDelimiter(Line line, int offset) { super(line, offset, 1, "]"); @@ -88,11 +89,12 @@ public class PotentialBracketEndDelimiter extends InlineWithText { boolean referenceDefinition = cursor.hasNext() && cursor.getNext() == ':' && eligibleForReferenceDefinition(openingDelimiter, cursor); - Matcher matcher = cursor.hasNext() ? cursor.matcher(1, referenceDefinition - ? referenceDefinitionEndPattern - : endPattern) : null; + Matcher matcher = cursor.hasNext() + ? cursor.matcher(1, referenceDefinition ? referenceDefinitionEndPattern : endPattern) + : null; - List<Inline> contents = InlineParser.secondPass(inlines.subList(indexOfOpeningDelimiter + 1, inlines.size())); + List<Inline> contents = InlineParser + .secondPass(inlines.subList(indexOfOpeningDelimiter + 1, inlines.size())); if (!openingDelimiter.isLinkDelimiter() || !containsLink(contents)) { if (!cursor.hasNext() || !checkNotNull(matcher).matches()) { @@ -130,7 +132,8 @@ public class PotentialBracketEndDelimiter extends InlineWithText { String uri = linkUri(matcher); String title = linkTitle(matcher); - if (!(referenceDefinition && (Strings.isNullOrEmpty(uri) || hasContentOnSameLine(matcher, cursor)))) { + if (!(referenceDefinition + && (Strings.isNullOrEmpty(uri) || hasContentOnSameLine(matcher, cursor)))) { String referenceName = null; if (referenceDefinition) { referenceName = toReferenceName(referenceName(cursor, contents)); @@ -146,8 +149,8 @@ public class PotentialBracketEndDelimiter extends InlineWithText { inlines.add(new ReferenceDefinition(openingDelimiter.getLine(), openingDelimiter.getOffset(), length, uri, title, referenceName)); } else if (openingDelimiter.isImageDelimiter()) { - inlines.add(new Image(openingDelimiter.getLine(), openingDelimiter.getOffset(), length, - uri, title, contents)); + inlines.add(new Image(openingDelimiter.getLine(), openingDelimiter.getOffset(), length, uri, + title, contents)); } else { inlines.add(new Link(openingDelimiter.getLine(), openingDelimiter.getOffset(), length, uri, title, contents)); @@ -319,6 +322,14 @@ public class PotentialBracketEndDelimiter extends InlineWithText { UrlEscapers.urlFormParameterEscaper()); String decoded = URLDecoder.decode(uriWithoutHtmlEntities, StandardCharsets.UTF_8.name()); Escaper escaper = UrlEscapers.urlFragmentEscaper(); + int indexOfHash = decoded.indexOf('#'); + if (indexOfHash != -1) { + String uri = escaper.escape(decoded.substring(0, indexOfHash)) + '#'; + if ((indexOfHash + 1) < decoded.length()) { + uri += escaper.escape(decoded.substring(indexOfHash + 1)); + } + return uri; + } return escaper.escape(decoded); } catch (Exception e) { return uriWithoutBackslashEscapes; |