1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
/*
* libbrlapi - A library providing access to braille terminals for applications.
*
* Copyright (C) 2006-2025 by
* Samuel Thibault <Samuel.Thibault@ens-lyon.org>
* Sébastien Hinderer <Sebastien.Hinderer@ens-lyon.org>
*
* libbrlapi comes with ABSOLUTELY NO WARRANTY.
*
* This is free software, placed under the terms of the
* GNU Lesser General Public License, as published by the Free Software
* Foundation; either version 2.1 of the License, or (at your option) any
* later version. Please see the file LICENSE-LGPL for details.
*
* Web Page: http://brltty.app/
*
* This software is maintained by Dave Mielke <dave@mielke.cc>.
*/
package org.a11y.brlapi;
import java.util.Map;
import java.util.HashMap;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public abstract class Strings {
private Strings () {
}
public static boolean isAbbreviation (String actual, String supplied) {
int count = supplied.length();
if (count == 0) return false;
if (count > actual.length()) return false;
return actual.regionMatches(true, 0, supplied, 0, count);
}
private final static Map<String, Pattern> patternCache = new HashMap<>();
public static Pattern getPattern (String expression) {
synchronized (patternCache) {
return patternCache.computeIfAbsent(expression, Pattern::compile);
}
}
public static Matcher getMatcher (String expression, String text) {
return getPattern(expression).matcher(text);
}
public static String replaceAll (String text, String expression, String replacement) {
return getMatcher(expression, text).replaceAll(replacement);
}
public static String wordify (String string) {
string = replaceAll(string, "^\\s*(.*?)\\s*$", "$1");
if (!string.isEmpty()) {
string = replaceAll(string, "(?<=.)(?=\\p{Upper})", " ");
string = replaceAll(string, "\\s+", " ");
}
return string;
}
public static int findNonemptyLine (CharSequence text) {
int length = text.length();
int at = 0;
for (int index=0; index<length; index+=1) {
char character = text.charAt(index);
if (character == '\n') {
at = index + 1;
} else if (!Character.isWhitespace(character)) {
break;
}
}
return at;
}
public static int findTrailingWhitespace (CharSequence text) {
int index = text.length();
while (--index >= 0) {
if (!Character.isWhitespace(text.charAt(index))) break;
}
return index + 1;
}
public static String removeTrailingWhitespace (String text) {
return text.substring(0, findTrailingWhitespace(text));
}
public static String compressWhitespace (String text) {
text = removeTrailingWhitespace(text);
if (!text.isEmpty()) text = replaceAll(text, "(?<=\\S)\\s+", " ");
return text;
}
public static String compressEmptyLines (String text) {
return replaceAll(text, "\n{2,}", "\n\n");
}
public static String formatParagraphs (String text, int width) {
StringBuilder result = new StringBuilder();
int length = text.length();
int from = 0;
while (from < length) {
int to = text.indexOf('\n', from);
if (to < 0) to = length;
String line = compressWhitespace(text.substring(from, to));
if (!line.isEmpty()) {
if (!Character.isWhitespace(line.charAt(0))) {
if (result.length() > 0) result.append('\n');
while (line.length() > width) {
int end = line.lastIndexOf(' ', width);
if (end < 0) {
end = line.indexOf(' ', width);
if (end < 0) break;
}
result.append(line.substring(0, end)).append('\n');
line = line.substring(end+1);
}
}
result.append(line);
}
result.append('\n');
from = to + 1;
}
result.setLength(findTrailingWhitespace(result));
result.delete(0, findNonemptyLine(result));
return compressEmptyLines(result.toString());
}
public static String formatParagraphs (String text) {
return formatParagraphs(text, 72);
}
}
|