⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.c

📁 我搜集到的一个java常用类库的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
        /*           if this is the end tag for an ancestor element          then infer end tag for this element        */        if (node->type == EndTag)        {            if (node->tag == tag_form)            {                lexer->badForm = yes;                ReportWarning(lexer, list, node, DISCARDING_UNEXPECTED);                continue;            }            for (parent = list->parent;                    parent != null; parent = parent->parent)            {                if (node->tag == parent->tag)                {                    ReportWarning(lexer, list, node, MISSING_ENDTAG_BEFORE);                    UngetToken(lexer);                    TrimEmptyElement(lexer, list);                    return;                }            }        }        /* center in a dt or a dl breaks the dl list in two */        if (node->tag == tag_center)        {            if (list->content)                InsertNodeAfterElement(list, node);            else /* trim empty dl list */            {                InsertNodeBeforeElement(list, node);                DiscardElement(list);            }            /* and parse contents of center */            ParseTag(lexer, node, mode);            /* now create a new dl element */            list = InferredTag(lexer, "dl");            InsertNodeAfterElement(node, list);            continue;        }        if (!(node->tag == tag_dt || node->tag == tag_dd))        {            UngetToken(lexer);            if (!(node->tag->model & (CM_BLOCK | CM_INLINE)))            {                ReportWarning(lexer, list, node, TAG_NOT_ALLOWED_IN);                TrimEmptyElement(lexer, list);                return;            }            /* if DD appeared directly in BODY then exclude blocks */            if (!(node->tag->model & CM_INLINE) && lexer->excludeBlocks)            {                TrimEmptyElement(lexer, list);                return;            }            node = InferredTag(lexer, "dd");            ReportWarning(lexer, list, node, MISSING_STARTTAG);        }        if (node->type == EndTag)        {            ReportWarning(lexer, list, node, DISCARDING_UNEXPECTED);            continue;        }                /* node should be <DT> or <DD>*/        InsertNodeAtEnd(list, node);        ParseTag(lexer, node, IgnoreWhitespace);    }    ReportWarning(lexer, list, node, MISSING_ENDTAG_FOR);    TrimEmptyElement(lexer, list);}void ParseList(Lexer *lexer, Node *list, uint mode){    Node *node, *parent;    if (list->tag->model & CM_EMPTY)        return;    lexer->insert = null;  /* defer implicit inline start tags */    while ((node = GetToken(lexer, IgnoreWhitespace)) != null)    {        if (node->tag == list->tag && node->type == EndTag)        {            FreeNode(node);            if (list->tag->model & CM_OBSOLETE)                CoerceNode(lexer, list, tag_ul);            list->closed = yes;            TrimEmptyElement(lexer, list);            return;        }        /* deal with comments etc. */        if (InsertMisc(list, node))            continue;        if (node->type != TextNode && node->tag == null)        {            ReportWarning(lexer, list, node, DISCARDING_UNEXPECTED);            FreeNode(node);            continue;        }        /*           if this is the end tag for an ancestor element          then infer end tag for this element        */        if (node->type == EndTag)        {            if (node->tag == tag_form)            {                lexer->badForm = yes;                ReportWarning(lexer, list, node, DISCARDING_UNEXPECTED);                continue;            }            if (node->tag && node->tag->model & CM_INLINE)            {                ReportWarning(lexer, list, node, DISCARDING_UNEXPECTED);                PopInline(lexer, node);                FreeNode(node);                continue;            }            for (parent = list->parent;                    parent != null; parent = parent->parent)            {                if (node->tag == parent->tag)                {                    ReportWarning(lexer, list, node, MISSING_ENDTAG_BEFORE);                    UngetToken(lexer);                    if (list->tag->model & CM_OBSOLETE)                        CoerceNode(lexer, list, tag_ul);                    TrimEmptyElement(lexer, list);                    return;                }            }            ReportWarning(lexer, list, node, DISCARDING_UNEXPECTED);            FreeNode(node);            continue;        }        if (node->tag != tag_li)        {            UngetToken(lexer);            if (node->tag && (node->tag->model & CM_BLOCK) && lexer->excludeBlocks)            {                ReportWarning(lexer, list, node, MISSING_ENDTAG_BEFORE);                TrimEmptyElement(lexer, list);                return;            }            node = InferredTag(lexer, "li");            AddAttribute(node, "style", "list-style: none");            ReportWarning(lexer, list, node, MISSING_STARTTAG);        }        /* node should be <LI> */        InsertNodeAtEnd(list,node);        ParseTag(lexer, node, IgnoreWhitespace);    }    if (list->tag->model & CM_OBSOLETE)        CoerceNode(lexer, list, tag_ul);    ReportWarning(lexer, list, node, MISSING_ENDTAG_FOR);    TrimEmptyElement(lexer, list);}/* unexpected content in table row is moved to just before the table in accordance with Netscape and IE. This code assumes that node hasn't been inserted into the row.*/void MoveBeforeTable(Node *row, Node *node){    Node *table;    /* first find the table element */    for (table = row->parent; table; table = table->parent)    {        if (table->tag == tag_table)        {            if (table->parent->content == table)                table->parent->content = node;            node->prev = table->prev;            node->next = table;            table->prev = node;            node->parent = table->parent;                    if (node->prev)                node->prev->next = node;            break;        }    }}/* if a table row is empty then insert an empty cell this practice is consistent with browser behavior and avoids potential problems with row spanning cells*/void FixEmptyRow(Lexer *lexer, Node *row){    Node *cell;    if (row->content == null)    {        cell = InferredTag(lexer, "td");        InsertNodeAtEnd(row, cell);        ReportWarning(lexer, row, cell, MISSING_STARTTAG);    }}void ParseRow(Lexer *lexer, Node *row, uint mode){    Node *node, *parent;    Bool exclude_state;    if (row->tag->model & CM_EMPTY)        return;    while ((node = GetToken(lexer, IgnoreWhitespace)) != null)    {        if (node->tag == row->tag)        {            if (node->type == EndTag)            {                FreeNode(node);                row->closed = yes;                FixEmptyRow(lexer, row);                return;            }            UngetToken(lexer);            FixEmptyRow(lexer, row);            return;        }        /*           if this is the end tag for an ancestor element          then infer end tag for this element        */        if (node->type == EndTag)        {            if (node->tag == tag_form)            {                lexer->badForm = yes;                ReportWarning(lexer, row, node, DISCARDING_UNEXPECTED);                continue;            }            if (node->tag == tag_td || node->tag == tag_th)            {                ReportWarning(lexer, row, node, DISCARDING_UNEXPECTED);                FreeNode(node);                continue;            }            for (parent = row->parent;                    parent != null; parent = parent->parent)            {                if (node->tag == parent->tag)                {                    UngetToken(lexer);                    TrimEmptyElement(lexer, row);                    return;                }            }        }        /* deal with comments etc. */        if (InsertMisc(row, node))            continue;        /* discard unknown tags */        if (node->tag == null && node->type != TextNode)        {            ReportWarning(lexer, row, node, DISCARDING_UNEXPECTED);            FreeNode(node);            continue;        }        /* discard unexpected <table> element */        if (node->tag == tag_table)        {            ReportWarning(lexer, row, node, DISCARDING_UNEXPECTED);            FreeNode(node);            continue;        }        /* THEAD, TFOOT or TBODY */        if (node->tag && (node->tag->model & CM_ROWGRP))        {            UngetToken(lexer);            TrimEmptyElement(lexer, row);            return;        }        if (node->type == EndTag)        {            ReportWarning(lexer, row, node, DISCARDING_UNEXPECTED);            continue;        }        /*          if text or inline or block move before table          if head content move to head        */        if (node->type != EndTag)        {            if (node->tag == tag_form)            {                UngetToken(lexer);                node = InferredTag(lexer, "td");                ReportWarning(lexer, row, node, MISSING_STARTTAG);            }            else if (node->type == TextNode                    || (node->tag->model & (CM_BLOCK | CM_INLINE)))            {                MoveBeforeTable(row, node);                ReportWarning(lexer, row, node, TAG_NOT_ALLOWED_IN);                lexer->exiled = yes;                if (node->type != TextNode)                    ParseTag(lexer, node, IgnoreWhitespace);                lexer->exiled = no;                continue;            }            else if (node->tag->model & CM_HEAD)            {                ReportWarning(lexer, row, node, TAG_NOT_ALLOWED_IN);                MoveToHead(lexer, row, node);                continue;            }        }        if (!(node->tag == tag_td || node->tag == tag_th))        {            ReportWarning(lexer, row, node, TAG_NOT_ALLOWED_IN);            FreeNode(node);            continue;        }                /* node should be <TD> or <TH> */        InsertNodeAtEnd(row, node);        exclude_state = lexer->excludeBlocks;        lexer->excludeBlocks = no;        ParseTag(lexer, node, IgnoreWhitespace);        lexer->excludeBlocks = exclude_state;        /* pop inline stack */        while (lexer->istacksize > lexer->istackbase)            PopInline(lexer, null);    }    TrimEmptyElement(lexer, row);}void ParseRowGroup(Lexer *lexer, Node *rowgroup, uint mode){    Node *node, *parent;    if (rowgroup->tag->model & CM_EMPTY)        return;    while ((node = GetToken(lexer, IgnoreWhitespace)) != null)    {        if (node->tag == rowgroup->tag)        {            if (node->type == EndTag)            {                rowgroup->closed = yes;                TrimEmptyElement(lexer, rowgroup);                FreeNode(node);                return;            }            UngetToken(lexer);            return;        }        /* if </table> infer end tag */        if (node->tag == tag_table && node->type == EndTag)        {            UngetToken(lexer);            TrimEmptyElement(lexer, rowgroup);            return;        }        /* deal with comments etc. */        if (InsertMisc(rowgroup, node))            continue;        /* discard unknown tags */        if (node->tag == null && node->type != TextNode)        {            ReportWarning(lexer, rowgroup, node, DISCARDING_UNEXPECTED);            FreeNode(node);            continue;        }        /*          if TD or TH then infer <TR>          if text or inline or block move before table          if head content move to head        */        if (node->type != EndTag)        {            if (node->tag == tag_td || node->tag == tag_th)            {                UngetToken(lexer);                node = InferredTag(lexer, "tr");                ReportWarning(lexer, rowgroup, node, MISSING_STARTTAG);            }            else if (node->type == TextNode                    || (node->tag->model & (CM_BLOCK | CM_INLINE)))            {                MoveBeforeTable(rowgroup, node);                ReportWarning(lexer, rowgroup, node, TAG_NOT_ALLOWED_IN);                lexer->exiled = yes;                if (node->type != TextNode)                    ParseTag(lexer, node, IgnoreWhitespace);                lexer->exiled = no;                continue;            }            else if (node->tag->model & CM_HEAD)            {                ReportWarning(lexer, rowgroup, node, TAG_NOT_ALLOWED_IN);                MoveToHead(lexer, rowgroup, node);                continue;            }        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -