Loading app/build.gradle +5 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,8 @@ android { } } configurations { cleanedAnnotations implementation.exclude group: 'org.jetbrains', module: 'annotations' all { exclude group: 'androidx.lifecycle', module: 'lifecycle-viewmodel-ktx' } Loading Loading @@ -186,6 +188,9 @@ dependencies { implementation 'io.noties.markwon:core:4.6.2' implementation 'io.noties.markwon:ext-tables:4.6.2' implementation 'io.noties.markwon:syntax-highlight:4.6.2' annotationProcessor 'io.noties:prism4j-bundler:2.0.0' //************ CAST **************/// Loading app/src/main/java/app/fedilab/android/MainApplication.java +2 −0 Original line number Diff line number Diff line Loading @@ -42,7 +42,9 @@ import java.util.Objects; import app.fedilab.android.mastodon.helper.ThemeHelper; import app.fedilab.android.peertube.services.GlobalUploadObserver; import es.dmoral.toasty.Toasty; import io.noties.prism4j.annotations.PrismBundle; @PrismBundle(includeAll = true, grammarLocatorClassName = ".MySuperGrammerLocator") public class MainApplication extends MultiDexApplication { Loading app/src/main/java/app/fedilab/android/mastodon/client/entities/app/MarkdownConverter.java +10 −0 Original line number Diff line number Diff line Loading @@ -37,5 +37,15 @@ public class MarkdownConverter { public String code; public int position; public URLSpan urlSpan; public int regexPosition(List<MarkdownItem> markdownItems) { int position = 0; for (MarkdownItem markdownItem : markdownItems) { if (markdownItem.code.equals(code) && position <= this.position) { position++; } } return position; } } } app/src/main/java/app/fedilab/android/mastodon/helper/SpannableHelper.java +67 −32 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ import android.view.View; import android.webkit.URLUtil; import android.widget.Toast; import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.core.content.ContextCompat; Loading Loading @@ -71,6 +72,7 @@ import java.util.regex.Pattern; import javax.net.ssl.HttpsURLConnection; import app.fedilab.android.BaseMainActivity; import app.fedilab.android.MySuperGrammerLocator; import app.fedilab.android.R; import app.fedilab.android.activities.MainActivity; import app.fedilab.android.databinding.PopupLinksBinding; Loading @@ -89,6 +91,10 @@ import app.fedilab.android.mastodon.ui.drawer.StatusAdapter; import app.fedilab.android.mastodon.viewmodel.mastodon.FiltersVM; import es.dmoral.toasty.Toasty; import io.noties.markwon.Markwon; import io.noties.markwon.ext.tables.TablePlugin; import io.noties.markwon.syntax.Prism4jThemeDefault; import io.noties.markwon.syntax.SyntaxHighlightPlugin; import io.noties.prism4j.Prism4j; public class SpannableHelper { Loading Loading @@ -149,8 +155,10 @@ public class SpannableHelper { } else { initialContent = new SpannableString(text); } boolean markdownSupport = sharedpreferences.getBoolean(context.getString(R.string.SET_MARKDOWN_SUPPORT), true); //Get all links SpannableStringBuilder content; if (markdownSupport) { MarkdownConverter markdownConverter = new MarkdownConverter(); markdownConverter.markdownItems = new ArrayList<>(); int next; Loading @@ -173,20 +181,30 @@ public class SpannableHelper { position++; } } final Markwon markwon = Markwon.create(context); final Markwon markwon = Markwon.builder(context) .usePlugin(TablePlugin.create(context)) .usePlugin(SyntaxHighlightPlugin.create(new Prism4j(new MySuperGrammerLocator()), Prism4jThemeDefault.create())).build(); final Spanned markdown = markwon.toMarkdown(initialContent.toString()); SpannableStringBuilder content = new SpannableStringBuilder(markdown); content = new SpannableStringBuilder(markdown); position = 0; for (MarkdownConverter.MarkdownItem markdownItem : markdownConverter.markdownItems) { Pattern p = Pattern.compile("(" + Pattern.quote(markdownItem.code) + ")", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(content); int fetchPosition = 1; while (m.find()) { int regexPosition = markdownItem.regexPosition(markdownConverter.markdownItems); if (regexPosition == fetchPosition) { content.setSpan(markdownItem.urlSpan, m.start(), m.end(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); } fetchPosition++; } position++; } } else { content = new SpannableStringBuilder(initialContent); } URLSpan[] urls = content.getSpans(0, (content.length() - 1), URLSpan.class); //Loop through links Loading Loading @@ -336,6 +354,23 @@ public class SpannableHelper { return trimSpannable(new SpannableStringBuilder(content)); } public interface Prism4jTheme { @ColorInt int background(); @ColorInt int textColor(); void apply( @NonNull String language, @NonNull Prism4j.Syntax syntax, @NonNull SpannableStringBuilder builder, int start, int end ); } private static void makeLinks(Context context, SpannableStringBuilder content, String url, int start, int end) { String newUrl = url; Loading app/src/main/res/values/strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -1156,6 +1156,7 @@ <string name="SET_GROUP_REBLOGS" translatable="false">SET_GROUP_REBLOGS</string> <string name="SET_BOOST_ORIGINAL_DATE" translatable="false">SET_BOOST_ORIGINAL_DATE</string> <string name="SET_MARKDOWN_SUPPORT" translatable="false">SET_MARKDOWN_SUPPORT</string> <string name="SET_TRUNCATE_LINKS" translatable="false">SET_TRUNCATE_LINKS</string> <string name="SET_TRUNCATE_LINKS_MAX" translatable="false">SET_TRUNCATE_LINKS_MAX</string> Loading Loading @@ -1907,6 +1908,7 @@ <string name="also_followed_by">Followed by:</string> <string name="Directory">Directory</string> <string name="boost_original_date">Display original date for boosts</string> <string name="markdown_support">Markdown support</string> <string name="set_disable_release_notes">Disable release notes</string> <string name="set_disable_release_notes_indication">When a new version is published, you will not be alerted inside the app.</string> <string name="formula">Formula</string> Loading Loading
app/build.gradle +5 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,8 @@ android { } } configurations { cleanedAnnotations implementation.exclude group: 'org.jetbrains', module: 'annotations' all { exclude group: 'androidx.lifecycle', module: 'lifecycle-viewmodel-ktx' } Loading Loading @@ -186,6 +188,9 @@ dependencies { implementation 'io.noties.markwon:core:4.6.2' implementation 'io.noties.markwon:ext-tables:4.6.2' implementation 'io.noties.markwon:syntax-highlight:4.6.2' annotationProcessor 'io.noties:prism4j-bundler:2.0.0' //************ CAST **************/// Loading
app/src/main/java/app/fedilab/android/MainApplication.java +2 −0 Original line number Diff line number Diff line Loading @@ -42,7 +42,9 @@ import java.util.Objects; import app.fedilab.android.mastodon.helper.ThemeHelper; import app.fedilab.android.peertube.services.GlobalUploadObserver; import es.dmoral.toasty.Toasty; import io.noties.prism4j.annotations.PrismBundle; @PrismBundle(includeAll = true, grammarLocatorClassName = ".MySuperGrammerLocator") public class MainApplication extends MultiDexApplication { Loading
app/src/main/java/app/fedilab/android/mastodon/client/entities/app/MarkdownConverter.java +10 −0 Original line number Diff line number Diff line Loading @@ -37,5 +37,15 @@ public class MarkdownConverter { public String code; public int position; public URLSpan urlSpan; public int regexPosition(List<MarkdownItem> markdownItems) { int position = 0; for (MarkdownItem markdownItem : markdownItems) { if (markdownItem.code.equals(code) && position <= this.position) { position++; } } return position; } } }
app/src/main/java/app/fedilab/android/mastodon/helper/SpannableHelper.java +67 −32 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ import android.view.View; import android.webkit.URLUtil; import android.widget.Toast; import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; import androidx.core.content.ContextCompat; Loading Loading @@ -71,6 +72,7 @@ import java.util.regex.Pattern; import javax.net.ssl.HttpsURLConnection; import app.fedilab.android.BaseMainActivity; import app.fedilab.android.MySuperGrammerLocator; import app.fedilab.android.R; import app.fedilab.android.activities.MainActivity; import app.fedilab.android.databinding.PopupLinksBinding; Loading @@ -89,6 +91,10 @@ import app.fedilab.android.mastodon.ui.drawer.StatusAdapter; import app.fedilab.android.mastodon.viewmodel.mastodon.FiltersVM; import es.dmoral.toasty.Toasty; import io.noties.markwon.Markwon; import io.noties.markwon.ext.tables.TablePlugin; import io.noties.markwon.syntax.Prism4jThemeDefault; import io.noties.markwon.syntax.SyntaxHighlightPlugin; import io.noties.prism4j.Prism4j; public class SpannableHelper { Loading Loading @@ -149,8 +155,10 @@ public class SpannableHelper { } else { initialContent = new SpannableString(text); } boolean markdownSupport = sharedpreferences.getBoolean(context.getString(R.string.SET_MARKDOWN_SUPPORT), true); //Get all links SpannableStringBuilder content; if (markdownSupport) { MarkdownConverter markdownConverter = new MarkdownConverter(); markdownConverter.markdownItems = new ArrayList<>(); int next; Loading @@ -173,20 +181,30 @@ public class SpannableHelper { position++; } } final Markwon markwon = Markwon.create(context); final Markwon markwon = Markwon.builder(context) .usePlugin(TablePlugin.create(context)) .usePlugin(SyntaxHighlightPlugin.create(new Prism4j(new MySuperGrammerLocator()), Prism4jThemeDefault.create())).build(); final Spanned markdown = markwon.toMarkdown(initialContent.toString()); SpannableStringBuilder content = new SpannableStringBuilder(markdown); content = new SpannableStringBuilder(markdown); position = 0; for (MarkdownConverter.MarkdownItem markdownItem : markdownConverter.markdownItems) { Pattern p = Pattern.compile("(" + Pattern.quote(markdownItem.code) + ")", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(content); int fetchPosition = 1; while (m.find()) { int regexPosition = markdownItem.regexPosition(markdownConverter.markdownItems); if (regexPosition == fetchPosition) { content.setSpan(markdownItem.urlSpan, m.start(), m.end(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); } fetchPosition++; } position++; } } else { content = new SpannableStringBuilder(initialContent); } URLSpan[] urls = content.getSpans(0, (content.length() - 1), URLSpan.class); //Loop through links Loading Loading @@ -336,6 +354,23 @@ public class SpannableHelper { return trimSpannable(new SpannableStringBuilder(content)); } public interface Prism4jTheme { @ColorInt int background(); @ColorInt int textColor(); void apply( @NonNull String language, @NonNull Prism4j.Syntax syntax, @NonNull SpannableStringBuilder builder, int start, int end ); } private static void makeLinks(Context context, SpannableStringBuilder content, String url, int start, int end) { String newUrl = url; Loading
app/src/main/res/values/strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -1156,6 +1156,7 @@ <string name="SET_GROUP_REBLOGS" translatable="false">SET_GROUP_REBLOGS</string> <string name="SET_BOOST_ORIGINAL_DATE" translatable="false">SET_BOOST_ORIGINAL_DATE</string> <string name="SET_MARKDOWN_SUPPORT" translatable="false">SET_MARKDOWN_SUPPORT</string> <string name="SET_TRUNCATE_LINKS" translatable="false">SET_TRUNCATE_LINKS</string> <string name="SET_TRUNCATE_LINKS_MAX" translatable="false">SET_TRUNCATE_LINKS_MAX</string> Loading Loading @@ -1907,6 +1908,7 @@ <string name="also_followed_by">Followed by:</string> <string name="Directory">Directory</string> <string name="boost_original_date">Display original date for boosts</string> <string name="markdown_support">Markdown support</string> <string name="set_disable_release_notes">Disable release notes</string> <string name="set_disable_release_notes_indication">When a new version is published, you will not be alerted inside the app.</string> <string name="formula">Formula</string> Loading