Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Green2015-06-30 13:38:45 +0000
committerDavid Green2015-06-30 13:38:45 +0000
commit82aa7a808a2e30c8dfbcbbda3c3228f0432d067f (patch)
tree4b21670e8e2a99da205fe77c184e6c9ab1519fdc
parent0a97ccfd32225cfe6fbb296aa1b87be11f4b97c7 (diff)
downloadorg.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
-rw-r--r--org.eclipse.mylyn.wikitext.commonmark.tests/src/org/eclipse/mylyn/wikitext/commonmark/CommonMarkLanguageTest.java9
-rw-r--r--org.eclipse.mylyn.wikitext.commonmark/src/org/eclipse/mylyn/internal/wikitext/commonmark/inlines/PotentialBracketEndDelimiter.java31
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;

Back to the top