MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

add Ant.highlight module and tests

+139 -18
+36
examples/demo/highlight.js
··· 1 + const hl = Ant.highlight; 2 + const render = hl.render; 3 + 4 + console.log(render('<red>Red text</red> and back to normal')); 5 + console.log(render('<green>Green</green>, <blue>Blue</blue>, <yellow>Yellow</yellow>')); 6 + 7 + console.log(render('<bright_red>Bright Red</bright_red> vs <red>Normal Red</red>')); 8 + 9 + console.log(render('<bg_red>Red background</bg_red> with text')); 10 + console.log(render('<bg_blue><white>Blue bg with white text</white></bg_blue>')); 11 + 12 + console.log(render('<bold>Bold text</bold> and <dim>dim text</dim>')); 13 + console.log(render('<ul>Underlined</ul> text')); 14 + console.log(render('<i>Italic</i> or <italic>italic</italic>, <strike>strikethrough</strike>, <invert>inverted</invert>')); 15 + 16 + console.log(render('<bold_red>Bold red</bold_red> or <bold+blue>bold blue</bold+blue>')); 17 + console.log(render('<dim_cyan>Dim cyan</dim_cyan> and <i+bright_green>italic green</i+bright_green>')); 18 + 19 + console.log(render('<#ff8800>Orange hex color</#ff8800>')); 20 + console.log(render('<#0f0>Bright green shorthand</#0f0>')); 21 + console.log(render('<bg_#ff00ff>Magenta background</bg_#ff00ff>')); 22 + 23 + console.log(render('<bold>Number: 42, String: hello</bold>')); 24 + console.log(render('<green>Hex: 0xff, Float: 3.14</green>')); 25 + 26 + console.log(render('<red>red <reset/>back to normal immediately')); 27 + 28 + console.log(render('Literal <<: less than, >>: greater than')); 29 + console.log(render('Literal %%: percent sign')); 30 + 31 + const code = `\nconst x = 42; 32 + function greet(name) { 33 + console.log(\`Hello, \${name}!\`); 34 + }`; 35 + 36 + console.log(hl(code));
+21
examples/demo/kat.js
··· 1 + #!/usr/bin/env ant 2 + 3 + import fs from 'node:fs'; 4 + import path from 'node:path'; 5 + 6 + function exit(error) { 7 + console.log(error); 8 + process.exit(1); 9 + } 10 + 11 + const file = process.argv[2]; 12 + if (!file) exit('usage: kat <file>'); 13 + 14 + try { 15 + const content = fs.readFileSync(file, 'utf8'); 16 + if (/\.(c|m)?(j|t)s$/.test(path.extname(file))) { 17 + console.log(Ant.highlight(content)); 18 + } else console.log(content); 19 + } catch (err) { 20 + exit(err.message); 21 + }
+7
src/highlight/iter.c
··· 356 356 return true; 357 357 } 358 358 359 + if (i == 0 && c == '#' && i + 1 < input_len && input[i + 1] == '!') { 360 + while (i < input_len && input[i] != '\n') i++; 361 + *out = (hl_span){ 0, i, HL_COMMENT }; 362 + it->pos = i; 363 + return true; 364 + } 365 + 359 366 if (it->state.mode == HL_STATE_STRING_SINGLE || it->state.mode == HL_STATE_STRING_DOUBLE) { 360 367 char quote = (it->state.mode == HL_STATE_STRING_SINGLE) ? '\'' : '"'; 361 368 size_t start = i;
+61
src/modules/builtin.c
··· 6 6 #include <string.h> 7 7 #include <time.h> 8 8 #include <errno.h> 9 + #include <crprintf.h> 9 10 10 11 #ifdef __APPLE__ 11 12 #include <mach/mach.h> ··· 18 19 #include "errors.h" 19 20 #include "runtime.h" 20 21 #include "internal.h" 22 + #include "highlight.h" 21 23 #include "descriptors.h" 22 24 23 25 #include "silver/engine.h" ··· 358 360 return js_mkundef(); 359 361 } 360 362 363 + static ant_value_t hl_get_tagged(ant_t *js, ant_value_t *args, int nargs) { 364 + size_t input_len; 365 + char *input = js_getstr(js, args[0], &input_len); 366 + 367 + size_t out_size = input_len * 8 + 1; 368 + char *out = malloc(out_size); 369 + if (!out) return js_mkerr(js, "out of memory"); 370 + 371 + int len = ant_highlight(input, input_len, out, out_size); 372 + ant_value_t result = js_mkstr(js, out, (size_t)len); 373 + free(out); 374 + 375 + return result; 376 + } 377 + 378 + static ant_value_t hl_render_tagged(ant_t *js, ant_value_t tagged) { 379 + size_t tagged_len; 380 + char *tagged_str = js_getstr(js, tagged, &tagged_len); 381 + 382 + size_t ansi_size = tagged_len * 2 + 1; 383 + char *ansi = malloc(ansi_size); 384 + if (!ansi) return js_mkerr(js, "out of memory"); 385 + 386 + int len = crsprintf_stateful(ansi, ansi_size, NULL, tagged_str); 387 + ant_value_t result = js_mkstr(js, ansi, len < 0 ? 0 : (size_t)len); 388 + free(ansi); 389 + 390 + return result; 391 + } 392 + 393 + static ant_value_t js_highlight(ant_t *js, ant_value_t *args, int nargs) { 394 + if (nargs < 1) return js_mkerr(js, "Ant.highlight() requires 1 argument"); 395 + if (vtype(args[0]) != T_STR) return js_mkerr(js, "Ant.highlight() argument must be a string"); 396 + 397 + ant_value_t tagged = hl_get_tagged(js, args, nargs); 398 + if (is_err(tagged)) return tagged; 399 + return hl_render_tagged(js, tagged); 400 + } 401 + 402 + static ant_value_t js_highlight_render(ant_t *js, ant_value_t *args, int nargs) { 403 + if (nargs < 1) return js_mkerr(js, "Ant.highlight.render() requires 1 argument"); 404 + if (vtype(args[0]) != T_STR) return js_mkerr(js, "Ant.highlight.render() argument must be a string"); 405 + return hl_render_tagged(js, args[0]); 406 + } 407 + 408 + static ant_value_t js_highlight_tags(ant_t *js, ant_value_t *args, int nargs) { 409 + if (nargs < 1) return js_mkerr(js, "Ant.highlight.tags() requires 1 argument"); 410 + if (vtype(args[0]) != T_STR) return js_mkerr(js, "Ant.highlight.tags() argument must be a string"); 411 + return hl_get_tagged(js, args, nargs); 412 + } 413 + 361 414 void init_builtin_module() { 362 415 ant_t *js = rt->js; 363 416 ant_value_t ant_obj = rt->ant_obj; ··· 368 421 js_set(js, ant_obj, "sleep", js_mkfun(js_sleep)); 369 422 js_set(js, ant_obj, "msleep", js_mkfun(js_msleep)); 370 423 js_set(js, ant_obj, "usleep", js_mkfun(js_usleep)); 424 + 425 + ant_value_t hl_obj = js_newobj(js); 426 + ant_value_t hl_fn = js_obj_to_func(hl_obj); 427 + 428 + js_set_slot(hl_obj, SLOT_CFUNC, js_mkfun(js_highlight)); 429 + js_set(js, hl_fn, "render", js_mkfun(js_highlight_render)); 430 + js_set(js, hl_fn, "tags", js_mkfun(js_highlight_tags)); 431 + js_set(js, ant_obj, "highlight", hl_fn); 371 432 372 433 ant_value_t raw_obj = js_newobj(js); 373 434 js_set_getter_desc(js, js_as_obj(raw_obj), "stack", 5, js_mkfun(js_raw_stack), JS_DESC_C);
+14 -18
src/readline.c
··· 308 308 repl_clear_to_end(); 309 309 if (crprintf_get_color() && len > 0) { 310 310 if (len <= 2048) { 311 - char tagged[8192]; 312 - char rendered[8192]; 313 - 314 - highlight_state state = hl_line_state; 315 - ant_highlight_stateful(line, (size_t)len, tagged, sizeof(tagged), &state); 316 - 317 - hl_prog = crprintf_recompile(hl_prog, tagged); 318 - crprintf_state *rs = crprintf_state_new(); 319 - crsprintf_compiled(rendered, sizeof(rendered), rs, hl_prog); 320 - crprintf_state_free(rs); 321 - 322 - fputs(rendered, stdout); 323 - } else { 324 - fwrite(line, 1, (size_t)len, stdout); 325 - } 326 - } else if (len > 0) { 327 - fwrite(line, 1, (size_t)len, stdout); 328 - } 311 + char tagged[8192]; 312 + char rendered[8192]; 313 + 314 + highlight_state state = hl_line_state; 315 + ant_highlight_stateful(line, (size_t)len, tagged, sizeof(tagged), &state); 316 + 317 + hl_prog = crprintf_recompile(hl_prog, tagged); 318 + crprintf_state *rs = crprintf_state_new(); 319 + crsprintf_compiled(rendered, sizeof(rendered), rs, hl_prog); 320 + crprintf_state_free(rs); 321 + 322 + fputs(rendered, stdout); 323 + } else fwrite(line, 1, (size_t)len, stdout); 324 + } else if (len > 0) fwrite(line, 1, (size_t)len, stdout); 329 325 330 326 #ifndef _WIN32 331 327 if ((x_end == 0) && (y_end > 0) && (len > 0) && (line[len - 1] != '\n')) {