use of bmsi.util.Diff in project omegat by omegat-org.
the class DiffDriver method render.
/**
* Given two strings, perform a diff comparison and return a Render object.
*
* @param original Original string
* @param revised Revised string for comparison
* @return Render object
*/
public static Render render(String original, String revised, boolean optimize) {
Render result = new Render();
ITokenizer tokenizer = Core.getProject().getSourceTokenizer();
if (tokenizer == null) {
// Project has probably been closed.
return result;
}
String[] originalStrings = tokenizer.tokenizeVerbatimToStrings(original);
String[] revisedStrings = tokenizer.tokenizeVerbatimToStrings(revised);
if (originalStrings == null || revisedStrings == null) {
return result;
}
// Get "change script", a linked list of Diff.changes.
Diff diff = new Diff(originalStrings, revisedStrings);
Diff.change script = diff.diff_2(false);
assert (validate(script, originalStrings, revisedStrings));
StringBuilder rawText = new StringBuilder();
// case there was an insertion at the end.
for (int n = 0; n <= originalStrings.length; n++) {
Diff.change c = search(n, script);
if (c == null) {
// No change for this token.
if (n < originalStrings.length) {
if (optimize) {
result.addRun(rawText.length(), originalStrings[n].length(), Type.NOCHANGE);
}
rawText.append(originalStrings[n]);
}
continue;
} else {
// Next time, start search from the next change.
script = c.link;
}
// Handle deletions
if (c.deleted > 0) {
int start = rawText.length();
// rawText.append("-[");
for (int m = 0; m < c.deleted; m++) {
rawText.append(originalStrings[n + m]);
}
// rawText.append("]");
n += c.deleted - 1;
result.addRun(start, rawText.length() - start, Type.DELETE);
}
// Handle insertions
if (c.inserted > 0) {
int start = rawText.length();
// rawText.append("+[");
for (int m = 0; m < c.inserted; m++) {
rawText.append(revisedStrings[c.line1 + m]);
}
// rawText.append("]");
result.addRun(start, rawText.length() - start, Type.INSERT);
// add the original token in as well.
if (c.deleted == 0 && n < originalStrings.length) {
if (optimize) {
result.addRun(rawText.length(), originalStrings[n].length(), Type.NOCHANGE);
}
rawText.append(originalStrings[n]);
}
}
}
result.text = rawText.toString();
if (optimize) {
Render optimized = optimizeRender(result, 0);
return (optimized.formatting.size() < result.formatting.size()) ? optimized : result;
} else {
return result;
}
}
Aggregations