use of org.suigeneris.jrcs.diff.Revision in project xwiki-platform by xwiki.
the class XWikiPatchUtils method patch.
/**
* From {@link org.suigeneris.jrcs.rcs.impl.Node#patch(List, boolean)}.
*
* @param orig - text to patch, List<String> of lines.
* @param diff - diff to patch, {@link Diff} format
* @throws InvalidFileFormatException if diff is incorrect
* @throws PatchFailedException if error in patching
*/
public static void patch(List<String> orig, String diff) throws InvalidFileFormatException, PatchFailedException {
Revision revision = new Revision();
Object[] lines = ToString.stringToArray(diff);
for (int it = 0; it < lines.length; it++) {
String cmd = lines[it].toString();
if (cmd.length() == 0) {
break;
}
java.util.StringTokenizer t = new StringTokenizer(cmd, "ad ", true);
char action;
int n;
int count;
try {
action = t.nextToken().charAt(0);
n = Integer.parseInt(t.nextToken());
// skip the space
t.nextToken();
count = Integer.parseInt(t.nextToken());
} catch (Exception e) {
throw new InvalidFileFormatException("line:" + ":" + e.getClass().getName(), e);
}
if (action == 'd') {
revision.addDelta(new DeleteDelta(new Chunk(n - 1, count)));
} else if (action == 'a') {
revision.addDelta(new AddDelta(n, new Chunk(getTextLines(lines, it + 1, it + 1 + count), 0, count, n - 1)));
it += count;
} else {
throw new InvalidFileFormatException();
}
}
revision.applyTo(orig);
}
use of org.suigeneris.jrcs.diff.Revision 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.Revision 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.Revision 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