Search in sources :

Example 1 with Diff

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;
    }
}
Also used : ITokenizer(org.omegat.tokenizer.ITokenizer) Diff(bmsi.util.Diff)

Aggregations

Diff (bmsi.util.Diff)1 ITokenizer (org.omegat.tokenizer.ITokenizer)1