📄 parser.c
字号:
/* 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 + -