HTML5-DOM
view release on metacpan or search on metacpan
third_party/modest/source/myhtml/serialization.c view on Meta::CPAN
return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION;
}
break;
}
case MyHTML_NAMESPACE_XLINK: {
if(callback("xlink:", 6, ptr))
return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION;
break;
}
default:
break;
}
size_t length;
const char *data = myhtml_attribute_key(attr, &length);
if(data) {
if(callback(data, length, ptr))
return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION;
}
if(callback("=\"", 2, ptr))
return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION;
data = myhtml_attribute_value(attr, &length);
if(data) {
if(myhtml_serialization_append_attr(data, length, callback, ptr))
return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION;
}
if(callback("\"", 1, ptr))
return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION;
attr = attr->next;
}
return MyCORE_STATUS_OK;
}
/**
* Internal function to process a close tag
* @param tree
* @param node
* @param callback
* @param ptr
*/
mystatus_t myhtml_serialization_node_append_close(myhtml_tree_node_t* node, mycore_callback_serialize_f callback, void* ptr)
{
switch (node->tag_id) {
case MyHTML_TAG__TEXT:
case MyHTML_TAG__COMMENT:
case MyHTML_TAG__DOCTYPE:
return MyCORE_STATUS_OK;
// https://html.spec.whatwg.org/multipage/parsing.html#serialising-html-fragments
case MyHTML_TAG_AREA:
case MyHTML_TAG_BASE:
case MyHTML_TAG_BGSOUND:
case MyHTML_TAG_BR:
case MyHTML_TAG_COL:
case MyHTML_TAG_EMBED:
case MyHTML_TAG_FRAME:
case MyHTML_TAG_HR:
case MyHTML_TAG_IMG:
case MyHTML_TAG_INPUT:
case MyHTML_TAG_KEYGEN:
case MyHTML_TAG_LINK:
case MyHTML_TAG_META:
case MyHTML_TAG_PARAM:
case MyHTML_TAG_SOURCE:
case MyHTML_TAG_TRACK:
case MyHTML_TAG_WBR:
if(node->ns == MyHTML_NAMESPACE_HTML)
return MyCORE_STATUS_OK;
break;
}
size_t length;
const char *tag = myhtml_tag_name_by_id(node->tree, node->tag_id, &length);
if(callback("</", 2, ptr))
return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION;
if(callback(tag, length, ptr))
return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION;
if(callback(">", 1, ptr))
return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION;
return MyCORE_STATUS_OK;
}
/**
* Internal function to process a text node
* @param tree
* @param node
* @param callback
* @param ptr
*/
mystatus_t myhtml_serialization_node_append_text_node(myhtml_tree_node_t* node, mycore_callback_serialize_f callback, void* ptr)
{
if(node->token == NULL || node->token->str.data == NULL) return MyCORE_STATUS_OK;
if(node->parent == NULL) {
if(myhtml_serialization_append(node->token->str.data, node->token->str.length, callback, ptr))
return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION;
return MyCORE_STATUS_OK;
}
switch (node->parent->tag_id) {
case MyHTML_TAG_STYLE:
case MyHTML_TAG_SCRIPT:
case MyHTML_TAG_XMP:
case MyHTML_TAG_IFRAME:
case MyHTML_TAG_NOEMBED:
case MyHTML_TAG_NOFRAMES:
case MyHTML_TAG_PLAINTEXT:
if(callback(node->token->str.data, node->token->str.length, ptr))
return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION;
break;
default:
if(myhtml_serialization_append(node->token->str.data, node->token->str.length, callback, ptr))
return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION;
break;
}
return MyCORE_STATUS_OK;
}
/**
* Internal method to process a buffer that could contain to-be-quoted output
* @param data
* @param size
* @param callback
* @param ptr
*/
mystatus_t myhtml_serialization_append(const char *data, size_t size, mycore_callback_serialize_f callback, void* ptr)
{
// number of chars not yet displayed
size_t notwritten = 0;
// iterate over the buffer
for (size_t i = 0; i < size; ++i) {
switch ((unsigned char)data[i]) {
case '&':
if(notwritten) {
if(callback(data + i - notwritten, notwritten, ptr))
return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION;
}
if(callback("&", 5, ptr))
return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION;
notwritten = 0;
break;
case '<':
if(notwritten) {
if(callback(data + i - notwritten, notwritten, ptr))
return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION;
}
if(callback("<", 4, ptr))
return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION;
notwritten = 0;
break;
case '>':
if(notwritten) {
if(callback(data + i - notwritten, notwritten, ptr))
return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION;
}
if(callback(">", 4, ptr))
return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION;
( run in 0.458 second using v1.01-cache-2.11-cpan-71847e10f99 )