1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-07-04 02:35:29 +00:00

Parse <[CDATA[ sections ]]>

This commit is contained in:
Jonas Fonseca 2005-12-26 19:43:32 +01:00 committed by Jonas Fonseca
parent b9c5bc5536
commit 98d7263c2f
3 changed files with 34 additions and 0 deletions

View File

@ -282,6 +282,11 @@ parse_sgml_document(struct dom_stack *stack, struct scanner *scanner)
skip_scanner_token(scanner);
break;
case SGML_TOKEN_CDATA_SECTION:
add_sgml_node(stack, DOM_NODE_CDATA_SECTION, token);
skip_scanner_token(scanner);
break;
case SGML_TOKEN_PROCESS_XML:
if (!add_sgml_proc_instruction(stack, token)) {
skip_sgml_tokens(scanner, SGML_TOKEN_TAG_END);

View File

@ -194,6 +194,23 @@ skip_comment(struct scanner *scanner, unsigned char **string)
return length;
}
static inline int
skip_cdata_section(struct scanner *scanner, unsigned char **string)
{
unsigned char *pos = *string;
int length = 0;
for (; pos < scanner->end - 3; pos++)
if (pos[0] == ']' && pos[1] == ']' && pos[2] == '>') {
length = pos - *string;
pos += 3;
break;
}
*string = pos;
return length;
}
#define scan_sgml_attribute(scanner, str) \
while ((str) < (scanner)->end && is_sgml_attribute(*(str))) \
(str)++;
@ -249,6 +266,16 @@ scan_sgml_element_token(struct scanner *scanner, struct scanner_token *token)
token->string = string;
real_length = skip_comment(scanner, &string);
assert(real_length >= 0);
} else if (string + 6 < scanner->end
&& !memcmp(string, "[CDATA[", 7)) {
string += 7;
type = SGML_TOKEN_CDATA_SECTION;
token->string = string;
real_length = skip_cdata_section(scanner, &string);
assert(real_length >= 0);
} else {
scan_sgml(scanner, string, SGML_CHAR_IDENT);
type = map_scanner_string(scanner, ident, string, base);

View File

@ -25,6 +25,8 @@ enum sgml_token_type {
SGML_TOKEN_NOTATION_ENTITY, /* <!ENTITY until > */
SGML_TOKEN_NOTATION_ATTLIST, /* <!ATTLIST until > */
SGML_TOKEN_CDATA_SECTION, /* <![CDATA[ until ]]> */
SGML_TOKEN_PROCESS, /* <?{ident} until ?> */
SGML_TOKEN_PROCESS_XML, /* <?xml until */