@Override public String toString() { String s1 = src.substring(srcOffset, srcOffset + length); String s2 = dst.substring(dstOffset, dstOffset + length); if (s1.equals(s2)) return s1; return "'" + s1 + "' != '" + s2 + "'"; }
protected void findLinearMatches( FormattedString formattedString, FormattedString toBeFormattedString, List<Mapping> mappings, List<Region> remainingRegions) { int i1 = 0; int i2 = 0; while (i1 < formattedString.length() && i2 < toBeFormattedString.length()) { int match = countOverlappingChars(formattedString, toBeFormattedString, i1, i2); if (match > 0) { mappings.add(new Mapping(formattedString, toBeFormattedString, i1, i2, match)); i1 += match; i2 += match; } if (i1 >= formattedString.length() || i2 >= toBeFormattedString.length()) return; int[] next = findNextOverlappingChar(formattedString, toBeFormattedString, i1, i2); if (next == null) { remainingRegions.add(new Region(i2, toBeFormattedString.length() - i2)); return; } remainingRegions.add(new Region(i2, next[1])); i1 += next[0]; i2 += next[1]; } }
protected int countOverlappingChars( FormattedString s1, FormattedString s2, int s1Offset, int s2Offset) { int i = 0; while (i + s1Offset < s1.length() && i + s2Offset < s2.length() && s1.charAt(i + s1Offset) == s2.charAt(i + s2Offset)) i++; return i; }
public String migrate(String formattedString, String toBeFormattedString, Pattern format) { if (Strings.isEmpty(toBeFormattedString) || Strings.isEmpty(formattedString)) return toBeFormattedString; FormattedString formatted = createFormattedString(formattedString, format); FormattedString toBeFormatted = createFormattedString(toBeFormattedString, format); if (formatted.semantic.equals(toBeFormatted.semantic)) return formattedString; List<Mapping> mappings = Lists.newArrayList(); List<Region> remainingRegions = Lists.newArrayList(); findLinearMatches(formatted, toBeFormatted, mappings, remainingRegions); for (Mapping m : mappings) toBeFormatted.migrateFrom(formatted, m); return toBeFormatted.toString(); }
protected int[] findNextOverlappingChar( FormattedString s1, FormattedString s2, int s1Offset, int s2Offset) { final int lenght = 2; if (lenght + s2Offset >= s2.length()) return null; int[] best = null; int i1 = 0; while (i1 + lenght + s1Offset < s1.length()) { String cand = s1.substring(s1Offset + i1, s1Offset + i1 + lenght); int i2 = s2.indexOf(cand, s2Offset) - s2Offset; if (i2 >= 0 && (best == null || best[0] + best[1] > i1 + i2)) best = new int[] {i1, i2}; if (best != null && best[0] + best[1] > i1) return best; i1++; } return best; }