made a few exceptions to quote parser for emoticons and quotes

This commit is contained in:
Daniel Gultsch 2017-03-26 12:29:12 +02:00
parent 00e8ba00c4
commit 2302122d8e
2 changed files with 43 additions and 8 deletions

View File

@ -352,7 +352,8 @@ public class MessageAdapter extends ArrayAdapter<Message> implements CopyTextVie
char current = body.length() > i ? body.charAt(i) : '\n'; char current = body.length() > i ? body.charAt(i) : '\n';
if (lineStart == -1) { if (lineStart == -1) {
if (previous == '\n') { if (previous == '\n') {
if ((current == '>' && UIHelper.isPositionFollowedByQuoteableCharacter(body,i)) || current == '\u00bb') { if ((current == '>' && UIHelper.isPositionFollowedByQuoteableCharacter(body,i))
|| current == '\u00bb' && !UIHelper.isPositionFollowedByQuote(body,i)) {
// Line start with quote // Line start with quote
lineStart = i; lineStart = i;
if (quoteStart == -1) quoteStart = i; if (quoteStart == -1) quoteStart = i;

View File

@ -8,7 +8,6 @@ import android.widget.PopupMenu;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
@ -25,8 +24,6 @@ import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.entities.MucOptions; import eu.siacs.conversations.entities.MucOptions;
import eu.siacs.conversations.entities.Presence; import eu.siacs.conversations.entities.Presence;
import eu.siacs.conversations.entities.Transferable; import eu.siacs.conversations.entities.Transferable;
import eu.siacs.conversations.ui.XmppActivity;
import eu.siacs.conversations.xmpp.chatstate.ChatState;
import eu.siacs.conversations.xmpp.jid.Jid; import eu.siacs.conversations.xmpp.jid.Jid;
public class UIHelper { public class UIHelper {
@ -233,7 +230,8 @@ public class UIHelper {
} }
public static boolean isPositionFollowedByQuoteableCharacter(CharSequence body, int pos) { public static boolean isPositionFollowedByQuoteableCharacter(CharSequence body, int pos) {
return !isPositionFollowedByNumber(body, pos) && !isPositionFollowedByBigGrin(body,pos); return !isPositionFollowedByNumber(body, pos)
&& !isPositionFollowedByEmoticon(body,pos);
} }
private static boolean isPositionFollowedByNumber(CharSequence body, int pos) { private static boolean isPositionFollowedByNumber(CharSequence body, int pos) {
@ -251,9 +249,45 @@ public class UIHelper {
return previousWasNumber; return previousWasNumber;
} }
private static boolean isPositionFollowedByBigGrin(CharSequence body, int pos) { private static boolean isPositionFollowedByEmoticon(CharSequence body, int pos) {
return body.length() <= pos + 1 if (body.length() <= pos +1) {
|| ((body.charAt(pos + 1) == '<') && (body.length() == pos + 2 || Character.isWhitespace(body.charAt(pos + 2)))); return false;
} else {
final char first = body.charAt(pos +1);
return first == ';'
|| first == ':'
|| smallerThanBeforeWhitespace(body,pos+1);
}
}
private static boolean smallerThanBeforeWhitespace(CharSequence body, int pos) {
for(int i = pos; i < body.length(); ++i) {
final char c = body.charAt(i);
if (Character.isWhitespace(c)) {
return false;
} else if (c == '<') {
return body.length() == i + 1 || Character.isWhitespace(body.charAt(i + 1));
}
}
return false;
}
public static boolean isPositionFollowedByQuote(CharSequence body, int pos) {
if (body.length() <= pos + 1 || Character.isWhitespace(body.charAt(pos+1))) {
return false;
}
boolean previousWasWhitespace = false;
for (int i = pos +1; i < body.length(); i++) {
char c = body.charAt(i);
if (c == '\n' || c == '»') {
return false;
} else if (c == '«' && !previousWasWhitespace) {
return true;
} else {
previousWasWhitespace = Character.isWhitespace(c);
}
}
return false;
} }
public static String getDisplayName(MucOptions.User user) { public static String getDisplayName(MucOptions.User user) {