スマホで絵文字を入力して作成した発言もemojioneフォントで表示されるようにした
This commit is contained in:
parent
b885c6bf66
commit
6689da0bb3
File diff suppressed because it is too large
Load Diff
|
@ -4,6 +4,7 @@ import android.text.SpannableStringBuilder;
|
|||
import android.text.Spanned;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
|
@ -15,7 +16,7 @@ public abstract class Emojione
|
|||
private static final Pattern SHORTNAME_PATTERN = Pattern.compile(":([-+\\w]+):");
|
||||
|
||||
public static final HashMap<String,String> map_name2unicode = EmojiMap._shortNameToUnicode;
|
||||
public static final HashMap<String,String> map_unicode2name = EmojiMap._unicodeToShortName;
|
||||
public static final HashSet<String> set_unicode = EmojiMap._unicode_set;
|
||||
|
||||
static class DecodeEnv{
|
||||
SpannableStringBuilder sb = new SpannableStringBuilder();
|
||||
|
@ -45,46 +46,36 @@ public abstract class Emojione
|
|||
int end = s.length();
|
||||
while( i < end ){
|
||||
int remain = end - i;
|
||||
if( remain >= 4 ){
|
||||
String check = s.substring( i, i + 4 );
|
||||
if( map_unicode2name.containsKey( check ) ){
|
||||
addEmoji( check );
|
||||
i += 4;
|
||||
String emoji = null;
|
||||
for(int j = EmojiMap.max_length; j>0;--j ){
|
||||
if( j > remain ) continue;
|
||||
String check = s.substring( i, i + j );
|
||||
if( ! set_unicode.contains( check ) ) continue;
|
||||
emoji = check;
|
||||
break;
|
||||
}
|
||||
if( emoji != null ){
|
||||
addEmoji( emoji );
|
||||
i += emoji.length();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if( remain >= 3 ){
|
||||
String check = s.substring( i, i + 3 );
|
||||
if( map_unicode2name.containsKey( check ) ){
|
||||
addEmoji( check );
|
||||
i += 3;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if( remain >= 2 ){
|
||||
String check = s.substring( i, i + 2 );
|
||||
if( map_unicode2name.containsKey( check ) ){
|
||||
addEmoji( check );
|
||||
i += 2;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if( remain >= 1 ){
|
||||
String check = s.substring( i, i + 1 );
|
||||
if( map_unicode2name.containsKey( check ) ){
|
||||
addEmoji( check );
|
||||
i += 1;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
closeSpan();
|
||||
int length = Character.charCount( s.codePointAt( i ) );
|
||||
if( length == 1){
|
||||
sb.append( s.charAt( i ) );
|
||||
++ i;
|
||||
}else{
|
||||
sb.append( s.substring( i,i+length ));
|
||||
i+= length;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static CharSequence decodeEmoji( String s ){
|
||||
|
||||
|
||||
|
||||
DecodeEnv decode_env = new DecodeEnv();
|
||||
Matcher matcher = SHORTNAME_PATTERN.matcher(s);
|
||||
int last_end = 0;
|
||||
|
@ -103,13 +94,13 @@ public abstract class Emojione
|
|||
decode_env.addEmoji( unicode );
|
||||
}
|
||||
}
|
||||
// close span
|
||||
decode_env.closeSpan();
|
||||
// copy remain
|
||||
int end = s.length();
|
||||
if( end > last_end ){
|
||||
decode_env.addUnicodeString(s.substring( last_end, end ));
|
||||
}
|
||||
// close span
|
||||
decode_env.closeSpan();
|
||||
return decode_env.sb;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ import java.util.HashMap;
|
|||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import jp.juggler.subwaytooter.BuildConfig;
|
||||
import jp.juggler.subwaytooter.api.entity.TootMention;
|
||||
|
||||
public class HTMLDecoder {
|
||||
|
@ -207,6 +208,10 @@ public class HTMLDecoder {
|
|||
}
|
||||
}
|
||||
|
||||
private static boolean isWhitespace( char c ){
|
||||
return Character.isWhitespace( c ) || c == 0x0a || c == 0x0d;
|
||||
}
|
||||
|
||||
public static SpannableStringBuilder decodeHTML( LinkClickContext account, String src ){
|
||||
try{
|
||||
TokenParser tracker = new TokenParser( src );
|
||||
|
@ -217,7 +222,7 @@ public class HTMLDecoder {
|
|||
|
||||
rootNode.encodeSpan( account, sb );
|
||||
int end = sb.length();
|
||||
while( end > 0 && Character.isWhitespace( sb.charAt( end - 1 ) ) ) -- end;
|
||||
while( end > 0 && isWhitespace( sb.charAt( end - 1 ) ) ) -- end;
|
||||
if( end < sb.length() ){
|
||||
sb.delete( end, sb.length() );
|
||||
}
|
||||
|
|
|
@ -179,6 +179,16 @@ public class Utils {
|
|||
return a == null ? b == null : a.equals( b );
|
||||
}
|
||||
|
||||
public static CharSequence dumpCodePoints(String str){
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for(int i=0,ie=str.length(),cp;i<ie;i+=Character.charCount(cp)){
|
||||
cp = str.codePointAt( i );
|
||||
sb.append( String.format( "0x%x,", cp ) );
|
||||
}
|
||||
return sb;
|
||||
}
|
||||
|
||||
|
||||
static final char[] hex = new char[]{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
|
||||
|
||||
public static void addHex( StringBuilder sb, byte b ){
|
||||
|
|
Loading…
Reference in New Issue