1 21 22 package org.armedbear.j; 23 24 import gnu.regexp.RE; 25 import gnu.regexp.REMatch; 26 import gnu.regexp.UncheckedRE; 27 28 public final class LispShellFormatter extends Formatter 29 { 30 private static final byte FORMAT_TEXT = 0; 32 private static final byte FORMAT_COMMENT = 1; 33 private static final byte FORMAT_PROMPT = 2; 34 private static final byte FORMAT_INPUT = 3; 35 36 private final RE defaultPromptRE = 37 new UncheckedRE("^[^>\\*\\]]*[>\\*\\]] *"); 38 39 public LispShellFormatter(Buffer buffer) 40 { 41 this.buffer = buffer; 42 } 43 44 public LineSegmentList formatLine(Line line) 45 { 46 clearSegmentList(); 47 if (line == null) { 48 addSegment("", FORMAT_TEXT); 49 return segmentList; 50 } 51 final String text = getDetabbedText(line); 52 Annotation a = line.getAnnotation(); 53 if (a != null) { 54 int index = a.getIntegerValue(); 56 if (index > 0 && index <= text.length()) { 57 addSegment(text, 0, index, FORMAT_PROMPT); 58 addSegment(text, index, FORMAT_INPUT); 59 return segmentList; 60 } 61 } 62 if (line.flags() == 0) { 63 int promptEnd = getPromptEndIndex(text); 64 if (promptEnd > 0) { 65 line.setAnnotation(new Annotation(promptEnd)); 66 line.setFlags(STATE_PROMPT); 67 addSegment(text, 0, promptEnd, FORMAT_PROMPT); 68 int commentStart = text.indexOf(';', promptEnd); 69 if (commentStart >= promptEnd) { 70 addSegment(text, promptEnd, commentStart, FORMAT_INPUT); 71 addSegment(text, commentStart, FORMAT_COMMENT); 72 } else 73 addSegment(text, promptEnd, FORMAT_INPUT); 74 return segmentList; 75 } 76 line.setFlags(STATE_OUTPUT); 79 } 81 if (text.indexOf(';') == 0) { 82 addSegment(text, FORMAT_COMMENT); 83 } else { 84 int format = 85 (line.flags() == STATE_INPUT) ? FORMAT_INPUT : FORMAT_TEXT; 86 addSegment(text, format); 87 } 88 return segmentList; 89 } 90 91 private int getPromptEndIndex(String text) 92 { 93 if (text.length() == 0) 94 return 0; 95 String trim = text.trim(); 96 if (trim.length() == 0) 97 return 0; 98 if (trim.charAt(0) == '(') 99 return 0; if (text.startsWith("> ")) 101 return 2; 102 if (text.startsWith("* ")) 103 return 2; 104 final RE promptRE; 105 if (buffer instanceof CommandInterpreter) 106 promptRE = ((CommandInterpreter)buffer).getPromptRE(); 107 else 108 promptRE = defaultPromptRE; 109 REMatch match = promptRE.getMatch(text); 110 if (match != null) 111 return match.getEndIndex(); 112 return 0; 113 } 114 115 public FormatTable getFormatTable() 116 { 117 if (formatTable == null) { 118 formatTable = new FormatTable("LispShellMode"); 119 formatTable.addEntryFromPrefs(FORMAT_TEXT, "text"); 120 formatTable.addEntryFromPrefs(FORMAT_COMMENT, "comment"); 121 formatTable.addEntryFromPrefs(FORMAT_PROMPT, "prompt"); 122 formatTable.addEntryFromPrefs(FORMAT_INPUT, "input" ); 123 } 124 return formatTable; 125 } 126 } 127 | Popular Tags |