1 21 22 package org.armedbear.j; 23 24 public final class DiffFormatter extends Formatter 25 { 26 private static final int DIFF_FORMAT_TEXT = 0; 28 private static final int DIFF_FORMAT_FILE = 1; 29 private static final int DIFF_FORMAT_HEADER = 2; 30 private static final int DIFF_FORMAT_CONTEXT = 3; 31 private static final int DIFF_FORMAT_INSERTED = 4; 32 private static final int DIFF_FORMAT_DELETED = 5; 33 private static final int DIFF_FORMAT_CHANGED = 6; 34 35 public static final int DIFF_FORMAT_LAST = 6; 36 37 public DiffFormatter(Buffer buffer) 38 { 39 this.buffer = buffer; 40 } 41 42 public LineSegmentList formatLine(Line line) 43 { 44 clearSegmentList(); 45 if (line == null || line.length() == 0) { 46 addSegment("", DIFF_FORMAT_TEXT); 47 return segmentList; 48 } 49 final String text = getDetabbedText(line); 50 char c = text.charAt(0); 51 if (c == '+' && !text.startsWith("+++ ")) { 52 addSegment(text, DIFF_FORMAT_INSERTED); 54 return segmentList; 55 } 56 if (c == '>') { 57 addSegment(text, DIFF_FORMAT_INSERTED); 59 return segmentList; 60 } 61 if (c == '-' && !text.equals("---") && !text.startsWith("--- ")) { 62 addSegment(text, DIFF_FORMAT_DELETED); 64 return segmentList; 65 } 66 if (c == '<') { 67 addSegment(text, DIFF_FORMAT_DELETED); 69 return segmentList; 70 } 71 if (c == '!') { 72 addSegment(text, DIFF_FORMAT_CHANGED); 74 return segmentList; 75 } 76 if (c == '?' || text.startsWith("Index: ")) { 77 addSegment(text, DIFF_FORMAT_FILE); 79 return segmentList; 80 } 81 if (text.startsWith("==== ") && text.endsWith(" ====")) { 82 addSegment(text, DIFF_FORMAT_FILE); 84 return segmentList; 85 } 86 if (isDiffHeader(text)) { 87 addSegment(text, DIFF_FORMAT_HEADER); 88 return segmentList; 89 } 90 if (c == ' ' && buffer instanceof org.armedbear.j.mail.MessageBuffer) { 91 if (isDiffHeader(text.trim())) { 93 addSegment(text, DIFF_FORMAT_HEADER); 94 return segmentList; 95 } 96 int indent = -1; 97 for (Line ln = line.previous(); ln != null; ln = ln.previous()) { 98 String trim = ln.trim(); 99 if (trim.startsWith("@@ ") && trim.endsWith(" @@")) { 100 indent = getDetabbedText(ln).indexOf('@'); 101 break; 102 } 103 if (trim.startsWith("+++ ")) { 104 indent = getDetabbedText(ln).indexOf('+'); 105 break; 106 } 107 } 108 if (indent >= 0) { 109 String s = text.substring(indent); 110 if (s.length() == 0) { 111 addSegment("", DIFF_FORMAT_TEXT); 112 return segmentList; 113 } 114 c = s.charAt(0); 115 if (c == '+' && !s.startsWith("+++ ")) { 116 addSegment(text, DIFF_FORMAT_INSERTED); 118 return segmentList; 119 } 120 if (c == '-' && !s.startsWith("--- ")) { 121 addSegment(text, DIFF_FORMAT_DELETED); 123 return segmentList; 124 } 125 if (c == '!') { 126 addSegment(s, DIFF_FORMAT_CHANGED); 128 return segmentList; 129 } 130 if (c == '?' || s.startsWith("Index: ")) { 131 addSegment(text, DIFF_FORMAT_FILE); 133 return segmentList; 134 } 135 if (s.startsWith("==== ") && s.endsWith(" ====")) { 136 addSegment(text, DIFF_FORMAT_FILE); 138 return segmentList; 139 } 140 } 141 } 142 addSegment(text, DIFF_FORMAT_CONTEXT); 144 return segmentList; 145 } 146 147 private static boolean isDiffHeader(String s) 148 { 149 if ((s.startsWith("cvs server: ") || 150 s.startsWith("========") || 151 s.startsWith("RCS file: ") || 152 s.startsWith("retrieving revision ") || 153 s.startsWith("diff ") || 154 s.startsWith("*** ") || 155 s.startsWith("--- ") || 156 s.startsWith("+++ ") || 157 (s.startsWith("@@ ") || s.endsWith(" @@")) || 158 (s.startsWith("@ ") && s.endsWith(" @")))) 159 return true; 160 if (s.equals("***************")) 161 return true; 162 if (s.equals("---")) 163 return true; 164 if (s.length() > 0) { 165 char c = s.charAt(0); 166 if (c >= '0' && c <= '9') 167 return true; 168 } 169 return false; 170 } 171 172 public FormatTable getFormatTable() 173 { 174 if (formatTable == null) { 175 formatTable = new FormatTable("DiffMode"); 176 formatTable.addEntryFromPrefs(DIFF_FORMAT_TEXT, "text"); 177 formatTable.addEntryFromPrefs(DIFF_FORMAT_FILE, "file", "text"); 178 formatTable.addEntryFromPrefs(DIFF_FORMAT_HEADER, "header", "comment"); 179 formatTable.addEntryFromPrefs(DIFF_FORMAT_CONTEXT, "context", "text"); 180 formatTable.addEntryFromPrefs(DIFF_FORMAT_INSERTED, "inserted", "text"); 181 formatTable.addEntryFromPrefs(DIFF_FORMAT_DELETED, "deleted", "text"); 182 formatTable.addEntryFromPrefs(DIFF_FORMAT_CHANGED, "changed", "text"); 183 } 184 return formatTable; 185 } 186 } 187 | Popular Tags |