X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2Fbits%2FStringUtils.java;h=fffce206875cf663480d2041aac121f88b58d01a;hb=12b90437b5f22c2ae6e9b9b14c3b62b60f6143e5;hp=d71fd31bf9be15548a68b18886e28a82b07790ad;hpb=9588c7134280341ab6e92e37d1c1d00b3756cee5;p=fanfix.git diff --git a/src/jexer/bits/StringUtils.java b/src/jexer/bits/StringUtils.java index d71fd31..fffce20 100644 --- a/src/jexer/bits/StringUtils.java +++ b/src/jexer/bits/StringUtils.java @@ -80,14 +80,14 @@ public class StringUtils { // We have just transitioned from a word to // whitespace. See if we have enough space to add // the word to the line. - if (word.length() + line.length() > n) { + if (width(word.toString()) + width(line.toString()) > n) { // This word will exceed the line length. Wrap // at it instead. result.add(line.toString()); line = new StringBuilder(); } if ((word.toString().startsWith(" ")) - && (line.length() == 0) + && (width(line.toString()) == 0) ) { line.append(word.substring(1)); } else { @@ -112,14 +112,14 @@ public class StringUtils { } } // for (int j = 0; j < rawLines[i].length(); j++) - if (word.length() + line.length() > n) { + if (width(word.toString()) + width(line.toString()) > n) { // This word will exceed the line length. Wrap at it // instead. result.add(line.toString()); line = new StringBuilder(); } if ((word.toString().startsWith(" ")) - && (line.length() == 0) + && (width(line.toString()) == 0) ) { line.append(word.substring(1)); } else { @@ -148,7 +148,7 @@ public class StringUtils { List lines = left(str, n); for (String line: lines) { StringBuilder sb = new StringBuilder(); - for (int i = 0; i < n - line.length(); i++) { + for (int i = 0; i < n - width(line); i++) { sb.append(' '); } sb.append(line); @@ -175,8 +175,8 @@ public class StringUtils { List lines = left(str, n); for (String line: lines) { StringBuilder sb = new StringBuilder(); - int l = (n - line.length()) / 2; - int r = n - line.length() - l; + int l = (n - width(line)) / 2; + int r = n - width(line) - l; for (int i = 0; i < l; i++) { sb.append(' '); } @@ -449,7 +449,8 @@ public class StringUtils { || ((ch >= 0xffe0) && (ch <= 0xffe6)) || ((ch >= 0x20000) && (ch <= 0x2fffd)) || ((ch >= 0x30000) && (ch <= 0x3fffd)) - // TODO: emoji / twemoji + // emoji + || ((ch >= 0x1f004) && (ch <= 0x1fffd)) ) ) { return 2; @@ -466,10 +467,32 @@ public class StringUtils { */ public static int width(final String str) { int n = 0; - for (int i = 0; i < str.length(); i++) { - n += width(str.charAt(i)); + for (int i = 0; i < str.length();) { + int ch = str.codePointAt(i); + n += width(ch); + i += Character.charCount(ch); } return n; } + /** + * Check if character is in the CJK range. + * + * @param ch character to check + * @return true if this character is in the CJK range + */ + public static boolean isCjk(final int ch) { + return ((ch >= 0x2e80) && (ch <= 0x9fff)); + } + + /** + * Check if character is in the emoji range. + * + * @param ch character to check + * @return true if this character is in the emoji range + */ + public static boolean isEmoji(final int ch) { + return ((ch >= 0x1f004) && (ch <= 0x1fffd)); + } + }