aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDocile-Alligator <25734209+Docile-Alligator@users.noreply.github.com>2023-11-26 19:52:18 +0000
committerDocile-Alligator <25734209+Docile-Alligator@users.noreply.github.com>2023-11-26 19:52:18 +0000
commit4bcd60aafdfdc28c764c8239c82dab0886e40781 (patch)
tree01dee90b9ba72318339fc6cc34d7c19ac6af3e08
parent93944075effdbf1f2db385f4eaa1adecf2e7779a (diff)
downloadinfinity-for-reddit-4bcd60aafdfdc28c764c8239c82dab0886e40781.tar
infinity-for-reddit-4bcd60aafdfdc28c764c8239c82dab0886e40781.tar.gz
infinity-for-reddit-4bcd60aafdfdc28c764c8239c82dab0886e40781.tar.bz2
infinity-for-reddit-4bcd60aafdfdc28c764c8239c82dab0886e40781.tar.lz
infinity-for-reddit-4bcd60aafdfdc28c764c8239c82dab0886e40781.tar.xz
infinity-for-reddit-4bcd60aafdfdc28c764c8239c82dab0886e40781.tar.zst
infinity-for-reddit-4bcd60aafdfdc28c764c8239c82dab0886e40781.zip
Handle preview images or gifs with captions.
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlockParser.java20
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/utils/Utils.java64
2 files changed, 61 insertions, 23 deletions
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlockParser.java b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlockParser.java
index ca71d4bd..4cdd3fd6 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlockParser.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/markdown/ImageAndGifBlockParser.java
@@ -35,13 +35,13 @@ public class ImageAndGifBlockParser extends AbstractBlockParser {
}
public static class Factory extends AbstractBlockParserFactory {
- private final Pattern redditPreviewPattern = Pattern.compile("!\\[img]\\(https://preview.redd.it/\\w+.(jpg|png|jpeg)((\\?+[-a-zA-Z0-9()@:%_+.~#?&/=]*)|)\\)");
- private final Pattern iRedditPattern = Pattern.compile("!\\[img]\\(https://i.redd.it/\\w+.(jpg|png|jpeg|gif)\\)");
+ private final Pattern redditPreviewPattern = Pattern.compile("!\\[.*]\\(https://preview.redd.it/\\w+.(jpg|png|jpeg)((\\?+[-a-zA-Z0-9()@:%_+.~#?&/=]*)|)\\)");
+ private final Pattern iRedditPattern = Pattern.compile("!\\[.*]\\(https://i.redd.it/\\w+.(jpg|png|jpeg|gif)\\)");
private final Pattern gifPattern = Pattern.compile("!\\[gif]\\(giphy\\|\\w+(\\|downsized)?\\)");
@Nullable
private Map<String, MediaMetadata> mediaMetadataMap;
- private final int fromIndex = "![img](https://preview.redd.it/".length();
- private final int fromIndexIReddit = "![img](https://i.redd.it/".length();
+ private final int previewReddItLength = "https://preview.redd.it/".length();
+ private final int iReddItLength = "https://i.redd.it/".length();
@Override
public BlockStart tryStart(ParserState state, MatchedBlockParser matchedBlockParser) {
@@ -53,9 +53,11 @@ public class ImageAndGifBlockParser extends AbstractBlockParser {
Matcher matcher = redditPreviewPattern.matcher(line);
if (matcher.find()) {
if (matcher.end() == line.length()) {
- int endIndex = line.indexOf('.', fromIndex);
+ int endIndex = line.indexOf('.', previewReddItLength);
if (endIndex > 0) {
- String id = line.substring(fromIndex, endIndex);
+ int urlStartIndex = line.lastIndexOf("https://preview.redd.it/", matcher.end());
+ String id = line.substring(previewReddItLength + urlStartIndex,
+ line.indexOf(".", previewReddItLength + urlStartIndex));
return mediaMetadataMap.containsKey(id) ? BlockStart.of(new ImageAndGifBlockParser(mediaMetadataMap.get(id))) : BlockStart.none();
}
}
@@ -64,9 +66,11 @@ public class ImageAndGifBlockParser extends AbstractBlockParser {
matcher = iRedditPattern.matcher(line);
if (matcher.find()) {
if (matcher.end() == line.length()) {
- int endIndex = line.indexOf('.', fromIndexIReddit);
+ int endIndex = line.indexOf('.', iReddItLength);
if (endIndex > 0) {
- String id = line.substring(fromIndexIReddit, endIndex);
+ int urlStartIndex = line.lastIndexOf("https://i.redd.it/", matcher.end());
+ String id = line.substring(iReddItLength + urlStartIndex,
+ line.indexOf(".", iReddItLength + urlStartIndex));
return mediaMetadataMap.containsKey(id) ? BlockStart.of(new ImageAndGifBlockParser(mediaMetadataMap.get(id))) : BlockStart.none();
}
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/utils/Utils.java b/app/src/main/java/ml/docilealligator/infinityforreddit/utils/Utils.java
index c47c879a..9f3167b9 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/utils/Utils.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/utils/Utils.java
@@ -73,11 +73,10 @@ public final class Utils {
Pattern.compile("((?<=[\\s])|^)/[rRuU]/[\\w-]+/{0,1}"),
Pattern.compile("((?<=[\\s])|^)[rRuU]/[\\w-]+/{0,1}"),
Pattern.compile("\\^{2,}"),
- Pattern.compile("!\\[gif]\\(giphy\\|\\w+\\)"),
- Pattern.compile("!\\[gif]\\(giphy\\|\\w+\\|downsized\\)"),
- Pattern.compile("!\\[gif]\\(emote\\|\\w+\\|\\w+\\)"),
- Pattern.compile("https://preview.redd.it/\\w+.(jpg|png|jpeg)((\\?+[-a-zA-Z0-9()@:%_+.~#?&/=]*)|)"),
- Pattern.compile("https://i.redd.it/\\w+.(jpg|png|jpeg|gif)")
+ //Sometimes the reddit preview images and gifs have a caption and the markdown will become [caption](image_link)
+ Pattern.compile("(\\[(?:(?!((?<!\\\\)\\[)).)*?]\\()?https://preview.redd.it/\\w+.(jpg|png|jpeg)((\\?+[-a-zA-Z0-9()@:%_+.~#?&/=]*)|)"),
+ //Same reason as above. But this time it only matches [caption](image-link. Notice there is no ) at the end.
+ Pattern.compile("(\\[(?:(?!((?<!\\\\)\\[)).)*?]\\()?https://i.redd.it/\\w+.(jpg|png|jpeg|gif)")
};
public static String modifyMarkdown(String markdown) {
@@ -94,35 +93,70 @@ public final class Utils {
}
StringBuilder markdownStringBuilder = new StringBuilder(markdown);
- Pattern previewReddItImagePattern = REGEX_PATTERNS[6];
+ Pattern previewReddItImagePattern = REGEX_PATTERNS[3];
Matcher matcher = previewReddItImagePattern.matcher(markdownStringBuilder);
int start = 0;
int previewReddItLength = "https://preview.redd.it/".length();
while (matcher.find(start)) {
- String id = markdownStringBuilder.substring(matcher.start() + previewReddItLength, markdownStringBuilder.indexOf(".", matcher.start() + previewReddItLength));
+ String id;
+ if (markdownStringBuilder.charAt(matcher.start()) == '[') {
+ //Has caption
+ int urlStartIndex = markdownStringBuilder.lastIndexOf("https://preview.redd.it/", matcher.end());
+ id = markdownStringBuilder.substring(previewReddItLength + urlStartIndex,
+ markdownStringBuilder.indexOf(".", previewReddItLength + urlStartIndex));
+ } else {
+ id = markdownStringBuilder.substring(matcher.start() + previewReddItLength,
+ markdownStringBuilder.indexOf(".", matcher.start() + previewReddItLength));
+ }
+
if (!mediaMetadataMap.containsKey(id)) {
start = matcher.end();
continue;
}
- String replacingText = "![img](" + markdownStringBuilder.substring(matcher.start(), matcher.end()) + ")";
- markdownStringBuilder.replace(matcher.start(), matcher.end(), replacingText);
- start = replacingText.length() + matcher.start();
+
+ if (markdownStringBuilder.charAt(matcher.start()) == '[') {
+ //Has caption
+ markdownStringBuilder.insert(matcher.start(), '!');
+ start = matcher.end() + 1;
+ } else {
+ String replacingText = "![img](" + markdownStringBuilder.substring(matcher.start(), matcher.end()) + ")";
+ markdownStringBuilder.replace(matcher.start(), matcher.end(), replacingText);
+ start = replacingText.length() + matcher.start();
+ }
+
matcher = previewReddItImagePattern.matcher(markdownStringBuilder);
}
start = 0;
- Pattern iReddItImagePattern = REGEX_PATTERNS[7];
+ Pattern iReddItImagePattern = REGEX_PATTERNS[4];
matcher = iReddItImagePattern.matcher(markdownStringBuilder);
int iReddItLength = "https://i.redd.it/".length();
while (matcher.find(start)) {
- String id = markdownStringBuilder.substring(matcher.start() + iReddItLength, matcher.start() + markdownStringBuilder.indexOf(".", iReddItLength));
+ String id;
+ if (markdownStringBuilder.charAt(matcher.start()) == '[') {
+ //Has caption
+ int urlStartIndex = markdownStringBuilder.lastIndexOf("https://i.redd.it/", matcher.end());
+ id = markdownStringBuilder.substring(iReddItLength + urlStartIndex,
+ markdownStringBuilder.indexOf(".", iReddItLength + urlStartIndex));
+ } else {
+ id = markdownStringBuilder.substring(matcher.start() + iReddItLength, matcher.start() + markdownStringBuilder.indexOf(".", iReddItLength));
+ }
+
if (!mediaMetadataMap.containsKey(id)) {
start = matcher.end();
continue;
}
- String replacingText = "![img](" + markdownStringBuilder.substring(matcher.start(), matcher.end()) + ")";
- markdownStringBuilder.replace(matcher.start(), matcher.end(), replacingText);
- start = replacingText.length() + matcher.start();
+
+ if (markdownStringBuilder.charAt(matcher.start()) == '[') {
+ //Has caption
+ markdownStringBuilder.insert(matcher.start(), '!');
+ start = matcher.end() + 1;
+ } else {
+ String replacingText = "![img](" + markdownStringBuilder.substring(matcher.start(), matcher.end()) + ")";
+ markdownStringBuilder.replace(matcher.start(), matcher.end(), replacingText);
+ start = replacingText.length() + matcher.start();
+ }
+
matcher = iReddItImagePattern.matcher(markdownStringBuilder);
}