1 | unit USyntaxHighlight;
|
---|
2 |
|
---|
3 | interface
|
---|
4 |
|
---|
5 | uses
|
---|
6 | Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
---|
7 | Dialogs, StdCtrls, ComCtrls;
|
---|
8 |
|
---|
9 |
|
---|
10 | type
|
---|
11 | TRuleIndex = (riNormal, riComment, riReservedWord, riNumber, riString,
|
---|
12 | riPreprocessor, riAssembler);
|
---|
13 |
|
---|
14 | procedure ProcessHighlight(var RichEdit: TRichEdit);
|
---|
15 |
|
---|
16 | var
|
---|
17 | Rules: array[TRuleIndex] of TFont;
|
---|
18 |
|
---|
19 | implementation
|
---|
20 |
|
---|
21 | function IsAlfanumeric(Character: Char): Boolean;
|
---|
22 | begin
|
---|
23 | Result := ((Ord(UpperCase(Character)[1]) >= Ord('A')) and (Ord(UpperCase(Character)[1]) <= Ord('Z')))
|
---|
24 | or ((Ord(Character) >= Ord('0')) and (Ord(Character) <= Ord('9')));
|
---|
25 | end;
|
---|
26 |
|
---|
27 | procedure ProcessHighlight(var RichEdit: TRichEdit);
|
---|
28 | type
|
---|
29 | TBlockState = (msNormalText, msString, msComment1, msComment2, msComment3,
|
---|
30 | msComment4, msComment5, msComment6);
|
---|
31 | var
|
---|
32 | Lines: TStringList;
|
---|
33 | I: Integer;
|
---|
34 | II: Integer;
|
---|
35 | BlockState: TBlockState;
|
---|
36 | // LastMachineState: TBlockState;
|
---|
37 | OneChar: Char;
|
---|
38 | LastPosition: TPoint;
|
---|
39 | const
|
---|
40 | ReservedWordList: array[0..80] of string = ('asm', 'begin', 'end', 'procedure', 'function',
|
---|
41 | 'program', 'while', 'do', 'type', 'var', 'const', 'property', 'object',
|
---|
42 | 'class', 'constructor', 'destructor', 'virtual', 'abstract', 'override',
|
---|
43 | 'overload', 'repeat', 'until', 'for', 'to', 'if', 'then', 'else', 'interface',
|
---|
44 | 'unit', 'implementation', 'initialization', 'finalization', 'private',
|
---|
45 | 'public', 'published', 'protected', 'absolute', 'default', 'finally', 'try',
|
---|
46 | 'except', 'index', 'case', 'exports', 'and', 'or', 'xor', 'not', 'array',
|
---|
47 | 'record', 'as', 'is', 'div', 'downto', 'goto', 'final', 'file', 'inherited',
|
---|
48 | 'inline', 'label', 'library', 'mod', 'nil', 'of', 'out', 'in', 'packed',
|
---|
49 | 'raise', 'resourcestring', 'sealed', 'set', 'shl', 'shr', 'static', 'string',
|
---|
50 | 'threadvar', 'unsafe', 'uses', 'with', 'read', 'write');
|
---|
51 | begin
|
---|
52 | Lines := TStringList.Create;
|
---|
53 | Lines.Assign(RichEdit.Lines);
|
---|
54 | LastPosition := RichEdit.CaretPos;
|
---|
55 | RichEdit.Lines.BeginUpdate;
|
---|
56 | RichEdit.Lines.Clear;
|
---|
57 | BlockState := msNormalText;
|
---|
58 | I := 1;
|
---|
59 | while (I < Length(Lines.Text)) do begin
|
---|
60 | case BlockState of
|
---|
61 | msNormalText: begin
|
---|
62 | II := 0;
|
---|
63 | while (II < Length(ReservedWordList)) do begin
|
---|
64 | if (ReservedWordList[II] = Copy(Lines.Text, I,
|
---|
65 | Length(ReservedWordList[II]))) and
|
---|
66 | (not IsAlfanumeric(Lines.Text[I + Length(ReservedWordList[II])])) and
|
---|
67 | (not IsAlfanumeric(Lines.Text[I - 1])) then begin
|
---|
68 | Break;
|
---|
69 | end;
|
---|
70 | Inc(II);
|
---|
71 | end;
|
---|
72 | if II < Length(ReservedWordList) then begin
|
---|
73 | RichEdit.SelAttributes.Assign(Rules[riReservedWord]);
|
---|
74 | RichEdit.SelText := ReservedWordList[II];
|
---|
75 | RichEdit.SelAttributes.Assign(Rules[riNormal]);
|
---|
76 | Inc(I, Length(ReservedWordList[II]));
|
---|
77 | end else begin
|
---|
78 | if (Lines.Text[I] = '{') then begin
|
---|
79 | RichEdit.SelAttributes.Assign(Rules[riComment]);
|
---|
80 | BlockState := msComment1;
|
---|
81 | RichEdit.SelText := Lines.Text[I];
|
---|
82 | Inc(I, 1);
|
---|
83 | end else
|
---|
84 | if (Copy(Lines.Text, I, 2) = '(*') then begin
|
---|
85 | RichEdit.SelAttributes.Assign(Rules[riComment]);
|
---|
86 | BlockState := msComment2;
|
---|
87 | RichEdit.SelText := '(*';
|
---|
88 | Inc(I, 2);
|
---|
89 | end else
|
---|
90 | if (Copy(Lines.Text, I, 2) = '//') then begin
|
---|
91 | RichEdit.SelAttributes.Assign(Rules[riComment]);
|
---|
92 | BlockState := msComment3;
|
---|
93 | RichEdit.SelText := '//';
|
---|
94 | Inc(I, 2);
|
---|
95 | end else
|
---|
96 | if Lines.Text[I] = '''' then begin
|
---|
97 | RichEdit.SelAttributes.Assign(Rules[riString]);
|
---|
98 | BlockState := msString;
|
---|
99 | RichEdit.SelText := Lines.Text[I];
|
---|
100 | Inc(I, 1);
|
---|
101 | end else begin
|
---|
102 | RichEdit.SelText := Lines.Text[I];
|
---|
103 | Inc(I);
|
---|
104 | end;
|
---|
105 | end;
|
---|
106 | end;
|
---|
107 | msString: begin
|
---|
108 | if Lines.Text[I] = '''' then begin
|
---|
109 | RichEdit.SelText := Lines.Text[I];
|
---|
110 | RichEdit.SelAttributes.Assign(Rules[riNormal]);
|
---|
111 | Inc(I, 1);
|
---|
112 | BlockState := msNormalText;
|
---|
113 | end else begin
|
---|
114 | RichEdit.SelText := Lines.Text[I];
|
---|
115 | Inc(I, 1);
|
---|
116 | end;
|
---|
117 | end;
|
---|
118 | msComment1: begin
|
---|
119 | if Lines.Text[I] = '}' then begin
|
---|
120 | RichEdit.SelText := '}';
|
---|
121 | Inc(I, 1);
|
---|
122 | RichEdit.SelAttributes.Assign(Rules[riNormal]);
|
---|
123 | BlockState := msNormalText;
|
---|
124 | end else begin
|
---|
125 | RichEdit.SelText := Lines.Text[I];
|
---|
126 | Inc(I, 1);
|
---|
127 | end;
|
---|
128 | end;
|
---|
129 | msComment2: begin
|
---|
130 | if (Copy(Lines.Text, I, 2) = '*)') then begin
|
---|
131 | BlockState := msNormalText;
|
---|
132 | RichEdit.SelText := '*)';
|
---|
133 | Inc(I, 2);
|
---|
134 | RichEdit.SelAttributes.Assign(Rules[riNormal]);
|
---|
135 | end else begin
|
---|
136 | RichEdit.SelText := Lines.Text[I];
|
---|
137 | Inc(I, 1);
|
---|
138 | end;
|
---|
139 | end;
|
---|
140 | msComment3: begin
|
---|
141 | if (Lines.Text[I] = #10) or (Lines.Text[I] = #13) then begin
|
---|
142 | RichEdit.SelText := Lines.Text[I];
|
---|
143 | RichEdit.SelAttributes.Assign(Rules[riNormal]);
|
---|
144 | BlockState := msNormalText;
|
---|
145 | Inc(I, 2);
|
---|
146 | end else begin
|
---|
147 | RichEdit.SelText := Lines.Text[I];
|
---|
148 | Inc(I, 1);
|
---|
149 | end;
|
---|
150 | end;
|
---|
151 | end;
|
---|
152 | end;
|
---|
153 | RichEdit.Lines.EndUpdate;
|
---|
154 | RichEdit.CaretPos := LastPosition;
|
---|
155 | Lines.Free;
|
---|
156 | end;
|
---|
157 |
|
---|
158 | initialization
|
---|
159 |
|
---|
160 | Rules[riNormal] := TFont.Create;
|
---|
161 | with Rules[riNormal] do begin
|
---|
162 | Name := 'Courier New';
|
---|
163 | Size := 10;
|
---|
164 | end;
|
---|
165 | Rules[riComment] := TFont.Create;
|
---|
166 | with Rules[riComment] do begin
|
---|
167 | Assign(Rules[riNormal]);
|
---|
168 | Color := clBlue;
|
---|
169 | Style := [fsItalic];
|
---|
170 | end;
|
---|
171 | Rules[riString] := TFont.Create;
|
---|
172 | with Rules[riString] do begin
|
---|
173 | Assign(Rules[riNormal]);
|
---|
174 | Color := clGreen;
|
---|
175 | end;
|
---|
176 | Rules[riNumber] := TFont.Create;
|
---|
177 | with Rules[riNumber] do begin
|
---|
178 | Assign(Rules[riNormal]);
|
---|
179 | end;
|
---|
180 | Rules[riAssembler] := TFont.Create;
|
---|
181 | with Rules[riAssembler] do begin
|
---|
182 | Assign(Rules[riNormal]);
|
---|
183 | Color := clRed;
|
---|
184 | end;
|
---|
185 | Rules[riPreprocessor] := TFont.Create;
|
---|
186 | with Rules[riPreprocessor] do begin
|
---|
187 | Assign(Rules[riNormal]);
|
---|
188 | Style := [fsItalic];
|
---|
189 | end;
|
---|
190 | Rules[riReservedWord] := TFont.Create;
|
---|
191 | with Rules[riReservedWord] do begin
|
---|
192 | Assign(Rules[riNormal]);
|
---|
193 | Style := [fsBold];
|
---|
194 | end;
|
---|
195 |
|
---|
196 | end.
|
---|