use of org.suigeneris.jrcs.diff.delta.DeleteDelta 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.delta.DeleteDelta 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