use of org.suigeneris.jrcs.diff.myers.MyersDiff in project jspwiki by apache.
the class TraditionalDiffProvider method makeDiffHtml.
/**
* Makes a diff using the BMSI utility package. We use our own diff printer,
* which makes things easier.
*
* @param ctx The WikiContext in which the diff should be made.
* @param p1 The first string
* @param p2 The second string.
*
* @return Full HTML diff.
*/
public String makeDiffHtml(WikiContext ctx, String p1, String p2) {
String diffResult = "";
try {
String[] first = Diff.stringToArray(TextUtil.replaceEntities(p1));
String[] second = Diff.stringToArray(TextUtil.replaceEntities(p2));
Revision rev = Diff.diff(first, second, new MyersDiff());
if (rev == null || rev.size() == 0) {
return "";
}
// Guessing how big it will become...
StringBuffer ret = new StringBuffer(rev.size() * 20);
ret.append("<table class=\"diff\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n");
rev.accept(new RevisionPrint(ctx, ret));
ret.append("</table>\n");
return ret.toString();
} catch (DifferentiationFailedException e) {
diffResult = "makeDiff failed with DifferentiationFailedException";
log.error(diffResult, e);
}
return diffResult;
}
use of org.suigeneris.jrcs.diff.myers.MyersDiff in project jspwiki by apache.
the class ContextualDiffProvider method makeDiffHtml.
/**
* Do a colored diff of the two regions. This. is. serious. fun. ;-)
*
* @see org.apache.wiki.diff.DiffProvider#makeDiffHtml(WikiContext, String, String)
*
* {@inheritDoc}
*/
public synchronized String makeDiffHtml(WikiContext ctx, String wikiOld, String wikiNew) {
//
// Sequencing handles lineterminator to <br /> and every-other consequtive space to a
//
String[] alpha = sequence(TextUtil.replaceEntities(wikiOld));
String[] beta = sequence(TextUtil.replaceEntities(wikiNew));
Revision rev = null;
try {
rev = Diff.diff(alpha, beta, new MyersDiff());
} catch (DifferentiationFailedException dfe) {
log.error("Diff generation failed", dfe);
return "Error while creating version diff.";
}
int revSize = rev.size();
StringBuffer sb = new StringBuffer();
sb.append(m_diffStart);
//
// The MyersDiff is a bit dumb by converting a single line multi-word diff into a series
// of Changes. The ChangeMerger pulls them together again...
//
ChangeMerger cm = new ChangeMerger(sb, alpha, revSize);
rev.accept(cm);
cm.shutdown();
sb.append(m_diffEnd);
return sb.toString();
}
use of org.suigeneris.jrcs.diff.myers.MyersDiff in project jspwiki by apache.
the class SpamFilter method getChange.
/**
* Creates a simple text string describing the added content.
*
* @param context
* @param newText
* @return Empty string, if there is no change.
*/
private static Change getChange(WikiContext context, String newText) {
WikiPage page = context.getPage();
StringBuffer change = new StringBuffer();
WikiEngine engine = context.getEngine();
// Get current page version
Change ch = new Change();
try {
String oldText = engine.getPureText(page.getName(), WikiProvider.LATEST_VERSION);
String[] first = Diff.stringToArray(oldText);
String[] second = Diff.stringToArray(newText);
Revision rev = Diff.diff(first, second, new MyersDiff());
if (rev == null || rev.size() == 0) {
return ch;
}
for (int i = 0; i < rev.size(); i++) {
Delta d = rev.getDelta(i);
if (d instanceof AddDelta) {
d.getRevised().toString(change, "", "\r\n");
ch.m_adds++;
} else if (d instanceof ChangeDelta) {
d.getRevised().toString(change, "", "\r\n");
ch.m_adds++;
} else if (d instanceof DeleteDelta) {
ch.m_removals++;
}
}
} catch (DifferentiationFailedException e) {
log.error("Diff failed", e);
}
//
// Don't forget to include the change note, too
//
String changeNote = (String) page.getAttribute(WikiPage.CHANGENOTE);
if (changeNote != null) {
change.append("\r\n");
change.append(changeNote);
}
//
if (page.getAuthor() != null) {
change.append("\r\n" + page.getAuthor());
}
ch.m_change = change.toString();
return ch;
}
Aggregations