MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1#ifndef HIGHLIGHT_H
2#define HIGHLIGHT_H
3
4#include <stddef.h>
5#include <stdbool.h>
6
7typedef enum {
8 HL_STATE_NORMAL,
9 HL_STATE_STRING_SINGLE,
10 HL_STATE_STRING_DOUBLE,
11 HL_STATE_TEMPLATE,
12 HL_STATE_TEMPLATE_EXPR,
13 HL_STATE_BLOCK_COMMENT,
14} hl_mode_t;
15
16typedef struct {
17 hl_mode_t mode;
18 int template_depth;
19} highlight_state;
20
21#define HL_STATE_INIT ((highlight_state){ .mode = HL_STATE_NORMAL, .template_depth = 0 })
22
23typedef enum {
24 HL_NONE,
25 HL_KEYWORD,
26 HL_KEYWORD_ITALIC,
27 HL_KEYWORD_DELETE,
28 HL_KEYWORD_EXTENDS,
29 HL_TYPE,
30 HL_TYPE_STRING,
31 HL_TYPE_BOOLEAN,
32 HL_LITERAL_NULL,
33 HL_STRING,
34 HL_STRING_DELIMITER,
35 HL_STRING_ESCAPE,
36 HL_STRING_KEY,
37 HL_STRING_TEMPLATE,
38 HL_REGEX,
39 HL_REGEX_ESCAPE,
40 HL_REGEX_DELIMITER,
41 HL_REGEX_CDATA,
42 HL_BOOLEAN,
43 HL_NUMBER,
44 HL_NUMBER_PREFIX,
45 HL_COMMENT,
46 HL_FUNCTION_NAME,
47 HL_CLASS_NAME,
48 HL_PARENT_CLASS,
49 HL_FUNCTION,
50 HL_ARGUMENT,
51 HL_PROPERTY,
52 HL_OPERATOR,
53 HL_OPTIONAL_CHAIN,
54 HL_BRACKET,
55 HL_SEMICOLON,
56} hl_token_class;
57
58typedef struct {
59 size_t off;
60 size_t len;
61 hl_token_class cls;
62} hl_span;
63
64typedef enum {
65 HL_CTX_NONE,
66 HL_CTX_AFTER_FUNCTION,
67 HL_CTX_AFTER_CLASS,
68 HL_CTX_AFTER_EXTENDS,
69} hl_context;
70
71typedef struct {
72 const char *input;
73 size_t input_len;
74 size_t pos;
75 highlight_state state;
76 hl_context ctx;
77} hl_iter;
78
79static inline highlight_state hl_iter_state(const hl_iter *it) { return it->state; }
80
81void hl_iter_init(hl_iter *it, const char *input, size_t input_len, const highlight_state *state);
82bool hl_iter_next(hl_iter *it, hl_span *out);
83
84int ant_highlight(
85 const char *input, size_t input_len,
86 char *out, size_t out_size
87);
88
89int ant_highlight_stateful(
90 const char *input, size_t input_len,
91 char *out, size_t out_size,
92 highlight_state *state
93);
94
95int highlight_js_line_clipped(
96 const char *line, size_t line_len,
97 size_t max_cols,
98 char *out, size_t out_size,
99 highlight_state *state
100);
101
102#endif