Possible fix for tidy's untidy handling of <option> and <textarea>

Here's a possible fix for tidy's mishandling of <option> and <textarea>.
The problem appears to be in the ParseText routine in parser.c.  I changed
ParseText to:

void ParseText(Lexer *lexer, Node *field, uint mode)
{
    Node *node;

    lexer->insert = null;  /* defer implicit inline start tags */

    while ((node = GetToken(lexer, Preformatted)) != null)
    {
        if (node->tag == field->tag && node->type == EndTag)
        {
            FreeNode(node);
            TrimSpace(lexer, field->last);
            return;
        }

        /* deal with comments etc. */
        if (InsertMisc(field, node))
            continue;

        if (node->tag == tag_font)
        {
            ReportWarning(lexer, field, node, DISCARDING_UNEXPECTED);
            FreeNode(node);
            continue;
        }

/*fix*/        /* LDC: added for option and textarea elements */
/*fix*/        if ( node->type == TextNode )
/*fix*/        {
/*fix*/             InsertNode( field, node );
/*fix*/             continue;
/*fix*/        }

        /* terminate element on other tags */
        if (!(field->tag->model & CM_OPT))
                ReportWarning(lexer, field, node, MISSING_ENDTAG_BEFORE);

        UngetToken(lexer);
        TrimSpace(lexer, field->last);
        return;
    }

    if (!(field->tag->model & CM_OPT))
        ReportWarning(lexer, field, node, MISSING_ENDTAG_FOR);
}

I added the lines with the /*fix*/ in front of them.  It appears that
ParseText never saves the text node that it parses inside the
<option> and <textarea> elements.  All I'm doing here is saving the text.
WARNING: this fix may be completly WRONG
(though it seems to work for me).  Use at your OWN RISK!

Larry Cousin
3M Health Information Systems

Received on Thursday, 14 October 1999 17:53:08 UTC