Table.java 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package me.km.utils;
  2. public class Table {
  3. private final String color;
  4. private final int[] widths;
  5. public Table(String color, int... widths) {
  6. this.color = color;
  7. this.widths = widths;
  8. }
  9. public String getStart() {
  10. return getLine('┌', '┬', '┐');
  11. }
  12. public String getMiddle() {
  13. return getLine('├', '┼', '┤');
  14. }
  15. public String getEnd() {
  16. return getLine('└', '┴', '┘');
  17. }
  18. private String getLine(char start, char middle, char end) {
  19. StringBuilder sb = new StringBuilder(color).append(start);
  20. for(int width : widths) {
  21. for(int j = 0; j < width; j++) {
  22. sb.append('─');
  23. }
  24. sb.append(middle);
  25. }
  26. sb.setCharAt(sb.length() - 1, end);
  27. return sb.toString();
  28. }
  29. public String get(String... args) {
  30. StringBuilder sb = new StringBuilder(color).append("│ ");
  31. for(int i = 0; i < widths.length; i++) {
  32. sb.append("§r");
  33. sb.append(shorten(args[i], 9 * widths[i] - 1));
  34. sb.append(color).append("│ ");
  35. }
  36. sb.deleteCharAt(sb.length() - 1);
  37. return sb.toString();
  38. }
  39. private int getCharWidth(char c) {
  40. switch(c) {
  41. case 'f':
  42. case 'k':
  43. return 5;
  44. case 'I':
  45. case 't':
  46. case ' ':
  47. case '[':
  48. case ']':
  49. case '{':
  50. case '}':
  51. case '(':
  52. case ')':
  53. return 4;
  54. case 'l':
  55. return 3;
  56. case ';':
  57. case ',':
  58. case '.':
  59. case 'i':
  60. return 2;
  61. }
  62. return 6;
  63. }
  64. private String shorten(String s, int max) {
  65. int sum = 0;
  66. int fat = 0;
  67. StringBuilder sb = new StringBuilder();
  68. for(int i = 0; i < s.length(); i++) {
  69. char c = s.charAt(i);
  70. if(c == '§') {
  71. sb.append('§');
  72. i++;
  73. if(i < s.length()) {
  74. char cc = Character.toLowerCase(s.charAt(i));
  75. if(cc == 'l') {
  76. fat = 1;
  77. } else if(cc != 'm' && cc != 'n' && cc != 'o' && cc != 'k') {
  78. fat = 0;
  79. }
  80. sb.append(cc);
  81. }
  82. continue;
  83. }
  84. int width = getCharWidth(c) + fat;
  85. if(sum + width > max) {
  86. break;
  87. }
  88. sum += width;
  89. sb.append(c);
  90. }
  91. sb.append("§0");
  92. while(sum + 4 <= max) {
  93. sb.append(' ');
  94. sum += 4;
  95. }
  96. while(sum + 2 <= max) {
  97. sb.append('˼');
  98. sum += 2;
  99. }
  100. while(sum + 1 <= max) {
  101. sb.append('ˈ');
  102. sum++;
  103. }
  104. return sb.toString();
  105. }
  106. }