summaryrefslogtreecommitdiff
path: root/src/Row.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/Row.zig')
-rw-r--r--src/Row.zig54
1 files changed, 24 insertions, 30 deletions
diff --git a/src/Row.zig b/src/Row.zig
index 38fb72b..a47be6a 100644
--- a/src/Row.zig
+++ b/src/Row.zig
@@ -149,14 +149,12 @@ pub fn updateSyntax(self: *Row, buf: *Buffer) UpdateSyntaxError!void {
149 } 149 }
150 150
151 const syntax = buf.syntax.?; 151 const syntax = buf.syntax.?;
152 const kw1 = syntax.keywords1;
153 const kw2 = syntax.keywords2;
154 152
155 var after_sep = true;
156 var in_comment = if (self.idx > 0) buf.rows.items[self.idx - 1].ends_with_open_comment else false; 153 var in_comment = if (self.idx > 0) buf.rows.items[self.idx - 1].ends_with_open_comment else false;
157 var curr_str_quote: ?u8 = null; 154 var curr_str_quote: ?u8 = null;
158 155
159 var i: usize = 0; 156 var i: usize = 0;
157 var last_sep: usize = 0;
160 main_loop: while (i < self.rdata.items.len) { 158 main_loop: while (i < self.rdata.items.len) {
161 const prev_hl = if (i > 0) self.hldata.items[i - 1] else .normal; 159 const prev_hl = if (i > 0) self.hldata.items[i - 1] else .normal;
162 160
@@ -165,7 +163,7 @@ pub fn updateSyntax(self: *Row, buf: *Buffer) UpdateSyntaxError!void {
165 if (curr_str_quote == null and !in_comment and scs.len + i <= self.rdata.items.len) { 163 if (curr_str_quote == null and !in_comment and scs.len + i <= self.rdata.items.len) {
166 if (std.mem.eql(u8, scs, self.rdata.items[i..(i + scs.len)])) { 164 if (std.mem.eql(u8, scs, self.rdata.items[i..(i + scs.len)])) {
167 std.mem.set(Highlight, self.hldata.items[i..], .comment); 165 std.mem.set(Highlight, self.hldata.items[i..], .comment);
168 break; 166 break :main_loop;
169 } 167 }
170 } 168 }
171 } 169 }
@@ -181,16 +179,16 @@ pub fn updateSyntax(self: *Row, buf: *Buffer) UpdateSyntaxError!void {
181 std.mem.set(Highlight, self.hldata.items[i..(i + mce.len)], .comment_ml); 179 std.mem.set(Highlight, self.hldata.items[i..(i + mce.len)], .comment_ml);
182 i += mce.len; 180 i += mce.len;
183 in_comment = false; 181 in_comment = false;
184 after_sep = true; 182 last_sep = i;
185 } else { 183 } else {
186 i += 1; 184 i += 1;
187 continue; 185 continue :main_loop;
188 } 186 }
189 } else if (mcs.len + i <= self.rdata.items.len and std.mem.eql(u8, mcs, self.rdata.items[i..(i + mcs.len)])) { 187 } else if (mcs.len + i <= self.rdata.items.len and std.mem.eql(u8, mcs, self.rdata.items[i..(i + mcs.len)])) {
190 std.mem.set(Highlight, self.hldata.items[i..(i + mcs.len)], .comment_ml); 188 std.mem.set(Highlight, self.hldata.items[i..(i + mcs.len)], .comment_ml);
191 i += mcs.len; 189 i += mcs.len;
192 in_comment = true; 190 in_comment = true;
193 continue; 191 continue :main_loop;
194 } 192 }
195 } 193 }
196 } 194 }
@@ -208,54 +206,50 @@ pub fn updateSyntax(self: *Row, buf: *Buffer) UpdateSyntaxError!void {
208 i += 1; 206 i += 1;
209 } else if (c == quote) { 207 } else if (c == quote) {
210 curr_str_quote = null; 208 curr_str_quote = null;
211 after_sep = true; 209 last_sep = i;
212 } 210 }
213 211
214 continue; 212 continue :main_loop;
215 } else { 213 } else {
216 // TODO: Move this to syntax struct 214 // TODO: Move this to syntax struct
217 if (c == '"' or c == '\'') { 215 if (c == '"' or c == '\'') {
218 curr_str_quote = c; 216 curr_str_quote = c;
219 self.hldata.items[i] = .string; 217 self.hldata.items[i] = .string;
220 i += 1; 218 i += 1;
221 continue; 219 continue :main_loop;
222 } 220 }
223 } 221 }
224 } 222 }
225 223
226 if (syntax.flags.hl_numbers) { 224 if (syntax.flags.hl_numbers) {
227 if ((std.ascii.isDigit(c) and (after_sep or prev_hl == .number)) or (c == '.' and prev_hl == .number)) { 225 if ((std.ascii.isDigit(c) and (last_sep == i or prev_hl == .number))
228 after_sep = false; 226 or (c == '.' and prev_hl == .number)
227 ) {
229 self.hldata.items[i] = .number; 228 self.hldata.items[i] = .number;
230 i += 1; 229 i += 1;
231 continue; 230 continue :main_loop;
232 } 231 }
233 } 232 }
234 233
235 if (after_sep) { 234 if (syntax.isSeparator(c)) {
236 for (kw1) |kw| { 235 const id = self.rdata.items[last_sep..i];
237 if (i + kw.len <= self.rdata.items.len and std.mem.eql(u8, kw, self.rdata.items[i..(i + kw.len)]) and (i + kw.len == self.rdata.items.len or syntax.isSeparator(self.rdata.items[i + kw.len]))) { 236 if (syntax.keyword_classifier(id)) |hl| {
238 std.mem.set(Highlight, self.hldata.items[i..(i + kw.len)], .keyword1); 237 std.mem.set(Highlight, self.hldata.items[last_sep..i], hl);
239 i += kw.len;
240 after_sep = false;
241 continue :main_loop;
242 }
243 } 238 }
244 239
245 for (kw2) |kw| { 240 last_sep = i + 1;
246 if (i + kw.len <= self.rdata.items.len and std.mem.eql(u8, kw, self.rdata.items[i..(i + kw.len)]) and (i + kw.len == self.rdata.items.len or syntax.isSeparator(self.rdata.items[i + kw.len]))) {
247 std.mem.set(Highlight, self.hldata.items[i..(i + kw.len)], .keyword2);
248 i += kw.len;
249 after_sep = false;
250 continue :main_loop;
251 }
252 }
253 } 241 }
254 242
255 after_sep = syntax.isSeparator(c);
256 i += 1; 243 i += 1;
257 } 244 }
258 245
246 if (!in_comment) {
247 const id = self.rdata.items[last_sep..self.rdata.items.len];
248 if (syntax.keyword_classifier(id)) |hl| {
249 std.mem.set(Highlight, self.hldata.items[last_sep..self.rdata.items.len], hl);
250 }
251 }
252
259 if (in_comment != self.ends_with_open_comment) { 253 if (in_comment != self.ends_with_open_comment) {
260 self.ends_with_open_comment = in_comment; 254 self.ends_with_open_comment = in_comment;
261 if (self.idx + 1 < buf.rows.items.len) { 255 if (self.idx + 1 < buf.rows.items.len) {