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("&amp;", 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("&lt;", 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("&gt;", 4, ptr))
                return MyCORE_STATUS_ERROR_MEMORY_ALLOCATION;



( run in 0.458 second using v1.01-cache-2.11-cpan-71847e10f99 )