From 28e2bdfe740883a60a782f59f50a9accbde76510 Mon Sep 17 00:00:00 2001 From: Thodoris1999 Date: Thu, 18 Oct 2018 17:21:47 +0300 Subject: [PATCH] maybe finish the parse/modify string logic --- app/src/main/AndroidManifest.xml | 22 ++++++--- .../thmmy/mthmmy/activities/TestActivity.java | 28 +++++++++++ .../mthmmy/activities/main/MainActivity.java | 3 ++ .../java/gr/thmmy/mthmmy/model/BBTag.java | 8 ++++ .../thmmy/mthmmy/utils/parsing/BBParser.java | 46 +++++++++++++++++-- app/src/main/res/layout/activity_test.xml | 20 ++++++++ 6 files changed, 116 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/gr/thmmy/mthmmy/activities/TestActivity.java create mode 100644 app/src/main/res/layout/activity_test.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index eef46aad..cf3aaef0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,11 +17,18 @@ android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> - - - - - + + + + + \ No newline at end of file diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/TestActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/TestActivity.java new file mode 100644 index 00000000..1ac4c05c --- /dev/null +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/TestActivity.java @@ -0,0 +1,28 @@ +package gr.thmmy.mthmmy.activities; + +import androidx.appcompat.app.AppCompatActivity; +import gr.thmmy.mthmmy.R; +import gr.thmmy.mthmmy.utils.parsing.BBParser; +import timber.log.Timber; + +import android.os.Bundle; +import android.text.SpannableStringBuilder; +import android.widget.TextView; + +public class TestActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_test); + + String bb = "[b]An [i]elep[u]hant[/i][/b] swi[/u]ms in [s]the[/s] tree"; + SpannableStringBuilder result = BBParser.bb2span(bb); + + TextView bbRaw = findViewById(R.id.bb_raw); + TextView bb2Text = findViewById(R.id.bb2text); + + bbRaw.setText(bb); + bb2Text.setText(result); + } +} diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/main/MainActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/main/MainActivity.java index 4a64499f..8b0476a0 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/main/MainActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/main/MainActivity.java @@ -19,6 +19,7 @@ import androidx.preference.PreferenceManager; import androidx.viewpager.widget.ViewPager; import gr.thmmy.mthmmy.R; import gr.thmmy.mthmmy.activities.LoginActivity; +import gr.thmmy.mthmmy.activities.TestActivity; import gr.thmmy.mthmmy.activities.board.BoardActivity; import gr.thmmy.mthmmy.activities.downloads.DownloadsActivity; import gr.thmmy.mthmmy.activities.main.forum.ForumFragment; @@ -137,6 +138,8 @@ public class MainActivity extends BaseActivity implements RecentFragment.RecentF , Toast.LENGTH_SHORT).show(); } mBackPressed = System.currentTimeMillis(); + + startActivity(new Intent(this, TestActivity.class)); } @Override diff --git a/app/src/main/java/gr/thmmy/mthmmy/model/BBTag.java b/app/src/main/java/gr/thmmy/mthmmy/model/BBTag.java index 65a183fd..af8db970 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/model/BBTag.java +++ b/app/src/main/java/gr/thmmy/mthmmy/model/BBTag.java @@ -1,5 +1,7 @@ package gr.thmmy.mthmmy.model; +import androidx.annotation.NonNull; + public class BBTag { private int start, end; private String name; @@ -9,6 +11,12 @@ public class BBTag { this.name = name; } + @NonNull + @Override + public String toString() { + return "start:" + start + ",end:" + end + ",name:" + name; + } + public int getStart() { return start; } diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/parsing/BBParser.java b/app/src/main/java/gr/thmmy/mthmmy/utils/parsing/BBParser.java index 18d70d49..89e177c5 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/utils/parsing/BBParser.java +++ b/app/src/main/java/gr/thmmy/mthmmy/utils/parsing/BBParser.java @@ -5,12 +5,17 @@ import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.SpannedString; import android.text.TextUtils; +import android.text.style.StrikethroughSpan; import android.text.style.StyleSpan; +import android.text.style.UnderlineSpan; + +import org.commonmark.node.Link; import java.nio.charset.UnsupportedCharsetException; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; +import java.util.function.Predicate; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -18,20 +23,49 @@ import gr.thmmy.mthmmy.model.BBTag; import timber.log.Timber; public class BBParser { - private static final String[] supportedTags = {"b"}; + private static final String[] supportedTags = {"b", "i", "u", "s"}; - public static SpannedString bb2span(String bb) { + public static SpannableStringBuilder bb2span(String bb) { SpannableStringBuilder builder = new SpannableStringBuilder(bb); + // store the original indices of the string + LinkedList stringIndices = new LinkedList<>(); + for (int i = 0; i < builder.length(); i++) { + stringIndices.add(i); + } + BBTag[] tags = getTags(bb); for (BBTag tag : tags) { + int start = stringIndices.indexOf(tag.getStart()); + int end = stringIndices.indexOf(tag.getEnd()); + int startTagLength = tag.getName().length() + 2; + int endTagLength = tag.getName().length() + 3; switch (tag.getName()) { case "b": - builder.setSpan(new StyleSpan(Typeface.BOLD), tag.getStart(), tag.getEnd(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + builder.setSpan(new StyleSpan(Typeface.BOLD), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + break; + case "i": + builder.setSpan(new StyleSpan(Typeface.ITALIC), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + break; + case "u": + builder.setSpan(new UnderlineSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + break; + case "s": + builder.setSpan(new StrikethroughSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); break; default: throw new UnsupportedCharsetException("Tag not supported"); } + //remove starting and ending tag and and do the same changes in the list + builder.delete(start, start + startTagLength); + for (int i = start; i < start + startTagLength; i++) { + stringIndices.remove(start); + } + builder.delete(end - startTagLength, end - startTagLength + endTagLength); + for (int i = end - startTagLength; i < end - startTagLength + endTagLength; i++) { + stringIndices.remove(end - startTagLength); + } } + return builder; } public static BBTag[] getTags(String bb) { @@ -40,7 +74,7 @@ public class BBParser { LinkedList tags = new LinkedList<>(); Matcher bbMatcher = bbtagPattern.matcher(bb); while (bbMatcher.find()) { - String name = bbMatcher.group(0); + String name = bbMatcher.group(1); if (name.startsWith("/")) { //closing tag name = name.substring(1); @@ -55,6 +89,10 @@ public class BBParser { if (isSupported(name)) tags.add(new BBTag(bbMatcher.start(), name)); } + // remove parsed tags with no end tag + for (BBTag bbTag : tags) + if (bbTag.getEnd() == 0) + tags.remove(bbTag); return tags.toArray(new BBTag[0]); } diff --git a/app/src/main/res/layout/activity_test.xml b/app/src/main/res/layout/activity_test.xml new file mode 100644 index 00000000..16accea6 --- /dev/null +++ b/app/src/main/res/layout/activity_test.xml @@ -0,0 +1,20 @@ + + + + + + + + \ No newline at end of file