Commit e954fd86 authored by Thomas's avatar Thomas
Browse files

Markdown support

parent 6790158e
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -85,6 +85,8 @@ android {
        }
    }
    configurations {
        cleanedAnnotations
        implementation.exclude group: 'org.jetbrains', module: 'annotations'
        all {
            exclude group: 'androidx.lifecycle', module: 'lifecycle-viewmodel-ktx'
        }
@@ -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 **************///

+2 −0
Original line number Diff line number Diff line
@@ -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 {

+10 −0
Original line number Diff line number Diff line
@@ -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;
        }
    }
}
+67 −32
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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 {

@@ -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;
@@ -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
@@ -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;
+2 −0
Original line number Diff line number Diff line
@@ -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>

@@ -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