Skip to content

Commit

Permalink
Markdown link parsing improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
QuantumBadger committed Apr 6, 2015
1 parent c578cce commit 1d8ce7f
Show file tree
Hide file tree
Showing 4 changed files with 412 additions and 4 deletions.
1 change: 1 addition & 0 deletions assets/changelog.txt
@@ -1,6 +1,7 @@
62/1.8.7.8
Added intent support for https (thanks to ajs124)
Added support for redd.it links (thanks to ajs124)
Markdown link parsing improvements

61/1.8.7.7
Ability to sort search results (thanks to chaitan94)
Expand Down
15 changes: 15 additions & 0 deletions pom.xml
Expand Up @@ -63,10 +63,18 @@
<version>2.7</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>

</dependencies>

<build>
<plugins>

<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>android-maven-plugin</artifactId>
Expand All @@ -92,6 +100,13 @@
<target>1.6</target>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
</plugin>

</plugins>
</build>
</project>
Expand Up @@ -305,7 +305,7 @@ private static void linkify(final IntArrayLengthPair input, final IntArrayLength
}
}

private static void clean(final IntArrayLengthPair input, final IntArrayLengthPair output) {
public static void clean(final IntArrayLengthPair input, final IntArrayLengthPair output) {

// TODO use single byte array, flags
final boolean[] toRevert = new boolean[input.pos];
Expand Down Expand Up @@ -475,7 +475,42 @@ private static void clean(final IntArrayLengthPair input, final IntArrayLengthPa

case TOKEN_BRACKET_SQUARE_OPEN:
if(lastBracketSquareOpen < 0) {
lastBracketSquareOpen = i;

// Attempt to parse link text with well-bracketed square brackets

final int closingSquareBracket = findCloseWellBracketed(
input.data,
TOKEN_BRACKET_SQUARE_OPEN,
TOKEN_BRACKET_SQUARE_CLOSE,
i,
input.pos);

if(closingSquareBracket > i) {

final int parenOpenPos = indexOf(input.data, TOKEN_PAREN_OPEN, closingSquareBracket + 1, input.pos);

if(parenOpenPos > closingSquareBracket
&& isSpaces(input.data, closingSquareBracket + 1, parenOpenPos)) {

lastBracketSquareOpen = i;

for(int j = i + 1; j < closingSquareBracket; j++) {
if(input.data[j] == TOKEN_BRACKET_SQUARE_OPEN) {
input.data[j] = '[';

} else if(input.data[j] == TOKEN_BRACKET_SQUARE_CLOSE) {
input.data[j] = ']';
}
}

} else {
toRevert[i] = true;
}

} else {
toRevert[i] = true;
}

} else {
toRevert[lastBracketSquareOpen] = true;
lastBracketSquareOpen = i;
Expand All @@ -493,6 +528,7 @@ private static void clean(final IntArrayLengthPair input, final IntArrayLengthPa

final int parenOpenPos = indexOf(input.data, TOKEN_PAREN_OPEN,
lastBracketSquareClose + 1, input.pos);

boolean linkParseSuccess = false;

if(parenOpenPos >= 0) {
Expand All @@ -505,6 +541,13 @@ private static void clean(final IntArrayLengthPair input, final IntArrayLengthPa

linkParseSuccess = true;

for(int j = lastBracketSquareOpen + 1; j < lastBracketSquareClose; j++) {
if(input.data[j] == TOKEN_BRACKET_SQUARE_OPEN
|| input.data[j] == TOKEN_BRACKET_SQUARE_CLOSE) {
toRevert[j] = true;
}
}

for(int j = lastBracketSquareClose + 1; j < parenOpenPos; j++) {
toDelete[j] = true;
}
Expand Down Expand Up @@ -533,7 +576,6 @@ private static void clean(final IntArrayLengthPair input, final IntArrayLengthPa
if(!linkParseSuccess) {
toRevert[lastBracketSquareOpen] = true;
toRevert[lastBracketSquareClose] = true;
i = lastBracketSquareClose;
}
}

Expand Down Expand Up @@ -711,7 +753,7 @@ private static int indexOfIgnoreEscaped(final IntArrayLengthPair haystack, int n
return -1;
}

private static void naiveTokenize(final IntArrayLengthPair input, final IntArrayLengthPair output) {
public static void naiveTokenize(final IntArrayLengthPair input, final IntArrayLengthPair output) {

output.clear();

Expand Down Expand Up @@ -809,6 +851,39 @@ private static int indexOf(final int[] haystack, final int needle, final int sta
return -1;
}

private static int reverseIndexOf(final int[] haystack, final int needle, final int startInclusive) {
for(int i = startInclusive; i >= 0; i--) if(haystack[i] == needle) return i;
return -1;
}

public static int findCloseWellBracketed(
final int[] haystack,
final int openBracket,
final int closeBracket,
final int startInclusive,
final int endExclusive) {

if(haystack[startInclusive] != openBracket) {
throw new RuntimeException("Internal markdown parser error");
}

int b = 1;

for(int i = startInclusive + 1; i < endExclusive; i++) {
if(haystack[i] == openBracket) {
b++;
} else if(haystack[i] == closeBracket) {
b--;
}

if(b == 0) {
return i;
}
}

return -1;
}

private static boolean isSpaces(final int[] haystack, final int startInclusive, final int endExclusive) {
for(int i = startInclusive; i < endExclusive; i++) if(haystack[i] != ' ') return false;
return true;
Expand Down

0 comments on commit 1d8ce7f

Please sign in to comment.