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:
@@ -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
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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) "." \
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -25,7 +25,6 @@ extern "C" {
|
||||
# define LXB_NONSTRING
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct {
|
||||
lxb_char_t key;
|
||||
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2021-2023 Alexander Borisov
|
||||
* Copyright (C) 2021-2024 Alexander Borisov
|
||||
*
|
||||
* Author: Alexander Borisov <borisov@lexbor.com>
|
||||
*/
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
@@ -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" */
|
||||
|
||||
@@ -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 */
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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},
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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
@@ -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
298309
ext/dom/lexbor/lexbor/encoding/multi.c
Normal file
298309
ext/dom/lexbor/lexbor/encoding/multi.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
@@ -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
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 */
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) \
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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" */
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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__":
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user