1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

Sync lexbor with master on PHP 8.4

This commit is contained in:
Niels Dossche
2025-08-25 00:06:18 +02:00
parent 20c274b688
commit c66af62511
80 changed files with 305450 additions and 192006 deletions

View File

@@ -56,15 +56,10 @@ if test "$PHP_DOM" != "no"; then
$LEXBOR_DIR/dom/interfaces/processing_instruction.c
$LEXBOR_DIR/dom/interfaces/shadow_root.c
$LEXBOR_DIR/dom/interfaces/text.c
$LEXBOR_DIR/encoding/big5.c
$LEXBOR_DIR/encoding/decode.c
$LEXBOR_DIR/encoding/encode.c
$LEXBOR_DIR/encoding/encoding.c
$LEXBOR_DIR/encoding/euc_kr.c
$LEXBOR_DIR/encoding/gb18030.c
$LEXBOR_DIR/encoding/iso_2022_jp_katakana.c
$LEXBOR_DIR/encoding/jis0208.c
$LEXBOR_DIR/encoding/jis0212.c
$LEXBOR_DIR/encoding/multi.c
$LEXBOR_DIR/encoding/range.c
$LEXBOR_DIR/encoding/res.c
$LEXBOR_DIR/encoding/single.c

View File

@@ -27,7 +27,7 @@ if (PHP_DOM == "yes") {
ADD_SOURCES("ext/dom/lexbor/lexbor/html/tree", "active_formatting.c open_elements.c error.c", "dom");
ADD_SOURCES("ext/dom/lexbor/lexbor/html/tree/insertion_mode", "after_after_body.c after_after_frameset.c after_body.c after_frameset.c after_head.c before_head.c before_html.c foreign_content.c in_body.c in_caption.c in_cell.c in_column_group.c in_frameset.c in_head.c in_head_noscript.c initial.c in_row.c in_select.c in_select_in_table.c in_table_body.c in_table.c in_table_text.c in_template.c text.c", "dom");
ADD_SOURCES("ext/dom/lexbor/lexbor/html", "encoding.c interface.c parser.c token.c token_attr.c tokenizer.c tree.c", "dom");
ADD_SOURCES("ext/dom/lexbor/lexbor/encoding", "big5.c decode.c encode.c encoding.c euc_kr.c gb18030.c iso_2022_jp_katakana.c jis0208.c jis0212.c range.c res.c single.c", "dom");
ADD_SOURCES("ext/dom/lexbor/lexbor/encoding", "decode.c encode.c encoding.c multi.c range.c res.c single.c", "dom");
ADD_SOURCES("ext/dom/lexbor/lexbor/html/interfaces", "anchor_element.c area_element.c audio_element.c base_element.c body_element.c br_element.c button_element.c canvas_element.c data_element.c data_list_element.c details_element.c dialog_element.c directory_element.c div_element.c d_list_element.c document.c element.c embed_element.c field_set_element.c font_element.c form_element.c frame_element.c frame_set_element.c head_element.c heading_element.c hr_element.c html_element.c iframe_element.c image_element.c input_element.c label_element.c legend_element.c li_element.c link_element.c map_element.c marquee_element.c media_element.c menu_element.c meta_element.c meter_element.c mod_element.c object_element.c o_list_element.c opt_group_element.c option_element.c output_element.c paragraph_element.c param_element.c picture_element.c pre_element.c progress_element.c quote_element.c script_element.c select_element.c slot_element.c source_element.c span_element.c style_element.c table_caption_element.c table_cell_element.c table_col_element.c table_element.c table_row_element.c table_section_element.c template_element.c text_area_element.c time_element.c title_element.c track_element.c u_list_element.c unknown_element.c video_element.c window.c", "dom");
ADD_SOURCES("ext/dom/lexbor/lexbor/selectors-adapted", "selectors.c", "dom");
ADD_SOURCES("ext/dom/lexbor/lexbor/css", "state.c log.c parser.c css.c", "dom");

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2023 Alexander Borisov
* Copyright (C) 2018-2025 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -26,8 +26,8 @@ extern "C" {
#include "lexbor/core/types.h"
#include "lexbor/core/lexbor.h"
#define LEXBOR_VERSION_MAJOR 1
#define LEXBOR_VERSION_MINOR 7
#define LEXBOR_VERSION_MAJOR 2
#define LEXBOR_VERSION_MINOR 0
#define LEXBOR_VERSION_PATCH 0
#define LEXBOR_VERSION_STRING LEXBOR_STRINGIZE(LEXBOR_VERSION_MAJOR) "." \

View File

@@ -305,13 +305,18 @@ done:
}
size_t
lexbor_conv_dec_to_hex(uint32_t number, lxb_char_t *out, size_t length)
lexbor_conv_dec_to_hex(uint32_t number, lxb_char_t *out, size_t length,
bool upper)
{
lxb_char_t c;
size_t len;
uint32_t tmp;
const lxb_char_t *map_str;
static const lxb_char_t map_str[] = "0123456789abcdef";
static const lxb_char_t map_str_l[] = "0123456789abcdef";
static const lxb_char_t map_str_u[] = "0123456789ABCDEF";
map_str = (upper) ? map_str_u : map_str_l;
if(number != 0) {
tmp = number;

View File

@@ -37,7 +37,8 @@ LXB_API unsigned
lexbor_conv_data_to_uint(const lxb_char_t **data, size_t length);
LXB_API size_t
lexbor_conv_dec_to_hex(uint32_t number, lxb_char_t *out, size_t length);
lexbor_conv_dec_to_hex(uint32_t number, lxb_char_t *out, size_t length,
bool upper);
lxb_inline long
lexbor_conv_double_to_long(double number)

View File

@@ -40,10 +40,6 @@ LXB_API lexbor_dobject_t *
lexbor_dobject_destroy(lexbor_dobject_t *dobject, bool destroy_self);
LXB_API uint8_t *
lexbor_dobject_init_list_entries(lexbor_dobject_t *dobject, size_t pos);
LXB_API void *
lexbor_dobject_alloc(lexbor_dobject_t *dobject);

View File

@@ -243,6 +243,8 @@ lexbor_mraw_realloc_tail(lexbor_mraw_t *mraw, void *data, void *begin,
size_t size, size_t begin_len, size_t new_size,
bool *is_valid)
{
size_t length;
uint8_t *tmp;
lexbor_mem_chunk_t *chunk = mraw->mem->chunk;
if (chunk->size > (begin_len + new_size)) {
@@ -267,35 +269,26 @@ lexbor_mraw_realloc_tail(lexbor_mraw_t *mraw, void *data, void *begin,
* If the tail is short then we increase the current data.
*/
if (begin_len == lexbor_mraw_meta_size()) {
void *new_data;
lexbor_mem_chunk_t new_chunk;
*is_valid = true;
lexbor_mem_chunk_init(mraw->mem, &new_chunk,
new_size + lexbor_mraw_meta_size());
if(new_chunk.data == NULL) {
return NULL;
}
lexbor_mraw_meta_set(new_chunk.data, &new_size);
new_data = lexbor_mraw_data_begin(new_chunk.data);
if (size != 0) {
memcpy(new_data, data, sizeof(uint8_t) * size);
}
#if defined(LEXBOR_HAVE_ADDRESS_SANITIZER)
ASAN_UNPOISON_MEMORY_REGION(chunk->data, chunk->size);
#endif
*is_valid = true;
lexbor_mem_chunk_destroy(mraw->mem, chunk, false);
length = lexbor_mem_align(new_size + lexbor_mraw_meta_size()
+ mraw->mem->chunk_min_size);
chunk->data = new_chunk.data;
chunk->size = new_chunk.size;
tmp = lexbor_realloc(chunk->data, length);
if (tmp == NULL) {
return NULL;
}
chunk->data = tmp;
chunk->size = length;
chunk->length = new_size + lexbor_mraw_meta_size();
return new_data;
lexbor_mraw_meta_set(tmp, &new_size);
return lexbor_mraw_data_begin(tmp);
}
*is_valid = false;

View File

@@ -25,7 +25,6 @@ extern "C" {
# define LXB_NONSTRING
#endif
typedef struct {
lxb_char_t key;

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019-2023 Alexander Borisov
* Copyright (C) 2019-2025 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -18,7 +18,7 @@ extern "C" {
#define LXB_CSS_VERSION_MAJOR 1
#define LXB_CSS_VERSION_MINOR 2
#define LXB_CSS_VERSION_MINOR 3
#define LXB_CSS_VERSION_PATCH 0
#define LXB_CSS_VERSION_STRING \

View File

@@ -156,9 +156,6 @@ struct lxb_css_parser {
lxb_css_syntax_token_type_t *types_end;
lxb_css_syntax_token_type_t *types_pos;
lxb_css_syntax_tokenizer_chunk_f chunk_cb;
void *chunk_ctx;
const lxb_char_t *pos;
uintptr_t offset;

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021-2023 Alexander Borisov
* Copyright (C) 2021-2024 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2023 Alexander Borisov
* Copyright (C) 2018-2025 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -17,7 +17,7 @@ extern "C" {
#define LXB_CSS_SYNTAX_VERSION_MAJOR 1
#define LXB_CSS_SYNTAX_VERSION_MINOR 1
#define LXB_CSS_SYNTAX_VERSION_MINOR 3
#define LXB_CSS_SYNTAX_VERSION_PATCH 0
#define LXB_CSS_SYNTAX_VERSION_STRING \

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2022 Alexander Borisov
* Copyright (C) 2020-2025 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -175,47 +175,6 @@ lxb_css_syntax_parser_consume(lxb_css_parser_t *parser)
}
}
lxb_status_t
lxb_css_syntax_parser_tkz_cb(lxb_css_syntax_tokenizer_t *tkz,
const lxb_char_t **data, const lxb_char_t **end,
void *ctx)
{
size_t length, size;
lxb_char_t *new_data;
lxb_status_t status;
lxb_css_parser_t *parser = ctx;
if (parser->pos == NULL) {
return parser->chunk_cb(tkz, data, end, parser->chunk_ctx);
}
length = (size_t) (*end - parser->pos);
if (SIZE_MAX - parser->str.length < length) {
return LXB_STATUS_ERROR_OVERFLOW;
}
if (parser->str.length + length >= parser->str_size) {
size = parser->str.length + length + 1;
new_data = lexbor_realloc(parser->str.data, size);
if (new_data == NULL) {
return LXB_STATUS_ERROR_MEMORY_ALLOCATION;
}
parser->str.data = new_data;
parser->str_size = size;
}
memcpy(parser->str.data + parser->str.length, parser->pos, length);
status = parser->chunk_cb(tkz, data, end, parser->chunk_ctx);
parser->str.length += length;
parser->pos = *data;
return status;
}
lxb_css_syntax_rule_t *
lxb_css_syntax_parser_list_rules_push(lxb_css_parser_t *parser,
const lxb_css_syntax_token_t *token,

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020-2022 Alexander Borisov
* Copyright (C) 2020-2025 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -84,11 +84,6 @@ lxb_css_syntax_parser_pipe_push(lxb_css_parser_t *parser,
const lxb_css_syntax_cb_pipe_t *pipe,
void *ctx, lxb_css_syntax_token_type_t stop);
LXB_API lxb_status_t
lxb_css_syntax_parser_tkz_cb(lxb_css_syntax_tokenizer_t *tkz,
const lxb_char_t **data, const lxb_char_t **end,
void *ctx);
LXB_API const lxb_css_syntax_token_t *
lxb_css_syntax_parser_start_block(lxb_css_parser_t *parser,
const lxb_css_syntax_token_t *token,

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2019 Alexander Borisov
* Copyright (C) 2018-2025 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -26,20 +26,20 @@ static const lxb_char_t lxb_css_syntax_res_name_map[256] =
0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01
};
#endif /* LXB_CSS_SYNTAX_RES_NAME_MAP_ENABLED */

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2019 Alexander Borisov
* Copyright (C) 2018-2025 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -48,11 +48,6 @@ const lxb_char_t *
lxb_css_syntax_state_plus(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token,
const lxb_char_t *data, const lxb_char_t *end);
const lxb_char_t *
lxb_css_syntax_state_plus_process(lxb_css_syntax_tokenizer_t *tkz,
lxb_css_syntax_token_t *token,
const lxb_char_t *data, const lxb_char_t *end);
const lxb_char_t *
lxb_css_syntax_state_comma(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token,
const lxb_char_t *data, const lxb_char_t *end);
@@ -61,11 +56,6 @@ const lxb_char_t *
lxb_css_syntax_state_minus(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token,
const lxb_char_t *data, const lxb_char_t *end);
const lxb_char_t *
lxb_css_syntax_state_minus_process(lxb_css_syntax_tokenizer_t *tkz,
lxb_css_syntax_token_t *token,
const lxb_char_t *data, const lxb_char_t *end);
const lxb_char_t *
lxb_css_syntax_state_full_stop(lxb_css_syntax_tokenizer_t *tkz, lxb_css_syntax_token_t *token,
const lxb_char_t *data, const lxb_char_t *end);
@@ -111,15 +101,25 @@ lxb_css_syntax_state_consume_before_numeric(lxb_css_syntax_tokenizer_t *tkz, lxb
const lxb_char_t *data, const lxb_char_t *end);
const lxb_char_t *
lxb_css_syntax_state_ident_like_begin(lxb_css_syntax_tokenizer_t *tkz,
lxb_css_syntax_token_t *token,
const lxb_char_t *data, const lxb_char_t *end);
lxb_css_syntax_state_ident_like(lxb_css_syntax_tokenizer_t *tkz,
lxb_css_syntax_token_t *token,
const lxb_char_t *data, const lxb_char_t *end);
const lxb_char_t *
lxb_css_syntax_state_ident_like_not_url_begin(lxb_css_syntax_tokenizer_t *tkz,
lxb_css_syntax_state_ident_like_not_url_start(lxb_css_syntax_tokenizer_t *tkz,
lxb_css_syntax_token_t *token,
const lxb_char_t *data, const lxb_char_t *end);
const lxb_char_t *
lxb_css_syntax_state_ident_like_not_url(lxb_css_syntax_tokenizer_t *tkz,
lxb_css_syntax_token_t *token,
const lxb_char_t *data, const lxb_char_t *end);
const lxb_char_t *
lxb_css_syntax_state_ident_like_not_url_surrogate(lxb_css_syntax_tokenizer_t *tkz,
lxb_css_syntax_token_t *token,
const lxb_char_t *data, const lxb_char_t *end);
#ifdef __cplusplus
} /* extern "C" */

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2020 Alexander Borisov
* Copyright (C) 2018-2025 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -11,7 +11,7 @@
static const lxb_css_syntax_tokenizer_state_f
lxb_css_syntax_state_res_map[256] =
{
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x00; 'NUL'; NULL */
lxb_css_syntax_state_ident_like_not_url, /* 0x00; 'NUL'; NULL */
lxb_css_syntax_state_delim, /* 0x01; 'SOH'; Start of Heading */
lxb_css_syntax_state_delim, /* 0x02; 'STX'; Start of text */
lxb_css_syntax_state_delim, /* 0x03; 'ETX'; End of text */
@@ -49,7 +49,7 @@ lxb_css_syntax_state_res_map[256] =
lxb_css_syntax_state_hash, /* 0x23; '#'; Pound sign */
lxb_css_syntax_state_delim, /* 0x24; '$'; Dollar sign */
lxb_css_syntax_state_delim, /* 0x25; '%'; Percentage sign */
lxb_css_syntax_state_delim, /* 0x26; '&'; Commericial and */
lxb_css_syntax_state_delim, /* 0x26; '&'; Ampersand */
lxb_css_syntax_state_string, /* 0x27; '''; Apostrophe */
lxb_css_syntax_state_lparenthesis, /* 0x28; '('; Left bracket */
lxb_css_syntax_state_rparenthesis, /* 0x29; ')'; Right bracket */
@@ -76,197 +76,197 @@ lxb_css_syntax_state_res_map[256] =
lxb_css_syntax_state_delim, /* 0x3E; '>'; Bigger than symbol */
lxb_css_syntax_state_delim, /* 0x3F; '?'; Question mark */
lxb_css_syntax_state_at, /* 0x40; '@'; At symbol */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x41; 'A' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x42; 'B' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x43; 'C' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x44; 'D' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x45; 'E' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x46; 'F' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x47; 'G' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x48; 'H' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x49; 'I' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x4A; 'J' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x4B; 'K' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x4C; 'L' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x4D; 'M' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x4E; 'N' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x4F; 'O' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x50; 'P' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x51; 'Q' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x52; 'R' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x53; 'S' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x54; 'T' */
lxb_css_syntax_state_ident_like_begin, /* 0x55; 'U' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x56; 'V' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x57; 'W' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x58; 'X' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x59; 'Y' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x5A; 'Z' */
lxb_css_syntax_state_ident_like_not_url, /* 0x41; 'A' */
lxb_css_syntax_state_ident_like_not_url, /* 0x42; 'B' */
lxb_css_syntax_state_ident_like_not_url, /* 0x43; 'C' */
lxb_css_syntax_state_ident_like_not_url, /* 0x44; 'D' */
lxb_css_syntax_state_ident_like_not_url, /* 0x45; 'E' */
lxb_css_syntax_state_ident_like_not_url, /* 0x46; 'F' */
lxb_css_syntax_state_ident_like_not_url, /* 0x47; 'G' */
lxb_css_syntax_state_ident_like_not_url, /* 0x48; 'H' */
lxb_css_syntax_state_ident_like_not_url, /* 0x49; 'I' */
lxb_css_syntax_state_ident_like_not_url, /* 0x4A; 'J' */
lxb_css_syntax_state_ident_like_not_url, /* 0x4B; 'K' */
lxb_css_syntax_state_ident_like_not_url, /* 0x4C; 'L' */
lxb_css_syntax_state_ident_like_not_url, /* 0x4D; 'M' */
lxb_css_syntax_state_ident_like_not_url, /* 0x4E; 'N' */
lxb_css_syntax_state_ident_like_not_url, /* 0x4F; 'O' */
lxb_css_syntax_state_ident_like_not_url, /* 0x50; 'P' */
lxb_css_syntax_state_ident_like_not_url, /* 0x51; 'Q' */
lxb_css_syntax_state_ident_like_not_url, /* 0x52; 'R' */
lxb_css_syntax_state_ident_like_not_url, /* 0x53; 'S' */
lxb_css_syntax_state_ident_like_not_url, /* 0x54; 'T' */
lxb_css_syntax_state_ident_like, /* 0x55; 'U' */
lxb_css_syntax_state_ident_like_not_url, /* 0x56; 'V' */
lxb_css_syntax_state_ident_like_not_url, /* 0x57; 'W' */
lxb_css_syntax_state_ident_like_not_url, /* 0x58; 'X' */
lxb_css_syntax_state_ident_like_not_url, /* 0x59; 'Y' */
lxb_css_syntax_state_ident_like_not_url, /* 0x5A; 'Z' */
lxb_css_syntax_state_ls_bracket, /* 0x5B; '['; Left square bracket */
lxb_css_syntax_state_rsolidus, /* 0x5C; '\'; Inverse/backward slash */
lxb_css_syntax_state_rs_bracket, /* 0x5D; ']'; Right square bracket */
lxb_css_syntax_state_delim, /* 0x5E; '^'; Circumflex */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x5F; '_'; Underscore */
lxb_css_syntax_state_ident_like_not_url, /* 0x5F; '_'; Underscore */
lxb_css_syntax_state_delim, /* 0x60; '`'; Gravis (backtick) */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x61; 'a' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x62; 'b' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x63; 'c' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x64; 'd' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x65; 'e' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x66; 'f' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x67; 'g' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x68; 'h' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x69; 'i' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x6A; 'j' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x6B; 'k' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x6C; 'l' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x6D; 'm' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x6E; 'n' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x6F; 'o' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x70; 'p' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x71; 'q' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x72; 'r' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x73; 's' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x74; 't' */
lxb_css_syntax_state_ident_like_begin, /* 0x75; 'u' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x76; 'v' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x77; 'w' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x78; 'x' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x79; 'y' */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x7A; 'z' */
lxb_css_syntax_state_ident_like_not_url, /* 0x61; 'a' */
lxb_css_syntax_state_ident_like_not_url, /* 0x62; 'b' */
lxb_css_syntax_state_ident_like_not_url, /* 0x63; 'c' */
lxb_css_syntax_state_ident_like_not_url, /* 0x64; 'd' */
lxb_css_syntax_state_ident_like_not_url, /* 0x65; 'e' */
lxb_css_syntax_state_ident_like_not_url, /* 0x66; 'f' */
lxb_css_syntax_state_ident_like_not_url, /* 0x67; 'g' */
lxb_css_syntax_state_ident_like_not_url, /* 0x68; 'h' */
lxb_css_syntax_state_ident_like_not_url, /* 0x69; 'i' */
lxb_css_syntax_state_ident_like_not_url, /* 0x6A; 'j' */
lxb_css_syntax_state_ident_like_not_url, /* 0x6B; 'k' */
lxb_css_syntax_state_ident_like_not_url, /* 0x6C; 'l' */
lxb_css_syntax_state_ident_like_not_url, /* 0x6D; 'm' */
lxb_css_syntax_state_ident_like_not_url, /* 0x6E; 'n' */
lxb_css_syntax_state_ident_like_not_url, /* 0x6F; 'o' */
lxb_css_syntax_state_ident_like_not_url, /* 0x70; 'p' */
lxb_css_syntax_state_ident_like_not_url, /* 0x71; 'q' */
lxb_css_syntax_state_ident_like_not_url, /* 0x72; 'r' */
lxb_css_syntax_state_ident_like_not_url, /* 0x73; 's' */
lxb_css_syntax_state_ident_like_not_url, /* 0x74; 't' */
lxb_css_syntax_state_ident_like, /* 0x75; 'u' */
lxb_css_syntax_state_ident_like_not_url, /* 0x76; 'v' */
lxb_css_syntax_state_ident_like_not_url, /* 0x77; 'w' */
lxb_css_syntax_state_ident_like_not_url, /* 0x78; 'x' */
lxb_css_syntax_state_ident_like_not_url, /* 0x79; 'y' */
lxb_css_syntax_state_ident_like_not_url, /* 0x7A; 'z' */
lxb_css_syntax_state_lc_bracket, /* 0x7B; '{'; Left curly bracket */
lxb_css_syntax_state_delim, /* 0x7C; '|'; Vertical line */
lxb_css_syntax_state_rc_bracket, /* 0x7D; '}'; Right curly brackets */
lxb_css_syntax_state_delim, /* 0x7E; '~'; Tilde */
lxb_css_syntax_state_delim, /* 0x7F; 'DEL'; Delete */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x80 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x81 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x82 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x83 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x84 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x85 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x86 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x87 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x88 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x89 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x8A */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x8B */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x8C */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x8D */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x8E */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x8F */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x90 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x91 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x92 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x93 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x94 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x95 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x96 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x97 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x98 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x99 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x9A */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x9B */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x9C */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x9D */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x9E */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0x9F */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xA0 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xA1 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xA2 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xA3 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xA4 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xA5 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xA6 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xA7 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xA8 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xA9 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xAA */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xAB */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xAC */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xAD */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xAE */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xAF */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xB0 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xB1 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xB2 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xB3 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xB4 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xB5 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xB6 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xB7 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xB8 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xB9 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xBA */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xBB */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xBC */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xBD */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xBE */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xBF */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xC0 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xC1 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xC2 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xC3 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xC4 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xC5 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xC6 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xC7 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xC8 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xC9 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xCA */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xCB */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xCC */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xCD */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xCE */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xCF */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xD0 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xD1 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xD2 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xD3 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xD4 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xD5 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xD6 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xD7 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xD8 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xD9 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xDA */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xDB */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xDC */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xDD */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xDE */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xDF */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xE0 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xE1 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xE2 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xE3 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xE4 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xE5 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xE6 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xE7 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xE8 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xE9 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xEA */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xEB */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xEC */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xED */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xEE */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xEF */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xF0 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xF1 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xF2 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xF3 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xF4 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xF5 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xF6 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xF7 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xF8 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xF9 */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xFA */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xFB */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xFC */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xFD */
lxb_css_syntax_state_ident_like_not_url_begin, /* 0xFE */
lxb_css_syntax_state_ident_like_not_url_begin /* 0xFF */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x80 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x81 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x82 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x83 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x84 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x85 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x86 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x87 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x88 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x89 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x8A */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x8B */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x8C */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x8D */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x8E */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x8F */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x90 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x91 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x92 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x93 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x94 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x95 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x96 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x97 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x98 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x99 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x9A */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x9B */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x9C */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x9D */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x9E */
lxb_css_syntax_state_ident_like_not_url_start, /* 0x9F */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xA0 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xA1 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xA2 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xA3 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xA4 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xA5 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xA6 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xA7 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xA8 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xA9 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xAA */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xAB */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xAC */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xAD */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xAE */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xAF */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xB0 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xB1 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xB2 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xB3 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xB4 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xB5 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xB6 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xB7 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xB8 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xB9 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xBA */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xBB */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xBC */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xBD */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xBE */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xBF */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xC0 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xC1 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xC2 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xC3 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xC4 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xC5 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xC6 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xC7 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xC8 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xC9 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xCA */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xCB */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xCC */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xCD */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xCE */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xCF */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xD0 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xD1 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xD2 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xD3 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xD4 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xD5 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xD6 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xD7 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xD8 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xD9 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xDA */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xDB */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xDC */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xDD */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xDE */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xDF */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xE0 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xE1 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xE2 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xE3 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xE4 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xE5 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xE6 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xE7 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xE8 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xE9 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xEA */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xEB */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xEC */
lxb_css_syntax_state_ident_like_not_url_surrogate, /* 0xED */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xEE */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xEF */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xF0 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xF1 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xF2 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xF3 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xF4 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xF5 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xF6 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xF7 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xF8 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xF9 */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xFA */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xFB */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xFC */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xFD */
lxb_css_syntax_state_ident_like_not_url_start, /* 0xFE */
lxb_css_syntax_state_ident_like_not_url_start /* 0xFF */
};

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2020 Alexander Borisov
* Copyright (C) 2018-2025 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -25,10 +25,6 @@
lxb_css_syntax_token_t *
lxb_css_syntax_tokenizer_token(lxb_css_syntax_tokenizer_t *tkz);
lxb_status_t
lxb_css_syntax_tokenizer_cache_push(lxb_css_syntax_tokenizer_cache_t *cache,
lxb_css_syntax_token_t *value);
typedef struct {
lexbor_str_t *str;
@@ -40,14 +36,15 @@ lxb_css_syntax_token_ctx_t;
static lxb_status_t
lxb_css_syntax_token_str_cb(const lxb_char_t *data, size_t len, void *ctx);
static int8_t
lxb_css_syntax_token_encode_utf_8(lxb_char_t *data, lxb_codepoint_t cp);
lxb_css_syntax_token_t *
lxb_css_syntax_token(lxb_css_syntax_tokenizer_t *tkz)
{
if (tkz->cache_pos < tkz->cache->length
&& (tkz->prepared == 0 || tkz->cache_pos < tkz->prepared))
{
return tkz->cache->list[tkz->cache_pos];
if (tkz->first != NULL) {
return tkz->first;
}
return lxb_css_syntax_tokenizer_token(tkz);
@@ -64,22 +61,16 @@ lxb_css_syntax_token_consume(lxb_css_syntax_tokenizer_t *tkz)
{
lxb_css_syntax_token_t *token;
if (tkz->cache_pos < tkz->cache->length) {
if (tkz->prepared != 0 && tkz->cache_pos >= tkz->prepared) {
return;
}
if (tkz->first) {
token = tkz->first;
tkz->first = token->next;
token = tkz->cache->list[tkz->cache_pos];
if (tkz->last == token) {
tkz->last = NULL;
}
lxb_css_syntax_token_string_free(tkz, token);
lexbor_dobject_free(tkz->tokens, token);
tkz->cache_pos += 1;
if (tkz->cache_pos >= tkz->cache->length) {
tkz->cache->length = 0;
tkz->cache_pos = 0;
}
}
}
@@ -161,30 +152,6 @@ copy:
return LXB_STATUS_OK;
}
lxb_css_syntax_token_t *
lxb_css_syntax_token_cached_create(lxb_css_syntax_tokenizer_t *tkz)
{
lxb_status_t status;
lxb_css_syntax_token_t *token;
token = lexbor_dobject_alloc(tkz->tokens);
if (token == NULL) {
tkz->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION;
return NULL;
}
status = lxb_css_syntax_tokenizer_cache_push(tkz->cache, token);
if (status != LXB_STATUS_OK) {
tkz->status = status;
return NULL;
}
token->cloned = false;
return token;
}
void
lxb_css_syntax_token_string_free(lxb_css_syntax_tokenizer_t *tkz,
lxb_css_syntax_token_t *token)
@@ -225,6 +192,8 @@ lxb_css_syntax_token_type_name_by_id(lxb_css_syntax_token_type_t type)
return (lxb_char_t *) "bad-url";
case LXB_CSS_SYNTAX_TOKEN_DELIM:
return (lxb_char_t *) "delim";
case LXB_CSS_SYNTAX_TOKEN_UNICODE_RANGE:
return (lxb_char_t *) "unicode-range";
case LXB_CSS_SYNTAX_TOKEN_NUMBER:
return (lxb_char_t *) "number";
case LXB_CSS_SYNTAX_TOKEN_PERCENTAGE:
@@ -293,10 +262,30 @@ lxb_css_syntax_token_serialize(const lxb_css_syntax_token_t *token,
switch (token->type) {
case LXB_CSS_SYNTAX_TOKEN_DELIM:
buf[0] = token->types.delim.character;
buf[1] = 0x00;
len = lxb_css_syntax_token_encode_utf_8(buf,
token->types.delim.character);
buf[len] = 0x00;
return cb(buf, 1, ctx);
return cb(buf, len, ctx);
case LXB_CSS_SYNTAX_TOKEN_UNICODE_RANGE:
/* Start */
buf[0] = 'U';
buf[1] = '+';
len = 2;
len += lexbor_conv_dec_to_hex(token->types.unicode_range.start,
&buf[len], (sizeof(buf) - 1) - len,
true);
/* End */
buf[len] = '-';
len += 1;
len += lexbor_conv_dec_to_hex(token->types.unicode_range.end,
&buf[len], (sizeof(buf) - 1) - len,
true);
buf[len] = 0x00;
return cb(buf, len, ctx);
case LXB_CSS_SYNTAX_TOKEN_NUMBER:
len = lexbor_conv_float_to_data(token->types.number.num,
@@ -613,6 +602,46 @@ lxb_css_syntax_token_error(lxb_css_parser_t *parser,
return msg;
}
static int8_t
lxb_css_syntax_token_encode_utf_8(lxb_char_t *data, lxb_codepoint_t cp)
{
if (cp < 0x80) {
/* 0xxxxxxx */
*data = (lxb_char_t) cp;
return 1;
}
if (cp < 0x800) {
/* 110xxxxx 10xxxxxx */
*data++ = (lxb_char_t) (0xC0 | (cp >> 6 ));
*data = (lxb_char_t) (0x80 | (cp & 0x3F));
return 2;
}
if (cp < 0x10000) {
/* 1110xxxx 10xxxxxx 10xxxxxx */
*data++ = (lxb_char_t) (0xE0 | ((cp >> 12)));
*data++ = (lxb_char_t) (0x80 | ((cp >> 6 ) & 0x3F));
*data = (lxb_char_t) (0x80 | ( cp & 0x3F));
return 3;
}
if (cp < 0x110000) {
/* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */
*data++ = (lxb_char_t) (0xF0 | ( cp >> 18));
*data++ = (lxb_char_t) (0x80 | ((cp >> 12) & 0x3F));
*data++ = (lxb_char_t) (0x80 | ((cp >> 6 ) & 0x3F));
*data = (lxb_char_t) (0x80 | ( cp & 0x3F));
return 4;
}
return 0;
}
/*
* No inline functions for ABI.
*/

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2020 Alexander Borisov
* Copyright (C) 2018-2025 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -28,6 +28,7 @@ extern "C" {
#define lxb_css_syntax_token_bad_url(token) ((lxb_css_syntax_token_bad_url_t *) (token))
#define lxb_css_syntax_token_delim(token) ((lxb_css_syntax_token_delim_t *) (token))
#define lxb_css_syntax_token_delim_char(token) (((lxb_css_syntax_token_delim_t *) (token))->character)
#define lxb_css_syntax_token_unicode_range(token) ((lxb_css_syntax_token_unicode_range_t *) (token))
#define lxb_css_syntax_token_number(token) ((lxb_css_syntax_token_number_t *) (token))
#define lxb_css_syntax_token_percentage(token) ((lxb_css_syntax_token_percentage_t *) (token))
#define lxb_css_syntax_token_dimension(token) ((lxb_css_syntax_token_dimension_t *) (token))
@@ -85,6 +86,7 @@ typedef enum {
/* Other tokens. */
LXB_CSS_SYNTAX_TOKEN_DELIM,
LXB_CSS_SYNTAX_TOKEN_UNICODE_RANGE,
LXB_CSS_SYNTAX_TOKEN_NUMBER,
LXB_CSS_SYNTAX_TOKEN_PERCENTAGE,
LXB_CSS_SYNTAX_TOKEN_CDO,
@@ -138,10 +140,17 @@ lxb_css_syntax_token_dimension_t;
typedef struct lxb_css_syntax_token_delim {
lxb_css_syntax_token_base_t base;
lxb_char_t character;
lxb_codepoint_t character;
}
lxb_css_syntax_token_delim_t;
typedef struct lxb_css_syntax_token_unicode_range {
lxb_css_syntax_token_base_t base;
lxb_codepoint_t start;
lxb_codepoint_t end;
}
lxb_css_syntax_token_unicode_range_t;
typedef lxb_css_syntax_token_string_t lxb_css_syntax_token_ident_t;
typedef lxb_css_syntax_token_string_t lxb_css_syntax_token_function_t;
typedef lxb_css_syntax_token_string_t lxb_css_syntax_token_at_keyword_t;
@@ -176,6 +185,7 @@ struct lxb_css_syntax_token {
lxb_css_syntax_token_string_t string;
lxb_css_syntax_token_bad_string_t bad_string;
lxb_css_syntax_token_delim_t delim;
lxb_css_syntax_token_unicode_range_t unicode_range;
lxb_css_syntax_token_l_parenthesis_t lparenthesis;
lxb_css_syntax_token_r_parenthesis_t rparenthesis;
lxb_css_syntax_token_cdc_t cdc;
@@ -192,6 +202,8 @@ struct lxb_css_syntax_token {
lxb_css_syntax_token_type_t type;
uintptr_t offset;
bool cloned;
lxb_css_syntax_token_t *next;
};
@@ -215,9 +227,6 @@ LXB_API lxb_status_t
lxb_css_syntax_token_string_make(lxb_css_syntax_tokenizer_t *tkz,
lxb_css_syntax_token_t *token);
LXB_API lxb_css_syntax_token_t *
lxb_css_syntax_token_cached_create(lxb_css_syntax_tokenizer_t *tkz);
LXB_API void
lxb_css_syntax_token_string_free(lxb_css_syntax_tokenizer_t *tkz,
lxb_css_syntax_token_t *token);

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2019 Alexander Borisov
* Copyright (C) 2018-2025 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -11,56 +11,78 @@
#ifdef LXB_CSS_SYNTAX_TOKEN_RES_NAME_SHS_MAP
#ifndef LXB_CSS_SYNTAX_TOKEN_RES_NAME_SHS_MAP_ENABLED
#define LXB_CSS_SYNTAX_TOKEN_RES_NAME_SHS_MAP_ENABLED
static const lexbor_shs_entry_t lxb_css_syntax_token_res_name_shs_map[] =
static const lexbor_shs_entry_t lxb_css_syntax_token_res_name_shs_map[136] =
{
{NULL, NULL, 92, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 135, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {"end-of-file", (void *) LXB_CSS_SYNTAX_TOKEN__EOF, 11, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{"colon", (void *) LXB_CSS_SYNTAX_TOKEN_COLON, 5, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{"undefined", (void *) LXB_CSS_SYNTAX_TOKEN_UNDEF, 9, 0}, {"right-curly-bracket", (void *) LXB_CSS_SYNTAX_TOKEN_RC_BRACKET, 19, 0},
{"right-square-bracket", (void *) LXB_CSS_SYNTAX_TOKEN_RS_BRACKET, 20, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{"delim", (void *) LXB_CSS_SYNTAX_TOKEN_DELIM, 5, 0}, {"left-parenthesis", (void *) LXB_CSS_SYNTAX_TOKEN_L_PARENTHESIS, 16, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{"ident", (void *) LXB_CSS_SYNTAX_TOKEN_IDENT, 5, 0}, {"cdo", (void *) LXB_CSS_SYNTAX_TOKEN_CDO, 3, 0},
{NULL, NULL, 0, 0}, {"left-parenthesis", (void *) LXB_CSS_SYNTAX_TOKEN_L_PARENTHESIS, 16, 0},
{"right-parenthesis", (void *) LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS, 17, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {"percentage", (void *) LXB_CSS_SYNTAX_TOKEN_PERCENTAGE, 10, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {"at-keyword", (void *) LXB_CSS_SYNTAX_TOKEN_AT_KEYWORD, 10, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{"string", (void *) LXB_CSS_SYNTAX_TOKEN_STRING, 6, 0}, {NULL, NULL, 0, 0},
{"bad-url", (void *) LXB_CSS_SYNTAX_TOKEN_BAD_URL, 7, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {"bad-string", (void *) LXB_CSS_SYNTAX_TOKEN_BAD_STRING, 10, 0},
{"whitespace", (void *) LXB_CSS_SYNTAX_TOKEN_WHITESPACE, 10, 0}, {NULL, NULL, 0, 0},
{"undefined", (void *) LXB_CSS_SYNTAX_TOKEN_UNDEF, 9, 0}, {NULL, NULL, 0, 0},
{"right-curly-bracket", (void *) LXB_CSS_SYNTAX_TOKEN_RC_BRACKET, 19, 0}, {"right-square-bracket", (void *) LXB_CSS_SYNTAX_TOKEN_RS_BRACKET, 20, 0},
{"dimension", (void *) LXB_CSS_SYNTAX_TOKEN_DIMENSION, 9, 0}, {"url", (void *) LXB_CSS_SYNTAX_TOKEN_URL, 3, 0},
{"string", (void *) LXB_CSS_SYNTAX_TOKEN_STRING, 6, 0}, {"comma", (void *) LXB_CSS_SYNTAX_TOKEN_COMMA, 5, 0},
{NULL, NULL, 0, 0}, {"bad-url", (void *) LXB_CSS_SYNTAX_TOKEN_BAD_URL, 7, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {"number", (void *) LXB_CSS_SYNTAX_TOKEN_NUMBER, 6, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{"semicolon", (void *) LXB_CSS_SYNTAX_TOKEN_SEMICOLON, 9, 0}, {NULL, NULL, 0, 0},
{"dimension", (void *) LXB_CSS_SYNTAX_TOKEN_DIMENSION, 9, 0}, {NULL, NULL, 0, 0},
{"colon", (void *) LXB_CSS_SYNTAX_TOKEN_COLON, 5, 0}, {"function", (void *) LXB_CSS_SYNTAX_TOKEN_FUNCTION, 8, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {"comma", (void *) LXB_CSS_SYNTAX_TOKEN_COMMA, 5, 0},
{"url", (void *) LXB_CSS_SYNTAX_TOKEN_URL, 3, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {"cdc", (void *) LXB_CSS_SYNTAX_TOKEN_CDC, 3, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {"hash", (void *) LXB_CSS_SYNTAX_TOKEN_HASH, 4, 0},
{NULL, NULL, 0, 0}, {"ident", (void *) LXB_CSS_SYNTAX_TOKEN_IDENT, 5, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{"comment", (void *) LXB_CSS_SYNTAX_TOKEN_COMMENT, 7, 0}, {NULL, NULL, 0, 0},
{"delim", (void *) LXB_CSS_SYNTAX_TOKEN_DELIM, 5, 0}, {NULL, NULL, 0, 0},
{"function", (void *) LXB_CSS_SYNTAX_TOKEN_FUNCTION, 8, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{"cdc", (void *) LXB_CSS_SYNTAX_TOKEN_CDC, 3, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{"unicode-range", (void *) LXB_CSS_SYNTAX_TOKEN_UNICODE_RANGE, 13, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {"left-curly-bracket", (void *) LXB_CSS_SYNTAX_TOKEN_LC_BRACKET, 18, 0},
{"left-square-bracket", (void *) LXB_CSS_SYNTAX_TOKEN_LS_BRACKET, 19, 0}
{"left-square-bracket", (void *) LXB_CSS_SYNTAX_TOKEN_LS_BRACKET, 19, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{"bad-string", (void *) LXB_CSS_SYNTAX_TOKEN_BAD_STRING, 10, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{"whitespace", (void *) LXB_CSS_SYNTAX_TOKEN_WHITESPACE, 10, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {"cdo", (void *) LXB_CSS_SYNTAX_TOKEN_CDO, 3, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {"comment", (void *) LXB_CSS_SYNTAX_TOKEN_COMMENT, 7, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{"at-keyword", (void *) LXB_CSS_SYNTAX_TOKEN_AT_KEYWORD, 10, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{"right-parenthesis", (void *) LXB_CSS_SYNTAX_TOKEN_R_PARENTHESIS, 17, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{"number", (void *) LXB_CSS_SYNTAX_TOKEN_NUMBER, 6, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {"percentage", (void *) LXB_CSS_SYNTAX_TOKEN_PERCENTAGE, 10, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{"end-of-file", (void *) LXB_CSS_SYNTAX_TOKEN__EOF, 11, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {NULL, NULL, 0, 0},
{NULL, NULL, 0, 0}, {"semicolon", (void *) LXB_CSS_SYNTAX_TOKEN_SEMICOLON, 9, 0}
};
#endif /* LXB_CSS_SYNTAX_TOKEN_RES_NAME_SHS_MAP_ENABLED */
#endif /* LXB_CSS_SYNTAX_TOKEN_RES_NAME_SHS_MAP */

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2020 Alexander Borisov
* Copyright (C) 2018-2025 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -8,6 +8,7 @@
#include "lexbor/css/syntax/tokenizer/error.h"
#include "lexbor/css/syntax/state.h"
#include "lexbor/css/syntax/state_res.h"
#include "lexbor/css/syntax/token.h"
#include "lexbor/core/array.h"
@@ -17,49 +18,18 @@
static const lxb_char_t lxb_css_syntax_tokenizer_important[] = "important";
static lxb_css_syntax_tokenizer_cache_t *
lxb_css_syntax_tokenizer_cache_create(void);
static lxb_status_t
lxb_css_syntax_tokenizer_cache_init(lxb_css_syntax_tokenizer_cache_t *cache,
size_t size);
static void
lxb_css_syntax_tokenizer_cache_clean(lxb_css_syntax_tokenizer_cache_t *cache);
static lxb_css_syntax_tokenizer_cache_t *
lxb_css_syntax_tokenizer_cache_destroy(lxb_css_syntax_tokenizer_cache_t *cache);
LXB_API lxb_status_t
lxb_css_syntax_tokenizer_cache_push(lxb_css_syntax_tokenizer_cache_t *cache,
lxb_css_syntax_token_t *value);
static lxb_status_t
lxb_css_syntax_tokenizer_blank(lxb_css_syntax_tokenizer_t *tkz,
const lxb_char_t **data, const lxb_char_t **end,
void *ctx);
static bool
lxb_css_syntax_tokenizer_lookup_important_ch(lxb_css_syntax_tokenizer_t *tkz,
const lxb_char_t *p,
const lxb_char_t *end,
const lxb_char_t stop_ch,
lxb_css_syntax_token_type_t stop,
bool skip_first);
const lxb_char_t stop_ch);
static bool
lxb_css_syntax_tokenizer_lookup_important_end(lxb_css_syntax_tokenizer_t *tkz,
const lxb_char_t *p,
const lxb_char_t *end,
const lxb_char_t stop_ch,
lxb_css_syntax_token_type_t stop,
bool skip_first);
static bool
lxb_css_syntax_tokenizer_lookup_important_tokens(lxb_css_syntax_tokenizer_t *tkz,
lxb_css_syntax_token_type_t stop,
bool skip_first);
const lxb_char_t stop_ch);
lxb_css_syntax_tokenizer_t *
lxb_css_syntax_tokenizer_create(void)
@@ -86,14 +56,6 @@ lxb_css_syntax_tokenizer_init(lxb_css_syntax_tokenizer_t *tkz)
return status;
}
/* Cache for Tokens. */
tkz->cache = lxb_css_syntax_tokenizer_cache_create();
status = lxb_css_syntax_tokenizer_cache_init(tkz->cache, 128);
if (status != LXB_STATUS_OK) {
return status;
}
/* Memory for text. */
tkz->mraw = lexbor_mraw_create();
@@ -119,15 +81,15 @@ lxb_css_syntax_tokenizer_init(lxb_css_syntax_tokenizer_t *tkz)
return status;
}
tkz->offset = 0;
tkz->cache_pos = 0;
tkz->prepared = 0;
tkz->first = NULL;
tkz->last = NULL;
tkz->offset = 0;
tkz->eof = false;
tkz->with_comment = false;
tkz->with_unicode_range = false;
tkz->status = LXB_STATUS_OK;
tkz->opt = LXB_CSS_SYNTAX_TOKENIZER_OPT_UNDEF;
tkz->chunk_cb = lxb_css_syntax_tokenizer_blank;
return LXB_STATUS_OK;
}
@@ -137,18 +99,16 @@ lxb_css_syntax_tokenizer_clean(lxb_css_syntax_tokenizer_t *tkz)
{
lexbor_mraw_clean(tkz->mraw);
lexbor_array_obj_clean(tkz->parse_errors);
lxb_css_syntax_tokenizer_cache_clean(tkz->cache);
lexbor_dobject_clean(tkz->tokens);
tkz->offset = 0;
tkz->cache_pos = 0;
tkz->prepared = 0;
tkz->eof = false;
tkz->status = LXB_STATUS_OK;
tkz->in_begin = NULL;
tkz->in_p = NULL;
tkz->in_end = NULL;
tkz->first = NULL;
tkz->last = NULL;
tkz->pos = tkz->start;
tkz->offset = 0;
tkz->status = LXB_STATUS_OK;
return LXB_STATUS_OK;
}
@@ -162,7 +122,6 @@ lxb_css_syntax_tokenizer_destroy(lxb_css_syntax_tokenizer_t *tkz)
if (tkz->tokens != NULL) {
tkz->tokens = lexbor_dobject_destroy(tkz->tokens, true);
tkz->cache = lxb_css_syntax_tokenizer_cache_destroy(tkz->cache);
}
tkz->mraw = lexbor_mraw_destroy(tkz->mraw, true);
@@ -175,105 +134,6 @@ lxb_css_syntax_tokenizer_destroy(lxb_css_syntax_tokenizer_t *tkz)
return lexbor_free(tkz);
}
static lxb_css_syntax_tokenizer_cache_t *
lxb_css_syntax_tokenizer_cache_create(void)
{
return lexbor_calloc(1, sizeof(lxb_css_syntax_tokenizer_cache_t));
}
static lxb_status_t
lxb_css_syntax_tokenizer_cache_init(lxb_css_syntax_tokenizer_cache_t *cache,
size_t size)
{
cache->length = 0;
cache->size = size;
cache->list = lexbor_malloc(sizeof(lxb_css_syntax_token_t *) * size);
if (cache->list == NULL) {
return LXB_STATUS_ERROR_MEMORY_ALLOCATION;
}
return LXB_STATUS_OK;
}
static void
lxb_css_syntax_tokenizer_cache_clean(lxb_css_syntax_tokenizer_cache_t *cache)
{
if (cache != NULL) {
cache->length = 0;
}
}
static lxb_css_syntax_tokenizer_cache_t *
lxb_css_syntax_tokenizer_cache_destroy(lxb_css_syntax_tokenizer_cache_t *cache)
{
if (cache == NULL) {
return NULL;
}
if (cache->list) {
lexbor_free(cache->list);
}
return lexbor_free(cache);
}
static lxb_css_syntax_token_t **
lxb_css_syntax_tokenizer_cache_expand(lxb_css_syntax_tokenizer_cache_t *cache,
size_t up_to)
{
size_t new_size;
lxb_css_syntax_token_t **list;
if (cache == NULL) {
return NULL;
}
new_size = cache->length + up_to;
list = lexbor_realloc(cache->list,
sizeof(lxb_css_syntax_token_t *) * new_size);
if (list == NULL) {
return NULL;
}
cache->list = list;
cache->size = new_size;
return list;
}
lxb_status_t
lxb_css_syntax_tokenizer_cache_push(lxb_css_syntax_tokenizer_cache_t *cache,
lxb_css_syntax_token_t *value)
{
if (cache->length >= cache->size) {
if ((lxb_css_syntax_tokenizer_cache_expand(cache, 128) == NULL)) {
return LXB_STATUS_ERROR_MEMORY_ALLOCATION;
}
}
cache->list[ cache->length ] = value;
cache->length++;
return LXB_STATUS_OK;
}
static lxb_status_t
lxb_css_syntax_tokenizer_blank(lxb_css_syntax_tokenizer_t *tkz,
const lxb_char_t **data, const lxb_char_t **end,
void *ctx)
{
return LXB_STATUS_OK;
}
lxb_status_t
lxb_css_syntax_tokenizer_chunk(lxb_css_syntax_tokenizer_t *tkz,
const lxb_char_t *data, size_t size)
{
return tkz->status;
}
lxb_css_syntax_token_t *
lxb_css_syntax_tokenizer_token(lxb_css_syntax_tokenizer_t *tkz)
{
@@ -281,159 +141,69 @@ lxb_css_syntax_tokenizer_token(lxb_css_syntax_tokenizer_t *tkz)
lxb_css_syntax_token_t *token;
const lxb_char_t *begin, *end;
begin = tkz->in_begin;
begin = tkz->in_p;
end = tkz->in_end;
if (tkz->prepared != 0) {
if (tkz->cache_pos < tkz->prepared) {
token = tkz->cache->list[tkz->prepared - 1];
status = lxb_css_syntax_token_string_make(tkz, token);
if (status != LXB_STATUS_OK) {
return NULL;
}
}
token = tkz->cache->list[tkz->prepared];
token->offset = tkz->offset;
tkz->prepared += 1;
if (tkz->prepared >= tkz->cache->length) {
tkz->prepared = 0;
}
if (lxb_css_syntax_token_base(token)->length != 0) {
tkz->offset += lxb_css_syntax_token_base(token)->length;
token->cloned = false;
return token;
}
if (begin >= end) {
status = lxb_css_syntax_tokenizer_next_chunk(tkz, &begin, &end);
if (status != LXB_STATUS_OK) {
return NULL;
}
if (begin >= end) {
lxb_css_syntax_token_base(token)->length = 1;
goto done;
}
}
if (lxb_css_syntax_token_delim(token)->character == '-') {
begin = lxb_css_syntax_state_minus_process(tkz, token, begin, end);
}
else {
begin = lxb_css_syntax_state_plus_process(tkz, token, begin, end);
}
goto done;
}
if (tkz->cache_pos < tkz->cache->length) {
token = tkz->cache->list[tkz->cache->length - 1];
status = lxb_css_syntax_token_string_make(tkz, token);
if (status != LXB_STATUS_OK) {
return NULL;
}
}
token = lxb_css_syntax_token_cached_create(tkz);
token = lexbor_dobject_calloc(tkz->tokens);
if (token == NULL) {
tkz->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION;
return NULL;
}
token->offset = tkz->offset;
if (tkz->first == NULL) {
tkz->first = token;
}
if (tkz->last != NULL) {
status = lxb_css_syntax_token_string_make(tkz, tkz->last);
if (status != LXB_STATUS_OK) {
return NULL;
}
tkz->last->next = token;
}
tkz->last = token;
again:
if (begin >= end) {
status = lxb_css_syntax_tokenizer_next_chunk(tkz, &begin, &end);
if (status != LXB_STATUS_OK) {
lxb_css_syntax_token_base(token)->begin = begin;
if (begin < end) {
begin = lxb_css_syntax_state_res_map[*begin](tkz, token, begin, end);
if (begin == NULL) {
return NULL;
}
if (begin >= end) {
token->type = LXB_CSS_SYNTAX_TOKEN__EOF;
lxb_css_syntax_token_base(token)->begin = begin;
lxb_css_syntax_token_base(token)->length = 0;
token->cloned = false;
return token;
}
}
else {
token->type = LXB_CSS_SYNTAX_TOKEN__EOF;
}
begin = lxb_css_syntax_state_res_map[*begin](tkz, token, begin, end);
done:
token->cloned = false;
if (begin == NULL) {
return NULL;
}
tkz->in_begin = begin;
token->offset = tkz->offset;
lxb_css_syntax_token_base(token)->length = begin - tkz->in_p;
tkz->offset += lxb_css_syntax_token_base(token)->length;
tkz->in_p = begin;
if (token->type == LXB_CSS_SYNTAX_TOKEN_COMMENT && !tkz->with_comment) {
end = tkz->in_end;
goto again;
}
return token;
}
lxb_status_t
lxb_css_syntax_tokenizer_next_chunk(lxb_css_syntax_tokenizer_t *tkz,
const lxb_char_t **data, const lxb_char_t **end)
{
const lxb_char_t *begin;
if (tkz->eof == false) {
begin = *data;
tkz->status = tkz->chunk_cb(tkz, data, end, tkz->chunk_ctx);
if (tkz->status != LXB_STATUS_OK) {
return tkz->status;
}
if (*data >= *end) {
*data = begin;
*end = begin;
tkz->in_begin = begin;
tkz->in_end = begin;
tkz->eof = true;
}
else {
tkz->in_begin = *data;
tkz->in_end = *end;
}
}
return LXB_STATUS_OK;
}
bool
lxb_css_syntax_tokenizer_lookup_colon(lxb_css_syntax_tokenizer_t *tkz)
{
const lxb_char_t *p, *end;
lxb_css_syntax_token_t *token;
if (tkz->cache_pos + 1 < tkz->cache->length) {
token = tkz->cache->list[tkz->cache_pos + 1];
if (tkz->first != NULL && tkz->first->next != NULL) {
token = tkz->first->next;
if (token->type == LXB_CSS_SYNTAX_TOKEN_WHITESPACE) {
if (tkz->cache_pos + 2 < tkz->cache->length) {
token = tkz->cache->list[tkz->cache_pos + 2];
return token->type == LXB_CSS_SYNTAX_TOKEN_COLON;
if (token->next != NULL) {
return token->next->type == LXB_CSS_SYNTAX_TOKEN_COLON;
}
}
else if (token->type == LXB_CSS_SYNTAX_TOKEN_COLON) {
@@ -443,26 +213,10 @@ lxb_css_syntax_tokenizer_lookup_colon(lxb_css_syntax_tokenizer_t *tkz)
return false;
}
p = tkz->in_begin;
p = tkz->in_p;
end = tkz->in_end;
do {
if (p >= end) {
token = lxb_css_syntax_token_next(tkz);
if (token == NULL) {
return false;
}
if (token->type == LXB_CSS_SYNTAX_TOKEN_WHITESPACE) {
token = lxb_css_syntax_token_next(tkz);
if (token == NULL) {
return false;
}
}
return token->type == LXB_CSS_SYNTAX_TOKEN_COLON;
}
while (p < end) {
switch (*p) {
case 0x3A:
return true;
@@ -472,14 +226,15 @@ lxb_css_syntax_tokenizer_lookup_colon(lxb_css_syntax_tokenizer_t *tkz)
case 0x09:
case 0x20:
case 0x0A:
p++;
p += 1;
break;
default:
return false;
}
}
while (true);
return false;
}
bool
@@ -492,13 +247,13 @@ lxb_css_syntax_tokenizer_lookup_important(lxb_css_syntax_tokenizer_t *tkz,
static const size_t length = sizeof(lxb_css_syntax_tokenizer_important) - 1;
p = tkz->in_begin;
p = tkz->in_p;
end = tkz->in_end;
if (tkz->cache_pos + 1 < tkz->cache->length) {
token = tkz->cache->list[tkz->cache_pos + 1];
if (tkz->first != NULL && tkz->first->next != NULL) {
token = tkz->first->next;
if (token->type == LXB_CSS_SYNTAX_TOKEN_IDENT) {
if (token->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
return false;
}
@@ -510,16 +265,16 @@ lxb_css_syntax_tokenizer_lookup_important(lxb_css_syntax_tokenizer_t *tkz,
return false;
}
if (tkz->cache_pos + 2 < tkz->cache->length) {
token = tkz->cache->list[tkz->cache_pos + 2];
if (token->next != NULL) {
token = token->next;
if (token->type == LXB_CSS_SYNTAX_TOKEN_WHITESPACE) {
if (tkz->cache_pos + 3 >= tkz->cache->length) {
if (token->next == NULL) {
return lxb_css_syntax_tokenizer_lookup_important_end(tkz,
p, end, stop_ch, stop, false);
p, end, stop_ch);
}
token = tkz->cache->list[tkz->cache_pos + 3];
token = token->next;
}
return (token->type == LXB_CSS_SYNTAX_TOKEN_SEMICOLON
@@ -528,55 +283,38 @@ lxb_css_syntax_tokenizer_lookup_important(lxb_css_syntax_tokenizer_t *tkz,
}
return lxb_css_syntax_tokenizer_lookup_important_end(tkz, p, end,
stop_ch, stop, false);
stop_ch);
}
return lxb_css_syntax_tokenizer_lookup_important_ch(tkz, p, end, stop_ch,
stop, false);
return lxb_css_syntax_tokenizer_lookup_important_ch(tkz, p, end, stop_ch);
}
static bool
lxb_css_syntax_tokenizer_lookup_important_ch(lxb_css_syntax_tokenizer_t *tkz,
const lxb_char_t *p,
const lxb_char_t *end,
const lxb_char_t stop_ch,
lxb_css_syntax_token_type_t stop,
bool skip_first)
const lxb_char_t stop_ch)
{
const lxb_char_t *imp;
static const size_t length = sizeof(lxb_css_syntax_tokenizer_important) - 1;
imp = lxb_css_syntax_tokenizer_important;
do {
if (p >= end) {
return lxb_css_syntax_tokenizer_lookup_important_tokens(tkz, stop,
skip_first);
}
if (lexbor_str_res_map_lowercase[*p++] != *imp++) {
return false;
}
if (!(end - p >= length
&& lexbor_str_data_ncasecmp(p, lxb_css_syntax_tokenizer_important,
length)))
{
return false;
}
while (*imp != 0x00);
return lxb_css_syntax_tokenizer_lookup_important_end(tkz, p, end, stop_ch,
stop, skip_first);
return lxb_css_syntax_tokenizer_lookup_important_end(tkz, p + length,
end, stop_ch);
}
static bool
lxb_css_syntax_tokenizer_lookup_important_end(lxb_css_syntax_tokenizer_t *tkz,
const lxb_char_t *p,
const lxb_char_t *end,
const lxb_char_t stop_ch,
lxb_css_syntax_token_type_t stop,
bool skip_first)
const lxb_char_t stop_ch)
{
do {
if (p >= end) {
return lxb_css_syntax_tokenizer_lookup_important_tokens(tkz, stop,
skip_first);
}
while (p < end) {
switch (*p) {
case 0x3B:
return true;
@@ -586,63 +324,16 @@ lxb_css_syntax_tokenizer_lookup_important_end(lxb_css_syntax_tokenizer_t *tkz,
case 0x09:
case 0x20:
case 0x0A:
p++;
p += 1;
break;
default:
return (stop_ch != 0x00 && stop_ch == *p);
}
}
while (true);
}
static bool
lxb_css_syntax_tokenizer_lookup_important_tokens(lxb_css_syntax_tokenizer_t *tkz,
lxb_css_syntax_token_type_t stop,
bool skip_first)
{
const lxb_css_syntax_token_t *next;
static const size_t length = sizeof(lxb_css_syntax_tokenizer_important) - 1;
if (skip_first) {
next = lxb_css_syntax_token_next(tkz);
if (next == NULL) {
return false;
}
}
next = lxb_css_syntax_token_next(tkz);
if (next == NULL) {
return false;
}
if (next->type != LXB_CSS_SYNTAX_TOKEN_IDENT) {
return false;
}
if (!(lxb_css_syntax_token_ident(next)->length == length
&& lexbor_str_data_ncasecmp(lxb_css_syntax_token_ident(next)->data,
lxb_css_syntax_tokenizer_important,
length)))
{
return false;
}
next = lxb_css_syntax_token_next(tkz);
if (next == NULL) {
return false;
}
if (next->type == LXB_CSS_SYNTAX_TOKEN_WHITESPACE) {
next = lxb_css_syntax_token_next(tkz);
if (next == NULL) {
return false;
}
}
return (next->type == LXB_CSS_SYNTAX_TOKEN_SEMICOLON
|| next->type == stop || next->type == LXB_CSS_SYNTAX_TOKEN__EOF);
/* EOF */
return true;
}
bool
@@ -653,8 +344,8 @@ lxb_css_syntax_tokenizer_lookup_declaration_ws_end(lxb_css_syntax_tokenizer_t *t
lxb_css_syntax_token_t *token;
const lxb_char_t *p, *end;
if (tkz->cache_pos + 1 < tkz->cache->length) {
token = tkz->cache->list[tkz->cache_pos + 1];
if (tkz->first != NULL && tkz->first->next) {
token = tkz->first->next;
switch (token->type) {
case LXB_CSS_SYNTAX_TOKEN_DELIM:
@@ -674,29 +365,25 @@ lxb_css_syntax_tokenizer_lookup_declaration_ws_end(lxb_css_syntax_tokenizer_t *t
}
}
p = tkz->in_begin;
p = tkz->in_p;
end = tkz->in_end;
do {
if (p >= end) {
return lxb_css_syntax_tokenizer_lookup_important_tokens(tkz, stop,
true);
}
while (p < end) {
switch (*p) {
case 0x3B:
return true;
case 0x21:
p++;
p += 1;
return lxb_css_syntax_tokenizer_lookup_important_ch(tkz, p, end,
stop_ch, stop, true);
stop_ch);
default:
return (stop_ch != 0x00 && stop_ch == *p);
}
}
while (true);
return false;
}
/*

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2020 Alexander Borisov
* Copyright (C) 2018-2025 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -23,54 +23,34 @@ typedef const lxb_char_t *
lxb_css_syntax_token_t *token,
const lxb_char_t *data, const lxb_char_t *end);
typedef lxb_status_t
(*lxb_css_syntax_tokenizer_chunk_f)(lxb_css_syntax_tokenizer_t *tkz,
const lxb_char_t **data,
const lxb_char_t **end, void *ctx);
enum lxb_css_syntax_tokenizer_opt {
LXB_CSS_SYNTAX_TOKENIZER_OPT_UNDEF = 0x00,
};
typedef struct {
lxb_css_syntax_token_t **list;
size_t size;
size_t length;
}
lxb_css_syntax_tokenizer_cache_t;
struct lxb_css_syntax_tokenizer {
lxb_css_syntax_tokenizer_cache_t *cache;
lexbor_dobject_t *tokens;
lexbor_array_obj_t *parse_errors;
lexbor_mraw_t *mraw;
lxb_css_syntax_token_t *first;
lxb_css_syntax_token_t *last;
const lxb_char_t *in_begin;
const lxb_char_t *in_end;
const lxb_char_t *begin;
uintptr_t offset;
size_t cache_pos;
size_t prepared;
lexbor_mraw_t *mraw;
lxb_css_syntax_tokenizer_chunk_f chunk_cb;
void *chunk_ctx;
const lxb_char_t *in_p;
/* Temp */
lxb_char_t *start;
lxb_char_t *pos;
const lxb_char_t *end;
lxb_char_t buffer[128];
lxb_css_syntax_token_data_t token_data;
size_t offset;
/* Process */
unsigned int opt; /* bitmap */
lxb_status_t status;
bool eof;
bool with_comment;
bool with_unicode_range;
};
@@ -112,23 +92,22 @@ lxb_css_syntax_tokenizer_status(lxb_css_syntax_tokenizer_t *tkz)
return tkz->status;
}
lxb_inline void
lxb_css_syntax_tokenizer_chunk_cb_set(lxb_css_syntax_tokenizer_t *tkz,
lxb_css_syntax_tokenizer_chunk_f cb,
void *ctx)
{
tkz->chunk_cb = cb;
tkz->chunk_ctx = ctx;
}
lxb_inline void
lxb_css_syntax_tokenizer_buffer_set(lxb_css_syntax_tokenizer_t *tkz,
const lxb_char_t *data, size_t size)
{
tkz->in_begin = data;
tkz->in_p = data;
tkz->in_end = data + size;
}
lxb_inline void
lxb_css_syntax_tokenizer_with_unicode_range(lxb_css_syntax_tokenizer_t *tkz,
bool with_range)
{
tkz->with_unicode_range = with_range;
}
/*
* No inline functions for ABI.

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2019 Alexander Borisov
* Copyright (C) 2018-2025 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -24,6 +24,8 @@ typedef enum {
LXB_CSS_SYNTAX_TOKENIZER_ERROR_EOINST,
/* eof-in-url */
LXB_CSS_SYNTAX_TOKENIZER_ERROR_EOINUR,
/* eof-in-escaped */
LXB_CSS_SYNTAX_TOKENIZER_ERROR_EOINES,
/* qo-in-url */
LXB_CSS_SYNTAX_TOKENIZER_ERROR_QOINUR,
/* wrong-escape-in-url */

View File

@@ -24,7 +24,7 @@ LXB_API const lxb_css_data_t *
lxb_css_unit_relative_by_name(const lxb_char_t *name, size_t length);
LXB_API const lxb_css_data_t *
lxb_css_unit_angel_by_name(const lxb_char_t *name, size_t length);
lxb_css_unit_angle_by_name(const lxb_char_t *name, size_t length);
LXB_API const lxb_css_data_t *
lxb_css_unit_frequency_by_name(const lxb_char_t *name, size_t length);

View File

@@ -58,14 +58,14 @@ typedef enum {
lxb_css_unit_relative_t;
typedef enum {
LXB_CSS_UNIT_ANGEL__BEGIN = 0x0016,
LXB_CSS_UNIT_ANGLE__BEGIN = 0x0016,
LXB_CSS_UNIT_DEG = 0x0016,
LXB_CSS_UNIT_GRAD = 0x0017,
LXB_CSS_UNIT_RAD = 0x0018,
LXB_CSS_UNIT_TURN = 0x0019,
LXB_CSS_UNIT_ANGEL__LAST_ENTRY = 0x001a
LXB_CSS_UNIT_ANGLE__LAST_ENTRY = 0x001a
}
lxb_css_unit_angel_t;
lxb_css_unit_angle_t;
typedef enum {
LXB_CSS_UNIT_FREQUENCY__BEGIN = 0x001a,

View File

@@ -246,7 +246,7 @@ static const lexbor_shs_entry_t lxb_css_unit_relative_shs[64] =
{NULL, NULL, 0, 0}
};
static const lexbor_shs_entry_t lxb_css_unit_angel_shs[7] =
static const lexbor_shs_entry_t lxb_css_unit_angle_shs[7] =
{
{NULL, NULL, 6, 0},
{"turn", (void *) &lxb_css_unit_data[LXB_CSS_UNIT_TURN], 4, 0},

View File

@@ -109,7 +109,7 @@ lxb_css_value_length_percentage_type_t;
typedef struct {
double num;
bool is_float;
lxb_css_unit_angel_t unit;
lxb_css_unit_angle_t unit;
}
lxb_css_value_angle_t;

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019-2023 Alexander Borisov
* Copyright (C) 2019-2024 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -16,7 +16,7 @@ extern "C" {
#define LXB_DOM_VERSION_MAJOR 1
#define LXB_DOM_VERSION_MINOR 7
#define LXB_DOM_VERSION_MINOR 8
#define LXB_DOM_VERSION_PATCH 0
#define LXB_DOM_VERSION_STRING \

View File

@@ -68,19 +68,6 @@ typedef lxb_dom_interface_t *
typedef lxb_dom_interface_t *
(*lxb_dom_interface_destroy_f)(lxb_dom_interface_t *intrfc);
typedef lxb_status_t
(*lxb_dom_event_insert_f)(lxb_dom_node_t *node);
typedef lxb_status_t
(*lxb_dom_event_remove_f)(lxb_dom_node_t *node);
typedef lxb_status_t
(*lxb_dom_event_destroy_f)(lxb_dom_node_t *node);
typedef lxb_status_t
(*lxb_dom_event_set_value_f)(lxb_dom_node_t *node,
const lxb_char_t *value, size_t length);
LXB_API lxb_dom_interface_t *
lxb_dom_interface_create(lxb_dom_document_t *document, lxb_tag_id_t tag_id,

View File

@@ -213,9 +213,9 @@ lxb_dom_attr_set_value(lxb_dom_attr_t *attr,
lxb_status_t status;
lxb_dom_document_t *doc = lxb_dom_interface_node(attr)->owner_document;
if (doc->ev_set_value != NULL) {
status = doc->ev_set_value(lxb_dom_interface_node(attr),
value, value_len);
if (doc->node_cb->set_value != NULL) {
status = doc->node_cb->set_value(lxb_dom_interface_node(attr),
value, value_len);
if (status != LXB_STATUS_OK) {
return status;
}
@@ -285,9 +285,17 @@ lxb_status_t
lxb_dom_attr_clone_name_value(lxb_dom_attr_t *attr_from,
lxb_dom_attr_t *attr_to)
{
lexbor_str_t *value;
attr_to->node.local_name = attr_from->node.local_name;
attr_to->qualified_name = attr_from->qualified_name;
value = attr_from->value;
if (value != NULL && value->data != NULL) {
return lxb_dom_attr_set_value(attr_to, value->data, value->length);
}
return LXB_STATUS_OK;
}
@@ -324,8 +332,8 @@ lxb_dom_attr_remove(lxb_dom_attr_t *attr)
lxb_dom_element_t *element = attr->owner;
lxb_dom_document_t *doc = lxb_dom_interface_node(attr)->owner_document;
if (doc->ev_remove != NULL) {
doc->ev_remove(lxb_dom_interface_node(attr));
if (doc->node_cb->remove != NULL) {
doc->node_cb->remove(lxb_dom_interface_node(attr));
}
if (element->attr_id == attr) {

View File

@@ -14,6 +14,12 @@
#include "lexbor/dom/interfaces/processing_instruction.h"
static const lxb_dom_document_node_cb_t lxb_dom_document_node_cbs =
{
.insert = NULL, .remove = NULL, .destroy = NULL, .set_value = NULL
};
lxb_dom_document_t *
lxb_dom_document_interface_create(lxb_dom_document_t *document)
{
@@ -87,9 +93,7 @@ lxb_dom_document_init(lxb_dom_document_t *document, lxb_dom_document_t *owner,
document->clone_interface = clone_interface;
document->destroy_interface = destroy_interface;
document->ev_insert = NULL;
document->ev_remove = NULL;
document->ev_destroy = NULL;
document->node_cb = &lxb_dom_document_node_cbs;
node = lxb_dom_interface_node(document);
@@ -108,6 +112,7 @@ lxb_dom_document_init(lxb_dom_document_t *document, lxb_dom_document_t *owner,
document->user = owner->user;
document->scripting = owner->scripting;
document->compat_mode = owner->compat_mode;
document->css = owner->css;
document->tags_inherited = true;
document->ns_inherited = true;
@@ -117,6 +122,8 @@ lxb_dom_document_init(lxb_dom_document_t *document, lxb_dom_document_t *owner,
return LXB_STATUS_OK;
}
document->css = NULL;
/* For nodes */
document->mraw = lexbor_mraw_create();
status = lexbor_mraw_init(document->mraw, (4096 * 8));
@@ -476,6 +483,12 @@ lxb_dom_document_import_node(lxb_dom_document_t *doc, lxb_dom_node_t *node,
return new;
}
void
lxb_dom_document_set_default_node_cb(lxb_dom_document_t *document)
{
document->node_cb = &lxb_dom_document_node_cbs;
}
/*
* No inline functions for ABI.

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2021 Alexander Borisov
* Copyright (C) 2018-2025 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -32,37 +32,46 @@ typedef enum {
}
lxb_dom_document_dtype_t;
typedef struct lxb_dom_document_css lxb_dom_document_css_t;
typedef struct {
lxb_dom_node_cb_insert_f insert;
lxb_dom_node_cb_remove_f remove;
lxb_dom_node_cb_destroy_f destroy;
lxb_dom_node_cb_set_value_f set_value;
}
lxb_dom_document_node_cb_t;
struct lxb_dom_document {
lxb_dom_node_t node;
lxb_dom_node_t node;
lxb_dom_document_cmode_t compat_mode;
lxb_dom_document_dtype_t type;
lxb_dom_document_cmode_t compat_mode;
lxb_dom_document_dtype_t type;
lxb_dom_document_type_t *doctype;
lxb_dom_element_t *element;
lxb_dom_document_type_t *doctype;
lxb_dom_element_t *element;
lxb_dom_interface_create_f create_interface;
lxb_dom_interface_clone_f clone_interface;
lxb_dom_interface_destroy_f destroy_interface;
lxb_dom_interface_create_f create_interface;
lxb_dom_interface_clone_f clone_interface;
lxb_dom_interface_destroy_f destroy_interface;
lxb_dom_event_insert_f ev_insert;
lxb_dom_event_remove_f ev_remove;
lxb_dom_event_destroy_f ev_destroy;
lxb_dom_event_set_value_f ev_set_value;
const lxb_dom_document_node_cb_t *node_cb;
lexbor_mraw_t *mraw;
lexbor_mraw_t *text;
lexbor_hash_t *tags;
lexbor_hash_t *attrs;
lexbor_hash_t *prefix;
lexbor_hash_t *ns;
void *parser;
void *user;
lexbor_mraw_t *mraw;
lexbor_mraw_t *text;
lexbor_hash_t *tags;
lexbor_hash_t *attrs;
lexbor_hash_t *prefix;
lexbor_hash_t *ns;
void *parser;
void *user;
bool tags_inherited;
bool ns_inherited;
lxb_dom_document_css_t *css;
bool scripting;
bool tags_inherited;
bool ns_inherited;
bool scripting;
};
@@ -76,9 +85,35 @@ lxb_dom_document_interface_clone(lxb_dom_document_t *document,
LXB_API lxb_dom_document_t *
lxb_dom_document_interface_destroy(lxb_dom_document_t *document);
/*
* Creating a document.
*
* The function creates and returns a zeroed document.
* If another document is passed as an argument, its memory pool will be used
* to conscious the new one.
*
* @param[in] lxb_dom_document_t *. Owner document, can be NULL.
*
* @return lxb_dom_document_t *. if successful, otherwise returns a NULL value.
*/
LXB_API lxb_dom_document_t *
lxb_dom_document_create(lxb_dom_document_t *owner);
/*
* Document Initialization.
*
* The function expects the document to be zeroed.
*
* @param[in] lxb_dom_document_t *. If NULL, LXB_STATUS_ERROR_OBJECT_IS_NULL is returned.
* @param[in] lxb_dom_document_t *. Owner document, can be NULL.
* @param[in] lxb_dom_interface_create_f. Required. Callback for creating interfaces.
* @param[in] lxb_dom_interface_clone_f. Required. Callback for cloning interfaces.
* @param[in] lxb_dom_interface_destroy_f. Required. Callback for destroying interfaces.
* @param[in] lxb_dom_document_dtype_t. Document Type. Currently HTML or XML.
* @param[in] unsigned int. Document Namespace. See lexbor/ns.
*
* @return LXB_STATUS_OK if successful, otherwise an error status value.
*/
LXB_API lxb_status_t
lxb_dom_document_init(lxb_dom_document_t *document, lxb_dom_document_t *owner,
lxb_dom_interface_create_f create_interface,
@@ -135,6 +170,10 @@ LXB_API lxb_dom_node_t *
lxb_dom_document_import_node(lxb_dom_document_t *doc, lxb_dom_node_t *node,
bool deep);
LXB_API void
lxb_dom_document_set_default_node_cb(lxb_dom_document_t *document);
/*
* Inline functions
*/

View File

@@ -16,7 +16,6 @@ extern "C" {
#include "lexbor/dom/interfaces/document.h"
#include "lexbor/dom/interfaces/node.h"
#include "lexbor/dom/interfaces/attr.h"
#include "lexbor/dom/interfaces/document_type.h"
struct lxb_dom_document_type {

View File

@@ -385,8 +385,8 @@ done:
attr->owner = element;
if (doc->ev_insert != NULL) {
doc->ev_insert(lxb_dom_interface_node(attr));
if (doc->node_cb->insert != NULL) {
doc->node_cb->insert(lxb_dom_interface_node(attr));
}
return LXB_STATUS_OK;

View File

@@ -12,6 +12,7 @@ extern "C" {
#endif
#include "lexbor/core/str.h"
#include "lexbor/core/avl.h"
#include "lexbor/dom/interfaces/document.h"
#include "lexbor/dom/interfaces/node.h"
@@ -48,6 +49,9 @@ struct lxb_dom_element {
lxb_dom_attr_t *attr_id;
lxb_dom_attr_t *attr_class;
lexbor_avl_node_t *style;
void *list; /* lxb_css_rule_declaration_list_t */
lxb_dom_element_custom_state_t custom_state;
};
@@ -277,6 +281,11 @@ lxb_dom_element_ns_id(lxb_dom_element_t *element)
return lxb_dom_interface_node(element)->ns;
}
lxb_inline lxb_dom_document_t *
lxb_dom_element_document(const lxb_dom_element_t *element)
{
return lxb_dom_interface_node(element)->owner_document;
}
/*
* No inline functions for ABI.

View File

@@ -125,11 +125,11 @@ lxb_dom_node_interface_destroy(lxb_dom_node_t *node)
{
lxb_dom_document_t *doc = node->owner_document;
if (doc->ev_destroy != NULL) {
doc->ev_destroy(node);
if (doc->node_cb->destroy != NULL) {
doc->node_cb->destroy(node);
}
return lexbor_mraw_free(node->owner_document->mraw, node);
return lexbor_mraw_free(doc->mraw, node);
}
lxb_status_t
@@ -381,8 +381,8 @@ lxb_dom_node_insert_child(lxb_dom_node_t *to, lxb_dom_node_t *node)
{
lxb_dom_node_insert_child_wo_events(to, node);
if (node->owner_document->ev_insert != NULL) {
node->owner_document->ev_insert(node);
if (node->owner_document->node_cb->insert != NULL) {
node->owner_document->node_cb->insert(node);
}
}
@@ -410,8 +410,8 @@ lxb_dom_node_insert_before(lxb_dom_node_t *to, lxb_dom_node_t *node)
{
lxb_dom_node_insert_before_wo_events(to, node);
if (node->owner_document->ev_insert != NULL) {
node->owner_document->ev_insert(node);
if (node->owner_document->node_cb->insert != NULL) {
node->owner_document->node_cb->insert(node);
}
}
@@ -438,8 +438,8 @@ lxb_dom_node_insert_after(lxb_dom_node_t *to, lxb_dom_node_t *node)
{
lxb_dom_node_insert_after_wo_events(to, node);
if (node->owner_document->ev_insert != NULL) {
node->owner_document->ev_insert(node);
if (node->owner_document->node_cb->insert != NULL) {
node->owner_document->node_cb->insert(node);
}
}
@@ -472,8 +472,8 @@ lxb_dom_node_remove_wo_events(lxb_dom_node_t *node)
void
lxb_dom_node_remove(lxb_dom_node_t *node)
{
if (node->owner_document->ev_remove != NULL) {
node->owner_document->ev_remove(node);
if (node->owner_document->node_cb->remove != NULL) {
node->owner_document->node_cb->remove(node);
}
lxb_dom_node_remove_wo_events(node);

View File

@@ -19,6 +19,31 @@ extern "C" {
typedef lexbor_action_t
(*lxb_dom_node_simple_walker_f)(lxb_dom_node_t *node, void *ctx);
/*
* Callbacks for node events.
*/
/*
* insert, remove, destroy:
* Can be called for any node. When inserting an element, attribute,
* comment and so on.
*
* set_value:
* Can be called only when the attribute value is changed.
*/
typedef lxb_status_t
(*lxb_dom_node_cb_insert_f)(lxb_dom_node_t *node);
typedef lxb_status_t
(*lxb_dom_node_cb_remove_f)(lxb_dom_node_t *node);
typedef lxb_status_t
(*lxb_dom_node_cb_destroy_f)(lxb_dom_node_t *node);
typedef lxb_status_t
(*lxb_dom_node_cb_set_value_f)(lxb_dom_node_t *node,
const lxb_char_t *value, size_t length);
typedef enum {
LXB_DOM_NODE_TYPE_UNDEF = 0x00,

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 Alexander Borisov
* Copyright (C) 2019-2024 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -16,8 +16,8 @@ extern "C" {
#define LXB_ENCODING_VERSION_MAJOR 2
#define LXB_ENCODING_VERSION_MINOR 0
#define LXB_ENCODING_VERSION_PATCH 1
#define LXB_ENCODING_VERSION_MINOR 2
#define LXB_ENCODING_VERSION_PATCH 0
#define LXB_ENCODING_VERSION_STRING \
LEXBOR_STRINGIZE(LXB_ENCODING_VERSION_MAJOR) "." \

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 Alexander Borisov
* Copyright (C) 2019-2024 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -356,7 +356,7 @@ lxb_encoding_decode_big5(lxb_encoding_decode_t *ctx,
continue;
}
ctx->codepoint = lxb_encoding_multi_index_big5[index].codepoint;
ctx->codepoint = lxb_encoding_multi_big5_map[index];
if (ctx->codepoint == LXB_ENCODING_ERROR_CODEPOINT) {
LXB_ENCODING_DECODE_FAILED(ctx->u.lead);
continue;
@@ -479,24 +479,24 @@ lxb_encoding_decode_euc_jp(lxb_encoding_decode_t *ctx,
ctx->codepoint = (lead - 0xA1) * 94 + byte - 0xA1;
if (is_jis0212) {
if ((sizeof(lxb_encoding_multi_index_jis0212)
/ sizeof(lxb_encoding_multi_index_t)) <= ctx->codepoint)
if ((sizeof(lxb_encoding_multi_jis0212_map)
/ sizeof(lxb_codepoint_t)) <= ctx->codepoint)
{
LXB_ENCODING_DECODE_FAILED(ctx->u.euc_jp.lead);
continue;
}
ctx->codepoint = lxb_encoding_multi_index_jis0212[ctx->codepoint].codepoint;
ctx->codepoint = lxb_encoding_multi_jis0212_map[ctx->codepoint];
}
else {
if ((sizeof(lxb_encoding_multi_index_jis0208)
/ sizeof(lxb_encoding_multi_index_t)) <= ctx->codepoint)
if ((sizeof(lxb_encoding_multi_jis0208_map)
/ sizeof(lxb_codepoint_t)) <= ctx->codepoint)
{
LXB_ENCODING_DECODE_FAILED(ctx->u.euc_jp.lead);
continue;
}
ctx->codepoint = lxb_encoding_multi_index_jis0208[ctx->codepoint].codepoint;
ctx->codepoint = lxb_encoding_multi_jis0208_map[ctx->codepoint];
}
if (ctx->codepoint == LXB_ENCODING_ERROR_CODEPOINT) {
@@ -582,14 +582,14 @@ lxb_encoding_decode_euc_kr(lxb_encoding_decode_t *ctx,
/* Max index == (0xFE - 0x81) * 190 + (0xFE - 0x41) == 23939 */
ctx->codepoint = (lead - 0x81) * 190 + (byte - 0x41);
if (ctx->codepoint >= sizeof(lxb_encoding_multi_index_euc_kr)
/ sizeof(lxb_encoding_multi_index_t))
if (ctx->codepoint >= sizeof(lxb_encoding_multi_euc_kr_map)
/ sizeof(lxb_codepoint_t))
{
LXB_ENCODING_DECODE_FAILED(ctx->u.lead);
continue;
}
ctx->codepoint = lxb_encoding_multi_index_euc_kr[ctx->codepoint].codepoint;
ctx->codepoint = lxb_encoding_multi_euc_kr_map[ctx->codepoint];
if (ctx->codepoint == LXB_ENCODING_ERROR_CODEPOINT) {
LXB_ENCODING_DECODE_FAILED(ctx->u.lead);
continue;
@@ -837,7 +837,7 @@ lxb_encoding_decode_iso_2022_jp(lxb_encoding_decode_t *ctx,
/* Max index == (0x7E - 0x21) * 94 + 0x7E - 0x21 == 8835 */
ctx->codepoint = (iso->lead - 0x21) * 94 + byte - 0x21;
ctx->codepoint = lxb_encoding_multi_index_jis0208[ctx->codepoint].codepoint;
ctx->codepoint = lxb_encoding_multi_jis0208_map[ctx->codepoint];
if (ctx->codepoint != LXB_ENCODING_ERROR_CODEPOINT) {
LXB_ENCODING_DECODE_APPEND_WO_CHECK(ctx, ctx->codepoint);
@@ -1176,8 +1176,8 @@ lxb_encoding_decode_shift_jis(lxb_encoding_decode_t *ctx,
ctx->codepoint = (lead - ctx->second_codepoint) * 188
+ byte - ctx->codepoint;
if (ctx->codepoint >= (sizeof(lxb_encoding_multi_index_jis0208)
/ sizeof(lxb_encoding_multi_index_t)))
if (ctx->codepoint >= (sizeof(lxb_encoding_multi_jis0208_map)
/ sizeof(lxb_codepoint_t)))
{
LXB_ENCODING_DECODE_FAILED(ctx->u.lead);
continue;
@@ -1188,7 +1188,7 @@ lxb_encoding_decode_shift_jis(lxb_encoding_decode_t *ctx,
continue;
}
ctx->codepoint = lxb_encoding_multi_index_jis0208[ctx->codepoint].codepoint;
ctx->codepoint = lxb_encoding_multi_jis0208_map[ctx->codepoint];
if (ctx->codepoint == LXB_ENCODING_ERROR_CODEPOINT) {
LXB_ENCODING_DECODE_FAILED(ctx->u.lead);
continue;
@@ -1680,7 +1680,7 @@ lxb_encoding_decode_gb18030(lxb_encoding_decode_t *ctx,
}
/* Max pointer value == (0xFE - 0x81) * 190 + (0xFE - 0x41) == 23939 */
ctx->codepoint = lxb_encoding_multi_index_gb18030[pointer].codepoint;
ctx->codepoint = lxb_encoding_multi_gb18030_map[pointer];
if (ctx->codepoint == LXB_ENCODING_ERROR_CODEPOINT) {
if (second < 0x80) {
(*data)--;
@@ -2040,7 +2040,7 @@ lead_state:
goto failed;
}
ctx->codepoint = lxb_encoding_multi_index_big5[index].codepoint;
ctx->codepoint = lxb_encoding_multi_big5_map[index];
if (ctx->codepoint == LXB_ENCODING_ERROR_CODEPOINT) {
goto failed;
}
@@ -2133,22 +2133,22 @@ lead_jis_state:
ctx->codepoint = (lead - 0xA1) * 94 + byte - 0xA1;
if (is_jis0212) {
if ((sizeof(lxb_encoding_multi_index_jis0212)
/ sizeof(lxb_encoding_multi_index_t)) <= ctx->codepoint)
if ((sizeof(lxb_encoding_multi_jis0212_map)
/ sizeof(lxb_codepoint_t)) <= ctx->codepoint)
{
goto failed;
}
ctx->codepoint = lxb_encoding_multi_index_jis0212[ctx->codepoint].codepoint;
ctx->codepoint = lxb_encoding_multi_jis0212_map[ctx->codepoint];
}
else {
if ((sizeof(lxb_encoding_multi_index_jis0208)
/ sizeof(lxb_encoding_multi_index_t)) <= ctx->codepoint)
if ((sizeof(lxb_encoding_multi_jis0208_map)
/ sizeof(lxb_codepoint_t)) <= ctx->codepoint)
{
goto failed;
}
ctx->codepoint = lxb_encoding_multi_index_jis0208[ctx->codepoint].codepoint;
ctx->codepoint = lxb_encoding_multi_jis0208_map[ctx->codepoint];
}
if (ctx->codepoint == LXB_ENCODING_ERROR_CODEPOINT) {
@@ -2205,13 +2205,13 @@ lead_state:
/* Max index == (0xFE - 0x81) * 190 + (0xFE - 0x41) == 23939 */
ctx->codepoint = (lead - 0x81) * 190 + (byte - 0x41);
if (ctx->codepoint >= sizeof(lxb_encoding_multi_index_euc_kr)
/ sizeof(lxb_encoding_multi_index_t))
if (ctx->codepoint >= sizeof(lxb_encoding_multi_euc_kr_map)
/ sizeof(lxb_codepoint_t))
{
goto failed;
}
ctx->codepoint = lxb_encoding_multi_index_euc_kr[ctx->codepoint].codepoint;
ctx->codepoint = lxb_encoding_multi_euc_kr_map[ctx->codepoint];
if (ctx->codepoint == LXB_ENCODING_ERROR_CODEPOINT) {
goto failed;
}
@@ -2373,7 +2373,7 @@ lxb_encoding_decode_iso_2022_jp_single(lxb_encoding_decode_t *ctx,
/* Max index == (0x7E - 0x21) * 94 + 0x7E - 0x21 == 8835 */
ctx->codepoint = (iso->lead - 0x21) * 94 + byte - 0x21;
return lxb_encoding_multi_index_jis0208[ctx->codepoint].codepoint;
return lxb_encoding_multi_jis0208_map[ctx->codepoint];
}
return LXB_ENCODING_DECODE_ERROR;
@@ -2667,8 +2667,8 @@ lead_state:
ctx->codepoint = (lead - ctx->second_codepoint) * 188
+ byte - ctx->codepoint;
if (ctx->codepoint >= (sizeof(lxb_encoding_multi_index_jis0208)
/ sizeof(lxb_encoding_multi_index_t)))
if (ctx->codepoint >= (sizeof(lxb_encoding_multi_jis0208_map)
/ sizeof(lxb_codepoint_t)))
{
goto failed;
}
@@ -2677,7 +2677,7 @@ lead_state:
return 0xE000 - 8836 + ctx->codepoint;
}
ctx->codepoint = lxb_encoding_multi_index_jis0208[ctx->codepoint].codepoint;
ctx->codepoint = lxb_encoding_multi_jis0208_map[ctx->codepoint];
if (ctx->codepoint == LXB_ENCODING_ERROR_CODEPOINT) {
goto failed;
}
@@ -3135,7 +3135,7 @@ first_state:
}
/* Max pointer value == (0xFE - 0x81) * 190 + (0xFE - 0x41) == 23939 */
ctx->codepoint = lxb_encoding_multi_index_gb18030[pointer].codepoint;
ctx->codepoint = lxb_encoding_multi_gb18030_map[pointer];
if (ctx->codepoint == LXB_ENCODING_ERROR_CODEPOINT) {
goto failed;
}

View File

@@ -138,8 +138,8 @@ lxb_status_t
lxb_encoding_encode_big5(lxb_encoding_encode_t *ctx, const lxb_codepoint_t **cps,
const lxb_codepoint_t *end)
{
uint16_t index;
lxb_codepoint_t cp;
const lexbor_shs_hash_t *hash;
for (; *cps < end; (*cps)++) {
cp = **cps;
@@ -149,9 +149,8 @@ lxb_encoding_encode_big5(lxb_encoding_encode_t *ctx, const lxb_codepoint_t **cps
continue;
}
hash = lexbor_shs_hash_get_static(lxb_encoding_multi_hash_big5,
LXB_ENCODING_MULTI_HASH_BIG5_SIZE, cp);
if (hash == NULL) {
index = lxb_encoding_multi_big5_index(cp);
if (index == UINT16_MAX) {
LXB_ENCODING_ENCODE_ERROR(ctx);
continue;
}
@@ -160,13 +159,13 @@ lxb_encoding_encode_big5(lxb_encoding_encode_t *ctx, const lxb_codepoint_t **cps
return LXB_STATUS_SMALL_BUFFER;
}
ctx->buffer_out[ ctx->buffer_used++ ] = ((uint32_t) (uintptr_t) hash->value) / 157 + 0x81;
ctx->buffer_out[ ctx->buffer_used++ ] = index / 157 + 0x81;
if ((((uint32_t) (uintptr_t) hash->value) % 157) < 0x3F) {
ctx->buffer_out[ ctx->buffer_used++ ] = (((uint32_t) (uintptr_t) hash->value) % 157) + 0x40;
if ((index % 157) < 0x3F) {
ctx->buffer_out[ ctx->buffer_used++ ] = (index % 157) + 0x40;
}
else {
ctx->buffer_out[ ctx->buffer_used++ ] = (((uint32_t) (uintptr_t) hash->value) % 157) + 0x62;
ctx->buffer_out[ ctx->buffer_used++ ] = (index % 157) + 0x62;
}
}
@@ -177,8 +176,8 @@ lxb_status_t
lxb_encoding_encode_euc_jp(lxb_encoding_encode_t *ctx, const lxb_codepoint_t **cps,
const lxb_codepoint_t *end)
{
uint16_t index;
lxb_codepoint_t cp;
const lexbor_shs_hash_t *hash;
for (; *cps < end; (*cps)++) {
cp = **cps;
@@ -213,9 +212,8 @@ lxb_encoding_encode_euc_jp(lxb_encoding_encode_t *ctx, const lxb_codepoint_t **c
cp = 0xFF0D;
}
hash = lexbor_shs_hash_get_static(lxb_encoding_multi_hash_jis0208,
LXB_ENCODING_MULTI_HASH_JIS0208_SIZE, cp);
if (hash == NULL) {
index = lxb_encoding_multi_jis0208_index(cp);
if (index == UINT16_MAX) {
LXB_ENCODING_ENCODE_ERROR(ctx);
continue;
}
@@ -224,8 +222,8 @@ lxb_encoding_encode_euc_jp(lxb_encoding_encode_t *ctx, const lxb_codepoint_t **c
return LXB_STATUS_SMALL_BUFFER;
}
ctx->buffer_out[ ctx->buffer_used++ ] = (uint32_t) (uintptr_t) hash->value / 94 + 0xA1;
ctx->buffer_out[ ctx->buffer_used++ ] = (uint32_t) (uintptr_t) hash->value % 94 + 0xA1;
ctx->buffer_out[ ctx->buffer_used++ ] = index / 94 + 0xA1;
ctx->buffer_out[ ctx->buffer_used++ ] = index % 94 + 0xA1;
}
return LXB_STATUS_OK;
@@ -235,8 +233,8 @@ lxb_status_t
lxb_encoding_encode_euc_kr(lxb_encoding_encode_t *ctx, const lxb_codepoint_t **cps,
const lxb_codepoint_t *end)
{
uint16_t index;
lxb_codepoint_t cp;
const lexbor_shs_hash_t *hash;
for (; *cps < end; (*cps)++) {
cp = **cps;
@@ -246,9 +244,8 @@ lxb_encoding_encode_euc_kr(lxb_encoding_encode_t *ctx, const lxb_codepoint_t **c
continue;
}
hash = lexbor_shs_hash_get_static(lxb_encoding_multi_hash_euc_kr,
LXB_ENCODING_MULTI_HASH_EUC_KR_SIZE, cp);
if (hash == NULL) {
index = lxb_encoding_multi_euc_kr_index(cp);
if (index == UINT16_MAX) {
LXB_ENCODING_ENCODE_ERROR(ctx);
continue;
}
@@ -257,8 +254,8 @@ lxb_encoding_encode_euc_kr(lxb_encoding_encode_t *ctx, const lxb_codepoint_t **c
return LXB_STATUS_SMALL_BUFFER;
}
ctx->buffer_out[ ctx->buffer_used++ ] = (uint32_t) (uintptr_t) hash->value / 190 + 0x81;
ctx->buffer_out[ ctx->buffer_used++ ] = (uint32_t) (uintptr_t) hash->value % 190 + 0x41;
ctx->buffer_out[ ctx->buffer_used++ ] = index / 190 + 0x81;
ctx->buffer_out[ ctx->buffer_used++ ] = index % 190 + 0x41;
}
return LXB_STATUS_OK;
@@ -268,8 +265,8 @@ lxb_status_t
lxb_encoding_encode_gbk(lxb_encoding_encode_t *ctx, const lxb_codepoint_t **cps,
const lxb_codepoint_t *end)
{
uint16_t index;
lxb_codepoint_t cp;
const lexbor_shs_hash_t *hash;
for (; *cps < end; (*cps)++) {
cp = **cps;
@@ -289,9 +286,8 @@ lxb_encoding_encode_gbk(lxb_encoding_encode_t *ctx, const lxb_codepoint_t **cps,
continue;
}
hash = lexbor_shs_hash_get_static(lxb_encoding_multi_hash_gb18030,
LXB_ENCODING_MULTI_HASH_GB18030_SIZE, cp);
if (hash == NULL) {
index = lxb_encoding_multi_gb18030_index(cp);
if (index == UINT16_MAX) {
LXB_ENCODING_ENCODE_ERROR(ctx);
continue;
}
@@ -300,13 +296,13 @@ lxb_encoding_encode_gbk(lxb_encoding_encode_t *ctx, const lxb_codepoint_t **cps,
return LXB_STATUS_SMALL_BUFFER;
}
ctx->buffer_out[ ctx->buffer_used++ ] = (lxb_char_t) (uintptr_t) hash->value / 190 + 0x81;
ctx->buffer_out[ ctx->buffer_used++ ] = index / 190 + 0x81;
if (((lxb_char_t) (uintptr_t) hash->value % 190) < 0x3F) {
ctx->buffer_out[ ctx->buffer_used++ ] = ((lxb_char_t) (uintptr_t) hash->value % 190) + 0x40;
if ((index % 190) < 0x3F) {
ctx->buffer_out[ ctx->buffer_used++ ] = (index % 190) + 0x40;
}
else {
ctx->buffer_out[ ctx->buffer_used++ ] = ((lxb_char_t) (uintptr_t) hash->value % 190) + 0x41;
ctx->buffer_out[ ctx->buffer_used++ ] = (index % 190) + 0x41;
}
}
@@ -327,9 +323,9 @@ lxb_encoding_encode_iso_2022_jp(lxb_encoding_encode_t *ctx, const lxb_codepoint_
const lxb_codepoint_t *end)
{
int8_t size;
uint16_t index;
unsigned state;
lxb_codepoint_t cp;
const lexbor_shs_hash_t *hash;
size = 0;
state = ctx->state;
@@ -470,12 +466,11 @@ lxb_encoding_encode_iso_2022_jp(lxb_encoding_encode_t *ctx, const lxb_codepoint_
}
if ((unsigned) (cp - 0xFF61) <= (0xFF9F - 0xFF61)) {
cp = lxb_encoding_multi_index_iso_2022_jp_katakana[cp - 0xFF61].codepoint;
cp = lxb_encoding_multi_iso_2022_jp_katakana_map[cp - 0xFF61];
}
hash = lexbor_shs_hash_get_static(lxb_encoding_multi_hash_jis0208,
LXB_ENCODING_MULTI_HASH_JIS0208_SIZE, cp);
if (hash == NULL) {
index = lxb_encoding_multi_jis0208_index(cp);
if (index == UINT16_MAX) {
goto failed;
}
@@ -493,8 +488,8 @@ lxb_encoding_encode_iso_2022_jp(lxb_encoding_encode_t *ctx, const lxb_codepoint_
goto begin;
}
ctx->buffer_out[ ctx->buffer_used++ ] = (uint32_t) (uintptr_t) hash->value / 94 + 0x21;
ctx->buffer_out[ ctx->buffer_used++ ] = (uint32_t) (uintptr_t) hash->value % 94 + 0x21;
ctx->buffer_out[ ctx->buffer_used++ ] = index / 94 + 0x21;
ctx->buffer_out[ ctx->buffer_used++ ] = index % 94 + 0x21;
continue;
@@ -649,34 +644,23 @@ lxb_encoding_encode_koi8_u(lxb_encoding_encode_t *ctx, const lxb_codepoint_t **c
LXB_ENCODING_SINGLE_HASH_KOI8_U_SIZE);
}
lxb_inline const lexbor_shs_hash_t *
lxb_inline uint16_t
lxb_encoding_encode_shift_jis_index(lxb_codepoint_t cp)
{
const lexbor_shs_hash_t *entry;
uint16_t index;
entry = &lxb_encoding_multi_hash_jis0208[ (cp % LXB_ENCODING_MULTI_HASH_JIS0208_SIZE) + 1 ];
index = lxb_encoding_multi_jis0208_index(cp);
do {
if (entry->key == cp) {
if ((unsigned) ((uint32_t) (uintptr_t) entry->value - 8272) > (8835 - 8272)) {
return entry;
}
}
entry = &lxb_encoding_multi_hash_jis0208[entry->next];
}
while (entry != lxb_encoding_multi_hash_jis0208);
return NULL;
return ((index - 8272) > (8835 - 8272)) ? UINT16_MAX : index;
}
lxb_status_t
lxb_encoding_encode_shift_jis(lxb_encoding_encode_t *ctx, const lxb_codepoint_t **cps,
const lxb_codepoint_t *end)
{
uint16_t index;
uint32_t lead, trail;
lxb_codepoint_t cp;
const lexbor_shs_hash_t *hash;
for (; *cps < end; (*cps)++) {
cp = **cps;
@@ -705,8 +689,8 @@ lxb_encoding_encode_shift_jis(lxb_encoding_encode_t *ctx, const lxb_codepoint_t
break;
}
hash = lxb_encoding_encode_shift_jis_index(cp);
if (hash == NULL) {
index = lxb_encoding_encode_shift_jis_index(cp);
if (index == UINT16_MAX) {
LXB_ENCODING_ENCODE_ERROR(ctx);
continue;
}
@@ -715,8 +699,8 @@ lxb_encoding_encode_shift_jis(lxb_encoding_encode_t *ctx, const lxb_codepoint_t
return LXB_STATUS_SMALL_BUFFER;
}
lead = (uint32_t) (uintptr_t) hash->value / 188;
trail = (uint32_t) (uintptr_t) hash->value % 188;
lead = index / 188;
trail = index % 188;
ctx->buffer_out[ctx->buffer_used++ ] = lead + ((lead < 0x1F) ? 0x81 : 0xC1);
ctx->buffer_out[ctx->buffer_used++ ] = trail + ((trail < 0x3F) ? 0x40 : 0x41);
@@ -902,7 +886,6 @@ lxb_encoding_encode_gb18030(lxb_encoding_encode_t *ctx, const lxb_codepoint_t **
{
uint32_t index;
lxb_codepoint_t cp;
const lexbor_shs_hash_t *hash;
for (; *cps < end; (*cps)++) {
cp = **cps;
@@ -917,20 +900,19 @@ lxb_encoding_encode_gb18030(lxb_encoding_encode_t *ctx, const lxb_codepoint_t **
continue;
}
hash = lexbor_shs_hash_get_static(lxb_encoding_multi_hash_gb18030,
LXB_ENCODING_MULTI_HASH_GB18030_SIZE, cp);
if (hash != NULL) {
index = lxb_encoding_multi_gb18030_index(cp);
if (index != UINT16_MAX) {
if ((ctx->buffer_used + 2) > ctx->buffer_length) {
return LXB_STATUS_SMALL_BUFFER;
}
ctx->buffer_out[ ctx->buffer_used++ ] = (uint32_t) (uintptr_t) hash->value / 190 + 0x81;
ctx->buffer_out[ ctx->buffer_used++ ] = index / 190 + 0x81;
if (((uint32_t) (uintptr_t) hash->value % 190) < 0x3F) {
ctx->buffer_out[ ctx->buffer_used++ ] = ((uint32_t) (uintptr_t) hash->value % 190) + 0x40;
if ((index % 190) < 0x3F) {
ctx->buffer_out[ ctx->buffer_used++ ] = (index % 190) + 0x40;
}
else {
ctx->buffer_out[ ctx->buffer_used++ ] = ((uint32_t) (uintptr_t) hash->value % 190) + 0x41;
ctx->buffer_out[ ctx->buffer_used++ ] = (index % 190) + 0x41;
}
continue;
@@ -1109,7 +1091,7 @@ int8_t
lxb_encoding_encode_big5_single(lxb_encoding_encode_t *ctx, lxb_char_t **data,
const lxb_char_t *end, lxb_codepoint_t cp)
{
const lexbor_shs_hash_t *hash;
uint16_t index;
if (cp < 0x80) {
*(*data)++ = (lxb_char_t) cp;
@@ -1117,9 +1099,8 @@ lxb_encoding_encode_big5_single(lxb_encoding_encode_t *ctx, lxb_char_t **data,
return 1;
}
hash = lexbor_shs_hash_get_static(lxb_encoding_multi_hash_big5,
LXB_ENCODING_MULTI_HASH_BIG5_SIZE, cp);
if (hash == NULL) {
index = lxb_encoding_multi_big5_index(cp);
if (index == UINT16_MAX) {
return LXB_ENCODING_ENCODE_ERROR;
}
@@ -1127,13 +1108,13 @@ lxb_encoding_encode_big5_single(lxb_encoding_encode_t *ctx, lxb_char_t **data,
return LXB_ENCODING_ENCODE_SMALL_BUFFER;
}
*(*data)++ = ((uint32_t) (uintptr_t) hash->value) / 157 + 0x81;
*(*data)++ = index / 157 + 0x81;
if ((((uint32_t) (uintptr_t) hash->value) % 157) < 0x3F) {
*(*data)++ = (((uint32_t) (uintptr_t) hash->value) % 157) + 0x40;
if ((index % 157) < 0x3F) {
*(*data)++ = (index % 157) + 0x40;
}
else {
*(*data)++ = (((uint32_t) (uintptr_t) hash->value) % 157) + 0x62;
*(*data)++ = (index % 157) + 0x62;
}
return 2;
@@ -1143,7 +1124,7 @@ int8_t
lxb_encoding_encode_euc_jp_single(lxb_encoding_encode_t *ctx, lxb_char_t **data,
const lxb_char_t *end, lxb_codepoint_t cp)
{
const lexbor_shs_hash_t *hash;
uint16_t index;
if (cp < 0x80) {
*(*data)++ = (lxb_char_t) cp;
@@ -1178,14 +1159,13 @@ lxb_encoding_encode_euc_jp_single(lxb_encoding_encode_t *ctx, lxb_char_t **data,
cp = 0xFF0D;
}
hash = lexbor_shs_hash_get_static(lxb_encoding_multi_hash_jis0208,
LXB_ENCODING_MULTI_HASH_JIS0208_SIZE, cp);
if (hash == NULL) {
index = lxb_encoding_multi_jis0208_index(cp);
if (index == UINT16_MAX) {
return LXB_ENCODING_ENCODE_ERROR;
}
*(*data)++ = (uint32_t) (uintptr_t) hash->value / 94 + 0xA1;
*(*data)++ = (uint32_t) (uintptr_t) hash->value % 94 + 0xA1;
*(*data)++ = index / 94 + 0xA1;
*(*data)++ = index % 94 + 0xA1;
return 2;
}
@@ -1194,7 +1174,7 @@ int8_t
lxb_encoding_encode_euc_kr_single(lxb_encoding_encode_t *ctx, lxb_char_t **data,
const lxb_char_t *end, lxb_codepoint_t cp)
{
const lexbor_shs_hash_t *hash;
uint16_t index;
if (cp < 0x80) {
*(*data)++ = (lxb_char_t) cp;
@@ -1206,14 +1186,13 @@ lxb_encoding_encode_euc_kr_single(lxb_encoding_encode_t *ctx, lxb_char_t **data,
return LXB_ENCODING_ENCODE_SMALL_BUFFER;
}
hash = lexbor_shs_hash_get_static(lxb_encoding_multi_hash_euc_kr,
LXB_ENCODING_MULTI_HASH_EUC_KR_SIZE, cp);
if (hash == NULL) {
index = lxb_encoding_multi_euc_kr_index(cp);
if (index == UINT16_MAX) {
return LXB_ENCODING_ENCODE_ERROR;
}
*(*data)++ = (uint32_t) (uintptr_t) hash->value / 190 + 0x81;
*(*data)++ = (uint32_t) (uintptr_t) hash->value % 190 + 0x41;
*(*data)++ = index / 190 + 0x81;
*(*data)++ = index % 190 + 0x41;
return 2;
}
@@ -1222,7 +1201,7 @@ int8_t
lxb_encoding_encode_gbk_single(lxb_encoding_encode_t *ctx, lxb_char_t **data,
const lxb_char_t *end, lxb_codepoint_t cp)
{
const lexbor_shs_hash_t *hash;
uint16_t index;
if (cp < 0x80) {
*(*data)++ = (lxb_char_t) cp;
@@ -1240,20 +1219,19 @@ lxb_encoding_encode_gbk_single(lxb_encoding_encode_t *ctx, lxb_char_t **data,
return 1;
}
hash = lexbor_shs_hash_get_static(lxb_encoding_multi_hash_gb18030,
LXB_ENCODING_MULTI_HASH_GB18030_SIZE, cp);
if (hash != NULL) {
index = lxb_encoding_multi_gb18030_index(cp);
if (index != UINT16_MAX) {
if ((*data + 2) > end) {
return LXB_ENCODING_ENCODE_SMALL_BUFFER;
}
*(*data)++ = (lxb_char_t) (uintptr_t) hash->value / 190 + 0x81;
*(*data)++ = index / 190 + 0x81;
if (((lxb_char_t) (uintptr_t) hash->value % 190) < 0x3F) {
*(*data)++ = ((lxb_char_t) (uintptr_t) hash->value % 190) + 0x40;
if ((index % 190) < 0x3F) {
*(*data)++ = (index % 190) + 0x40;
}
else {
*(*data)++ = ((lxb_char_t) (uintptr_t) hash->value % 190) + 0x41;
*(*data)++ = (index % 190) + 0x41;
}
return 2;
@@ -1275,8 +1253,8 @@ lxb_encoding_encode_iso_2022_jp_single(lxb_encoding_encode_t *ctx, lxb_char_t **
const lxb_char_t *end, lxb_codepoint_t cp)
{
int8_t size;
uint16_t index;
unsigned state;
const lexbor_shs_hash_t *hash;
size = 0;
state = ctx->state;
@@ -1413,12 +1391,11 @@ begin:
}
if ((unsigned) (cp - 0xFF61) <= (0xFF9F - 0xFF61)) {
cp = lxb_encoding_multi_index_iso_2022_jp_katakana[cp - 0xFF61].codepoint;
cp = lxb_encoding_multi_iso_2022_jp_katakana_map[cp - 0xFF61];
}
hash = lexbor_shs_hash_get_static(lxb_encoding_multi_hash_jis0208,
LXB_ENCODING_MULTI_HASH_JIS0208_SIZE, cp);
if (hash == NULL) {
index = lxb_encoding_multi_jis0208_index(cp);
if (index == UINT16_MAX) {
goto failed;
}
@@ -1436,8 +1413,8 @@ begin:
goto begin;
}
*(*data)++ = (uint32_t) (uintptr_t) hash->value / 94 + 0x21;
*(*data)++ = (uint32_t) (uintptr_t) hash->value % 94 + 0x21;
*(*data)++ = index / 94 + 0x21;
*(*data)++ = index % 94 + 0x21;
return size + 2;
@@ -1599,8 +1576,8 @@ int8_t
lxb_encoding_encode_shift_jis_single(lxb_encoding_encode_t *ctx, lxb_char_t **data,
const lxb_char_t *end, lxb_codepoint_t cp)
{
uint16_t index;
uint32_t lead, trail;
const lexbor_shs_hash_t *hash;
if (cp <= 0x80) {
*(*data)++ = (lxb_char_t) cp;
@@ -1628,8 +1605,8 @@ lxb_encoding_encode_shift_jis_single(lxb_encoding_encode_t *ctx, lxb_char_t **da
break;
}
hash = lxb_encoding_encode_shift_jis_index(cp);
if (hash == NULL) {
index = lxb_encoding_encode_shift_jis_index(cp);
if (index == UINT16_MAX) {
return LXB_ENCODING_ENCODE_ERROR;
}
@@ -1637,8 +1614,8 @@ lxb_encoding_encode_shift_jis_single(lxb_encoding_encode_t *ctx, lxb_char_t **da
return LXB_ENCODING_ENCODE_SMALL_BUFFER;
}
lead = (uint32_t) (uintptr_t) hash->value / 188;
trail = (uint32_t) (uintptr_t) hash->value % 188;
lead = index / 188;
trail = index % 188;
*(*data)++ = lead + ((lead < 0x1F) ? 0x81 : 0xC1);
*(*data)++ = trail + ((trail < 0x3F) ? 0x40 : 0x41);
@@ -1778,7 +1755,6 @@ lxb_encoding_encode_gb18030_single(lxb_encoding_encode_t *ctx, lxb_char_t **data
const lxb_char_t *end, lxb_codepoint_t cp)
{
uint32_t index;
const lexbor_shs_hash_t *hash;
if (cp < 0x80) {
*(*data)++ = (lxb_char_t) cp;
@@ -1790,20 +1766,19 @@ lxb_encoding_encode_gb18030_single(lxb_encoding_encode_t *ctx, lxb_char_t **data
return LXB_ENCODING_ENCODE_ERROR;
}
hash = lexbor_shs_hash_get_static(lxb_encoding_multi_hash_gb18030,
LXB_ENCODING_MULTI_HASH_GB18030_SIZE, cp);
if (hash != NULL) {
index = lxb_encoding_multi_gb18030_index(cp);
if (index != UINT16_MAX) {
if ((*data + 2) > end) {
return LXB_ENCODING_ENCODE_SMALL_BUFFER;
}
*(*data)++ = (uint32_t) (uintptr_t) hash->value / 190 + 0x81;
*(*data)++ = index / 190 + 0x81;
if (((uint32_t) (uintptr_t) hash->value % 190) < 0x3F) {
*(*data)++ = ((uint32_t) (uintptr_t) hash->value % 190) + 0x40;
if ((index % 190) < 0x3F) {
*(*data)++ = (index % 190) + 0x40;
}
else {
*(*data)++ = ((uint32_t) (uintptr_t) hash->value % 190) + 0x41;
*(*data)++ = (index % 190) + 0x41;
}
return 2;

View File

@@ -55,6 +55,51 @@ lxb_encoding_data_by_pre_name(const lxb_char_t *name, size_t length)
return entry->value;
}
void
lxb_encoding_utf_8_skip_bom(const lxb_char_t **begin, size_t *length)
{
const lxb_char_t *p;
if (*length >= 3) {
p = *begin;
if (p[0] == 0xEF && p[1] == 0xBB && p[2] == 0xBF) {
*begin = p + 3;
*length -= 3;
}
}
}
void
lxb_encoding_utf_16be_skip_bom(const lxb_char_t **begin, size_t *length)
{
const lxb_char_t *p;
if (*length >= 2) {
p = *begin;
if (p[0] == 0xFE && p[1] == 0xFF) {
*begin = p + 2;
*length -= 2;
}
}
}
void
lxb_encoding_utf_16le_skip_bom(const lxb_char_t **begin, size_t *length)
{
const lxb_char_t *p;
if (*length >= 2) {
p = *begin;
if (p[0] == 0xFF && p[1] == 0xFE) {
*begin = p + 2;
*length -= 2;
}
}
}
/*
* No inline functions for ABI.
*/

View File

@@ -27,6 +27,18 @@ extern "C" {
LXB_API const lxb_encoding_data_t *
lxb_encoding_data_by_pre_name(const lxb_char_t *name, size_t length);
/*
* To skip BOM.
*/
LXB_API void
lxb_encoding_utf_8_skip_bom(const lxb_char_t **begin, size_t *length);
LXB_API void
lxb_encoding_utf_16be_skip_bom(const lxb_char_t **begin, size_t *length);
LXB_API void
lxb_encoding_utf_16le_skip_bom(const lxb_char_t **begin, size_t *length);
/*
* Inline functions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,159 +0,0 @@
/*
* Copyright (C) 2024 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
/*
* Caution!
* This file generated by the script "utils/lexbor/encoding/multi-byte.py"!
* Do not change this file!
*/
#include "lexbor/encoding/base.h"
#include "lexbor/core/shs.h"
LXB_API const lxb_encoding_multi_index_t lxb_encoding_multi_index_iso_2022_jp_katakana[63] =
{
{{'\xe3', '\x80', '\x82'}, 3, 0x3002}, /* (IDEOGRAPHIC FULL STOP) */
{{'\xe3', '\x80', '\x8c'}, 3, 0x300C}, /* (LEFT CORNER BRACKET) */
{{'\xe3', '\x80', '\x8d'}, 3, 0x300D}, /* (RIGHT CORNER BRACKET) */
{{'\xe3', '\x80', '\x81'}, 3, 0x3001}, /* (IDEOGRAPHIC COMMA) */
{{'\xe3', '\x83', '\xbb'}, 3, 0x30FB}, /* (KATAKANA MIDDLE DOT) */
{{'\xe3', '\x83', '\xb2'}, 3, 0x30F2}, /* (KATAKANA LETTER WO) */
{{'\xe3', '\x82', '\xa1'}, 3, 0x30A1}, /* (KATAKANA LETTER SMALL A) */
{{'\xe3', '\x82', '\xa3'}, 3, 0x30A3}, /* (KATAKANA LETTER SMALL I) */
{{'\xe3', '\x82', '\xa5'}, 3, 0x30A5}, /* (KATAKANA LETTER SMALL U) */
{{'\xe3', '\x82', '\xa7'}, 3, 0x30A7}, /* (KATAKANA LETTER SMALL E) */
{{'\xe3', '\x82', '\xa9'}, 3, 0x30A9}, /* (KATAKANA LETTER SMALL O) */
{{'\xe3', '\x83', '\xa3'}, 3, 0x30E3}, /* (KATAKANA LETTER SMALL YA) */
{{'\xe3', '\x83', '\xa5'}, 3, 0x30E5}, /* (KATAKANA LETTER SMALL YU) */
{{'\xe3', '\x83', '\xa7'}, 3, 0x30E7}, /* (KATAKANA LETTER SMALL YO) */
{{'\xe3', '\x83', '\x83'}, 3, 0x30C3}, /* (KATAKANA LETTER SMALL TU) */
{{'\xe3', '\x83', '\xbc'}, 3, 0x30FC}, /* (KATAKANA-HIRAGANA PROLONGED SOUND MARK) */
{{'\xe3', '\x82', '\xa2'}, 3, 0x30A2}, /* (KATAKANA LETTER A) */
{{'\xe3', '\x82', '\xa4'}, 3, 0x30A4}, /* (KATAKANA LETTER I) */
{{'\xe3', '\x82', '\xa6'}, 3, 0x30A6}, /* (KATAKANA LETTER U) */
{{'\xe3', '\x82', '\xa8'}, 3, 0x30A8}, /* (KATAKANA LETTER E) */
{{'\xe3', '\x82', '\xaa'}, 3, 0x30AA}, /* (KATAKANA LETTER O) */
{{'\xe3', '\x82', '\xab'}, 3, 0x30AB}, /* (KATAKANA LETTER KA) */
{{'\xe3', '\x82', '\xad'}, 3, 0x30AD}, /* (KATAKANA LETTER KI) */
{{'\xe3', '\x82', '\xaf'}, 3, 0x30AF}, /* (KATAKANA LETTER KU) */
{{'\xe3', '\x82', '\xb1'}, 3, 0x30B1}, /* (KATAKANA LETTER KE) */
{{'\xe3', '\x82', '\xb3'}, 3, 0x30B3}, /* (KATAKANA LETTER KO) */
{{'\xe3', '\x82', '\xb5'}, 3, 0x30B5}, /* (KATAKANA LETTER SA) */
{{'\xe3', '\x82', '\xb7'}, 3, 0x30B7}, /* (KATAKANA LETTER SI) */
{{'\xe3', '\x82', '\xb9'}, 3, 0x30B9}, /* (KATAKANA LETTER SU) */
{{'\xe3', '\x82', '\xbb'}, 3, 0x30BB}, /* (KATAKANA LETTER SE) */
{{'\xe3', '\x82', '\xbd'}, 3, 0x30BD}, /* (KATAKANA LETTER SO) */
{{'\xe3', '\x82', '\xbf'}, 3, 0x30BF}, /* (KATAKANA LETTER TA) */
{{'\xe3', '\x83', '\x81'}, 3, 0x30C1}, /* (KATAKANA LETTER TI) */
{{'\xe3', '\x83', '\x84'}, 3, 0x30C4}, /* (KATAKANA LETTER TU) */
{{'\xe3', '\x83', '\x86'}, 3, 0x30C6}, /* (KATAKANA LETTER TE) */
{{'\xe3', '\x83', '\x88'}, 3, 0x30C8}, /* (KATAKANA LETTER TO) */
{{'\xe3', '\x83', '\x8a'}, 3, 0x30CA}, /* (KATAKANA LETTER NA) */
{{'\xe3', '\x83', '\x8b'}, 3, 0x30CB}, /* (KATAKANA LETTER NI) */
{{'\xe3', '\x83', '\x8c'}, 3, 0x30CC}, /* (KATAKANA LETTER NU) */
{{'\xe3', '\x83', '\x8d'}, 3, 0x30CD}, /* (KATAKANA LETTER NE) */
{{'\xe3', '\x83', '\x8e'}, 3, 0x30CE}, /* (KATAKANA LETTER NO) */
{{'\xe3', '\x83', '\x8f'}, 3, 0x30CF}, /* (KATAKANA LETTER HA) */
{{'\xe3', '\x83', '\x92'}, 3, 0x30D2}, /* (KATAKANA LETTER HI) */
{{'\xe3', '\x83', '\x95'}, 3, 0x30D5}, /* (KATAKANA LETTER HU) */
{{'\xe3', '\x83', '\x98'}, 3, 0x30D8}, /* (KATAKANA LETTER HE) */
{{'\xe3', '\x83', '\x9b'}, 3, 0x30DB}, /* (KATAKANA LETTER HO) */
{{'\xe3', '\x83', '\x9e'}, 3, 0x30DE}, /* (KATAKANA LETTER MA) */
{{'\xe3', '\x83', '\x9f'}, 3, 0x30DF}, /* (KATAKANA LETTER MI) */
{{'\xe3', '\x83', '\xa0'}, 3, 0x30E0}, /* (KATAKANA LETTER MU) */
{{'\xe3', '\x83', '\xa1'}, 3, 0x30E1}, /* (KATAKANA LETTER ME) */
{{'\xe3', '\x83', '\xa2'}, 3, 0x30E2}, /* (KATAKANA LETTER MO) */
{{'\xe3', '\x83', '\xa4'}, 3, 0x30E4}, /* (KATAKANA LETTER YA) */
{{'\xe3', '\x83', '\xa6'}, 3, 0x30E6}, /* (KATAKANA LETTER YU) */
{{'\xe3', '\x83', '\xa8'}, 3, 0x30E8}, /* (KATAKANA LETTER YO) */
{{'\xe3', '\x83', '\xa9'}, 3, 0x30E9}, /* (KATAKANA LETTER RA) */
{{'\xe3', '\x83', '\xaa'}, 3, 0x30EA}, /* (KATAKANA LETTER RI) */
{{'\xe3', '\x83', '\xab'}, 3, 0x30EB}, /* (KATAKANA LETTER RU) */
{{'\xe3', '\x83', '\xac'}, 3, 0x30EC}, /* (KATAKANA LETTER RE) */
{{'\xe3', '\x83', '\xad'}, 3, 0x30ED}, /* (KATAKANA LETTER RO) */
{{'\xe3', '\x83', '\xaf'}, 3, 0x30EF}, /* (KATAKANA LETTER WA) */
{{'\xe3', '\x83', '\xb3'}, 3, 0x30F3}, /* (KATAKANA LETTER N) */
{{'\xe3', '\x82', '\x9b'}, 3, 0x309B}, /* (KATAKANA-HIRAGANA VOICED SOUND MARK) */
{{'\xe3', '\x82', '\x9c'}, 3, 0x309C}, /* (KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK) */
};
/* Table size: 52; Max deep: 2 */
LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_iso_2022_jp_katakana[72] =
{
{0, 0, 0},{0, 0, 0},
{12481, 32, 0},
{0, 0, 0},
{12483, 14, 0},
{12484, 33, 0},
{0, 0, 0},
{12486, 34, 0},
{12539, 4, 0},
{12540, 15, 58},
{0, 0, 0},
{12490, 36, 0},
{12491, 37, 0},
{12492, 38, 0},
{12493, 39, 0},
{12494, 40, 0},
{12495, 41, 71},
{12444, 62, 0},
{12289, 3, 0},
{12290, 0, 59},
{0, 0, 0},
{0, 0, 0},
{12449, 6, 60},
{12450, 16, 0},
{12451, 7, 0},
{12452, 17, 61},
{12453, 8, 0},
{12454, 18, 0},
{12455, 9, 62},
{12300, 1, 54},
{12301, 2, 53},
{12458, 20, 63},
{12459, 21, 64},
{12512, 48, 0},
{12461, 22, 65},
{12514, 50, 0},
{12515, 11, 55},
{12516, 51, 0},
{12517, 12, 56},
{12518, 52, 0},
{12519, 13, 57},
{12520, 53, 0},
{12469, 26, 66},
{12522, 55, 0},
{12471, 27, 67},
{12524, 57, 0},
{12473, 28, 68},
{0, 0, 0},
{12475, 29, 69},
{0, 0, 0},
{12477, 30, 0},
{12530, 5, 0},
{12479, 31, 70},
{12457, 10, 0},
{12456, 19, 0},
{12463, 23, 0},
{12465, 24, 0},
{12467, 25, 0},
{12488, 35, 0},
{12498, 42, 0},
{12501, 43, 0},
{12504, 44, 0},
{12507, 45, 0},
{12510, 46, 0},
{12511, 47, 0},
{12513, 49, 0},
{12521, 54, 0},
{12523, 56, 0},
{12525, 58, 0},
{12527, 59, 0},
{12531, 60, 0},
{12443, 61, 0}
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,16 +1,15 @@
/*
* Copyright (C) 2019 Alexander Borisov
* Copyright (C) 2024 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
/*
* Caution!
* This file generated by the script "utils/lexbor/encoding/multi-byte.py"!
* This file generated by the script "utils/lexbor/encoding/multi-byte.pl"!
* Do not change this file!
*/
#ifndef LEXBOR_ENCODING_MULTI_H
#define LEXBOR_ENCODING_MULTI_H
@@ -20,30 +19,195 @@ extern "C" {
#include "lexbor/encoding/base.h"
#include "lexbor/core/shs.h"
LXB_EXTERN lxb_codepoint_t lxb_encoding_multi_big5_map[19782];
LXB_EXTERN lxb_codepoint_t lxb_encoding_multi_euc_kr_map[23750];
LXB_EXTERN lxb_codepoint_t lxb_encoding_multi_gb18030_map[23940];
LXB_EXTERN lxb_codepoint_t lxb_encoding_multi_iso_2022_jp_katakana_map[63];
LXB_EXTERN lxb_codepoint_t lxb_encoding_multi_jis0212_map[7211];
LXB_EXTERN lxb_codepoint_t lxb_encoding_multi_jis0208_map[11104];
#define LXB_ENCODING_MULTI_HASH_BIG5_SIZE 20172
#define LXB_ENCODING_MULTI_HASH_EUC_KR_SIZE 28041
#define LXB_ENCODING_MULTI_HASH_GB18030_SIZE 19950
#define LXB_ENCODING_MULTI_HASH_ISO_2022_JP_KATAKANA_SIZE 52
#define LXB_ENCODING_MULTI_HASH_JIS0208_SIZE 9253
#define LXB_ENCODING_MULTI_HASH_JIS0212_SIZE 6923
LXB_EXTERN uint16_t lxb_encoding_multi_big5_167_1106_map[939];
LXB_EXTERN uint16_t lxb_encoding_multi_big5_8211_40882_map[32671];
LXB_EXTERN uint16_t lxb_encoding_multi_big5_64012_65518_map[1506];
LXB_EXTERN uint16_t lxb_encoding_multi_big5_131210_172369_map[41159];
LXB_EXTERN uint16_t lxb_encoding_multi_big5_194708_194727_map[19];
LXB_EXTERN uint16_t lxb_encoding_multi_euc_kr_161_1106_map[945];
LXB_EXTERN uint16_t lxb_encoding_multi_euc_kr_8213_13278_map[5065];
LXB_EXTERN uint16_t lxb_encoding_multi_euc_kr_19968_55204_map[35236];
LXB_EXTERN uint16_t lxb_encoding_multi_euc_kr_63744_65511_map[1767];
LXB_EXTERN const lxb_encoding_multi_index_t lxb_encoding_multi_index_big5[19782];
LXB_EXTERN const lxb_encoding_multi_index_t lxb_encoding_multi_index_euc_kr[23750];
LXB_EXTERN const lxb_encoding_multi_index_t lxb_encoding_multi_index_gb18030[23940];
LXB_EXTERN const lxb_encoding_multi_index_t lxb_encoding_multi_index_iso_2022_jp_katakana[63];
LXB_EXTERN const lxb_encoding_multi_index_t lxb_encoding_multi_index_jis0208[11104];
LXB_EXTERN const lxb_encoding_multi_index_t lxb_encoding_multi_index_jis0212[7211];
LXB_EXTERN uint16_t lxb_encoding_multi_gb18030_164_1106_map[942];
LXB_EXTERN uint16_t lxb_encoding_multi_gb18030_7743_40892_map[33149];
LXB_EXTERN uint16_t lxb_encoding_multi_gb18030_57344_65510_map[8166];
LXB_EXTERN const lexbor_shs_hash_t lxb_encoding_multi_hash_big5[23033];
LXB_EXTERN const lexbor_shs_hash_t lxb_encoding_multi_hash_euc_kr[30109];
LXB_EXTERN const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941];
LXB_EXTERN const lexbor_shs_hash_t lxb_encoding_multi_hash_iso_2022_jp_katakana[72];
LXB_EXTERN const lexbor_shs_hash_t lxb_encoding_multi_hash_jis0208[11349];
LXB_EXTERN const lexbor_shs_hash_t lxb_encoding_multi_hash_jis0212[8552];
LXB_EXTERN uint16_t lxb_encoding_multi_iso_2022_jp_katakana_12289_12541_map[252];
LXB_EXTERN uint16_t lxb_encoding_multi_jis0212_161_1120_map[959];
LXB_EXTERN uint16_t lxb_encoding_multi_jis0212_8470_8483_map[13];
LXB_EXTERN uint16_t lxb_encoding_multi_jis0212_19970_40870_map[20900];
LXB_EXTERN uint16_t lxb_encoding_multi_jis0212_65374_65375_map[1];
LXB_EXTERN uint16_t lxb_encoding_multi_jis0208_167_1106_map[939];
LXB_EXTERN uint16_t lxb_encoding_multi_jis0208_8208_13262_map[5054];
LXB_EXTERN uint16_t lxb_encoding_multi_jis0208_19968_40865_map[20897];
LXB_EXTERN uint16_t lxb_encoding_multi_jis0208_63785_65510_map[1725];
lxb_inline uint16_t
lxb_encoding_multi_big5_index(lxb_codepoint_t cp)
{
if (cp > 0x2F8A7) {
return UINT16_MAX;
}
if (cp < 65518) {
if (cp >= 167 && cp < 1106) {
return lxb_encoding_multi_big5_167_1106_map[cp - 167];
}
else if (cp >= 8211) {
if (cp < 40882) {
return lxb_encoding_multi_big5_8211_40882_map[cp - 8211];
}
else if (cp >= 64012) {
return lxb_encoding_multi_big5_64012_65518_map[cp - 64012];
}
}
}
else if (cp >= 131210) {
if (cp < 172369) {
return lxb_encoding_multi_big5_131210_172369_map[cp - 131210];
}
else if (cp >= 194708) {
if (cp < 194727) {
return lxb_encoding_multi_big5_194708_194727_map[cp - 194708];
}
}
}
return UINT16_MAX;
}
lxb_inline uint16_t
lxb_encoding_multi_euc_kr_index(lxb_codepoint_t cp)
{
if (cp > 0xFFE7) {
return UINT16_MAX;
}
if (cp < 13278) {
if (cp >= 161 && cp < 1106) {
return lxb_encoding_multi_euc_kr_161_1106_map[cp - 161];
}
else if (cp >= 8213) {
return lxb_encoding_multi_euc_kr_8213_13278_map[cp - 8213];
}
}
else if (cp >= 19968) {
if (cp < 55204) {
return lxb_encoding_multi_euc_kr_19968_55204_map[cp - 19968];
}
else if (cp >= 63744) {
if (cp < 65511) {
return lxb_encoding_multi_euc_kr_63744_65511_map[cp - 63744];
}
}
}
return UINT16_MAX;
}
lxb_inline uint16_t
lxb_encoding_multi_gb18030_index(lxb_codepoint_t cp)
{
if (cp > 0xFFE6) {
return UINT16_MAX;
}
if (cp < 40892) {
if (cp >= 164 && cp < 1106) {
return lxb_encoding_multi_gb18030_164_1106_map[cp - 164];
}
else if (cp >= 7743) {
return lxb_encoding_multi_gb18030_7743_40892_map[cp - 7743];
}
}
else if (cp >= 57344) {
if (cp < 65510) {
return lxb_encoding_multi_gb18030_57344_65510_map[cp - 57344];
}
}
return UINT16_MAX;
}
lxb_inline uint16_t
lxb_encoding_multi_iso_2022_jp_katakana_index(lxb_codepoint_t cp)
{
if (cp >= 12289 && cp < 12541) {
return lxb_encoding_multi_iso_2022_jp_katakana_12289_12541_map[cp - 12289];
}
return UINT16_MAX;
}
lxb_inline uint16_t
lxb_encoding_multi_jis0212_index(lxb_codepoint_t cp)
{
if (cp > 0xFF5F) {
return UINT16_MAX;
}
if (cp < 8483) {
if (cp >= 161 && cp < 1120) {
return lxb_encoding_multi_jis0212_161_1120_map[cp - 161];
}
else if (cp >= 8470) {
return lxb_encoding_multi_jis0212_8470_8483_map[cp - 8470];
}
}
else if (cp >= 19970) {
if (cp < 40870) {
return lxb_encoding_multi_jis0212_19970_40870_map[cp - 19970];
}
else if (cp >= 65374) {
if (cp < 65375) {
return lxb_encoding_multi_jis0212_65374_65375_map[cp - 65374];
}
}
}
return UINT16_MAX;
}
lxb_inline uint16_t
lxb_encoding_multi_jis0208_index(lxb_codepoint_t cp)
{
if (cp > 0xFFE6) {
return UINT16_MAX;
}
if (cp < 13262) {
if (cp >= 167 && cp < 1106) {
return lxb_encoding_multi_jis0208_167_1106_map[cp - 167];
}
else if (cp >= 8208) {
return lxb_encoding_multi_jis0208_8208_13262_map[cp - 8208];
}
}
else if (cp >= 19968) {
if (cp < 40865) {
return lxb_encoding_multi_jis0208_19968_40865_map[cp - 19968];
}
else if (cp >= 63785) {
if (cp < 65510) {
return lxb_encoding_multi_jis0208_63785_65510_map[cp - 63785];
}
}
}
return UINT16_MAX;
}
#ifdef __cplusplus

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2021 Alexander Borisov
* Copyright (C) 2018-2024 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -15,7 +15,7 @@ extern "C" {
#define LXB_HTML_VERSION_MAJOR 2
#define LXB_HTML_VERSION_MINOR 5
#define LXB_HTML_VERSION_MINOR 6
#define LXB_HTML_VERSION_PATCH 0
#define LXB_HTML_VERSION_STRING LEXBOR_STRINGIZE(LXB_HTML_VERSION_MAJOR) "." \

File diff suppressed because it is too large Load Diff

View File

@@ -11,7 +11,6 @@
#include "lexbor/html/interfaces/style_element.h"
#include "lexbor/html/node.h"
#include "lexbor/html/parser.h"
#include "lexbor/html/style.h"
#include "lexbor/tag/tag.h"
@@ -23,61 +22,6 @@
#include "lexbor/html/tag_res.h"
static const lexbor_hash_search_t lxb_html_document_css_customs_se = {
.cmp = lexbor_str_data_ncasecmp,
.hash = lexbor_hash_make_id
};
static const lexbor_hash_insert_t lxb_html_document_css_customs_in = {
.copy = lexbor_hash_copy,
.cmp = lexbor_str_data_ncasecmp,
.hash = lexbor_hash_make_id
};
typedef struct {
lexbor_hash_entry_t entry;
uintptr_t id;
}
lxb_html_document_css_custom_entry_t;
typedef struct {
lxb_html_document_t *doc;
bool all;
}
lxb_html_document_event_ctx_t;
typedef struct {
lxb_html_document_t *doc;
lxb_css_rule_declaration_list_t *list;
}
lxb_html_document_remove_ctx_t;
static lxb_html_document_css_custom_entry_t *
lxb_html_document_css_customs_insert(lxb_html_document_t *document,
const lxb_char_t *key, size_t length);
#if 0
static lxb_status_t
lxb_html_document_style_remove_by_rule_cb(lxb_dom_node_t *node,
lxb_css_selector_specificity_t spec,
void *ctx);
static lxb_status_t
lxb_html_document_style_remove_avl_cb(lexbor_avl_t *avl,
lexbor_avl_node_t **root,
lexbor_avl_node_t *node, void *ctx);
static lxb_status_t
lxb_html_document_style_cb(lxb_dom_node_t *node,
lxb_css_selector_specificity_t spec, void *ctx);
static lxb_status_t
lxb_html_document_done(lxb_html_document_t *document);
#endif
lxb_status_t
lxb_html_parse_chunk_prepare(lxb_html_parser_t *parser,
lxb_html_document_t *document);
@@ -88,43 +32,20 @@ lxb_html_document_parser_prepare(lxb_html_document_t *document);
static lexbor_action_t
lxb_html_document_title_walker(lxb_dom_node_t *node, void *ctx);
#if 0
static lxb_status_t
lxb_html_document_event_insert(lxb_dom_node_t *node);
static lxb_status_t
lxb_html_document_event_insert_attribute(lxb_dom_node_t *node);
static lxb_status_t
lxb_html_document_event_remove(lxb_dom_node_t *node);
static lxb_status_t
lxb_html_document_style_remove_cb(lexbor_avl_t *avl, lexbor_avl_node_t **root,
lexbor_avl_node_t *node, void *ctx);
static lxb_status_t
lxb_html_document_event_remove_attribute(lxb_dom_node_t *node);
static lxb_status_t
lxb_html_document_style_remove_my_cb(lexbor_avl_t *avl, lexbor_avl_node_t **root,
lexbor_avl_node_t *node, void *ctx);
static lxb_status_t
lxb_html_document_event_destroy(lxb_dom_node_t *node);
static lxb_status_t
lxb_html_document_event_set_value(lxb_dom_node_t *node,
const lxb_char_t *value, size_t length);
#endif
lxb_inline lxb_dom_interface_t *
lxb_html_document_interface_create_wrapper(lxb_dom_document_t *document,
lxb_tag_id_t tag_id, lxb_ns_id_t ns)
{
return lxb_html_interface_create(lxb_html_interface_document(document),
tag_id, ns);
}
lxb_html_document_t *
lxb_html_document_interface_create(lxb_html_document_t *document)
{
lxb_status_t status;
lxb_dom_document_t *doc;
lxb_html_document_t *hdoc;
lxb_dom_interface_create_f icreator;
if (document != NULL) {
doc = lexbor_mraw_calloc(lxb_html_document_mraw(document),
@@ -138,10 +59,9 @@ lxb_html_document_interface_create(lxb_html_document_t *document)
return NULL;
}
icreator = (lxb_dom_interface_create_f) lxb_html_interface_create;
status = lxb_dom_document_init(doc, lxb_dom_interface_document(document),
icreator, lxb_html_interface_clone,
lxb_html_document_interface_create_wrapper,
lxb_html_interface_clone,
lxb_html_interface_destroy,
LXB_DOM_DOCUMENT_DTYPE_HTML, LXB_NS_HTML);
if (status != LXB_STATUS_OK) {
@@ -149,17 +69,7 @@ lxb_html_document_interface_create(lxb_html_document_t *document)
return NULL;
}
hdoc = lxb_html_interface_document(doc);
if (document == NULL) {
hdoc->css_init = false;
}
else {
hdoc->css = document->css;
hdoc->css_init = document->css_init;
}
return hdoc;
return lxb_html_interface_document(doc);
}
lxb_html_document_t *
@@ -175,9 +85,6 @@ lxb_html_document_interface_destroy(lxb_html_document_t *document)
if (doc->node.owner_document == doc) {
(void) lxb_html_parser_unref(doc->parser);
#if 0
lxb_html_document_css_destroy(document);
#endif
}
(void) lxb_dom_document_destroy(doc);
@@ -199,524 +106,9 @@ lxb_html_document_clean(lxb_html_document_t *document)
document->iframe_srcdoc = NULL;
document->ready_state = LXB_HTML_DOCUMENT_READY_STATE_UNDEF;
#if 0
lxb_html_document_css_clean(document);
#endif
lxb_dom_document_clean(lxb_dom_interface_document(document));
}
#if 0
lxb_status_t
lxb_html_document_css_init(lxb_html_document_t *document)
{
lxb_status_t status;
lxb_html_document_css_t *css = &document->css;
if (document->css_init) {
return LXB_HTML_STATUS_OK;
}
css->memory = lxb_css_memory_create();
status = lxb_css_memory_init(css->memory, 1024);
if (status != LXB_STATUS_OK) {
goto failed;
}
css->css_selectors = lxb_css_selectors_create();
status = lxb_css_selectors_init(css->css_selectors);
if (status != LXB_STATUS_OK) {
goto failed;
}
css->parser = lxb_css_parser_create();
status = lxb_css_parser_init(css->parser, NULL);
if (status != LXB_STATUS_OK) {
goto failed;
}
lxb_css_parser_memory_set(css->parser, css->memory);
lxb_css_parser_selectors_set(css->parser, css->css_selectors);
css->selectors = lxb_selectors_create();
status = lxb_selectors_init(css->selectors);
if (status != LXB_STATUS_OK) {
goto failed;
}
css->styles = lexbor_avl_create();
status = lexbor_avl_init(css->styles, 2048, sizeof(lxb_html_style_node_t));
if (status != LXB_STATUS_OK) {
goto failed;
}
css->stylesheets = lexbor_array_create();
status = lexbor_array_init(css->stylesheets, 16);
if (status != LXB_STATUS_OK) {
goto failed;
}
css->weak = lexbor_dobject_create();
status = lexbor_dobject_init(css->weak, 2048,
sizeof(lxb_html_style_weak_t));
if (status != LXB_STATUS_OK) {
goto failed;
}
status = lxb_html_document_css_customs_init(document);
if (status != LXB_STATUS_OK) {
goto failed;
}
document->css_init = true;
document->dom_document.ev_insert = lxb_html_document_event_insert;
document->dom_document.ev_remove = lxb_html_document_event_remove;
document->dom_document.ev_destroy = lxb_html_document_event_destroy;
document->dom_document.ev_set_value = lxb_html_document_event_set_value;
document->done = lxb_html_document_done;
return LXB_STATUS_OK;
failed:
lxb_html_document_css_destroy(document);
return status;
}
void
lxb_html_document_css_destroy(lxb_html_document_t *document)
{
lxb_html_document_css_t *css = &document->css;
if (!document->css_init
|| lxb_dom_interface_node(document)->owner_document
!= lxb_dom_interface_document(document))
{
return;
}
css->memory = lxb_css_memory_destroy(css->memory, true);
css->css_selectors = lxb_css_selectors_destroy(css->css_selectors, true);
css->parser = lxb_css_parser_destroy(css->parser, true);
css->selectors = lxb_selectors_destroy(css->selectors, true);
css->styles = lexbor_avl_destroy(css->styles, true);
css->stylesheets = lexbor_array_destroy(css->stylesheets, true);
css->weak = lexbor_dobject_destroy(css->weak, true);
document->dom_document.ev_insert = NULL;
document->dom_document.ev_remove = NULL;
document->dom_document.ev_destroy = NULL;
document->dom_document.ev_set_value = NULL;
document->done = NULL;
lxb_html_document_css_customs_destroy(document);
}
void
lxb_html_document_css_clean(lxb_html_document_t *document)
{
lxb_html_document_css_t *css;
if (lxb_dom_interface_node(document)->owner_document
== lxb_dom_interface_document(document))
{
if (!document->css_init) {
return;
}
css = &document->css;
lxb_css_memory_clean(css->memory);
lxb_css_selectors_clean(css->css_selectors);
lxb_css_parser_clean(css->parser);
lxb_selectors_clean(css->selectors);
lexbor_avl_clean(css->styles);
lexbor_array_clean(css->stylesheets);
lexbor_dobject_clean(css->weak);
}
}
#endif
void
lxb_html_document_css_parser_attach(lxb_html_document_t *document,
lxb_css_parser_t *parser)
{
document->css.parser = parser;
}
void
lxb_html_document_css_memory_attach(lxb_html_document_t *document,
lxb_css_memory_t *memory)
{
document->css.memory = memory;
}
lxb_status_t
lxb_html_document_css_customs_init(lxb_html_document_t *document)
{
lxb_html_document_css_t *css = &document->css;
css->customs_id = LXB_CSS_PROPERTY__LAST_ENTRY;
css->customs = lexbor_hash_create();
return lexbor_hash_init(css->customs, 512,
sizeof(lxb_html_document_css_custom_entry_t));
}
void
lxb_html_document_css_customs_destroy(lxb_html_document_t *document)
{
document->css.customs = lexbor_hash_destroy(document->css.customs, true);
}
uintptr_t
lxb_html_document_css_customs_find_id(lxb_html_document_t *document,
const lxb_char_t *key, size_t length)
{
const lxb_html_document_css_custom_entry_t *entry;
entry = lexbor_hash_search(document->css.customs,
&lxb_html_document_css_customs_se, key, length);
return (entry != NULL) ? entry->id : 0;
}
static lxb_html_document_css_custom_entry_t *
lxb_html_document_css_customs_insert(lxb_html_document_t *document,
const lxb_char_t *key, size_t length)
{
lxb_html_document_css_custom_entry_t *entry;
if (UINTPTR_MAX - document->css.customs_id == 0) {
return NULL;
}
entry = lexbor_hash_insert(document->css.customs,
&lxb_html_document_css_customs_in, key, length);
if (entry == NULL) {
return NULL;
}
entry->id = document->css.customs_id++;
return entry;
}
uintptr_t
lxb_html_document_css_customs_id(lxb_html_document_t *document,
const lxb_char_t *key, size_t length)
{
lxb_html_document_css_custom_entry_t *entry;
entry = lexbor_hash_search(document->css.customs,
&lxb_html_document_css_customs_se, key, length);
if (entry != NULL) {
return entry->id;
}
entry = lxb_html_document_css_customs_insert(document, key, length);
if (entry == NULL) {
return 0;
}
return entry->id;
}
lxb_status_t
lxb_html_document_stylesheet_attach(lxb_html_document_t *document,
lxb_css_stylesheet_t *sst)
{
lxb_status_t status;
status = lexbor_array_push(document->css.stylesheets, sst);
if (status != LXB_STATUS_OK) {
return status;
}
return lxb_html_document_stylesheet_apply(document, sst);
}
lxb_status_t
lxb_html_document_stylesheet_apply(lxb_html_document_t *document,
lxb_css_stylesheet_t *sst)
{
lxb_status_t status = LXB_STATUS_OK;
lxb_css_rule_t *rule;
lxb_css_rule_list_t *list;
rule = sst->root;
if (rule->type != LXB_CSS_RULE_LIST) {
return LXB_STATUS_ERROR_WRONG_ARGS;
}
list = lxb_css_rule_list(rule);
rule = list->first;
while (rule != NULL) {
switch (rule->type) {
case LXB_CSS_RULE_STYLE:
status = lxb_html_document_style_attach(document,
lxb_css_rule_style(rule));
break;
default:
break;
}
if (status != LXB_STATUS_OK) {
/* FIXME: what to do with an error? */
}
rule = rule->next;
}
return LXB_STATUS_OK;
}
lxb_status_t
lxb_html_document_stylesheet_add(lxb_html_document_t *document,
lxb_css_stylesheet_t *sst)
{
if (sst == NULL) {
return LXB_STATUS_OK;
}
return lexbor_array_push(document->css.stylesheets, sst);
}
lxb_status_t
lxb_html_document_stylesheet_remove(lxb_html_document_t *document,
lxb_css_stylesheet_t *sst)
{
size_t i, length;
lxb_status_t status = LXB_STATUS_OK;
lxb_css_rule_t *rule;
lxb_css_rule_list_t *list;
lxb_css_stylesheet_t *sst_in;
rule = sst->root;
if (rule->type != LXB_CSS_RULE_LIST) {
return LXB_STATUS_ERROR_WRONG_ARGS;
}
list = lxb_css_rule_list(rule);
rule = list->first;
while (rule != NULL) {
switch (rule->type) {
case LXB_CSS_RULE_STYLE:
status = lxb_html_document_style_remove(document,
lxb_css_rule_style(rule));
break;
default:
break;
}
if (status != LXB_STATUS_OK) {
/* FIXME: what to do with an error? */
}
rule = rule->next;
}
length = lexbor_array_length(document->css.stylesheets);
for (i = 0; i < length; i++) {
sst_in = lexbor_array_get(document->css.stylesheets, i);
if (sst_in == sst) {
lexbor_array_delete(document->css.stylesheets, i, 1);
length = lexbor_array_length(document->css.stylesheets);
}
}
return LXB_STATUS_OK;
}
lxb_status_t
lxb_html_document_element_styles_attach(lxb_html_element_t *element)
{
lxb_status_t status = LXB_STATUS_OK;
lxb_css_rule_t *rule;
lexbor_array_t *ssts;
lxb_css_rule_list_t *list;
lxb_css_stylesheet_t *sst;
lxb_html_document_t *document;
document = lxb_html_element_document(element);
ssts = document->css.stylesheets;
for (size_t i = 0; i < lexbor_array_length(ssts); i++) {
sst = lexbor_array_get(ssts, i);
list = lxb_css_rule_list(sst->root);
rule = list->first;
while (rule != NULL) {
switch (rule->type) {
case LXB_CSS_RULE_STYLE:
status = lxb_html_document_style_attach_by_element(document,
element, lxb_css_rule_style(rule));
break;
default:
break;
}
if (status != LXB_STATUS_OK) {
/* FIXME: what to do with an error? */
}
rule = rule->next;
}
}
return LXB_STATUS_OK;
}
void
lxb_html_document_stylesheet_destroy_all(lxb_html_document_t *document,
bool destroy_memory)
{
#if 0
size_t length;
lxb_css_stylesheet_t *sst;
lxb_html_document_css_t *css = &document->css;
length = lexbor_array_length(css->stylesheets);
for (size_t i = 0; i < length; i++) {
sst = lexbor_array_pop(css->stylesheets);
(void) lxb_css_stylesheet_destroy(sst, destroy_memory);
}
#endif
}
lxb_status_t
lxb_html_document_style_attach(lxb_html_document_t *document,
lxb_css_rule_style_t *style)
{
#if 0
lxb_html_document_css_t *css = &document->css;
return lxb_selectors_find(css->selectors, lxb_dom_interface_node(document),
style->selector, lxb_html_document_style_cb, style);
#endif
return LXB_STATUS_OK;
}
lxb_status_t
lxb_html_document_style_remove(lxb_html_document_t *document,
lxb_css_rule_style_t *style)
{
#if 0
lxb_html_document_css_t *css = &document->css;
return lxb_selectors_find(css->selectors, lxb_dom_interface_node(document),
style->selector,
lxb_html_document_style_remove_by_rule_cb, style);
#endif
return LXB_STATUS_OK;
}
#if 0
static lxb_status_t
lxb_html_document_style_remove_by_rule_cb(lxb_dom_node_t *node,
lxb_css_selector_specificity_t spec,
void *ctx)
{
lxb_html_element_t *el;
lxb_html_document_t *doc;
lxb_css_rule_style_t *style = ctx;
lxb_html_document_remove_ctx_t context;
/* FIXME: we don't have support for anything other than HTML. */
if (node->ns != LXB_NS_HTML) {
return LXB_STATUS_OK;
}
el = lxb_html_interface_element(node);
if (el->style == NULL) {
return LXB_STATUS_OK;
}
doc = lxb_html_interface_document(node->owner_document);
context.doc = doc;
context.list = style->declarations;
return lexbor_avl_foreach(doc->css.styles, &el->style,
lxb_html_document_style_remove_avl_cb, &context);
}
static lxb_status_t
lxb_html_document_style_remove_avl_cb(lexbor_avl_t *avl,
lexbor_avl_node_t **root,
lexbor_avl_node_t *node, void *ctx)
{
lxb_html_document_remove_ctx_t *context = ctx;
lxb_html_style_node_t *style = (lxb_html_style_node_t *) node;
if (context->list == NULL) {
return LXB_STATUS_OK;
}
lxb_html_element_style_remove_by_list(context->doc, root,
style, context->list);
return LXB_STATUS_OK;
}
#endif
lxb_status_t
lxb_html_document_style_attach_by_element(lxb_html_document_t *document,
lxb_html_element_t *element,
lxb_css_rule_style_t *style)
{
#if 0
lxb_html_document_css_t *css = &document->css;
return lxb_selectors_match_node(css->selectors,
lxb_dom_interface_node(element),
style->selector,
lxb_html_document_style_cb, style);
#endif
return LXB_STATUS_OK;
}
#if 0
static lxb_status_t
lxb_html_document_style_cb(lxb_dom_node_t *node,
lxb_css_selector_specificity_t spec, void *ctx)
{
lxb_css_rule_style_t *style = ctx;
// FIXME: we don't have support for anything other than HTML.
if (node->ns != LXB_NS_HTML) {
return LXB_STATUS_OK;
}
/* Valid behavior when there are no declarations in the style. */
if (style->declarations == NULL) {
return LXB_STATUS_OK;
}
return lxb_html_element_style_list_append(lxb_html_interface_element(node),
style->declarations, spec);
}
#endif
lxb_html_document_t *
lxb_html_document_destroy(lxb_html_document_t *document)
{
@@ -894,33 +286,6 @@ lxb_html_document_parser_prepare(lxb_html_document_t *document)
return LXB_STATUS_OK;
}
#if 0
static lxb_status_t
lxb_html_document_done(lxb_html_document_t *document)
{
size_t i, length;
lxb_status_t status;
lxb_css_stylesheet_t *sst;
if (!document->css_init) {
return LXB_STATUS_OK;
}
length = lexbor_array_length(document->css.stylesheets);
for (i = 0; i < length; i++) {
sst = lexbor_array_get(document->css.stylesheets, i);
status = lxb_html_document_stylesheet_apply(document, sst);
if (status != LXB_STATUS_OK) {
return status;
}
}
return LXB_STATUS_OK;
}
#endif
const lxb_char_t *
lxb_html_document_title(lxb_html_document_t *document, size_t *len)
{
@@ -1007,280 +372,6 @@ lxb_html_document_import_node(lxb_html_document_t *doc, lxb_dom_node_t *node,
return lxb_dom_document_import_node(&doc->dom_document, node, deep);
}
#if 0
static lxb_status_t
lxb_html_document_event_insert(lxb_dom_node_t *node)
{
lxb_status_t status;
lxb_html_document_t *doc;
lxb_html_style_element_t *style;
if (node->type == LXB_DOM_NODE_TYPE_ATTRIBUTE) {
return lxb_html_document_event_insert_attribute(node);
}
else if (node->type != LXB_DOM_NODE_TYPE_ELEMENT) {
return LXB_STATUS_OK;
}
// FIXME: we don't have support for anything other than HTML.
if (node->ns != LXB_NS_HTML) {
return LXB_STATUS_OK;
}
if (node->local_name == LXB_TAG_STYLE) {
style = lxb_html_interface_style(node);
status = lxb_html_style_element_parse(style);
if (status != LXB_STATUS_OK) {
return status;
}
doc = lxb_html_interface_document(node->owner_document);
status = lxb_html_document_stylesheet_attach(doc, style->stylesheet);
if (status != LXB_STATUS_OK) {
return status;
}
}
return lxb_html_document_element_styles_attach(lxb_html_interface_element(node));
}
static lxb_status_t
lxb_html_document_event_insert_attribute(lxb_dom_node_t *node)
{
lxb_status_t status;
lxb_dom_attr_t *attr;
lxb_html_element_t *el;
if (node->type != LXB_DOM_NODE_TYPE_ATTRIBUTE
|| node->local_name != LXB_DOM_ATTR_STYLE)
{
return LXB_STATUS_OK;
}
// FIXME: we don't have support for anything other than HTML.
if (node->ns != LXB_NS_HTML) {
return LXB_STATUS_OK;
}
attr = lxb_dom_interface_attr(node);
el = lxb_html_interface_element(attr->owner);
if (el != NULL && el->list != NULL) {
status = lxb_html_document_event_remove_attribute(node);
if (status != LXB_STATUS_OK) {
return status;
}
}
if (attr->value == NULL || attr->value->data == NULL) {
return LXB_STATUS_OK;
}
return lxb_html_element_style_parse(el, attr->value->data,
attr->value->length);
}
static lxb_status_t
lxb_html_document_event_remove(lxb_dom_node_t *node)
{
lxb_status_t status;
lxb_html_element_t *el;
lxb_html_document_t *doc;
lxb_html_document_event_ctx_t context;
if (node->type == LXB_DOM_NODE_TYPE_ATTRIBUTE) {
return lxb_html_document_event_remove_attribute(node);
}
else if (node->type != LXB_DOM_NODE_TYPE_ELEMENT) {
return LXB_STATUS_OK;
}
// FIXME: we don't have support for anything other than HTML.
if (node->ns != LXB_NS_HTML) {
return LXB_STATUS_OK;
}
if (node->local_name == LXB_TAG_STYLE) {
status = lxb_html_element_style_remove((lxb_html_style_element_t *) node);
if (status != LXB_STATUS_OK) {
return status;
}
}
el = lxb_html_interface_element(node);
if (el->style == NULL) {
return LXB_STATUS_OK;
}
doc = lxb_html_interface_document(node->owner_document);
context.doc = doc;
context.all = false;
return lexbor_avl_foreach(doc->css.styles, &el->style,
lxb_html_document_style_remove_cb, &context);
}
static lxb_status_t
lxb_html_document_style_remove_cb(lexbor_avl_t *avl, lexbor_avl_node_t **root,
lexbor_avl_node_t *node, void *ctx)
{
lxb_html_document_event_ctx_t *context = ctx;
lxb_html_style_node_t *style = (lxb_html_style_node_t *) node;
if (context->all) {
lxb_html_element_style_remove_all(context->doc, root, style);
}
lxb_html_element_style_remove_all_not(context->doc, root, style, false);
return LXB_STATUS_OK;
}
static lxb_status_t
lxb_html_document_event_remove_attribute(lxb_dom_node_t *node)
{
lxb_status_t status;
lxb_dom_attr_t *attr;
lxb_html_element_t *el;
lxb_html_document_t *doc;
lxb_html_document_event_ctx_t context;
// FIXME: we don't have support for anything other than HTML.
if (node->local_name != LXB_DOM_ATTR_STYLE || node->ns != LXB_NS_HTML) {
return LXB_STATUS_OK;
}
attr = lxb_dom_interface_attr(node);
el = lxb_html_interface_element(attr->owner);
if (el == NULL || el->list == NULL) {
return LXB_STATUS_OK;
}
doc = lxb_html_interface_document(node->owner_document);
context.doc = doc;
status = lexbor_avl_foreach(doc->css.styles, &el->style,
lxb_html_document_style_remove_my_cb, &context);
if (status != LXB_STATUS_OK) {
return status;
}
el->list->first = NULL;
el->list->last = NULL;
el->list = lxb_css_rule_declaration_list_destroy(el->list, true);
return LXB_STATUS_OK;
}
static lxb_status_t
lxb_html_document_style_remove_my_cb(lexbor_avl_t *avl, lexbor_avl_node_t **root,
lexbor_avl_node_t *node, void *ctx)
{
lxb_html_document_event_ctx_t *context = ctx;
lxb_html_style_node_t *style = (lxb_html_style_node_t *) node;
lxb_html_element_style_remove_all_not(context->doc, root, style, true);
return LXB_STATUS_OK;
}
static lxb_status_t
lxb_html_document_event_destroy(lxb_dom_node_t *node)
{
lxb_status_t status;
lxb_html_element_t *el;
lxb_html_document_t *doc;
lxb_html_document_event_ctx_t context;
if (node->type == LXB_DOM_NODE_TYPE_ATTRIBUTE) {
return lxb_html_document_event_remove_attribute(node);
}
else if (node->type != LXB_DOM_NODE_TYPE_ELEMENT) {
return LXB_STATUS_OK;
}
// FIXME: we don't have support for anything other than HTML.
if (node->ns != LXB_NS_HTML) {
return LXB_STATUS_OK;
}
el = lxb_html_interface_element(node);
if (el->style == NULL) {
if (el->list != NULL) {
goto destroy;
}
return LXB_STATUS_OK;
}
doc = lxb_html_interface_document(node->owner_document);
context.doc = doc;
context.all = true;
status = lexbor_avl_foreach(doc->css.styles, &el->style,
lxb_html_document_style_remove_cb, &context);
if (status != LXB_STATUS_OK) {
return status;
}
destroy:
el->list->first = NULL;
el->list->last = NULL;
el->list = lxb_css_rule_declaration_list_destroy(el->list, true);
return LXB_STATUS_OK;
}
static lxb_status_t
lxb_html_document_event_set_value(lxb_dom_node_t *node,
const lxb_char_t *value, size_t length)
{
lxb_status_t status;
lxb_dom_attr_t *attr = lxb_dom_interface_attr(node);
if (node->type != LXB_DOM_NODE_TYPE_ATTRIBUTE
|| node->local_name != LXB_DOM_ATTR_STYLE)
{
return LXB_STATUS_OK;
}
// FIXME: we don't have support for anything other than HTML.
if (node->ns != LXB_NS_HTML) {
return LXB_STATUS_OK;
}
if (attr->owner == NULL) {
return LXB_STATUS_OK;
}
status = lxb_html_document_event_remove_attribute(node);
if (status != LXB_STATUS_OK) {
return status;
}
return lxb_html_element_style_parse(lxb_html_interface_element(node),
value, length);
}
#endif
/*
* No inline functions for ABI.
*/

View File

@@ -12,19 +12,19 @@ extern "C" {
#endif
#include "lexbor/core/mraw.h"
#include "lexbor/core/avl.h"
#include "lexbor/tag/tag.h"
#include "lexbor/ns/ns.h"
#include "lexbor/html/interface.h"
#include "lexbor/dom/interfaces/attr.h"
#include "lexbor/dom/interfaces/document.h"
#include "lexbor/css/css.h"
typedef lxb_status_t
(*lxb_html_document_done_cb_f)(lxb_html_document_t *document);
typedef lxb_status_t
(*lxb_html_document_parse_cb_f)(lxb_html_tree_t *tree, lxb_dom_node_t *node);
typedef unsigned int lxb_html_document_opt_t;
typedef enum {
@@ -41,34 +41,25 @@ enum lxb_html_document_opt {
};
typedef struct {
lxb_css_memory_t *memory;
lxb_css_selectors_t *css_selectors;
lxb_css_parser_t *parser;
lexbor_avl_t *styles;
lexbor_array_t *stylesheets;
lexbor_dobject_t *weak;
lexbor_hash_t *customs;
uintptr_t customs_id;
lxb_html_document_parse_cb_f script;
lxb_html_document_parse_cb_f style;
}
lxb_html_document_css_t;
lxb_html_document_parse_cb_t;
struct lxb_html_document {
lxb_dom_document_t dom_document;
lxb_dom_document_t dom_document;
void *iframe_srcdoc;
void *iframe_srcdoc;
lxb_html_head_element_t *head;
lxb_html_body_element_t *body;
lxb_html_head_element_t *head;
lxb_html_body_element_t *body;
lxb_html_document_css_t css;
bool css_init;
const lxb_html_document_parse_cb_t *parse_cb;
lxb_html_document_done_cb_f done;
lxb_html_document_ready_state_t ready_state;
lxb_html_document_done_cb_f done;
lxb_html_document_ready_state_t ready_state;
lxb_html_document_opt_t opt;
lxb_html_document_opt_t opt;
};
@@ -88,73 +79,6 @@ lxb_html_document_clean(lxb_html_document_t *document);
LXB_API lxb_html_document_t *
lxb_html_document_destroy(lxb_html_document_t *document);
LXB_API lxb_status_t
lxb_html_document_css_init(lxb_html_document_t *document);
LXB_API void
lxb_html_document_css_destroy(lxb_html_document_t *document);
LXB_API void
lxb_html_document_css_clean(lxb_html_document_t *document);
LXB_API void
lxb_html_document_css_parser_attach(lxb_html_document_t *document,
lxb_css_parser_t *parser);
LXB_API void
lxb_html_document_css_memory_attach(lxb_html_document_t *document,
lxb_css_memory_t *memory);
LXB_API uintptr_t
lxb_html_document_css_customs_find_id(lxb_html_document_t *document,
const lxb_char_t *key, size_t length);
LXB_API uintptr_t
lxb_html_document_css_customs_id(lxb_html_document_t *document,
const lxb_char_t *key, size_t length);
LXB_API lxb_status_t
lxb_html_document_stylesheet_attach(lxb_html_document_t *document,
lxb_css_stylesheet_t *sst);
LXB_API lxb_status_t
lxb_html_document_stylesheet_apply(lxb_html_document_t *document,
lxb_css_stylesheet_t *sst);
LXB_API lxb_status_t
lxb_html_document_stylesheet_add(lxb_html_document_t *document,
lxb_css_stylesheet_t *sst);
LXB_API lxb_status_t
lxb_html_document_stylesheet_remove(lxb_html_document_t *document,
lxb_css_stylesheet_t *sst);
LXB_API lxb_status_t
lxb_html_document_element_styles_attach(lxb_html_element_t *element);
LXB_API void
lxb_html_document_stylesheet_destroy_all(lxb_html_document_t *document,
bool destroy_memory);
LXB_API lxb_status_t
lxb_html_document_style_attach(lxb_html_document_t *document,
lxb_css_rule_style_t *style);
LXB_API lxb_status_t
lxb_html_document_style_remove(lxb_html_document_t *document,
lxb_css_rule_style_t *style);
LXB_API lxb_status_t
lxb_html_document_style_attach_by_element(lxb_html_document_t *document,
lxb_html_element_t *element,
lxb_css_rule_style_t *style);
LXB_API lxb_status_t
lxb_html_document_css_customs_init(lxb_html_document_t *document);
LXB_API void
lxb_html_document_css_customs_destroy(lxb_html_document_t *document);
LXB_API lxb_status_t
lxb_html_document_parse(lxb_html_document_t *document,
const lxb_char_t *html, size_t size);
@@ -294,6 +218,32 @@ lxb_html_document_destroy_element(lxb_dom_element_t *element)
return lxb_dom_document_destroy_element(element);
}
lxb_inline const lxb_html_document_parse_cb_t *
lxb_html_document_parse_cb(lxb_html_document_t *document)
{
return document->parse_cb;
}
lxb_inline void
lxb_html_document_parse_cb_set(lxb_html_document_t *document,
const lxb_html_document_parse_cb_t *parse_cb)
{
document->parse_cb = parse_cb;
}
lxb_inline lxb_html_document_done_cb_f
lxb_html_document_done(lxb_html_document_t *document)
{
return document->done;
}
lxb_inline void
lxb_html_document_done_set(lxb_html_document_t *document,
lxb_html_document_done_cb_f done_cb)
{
document->done = done_cb;
}
/*
* No inline functions for ABI.
*/

View File

@@ -4,47 +4,10 @@
* Author: Alexander Borisov <borisov@lexbor.com>
*/
#include "lexbor/html/style.h"
#include "lexbor/html/interfaces/element.h"
#include "lexbor/html/interfaces/document.h"
typedef struct {
lexbor_str_t *str;
lexbor_mraw_t *mraw;
}
lxb_html_element_style_ctx_t;
typedef struct {
lxb_html_element_t *element;
lxb_html_element_style_cb_f cb;
void *ctx;
bool weak;
}
lxb_html_element_walk_ctx_t;
static lxb_status_t
lxb_html_element_style_walk_cb(lexbor_avl_t *avl, lexbor_avl_node_t **root,
lexbor_avl_node_t *node, void *ctx);
static lxb_status_t
lxb_html_element_style_weak_append(lxb_html_document_t *doc,
lxb_html_style_node_t *node,
lxb_css_rule_declaration_t *declr,
lxb_css_selector_specificity_t spec);
static lxb_status_t
lxb_html_element_style_serialize_cb(lexbor_avl_t *avl, lexbor_avl_node_t **root,
lexbor_avl_node_t *node, void *ctx);
#if 0
static lxb_status_t
lxb_html_element_style_serialize_str_cb(const lxb_char_t *data,
size_t len, void *ctx);
#endif
lxb_html_element_t *
lxb_html_element_interface_create(lxb_html_document_t *document)
{
@@ -99,563 +62,3 @@ lxb_html_element_inner_html_set(lxb_html_element_t *element,
return lxb_html_interface_element(root);
}
const lxb_css_rule_declaration_t *
lxb_html_element_style_by_name(lxb_html_element_t *element,
const lxb_char_t *name, size_t size)
{
#if 0
uintptr_t id;
lxb_html_style_node_t *node;
lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
lxb_html_document_t *doc = lxb_html_interface_document(ddoc);
id = lxb_html_style_id_by_name(doc, name, size);
if (id == LXB_CSS_PROPERTY__UNDEF) {
return NULL;
}
node = (void *) lexbor_avl_search(doc->css.styles, element->style, id);
return (node != NULL) ? node->entry.value : NULL;
#endif
return NULL;
}
const lxb_css_rule_declaration_t *
lxb_html_element_style_by_id(lxb_html_element_t *element, uintptr_t id)
{
#if 0
const lxb_html_style_node_t *node;
node = lxb_html_element_style_node_by_id(element, id);
if (node == NULL) {
return NULL;
}
return node->entry.value;
#endif
return NULL;
}
const lxb_html_style_node_t *
lxb_html_element_style_node_by_id(lxb_html_element_t *element, uintptr_t id)
{
lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
lxb_html_document_t *doc = lxb_html_interface_document(ddoc);
return (lxb_html_style_node_t *) lexbor_avl_search(doc->css.styles,
element->style, id);
}
const lxb_html_style_node_t *
lxb_html_element_style_node_by_name(lxb_html_element_t *element,
const lxb_char_t *name, size_t size)
{
#if 0
uintptr_t id;
lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
lxb_html_document_t *doc = lxb_html_interface_document(ddoc);
id = lxb_html_style_id_by_name(doc, name, size);
if (id == LXB_CSS_PROPERTY__UNDEF) {
return NULL;
}
return (lxb_html_style_node_t *) lexbor_avl_search(doc->css.styles,
element->style, id);
#endif
return NULL;
}
const void *
lxb_html_element_css_property_by_id(lxb_html_element_t *element, uintptr_t id)
{
#if 0
lxb_css_rule_declaration_t *declr;
const lxb_html_style_node_t *node;
node = lxb_html_element_style_node_by_id(element, id);
if (node == NULL) {
return lxb_css_property_initial_by_id(id);
}
declr = node->entry.value;
return declr->u.user;
#endif
return NULL;
}
lxb_status_t
lxb_html_element_style_walk(lxb_html_element_t *element,
lxb_html_element_style_cb_f cb, void *ctx,
bool with_weak)
{
lxb_html_element_walk_ctx_t walk;
walk.element = element;
walk.cb = cb;
walk.ctx = ctx;
walk.weak = with_weak;
return lexbor_avl_foreach(NULL, &element->style,
lxb_html_element_style_walk_cb, &walk);
}
static lxb_status_t
lxb_html_element_style_walk_cb(lexbor_avl_t *avl, lexbor_avl_node_t **root,
lexbor_avl_node_t *node, void *ctx)
{
lxb_status_t status;
lxb_html_style_weak_t *weak;
lxb_html_style_node_t *style;
lxb_html_element_walk_ctx_t *walk = ctx;
style = (lxb_html_style_node_t *) node;
status = walk->cb(walk->element, node->value, walk->ctx, style->sp, false);
if (status != LXB_STATUS_OK) {
return status;
}
weak = style->weak;
while (weak != NULL) {
status = walk->cb(walk->element, weak->value, walk->ctx,
weak->sp, true);
if (status != LXB_STATUS_OK) {
return status;
}
weak = weak->next;
}
return LXB_STATUS_OK;
}
lxb_status_t
lxb_html_element_style_parse(lxb_html_element_t *element,
const lxb_char_t *style, size_t size)
{
#if 0
lxb_css_rule_declaration_list_t *list;
lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
lxb_html_document_t *doc = lxb_html_interface_document(ddoc);
lxb_html_document_css_t *css = &doc->css;
list = lxb_css_declaration_list_parse(css->parser, css->memory,
style, size);
if (list == NULL) {
return css->parser->status;
}
element->list = list;
return lxb_html_element_style_list_append(element, list,
lxb_css_selector_sp_up_s(0));
#endif
return LXB_STATUS_ERROR;
}
lxb_status_t
lxb_html_element_style_append(lxb_html_element_t *element,
lxb_css_rule_declaration_t *declr,
lxb_css_selector_specificity_t spec)
{
uintptr_t id;
lxb_status_t status;
lexbor_str_t *name;
lxb_html_style_node_t *node;
lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
lxb_html_document_t *doc = lxb_html_interface_document(ddoc);
lxb_html_document_css_t *css = &doc->css;
id = declr->type;
lxb_css_selector_sp_set_i(spec, declr->important);
if (id == LXB_CSS_PROPERTY__CUSTOM) {
name = &declr->u.custom->name;
id = lxb_html_document_css_customs_id(doc, name->data,
name->length);
if (id == 0) {
/* FIXME: what to do with an error? */
return LXB_STATUS_ERROR;
}
}
node = (void *) lexbor_avl_search(css->styles, element->style, id);
if (node != NULL) {
if (spec < node->sp) {
return lxb_html_element_style_weak_append(doc, node, declr, spec);
}
status = lxb_html_element_style_weak_append(doc, node,
node->entry.value, node->sp);
if (status != LXB_STATUS_OK) {
return status;
}
lxb_css_rule_ref_dec(node->entry.value);
node->entry.value = declr;
node->sp = spec;
return LXB_STATUS_OK;
}
node = (void *) lexbor_avl_insert(css->styles, &element->style,
id, declr);
if (node == NULL) {
/* FIXME: what to do with an error? */
return LXB_STATUS_ERROR;
}
node->sp = spec;
return lxb_css_rule_ref_inc(lxb_css_rule(declr));
}
static lxb_status_t
lxb_html_element_style_weak_append(lxb_html_document_t *doc,
lxb_html_style_node_t *node,
lxb_css_rule_declaration_t *declr,
lxb_css_selector_specificity_t spec)
{
lxb_html_style_weak_t *weak, *prev, *new_weak;
new_weak = lexbor_dobject_alloc(doc->css.weak);
if (new_weak == NULL) {
return LXB_STATUS_ERROR_MEMORY_ALLOCATION;
}
new_weak->value = declr;
new_weak->sp = spec;
if (node->weak == NULL) {
node->weak = new_weak;
new_weak->next = NULL;
goto done;
}
weak = node->weak;
if (weak->sp <= spec) {
node->weak = new_weak;
new_weak->next = weak;
goto done;
}
prev = weak;
weak = weak->next;
while (weak != NULL) {
if (weak->sp <= spec) {
prev->next = new_weak;
new_weak->next = weak;
goto done;
}
prev = weak;
weak = weak->next;
}
prev->next = new_weak;
new_weak->next = NULL;
done:
return lxb_css_rule_ref_inc(lxb_css_rule(declr));
}
lxb_status_t
lxb_html_element_style_list_append(lxb_html_element_t *element,
lxb_css_rule_declaration_list_t *list,
lxb_css_selector_specificity_t spec)
{
lxb_status_t status;
lxb_css_rule_t *rule;
lxb_css_rule_declaration_t *declr;
rule = list->first;
while (rule != NULL) {
if (rule->type != LXB_CSS_RULE_DECLARATION) {
goto next;
}
declr = lxb_css_rule_declaration(rule);
status = lxb_html_element_style_append(element, declr, spec);
if (status != LXB_STATUS_OK) {
/* FIXME: what to do with an error? */
}
next:
rule = rule->next;
}
return LXB_STATUS_OK;
}
void
lxb_html_element_style_remove_by_name(lxb_html_element_t *element,
const lxb_char_t *name, size_t size)
{
#if 0
uintptr_t id;
lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
lxb_html_document_t *doc = lxb_html_interface_document(ddoc);
id = lxb_html_style_id_by_name(doc, name, size);
if (id == LXB_CSS_PROPERTY__UNDEF) {
return;
}
lxb_html_element_style_remove_by_id(element, id);
#endif
}
void
lxb_html_element_style_remove_by_id(lxb_html_element_t *element, uintptr_t id)
{
#if 0
lxb_html_style_node_t *node;
lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
lxb_html_document_t *doc = lxb_html_interface_document(ddoc);
node = (lxb_html_style_node_t *) lexbor_avl_search(doc->css.styles,
element->style, id);
if (node != NULL) {
lxb_html_element_style_remove_all(doc, &element->style, node);
}
#endif
}
lxb_html_style_node_t *
lxb_html_element_style_remove_all_not(lxb_html_document_t *doc,
lexbor_avl_node_t **root,
lxb_html_style_node_t *style, bool bs)
{
lxb_html_style_weak_t *weak, *prev, *next;
weak = style->weak;
prev = NULL;
while (weak != NULL) {
next = weak->next;
if (lxb_css_selector_sp_s(weak->sp) == bs) {
lxb_css_rule_ref_dec_destroy(weak->value);
lexbor_dobject_free(doc->css.weak, weak);
if (prev != NULL) {
prev->next = next;
}
else {
style->weak = next;
}
}
else {
prev = weak;
}
weak = next;
}
if (lxb_css_selector_sp_s(style->sp) != bs) {
return style;
}
lxb_css_rule_ref_dec_destroy(style->entry.value);
if (style->weak == NULL) {
lexbor_avl_remove_by_node(doc->css.styles, root,
(lexbor_avl_node_t *) style);
return NULL;
}
weak = style->weak;
style->entry.value = weak->value;
style->sp = weak->sp;
style->weak = weak->next;
lexbor_dobject_free(doc->css.weak, weak);
return style;
}
lxb_html_style_node_t *
lxb_html_element_style_remove_all(lxb_html_document_t *doc,
lexbor_avl_node_t **root,
lxb_html_style_node_t *style)
{
lxb_html_style_weak_t *weak, *next;
weak = style->weak;
while (weak != NULL) {
next = weak->next;
lxb_css_rule_ref_dec_destroy(weak->value);
lexbor_dobject_free(doc->css.weak, weak);
weak = next;
}
lxb_css_rule_ref_dec_destroy(style->entry.value);
lexbor_avl_remove_by_node(doc->css.styles, root,
(lexbor_avl_node_t *) style);
return NULL;
}
lxb_html_style_node_t *
lxb_html_element_style_remove_by_list(lxb_html_document_t *doc,
lexbor_avl_node_t **root,
lxb_html_style_node_t *style,
lxb_css_rule_declaration_list_t *list)
{
lxb_html_style_weak_t *weak, *prev, *next;
weak = style->weak;
prev = NULL;
while (weak != NULL) {
next = weak->next;
if (((lxb_css_rule_declaration_t *) weak->value)->rule.parent
== (lxb_css_rule_t *) list)
{
lxb_css_rule_ref_dec_destroy(weak->value);
lexbor_dobject_free(doc->css.weak, weak);
if (prev != NULL) {
prev->next = next;
}
else {
style->weak = next;
}
}
else {
prev = weak;
}
weak = next;
}
if (((lxb_css_rule_declaration_t *) style->entry.value)->rule.parent
!= (lxb_css_rule_t *) list)
{
return style;
}
lxb_css_rule_ref_dec_destroy(style->entry.value);
if (style->weak == NULL) {
lexbor_avl_remove_by_node(doc->css.styles, root,
(lexbor_avl_node_t *) style);
return NULL;
}
weak = style->weak;
style->entry.value = weak->value;
style->sp = weak->sp;
style->weak = weak->next;
lexbor_dobject_free(doc->css.weak, weak);
return style;
}
lxb_status_t
lxb_html_element_style_serialize(lxb_html_element_t *element,
lxb_html_element_style_opt_t opt,
lexbor_serialize_cb_f cb, void *ctx)
{
lexbor_serialize_ctx_t context;
context.cb = cb;
context.ctx = ctx;
context.opt = opt;
context.count = 0;
return lexbor_avl_foreach(NULL, &element->style,
lxb_html_element_style_serialize_cb, &context);
}
static lxb_status_t
lxb_html_element_style_serialize_cb(lexbor_avl_t *avl, lexbor_avl_node_t **root,
lexbor_avl_node_t *node, void *ctx)
{
#if 0
lxb_status_t status;
lexbor_serialize_ctx_t *context = ctx;
static const lexbor_str_t splt = lexbor_str("; ");
if (context->count > 0) {
lexbor_serialize_write(context->cb, splt.data, splt.length,
context->ctx, status);
}
context->count = 1;
return lxb_css_rule_serialize(node->value, context->cb, context->ctx);
#endif
return LXB_STATUS_ERROR;
}
lxb_status_t
lxb_html_element_style_serialize_str(lxb_html_element_t *element,
lexbor_str_t *str,
lxb_html_element_style_opt_t opt)
{
#if 0
lxb_dom_document_t *doc;
lxb_html_element_style_ctx_t context;
doc = lxb_dom_interface_node(element)->owner_document;
if (str->data == NULL) {
lexbor_str_init(str, doc->text, 1024);
if (str->data == NULL) {
return LXB_STATUS_ERROR_MEMORY_ALLOCATION;
}
}
context.str = str;
context.mraw = doc->text;
return lxb_html_element_style_serialize(element, opt,
lxb_html_element_style_serialize_str_cb, &context);
#endif
return LXB_STATUS_ERROR;
}
#if 0
static lxb_status_t
lxb_html_element_style_serialize_str_cb(const lxb_char_t *data,
size_t len, void *ctx)
{
lxb_char_t *ret;
lxb_html_element_style_ctx_t *context = ctx;
ret = lexbor_str_append(context->str, context->mraw, data, len);
if (ret == NULL) {
return LXB_STATUS_ERROR_MEMORY_ALLOCATION;
}
return LXB_STATUS_OK;
}
#endif

View File

@@ -11,32 +11,14 @@
extern "C" {
#endif
#include "lexbor/core/avl.h"
#include "lexbor/html/interface.h"
#include "lexbor/html/style.h"
#include "lexbor/dom/interfaces/element.h"
#include "lexbor/css/rule.h"
struct lxb_html_element {
lxb_dom_element_t element;
lexbor_avl_node_t *style;
lxb_css_rule_declaration_list_t *list;
lxb_dom_element_t element;
};
typedef enum {
LXB_HTML_ELEMENT_OPT_UNDEF = 0x00
}
lxb_html_element_style_opt_t;
typedef lxb_status_t
(*lxb_html_element_style_cb_f)(lxb_html_element_t *element,
const lxb_css_rule_declaration_t *declr,
void *ctx, lxb_css_selector_specificity_t spec,
bool is_weak);
LXB_API lxb_html_element_t *
lxb_html_element_interface_create(lxb_html_document_t *document);
@@ -49,76 +31,6 @@ LXB_API lxb_html_element_t *
lxb_html_element_inner_html_set(lxb_html_element_t *element,
const lxb_char_t *html, size_t size);
LXB_API const lxb_css_rule_declaration_t *
lxb_html_element_style_by_name(lxb_html_element_t *element,
const lxb_char_t *name, size_t size);
LXB_API const lxb_css_rule_declaration_t *
lxb_html_element_style_by_id(lxb_html_element_t *element, uintptr_t id);
LXB_API const lxb_html_style_node_t *
lxb_html_element_style_node_by_id(lxb_html_element_t *element, uintptr_t id);
LXB_API const lxb_html_style_node_t *
lxb_html_element_style_node_by_name(lxb_html_element_t *element,
const lxb_char_t *name, size_t size);
LXB_API const void *
lxb_html_element_css_property_by_id(lxb_html_element_t *element, uintptr_t id);
LXB_API lxb_status_t
lxb_html_element_style_walk(lxb_html_element_t *element,
lxb_html_element_style_cb_f cb, void *ctx,
bool with_weak);
LXB_API lxb_status_t
lxb_html_element_style_parse(lxb_html_element_t *element,
const lxb_char_t *style, size_t size);
LXB_API lxb_status_t
lxb_html_element_style_append(lxb_html_element_t *element,
lxb_css_rule_declaration_t *declr,
lxb_css_selector_specificity_t spec);
LXB_API lxb_status_t
lxb_html_element_style_list_append(lxb_html_element_t *element,
lxb_css_rule_declaration_list_t *list,
lxb_css_selector_specificity_t spec);
LXB_API void
lxb_html_element_style_remove_by_id(lxb_html_element_t *element, uintptr_t id);
LXB_API void
lxb_html_element_style_remove_by_name(lxb_html_element_t *element,
const lxb_char_t *name, size_t size);
LXB_API lxb_html_style_node_t *
lxb_html_element_style_remove_all_not(lxb_html_document_t *doc,
lexbor_avl_node_t **root,
lxb_html_style_node_t *style, bool bs);
LXB_API lxb_html_style_node_t *
lxb_html_element_style_remove_all(lxb_html_document_t *doc,
lexbor_avl_node_t **root,
lxb_html_style_node_t *style);
LXB_API lxb_html_style_node_t *
lxb_html_element_style_remove_by_list(lxb_html_document_t *doc,
lexbor_avl_node_t **root,
lxb_html_style_node_t *style,
lxb_css_rule_declaration_list_t *list);
LXB_API lxb_status_t
lxb_html_element_style_serialize(lxb_html_element_t *element,
lxb_html_element_style_opt_t opt,
lexbor_serialize_cb_f cb, void *ctx);
LXB_API lxb_status_t
lxb_html_element_style_serialize_str(lxb_html_element_t *element,
lexbor_str_t *str,
lxb_html_element_style_opt_t opt);
/*
* Inline functions
*/

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018 Alexander Borisov
* Copyright (C) 2018-2025 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -30,64 +30,7 @@ lxb_html_style_element_interface_create(lxb_html_document_t *document)
lxb_html_style_element_t *
lxb_html_style_element_interface_destroy(lxb_html_style_element_t *style_element)
{
lxb_css_stylesheet_t *sst = style_element->stylesheet;
(void) lxb_dom_node_interface_destroy(lxb_dom_interface_node(style_element));
if (sst != NULL) {
#if 0
(void) lxb_css_stylesheet_destroy(sst, true);
#endif
}
return NULL;
}
lxb_status_t
lxb_html_style_element_parse(lxb_html_style_element_t *element)
{
#if 0
lexbor_str_t *str;
lxb_dom_text_t *text;
#endif
lxb_dom_node_t *node;
lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
lxb_html_document_t *doc = lxb_html_interface_document(ddoc);
lxb_html_document_css_t *css = &doc->css;
node = lxb_dom_interface_node(element);
if (node->first_child == NULL
|| node->first_child->local_name != LXB_TAG__TEXT
|| node->first_child != node->last_child)
{
return LXB_STATUS_OK;
}
#if 0
text = lxb_dom_interface_text(lxb_dom_interface_node(element)->first_child);
str = &text->char_data.data;
element->stylesheet = lxb_css_stylesheet_parse(css->parser, str->data,
str->length);
#endif
if (element->stylesheet == NULL) {
return css->parser->status;
}
element->stylesheet->element = element;
return LXB_STATUS_OK;
}
lxb_status_t
lxb_html_element_style_remove(lxb_html_style_element_t *style)
{
lxb_dom_document_t *ddoc = lxb_dom_interface_node(style)->owner_document;
lxb_html_document_t *doc = lxb_html_interface_document(ddoc);
lxb_html_document_stylesheet_remove(doc, style->stylesheet);
return LXB_STATUS_OK;
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2023 Alexander Borisov
* Copyright (C) 2018-2025 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -17,7 +17,7 @@ extern "C" {
struct lxb_html_style_element {
lxb_html_element_t element;
lxb_css_stylesheet_t *stylesheet;
void *stylesheet; /* lxb_css_stylesheet_t */
};

View File

@@ -53,6 +53,12 @@ lxb_html_node_is_void(lxb_dom_node_t *node)
return false;
}
lxb_inline bool
lxb_html_node_is(const lxb_dom_node_t *node, lxb_tag_id_t tag_id)
{
return node->local_name == tag_id && node->ns == LXB_NS_HTML;
}
/*
* No inline functions for ABI.
*/

View File

@@ -279,7 +279,7 @@ lxb_html_tokenizer_state_data(lxb_html_tokenizer_t *tkz,
if (tkz->is_eof) {
/* Emit TEXT node if not empty */
if (tkz->token->begin != NULL) {
lxb_html_tokenizer_state_token_set_end_oef(tkz);
lxb_html_tokenizer_state_token_set_end_eof(tkz);
}
if (tkz->token->begin != tkz->token->end) {
@@ -377,7 +377,7 @@ lxb_html_tokenizer_state_plaintext(lxb_html_tokenizer_t *tkz,
if (tkz->is_eof) {
if (tkz->token->begin != NULL) {
lxb_html_tokenizer_state_token_set_end_oef(tkz);
lxb_html_tokenizer_state_token_set_end_eof(tkz);
}
lxb_html_tokenizer_state_set_text(tkz);
@@ -453,7 +453,7 @@ lxb_html_tokenizer_state_tag_open(lxb_html_tokenizer_t *tkz,
if (tkz->is_eof) {
lxb_html_tokenizer_state_append_m(tkz, "<", 1);
lxb_html_tokenizer_state_token_set_end_oef(tkz);
lxb_html_tokenizer_state_token_set_end_eof(tkz);
lxb_html_tokenizer_state_token_emit_text_not_empty_m(tkz, end);
lxb_html_tokenizer_error_add(tkz->parse_errors, tkz->token->end,
@@ -508,7 +508,7 @@ lxb_html_tokenizer_state_end_tag_open(lxb_html_tokenizer_t *tkz,
if (tkz->is_eof) {
lxb_html_tokenizer_state_append_m(tkz, "</", 2);
lxb_html_tokenizer_state_token_set_end_oef(tkz);
lxb_html_tokenizer_state_token_set_end_eof(tkz);
lxb_html_tokenizer_state_token_emit_text_not_empty_m(tkz, end);
lxb_html_tokenizer_error_add(tkz->parse_errors, tkz->token->end,
@@ -582,7 +582,7 @@ lxb_html_tokenizer_state_tag_name(lxb_html_tokenizer_t *tkz,
/* U+0000 NULL */
case 0x00:
if (tkz->is_eof) {
lxb_html_tokenizer_state_token_set_end_oef(tkz);
lxb_html_tokenizer_state_token_set_end_eof(tkz);
lxb_html_tokenizer_error_add(tkz->parse_errors,
tkz->token->end,
@@ -1377,7 +1377,7 @@ lxb_html_tokenizer_state_bogus_comment(lxb_html_tokenizer_t *tkz,
if (tkz->is_eof) {
if (tkz->token->begin != NULL) {
lxb_html_tokenizer_state_token_set_end_oef(tkz);
lxb_html_tokenizer_state_token_set_end_eof(tkz);
}
lxb_html_tokenizer_state_set_text(tkz);
@@ -1476,7 +1476,7 @@ lxb_html_tokenizer_state_markup_declaration_open(lxb_html_tokenizer_t *tkz,
}
if (tkz->is_eof) {
lxb_html_tokenizer_state_token_set_end_oef(tkz);
lxb_html_tokenizer_state_token_set_end_eof(tkz);
tkz->token->begin = tkz->token->end;
}
@@ -1657,7 +1657,7 @@ lxb_html_tokenizer_state_cdata_section(lxb_html_tokenizer_t *tkz,
if (tkz->token->begin != NULL) {
lxb_html_tokenizer_state_append_data_m(tkz, data);
lxb_html_tokenizer_state_token_set_end_oef(tkz);
lxb_html_tokenizer_state_token_set_end_eof(tkz);
}
lxb_html_tokenizer_state_set_text(tkz);

View File

@@ -105,7 +105,7 @@ extern "C" {
} \
while (0)
#define lxb_html_tokenizer_state_token_set_end_oef(tkz) \
#define lxb_html_tokenizer_state_token_set_end_eof(tkz) \
(tkz->token->end = tkz->last)
#define lxb_html_tokenizer_state_token_attr_add_m(tkz, attr, v_return) \

View File

@@ -225,7 +225,7 @@ lxb_html_tokenizer_state_comment(lxb_html_tokenizer_t *tkz,
if (tkz->is_eof) {
if (tkz->token->begin != NULL) {
lxb_html_tokenizer_state_token_set_end_oef(tkz);
lxb_html_tokenizer_state_token_set_end_eof(tkz);
}
lxb_html_tokenizer_error_add(tkz->parse_errors, tkz->token->end,

View File

@@ -129,7 +129,7 @@ lxb_html_tokenizer_state_doctype_before(lxb_html_tokenizer_t *tkz,
lxb_html_tokenizer_state_token_set_end(tkz, data);
}
else {
lxb_html_tokenizer_state_token_set_end_oef(tkz);
lxb_html_tokenizer_state_token_set_end_eof(tkz);
}
tkz->token->tag_id = LXB_TAG__EM_DOCTYPE;

View File

@@ -108,7 +108,7 @@ lxb_html_tokenizer_state_rawtext(lxb_html_tokenizer_t *tkz,
if (tkz->is_eof) {
if (tkz->token->begin != NULL) {
lxb_html_tokenizer_state_token_set_end_oef(tkz);
lxb_html_tokenizer_state_token_set_end_eof(tkz);
}
tkz->token->tag_id = LXB_TAG__TEXT;

View File

@@ -117,7 +117,7 @@ lxb_html_tokenizer_state_rcdata(lxb_html_tokenizer_t *tkz,
if (tkz->is_eof) {
if (tkz->token->begin != NULL) {
lxb_html_tokenizer_state_token_set_end_oef(tkz);
lxb_html_tokenizer_state_token_set_end_eof(tkz);
}
tkz->token->tag_id = LXB_TAG__TEXT;

View File

@@ -197,7 +197,7 @@ lxb_html_tokenizer_state_script_data(lxb_html_tokenizer_t *tkz,
if (tkz->is_eof) {
if (tkz->token->begin != NULL) {
lxb_html_tokenizer_state_token_set_end_oef(tkz);
lxb_html_tokenizer_state_token_set_end_eof(tkz);
}
tkz->token->tag_id = LXB_TAG__TEXT;
@@ -515,7 +515,7 @@ lxb_html_tokenizer_state_script_data_escaped(lxb_html_tokenizer_t *tkz,
tkz->token->tag_id = LXB_TAG__TEXT;
lxb_html_tokenizer_state_set_text(tkz);
lxb_html_tokenizer_state_token_set_end_oef(tkz);
lxb_html_tokenizer_state_token_set_end_eof(tkz);
lxb_html_tokenizer_state_token_done_m(tkz, end);
return end;
@@ -579,7 +579,7 @@ lxb_html_tokenizer_state_script_data_escaped_dash(lxb_html_tokenizer_t *tkz,
tkz->token->tag_id = LXB_TAG__TEXT;
lxb_html_tokenizer_state_set_text(tkz);
lxb_html_tokenizer_state_token_set_end_oef(tkz);
lxb_html_tokenizer_state_token_set_end_eof(tkz);
lxb_html_tokenizer_state_token_done_m(tkz, end);
return end;
@@ -945,7 +945,7 @@ lxb_html_tokenizer_state_script_data_double_escaped(lxb_html_tokenizer_t *tkz,
tkz->token->tag_id = LXB_TAG__TEXT;
lxb_html_tokenizer_state_set_text(tkz);
lxb_html_tokenizer_state_token_set_end_oef(tkz);
lxb_html_tokenizer_state_token_set_end_eof(tkz);
lxb_html_tokenizer_state_token_done_m(tkz, end);
return end;
@@ -1009,7 +1009,7 @@ lxb_html_tokenizer_state_script_data_double_escaped_dash(lxb_html_tokenizer_t *t
tkz->token->tag_id = LXB_TAG__TEXT;
lxb_html_tokenizer_state_set_text(tkz);
lxb_html_tokenizer_state_token_set_end_oef(tkz);
lxb_html_tokenizer_state_token_set_end_eof(tkz);
lxb_html_tokenizer_state_token_done_m(tkz, end);
return end;
@@ -1075,7 +1075,7 @@ lxb_html_tokenizer_state_script_data_double_escaped_dash_dash(
tkz->token->tag_id = LXB_TAG__TEXT;
lxb_html_tokenizer_state_set_text(tkz);
lxb_html_tokenizer_state_token_set_end_oef(tkz);
lxb_html_tokenizer_state_token_set_end_eof(tkz);
lxb_html_tokenizer_state_token_done_m(tkz, end);
return end;

View File

@@ -531,7 +531,7 @@ lxb_html_tree_append_attributes_from_element(lxb_html_tree_t *tree,
}
}
lxb_dom_element_attr_append(element, attr);
lxb_dom_element_attr_append(element, new_attr);
attr = attr->next;
}

View File

@@ -277,7 +277,7 @@ lxb_html_tree_create_node(lxb_html_tree_t *tree,
}
lxb_inline bool
lxb_html_tree_node_is(lxb_dom_node_t *node, lxb_tag_id_t tag_id)
lxb_html_tree_node_is(const lxb_dom_node_t *node, lxb_tag_id_t tag_id)
{
return node->local_name == tag_id && node->ns == LXB_NS_HTML;
}
@@ -374,61 +374,6 @@ lxb_html_tree_attach_document(lxb_html_tree_t *tree, lxb_html_document_t *doc)
tree->document = doc;
}
/*
* No inline functions for ABI.
*/
LXB_API lxb_status_t
lxb_html_tree_begin_noi(lxb_html_tree_t *tree, lxb_html_document_t *document);
LXB_API lxb_status_t
lxb_html_tree_chunk_noi(lxb_html_tree_t *tree, const lxb_char_t *html,
size_t size);
LXB_API lxb_status_t
lxb_html_tree_end_noi(lxb_html_tree_t *tree);
LXB_API lxb_status_t
lxb_html_tree_build_noi(lxb_html_tree_t *tree, lxb_html_document_t *document,
const lxb_char_t *html, size_t size);
LXB_API lxb_dom_node_t *
lxb_html_tree_create_node_noi(lxb_html_tree_t *tree,
lxb_tag_id_t tag_id, lxb_ns_id_t ns);
LXB_API bool
lxb_html_tree_node_is_noi(lxb_dom_node_t *node, lxb_tag_id_t tag_id);
LXB_API lxb_dom_node_t *
lxb_html_tree_current_node_noi(lxb_html_tree_t *tree);
LXB_API lxb_dom_node_t *
lxb_html_tree_adjusted_current_node_noi(lxb_html_tree_t *tree);
LXB_API lxb_html_element_t *
lxb_html_tree_insert_html_element_noi(lxb_html_tree_t *tree,
lxb_html_token_t *token);
LXB_API void
lxb_html_tree_insert_node_noi(lxb_dom_node_t *to, lxb_dom_node_t *node,
lxb_html_tree_insertion_position_t ipos);
LXB_API void
lxb_html_tree_acknowledge_token_self_closing_noi(lxb_html_tree_t *tree,
lxb_html_token_t *token);
LXB_API bool
lxb_html_tree_mathml_text_integration_point_noi(lxb_dom_node_t *node);
LXB_API bool
lxb_html_tree_scripting_noi(lxb_html_tree_t *tree);
LXB_API void
lxb_html_tree_scripting_set_noi(lxb_html_tree_t *tree, bool scripting);
LXB_API void
lxb_html_tree_attach_document_noi(lxb_html_tree_t *tree,
lxb_html_document_t *doc);
#ifdef __cplusplus
} /* extern "C" */

View File

@@ -15,7 +15,7 @@ lxb_html_tree_insertion_mode_text(lxb_html_tree_t *tree,
lxb_html_token_t *token)
{
lxb_dom_node_t *node;
lxb_html_style_element_t *style;
const lxb_html_document_parse_cb_t *pcb;
switch (token->tag_id) {
case LXB_TAG__TEXT: {
@@ -48,9 +48,19 @@ lxb_html_tree_insertion_mode_text(lxb_html_tree_t *tree,
/* TODO: need to implement */
case LXB_TAG_SCRIPT:
lxb_html_tree_open_elements_pop(tree);
node = lxb_html_tree_open_elements_pop(tree);
tree->mode = tree->original_mode;
pcb = tree->document->parse_cb;
if (pcb == NULL || pcb->script == NULL) {
break;
}
tree->status = pcb->script(tree, node);
if (tree->status != LXB_STATUS_OK) {
return lxb_html_tree_process_abort(tree);
}
break;
@@ -58,20 +68,13 @@ lxb_html_tree_insertion_mode_text(lxb_html_tree_t *tree,
node = lxb_html_tree_open_elements_pop(tree);
tree->mode = tree->original_mode;
pcb = tree->document->parse_cb;
if (!tree->document->css_init) {
if (pcb == NULL || pcb->style == NULL) {
break;
}
style = lxb_html_interface_style(node);
tree->status = lxb_html_style_element_parse(style);
if (tree->status != LXB_STATUS_OK) {
return lxb_html_tree_process_abort(tree);
}
tree->status = lxb_html_document_stylesheet_add(tree->document,
style->stylesheet);
tree->status = pcb->style(tree, node);
if (tree->status != LXB_STATUS_OK) {
return lxb_html_tree_process_abort(tree);
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2021-2024 Alexander Borisov
* Copyright (C) 2021-2025 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
* Adapted for PHP libxml2 by: Niels Dossche <nielsdos@php.net>
@@ -100,11 +100,13 @@ struct lxb_selectors_nested {
void *ctx;
const xmlNode *root;
lxb_selectors_entry_t *last;
lxb_selectors_nested_t *parent;
lxb_selectors_entry_t *first;
lxb_selectors_entry_t *top;
size_t index;
bool found;
bool forward;
};
struct lxb_selectors {
@@ -113,7 +115,6 @@ struct lxb_selectors {
lexbor_dobject_t *nested;
lxb_selectors_nested_t *current;
lxb_selectors_entry_t *first;
lxb_selectors_opt_t options;
lxb_status_t status;
@@ -129,7 +130,7 @@ struct lxb_selectors {
*
* @return LXB_STATUS_OK if successful, otherwise an error status value.
*/
LXB_API lxb_status_t
lxb_status_t
lxb_selectors_init(lxb_selectors_t *selectors);
/*
@@ -141,7 +142,7 @@ lxb_selectors_init(lxb_selectors_t *selectors);
*
* @param[in] lxb_url_parser_t *
*/
LXB_API void
void
lxb_selectors_clean(lxb_selectors_t *selectors);
/*
@@ -152,7 +153,7 @@ lxb_selectors_clean(lxb_selectors_t *selectors);
* @param[in] lxb_selectors_t *. Can be NULL.
* if true: destroys the lxb_selectors_t object and all internal caches.
*/
LXB_API void
void
lxb_selectors_destroy(lxb_selectors_t *selectors);
/*
@@ -178,7 +179,7 @@ lxb_selectors_destroy(lxb_selectors_t *selectors);
*
* @return LXB_STATUS_OK if successful, otherwise an error status value.
*/
LXB_API lxb_status_t
lxb_status_t
lxb_selectors_find(lxb_selectors_t *selectors, const xmlNode *root,
const lxb_css_selector_list_t *list,
lxb_selectors_cb_f cb, void *ctx);
@@ -209,7 +210,7 @@ lxb_selectors_find(lxb_selectors_t *selectors, const xmlNode *root,
*
* @return LXB_STATUS_OK if successful, otherwise an error status value.
*/
LXB_API lxb_status_t
lxb_status_t
lxb_selectors_match_node(lxb_selectors_t *selectors, const xmlNode *node,
const lxb_css_selector_list_t *list,
lxb_selectors_cb_f cb, void *ctx);

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 Alexander Borisov
* Copyright (C) 2019-2024 Alexander Borisov
*
* Author: Alexander Borisov <borisov@lexbor.com>
*/
@@ -16,7 +16,7 @@ extern "C" {
#define LXB_TAG_VERSION_MAJOR 1
#define LXB_TAG_VERSION_MINOR 2
#define LXB_TAG_VERSION_MINOR 3
#define LXB_TAG_VERSION_PATCH 0
#define LXB_TAG_VERSION_STRING \

View File

@@ -1,4 +1,4 @@
From 7c7c35d8ea9f65f081564b3ad1bfe9f0db33dd69 Mon Sep 17 00:00:00 2001
From 4c133fe5adfe4b8ccdd8b014d884b685143b9e66 Mon Sep 17 00:00:00 2001
From: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
Date: Sat, 26 Aug 2023 15:08:59 +0200
Subject: [PATCH 1/6] Expose line and column information for use in PHP
@@ -15,10 +15,10 @@ Subject: [PATCH 1/6] Expose line and column information for use in PHP
8 files changed, 48 insertions(+), 5 deletions(-)
diff --git a/source/lexbor/dom/interfaces/node.h b/source/lexbor/dom/interfaces/node.h
index c37b790..8ac218b 100644
index b052cf5..b5d2c50 100644
--- a/source/lexbor/dom/interfaces/node.h
+++ b/source/lexbor/dom/interfaces/node.h
@@ -58,6 +58,8 @@ struct lxb_dom_node {
@@ -83,6 +83,8 @@ struct lxb_dom_node {
lxb_dom_node_type_t type;
@@ -103,7 +103,7 @@ index ba9602f..74bb55e 100644
/* Entities */
const lexbor_sbst_entry_static_t *entity;
diff --git a/source/lexbor/html/tokenizer/state.h b/source/lexbor/html/tokenizer/state.h
index 0892846..77b86ac 100644
index 17939b9..5b095b4 100644
--- a/source/lexbor/html/tokenizer/state.h
+++ b/source/lexbor/html/tokenizer/state.h
@@ -90,6 +90,8 @@ extern "C" {
@@ -116,10 +116,10 @@ index 0892846..77b86ac 100644
while (0)
diff --git a/source/lexbor/html/tree.c b/source/lexbor/html/tree.c
index 0f067e4..bdec6a5 100644
index ece26e9..91bfd17 100644
--- a/source/lexbor/html/tree.c
+++ b/source/lexbor/html/tree.c
@@ -434,6 +434,9 @@ lxb_html_tree_create_element_for_token(lxb_html_tree_t *tree,
@@ -427,6 +427,9 @@ lxb_html_tree_create_element_for_token(lxb_html_tree_t *tree,
return NULL;
}
@@ -129,7 +129,7 @@ index 0f067e4..bdec6a5 100644
lxb_status_t status;
lxb_dom_element_t *element = lxb_dom_interface_element(node);
@@ -770,6 +773,11 @@ lxb_html_tree_insert_character_for_data(lxb_html_tree_t *tree,
@@ -763,6 +766,11 @@ lxb_html_tree_insert_character_for_data(lxb_html_tree_t *tree,
lxb_dom_interface_text(text)->char_data.data = *str;
@@ -141,7 +141,7 @@ index 0f067e4..bdec6a5 100644
if (ret_node != NULL) {
*ret_node = text;
}
@@ -809,6 +817,9 @@ lxb_html_tree_insert_comment(lxb_html_tree_t *tree,
@@ -802,6 +810,9 @@ lxb_html_tree_insert_comment(lxb_html_tree_t *tree,
return NULL;
}
@@ -184,5 +184,5 @@ index 2fd06cb..ed1859f 100644
lxb_html_tree_error_t;
--
2.44.0
2.49.0

View File

@@ -1,4 +1,4 @@
From ce1cb529bb5415e4ea17332731c20d2c78adc601 Mon Sep 17 00:00:00 2001
From eb5e3769950cd9c0bc59066d94d6da9291f43af8 Mon Sep 17 00:00:00 2001
From: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
Date: Mon, 14 Aug 2023 20:18:51 +0200
Subject: [PATCH 2/6] Track implied added nodes for options use in PHP
@@ -11,7 +11,7 @@ Subject: [PATCH 2/6] Track implied added nodes for options use in PHP
4 files changed, 8 insertions(+)
diff --git a/source/lexbor/html/tree.h b/source/lexbor/html/tree.h
index 2a43f8b..d964f01 100644
index 9564608..8ad32a4 100644
--- a/source/lexbor/html/tree.h
+++ b/source/lexbor/html/tree.h
@@ -55,6 +55,9 @@ struct lxb_html_tree {
@@ -50,10 +50,10 @@ index 14621f2..cd2ac2a 100644
break;
diff --git a/source/lexbor/html/tree/insertion_mode/before_html.c b/source/lexbor/html/tree/insertion_mode/before_html.c
index ed5e367..b078ac5 100644
index 05fe738..1e09cda 100644
--- a/source/lexbor/html/tree/insertion_mode/before_html.c
+++ b/source/lexbor/html/tree/insertion_mode/before_html.c
@@ -79,6 +79,8 @@ lxb_html_tree_insertion_mode_before_html_open(lxb_html_tree_t *tree,
@@ -78,6 +78,8 @@ lxb_html_tree_insertion_mode_before_html_open(lxb_html_tree_t *tree,
return lxb_html_tree_process_abort(tree);
}
@@ -63,5 +63,5 @@ index ed5e367..b078ac5 100644
break;
--
2.44.0
2.49.0

View File

@@ -1,4 +1,4 @@
From 0514a1cb2f45ab6dd814118780d56a713f4925a2 Mon Sep 17 00:00:00 2001
From de74c24d95342280266ebdac6f8dabc70ccfacab Mon Sep 17 00:00:00 2001
From: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
Date: Thu, 24 Aug 2023 22:57:48 +0200
Subject: [PATCH 3/6] Patch utilities and data structure to be able to generate
@@ -8,11 +8,10 @@ Changed the generation script to check if everything fits in 32-bits.
And change the actual field types to 32-bits. This decreases the hash
tables in size.
---
source/lexbor/core/shs.h | 4 ++--
utils/lexbor/encoding/multi-byte.py | 2 +-
utils/lexbor/encoding/single-byte.py | 2 +-
utils/lexbor/lexbor/LXB.py | 12 +++++++++---
4 files changed, 13 insertions(+), 7 deletions(-)
source/lexbor/core/shs.h | 4 +-
utils/lexbor/encoding/single-byte.py | 2 +-
utils/lexbor/lexbor/LXB.py | 12 +-
3 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/source/lexbor/core/shs.h b/source/lexbor/core/shs.h
index 7a63a07..c84dfaa 100644
@@ -30,19 +29,6 @@ index 7a63a07..c84dfaa 100644
}
lexbor_shs_hash_t;
diff --git a/utils/lexbor/encoding/multi-byte.py b/utils/lexbor/encoding/multi-byte.py
index ff9ddf1..f8af2d4 100755
--- a/utils/lexbor/encoding/multi-byte.py
+++ b/utils/lexbor/encoding/multi-byte.py
@@ -151,7 +151,7 @@ class MultiByte:
key_id = entries[1].decode('utf-8')
- hash_key.append(key_id, '(void *) {}'.format(idx))
+ hash_key.append(key_id, idx)
return hash_key.create(rate = 1)
diff --git a/utils/lexbor/encoding/single-byte.py b/utils/lexbor/encoding/single-byte.py
index 9a85d54..ec2023c 100755
--- a/utils/lexbor/encoding/single-byte.py
@@ -98,5 +84,5 @@ index 3e75812..2370c66 100755
result.append("};")
--
2.44.0
2.49.0

View File

@@ -1,4 +1,4 @@
From 01aad1074657586677f05ac1998da2158c57ee74 Mon Sep 17 00:00:00 2001
From 1837e6a296a2bac71e37e566435542f208b4fa23 Mon Sep 17 00:00:00 2001
From: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
Date: Wed, 29 Nov 2023 21:26:47 +0100
Subject: [PATCH 4/6] Remove unused upper case tag static data
@@ -29,7 +29,7 @@ index c7190c5..4ad1f37 100644
static const lexbor_shs_entry_t lxb_tag_res_shs_data_default[] =
{
diff --git a/source/lexbor/tag/tag.c b/source/lexbor/tag/tag.c
index f8fcdf0..0571957 100644
index 780bc47..be5bb30 100644
--- a/source/lexbor/tag/tag.c
+++ b/source/lexbor/tag/tag.c
@@ -92,6 +92,7 @@ lxb_tag_data_by_name(lexbor_hash_t *hash, const lxb_char_t *name, size_t len)
@@ -49,5 +49,5 @@ index f8fcdf0..0571957 100644
/*
* No inline functions for ABI.
--
2.44.0
2.49.0

View File

@@ -1,4 +1,4 @@
From 16daa8e860e393ff39613b908550b0982a2210f2 Mon Sep 17 00:00:00 2001
From 065923a993a004b8891ad3992c99e7e63e77bad3 Mon Sep 17 00:00:00 2001
From: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
Date: Wed, 29 Nov 2023 21:29:31 +0100
Subject: [PATCH 5/6] Shrink size of static binary search tree
@@ -8,7 +8,7 @@ This also makes it more efficient on the data cache.
source/lexbor/core/sbst.h | 19 ++++++++++++++-----
source/lexbor/html/tokenizer/state.c | 2 +-
utils/lexbor/html/tmp/tokenizer_res.h | 2 +-
utils/lexbor/html/tokenizer_entities_bst.py | 8 ++++----
utils/lexbor/html/tokenizer_entities_bst.py | 10 +++++-----
utils/lexbor/lexbor/LXB.py | 2 +-
5 files changed, 21 insertions(+), 12 deletions(-)
@@ -103,6 +103,15 @@ index 4fa0999..8bd83b2 100755
else:
value = '"{}"'.format(toHex(index[ split[0] ]['values'][0]['characters']))
@@ -146,7 +146,7 @@ def toHex(s):
lst = []
for ch in bytes(s, 'utf-8'):
- hv = hex(ch).replace('0x', '\\\\x')
+ hv = hex(ch).replace('0x', '\\x')
lst.append(hv)
return ''.join(lst)
@@ -210,5 +210,5 @@ def entities_bst_print(bst):
if __name__ == "__main__":

View File

@@ -1,15 +1,13 @@
From 168dad55b6278cd45e0f0b2aed802ce9bace3274 Mon Sep 17 00:00:00 2001
From fbb1e8945c4b12d43e7fddc3c34670b5792e2dca Mon Sep 17 00:00:00 2001
From: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
Date: Sun, 7 Jan 2024 21:59:28 +0100
Subject: [PATCH 6/6] Patch out unused CSS style code
---
source/lexbor/css/rule.h | 2 ++
source/lexbor/html/interfaces/document.c | 29 +++++++++++++++++++
source/lexbor/html/interfaces/document.h | 2 --
source/lexbor/html/interfaces/element.c | 29 +++++++++++++++++++
source/lexbor/html/interfaces/style_element.c | 6 ++++
5 files changed, 66 insertions(+), 2 deletions(-)
source/lexbor/css/rule.h | 2 ++
source/lexbor/style/dom/interfaces/document.c | 12 ++++++++----
source/lexbor/style/html/interfaces/document.h | 2 ++
3 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/source/lexbor/css/rule.h b/source/lexbor/css/rule.h
index 7cc4f0b..bd191f9 100644
@@ -31,415 +29,96 @@ index 7cc4f0b..bd191f9 100644
}
lxb_inline void
diff --git a/source/lexbor/html/interfaces/document.c b/source/lexbor/html/interfaces/document.c
index bd3c02b..aa305a9 100644
--- a/source/lexbor/html/interfaces/document.c
+++ b/source/lexbor/html/interfaces/document.c
@@ -58,6 +58,7 @@ static lxb_html_document_css_custom_entry_t *
lxb_html_document_css_customs_insert(lxb_html_document_t *document,
const lxb_char_t *key, size_t length);
+#if 0
static lxb_status_t
lxb_html_document_style_remove_by_rule_cb(lxb_dom_node_t *node,
lxb_css_selector_specificity_t spec,
@@ -74,6 +75,7 @@ lxb_html_document_style_cb(lxb_dom_node_t *node,
static lxb_status_t
lxb_html_document_done(lxb_html_document_t *document);
+#endif
lxb_status_t
@@ -86,6 +88,7 @@ lxb_html_document_parser_prepare(lxb_html_document_t *document);
static lexbor_action_t
lxb_html_document_title_walker(lxb_dom_node_t *node, void *ctx);
+#if 0
static lxb_status_t
lxb_html_document_event_insert(lxb_dom_node_t *node);
@@ -112,6 +115,7 @@ lxb_html_document_event_destroy(lxb_dom_node_t *node);
static lxb_status_t
lxb_html_document_event_set_value(lxb_dom_node_t *node,
const lxb_char_t *value, size_t length);
+#endif
lxb_html_document_t *
@@ -171,7 +175,9 @@ lxb_html_document_interface_destroy(lxb_html_document_t *document)
if (doc->node.owner_document == doc) {
(void) lxb_html_parser_unref(doc->parser);
+#if 0
lxb_html_document_css_destroy(document);
+#endif
}
(void) lxb_dom_document_destroy(doc);
@@ -193,11 +199,14 @@ lxb_html_document_clean(lxb_html_document_t *document)
document->iframe_srcdoc = NULL;
document->ready_state = LXB_HTML_DOCUMENT_READY_STATE_UNDEF;
+#if 0
lxb_html_document_css_clean(document);
+#endif
lxb_dom_document_clean(lxb_dom_interface_document(document));
}
+#if 0
lxb_status_t
lxb_html_document_css_init(lxb_html_document_t *document)
{
@@ -330,6 +339,7 @@ lxb_html_document_css_clean(lxb_html_document_t *document)
lexbor_dobject_clean(css->weak);
}
}
+#endif
void
lxb_html_document_css_parser_attach(lxb_html_document_t *document,
@@ -575,6 +585,7 @@ void
lxb_html_document_stylesheet_destroy_all(lxb_html_document_t *document,
bool destroy_memory)
diff --git a/source/lexbor/style/dom/interfaces/document.c b/source/lexbor/style/dom/interfaces/document.c
index 8a63e8e..f885dc3 100644
--- a/source/lexbor/style/dom/interfaces/document.c
+++ b/source/lexbor/style/dom/interfaces/document.c
@@ -280,6 +280,7 @@ lxb_status_t
lxb_dom_document_stylesheet_apply(lxb_dom_document_t *document,
lxb_css_stylesheet_t *sst)
{
+#if 0
size_t length;
lxb_status_t status = LXB_STATUS_OK;
lxb_css_rule_t *rule;
lxb_css_rule_list_t *list;
@@ -310,7 +311,7 @@ lxb_dom_document_stylesheet_apply(lxb_dom_document_t *document,
rule = rule->next;
}
-
+#endif
return LXB_STATUS_OK;
}
@@ -329,6 +330,7 @@ lxb_status_t
lxb_dom_document_stylesheet_remove(lxb_dom_document_t *document,
lxb_css_stylesheet_t *sst)
{
+#if 0
size_t i, length;
lxb_status_t status = LXB_STATUS_OK;
lxb_css_rule_t *rule;
@@ -372,13 +374,14 @@ lxb_dom_document_stylesheet_remove(lxb_dom_document_t *document,
length = lexbor_array_length(document->css->stylesheets);
}
}
-
+#endif
return LXB_STATUS_OK;
}
lxb_status_t
lxb_dom_document_element_styles_attach(lxb_dom_element_t *element)
{
+#if 0
lxb_status_t status = LXB_STATUS_OK;
lxb_css_rule_t *rule;
lexbor_array_t *ssts;
@@ -413,7 +416,7 @@ lxb_dom_document_element_styles_attach(lxb_dom_element_t *element)
rule = rule->next;
}
}
-
+#endif
return LXB_STATUS_OK;
}
@@ -521,6 +524,7 @@ lxb_dom_document_style_attach_cb(lxb_dom_node_t *node,
lxb_status_t
lxb_document_apply_stylesheets(lxb_dom_document_t *document)
{
+#if 0
size_t i, length;
lxb_status_t status;
lxb_css_stylesheet_t *sst;
lxb_html_document_css_t *css = &document->css;
@@ -586,29 +597,37 @@ lxb_html_document_stylesheet_destroy_all(lxb_html_document_t *document,
(void) lxb_css_stylesheet_destroy(sst, destroy_memory);
@@ -539,6 +543,6 @@ lxb_document_apply_stylesheets(lxb_dom_document_t *document)
return status;
}
}
-
+#endif
return LXB_STATUS_OK;
}
diff --git a/source/lexbor/style/html/interfaces/document.h b/source/lexbor/style/html/interfaces/document.h
index 0307cd9..127c4cd 100644
--- a/source/lexbor/style/html/interfaces/document.h
+++ b/source/lexbor/style/html/interfaces/document.h
@@ -134,6 +134,7 @@ lxb_html_document_stylesheet_destroy_all(lxb_html_document_t *document,
destroy_memory);
}
lxb_status_t
+#if 0
lxb_inline lxb_status_t
lxb_html_document_style_attach(lxb_html_document_t *document,
lxb_css_rule_style_t *style)
{
+#if 0
lxb_html_document_css_t *css = &document->css;
return lxb_selectors_find(css->selectors, lxb_dom_interface_node(document),
style->selector, lxb_html_document_style_cb, style);
+#endif
+ return LXB_STATUS_OK;
}
lxb_status_t
lxb_html_document_style_remove(lxb_html_document_t *document,
lxb_css_rule_style_t *style)
{
+#if 0
lxb_html_document_css_t *css = &document->css;
return lxb_selectors_find(css->selectors, lxb_dom_interface_node(document),
style->selector,
lxb_html_document_style_remove_by_rule_cb, style);
+#endif
+ return LXB_STATUS_OK;
}
+#if 0
static lxb_status_t
lxb_html_document_style_remove_by_rule_cb(lxb_dom_node_t *node,
lxb_css_selector_specificity_t spec,
@@ -646,20 +665,25 @@ lxb_html_document_style_remove_avl_cb(lexbor_avl_t *avl,
style, context->list);
return LXB_STATUS_OK;
@@ -158,6 +159,7 @@ lxb_html_document_style_attach_by_element(lxb_html_document_t *document,
return lxb_dom_document_style_attach_by_element(lxb_dom_interface_document(document),
element, style);
}
+#endif
lxb_status_t
lxb_html_document_style_attach_by_element(lxb_html_document_t *document,
lxb_html_element_t *element,
lxb_css_rule_style_t *style)
{
+#if 0
lxb_html_document_css_t *css = &document->css;
return lxb_selectors_match_node(css->selectors,
lxb_dom_interface_node(element),
style->selector,
lxb_html_document_style_cb, style);
+#endif
+ return LXB_STATUS_OK;
}
+#if 0
static lxb_status_t
lxb_html_document_style_cb(lxb_dom_node_t *node,
lxb_css_selector_specificity_t spec, void *ctx)
@@ -675,6 +699,7 @@ lxb_html_document_style_cb(lxb_dom_node_t *node,
return lxb_html_element_style_list_append(lxb_html_interface_element(node),
style->declarations, spec);
}
+#endif
lxb_html_document_t *
lxb_html_document_destroy(lxb_html_document_t *document)
@@ -851,6 +876,7 @@ lxb_html_document_parser_prepare(lxb_html_document_t *document)
return LXB_STATUS_OK;
}
+#if 0
static lxb_status_t
lxb_html_document_done(lxb_html_document_t *document)
{
@@ -875,6 +901,7 @@ lxb_html_document_done(lxb_html_document_t *document)
return LXB_STATUS_OK;
}
+#endif
const lxb_char_t *
lxb_html_document_title(lxb_html_document_t *document, size_t *len)
@@ -962,6 +989,7 @@ lxb_html_document_import_node(lxb_html_document_t *doc, lxb_dom_node_t *node,
return lxb_dom_document_import_node(&doc->dom_document, node, deep);
}
+#if 0
static lxb_status_t
lxb_html_document_event_insert(lxb_dom_node_t *node)
{
@@ -1233,6 +1261,7 @@ lxb_html_document_event_set_value(lxb_dom_node_t *node,
return lxb_html_element_style_parse(lxb_html_interface_element(node),
value, length);
}
+#endif
/*
* No inline functions for ABI.
diff --git a/source/lexbor/html/interfaces/document.h b/source/lexbor/html/interfaces/document.h
index 7e8d1ea..827ff64 100644
--- a/source/lexbor/html/interfaces/document.h
+++ b/source/lexbor/html/interfaces/document.h
@@ -20,7 +20,6 @@ extern "C" {
#include "lexbor/dom/interfaces/attr.h"
#include "lexbor/dom/interfaces/document.h"
#include "lexbor/css/css.h"
-#include "lexbor/selectors/selectors.h"
typedef lxb_status_t
@@ -45,7 +44,6 @@ typedef struct {
lxb_css_memory_t *memory;
lxb_css_selectors_t *css_selectors;
lxb_css_parser_t *parser;
- lxb_selectors_t *selectors;
lexbor_avl_t *styles;
lexbor_array_t *stylesheets;
diff --git a/source/lexbor/html/interfaces/element.c b/source/lexbor/html/interfaces/element.c
index 229d3d7..363040c 100644
--- a/source/lexbor/html/interfaces/element.c
+++ b/source/lexbor/html/interfaces/element.c
@@ -38,9 +38,11 @@ static lxb_status_t
lxb_html_element_style_serialize_cb(lexbor_avl_t *avl, lexbor_avl_node_t **root,
lexbor_avl_node_t *node, void *ctx);
+#if 0
static lxb_status_t
lxb_html_element_style_serialize_str_cb(const lxb_char_t *data,
size_t len, void *ctx);
+#endif
lxb_html_element_t *
@@ -102,6 +104,7 @@ const lxb_css_rule_declaration_t *
lxb_html_element_style_by_name(lxb_html_element_t *element,
const lxb_char_t *name, size_t size)
{
+#if 0
uintptr_t id;
lxb_html_style_node_t *node;
lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
@@ -115,11 +118,14 @@ lxb_html_element_style_by_name(lxb_html_element_t *element,
node = (void *) lexbor_avl_search(doc->css.styles, element->style, id);
return (node != NULL) ? node->entry.value : NULL;
+#endif
+ return NULL;
}
const lxb_css_rule_declaration_t *
lxb_html_element_style_by_id(lxb_html_element_t *element, uintptr_t id)
{
+#if 0
const lxb_html_style_node_t *node;
node = lxb_html_element_style_node_by_id(element, id);
@@ -128,6 +134,8 @@ lxb_html_element_style_by_id(lxb_html_element_t *element, uintptr_t id)
}
return node->entry.value;
+#endif
+ return NULL;
}
const lxb_html_style_node_t *
@@ -144,6 +152,7 @@ const lxb_html_style_node_t *
lxb_html_element_style_node_by_name(lxb_html_element_t *element,
const lxb_char_t *name, size_t size)
{
+#if 0
uintptr_t id;
lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
lxb_html_document_t *doc = lxb_html_interface_document(ddoc);
@@ -155,11 +164,14 @@ lxb_html_element_style_node_by_name(lxb_html_element_t *element,
return (lxb_html_style_node_t *) lexbor_avl_search(doc->css.styles,
element->style, id);
+#endif
+ return NULL;
}
const void *
lxb_html_element_css_property_by_id(lxb_html_element_t *element, uintptr_t id)
{
+#if 0
lxb_css_rule_declaration_t *declr;
const lxb_html_style_node_t *node;
@@ -171,6 +183,8 @@ lxb_html_element_css_property_by_id(lxb_html_element_t *element, uintptr_t id)
declr = node->entry.value;
return declr->u.user;
+#endif
+ return NULL;
}
lxb_status_t
@@ -224,6 +238,7 @@ lxb_status_t
lxb_html_element_style_parse(lxb_html_element_t *element,
const lxb_char_t *style, size_t size)
{
+#if 0
lxb_css_rule_declaration_list_t *list;
lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
@@ -240,6 +255,8 @@ lxb_html_element_style_parse(lxb_html_element_t *element,
return lxb_html_element_style_list_append(element, list,
lxb_css_selector_sp_up_s(0));
+#endif
+ return LXB_STATUS_ERROR;
}
lxb_status_t
@@ -393,6 +410,7 @@ void
lxb_html_element_style_remove_by_name(lxb_html_element_t *element,
const lxb_char_t *name, size_t size)
{
+#if 0
uintptr_t id;
lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
lxb_html_document_t *doc = lxb_html_interface_document(ddoc);
@@ -403,11 +421,13 @@ lxb_html_element_style_remove_by_name(lxb_html_element_t *element,
}
lxb_html_element_style_remove_by_id(element, id);
+#endif
}
void
lxb_html_element_style_remove_by_id(lxb_html_element_t *element, uintptr_t id)
{
+#if 0
lxb_html_style_node_t *node;
lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
lxb_html_document_t *doc = lxb_html_interface_document(ddoc);
@@ -417,6 +437,7 @@ lxb_html_element_style_remove_by_id(lxb_html_element_t *element, uintptr_t id)
if (node != NULL) {
lxb_html_element_style_remove_all(doc, &element->style, node);
}
+#endif
}
lxb_html_style_node_t *
@@ -576,6 +597,7 @@ static lxb_status_t
lxb_html_element_style_serialize_cb(lexbor_avl_t *avl, lexbor_avl_node_t **root,
lexbor_avl_node_t *node, void *ctx)
{
+#if 0
lxb_status_t status;
lexbor_serialize_ctx_t *context = ctx;
@@ -589,6 +611,8 @@ lxb_html_element_style_serialize_cb(lexbor_avl_t *avl, lexbor_avl_node_t **root,
context->count = 1;
return lxb_css_rule_serialize(node->value, context->cb, context->ctx);
+#endif
+ return LXB_STATUS_ERROR;
}
lxb_status_t
@@ -596,6 +620,7 @@ lxb_html_element_style_serialize_str(lxb_html_element_t *element,
lexbor_str_t *str,
lxb_html_element_style_opt_t opt)
{
+#if 0
lxb_dom_document_t *doc;
lxb_html_element_style_ctx_t context;
@@ -614,8 +639,11 @@ lxb_html_element_style_serialize_str(lxb_html_element_t *element,
return lxb_html_element_style_serialize(element, opt,
lxb_html_element_style_serialize_str_cb, &context);
+#endif
+ return LXB_STATUS_ERROR;
}
+#if 0
static lxb_status_t
lxb_html_element_style_serialize_str_cb(const lxb_char_t *data,
size_t len, void *ctx)
@@ -630,3 +658,4 @@ lxb_html_element_style_serialize_str_cb(const lxb_char_t *data,
return LXB_STATUS_OK;
}
+#endif
diff --git a/source/lexbor/html/interfaces/style_element.c b/source/lexbor/html/interfaces/style_element.c
index 66d55c4..9a402ef 100644
--- a/source/lexbor/html/interfaces/style_element.c
+++ b/source/lexbor/html/interfaces/style_element.c
@@ -35,7 +35,9 @@ lxb_html_style_element_interface_destroy(lxb_html_style_element_t *style_element
(void) lxb_dom_node_interface_destroy(lxb_dom_interface_node(style_element));
if (sst != NULL) {
+#if 0
(void) lxb_css_stylesheet_destroy(sst, true);
+#endif
}
return NULL;
@@ -44,8 +46,10 @@ lxb_html_style_element_interface_destroy(lxb_html_style_element_t *style_element
lxb_status_t
lxb_html_style_element_parse(lxb_html_style_element_t *element)
{
+#if 0
lexbor_str_t *str;
lxb_dom_text_t *text;
+#endif
lxb_dom_node_t *node;
lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
@@ -61,11 +65,13 @@ lxb_html_style_element_parse(lxb_html_style_element_t *element)
return LXB_STATUS_OK;
}
+#if 0
text = lxb_dom_interface_text(lxb_dom_interface_node(element)->first_child);
str = &text->char_data.data;
element->stylesheet = lxb_css_stylesheet_parse(css->parser, str->data,
str->length);
+#endif
if (element->stylesheet == NULL) {
return css->parser->status;
}
lxb_inline lxb_status_t
lxb_html_document_apply_stylesheets(lxb_html_document_t *document)
--
2.44.0
2.49.0

View File

@@ -1,7 +1,7 @@
# Lexbor patches
Upon syncing the Lexbor sources, the patches in this directory need to be applied.
The current Lexbor version is 2.4.0.
The current Lexbor version is 2.5.0.
## Overview
@@ -24,8 +24,8 @@ This contains the following patch files in mailbox format.
A PHP specific patch to remove CSS style and selector bindings from the Lexbor document.
**Note** for this patch the utilities to generate the tables are also patched.
Make sure to apply on a fresh Lexbor clone and run (in `lexbor/utils/encoding`): `python3 single-byte.py` and `python3 multi-byte.py` to generate the tables.
Also run `python3 tokenizer_entities_bst.py` to generate the static binary search tree for entities.
Make sure to apply on a fresh Lexbor clone and run (in `lexbor/utils/encoding`): `python3 single-byte.py` to generate the tables.
Also run (in `lexbor/utils/lexbor/html`) `python3 tokenizer_entities_bst.py` to generate the static binary search tree for entities.
## How to apply