#include "tree_sitter/parser.h"
enum TokenType {
NESTED_COMMENT,
RAW_CONTENT,
};
void *tree_sitter_askama_external_scanner_create() { return NULL; }
void tree_sitter_askama_external_scanner_destroy() {}
unsigned tree_sitter_askama_external_scanner_serialize() { return 0; }
void tree_sitter_askama_external_scanner_deserialize() {}
static inline bool is_space(int32_t c) {
return c == ' ' || c == '\t' || c == '\n' || c == '\r';
}
static inline bool is_whitespace_control(int32_t c) {
return c == '-' || c == '+' || c == '~';
}
static bool scan_nested_comment(TSLexer *lexer) {
int depth = 1;
while (lexer->lookahead != 0) {
if (lexer->lookahead == '{') {
lexer->advance(lexer, false);
if (lexer->lookahead == '#') {
lexer->advance(lexer, false);
if (is_whitespace_control(lexer->lookahead)) {
lexer->advance(lexer, false);
}
depth++;
continue;
}
}
if (is_whitespace_control(lexer->lookahead) || lexer->lookahead == '#') {
lexer->mark_end(lexer); if (is_whitespace_control(lexer->lookahead)) {
lexer->advance(lexer, false);
}
if (lexer->lookahead == '#') {
lexer->advance(lexer, false);
if (lexer->lookahead == '}') {
if (depth == 1) {
return true; }
lexer->advance(lexer, false);
depth--;
continue;
}
}
}
lexer->advance(lexer, false); }
return false;
}
static bool is_it_endraw_yet(TSLexer *lexer) {
lexer->mark_end(lexer);
if (lexer->lookahead != '{') {
return false; }
lexer->advance(lexer, false);
if (lexer->lookahead != '%') {
return false; }
lexer->advance(lexer, false);
if (is_whitespace_control(lexer->lookahead)) {
lexer->advance(lexer, false); }
while (is_space(lexer->lookahead)) {
lexer->advance(lexer, false);
}
const char *kw = "endraw";
for (const char *p = kw; *p; p++) {
if (lexer->lookahead != *p) {
return false; }
lexer->advance(lexer, false); }
return true; }
static bool scan_raw_content(TSLexer *lexer) {
bool advanced = false;
while (!lexer->eof(lexer)) {
if (is_it_endraw_yet(lexer)) {
if (advanced) {
return true; } else {
return false; }
}
lexer->advance(lexer, false); advanced = true;
}
if (advanced) {
return true; }
return false; }
bool tree_sitter_askama_external_scanner_scan(void *payload, TSLexer *lexer,
const bool *valid_symbols) {
(void)payload;
if (lexer->eof(lexer)) {
return false; }
if (valid_symbols[NESTED_COMMENT]) {
lexer->result_symbol = NESTED_COMMENT;
return scan_nested_comment(lexer);
}
if (valid_symbols[RAW_CONTENT]) {
lexer->result_symbol = RAW_CONTENT;
return scan_raw_content(lexer);
}
return false;
}